From 344f45f00c742089ff7360734d8b471dbf560f8e Mon Sep 17 00:00:00 2001 From: Lee Jihaeng <75159489+SejoWuigui@users.noreply.github.com> Date: Fri, 3 Jan 2025 22:39:54 +0900 Subject: [PATCH 01/32] Update ko.json (#11277) --- src/assets/i18n/ko.json | 244 ++++++++++++++++++++-------------------- 1 file changed, 122 insertions(+), 122 deletions(-) diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index 747a7e20e1c..24d8be1229b 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -207,7 +207,7 @@ "LBA of First Error": "", "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.": "", - "LONG": "", + "LONG": "LONG", "Leave at the default of 512 unless the initiator requires a different block size.": "", "Leave blank to allow all or enter a list of initiator hostnames. Separate entries by pressing Enter.": "", "Leave empty for default (OpsGenie API)": "", @@ -244,7 +244,7 @@ "Method": "", "Method Call": "", "Metrics": "", - "MiB": "", + "MiB": "MiB", "Microsoft Azure": "", "Microsoft Onedrive Access Token. Log in to the Microsoft account to add an access token.": "", "Minimum Passive Port": "", @@ -254,26 +254,26 @@ "Mutual secret password. Required when Peer User is set. Must be different than the Secret.": "", "NIC modifications are currently restricted due to pending network changes.": "", "NIC selection is currently restricted due to pending network changes.": "", - "NIC was added": "", - "Name must start and end with a lowercase alphanumeric character. Hyphen is allowed in the middle e.g abc123, abc, abcd-1232": "", - "Name of the WebDAV site, service, or software being used.": "", - "Name of the new alert service.": "", - "Name of the new cloned boot environment. Alphanumeric characters, dashes (-), underscores (_), and periods (.) are allowed.": "", - "Name of the new dataset created from the cloned snapshot.": "", - "Name of the pool is required": "", - "Name of the pool must be correct": "", - "Name of the zvol is required": "", - "Name of the zvol must be correct": "", - "Name of this SSH connection. SSH connection names must be unique.": "", - "Name of this replication configuration.": "", - "Name or Naming Schema must be provided.": "", + "NIC was added": "NIC 추가함", + "Name must start and end with a lowercase alphanumeric character. Hyphen is allowed in the middle e.g abc123, abc, abcd-1232": "이름은 반드시 알파벳 소문자로 시작하고 끝나야 합니다. 하이픈(-)은 중간에 사용할 수 있습니다(예: abc123, abc, abcd-1232).", + "Name of the WebDAV site, service, or software being used.": "사용중인 WebDAV 사이트, 서비스 또는 소프트웨어의 이름입니다.", + "Name of the new alert service.": "새로운 경고 서비스의 이름입니다.", + "Name of the new cloned boot environment. Alphanumeric characters, dashes (-), underscores (_), and periods (.) are allowed.": "새롭게 복제한 시작 환경의 이름입니다. 알파벳과 숫자, 대시(-), 밑줄(_), 온점(.)을 사용할 수 있습니다.", + "Name of the new dataset created from the cloned snapshot.": "복제한 스냅샷으로부터 생성된 새로운 데이터셋의 이름입니다.", + "Name of the pool is required": "풀 이름 필요", + "Name of the pool must be correct": "올바르지 않은 풀 이름", + "Name of the zvol is required": "ZVOL 이름 필요", + "Name of the zvol must be correct": "올바르지 않은 ZVOL 이름", + "Name of this SSH connection. SSH connection names must be unique.": "이 SSH 연결의 이름입니다. SSH 연결 이름은 고유해야 합니다.", + "Name of this replication configuration.": "이 복제 구성의 이름입니다.", + "Name or Naming Schema must be provided.": "이름 또는 이름짓기 방식을 제공해야 합니다.", "Name ~ \"admin\"": "", - "Negotiate – only encrypt transport if explicitly requested by the SMB client": "", - "Netcat Active Side": "", - "Netcat Active Side Connect Address": "", - "Netcat Active Side Listen Address": "", - "Netcat Active Side Max Port": "", - "Netcat Active Side Min Port": "", + "Negotiate – only encrypt transport if explicitly requested by the SMB client": "협상 – SMB 클라이언트가 명시적으로 요청하는 경우에만 전송 암호화", + "Netcat Active Side": "Netcat 액티브 사이드", + "Netcat Active Side Connect Address": "Netcat 액티브 사이드 연결 주소", + "Netcat Active Side Listen Address": "Netcat 액티브 사이드 수신 주소", + "Netcat Active Side Max Port": "Netcat 액티브 사이드 최대 포트", + "Netcat Active Side Min Port": "Netcat 액티브 사이드 최소 포트", "Network addresses allowed to use this initiator. Leave blank to allow all networks or list network addresses with a CIDR mask. Separate entries by pressing Enter.": "", "Network addresses allowed use this initiator. Each address can include an optional CIDR netmask. Click + to add the network address to the list. Example: 192.168.2.0/24.": "", "Network community string. The community string acts like a user ID or password. A user with the correct community string has access to network information. The default is public. For more information, see What is an SNMP Community String?.": "", @@ -301,9 +301,9 @@ "Number of virtual CPUs to allocate to the virtual machine. The VM operating system might have operational or licensing restrictions on the number of CPUs.": "", "OQ % Used": "", "OQ Used": "", - "Off by default. When set, smbd(8) attempts to authenticate users with the insecure and vulnerable NTLMv1 encryption. This setting allows backward compatibility with older versions of Windows, but is not recommended and should not be used on untrusted networks.": "", - "Offload Read": "", - "Offload Write": "", + "Off by default. When set, smbd(8) attempts to authenticate users with the insecure and vulnerable NTLMv1 encryption. This setting allows backward compatibility with older versions of Windows, but is not recommended and should not be used on untrusted networks.": "기본으로 꺼져있습니다. 설정하면 smbd(8)은(는) 안전하지 않고 취약한 NTLMv1 암호화로 사용자를 인증하려고 시도합니다. 이 설정은 이전 버전의 Windows와의 하위 호환성을 허용하지만 권장하지 않으며, 신뢰할 수 없는 네트워크에서는 사용해서는 안 됩니다.", + "Offload Read": "오프로드 읽기", + "Offload Write": "오프로드 쓰기", "Once an enclosure is selected, all other VDEV creation steps will limit disk selection options to disks in the selected enclosure. If the enclosure selection is changed, all disk selections will be reset.": "", "Once enabled, users will be required to set up two factor authentication next time they login.": "", "One half widget and two quarter widgets below": "", @@ -322,73 +322,73 @@ "Only one can be active at a time.": "", "Only override the default if the initiator requires a different block size.": "", "Only replicate snapshots that match a defined creation time. To specify which snapshots will be replicated, set this checkbox and define the snapshot creation times that will be replicated. For example, setting this time frame to Hourly will only replicate snapshots that were created at the beginning of each hour.": "", - "Open ticket": "", + "Open ticket": "티켓 발행", "OpenStack Swift": "", "Opened at": "", - "Optional IP": "", - "Optional IP of 2nd Redfish management interface.": "", - "Optional description. Portals are automatically assigned a numeric group.": "", - "Optional user-friendly name.": "", - "Optional. Enter a server description.": "", - "Optional. Only needed for private images.": "", - "Optional: CPU Set (Examples: 0-3,8-11)": "", - "Optional: Choose installation media image": "", - "Optional: NUMA nodeset (Example: 0-1)": "", - "Options": "", - "Options cannot be loaded": "", - "Options for encrypting the LDAP connection: ": "", + "Optional IP": "선택적 IP", + "Optional IP of 2nd Redfish management interface.": "2번째 Redfish 관리 인터페이스의 선택적 IP입니다.", + "Optional description. Portals are automatically assigned a numeric group.": "선택적 설명입니다. 포털에는 자동으로 숫자 그룹이 지정됩니다.", + "Optional user-friendly name.": "선택적 사용자 친화 이름입니다.", + "Optional. Enter a server description.": "선택사항입니다. 서버 설명을 입력합니다.", + "Optional. Only needed for private images.": "선택사항입니다. 개인 이미지에만 필요합니다.", + "Optional: CPU Set (Examples: 0-3,8-11)": "선택사항: CPU 세트 (예시: 0-3,8-11)", + "Optional: Choose installation media image": "선택사항: 설치 매체 이미지 선택", + "Optional: NUMA nodeset (Example: 0-1)": "선택사항: NUMA 노드세트 (예시: 0-1)", + "Options": "선택사항", + "Options cannot be loaded": "선택사항 불러올 수 없음", + "Options for encrypting the LDAP connection: ": "LDAP 연결 암호화 선택사항: ", "Other Execute": "", - "Other node is currently processing a failover event.": "", - "Others": "", - "Outgoing Mail Server": "", - "Outlook": "", - "Overrides default directory creation mask of 0777 which grants directory read, write and execute access for everybody.": "", - "Overrides default file creation mask of 0666 which creates files with read and write access for everybody.": "", - "PCI Passthrough Device": "", - "PCI device does not have a reset mechanism defined and you may experience inconsistent/degraded behavior when starting/stopping the VM.": "", - "POSIX": "", - "POSIX Permissions": "", + "Other node is currently processing a failover event.": "다른 노드가 장애조치 진행중입니다.", + "Others": "기타", + "Outgoing Mail Server": "발송 메일 서버", + "Outlook": "OUTLOOK", + "Overrides default directory creation mask of 0777 which grants directory read, write and execute access for everybody.": "모든 사용자에게 디렉터리 읽기, 쓰기, 실행 권한을 부여하는 기본 디렉터리 생성 마스크인 0777을 대체합니다.", + "Overrides default file creation mask of 0666 which creates files with read and write access for everybody.": "모든 사용자가 읽고 쓸 수 있는 파일을 생성하는 기본 파일 생성 마스크인 0666을 대체합니다.", + "PCI Passthrough Device": "PCI 통과 장치", + "PCI device does not have a reset mechanism defined and you may experience inconsistent/degraded behavior when starting/stopping the VM.": "PCI 장치에는 재설정 메커니즘이 정의되어 있지 않으므로, 가상머신을 시작/중지할 때 일관되지 않거나 저하된 동작이 발생할 수 있습니다.", + "POSIX": "POSIX", + "POSIX Permissions": "POSIX 권한", "PULL": "", "PUSH": "", - "PagerDuty client name.": "", - "Pair this certificate's public key with the Certificate Authority private key used to sign this certificate.": "", - "Passive Controller": "", - "Passthrough": "", - "Password associated with the LDAP User DN.": "", - "Password for the Active Directory administrator account. Required the first time a domain is configured. After initial configuration, the password is not needed to edit, start, or stop the service.": "", - "Password for the Bind DN.": "", - "Password to encrypt and decrypt remote data. Warning: Always securely back up this password! Losing the encryption password will result in data loss.": "", - "Passwords cannot contain a ?. Passwords should be at least eight characters and contain a mix of lower and upper case, numbers, and special characters.": "", - "Paste either or both public and private keys. If only a public key is entered, it will be stored alone. If only a private key is pasted, the public key will be automatically calculated and entered in the public key field. Click Generate Keypair to create a new keypair. Encrypted keypairs or keypairs with passphrases are not supported.": "", - "Paste the incoming webhook URL associated with this service.": "", - "Paste the certificate for the CA.": "", - "Paste the contents of your Certificate Signing Request here.": "", - "Paste the private key associated with the Certificate when available. Please provide a key at least 1024 bits long.": "", - "Pattern of naming custom snapshots to include in the replication with the periodic snapshot schedule. Enter the strftime(3) strings that match the snapshots to include in the replication.

When a periodic snapshot is not linked to the replication, enter the naming schema for manually created snapshots. Has the same %Y, %m, %d, %H, and %M string requirements as the Naming Schema in a Periodic Snapshot Task. Separate entries by pressing Enter.": "", - "Pattern of naming custom snapshots to be replicated. Enter the name and strftime(3) %Y, %m, %d, %H, and %M strings that match the snapshots to include in the replication. Separate entries by pressing Enter. The number of snapshots matching the patterns are shown.": "", - "Peer Secret": "", - "Peer Secret (Confirm)": "", - "Peer User": "", - "Percentage used of dataset quota at which to generate a critical alert.": "", - "Percentage used of dataset quota at which to generate a warning alert.": "", - "Perform Reverse DNS Lookups": "", - "Performs authentication from an LDAP server.": "", - "Photo Library API client secret generated from the Google API Console": "", + "PagerDuty client name.": "PagerDuty 클라이언트 이름입니다.", + "Pair this certificate's public key with the Certificate Authority private key used to sign this certificate.": "이 인증서의 공개키를 이 인증서에 서명하는 데 사용한 인증기관의 개인 키와 묶습니다.", + "Passive Controller": "패시브 컨트롤러", + "Passthrough": "통과", + "Password associated with the LDAP User DN.": "LDAP 사용자 DN과 연결된 비밀번호입니다.", + "Password for the Active Directory administrator account. Required the first time a domain is configured. After initial configuration, the password is not needed to edit, start, or stop the service.": "액티브 디렉터리 관리자 계정의 비밀번호입니다. 도메인을 처음 구성할 때 필요합니다. 초기 구성이 끝나면 서비스를 수정, 시작 또는 멈추는 데 비밀번호가 필요하지 않습니다.", + "Password for the Bind DN.": "Bind DN의 비밀번호입니다.", + "Password to encrypt and decrypt remote data. Warning: Always securely back up this password! Losing the encryption password will result in data loss.": "원격 데이터를 암호화 및 복호화하는 비밀번호입니다. 위험: 항상 이 비밀번호를 안전한 곳에 보관하십시오! 암호화 비밀번호를 잃으면 데이터도 잃습니다.", + "Passwords cannot contain a ?. Passwords should be at least eight characters and contain a mix of lower and upper case, numbers, and special characters.": "비밀번호에 물음표(?)를 포함할 수 없습니다. 비밀번호는 최소 8자 이상이어야 하고 대소문자, 숫자, 특수문자를 포함해야 합니다.", + "Paste either or both public and private keys. If only a public key is entered, it will be stored alone. If only a private key is pasted, the public key will be automatically calculated and entered in the public key field. Click Generate Keypair to create a new keypair. Encrypted keypairs or keypairs with passphrases are not supported.": "공개 키와 개인 키를 붙여넣습니다. 공개 키만 입력한 경우 단독으로 저장합니다. 개인 키만 입력한 경우 자동으로 계산한 공개 키가 입력됩니다. 키쌍 생성을 누르면 새로운 키쌍을 생성합니다. 암호화된 키쌍 또는 비밀구절이 있는 키쌍은 지원하지 않습니다.", + "Paste the incoming webhook URL associated with this service.": "이 서비스와 연결된 웹훅 수신 URL을 붙여넣습니다.", + "Paste the certificate for the CA.": "인증기관의 인증서를 붙여넣습니다.", + "Paste the contents of your Certificate Signing Request here.": "인증서 서명 요청의 내용을 여기에 붙여넣습니다.", + "Paste the private key associated with the Certificate when available. Please provide a key at least 1024 bits long.": "가능한 경우 인증서와 연결된 개인 키를 붙여넣습니다. 키 길이는 최소 1024비트여야 합니다.", + "Pattern of naming custom snapshots to include in the replication with the periodic snapshot schedule. Enter the strftime(3) strings that match the snapshots to include in the replication.

When a periodic snapshot is not linked to the replication, enter the naming schema for manually created snapshots. Has the same %Y, %m, %d, %H, and %M string requirements as the Naming Schema in a Periodic Snapshot Task. Separate entries by pressing Enter.": "주기적인 스냅샷 일정에 따라 복제할 사용자 정의 스냅샷의 이름짓기 패턴입니다. 복제에 포함할 스냅샷과 일치하는 strftime(3) 문자열을 입력합니다.

주기적인 스냅샷 작업이 복제 작업과 연결되어있지 않은 경우, 수동으로 생성한 스냅샷의 이름짓기 방식을 입력하십시오. 주기적인 스냅샷 작업이름짓기 방식과 같이 %Y, %m, %d, %H%M 문자열이 필요합니다. Enter키를 눌러 항목을 구분합니다.", + "Pattern of naming custom snapshots to be replicated. Enter the name and strftime(3) %Y, %m, %d, %H, and %M strings that match the snapshots to include in the replication. Separate entries by pressing Enter. The number of snapshots matching the patterns are shown.": "복제할 사용자 정의 스냅샷의 이름짓기 패턴입니다. 복제에 포함할 스냅샷과 일치하는 이름과 strftime(3) %Y, %m, %d, %H%M 문자열을 입력합니다. Enter키를 눌러 항목을 구분합니다. 패턴과 일치하는 스냅샷의 수가 표시됩니다.", + "Peer Secret": "다른 지점 시크릿", + "Peer Secret (Confirm)": "다른 지점 시크릿 (수락)", + "Peer User": "다른 지점 사용자", + "Percentage used of dataset quota at which to generate a critical alert.": "심각 경고를 생성할 데이터셋 할당량의 사용율입니다.", + "Percentage used of dataset quota at which to generate a warning alert.": "위험 경고를 생성할 데이터셋 할당량의 사용율입니다.", + "Perform Reverse DNS Lookups": "역방향 DNS 조회 수행", + "Performs authentication from an LDAP server.": "LDAP 서버에서 인증을 수행합니다.", + "Photo Library API client secret generated from the Google API Console": "Google API 콘솔에서 생성한 사진 라이브러리 API 클라이언트 시크릿", "Pin vcpus": "", - "Please accept the terms of service for the given ACME Server.": "", - "Please click the button below to create a pool.": "", - "Please specify the name of the image to pull. Format for the name is \"registry/repo/image\"": "", - "Please specify trains from which UI should retrieve available applications for the catalog.": "", - "Pool is using more than {maxPct}% of available space": "", + "Please accept the terms of service for the given ACME Server.": "해당 ACME 서버의 서비스 약관에 동의해 주십시오.", + "Please click the button below to create a pool.": "풀을 생성하려면 아래 버튼을 눌러 주십시오.", + "Please specify the name of the image to pull. Format for the name is \"registry/repo/image\"": "가져올 이미지의 이름을 지정해 주십시오. 이름의 형식은 \"registry/repo/image\"입니다.", + "Please specify trains from which UI should retrieve available applications for the catalog.": "UI가 카탈로그에 사용 가능한 애플리케이션을 검색할 버전 구분을 지정해 주십시오.", + "Pool is using more than {maxPct}% of available space": "풀이 사용 가능한 공간의 {maxPct}% 이상을 사용함", "Power On Hours Ago": "", - "Predefined certificate extensions. Choose a profile that best matches your certificate usage scenario.": "", - "Predefined permission combinations:
Read: Read access and Execute permission on the object (RX).
Change: Read access, Execute permission, Write access, and Delete object (RXWD).
Full: Read access, Execute permission, Write access, Delete object, change Permissions, and take Ownership (RXWDPO).

For more details, see smbacls(1).": "", - "Prevent the user from logging in or using password-based services until this option is unset. Locking an account is only possible when Disable Password is No and a Password has been created for the account.": "", - "Priority Code Point": "", - "Proceed with upgrading the pool? WARNING: Upgrading a pool is a one-way operation that might make some features of the pool incompatible with older versions of TrueNAS: ": "", + "Predefined certificate extensions. Choose a profile that best matches your certificate usage scenario.": "사전 정의된 인증서 확장입니다. 인증서의 용도에 가장 부합하는 프로파일을 선택하십시오.", + "Predefined permission combinations:
Read: Read access and Execute permission on the object (RX).
Change: Read access, Execute permission, Write access, and Delete object (RXWD).
Full: Read access, Execute permission, Write access, Delete object, change Permissions, and take Ownership (RXWDPO).

For more details, see smbacls(1).": "사전 정의된 권한 조합:
읽기: 개체에 대한 읽기 및 실행 권한(RX)
변경: 읽기, 실행, 쓰기 및 개체 삭제(RXWD)
전체: 읽기, 실행, 쓰기, 개체 삭제, 권한 변경 및 소유권 취득(RXWDPO)

보다 자세한 사항은 smbacls(1)을(를) 참고하십시오.", + "Prevent the user from logging in or using password-based services until this option is unset. Locking an account is only possible when Disable Password is No and a Password has been created for the account.": "이 선택사항을 설정 해제하기 전에는 사용자가 로그인하거나 비밀번호 기반 서비스를 사용할 수 없습니다. 비밀번호 비활성화아니오이고 계정 비밀번호가 생성된 경우에만 계정을 잠글 수 있습니다.", + "Priority Code Point": "우선순위 코드 포인트(PCP)", + "Proceed with upgrading the pool? WARNING: Upgrading a pool is a one-way operation that might make some features of the pool incompatible with older versions of TrueNAS: ": "풀을 업그레이드하시겠습니까? 위험: 풀 업그레이드는 되돌릴 수 없고, 일부 풀 기능이 이전 버전의 TrueNAS와 호환되지 않을 수 있습니다: ", "Prototyping": "", - "Provide helpful notations related to the share, e.g. ‘Shared to everybody’. Maximum length is 120 characters.": "", - "Provides a plugin interface for Winbind to use varying backends to store SID/uid/gid mapping tables. The correct setting depends on the environment in which the NAS is deployed.": "", + "Provide helpful notations related to the share, e.g. ‘Shared to everybody’. Maximum length is 120 characters.": "공유에대한 유용한 설명을 제공합니다(예: '모두에게 공유됨'). 최대 길이는 120자입니다.", + "Provides a plugin interface for Winbind to use varying backends to store SID/uid/gid mapping tables. The correct setting depends on the environment in which the NAS is deployed.": "Winbind가 다양한 백엔드를 사용하여 SID/uid/gid 매핑 테이블을 저장할 수 있도록 플러그인 인터페이스를 제공합니다. 올바른 설정은 NAS가 배포된 환경에 따라 달라집니다.", "Prune By": "", "Pull": "", "Pull Image": "", @@ -398,16 +398,16 @@ "Quiet": "", "Realm": "", "Rear": "", - "Restrict share visibility to users with read or write access to the share. See the smb.conf manual page.": "", - "SHORT": "", + "Restrict share visibility to users with read or write access to the share. See the smb.conf manual page.": "공유가 읽기 또는 쓰기 권한을 가진 사용자에게만 보이도록 제한합니다. smb.conf 매뉴얼을 참고하십시오.", + "SHORT": "SHORT", "Series": "", - "Session dialect": "", - "Set for the LDAP server to disable authentication and allow read and write access to any client.": "", - "Set for the default configuration to listen on all interfaces using the known values of user: upsmon and password: fixmepass.": "", - "Set only if required by the NFS client. Set to allow serving non-root mount requests.": "", - "Set production status as active": "", - "Set specific times to snapshot the Source Datasets and replicate the snapshots to the Destination Dataset. Select a preset schedule or choose Custom to use the advanced scheduler.": "", - "Set to determine if the system participates in a browser election. Leave unset when the network contains an AD or LDAP server, or when Vista or Windows 7 machines are present.": "", + "Session dialect": "세션 변형", + "Set for the LDAP server to disable authentication and allow read and write access to any client.": "LDAP 서버가 인증을 비활성화하고 모든 클라이언트에 대해 읽기와 쓰기 권한을 허용하도록 설정합니다.", + "Set for the default configuration to listen on all interfaces using the known values of user: upsmon and password: fixmepass.": "모든 인터페이스가 기본적으로 알려진 값(사용자: upsmon, 비밀번호: fixmepass)을 사용해 수신하도록 구성합니다.", + "Set only if required by the NFS client. Set to allow serving non-root mount requests.": "NFS 클라이언트에서 요청하는 경우 설정합니다. root가 아닌 탑재 요청을 허용합니다.", + "Set production status as active": "운영 상태를 활성화합니다.", + "Set specific times to snapshot the Source Datasets and replicate the snapshots to the Destination Dataset. Select a preset schedule or choose Custom to use the advanced scheduler.": "원본 데이터셋의 스냅샷을 저장하고 도착지 데이터셋으로 복제할 시각을 지정합니다. 사전설정 일정을 선택하거나 사용자 정의를 선택해 고급 일정관리를 사용합니다.", + "Set to determine if the system participates in a browser election. Leave unset when the network contains an AD or LDAP server, or when Vista or Windows 7 machines are present.": "시스템을 브라우저 선정에 포함할지 여부를 결정합니다. 네트워크에 AD 또는 LDAP 서버가 있거나, Vista 또는 Windows 7 장치가 있는 경우 설정하지 않습니다.", "Short": "", "Tail Lines": "", "Thick": "", @@ -478,7 +478,7 @@ "MOVE: After files are copied from the source to the destination, they are deleted from the source. Files with the same names on the destination are overwritten.": "MOVE: 원본 파일이 대상으로 복사된 후, 원본에서는 해당 파일이 삭제됩니다. 대상에 이미 동일한 이름의 파일이 있는 경우, 해당 파일들이 덮어씌워집니다.", "SET will changes all destination datasets to readonly=on after finishing the replication.
REQUIRE stops replication unless all existing destination datasets to have the property readonly=on.
IGNORE disables checking the readonly property during replication.": "SET은 복제 작업이 완료된 후 대상 데이터셋의 모든 속성을 readonly=on으로 변경합니다.
REQUIRE은 대상 데이터셋의 모든 속성이 readonly=on으로 설정되어 있지 않으면 복제를 중지합니다.
IGNORE는 복제 중에 readonly 속성을 확인하지 않도록 설정합니다.", "SYNC: Files on the destination are changed to match those on the source. If a file does not exist on the source, it is also deleted from the destination.": "SYNC: 대상에 있는 파일들이 원본과 일치하도록 변경됩니다. 원본에 존재하지 않는 파일은 대상에서도 삭제됩니다.", - "WARNING: Rolling the dataset back destroys data on the dataset and can destroy additional snapshots that are related to the dataset. This can result in permanent data loss! Do not roll back until all desired data and snapshots are backed up.": "위험: 데이터셋을 되돌리면 포함된 데이터는 물론 연계된 스냅샷도 파기될 수 있습니다. 데이터는 영구히 손실됩니다! 필요한 데이터와 스냅샷을 백업하기 전에는 되돌리기를 수행하지 마십시오.", + "WARNING: Rolling the dataset back destroys data on the dataset and can destroy additional snapshots that are related to the dataset. This can result in permanent data loss! Do not roll back until all desired data and snapshots are backed up.": "위험: 데이터셋을 되돌리면 포함된 데이터는 물론 관련된 스냅샷도 파기될 수 있습니다. 데이터는 영구히 손실됩니다! 필요한 데이터와 스냅샷을 백업하기 전에는 되돌리기를 수행하지 마십시오.", "WARNING: The configuration file contains sensitive data like system passwords. However, SSH keys that are stored in /root/.ssh are NOT backed up by this operation. Additional sensitive information can be included in the configuration file.
": "위험: 구성 파일에는 시스템 비밀번호와 같은 민감한 데이터가 포함되어 있습니다. 그러나 /root/.ssh에 저장된 SSH 키는 이 작업에 의해 백업되지 않습니다. 구성 파일에 추가적인 민감한 정보가 포함될 수 있습니다.
", "Warning: The WireGuard service must be active on the client system to access the TrueCommand UI.": "위험: 클라이언트 시스템에서 WireGuard 서비스를 활성화해야 TrueCommand UI에 접속할 수 있습니다.", "0 disables quotas. Specify a maximum allowed space for this dataset.": "0은 할당량을 비활성화합니다. 이 데이터셋에 대한 최대 허용 공간을 지정하십시오.", @@ -642,7 +642,7 @@ "Add Periodic S.M.A.R.T. Test": "주기적인 S.M.A.R.T. 검사 추가", "Add Periodic Snapshot Task": "주기적인 스냅샷 작업 추가", "Add Pool": "풀 추가", - "Add Portal": "포탈 추가", + "Add Portal": "포털 추가", "Add Privilege": "권한 추가", "Add Proxy": "프록시 추가", "Add Replication Task": "복제 작업 추가", @@ -1097,7 +1097,7 @@ "CLI": "CLI", "CN": "CN", "CN Realm": "CN 영역", - "CONVEYANCE": "양도", + "CONVEYANCE": "CONVEYANCE", "COPY": "복사", "CPU": "CPU", "CPU & Memory": "CPU와 메모리", @@ -1175,7 +1175,7 @@ "Change the default password to improve system security. The new password cannot contain a space or #.": "기본 비밀번호를 바꿔 시스템 보안을 향상시킵니다. 비밀번호는 공백이나 #을(를) 포함할 수 없습니다.", "Changelog": "변경내역", "Changes Saved": "변경사항 저장됨", - "Changing to a nightly train is one-way. Changing back to a stable train is not supported! ": "개발자 버전으로의 전환은 되돌릴 수 없습니다. 안정 버전으로 되돌릴 수 없습니다!", + "Changing to a nightly train is one-way. Changing back to a stable train is not supported! ": "개발자 버전으로의 전환은 되돌릴 수 없습니다. 안정 버전으로 돌아갈 수 없습니다!", "Channel": "채널", "Channel {n}": "채널 {n}", "Check": "확인", @@ -1674,7 +1674,7 @@ "Delete zvol {name}": "Zvol {name} 삭제", "Delete {n, plural, one {# user} other {# users}} with this primary group?": "{n}명의 사용자를 기본 그룹에서 삭제하시겠습니까?", "Delete {name}?": "{name}을(를) 삭제하시겠습니까?", - "Delete {n} associated {n, plural, one {extent} other {extents}}": "연계된 {n}개의 익스텐트 삭제", + "Delete {n} associated {n, plural, one {extent} other {extents}}": "연결된 {n}개의 익스텐트 삭제", "Deleted {n, plural, one {# snapshot} other {# snapshots} }": "{n}개의 스냅샷 삭제됨", "Deleting exporter": "내보내기 삭제중", "Deleting interfaces while HA is enabled is not allowed.": "HA가 활성화된 상태에서는 인터페이스를 삭제할 수 없습니다.", @@ -1902,7 +1902,7 @@ "Edit NTP Server": "NTP 서버 수정", "Edit Periodic Snapshot Task": "주기적인 스냅샷 작업 수정", "Edit Permissions": "권한 수정", - "Edit Portal": "포탈 수정", + "Edit Portal": "포털 수정", "Edit Privilege": "권한 수정", "Edit Proxy": "프록시 수정", "Edit Replication Task": "복제 작업 수정", @@ -2002,7 +2002,7 @@ "Enabled Protocols": "활성화 된 프로토콜", "Enabling Time Machine on an SMB share requires restarting the SMB service.": "SMB 공유를 통한 타임머신을 활성화하려면 SMB 서비스를 재시작해야 합니다.", "Enabling allows using a password to authenticate the SSH login. Warning: when directory services are enabled, allowing password authentication can grant access to all users imported by the directory service.
Disabling changes authentication to require keys for all users. This requires additional setup on both the SSH client and server.": "SSH 로그인 인증에 비밀번호를 사용할 수 있도록 허용합니다. 위험: 디렉터리 서비스가 활성화되어 있다면, 비밀번호 인증은 디렉터리 서비스에서 불러온 사용자에게 접근 권한을 부여합니다.
비활성화하면 모든 사용자의 인증에 키를 요구합니다. 이를 위해 SSH 클라이언트와 서버에 추가적인 설정이 필요합니다.", - "Enabling redirect will require all URLs served from current host to be served via HTTPS regardless of port used. This may make some App portals inaccessible if they don't use HTTPS. Do you wish to continue?": "재연결을 활성화하면 현재 호스트가 제공하는 모든 URL이 포트에 상관없이 HTTPS로 연결됩니다. HTTPS를 사용하지 않는 앱 포탈의 경우 접속이 불가할 수 있습니다. 계속하시겠습니까?", + "Enabling redirect will require all URLs served from current host to be served via HTTPS regardless of port used. This may make some App portals inaccessible if they don't use HTTPS. Do you wish to continue?": "재연결을 활성화하면 현재 호스트가 제공하는 모든 URL이 포트에 상관없이 HTTPS로 연결됩니다. HTTPS를 사용하지 않는 앱 포털의 경우 접속이 불가할 수 있습니다. 계속하시겠습니까?", "Enabling this option is not recommended as it bypasses a security mechanism.": "이 옵션은 보안 설정을 우회하므로 활성화를 권장하지 않습니다.", "Encipher Only": "암호화 전용", "Enclosure": "인클로저", @@ -2552,7 +2552,7 @@ "Install Manual Update File": "수동 업데이트 파일 설치", "Install NVIDIA Drivers": "NVIDIA 드라이버 설치", "Install via YAML": "YAML로 설치", - "Installation Media": "설치 미디어", + "Installation Media": "설치 매체", "Installed": "설치됨", "Installed Apps": "설치된 앱", "Installer image file": "설치 이미지 파일", @@ -2787,7 +2787,7 @@ "Loss of Functionality": "기능 상실", "Low Bandwidth (4)": "낮은 대역폭 (4)", "Low Capacity": "낮은 용량", - "Lowest Temperature": "낮은 온도", + "Lowest Temperature": "최저 온도", "MAC Address": "MAC 주소", "MAC VLAN": "MAC VLAN", "MOTD": "MOTD", @@ -2861,8 +2861,8 @@ "Maximum Upload Parts": "최대 업로드 부분", "Maximum value is {max}": "최대값은 {max}입니다", "May": "5월", - "Media Subtype": "미디어 보조유형", - "Media Type": "미디어 유형", + "Media Subtype": "매체 보조유형", + "Media Type": "매체 유형", "Members": "구성원", "Memory": "메모리", "Memory Reports": "메모리 보고서", @@ -3084,13 +3084,13 @@ "No enclosure": "인클로저 없음", "No errors": "오류 없음", "No events to display.": "표시할 이벤트가 없습니다.", - "No extents associated.": "연계된 익스텐트가 없습니다.", + "No extents associated.": "연결된 익스텐트가 없습니다.", "No images found": "이미지 찾을 수 없음", "No instances": "인스턴스 없음", "No interfaces configured with Virtual IP.": "가상 IP로 설정된 인터페이스가 없습니다.", "No items have been added yet.": "추가된 항목이 아직 없습니다.", "No jobs running.": "실행중인 작업이 없습니다.", - "No logs are available": "사용 가능한 기록이 없습니다.", + "No logs are available": "사용 가능한 기록 없음", "No logs are available for this task.": "이 작업에 대한 기록이 없습니다.", "No logs available": "사용 가능한 기록 없음", "No logs yet": "아직 기록되지 않음", @@ -3109,7 +3109,7 @@ "No similar apps found.": "비슷한 앱 찾을 수 없음", "No snapshots sent yet": "아직 전송된 스냅샷 없음", "No temperature data was reported by the system. There can be a number of reasons why this might occur.": "시스템으로부터 보고된 온도 데이터가 없습니다. 여러 문제가 복합적일 수 있습니다.", - "No unassociated extents available.": "사용 가능한 미연계 인스텐트가 없습니다.", + "No unassociated extents available.": "사용 가능한 미연결 인스텐트가 없습니다.", "No unused disks": "사용하지 않은 디스크 없음", "No update found.": "업데이트를 찾을 수 없습니다.", "No updates available.": "가능한 업데이트가 없습니다.", @@ -3143,7 +3143,7 @@ "OAuth Client ID": "OAuth 클라이언트 ID", "OAuth Client Secret": "OAuth 클라이언트 시크릿", "OAuth Token for current session": "현재 세션에 대한 OAuth 토큰", - "OFFLINE": "오프라인", + "OFFLINE": "OFFLINE", "OK": "확인", "OS": "운영체제", "OS Version": "운영체제 버전", @@ -3291,9 +3291,9 @@ "Port": "포트", "Port number on the remote system to use for the SSH connection.": "SSH 연결에 사용할 원격 시스템의 포트 번호입니다.", "Port or Hostname": "포트 또는 호스트 이름", - "Portal": "포탈", - "Portal Group ID": "포탈 그룹 ID", - "Portals": "포탈", + "Portal": "포털", + "Portal Group ID": "포털 그룹 ID", + "Portals": "포털", "Ports": "포트", "Post Init": "초기화 이후", "Post Script": "이후 스크립트", @@ -3456,7 +3456,7 @@ "Remove Keep Flag": "플래그 유지 제거", "Remove device": "장치 제거", "Remove device {name}?": "장치 {name}을(를) 제거하시겠습니까?", - "Remove extent association": "익스텐트 연계 제거", + "Remove extent association": "익스텐트 연결 제거", "Remove file": "파일 제거", "Remove file?": "파일을 제거하시겠습니까?", "Remove iXVolumes": "iXVolume 제거", @@ -3804,7 +3804,7 @@ "Secret Confirm must match Secret": "시크릿 확인값은 시크릿과 일치해야 함", "Secret Encryption Key": "시크릿 암호화 키", "Secret Key": "시크릿 키", - "Secret and Peer Secret can not be the same.": "시크릿과 피어 시크릿은 같을 수 없습니다.", + "Secret and Peer Secret can not be the same.": "시크릿과 다른 지점 시크릿은 같을 수 없습니다.", "Secret and confirmation should match.": "시크릿과 학인값은 일치해야 합니다.", "Section Help": "구역 도움말", "Secure data within this dataset. Data is unusable until unlocked with an encryption key or passphrase. If parent dataset has encryption enabled, it is not possible to disable this option.": "이 데이터셋의 자료를 보호합니다. 암호화 키 또는 비밀구절로 잠금을 해제하기 전에는 자료를 사용할 수 없습니다. 상위 데이터셋의 암호화가 활성화 되었다면, 이 선택사항을 비활성화할 수 없습니다.", @@ -3861,7 +3861,7 @@ "Select an existing SSH connection to a remote system or choose Create New to create a new SSH connection.": "리모트 시스템과의 SSH 연결을 선택하거나 새로 만들기를 선택해 새로운 SSH 연결을 만듭니다.", "Select an existing SSH connection to a remote system or choose Create New to create a new SSH connection.": "리모트 시스템과의 SSH 연결을 선택하거나 새로 만들기를 선택해 새로운 SSH 연결을 만듭니다.", "Select an existing extent.": "기존 익스텐트를 선택합니다.", - "Select an existing portal or choose Create New to configure a new portal.": "기존 포탈을 선택하거나 새로 만들기를 선택해 새로운 포탈을 구성합니다.", + "Select an existing portal or choose Create New to configure a new portal.": "기존 포털을 선택하거나 새로 만들기를 선택해 새로운 포털을 구성합니다.", "Select an existing realm that was added in Directory Services > Kerberos Realms.": "디렉터리 서비스 > Kerberos 영역에 추가된 기존 영역을 선택하십시오.", "Select an existing target.": "기존 대상을 선택합니다.", "Select an unused disk to add to this vdev.
WARNING: any data stored on the unused disk will be erased!": "이 VDEV에 추가할 사용하지 않은 디스크를 선택하합니다.
위험: 사용되지 않은 디스크에 저장된 데이터는 지워집니다!", @@ -3880,7 +3880,7 @@ "Select the syslog(3) level of the SFTP server.": "SFTP 서버의 syslog(3) 수준을 선택합니다.", "Select the Certificate Signing Request to sign the Certificate Authority with.": "인증 기관에 서명할 인증서 서명 요청을 선택합니다.", "Select the Class of Service. The available 802.1p Class of Service ranges from Best effort (default) to Network control (highest).": "우선순위를 선택합니다. 사용 가능한 802.1p 우선순위 범위는 최고의 효울(기본)부터 네트워크 제어(가장 높음)까지입니다.", - "Select the IP addresses to be listened on by the portal. Click ADD to add IP addresses with a different network port. The address 0.0.0.0 can be selected to listen on all IPv4 addresses, or :: to listen on all IPv6 addresses.": "포탈이 수신할 IP 주소를 선택합니다. 추가를 눌러 다른 네트워크 포트가 있는 IP 주소를 추가합니다. 0.0.0.0(IPv4) 또는 ::(IPv6)을(를) 통해 모든 주소에서 수신할 수 있습니다.", + "Select the IP addresses to be listened on by the portal. Click ADD to add IP addresses with a different network port. The address 0.0.0.0 can be selected to listen on all IPv4 addresses, or :: to listen on all IPv6 addresses.": "포털이 수신할 IP 주소를 선택합니다. 추가를 눌러 다른 네트워크 포트가 있는 IP 주소를 추가합니다. 0.0.0.0(IPv4) 또는 ::(IPv6)을(를) 통해 모든 주소에서 수신할 수 있습니다.", "Select the VLAN Parent Interface. Usually an Ethernet card connected to a switch port configured for the VLAN. New link aggregations are not available until the system is restarted.": "VLAN 상위 인터페이스를 선택합니다. 보통 VLAN 포트에 연결된 이더넷 카드입니다. 새로운 Link Aggregation은 시스템을 재시작할 때까지 사용할 수 없습니다.", "Select the appropriate environment.": "적절한 환경을 선택합니다.", "Select the appropriate level of criticality.": "적절한 심각도를 선택합니다.", @@ -4032,7 +4032,7 @@ "Set to query the cn instead of uid attribute for the user name in LDAP.": "LDAP에서 사용자 이름에 대한 uid 속성 대신 cn 속성을 쿼리하도록 설정합니다.", "Set to reduce the size of data to transmit. Recommended for slow connections.": "전송할 데이터의 크기를 줄입니다. 연결 속도가 느린 경우 권장합니다.", "Set to remove all ACLs from the current dataset. ACLs are also recursively stripped from directories and child datasets when those options are set.": "현재 데이터셋의 모든 ACL을(를) 제거합니다. 선택사항을 통해 디렉터리와 하위 데이터셋에서도 ACL을(를) 제거할 수 있습니다.", - "Set to remove the data associated with this Virtual Machine (which will result in data loss if the data is not backed up). Unset to leave the data intact.": "이 가상머신과 연계된 데이터를 제거합니다(데이터를 백업하지 않으면 모두 소실됩니다). 선택하지 않으면 데이터를 그대로 유지합니다.", + "Set to remove the data associated with this Virtual Machine (which will result in data loss if the data is not backed up). Unset to leave the data intact.": "이 가상머신과 연결된 데이터를 제거합니다(데이터를 백업하지 않으면 모두 소실됩니다). 선택하지 않으면 데이터를 그대로 유지합니다.", "Set to restrict SSH access in certain circumstances to only members of BUILTIN\\Administrators": "특정 상황에서 SSH 액세스를 BUILTIN\\Administrators 의 구성원으로 제한", "Set to run resilver tasks between the configured times.": "구성한 시각 사이에 리실버 작업을 실행합니다.", "Set to save the temporary file from each updated file to a holding directory until the end of the transfer when all transferred files are renamed into place.": "파일을 제자리에 전송하고 이름을 원래대로 바꾸는 전송 작업을 마칠 때까지 각 갱신된 파일의 임시 파일을 보관 디렉터리에 저장합니다.", @@ -4093,8 +4093,8 @@ "Sharing iSCSI Host Write": "iSCSI 공유 호스트 쓰기", "Sharing iSCSI Initiator Read": "iSCSI 공유 이니시에이터 읽기", "Sharing iSCSI Initiator Write": "iSCSI 공유 이니시에이터 쓰기", - "Sharing iSCSI Portal Read": "iSCSI 공유 포탈 읽기", - "Sharing iSCSI Portal Write": "iSCSI 공유 포탈 쓰기", + "Sharing iSCSI Portal Read": "iSCSI 공유 포털 읽기", + "Sharing iSCSI Portal Write": "iSCSI 공유 포털 쓰기", "Sharing iSCSI Read": "iSCSI 공유 읽기", "Sharing iSCSI Target Extent Read": "iSCSI 공유 대상 익스텐트 읽기", "Sharing iSCSI Target Extent Write": "iSCSI 공유 대상 익스텐트 쓰기", @@ -4519,7 +4519,7 @@ "The preconfigured system Certificate to use for authenticating the TLS protocol connection to the remote system log server.": "원격 시스템 기록 서버에 연결하기 위한 TLS 프로토콜 인증을 위해 사전구성된 시스템 인증서입니다.", "The product of vCPUs, cores and threads must not exceed {maxVcpus} on this system.": "vCPU, 코어, 스레드의 곱은 이 시스템의 {maxVcpus}을(를) 초과할 수 없습니다.", "The remote node must be rebooted because": "원격 노드를 반드시 재시작해야합니다:", - "The rollback will destroy any related intermediate, child dataset, and cloned snapshots that are newer than the rollback snapshot.": "되돌리기를 수행하면 되돌리기 스냅샷보다 후에 생성된 모든 연계된 중간내용, 하위 데이터셋, 복제한 스냅샷을 파기합니다.", + "The rollback will destroy any related intermediate, child dataset, and cloned snapshots that are newer than the rollback snapshot.": "되돌리기를 수행하면 되돌리기 스냅샷보다 후에 생성된 모든 관련된 중간내용, 하위 데이터셋, 복제한 스냅샷을 파기합니다.", "The search base where group objects can be found in the LDAP server.": "LDAP 서버에서 그룹 객체를 검색할 기준입니다.", "The search base where user objects can be found in the LDAP server.": "LDAP 서버에서 사용자 객체를 검색할 기준입니다.", "The secret used to generate OTPs. The secret is produced by the system when Two-Factor Authentication is first activated.": "OTP를 생성하는 데 사용하는 시크릿입니다. 시크릿은 2단계 인증을 처음 활성화할 때 시스템이 발급합니다.", @@ -4587,7 +4587,7 @@ "This dataset is used by the system": "시스템이 사용하는 데이터셋", "This dataset is used by: {apps}": "데이터셋을 사용하는 앱: {apps}", "This dataset is used by: {vms}": "데이터셋을 사용하는 VM: {vms}", - "This dataset is used to store apps config and other container related data": "이 데이터셋은 앱 구성과 컨테이너와 연계된 데이터를 저장하는데 사용합니다.", + "This dataset is used to store apps config and other container related data": "이 데이터셋은 앱 구성과 컨테이너와 관련된 데이터를 저장하는데 사용합니다.", "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.": "이 디스크는 내보낸 풀 {pool}의 일부입니다. 이 디스크를 새로운 풀 또는 기존 풀에 추가하면 {pool}을(를) 불러올 수 없게 됩니다. {pool}에 있는 모든 데이터를 잃게 됩니다. 이 디스크를 재사용/재구성 하기 전에 {pool}에 있는 민감한 데이터를 백업했는지 확인하시기 바랍니다.", "This disk is part of the exported pool {pool}. Reusing this disk will make {pool} unable to import. You will lose any and all data in {pool}. Please make sure any sensitive data in {pool} is backed up before reusing/repurposing this disk.": "이 디스크는 내보낸 풀 {pool}의 일부입니다. 이 디스크를 재사용하면 {pool}을(를) 불러올 수 없게 됩니다. {pool}에 있는 모든 데이터를 잃게 됩니다. 이 디스크를 재사용/재구성 하기 전에 {pool}에 있는 민감한 데이터를 백업했는지 확인하시기 바랍니다.", "This disk is part of the exported pool {pool}. Wiping this disk will make {pool} unable\n to import. You will lose any and all data in {pool}. Please make sure that any sensitive data in {pool} is backed up before wiping this disk.": "이 디스크는 내보낸 풀 {pool}의 일부입니다. 이 디스크를 완전히 지우면 {pool}을(를) 불러올 수 없게 됩니다. {pool}에 있는 모든 데이터를 잃게 됩니다. 이 디스크를 완전히 지우기 전에 {pool}에 있는 민감한 데이터를 백업했는지 확인하시기 바랍니다.", @@ -5057,7 +5057,7 @@ "Web Interface IPv4 Address": "웹 인터페이스 IPv4 주소", "Web Interface IPv6 Address": "웹 인터페이스 IPv6 주소", "Web Interface Port": "웹 인터페이스 포트", - "Web Portal": "웹 포탈", + "Web Portal": "웹 포털", "Web Shell Access": "웹 셸 접근", "WebDAV": "WebDAV", "WebDAV Service": "WebDAV 서비스", @@ -5140,7 +5140,7 @@ "Yesterday": "어제", "You are about to convert {appName} to a custom app. This will allow you to edit its yaml file directly.\nWarning. This operation cannot be undone.": "{appName}을(를) 사용자 앱으로 변환하려고 합니다. 이를 통해 yaml 파일을 직접 수정할 수 있습니다.\n위험. 이 작업은 되돌릴 수 없습니다.", "You are about to delete the target \"{name}\".": "대상 \"{name}\"을(를) 삭제하려고 합니다.", - "You are about to delete the target \"{name}\". You may also choose to delete all extents associated with this target. Note the volumes will not be deleted with the extents.": "대상 \"{name}\"을(를) 삭제하려고 합니다. 이 대상과 연계된 모든 익스텐트를 삭제하도록 선택할 수 있습니다. 익스텐트에 포함된 볼륨은 삭제되지 않습니다.", + "You are about to delete the target \"{name}\". You may also choose to delete all extents associated with this target. Note the volumes will not be deleted with the extents.": "대상 \"{name}\"을(를) 삭제하려고 합니다. 이 대상과 연결된 모든 익스텐트를 삭제하도록 선택할 수 있습니다. 익스텐트에 포함된 볼륨은 삭제되지 않습니다.", "You are trying to open:
\n{url}

\nBecause HTTP to HTTPS redirect is enabled in settings your browser will force HTTPS connection for this URL.
\nThis may create issues if app does not support secure connections.
\n
\nYou can try opening app url in an incognito mode.
\nAlternatively you can disable redirect in Settings, clear browser cache and try again.": "다음을 열려고 합니다:
\n{url}

\nHTTP를 HTTPS로 재연결하는 설정이 활성화 되었기에 브라우저는 이 주소를 HTTPS로 강제 연결합니다.
\n앱이 안전한 연결을 지원하지 않는 경우 문제가 발생할 수 있습니다.
\n
\n앱 주소를 시크릿 모드에서 열어볼 수 있습니다.
\n도는 설정에서 재연결을 비활성화 하고, 브라우저 캐시를 지운 뒤 다시 시도합니다.", "You are using an insecure connection. Switch to HTTPS for secure access.": "안전하지 않은 연결입니다. HTTPS로 전환해 안전하게 접근합니다.", "You can also vote for new features on our forum.": "또한 포럼을 통해 새로운 기능들에 투표할 수 있습니다.", @@ -5315,4 +5315,4 @@ "{used} of {total} ({used_pct})": "{total} 중 {used} ({used_pct})", "{version} is available!": "{version}이 준비되었습니다!", "{view} on {enclosure}": "{enclousure}의 {view}" -} \ No newline at end of file +} From bdfb42e5a0a7af3fdca5f86233fd287ae98939b5 Mon Sep 17 00:00:00 2001 From: Evgeny Stepanovych Date: Fri, 3 Jan 2025 08:40:04 -0500 Subject: [PATCH 02/32] NAS-133299: Extend window not showing up (#11270) --- src/app/pages/storage/modules/devices/devices.component.ts | 3 --- .../storage/modules/devices/stores/devices-store.service.ts | 4 +++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/app/pages/storage/modules/devices/devices.component.ts b/src/app/pages/storage/modules/devices/devices.component.ts index 82b42155405..fbeffad54a8 100644 --- a/src/app/pages/storage/modules/devices/devices.component.ts +++ b/src/app/pages/storage/modules/devices/devices.component.ts @@ -85,9 +85,6 @@ const raidzItems = [TopologyItemType.Raidz, TopologyItemType.Raidz1, TopologyIte TreeNodeToggleDirective, TreeNodeOutletDirective, ], - providers: [ - DevicesStore, - ], }) export class DevicesComponent implements OnInit, AfterViewInit { protected readonly requiredRoles = [Role.FullAdmin]; diff --git a/src/app/pages/storage/modules/devices/stores/devices-store.service.ts b/src/app/pages/storage/modules/devices/stores/devices-store.service.ts index 5bdfdf9424e..715eb8ca70d 100644 --- a/src/app/pages/storage/modules/devices/stores/devices-store.service.ts +++ b/src/app/pages/storage/modules/devices/stores/devices-store.service.ts @@ -32,7 +32,9 @@ const initialState: DevicesState = { disksWithSmartTestSupport: [], }; -@Injectable() +@Injectable({ + providedIn: 'root', +}) export class DevicesStore extends ComponentStore { readonly isLoading$ = this.select((state) => state.isLoading); readonly error$ = this.select((state) => state.error); From 601e061343511399b013bf03c01bd47a70cec27c Mon Sep 17 00:00:00 2001 From: Evgeny Stepanovych Date: Fri, 3 Jan 2025 08:40:17 -0500 Subject: [PATCH 03/32] NAS-133353 / 25.04 / Add tests in reporting section (#11274) --- .../components/report/report.component.html | 6 +- .../components/report/report.component.ts | 4 - .../reports-global-controls.component.spec.ts | 159 ++++++++++++++++++ .../reports-global-controls.component.ts | 18 +- 4 files changed, 169 insertions(+), 18 deletions(-) create mode 100644 src/app/pages/reports-dashboard/components/reports-global-controls/reports-global-controls.component.spec.ts diff --git a/src/app/pages/reports-dashboard/components/report/report.component.html b/src/app/pages/reports-dashboard/components/report/report.component.html index 2aa140ca4c0..96e917a4f06 100644 --- a/src/app/pages/reports-dashboard/components/report/report.component.html +++ b/src/app/pages/reports-dashboard/components/report/report.component.html @@ -1,9 +1,5 @@
-
+
@if (isReady) { diff --git a/src/app/pages/reports-dashboard/components/report/report.component.ts b/src/app/pages/reports-dashboard/components/report/report.component.ts index e857292d0f5..eafbb00d18b 100644 --- a/src/app/pages/reports-dashboard/components/report/report.component.ts +++ b/src/app/pages/reports-dashboard/components/report/report.component.ts @@ -277,10 +277,6 @@ export class ReportComponent implements OnInit, OnChanges { this.customZoom = true; } - setChartInteractive(value: boolean): void { - this.isActive = value; - } - timeZoomReset(): void { this.zoomLevelIndex = this.zoomLevelMax; const rrdOptions = this.convertTimeSpan(this.currentZoomLevel); diff --git a/src/app/pages/reports-dashboard/components/reports-global-controls/reports-global-controls.component.spec.ts b/src/app/pages/reports-dashboard/components/reports-global-controls/reports-global-controls.component.spec.ts new file mode 100644 index 00000000000..67f1a5b30e6 --- /dev/null +++ b/src/app/pages/reports-dashboard/components/reports-global-controls/reports-global-controls.component.spec.ts @@ -0,0 +1,159 @@ +import { HarnessLoader } from '@angular/cdk/testing'; +import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; +import { + fakeAsync, flush, flushMicrotasks, tick, +} from '@angular/core/testing'; +import { MatButtonHarness } from '@angular/material/button/testing'; +import { MatMenuHarness } from '@angular/material/menu/testing'; +import { ActivatedRoute } from '@angular/router'; +import { + createComponentFactory, + mockProvider, + Spectator, +} from '@ngneat/spectator/jest'; +import { Store } from '@ngrx/store'; +import { provideMockStore } from '@ngrx/store/testing'; +import { of } from 'rxjs'; +import { IxSelectHarness } from 'app/modules/forms/ix-forms/components/ix-select/ix-select.harness'; +import { IxSlideToggleHarness } from 'app/modules/forms/ix-forms/components/ix-slide-toggle/ix-slide-toggle.harness'; +import { + ReportsGlobalControlsComponent, +} from 'app/pages/reports-dashboard/components/reports-global-controls/reports-global-controls.component'; +import { ReportTab, ReportType } from 'app/pages/reports-dashboard/interfaces/report-tab.interface'; +import { ReportsService } from 'app/pages/reports-dashboard/reports.service'; +import { autoRefreshReportsToggled } from 'app/store/preferences/preferences.actions'; +import { selectPreferences } from 'app/store/preferences/preferences.selectors'; + +describe('ReportsGlobalControlsComponent', () => { + let spectator: Spectator; + let loader: HarnessLoader; + const createComponent = createComponentFactory({ + component: ReportsGlobalControlsComponent, + providers: [ + mockProvider(ReportsService, { + getReportGraphs: jest.fn(() => of([])), + getReportTabs: jest.fn(() => [ + { label: 'Disk', value: ReportType.Disk }, + { label: 'CPU', value: ReportType.Cpu }, + { label: 'UPS', value: ReportType.Ups }, + ] as ReportTab[]), + getDiskDevices: jest.fn(() => of([ + { label: 'sda', value: 'sda' }, + { label: 'sdb', value: 'sdb' }, + ])), + getDiskMetrics: jest.fn(() => of([ + { label: 'Disk I/O', value: 'disk' }, + { label: 'Disk Temperature', value: 'disktemp' }, + ])), + }), + provideMockStore({ + selectors: [ + { + selector: selectPreferences, + value: { + autoRefreshReports: true, + }, + }, + ], + }), + mockProvider(ActivatedRoute, { + routeConfig: { + path: ReportType.Disk, + }, + snapshot: { + queryParams: { + disks: ['sda'], + }, + }, + }), + ], + }); + + beforeEach(fakeAsync(() => { + spectator = createComponent(); + loader = TestbedHarnessEnvironment.loader(spectator.fixture); + })); + + describe('report selector', () => { + it('shows a list of available reports', async () => { + const reportMenu = await loader.getHarness(MatMenuHarness); + + await reportMenu.open(); + const menuItems = await reportMenu.getItems(); + + expect(menuItems).toHaveLength(3); + expect(await menuItems[0].getText()).toBe('Disk'); + expect(await menuItems[1].getText()).toBe('CPU'); + expect(await menuItems[2].getText()).toBe('UPS'); + }); + + it('marks currently selected menu item based on current route', async () => { + const reportMenu = await loader.getHarness(MatMenuHarness); + + expect(await reportMenu.getTriggerText()).toBe('Disk'); + }); + }); + + describe('disk reports', () => { + it('shows disks multiselect when disk report is selected', async () => { + const devices = await loader.getHarness(IxSelectHarness.with({ label: 'Devices' })); + const options = await devices.getOptionLabels(); + + expect(options).toEqual(['sda', 'sdb']); + }); + + it('shows disk metrics when disk report is selected', async () => { + const metrics = await loader.getHarness(IxSelectHarness.with({ label: 'Metrics' })); + const options = await metrics.getOptionLabels(); + + expect(options).toEqual(['Disk I/O', 'Disk Temperature']); + }); + + it('pre-selects disks based on route params', async () => { + const devices = await loader.getHarness(IxSelectHarness.with({ label: 'Devices' })); + + expect(await devices.getValue()).toEqual(['sda']); + }); + + it('emits (diskOptionsChanged) when user changes disk or disk metric selection', fakeAsync(async () => { + jest.spyOn(spectator.component.diskOptionsChanged, 'emit'); + + const devices = await loader.getHarness(IxSelectHarness.with({ label: 'Devices' })); + await devices.setValue(['sdb']); + + flush(1); + flushMicrotasks(); + + tick(1000); + + expect(spectator.component.diskOptionsChanged.emit).toHaveBeenCalledWith({ + devices: ['sdb'], + metrics: ['disk', 'disktemp'], + }); + })); + }); + + describe('Auto Refresh toggle', () => { + it('shows Auto Refresh toggle with current value based on user preferences', async () => { + const autoRefreshToggle = await loader.getHarness(IxSlideToggleHarness.with({ label: 'Auto Refresh' })); + + expect(await autoRefreshToggle.getValue()).toBe(true); + }); + + it('dispatches autoRefreshReportsToggled() action when Auto Refresh is toggled', async () => { + const store$ = spectator.inject(Store); + jest.spyOn(store$, 'dispatch'); + + const autoRefreshToggle = await loader.getHarness(IxSlideToggleHarness.with({ label: 'Auto Refresh' })); + await autoRefreshToggle.toggle(); + + expect(store$.dispatch).toHaveBeenCalledWith(autoRefreshReportsToggled()); + }); + }); + + it('shows Exporters button', async () => { + const exportersButton = await loader.getHarness(MatButtonHarness.with({ text: 'Exporters' })); + + expect(exportersButton).toBeTruthy(); + }); +}); diff --git a/src/app/pages/reports-dashboard/components/reports-global-controls/reports-global-controls.component.ts b/src/app/pages/reports-dashboard/components/reports-global-controls/reports-global-controls.component.ts index 7e6a793d2f3..d6c1a9e7221 100644 --- a/src/app/pages/reports-dashboard/components/reports-global-controls/reports-global-controls.component.ts +++ b/src/app/pages/reports-dashboard/components/reports-global-controls/reports-global-controls.component.ts @@ -50,19 +50,19 @@ import { waitForPreferences } from 'app/store/preferences/preferences.selectors' export class ReportsGlobalControlsComponent implements OnInit { readonly diskOptionsChanged = output<{ devices: string[]; metrics: string[] }>(); - form = this.fb.group({ + protected form = this.fb.group({ autoRefresh: [false], devices: [[] as string[]], metrics: [[] as string[]], }); - activeTab: ReportTab; - allTabs: ReportTab[]; - diskDevices$ = this.reportsService.getDiskDevices(); - diskMetrics$ = this.reportsService.getDiskMetrics(); + protected activeTab: ReportTab; + protected allTabs: ReportTab[]; + protected diskDevices$ = this.reportsService.getDiskDevices(); + protected diskMetrics$ = this.reportsService.getDiskMetrics(); - readonly ReportType = ReportType; - readonly searchableElements = reportingGlobalControlsElements; + protected readonly ReportType = ReportType; + protected readonly searchableElements = reportingGlobalControlsElements; constructor( private fb: FormBuilder, @@ -78,11 +78,11 @@ export class ReportsGlobalControlsComponent implements OnInit { this.setupDisksTab(); } - isActiveTab(tab: ReportTab): boolean { + protected isActiveTab(tab: ReportTab): boolean { return this.activeTab?.value === tab.value; } - typeTab(tab: ReportTab): ReportTab { + protected typeTab(tab: ReportTab): ReportTab { return tab; } From 2b5ea90d9718b306d4c895c34f2742a78a529306 Mon Sep 17 00:00:00 2001 From: Evgeny Stepanovych Date: Fri, 3 Jan 2025 10:10:54 -0500 Subject: [PATCH 04/32] NAS-133382: Fix more strict null checks (#11279) --- .../get-credentials-creation-source.utils.ts | 10 +- .../error-template.component.ts | 2 +- .../session-expiring-dialog.component.ts | 11 +- .../show-logs-dialog.component.html | 2 +- .../start-service-dialog.component.ts | 7 +- src/app/modules/empty/empty.component.html | 4 +- src/app/modules/empty/empty.component.ts | 2 +- .../ix-chips/ix-chips.component.html | 2 +- .../ix-code-editor.component.ts | 30 ++-- .../ix-combobox/ix-combobox.component.html | 2 +- .../ix-combobox/ix-combobox.component.ts | 4 +- .../ix-form-glossary.component.ts | 2 +- .../components/ix-input/ix-input.component.ts | 15 +- .../components/warning/warning.component.ts | 2 +- .../ix-forms/services/ix-formatter.service.ts | 2 +- .../advanced-search.component.ts | 2 +- .../toolbar-slider.component.ts | 2 +- .../global-search-trigger.component.ts | 6 +- .../ix-table/classes/base-data-provider.ts | 2 +- .../ix-empty-row/ix-empty-row.component.html | 4 +- .../ix-empty-row/ix-empty-row.component.ts | 7 +- .../ix-cell-schedule.component.html | 2 +- .../ix-cell-schedule.component.ts | 3 +- .../ix-cell-state-button.component.html | 2 +- .../ix-cell-text/ix-cell-text.component.html | 2 +- .../ix-cell-toggle.component.ts | 2 +- .../ix-table-columns-selector.component.ts | 2 +- .../directives/ix-body-cell.directive.ts | 2 +- .../modules/ix-tree/nested-tree-datasource.ts | 2 +- .../job-item/job-item.component.html | 4 +- .../jobs-panel/jobs-panel.component.html | 2 +- src/app/modules/jobs/store/job.selectors.ts | 2 +- .../console-footer.component.ts | 2 +- .../change-password-dialog.component.ts | 6 +- .../topbar/user-menu/user-menu.component.html | 2 +- .../scheduler-modal-config.interface.ts | 2 +- .../scheduler/scheduler.component.html | 2 +- .../scheduler/scheduler.component.ts | 2 +- .../truecommand-connect-modal.component.ts | 5 +- .../app-wizard/app-wizard.component.ts | 19 ++- .../category-view.component.html | 2 +- .../apps-settings.component.html | 2 +- .../apps-settings.component.spec.ts | 1 + .../apps-settings.component.ts | 18 +- .../custom-app-form.component.ts | 2 +- .../docker-image-delete-dialog.component.ts | 4 +- .../docker-images-list.component.html | 2 +- .../app-details-panel.component.html | 8 +- .../app-details-panel.component.ts | 2 +- .../app-info-card.component.html | 16 +- .../app-info-card/app-info-card.component.ts | 2 +- .../installed-apps-list.component.ts | 5 +- .../select-pool-dialog.component.ts | 4 +- src/app/pages/audit/audit.component.ts | 2 +- .../audit-list/audit-list.component.html | 2 +- .../audit-list/audit-list.component.ts | 16 +- .../audit-search/audit-search.component.html | 2 +- .../audit-search/audit-search.component.ts | 12 +- .../utils/get-log-important-data.utils.ts | 4 +- .../cloud-credentials-card.component.html | 2 +- .../cloud-credentials-form.component.ts | 2 +- .../google-cloud-provider-form.component.ts | 4 +- .../pcloud-provider-form.component.ts | 2 +- .../ssh-connection-card.component.html | 2 +- .../ssh-connection-form.component.ts | 8 +- .../ssh-keypair-card.component.html | 2 +- .../ssh-keypair-form.component.spec.ts | 1 - .../ssh-keypair-form.component.ts | 15 +- ...acme-dns-authenticator-list.component.html | 2 +- .../certificate-acme-add.component.ts | 6 +- .../certificate-authority-add.component.ts | 2 +- .../certificate-edit.component.ts | 2 +- .../certificate-list.component.html | 2 +- .../csr-add/csr-add.component.ts | 2 +- .../acmedns-form/acmedns-form.component.ts | 2 +- .../certificate-add.component.ts | 2 +- ...rtificate-identifier-and-type.component.ts | 4 +- .../certificate-constraints.component.ts | 12 +- .../certificate-options.component.ts | 5 +- .../groups/group-form/group-form.component.ts | 4 +- .../group-list/group-list.component.html | 2 +- .../privilege-list.component.html | 2 +- .../user-api-keys.component.html | 2 +- .../users/user-list/user-list.component.html | 2 +- .../cloud-backup-card.component.html | 2 +- .../cloud-backup-list.component.html | 2 +- .../cloudsync-form.component.ts | 2 +- .../cloudsync-task-card.component.html | 2 +- .../replication-form.component.ts | 2 +- .../replication-list.component.html | 2 +- .../replication-task-card.component.html | 2 +- .../rsync-task-card.component.html | 2 +- .../rsync-task-list.component.html | 2 +- .../scrub-list/scrub-list.component.html | 2 +- .../scrub-task-card.component.html | 2 +- .../smart-task-card.component.html | 2 +- .../smart-task-list.component.html | 2 +- .../snapshot-task-card.component.html | 2 +- .../snapshot-task-list.component.html | 2 +- .../vmware-snapshot-list.component.html | 2 +- .../quotas-section.component.ts | 10 +- .../dataset-form/utils/zfs-property.utils.ts | 4 +- .../zvol-form/zvol-form.component.ts | 2 +- .../snapshot-list.component.html | 2 +- .../idmap-list/idmap-list.component.html | 2 +- .../kerberos-keytabs-list.component.html | 2 +- .../kerberos-realms-list.component.html | 2 +- .../ipmi-card/ipmi-card.component.html | 2 +- .../static-routes-card.component.html | 2 +- .../reporting-exporters-list.component.html | 2 +- .../components/report/report.component.ts | 12 +- .../iscsi-card/iscsi-card.component.html | 2 +- .../nfs-card/nfs-card.component.html | 2 +- .../smb-card/smb-card.component.html | 2 +- .../authorized-access-list.component.html | 4 +- .../extent-list/extent-list.component.html | 4 +- .../global-target-configuration.component.ts | 4 +- .../initiator-form.component.ts | 6 +- .../initiator-list.component.html | 4 +- .../iscsi-wizard/iscsi-wizard.component.ts | 22 +-- .../portal-list/portal-list.component.html | 4 +- .../target-list/target-list.component.html | 4 +- .../target-form/target-form.component.ts | 4 +- .../nfs/nfs-list/nfs-list.component.html | 4 +- .../nfs-session-list.component.html | 2 +- .../sharing/smb/smb-acl/smb-acl.component.ts | 6 +- .../smb/smb-form/smb-form.component.ts | 19 ++- .../smb/smb-list/smb-list.component.html | 4 +- .../smb-lock-list.component.html | 2 +- .../smb-notification-list.component.html | 2 +- .../smb-open-files.component.html | 2 +- .../smb-session-list.component.html | 2 +- .../smb-share-list.component.html | 2 +- .../disk-list/disk-list.component.html | 4 +- .../smart-test-result-list.component.html | 2 +- .../cron/cron-card/cron-card.component.html | 2 +- .../init-shutdown-card.component.html | 2 +- .../sysctl-card/sysctl-card.component.html | 2 +- .../tunable-list/tunable-list.component.html | 2 +- .../alert-service-list.component.html | 2 +- .../bootenv-list/bootenv-list.component.html | 4 +- .../jbof-list/jbof-list.component.html | 2 +- .../device-list/device-list.component.html | 2 +- src/app/services/session-timeout.service.ts | 7 +- src/assets/i18n/es-ar.json | 156 +++++++++--------- 145 files changed, 399 insertions(+), 351 deletions(-) diff --git a/src/app/helpers/get-credentials-creation-source.utils.ts b/src/app/helpers/get-credentials-creation-source.utils.ts index c41715abc48..2fa82cb821e 100644 --- a/src/app/helpers/get-credentials-creation-source.utils.ts +++ b/src/app/helpers/get-credentials-creation-source.utils.ts @@ -1,11 +1,15 @@ import { CredentialType, Credentials } from 'app/interfaces/credential-type.interface'; -export function getCredentialsCreationSource(credentials: Credentials): string { +export function getCredentialsCreationSource(credentials: Credentials | null): string { + if (!credentials?.type) { + return ''; + } + if ([CredentialType.UnixSocket, CredentialType.LoginPassword, CredentialType.Token].includes(credentials.type)) { - return credentials.data.username; + return credentials.data?.username || ''; } if (credentials.type === CredentialType.ApiKey) { - return credentials.data.api_key; + return credentials.data?.api_key || ''; } return ''; } diff --git a/src/app/modules/dialog/components/multi-error-dialog/error-template/error-template.component.ts b/src/app/modules/dialog/components/multi-error-dialog/error-template/error-template.component.ts index 91ef4c355c2..dd38eac4a0c 100644 --- a/src/app/modules/dialog/components/multi-error-dialog/error-template/error-template.component.ts +++ b/src/app/modules/dialog/components/multi-error-dialog/error-template/error-template.component.ts @@ -34,7 +34,7 @@ export class ErrorTemplateComponent { private readonly errorBtPanel: Signal | undefined> = viewChild('errorBtPanel', { read: ElementRef }); private readonly errorBtText: Signal | undefined> = viewChild('errorBtText', { read: ElementRef }); - readonly title = input(); + readonly title = input.required(); readonly message = input(); readonly backtrace = input(); readonly logs = input(); diff --git a/src/app/modules/dialog/components/session-expiring-dialog/session-expiring-dialog.component.ts b/src/app/modules/dialog/components/session-expiring-dialog/session-expiring-dialog.component.ts index ba5e980d2df..fe8d3268462 100644 --- a/src/app/modules/dialog/components/session-expiring-dialog/session-expiring-dialog.component.ts +++ b/src/app/modules/dialog/components/session-expiring-dialog/session-expiring-dialog.component.ts @@ -8,9 +8,14 @@ import { } from '@angular/material/dialog'; import { TranslateModule } from '@ngx-translate/core'; import { NavigateAndInteractDirective } from 'app/directives/navigate-and-interact/navigate-and-interact.directive'; -import { ConfirmOptionsWithSecondaryCheckbox } from 'app/interfaces/dialog.interface'; import { TestDirective } from 'app/modules/test-id/test.directive'; +export interface SessionExpiringDialogOptions { + title: string; + message: string; + buttonText: string; +} + @Component({ selector: 'ix-session-expiring-dialog', templateUrl: './session-expiring-dialog.component.html', @@ -28,11 +33,11 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; ], }) export class SessionExpiringDialogComponent { - options: ConfirmOptionsWithSecondaryCheckbox; + options: SessionExpiringDialogOptions; constructor( private dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) options: ConfirmOptionsWithSecondaryCheckbox, + @Inject(MAT_DIALOG_DATA) options: SessionExpiringDialogOptions, ) { this.options = { ...options }; } diff --git a/src/app/modules/dialog/components/show-logs-dialog/show-logs-dialog.component.html b/src/app/modules/dialog/components/show-logs-dialog/show-logs-dialog.component.html index 394f5f60c3f..5da7351b112 100644 --- a/src/app/modules/dialog/components/show-logs-dialog/show-logs-dialog.component.html +++ b/src/app/modules/dialog/components/show-logs-dialog/show-logs-dialog.component.html @@ -1,6 +1,6 @@

{{ 'Logs' | translate }}

-@if (job?.logs_excerpt) { +@if (job.logs_excerpt) {
{{ job.logs_excerpt }}
diff --git a/src/app/modules/dialog/components/start-service-dialog/start-service-dialog.component.ts b/src/app/modules/dialog/components/start-service-dialog/start-service-dialog.component.ts index fddf94217f8..5a728bad2c9 100644 --- a/src/app/modules/dialog/components/start-service-dialog/start-service-dialog.component.ts +++ b/src/app/modules/dialog/components/start-service-dialog/start-service-dialog.component.ts @@ -9,7 +9,7 @@ import { import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { Store } from '@ngrx/store'; import { TranslateService, TranslateModule } from '@ngx-translate/core'; -import { Observable, forkJoin } from 'rxjs'; +import { Observable, forkJoin, filter } from 'rxjs'; import { ServiceName, serviceNames } from 'app/enums/service-name.enum'; import { Service } from 'app/interfaces/service.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; @@ -131,7 +131,10 @@ export class StartServiceDialogComponent implements OnInit { private getService(): void { this.store$.select(selectService(this.serviceName)) - .pipe(untilDestroyed(this)) + .pipe( + filter((service) => !!service), + untilDestroyed(this), + ) .subscribe((service) => { this.service = service; this.cdr.markForCheck(); diff --git a/src/app/modules/empty/empty.component.html b/src/app/modules/empty/empty.component.html index c480383d35a..15708f386b8 100644 --- a/src/app/modules/empty/empty.component.html +++ b/src/app/modules/empty/empty.component.html @@ -1,7 +1,7 @@
@if (!isLoading()) {
diff --git a/src/app/modules/empty/empty.component.ts b/src/app/modules/empty/empty.component.ts index b987c388ae3..5f7a45a2676 100644 --- a/src/app/modules/empty/empty.component.ts +++ b/src/app/modules/empty/empty.component.ts @@ -31,7 +31,7 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; }) export class EmptyComponent { readonly conf = input.required(); - readonly requiredRoles = input(); + readonly requiredRoles = input([]); doAction(): void { const action = this.conf().button?.action; diff --git a/src/app/modules/forms/ix-forms/components/ix-chips/ix-chips.component.html b/src/app/modules/forms/ix-forms/components/ix-chips/ix-chips.component.html index a858d272ac9..010f1be2861 100644 --- a/src/app/modules/forms/ix-forms/components/ix-chips/ix-chips.component.html +++ b/src/app/modules/forms/ix-forms/components/ix-chips/ix-chips.component.html @@ -3,7 +3,7 @@ [label]="label()" [tooltip]="tooltip()" [required]="required()" - [ixTestOverride]="controlDirective.name" + [ixTestOverride]="controlDirective.name || ''" > } diff --git a/src/app/modules/forms/ix-forms/components/ix-code-editor/ix-code-editor.component.ts b/src/app/modules/forms/ix-forms/components/ix-code-editor/ix-code-editor.component.ts index e2a0777a20c..55904c7f9c9 100644 --- a/src/app/modules/forms/ix-forms/components/ix-code-editor/ix-code-editor.component.ts +++ b/src/app/modules/forms/ix-forms/components/ix-code-editor/ix-code-editor.component.ts @@ -12,7 +12,7 @@ import { import { ControlValueAccessor, NgControl, ReactiveFormsModule } from '@angular/forms'; import { MatHint } from '@angular/material/form-field'; import { defaultKeymap, history, historyKeymap } from '@codemirror/commands'; -import { Compartment } from '@codemirror/state'; +import { Compartment, Extension } from '@codemirror/state'; import { EditorView, EditorViewConfig, keymap, lineNumbers, placeholder, } from '@codemirror/view'; @@ -142,19 +142,25 @@ export class IxCodeEditorComponent implements OnChanges, OnInit, AfterViewInit, this.onChange(update.state.doc.toString()); }); + const extensions: Extension[] = [ + basicSetup, + updateListener, + lineNumbers(), + history(), + keymap.of([...defaultKeymap as unknown[], ...historyKeymap]), + material, + this.editableCompartment.of(EditorView.editable.of(true)), + placeholder(this.placeholder()), + ]; + + const language = this.language(); + if (language) { + extensions.push(languageFunctionsMap[language]()); + } + const config: EditorViewConfig = { + extensions, doc: this.controlDirective.control?.value as string || '', - extensions: [ - basicSetup, - updateListener, - languageFunctionsMap[this.language()](), - lineNumbers(), - history(), - keymap.of([...defaultKeymap as unknown[], ...historyKeymap]), - material, - this.editableCompartment.of(EditorView.editable.of(true)), - placeholder(this.placeholder()), - ], parent: this.inputArea().nativeElement, }; this.editorView = new EditorView(config); diff --git a/src/app/modules/forms/ix-forms/components/ix-combobox/ix-combobox.component.html b/src/app/modules/forms/ix-forms/components/ix-combobox/ix-combobox.component.html index aa572d67ed7..80187af42ca 100644 --- a/src/app/modules/forms/ix-forms/components/ix-combobox/ix-combobox.component.html +++ b/src/app/modules/forms/ix-forms/components/ix-combobox/ix-combobox.component.html @@ -4,7 +4,7 @@ [label]="label()" [tooltip]="tooltip()" [required]="required()" - [ixTestOverride]="controlDirective.name" + [ixTestOverride]="controlDirective.name || ''" > } diff --git a/src/app/modules/forms/ix-forms/components/ix-combobox/ix-combobox.component.ts b/src/app/modules/forms/ix-forms/components/ix-combobox/ix-combobox.component.ts index 7178c43a547..a1d01d34259 100644 --- a/src/app/modules/forms/ix-forms/components/ix-combobox/ix-combobox.component.ts +++ b/src/app/modules/forms/ix-forms/components/ix-combobox/ix-combobox.component.ts @@ -84,9 +84,9 @@ export class IxComboboxComponent implements ControlValueAccessor, OnInit { private filterChanged$ = new Subject(); - value: string | number = ''; + value: string | number | null = ''; isDisabled = false; - filterValue: string; + filterValue: string | null; selectedOption: Option | null = null; textContent = ''; diff --git a/src/app/modules/forms/ix-forms/components/ix-form-glossary/ix-form-glossary.component.ts b/src/app/modules/forms/ix-forms/components/ix-form-glossary/ix-form-glossary.component.ts index 67bbc03612a..43163eb3fa7 100644 --- a/src/app/modules/forms/ix-forms/components/ix-form-glossary/ix-form-glossary.component.ts +++ b/src/app/modules/forms/ix-forms/components/ix-form-glossary/ix-form-glossary.component.ts @@ -147,7 +147,7 @@ export class IxFormGlossaryComponent implements OnInit { } protected isSectionValid(section: IxFormSectionComponent): boolean { - return this.sectionsValidity.get(section); + return !!this.sectionsValidity.get(section); } ngOnInit(): void { diff --git a/src/app/modules/forms/ix-forms/components/ix-input/ix-input.component.ts b/src/app/modules/forms/ix-forms/components/ix-input/ix-input.component.ts index 935601737b1..7cb8525d857 100644 --- a/src/app/modules/forms/ix-forms/components/ix-input/ix-input.component.ts +++ b/src/app/modules/forms/ix-forms/components/ix-input/ix-input.component.ts @@ -67,7 +67,7 @@ export class IxInputComponent implements ControlValueAccessor, OnInit, OnChanges readonly tooltip = input(); readonly required = input(false); readonly readonly = input(); - readonly type = input(); + readonly type = input('text'); readonly autocomplete = input('off'); readonly autocompleteOptions = input(); readonly maxLength = input(524288); @@ -77,7 +77,7 @@ export class IxInputComponent implements ControlValueAccessor, OnInit, OnChanges readonly format = input<(value: string | number) => string>(); readonly parse = input<(value: string | number) => string | number>(); - readonly inputElementRef: Signal> = viewChild('ixInput', { read: ElementRef }); + readonly inputElementRef: Signal> = viewChild.required('ixInput', { read: ElementRef }); private _value: string | number = this.controlDirective.value as string; formatted: string | number = ''; @@ -212,12 +212,15 @@ export class IxInputComponent implements ControlValueAccessor, OnInit, OnChanges this.onTouch(); if (this.formatted) { - if (this.parse()) { - this.value = this.parse()(this.formatted); + const parse = this.parse(); + if (parse) { + this.value = parse(this.formatted); this.formatted = this.value; } - if (this.format()) { - this.formatted = this.format()(this.value); + + const format = this.format(); + if (format) { + this.formatted = format(this.value); } } diff --git a/src/app/modules/forms/ix-forms/components/warning/warning.component.ts b/src/app/modules/forms/ix-forms/components/warning/warning.component.ts index 4154094059d..416b0a27587 100644 --- a/src/app/modules/forms/ix-forms/components/warning/warning.component.ts +++ b/src/app/modules/forms/ix-forms/components/warning/warning.component.ts @@ -15,6 +15,6 @@ import { TranslateModule } from '@ngx-translate/core'; imports: [NgClass, TranslateModule], }) export class WarningComponent { - readonly message = input(); + readonly message = input.required(); readonly color = input<'green' | 'orange'>('orange'); } diff --git a/src/app/modules/forms/ix-forms/services/ix-formatter.service.ts b/src/app/modules/forms/ix-forms/services/ix-formatter.service.ts index 22d823cfe1d..789db29d939 100644 --- a/src/app/modules/forms/ix-forms/services/ix-formatter.service.ts +++ b/src/app/modules/forms/ix-forms/services/ix-formatter.service.ts @@ -185,7 +185,7 @@ export class IxFormatterService { } return unitStr.charAt(0).toUpperCase() + 'iB'; } - return undefined; + return ''; }; /** diff --git a/src/app/modules/forms/search-input/components/advanced-search/advanced-search.component.ts b/src/app/modules/forms/search-input/components/advanced-search/advanced-search.component.ts index fb6a60435e3..67ea879970b 100644 --- a/src/app/modules/forms/search-input/components/advanced-search/advanced-search.component.ts +++ b/src/app/modules/forms/search-input/components/advanced-search/advanced-search.component.ts @@ -55,7 +55,7 @@ export class AdvancedSearchComponent implements OnInit { readonly switchToBasic = output(); readonly runSearch = output(); - private readonly inputArea: Signal> = viewChild('inputArea', { read: ElementRef }); + private readonly inputArea: Signal> = viewChild.required('inputArea', { read: ElementRef }); protected hasQueryErrors = false; protected queryInputValue: string; diff --git a/src/app/modules/forms/toolbar-slider/toolbar-slider.component.ts b/src/app/modules/forms/toolbar-slider/toolbar-slider.component.ts index 0583ac708c0..3bd6f9049b4 100644 --- a/src/app/modules/forms/toolbar-slider/toolbar-slider.component.ts +++ b/src/app/modules/forms/toolbar-slider/toolbar-slider.component.ts @@ -23,7 +23,7 @@ export class ToolbarSliderComponent { readonly label = input(1); readonly name = input(1); - readonly value = model(); + readonly value = model.required(); onChange(updatedValue: string): void { this.value.set(Number(updatedValue)); diff --git a/src/app/modules/global-search/components/global-search-trigger/global-search-trigger.component.ts b/src/app/modules/global-search/components/global-search-trigger/global-search-trigger.component.ts index b71c912bd03..bc889124461 100644 --- a/src/app/modules/global-search/components/global-search-trigger/global-search-trigger.component.ts +++ b/src/app/modules/global-search/components/global-search-trigger/global-search-trigger.component.ts @@ -36,7 +36,7 @@ import { FocusService } from 'app/services/focus.service'; ], }) export class GlobalSearchTriggerComponent implements AfterViewInit { - protected overlayRef: OverlayRef; + protected overlayRef: OverlayRef | undefined; constructor( private cdr: ChangeDetectorRef, @@ -64,7 +64,7 @@ export class GlobalSearchTriggerComponent implements AfterViewInit { } protected showOverlay(): void { - if (this.overlayRef.hasAttached()) { + if (!this.overlayRef || this.overlayRef.hasAttached()) { return; } @@ -86,7 +86,7 @@ export class GlobalSearchTriggerComponent implements AfterViewInit { } private detachOverlay(): void { - if (!this.overlayRef.hasAttached()) { + if (!this.overlayRef?.hasAttached()) { return; } this.overlayRef.detach(); diff --git a/src/app/modules/ix-table/classes/base-data-provider.ts b/src/app/modules/ix-table/classes/base-data-provider.ts index e4c7a89a829..179a4744955 100644 --- a/src/app/modules/ix-table/classes/base-data-provider.ts +++ b/src/app/modules/ix-table/classes/base-data-provider.ts @@ -28,7 +28,7 @@ export class BaseDataProvider implements DataProvider { } currentPage$ = new BehaviorSubject([]); - expandedRow$ = new BehaviorSubject(null); + expandedRow$ = new BehaviorSubject(null); expandedRow: T; totalRows = 0; diff --git a/src/app/modules/ix-table/components/ix-empty-row/ix-empty-row.component.html b/src/app/modules/ix-table/components/ix-empty-row/ix-empty-row.component.html index 7cd40895de6..1b861a81ea3 100644 --- a/src/app/modules/ix-table/components/ix-empty-row/ix-empty-row.component.html +++ b/src/app/modules/ix-table/components/ix-empty-row/ix-empty-row.component.html @@ -2,8 +2,8 @@
@if (isLoading()) { diff --git a/src/app/modules/ix-table/components/ix-empty-row/ix-empty-row.component.ts b/src/app/modules/ix-table/components/ix-empty-row/ix-empty-row.component.ts index 831fd5f0795..8d2ea154a78 100644 --- a/src/app/modules/ix-table/components/ix-empty-row/ix-empty-row.component.ts +++ b/src/app/modules/ix-table/components/ix-empty-row/ix-empty-row.component.ts @@ -42,7 +42,7 @@ export class IxTableEmptyRowComponent implements AfterViewInit { type: EmptyType.NoPageData, }); - readonly templatePortalContent = viewChild>('templatePortalContent'); + readonly templatePortalContent = viewChild.required>('templatePortalContent'); templatePortal: TemplatePortal; constructor( @@ -57,8 +57,9 @@ export class IxTableEmptyRowComponent implements AfterViewInit { } doAction(): void { - if (this.conf().button.action) { - this.conf().button.action(); + const action = this.conf().button?.action; + if (action) { + action(); } } diff --git a/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-schedule/ix-cell-schedule.component.html b/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-schedule/ix-cell-schedule.component.html index 4bae36c777c..d14afdfad6f 100644 --- a/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-schedule/ix-cell-schedule.component.html +++ b/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-schedule/ix-cell-schedule.component.html @@ -1,4 +1,4 @@ {{ value | scheduleDescription }} +>{{ value | cast | scheduleDescription }} diff --git a/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-schedule/ix-cell-schedule.component.ts b/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-schedule/ix-cell-schedule.component.ts index 7334faff5a1..3fa11e38876 100644 --- a/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-schedule/ix-cell-schedule.component.ts +++ b/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-schedule/ix-cell-schedule.component.ts @@ -2,6 +2,7 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { MatTooltip } from '@angular/material/tooltip'; import { ScheduleDescriptionPipe } from 'app/modules/dates/pipes/schedule-description/schedule-description.pipe'; import { ColumnComponent, Column } from 'app/modules/ix-table/interfaces/column-component.class'; +import { CastPipe } from 'app/modules/pipes/cast/cast.pipe'; import { TestDirective } from 'app/modules/test-id/test.directive'; @Component({ @@ -9,7 +10,7 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; templateUrl: './ix-cell-schedule.component.html', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, - imports: [TestDirective, ScheduleDescriptionPipe, MatTooltip], + imports: [TestDirective, ScheduleDescriptionPipe, MatTooltip, CastPipe], }) export class IxCellScheduleComponent extends ColumnComponent {} diff --git a/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-state-button/ix-cell-state-button.component.html b/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-state-button/ix-cell-state-button.component.html index 56a27b3f5a9..98f0edf0ab4 100644 --- a/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-state-button/ix-cell-state-button.component.html +++ b/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-state-button/ix-cell-state-button.component.html @@ -10,7 +10,7 @@ (click)="$event.stopPropagation(); onButtonClick()" > {{ state() }} - @if (warnings?.length > 0) { + @if (warnings.length > 0) {
diff --git a/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-text/ix-cell-text.component.html b/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-text/ix-cell-text.component.html index 8635ae8b5d4..f807f209f9f 100644 --- a/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-text/ix-cell-text.component.html +++ b/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-text/ix-cell-text.component.html @@ -1,4 +1,4 @@ {{ value }} diff --git a/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-toggle/ix-cell-toggle.component.ts b/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-toggle/ix-cell-toggle.component.ts index 03e4e5decec..732d6a90ce7 100644 --- a/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-toggle/ix-cell-toggle.component.ts +++ b/src/app/modules/ix-table/components/ix-table-body/cells/ix-cell-toggle/ix-cell-toggle.component.ts @@ -24,7 +24,7 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; export class IxCellToggleComponent extends ColumnComponent { requiredRoles: Role[]; onRowToggle: (row: T, checked: boolean, toggle: MatSlideToggle) => void; - dynamicRequiredRoles: (row: T) => Observable; + dynamicRequiredRoles?: (row: T) => Observable; get checked(): boolean { return this.value as boolean; diff --git a/src/app/modules/ix-table/components/ix-table-columns-selector/ix-table-columns-selector.component.ts b/src/app/modules/ix-table/components/ix-table-columns-selector/ix-table-columns-selector.component.ts index d2975273915..866f18536c1 100644 --- a/src/app/modules/ix-table/components/ix-table-columns-selector/ix-table-columns-selector.component.ts +++ b/src/app/modules/ix-table/components/ix-table-columns-selector/ix-table-columns-selector.component.ts @@ -30,7 +30,7 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; ], }) export class IxTableColumnsSelectorComponent implements OnChanges { - readonly columns = model>[]>(); + readonly columns = model.required>[]>(); readonly columnsChange = output>[]>(); diff --git a/src/app/modules/ix-table/directives/ix-body-cell.directive.ts b/src/app/modules/ix-table/directives/ix-body-cell.directive.ts index 452ee7496a0..8d0a434d6c3 100644 --- a/src/app/modules/ix-table/directives/ix-body-cell.directive.ts +++ b/src/app/modules/ix-table/directives/ix-body-cell.directive.ts @@ -14,7 +14,7 @@ import { Column, ColumnComponent, ColumnKeys } from 'app/modules/ix-table/interf standalone: true, }) export class IxTableBodyCellDirective implements AfterViewInit, OnChanges { - readonly row = input(); + readonly row = input.required(); readonly column = input.required>>(); private componentRef: ComponentRef>; diff --git a/src/app/modules/ix-tree/nested-tree-datasource.ts b/src/app/modules/ix-tree/nested-tree-datasource.ts index 98634362ed6..838990b9f94 100644 --- a/src/app/modules/ix-tree/nested-tree-datasource.ts +++ b/src/app/modules/ix-tree/nested-tree-datasource.ts @@ -11,7 +11,7 @@ import { */ export class NestedTreeDataSource extends DataSource { filterPredicate: (data: T[], query: string) => T[]; - sortComparer: (a: T, b: T) => number; + sortComparer?: (a: T, b: T) => number; private filterValue: string; private readonly filterChanged$ = new BehaviorSubject(''); private readonly _data = new BehaviorSubject([]); diff --git a/src/app/modules/jobs/components/job-item/job-item.component.html b/src/app/modules/jobs/components/job-item/job-item.component.html index 4edf209eb73..68705bc4526 100644 --- a/src/app/modules/jobs/components/job-item/job-item.component.html +++ b/src/app/modules/jobs/components/job-item/job-item.component.html @@ -1,8 +1,8 @@
diff --git a/src/app/modules/jobs/components/jobs-panel/jobs-panel.component.html b/src/app/modules/jobs/components/jobs-panel/jobs-panel.component.html index 37e53eb4a53..162f098f42b 100644 --- a/src/app/modules/jobs/components/jobs-panel/jobs-panel.component.html +++ b/src/app/modules/jobs/components/jobs-panel/jobs-panel.component.html @@ -37,7 +37,7 @@

{{ 'Running Jobs' | translate }}

} @else { @let jobs = availableJobs$ | async; - @if (jobs.length) { + @if (jobs?.length) {
@for (job of jobs; track job.id) { => createSelector( +export const selectJob = (id: number): MemoizedSelector => createSelector( selectJobs, (jobs) => jobs.find((job) => job.id === id), ); diff --git a/src/app/modules/layout/console-footer/console-footer.component.ts b/src/app/modules/layout/console-footer/console-footer.component.ts index 31e052a9c8c..6e70724b296 100644 --- a/src/app/modules/layout/console-footer/console-footer.component.ts +++ b/src/app/modules/layout/console-footer/console-footer.component.ts @@ -17,7 +17,7 @@ import { ConsolePanelDialogComponent } from 'app/modules/layout/console-footer/c imports: [AsyncPipe], }) export class ConsoleFooterComponent implements OnInit { - private readonly messageContainer: Signal> = viewChild('messageContainer', { read: ElementRef }); + private readonly messageContainer: Signal> = viewChild.required('messageContainer', { read: ElementRef }); lastThreeLogLines$ = this.messagesStore.lastThreeLogLines$; diff --git a/src/app/modules/layout/topbar/change-password-dialog/change-password-dialog.component.ts b/src/app/modules/layout/topbar/change-password-dialog/change-password-dialog.component.ts index 7fad7ec6e40..7b6498d6436 100644 --- a/src/app/modules/layout/topbar/change-password-dialog/change-password-dialog.component.ts +++ b/src/app/modules/layout/topbar/change-password-dialog/change-password-dialog.component.ts @@ -40,7 +40,7 @@ import { ApiService } from 'app/modules/websocket/api.service'; ], }) export class ChangePasswordDialogComponent { - form = this.fb.group({ + form = this.fb.nonNullable.group({ old_password: [''], new_password: ['', [Validators.required]], passwordConfirmation: ['', [Validators.required]], @@ -81,8 +81,8 @@ export class ChangePasswordDialogComponent { onSubmit(): void { this.api.call('user.set_password', [{ - old_password: this.form.value.old_password, - new_password: this.form.value.new_password, + old_password: this.form.getRawValue().old_password, + new_password: this.form.getRawValue().new_password, username: this.loggedInUser.pw_name, }]).pipe( this.loader.withLoader(), diff --git a/src/app/modules/layout/topbar/user-menu/user-menu.component.html b/src/app/modules/layout/topbar/user-menu/user-menu.component.html index 3da97aba57a..100c247e948 100644 --- a/src/app/modules/layout/topbar/user-menu/user-menu.component.html +++ b/src/app/modules/layout/topbar/user-menu/user-menu.component.html @@ -22,7 +22,7 @@ - @if (user?.account_attributes.includes(AccountAttribute.Local)) { + @if (user?.account_attributes?.includes(AccountAttribute.Local)) { @@ -43,7 +43,7 @@

@@ -56,7 +56,7 @@

{{ 'App Version' | translate }}:
@if (!isCustomApp()) { - {{ app()?.metadata?.app_version | appVersion | orNotAvailable }} + {{ app().metadata?.app_version | appVersion | orNotAvailable }} } @else if (app().human_version) { {{ app().human_version?.split(':')?.[1]?.split('_')?.[0] }} @@ -67,7 +67,7 @@

{{ 'Version' | translate }}:
@if (!isCustomApp()) { - {{ app()?.version | appVersion | orNotAvailable }} + {{ app().version | appVersion | orNotAvailable }} }

@@ -75,7 +75,7 @@

{{ 'Source' | translate }}:
- @for (source of app()?.metadata?.sources; track source; let last = $last) { + @for (source of app().metadata?.sources; track source; let last = $last) {
{{ 'Train' | translate }}:
- {{ app()?.metadata?.train | orNotAvailable }} + {{ app().metadata?.train | orNotAvailable }}
@if ((app().portals | keyvalue).length > 0 ) { 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 9ab6cc70236..3a162366709 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 @@ -78,7 +78,7 @@ import { RedirectService } from 'app/services/redirect.service'; ], }) export class AppInfoCardComponent { - readonly app = input(); + readonly app = input.required(); readonly startApp = output(); readonly stopApp = output(); protected readonly isCustomApp = computed(() => this.app()?.metadata?.name === customApp); diff --git a/src/app/pages/apps/components/installed-apps/installed-apps-list/installed-apps-list.component.ts b/src/app/pages/apps/components/installed-apps/installed-apps-list/installed-apps-list.component.ts index 8ee1cdc18e7..8d4077c1cc5 100644 --- a/src/app/pages/apps/components/installed-apps/installed-apps-list/installed-apps-list.component.ts +++ b/src/app/pages/apps/components/installed-apps/installed-apps-list/installed-apps-list.component.ts @@ -339,10 +339,11 @@ export class InstalledAppsListComponent implements OnInit { } openStatusDialog(name: string): void { - if (!this.appJobs.has(name)) { + const jobId = this.appJobs.get(name)?.id; + if (!jobId) { return; } - const job$ = this.store$.select(selectJob(this.appJobs.get(name).id)); + const job$ = this.store$.select(selectJob(jobId)); this.dialogService.jobDialog(job$, { title: name, canMinimize: true }) .afterClosed() .pipe(this.errorHandler.catchError(), untilDestroyed(this)) diff --git a/src/app/pages/apps/components/select-pool-dialog/select-pool-dialog.component.ts b/src/app/pages/apps/components/select-pool-dialog/select-pool-dialog.component.ts index 5d25681cbaf..92f0565aabf 100644 --- a/src/app/pages/apps/components/select-pool-dialog/select-pool-dialog.component.ts +++ b/src/app/pages/apps/components/select-pool-dialog/select-pool-dialog.component.ts @@ -46,7 +46,7 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; export class SelectPoolDialogComponent implements OnInit { readonly requiredRoles = [Role.FullAdmin]; - form = this.formBuilder.group({ + form = this.formBuilder.nonNullable.group({ pool: [''], migrateApplications: [false], }); @@ -72,7 +72,7 @@ export class SelectPoolDialogComponent implements OnInit { } onSubmit(): void { - this.dockerStore.setDockerPool(this.form.value.pool).pipe( + this.dockerStore.setDockerPool(this.form.getRawValue().pool).pipe( untilDestroyed(this), ).subscribe(() => { this.snackbar.success( diff --git a/src/app/pages/audit/audit.component.ts b/src/app/pages/audit/audit.component.ts index d6370387526..47e9294c78d 100644 --- a/src/app/pages/audit/audit.component.ts +++ b/src/app/pages/audit/audit.component.ts @@ -57,7 +57,7 @@ import { selectIsHaLicensed } from 'app/store/ha-info/ha-info.selectors'; export class AuditComponent implements OnInit, OnDestroy { protected dataProvider: AuditApiDataProvider; - protected readonly masterDetailView = viewChild(MasterDetailViewComponent); + protected readonly masterDetailView = viewChild.required(MasterDetailViewComponent); protected readonly controllerTypeControl = new FormControl(ControllerType.Active); protected readonly controllerTypeOptions$ = of(mapToOptions(controllerTypeLabels, this.translate)); protected readonly controllerType = toSignal(this.controllerTypeControl.value$); diff --git a/src/app/pages/audit/components/audit-list/audit-list.component.html b/src/app/pages/audit/components/audit-list/audit-list.component.html index 81daab28cf4..163c553bc86 100644 --- a/src/app/pages/audit/components/audit-list/audit-list.component.html +++ b/src/app/pages/audit/components/audit-list/audit-list.component.html @@ -20,7 +20,7 @@ detailsRowIdentifier="audit_id" [columns]="columns" [dataProvider]="dataProvider()" - [isLoading]="dataProvider().isLoading$ | async" + [isLoading]="!!(dataProvider().isLoading$ | async)" (expanded)="expanded($event)" > (auditServiceLabels.has(row.service) - ? this.translate.instant(auditServiceLabels.get(row.service)) - : row.service || '-'), + getValue: (row) => { + const service = auditServiceLabels.get(row.service); + return service ? this.translate.instant(service) : row.service || '-'; + }, }), textColumn({ title: this.translate.instant('User'), @@ -75,9 +76,10 @@ export class AuditListComponent { textColumn({ title: this.translate.instant('Event'), propertyName: 'event', - getValue: (row) => (auditEventLabels.has(row.event) - ? this.translate.instant(auditEventLabels.get(row.event)) - : row.event || '-'), + getValue: (row) => { + const event = auditEventLabels.get(row.event); + return event ? this.translate.instant(event) : row.event || '-'; + }, }), textColumn({ title: this.translate.instant('Event Data'), @@ -101,7 +103,7 @@ export class AuditListComponent { getUserAvatarForLog(row: AuditEntry): SafeHtml { // eslint-disable-next-line sonarjs/no-angular-bypass-sanitization - return this.sanitizer.bypassSecurityTrustHtml(toSvg(row.username, this.isMobileView ? 15 : 35)); + return this.sanitizer.bypassSecurityTrustHtml(toSvg(row.username, this.isMobileView() ? 15 : 35)); } expanded(row: AuditEntry): void { diff --git a/src/app/pages/audit/components/audit-search/audit-search.component.html b/src/app/pages/audit/components/audit-search/audit-search.component.html index e1c23580e1b..38a883062d5 100644 --- a/src/app/pages/audit/components/audit-search/audit-search.component.html +++ b/src/app/pages/audit/components/audit-search/audit-search.component.html @@ -1,7 +1,7 @@

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > control.parent && this.isManualSetup, + (control) => Boolean(control?.parent) && this.isManualSetup, Validators.required, )], port: [22, this.validatorsService.validateOnCondition( - (control) => control.parent && this.isManualSetup, + (control) => Boolean(control?.parent) && this.isManualSetup, Validators.required, )], remote_host_key: [''], url: ['', this.validatorsService.validateOnCondition( - (control) => control.parent && !this.isManualSetup, + (control) => Boolean(control?.parent) && !this.isManualSetup, Validators.required, )], username: ['root', Validators.required], admin_username: ['root'], password: ['', this.validatorsService.validateOnCondition( - (control) => control.parent && !this.isManualSetup, + (control) => Boolean(control?.parent) && !this.isManualSetup, Validators.required, )], sudo: [false], diff --git a/src/app/pages/credentials/backup-credentials/ssh-keypair-card/ssh-keypair-card.component.html b/src/app/pages/credentials/backup-credentials/ssh-keypair-card/ssh-keypair-card.component.html index 3e317ecf71a..b8b27f1a0e0 100644 --- a/src/app/pages/credentials/backup-credentials/ssh-keypair-card/ssh-keypair-card.component.html +++ b/src/app/pages/credentials/backup-credentials/ssh-keypair-card/ssh-keypair-card.component.html @@ -29,7 +29,7 @@

{{ 'SSH Keypairs' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > { }); loader = TestbedHarnessEnvironment.loader(spectator.fixture); api = spectator.inject(ApiService); - spectator.component.setKeypairForEditing(); }); it('shows current values when form is being edited', async () => { diff --git a/src/app/pages/credentials/backup-credentials/ssh-keypair-form/ssh-keypair-form.component.ts b/src/app/pages/credentials/backup-credentials/ssh-keypair-form/ssh-keypair-form.component.ts index 4ae9e4f46b7..d37545b5fca 100644 --- a/src/app/pages/credentials/backup-credentials/ssh-keypair-form/ssh-keypair-form.component.ts +++ b/src/app/pages/credentials/backup-credentials/ssh-keypair-form/ssh-keypair-form.component.ts @@ -69,7 +69,7 @@ export class SshKeypairFormComponent implements OnInit { isFormLoading = false; - protected editingKeypair: KeychainSshKeyPair; + protected editingKeypair: KeychainSshKeyPair | undefined; form = this.fb.group({ name: ['', Validators.required], @@ -107,16 +107,17 @@ export class SshKeypairFormComponent implements OnInit { } ngOnInit(): void { - if (this.editingKeypair) { - this.setKeypairForEditing(); + const keypair = this.editingKeypair; + if (keypair) { + this.setKeypairForEditing(keypair); } } - setKeypairForEditing(): void { + private setKeypairForEditing(keypair: KeychainSshKeyPair): void { this.form.patchValue({ - name: this.editingKeypair.name, - private_key: this.editingKeypair.attributes.private_key, - public_key: this.editingKeypair.attributes.public_key, + name: keypair.name, + private_key: keypair.attributes.private_key, + public_key: keypair.attributes.public_key, }); } diff --git a/src/app/pages/credentials/certificates-dash/acme-dns-authenticator-list/acme-dns-authenticator-list.component.html b/src/app/pages/credentials/certificates-dash/acme-dns-authenticator-list/acme-dns-authenticator-list.component.html index 9ccf8089b3a..c9f72fe845b 100644 --- a/src/app/pages/credentials/certificates-dash/acme-dns-authenticator-list/acme-dns-authenticator-list.component.html +++ b/src/app/pages/credentials/certificates-dash/acme-dns-authenticator-list/acme-dns-authenticator-list.component.html @@ -29,7 +29,7 @@

{{ 'ACME DNS-Authenticators' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > , + public slideInRef: SlideInRef, ) { this.slideInRef.requireConfirmationWhen(() => { return of(this.form.dirty); @@ -109,7 +109,7 @@ export class CertificateAcmeAddComponent implements OnInit { } onSubmit(): void { - const formValues = this.form.value; + const formValues = this.form.getRawValue(); const dnsMapping = this.domains.reduce((mapping, domain, i) => { return { diff --git a/src/app/pages/credentials/certificates-dash/certificate-authority-add/certificate-authority-add.component.ts b/src/app/pages/credentials/certificates-dash/certificate-authority-add/certificate-authority-add.component.ts index 57da4e21949..4f0ef5acb5d 100644 --- a/src/app/pages/credentials/certificates-dash/certificate-authority-add/certificate-authority-add.component.ts +++ b/src/app/pages/credentials/certificates-dash/certificate-authority-add/certificate-authority-add.component.ts @@ -106,7 +106,7 @@ export class CertificateAuthorityAddComponent implements AfterViewInit { public slideInRef: SlideInRef, ) { this.slideInRef.requireConfirmationWhen(() => { - return of(this.identifierAndType()?.form?.dirty); + return of(Boolean(this.identifierAndType()?.form?.dirty)); }); } diff --git a/src/app/pages/credentials/certificates-dash/certificate-edit/certificate-edit.component.ts b/src/app/pages/credentials/certificates-dash/certificate-edit/certificate-edit.component.ts index a4d93c232f6..f3085442d12 100644 --- a/src/app/pages/credentials/certificates-dash/certificate-edit/certificate-edit.component.ts +++ b/src/app/pages/credentials/certificates-dash/certificate-edit/certificate-edit.component.ts @@ -81,7 +81,7 @@ export class CertificateEditComponent implements OnInit { private cdr: ChangeDetectorRef, private errorHandler: FormErrorHandlerService, private matDialog: MatDialog, - public slideInRef: SlideInRef, + public slideInRef: SlideInRef, ) { this.slideInRef.requireConfirmationWhen(() => { return of(this.form.dirty); diff --git a/src/app/pages/credentials/certificates-dash/certificate-list/certificate-list.component.html b/src/app/pages/credentials/certificates-dash/certificate-list/certificate-list.component.html index 396f14d9af5..9599340e52e 100644 --- a/src/app/pages/credentials/certificates-dash/certificate-list/certificate-list.component.html +++ b/src/app/pages/credentials/certificates-dash/certificate-list/certificate-list.component.html @@ -29,7 +29,7 @@

{{ 'Certificates' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > , ) { this.slideInRef.requireConfirmationWhen(() => { - return of(this.identifierAndType()?.form?.dirty); + return of(Boolean(this.identifierAndType()?.form?.dirty)); }); } diff --git a/src/app/pages/credentials/certificates-dash/forms/acmedns-form/acmedns-form.component.ts b/src/app/pages/credentials/certificates-dash/forms/acmedns-form/acmedns-form.component.ts index 4e30298ea5e..b35e10f0707 100644 --- a/src/app/pages/credentials/certificates-dash/forms/acmedns-form/acmedns-form.component.ts +++ b/src/app/pages/credentials/certificates-dash/forms/acmedns-form/acmedns-form.component.ts @@ -95,7 +95,7 @@ export class AcmednsFormComponent implements OnInit { } authenticatorOptions$: Observable; - private editingAcmedns: DnsAuthenticator; + private editingAcmedns: DnsAuthenticator | undefined; constructor( private translate: TranslateService, diff --git a/src/app/pages/credentials/certificates-dash/forms/certificate-add/certificate-add.component.ts b/src/app/pages/credentials/certificates-dash/forms/certificate-add/certificate-add.component.ts index 5745b1a8fd5..05e66f6410e 100644 --- a/src/app/pages/credentials/certificates-dash/forms/certificate-add/certificate-add.component.ts +++ b/src/app/pages/credentials/certificates-dash/forms/certificate-add/certificate-add.component.ts @@ -99,7 +99,7 @@ export class CertificateAddComponent { public slideInRef: SlideInRef, ) { this.slideInRef.requireConfirmationWhen(() => { - return of(this.identifierAndType()?.form?.dirty); + return of(Boolean(this.identifierAndType()?.form?.dirty)); }); } diff --git a/src/app/pages/credentials/certificates-dash/forms/certificate-add/steps/certificate-identifier-and-type/certificate-identifier-and-type.component.ts b/src/app/pages/credentials/certificates-dash/forms/certificate-add/steps/certificate-identifier-and-type/certificate-identifier-and-type.component.ts index 4529680a528..0a0ab2520e1 100644 --- a/src/app/pages/credentials/certificates-dash/forms/certificate-add/steps/certificate-identifier-and-type/certificate-identifier-and-type.component.ts +++ b/src/app/pages/credentials/certificates-dash/forms/certificate-add/steps/certificate-identifier-and-type/certificate-identifier-and-type.component.ts @@ -99,11 +99,11 @@ export class CertificateIdentifierAndTypeComponent implements OnInit, SummaryPro } getSummary(): SummarySection { - const values = this.form.value; + const values = this.form.getRawValue(); const summary = [ { label: this.translate.instant('Name'), value: values.name }, - { label: this.translate.instant('Type'), value: this.createTypes.get(values.create_type) }, + { label: this.translate.instant('Type'), value: this.createTypes.get(values.create_type) || values.create_type }, ]; if (values.profile) { diff --git a/src/app/pages/credentials/certificates-dash/forms/common-steps/certificate-constraints/certificate-constraints.component.ts b/src/app/pages/credentials/certificates-dash/forms/common-steps/certificate-constraints/certificate-constraints.component.ts index 48d07af45d3..58fe6696d28 100644 --- a/src/app/pages/credentials/certificates-dash/forms/common-steps/certificate-constraints/certificate-constraints.component.ts +++ b/src/app/pages/credentials/certificates-dash/forms/common-steps/certificate-constraints/certificate-constraints.component.ts @@ -60,22 +60,22 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; export class CertificateConstraintsComponent implements OnInit, SummaryProvider { hasAuthorityKeyIdentifier = input(false); - form = this.formBuilder.group({ - BasicConstraints: this.formBuilder.group({ + form = this.formBuilder.nonNullable.group({ + BasicConstraints: this.formBuilder.nonNullable.group({ enabled: [false], - path_length: [null as number], + path_length: [null as number | null], BasicConstraints: [[] as BasicConstraint[]], }), - AuthorityKeyIdentifier: this.formBuilder.group({ + AuthorityKeyIdentifier: this.formBuilder.nonNullable.group({ enabled: [false], AuthorityKeyIdentifier: [[] as AuthorityKeyIdentifier[]], }), - ExtendedKeyUsage: this.formBuilder.group({ + ExtendedKeyUsage: this.formBuilder.nonNullable.group({ enabled: [false], usages: [[] as ExtendedKeyUsageFlag[]], extension_critical: [false], }), - KeyUsage: this.formBuilder.group({ + KeyUsage: this.formBuilder.nonNullable.group({ enabled: [false], KeyUsage: [[] as string[]], }), diff --git a/src/app/pages/credentials/certificates-dash/forms/common-steps/certificate-options/certificate-options.component.ts b/src/app/pages/credentials/certificates-dash/forms/common-steps/certificate-options/certificate-options.component.ts index de6d25c593c..125e7ba803c 100644 --- a/src/app/pages/credentials/certificates-dash/forms/common-steps/certificate-options/certificate-options.component.ts +++ b/src/app/pages/credentials/certificates-dash/forms/common-steps/certificate-options/certificate-options.component.ts @@ -102,7 +102,10 @@ export class CertificateOptionsComponent implements OnInit, OnChanges, SummaryPr } summary.push( - { label: this.translate.instant('Key Type'), value: certificateKeyTypeLabels.get(values.key_type) }, + { + label: this.translate.instant('Key Type'), + value: certificateKeyTypeLabels.get(values.key_type) || values.key_type, + }, this.isRsa ? { label: this.translate.instant('Key Length'), value: String(values.key_length) } : { label: this.translate.instant('EC Curve'), value: String(values.ec_curve) }, diff --git a/src/app/pages/credentials/groups/group-form/group-form.component.ts b/src/app/pages/credentials/groups/group-form/group-form.component.ts index 64b5570c7c9..8cd22feae8d 100644 --- a/src/app/pages/credentials/groups/group-form/group-form.component.ts +++ b/src/app/pages/credentials/groups/group-form/group-form.component.ts @@ -72,10 +72,10 @@ export class GroupFormComponent implements OnInit { privilegesList: Privilege[]; initialGroupRelatedPrivilegesList: Privilege[] = []; - protected editingGroup: Group; + protected editingGroup: Group | undefined; form = this.fb.group({ - gid: [null as number, [Validators.required, Validators.pattern(/^\d+$/)]], + gid: [null as number | null, [Validators.required, Validators.pattern(/^\d+$/)]], name: ['', [Validators.required, Validators.pattern(UserService.namePattern)]], sudo_commands: [[] as string[]], sudo_commands_all: [false], diff --git a/src/app/pages/credentials/groups/group-list/group-list.component.html b/src/app/pages/credentials/groups/group-list/group-list.component.html index a953c1206d7..d6ded045136 100644 --- a/src/app/pages/credentials/groups/group-list/group-list.component.html +++ b/src/app/pages/credentials/groups/group-list/group-list.component.html @@ -45,7 +45,7 @@ ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="isLoading$ | async" + [isLoading]="!!(isLoading$ | async)" > ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-list/cloud-backup-list.component.html b/src/app/pages/data-protection/cloud-backup/cloud-backup-list/cloud-backup-list.component.html index f8bfc3fc2c2..08626f51e0a 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-list/cloud-backup-list.component.html +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-list/cloud-backup-list.component.html @@ -32,7 +32,7 @@ ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" (expanded)="expanded($event)" > diff --git a/src/app/pages/data-protection/cloudsync/cloudsync-form/cloudsync-form.component.ts b/src/app/pages/data-protection/cloudsync/cloudsync-form/cloudsync-form.component.ts index 844b0a3344c..79eb1e65b4e 100644 --- a/src/app/pages/data-protection/cloudsync/cloudsync-form/cloudsync-form.component.ts +++ b/src/app/pages/data-protection/cloudsync/cloudsync-form/cloudsync-form.component.ts @@ -213,7 +213,7 @@ export class CloudSyncFormComponent implements OnInit { fileNodeProvider: TreeNodeProvider; bucketNodeProvider: TreeNodeProvider; - private editingTask: CloudSyncTaskUi; + private editingTask: CloudSyncTaskUi | null; constructor( private translate: TranslateService, diff --git a/src/app/pages/data-protection/cloudsync/cloudsync-task-card/cloudsync-task-card.component.html b/src/app/pages/data-protection/cloudsync/cloudsync-task-card/cloudsync-task-card.component.html index 57636b8c04a..70084cf1da4 100644 --- a/src/app/pages/data-protection/cloudsync/cloudsync-task-card/cloudsync-task-card.component.html +++ b/src/app/pages/data-protection/cloudsync/cloudsync-task-card/cloudsync-task-card.component.html @@ -33,7 +33,7 @@

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/data-protection/replication/replication-form/replication-form.component.ts b/src/app/pages/data-protection/replication/replication-form/replication-form.component.ts index f7becd2548b..f42b73c8e93 100644 --- a/src/app/pages/data-protection/replication/replication-form/replication-form.component.ts +++ b/src/app/pages/data-protection/replication/replication-form/replication-form.component.ts @@ -92,7 +92,7 @@ export class ReplicationFormComponent implements OnInit { readonly requiredRoles = [Role.ReplicationTaskWrite, Role.ReplicationTaskWritePull]; - protected existingReplication: ReplicationTask; + protected existingReplication: ReplicationTask | undefined; constructor( private api: ApiService, diff --git a/src/app/pages/data-protection/replication/replication-list/replication-list.component.html b/src/app/pages/data-protection/replication/replication-list/replication-list.component.html index 56eed5ab256..7d47be99e52 100644 --- a/src/app/pages/data-protection/replication/replication-list/replication-list.component.html +++ b/src/app/pages/data-protection/replication/replication-list/replication-list.component.html @@ -30,7 +30,7 @@ ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/data-protection/replication/replication-task-card/replication-task-card.component.html b/src/app/pages/data-protection/replication/replication-task-card/replication-task-card.component.html index 2ab8c2084cd..ca339fbd9b5 100644 --- a/src/app/pages/data-protection/replication/replication-task-card/replication-task-card.component.html +++ b/src/app/pages/data-protection/replication/replication-task-card/replication-task-card.component.html @@ -33,7 +33,7 @@

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/data-protection/rsync-task/rsync-task-card/rsync-task-card.component.html b/src/app/pages/data-protection/rsync-task/rsync-task-card/rsync-task-card.component.html index dcb1c347aa1..a39c86916fe 100644 --- a/src/app/pages/data-protection/rsync-task/rsync-task-card/rsync-task-card.component.html +++ b/src/app/pages/data-protection/rsync-task/rsync-task-card/rsync-task-card.component.html @@ -33,7 +33,7 @@

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/data-protection/rsync-task/rsync-task-list/rsync-task-list.component.html b/src/app/pages/data-protection/rsync-task/rsync-task-list/rsync-task-list.component.html index b9b4b67bb18..d9c353f700e 100644 --- a/src/app/pages/data-protection/rsync-task/rsync-task-list/rsync-task-list.component.html +++ b/src/app/pages/data-protection/rsync-task/rsync-task-list/rsync-task-list.component.html @@ -29,7 +29,7 @@ ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/data-protection/scrub-task/scrub-list/scrub-list.component.html b/src/app/pages/data-protection/scrub-task/scrub-list/scrub-list.component.html index e54712df1b1..2dcc9ced4fc 100644 --- a/src/app/pages/data-protection/scrub-task/scrub-list/scrub-list.component.html +++ b/src/app/pages/data-protection/scrub-task/scrub-list/scrub-list.component.html @@ -28,7 +28,7 @@ ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/data-protection/scrub-task/scrub-task-card/scrub-task-card.component.html b/src/app/pages/data-protection/scrub-task/scrub-task-card/scrub-task-card.component.html index 6fbd6d48c11..9ba5ef22e28 100644 --- a/src/app/pages/data-protection/scrub-task/scrub-task-card/scrub-task-card.component.html +++ b/src/app/pages/data-protection/scrub-task/scrub-task-card/scrub-task-card.component.html @@ -43,7 +43,7 @@

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/data-protection/smart-task/smart-task-card/smart-task-card.component.html b/src/app/pages/data-protection/smart-task/smart-task-card/smart-task-card.component.html index e5860853af2..44620e5b4b3 100644 --- a/src/app/pages/data-protection/smart-task/smart-task-card/smart-task-card.component.html +++ b/src/app/pages/data-protection/smart-task/smart-task-card/smart-task-card.component.html @@ -31,7 +31,7 @@

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/data-protection/smart-task/smart-task-list/smart-task-list.component.html b/src/app/pages/data-protection/smart-task/smart-task-list/smart-task-list.component.html index 592a75babb2..bea5bbcacb6 100644 --- a/src/app/pages/data-protection/smart-task/smart-task-list/smart-task-list.component.html +++ b/src/app/pages/data-protection/smart-task/smart-task-list/smart-task-list.component.html @@ -30,7 +30,7 @@ ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/data-protection/snapshot-task/snapshot-task-card/snapshot-task-card.component.html b/src/app/pages/data-protection/snapshot-task/snapshot-task-card/snapshot-task-card.component.html index c3b19663e54..1b552ac767a 100644 --- a/src/app/pages/data-protection/snapshot-task/snapshot-task-card/snapshot-task-card.component.html +++ b/src/app/pages/data-protection/snapshot-task/snapshot-task-card/snapshot-task-card.component.html @@ -33,7 +33,7 @@

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/data-protection/snapshot-task/snapshot-task-list/snapshot-task-list.component.html b/src/app/pages/data-protection/snapshot-task/snapshot-task-list/snapshot-task-list.component.html index 9cb1e72c18a..5180a47c764 100644 --- a/src/app/pages/data-protection/snapshot-task/snapshot-task-list/snapshot-task-list.component.html +++ b/src/app/pages/data-protection/snapshot-task/snapshot-task-list/snapshot-task-list.component.html @@ -35,7 +35,7 @@ ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/data-protection/vmware-snapshot/vmware-snapshot-list/vmware-snapshot-list.component.html b/src/app/pages/data-protection/vmware-snapshot/vmware-snapshot-list/vmware-snapshot-list.component.html index 164c2215798..3d2cea6e09a 100644 --- a/src/app/pages/data-protection/vmware-snapshot/vmware-snapshot-list/vmware-snapshot-list.component.html +++ b/src/app/pages/data-protection/vmware-snapshot/vmware-snapshot-list/vmware-snapshot-list.component.html @@ -20,7 +20,7 @@ ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > (); - readonly form = this.formBuilder.group({ - refquota: [null as number, this.validators.withMessage( + readonly form = this.formBuilder.nonNullable.group({ + refquota: [null as number | null, this.validators.withMessage( Validators.min(GiB), this.translate.instant(helptextDatasetForm.dataset_form_quota_too_small), )], @@ -46,8 +46,8 @@ export class QuotasSectionComponent implements OnInit { refquota_warning_inherit: [true], refquota_critical: [critical, [Validators.min(0), Validators.max(100)]], refquota_critical_inherit: [true], - refreservation: [null as number], - quota: [null as number, this.validators.withMessage( + refreservation: [null as number | null], + quota: [null as number | null, this.validators.withMessage( Validators.min(GiB), this.translate.instant(helptextDatasetForm.dataset_form_quota_too_small), )], @@ -55,7 +55,7 @@ export class QuotasSectionComponent implements OnInit { quota_warning_inherit: [true], quota_critical: [critical, [Validators.min(0), Validators.max(100)]], quota_critical_inherit: [true], - reservation: [null as number], + reservation: [null as number | null], }); readonly helptext = helptextDatasetForm; diff --git a/src/app/pages/datasets/components/dataset-form/utils/zfs-property.utils.ts b/src/app/pages/datasets/components/dataset-form/utils/zfs-property.utils.ts index cce4d0948e1..e7b50772e80 100644 --- a/src/app/pages/datasets/components/dataset-form/utils/zfs-property.utils.ts +++ b/src/app/pages/datasets/components/dataset-form/utils/zfs-property.utils.ts @@ -3,7 +3,7 @@ import { ZfsPropertySource } from 'app/enums/zfs-property-source.enum'; import { Dataset } from 'app/interfaces/dataset.interface'; import { ZfsProperty } from 'app/interfaces/zfs-property.interface'; -export function getFieldValue(property: ZfsProperty, parent?: Dataset): T | typeof inherit { +export function getFieldValue(property: ZfsProperty, parent?: Dataset): T | typeof inherit | undefined { if (parent) { return valueOrInherit(property); } @@ -11,7 +11,7 @@ export function getFieldValue(property: ZfsProperty, parent?: Dataset): T return property.value; } -export function valueOrInherit(property: ZfsProperty): T | typeof inherit { +export function valueOrInherit(property: ZfsProperty): T | typeof inherit | undefined { if (!property) { return undefined; } diff --git a/src/app/pages/datasets/components/zvol-form/zvol-form.component.ts b/src/app/pages/datasets/components/zvol-form/zvol-form.component.ts index 3cefc1a876e..cb3c1a13517 100644 --- a/src/app/pages/datasets/components/zvol-form/zvol-form.component.ts +++ b/src/app/pages/datasets/components/zvol-form/zvol-form.component.ts @@ -112,7 +112,7 @@ export class ZvolFormComponent implements OnInit { isLoading = false; inheritEncryptPlaceholder: string = helptextZvol.dataset_form_encryption.inherit_checkbox_placeholder; namesInUse: string[] = []; - volBlockSizeWarning: string; + volBlockSizeWarning: string | null; protected slideInData: { isNew: boolean; parentId: string } | null = null; protected encryptedParent = false; diff --git a/src/app/pages/datasets/modules/snapshots/snapshot-list/snapshot-list.component.html b/src/app/pages/datasets/modules/snapshots/snapshot-list/snapshot-list.component.html index f167bc64c09..30fa6d0c01b 100644 --- a/src/app/pages/datasets/modules/snapshots/snapshot-list/snapshot-list.component.html +++ b/src/app/pages/datasets/modules/snapshots/snapshot-list/snapshot-list.component.html @@ -64,7 +64,7 @@ detailsRowIdentifier="name" [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="isLoading$ | async" + [isLoading]="!!(isLoading$ | async)" > diff --git a/src/app/pages/directory-service/components/idmap-list/idmap-list.component.html b/src/app/pages/directory-service/components/idmap-list/idmap-list.component.html index 9118dad0075..067bc5632b2 100644 --- a/src/app/pages/directory-service/components/idmap-list/idmap-list.component.html +++ b/src/app/pages/directory-service/components/idmap-list/idmap-list.component.html @@ -46,7 +46,7 @@

{{ 'Idmap' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-list/kerberos-keytabs-list.component.html b/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-list/kerberos-keytabs-list.component.html index 1d44d8e2bae..534ca75b19f 100644 --- a/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-list/kerberos-keytabs-list.component.html +++ b/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-list/kerberos-keytabs-list.component.html @@ -46,7 +46,7 @@

{{ 'Kerberos Keytab' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/directory-service/components/kerberos-realms/kerberos-realms-list.component.html b/src/app/pages/directory-service/components/kerberos-realms/kerberos-realms-list.component.html index 3a5cd89f283..d6e57142f11 100644 --- a/src/app/pages/directory-service/components/kerberos-realms/kerberos-realms-list.component.html +++ b/src/app/pages/directory-service/components/kerberos-realms/kerberos-realms-list.component.html @@ -46,7 +46,7 @@

{{ 'Kerberos Realms' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/network/components/ipmi-card/ipmi-card.component.html b/src/app/pages/network/components/ipmi-card/ipmi-card.component.html index b5216abc9c4..2d558095350 100644 --- a/src/app/pages/network/components/ipmi-card/ipmi-card.component.html +++ b/src/app/pages/network/components/ipmi-card/ipmi-card.component.html @@ -20,7 +20,7 @@

IPMI

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/network/components/static-routes-card/static-routes-card.component.html b/src/app/pages/network/components/static-routes-card/static-routes-card.component.html index a677c84717d..0ea10bc3aec 100644 --- a/src/app/pages/network/components/static-routes-card/static-routes-card.component.html +++ b/src/app/pages/network/components/static-routes-card/static-routes-card.component.html @@ -29,7 +29,7 @@

{{ 'Static Routes' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > {{ 'Reporting Exporters' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="isLoading$ | async" + [isLoading]="!!(isLoading$ | async)" > >(null); - fetchReport$ = new BehaviorSubject(null); + fetchReport$ = new BehaviorSubject(null); autoRefreshTimer: Subscription; autoRefreshEnabled: boolean; isReady = false; @@ -105,11 +105,11 @@ export class ReportComponent implements OnInit, OnChanges { stepBackDisabled = false; timezone: string; lastEndDateForCurrentZoomLevel = { - '60m': null as number, - '24h': null as number, - '7d': null as number, - '1M': null as number, - '6M': null as number, + '60m': null as number | null, + '24h': null as number | null, + '7d': null as number | null, + '1M': null as number | null, + '6M': null as number | null, }; currentStartDate: number; diff --git a/src/app/pages/sharing/components/shares-dashboard/iscsi-card/iscsi-card.component.html b/src/app/pages/sharing/components/shares-dashboard/iscsi-card/iscsi-card.component.html index 8c9da5877c0..405e69bed05 100644 --- a/src/app/pages/sharing/components/shares-dashboard/iscsi-card/iscsi-card.component.html +++ b/src/app/pages/sharing/components/shares-dashboard/iscsi-card/iscsi-card.component.html @@ -46,7 +46,7 @@

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/sharing/components/shares-dashboard/nfs-card/nfs-card.component.html b/src/app/pages/sharing/components/shares-dashboard/nfs-card/nfs-card.component.html index 9795c174d89..db4c53e705d 100644 --- a/src/app/pages/sharing/components/shares-dashboard/nfs-card/nfs-card.component.html +++ b/src/app/pages/sharing/components/shares-dashboard/nfs-card/nfs-card.component.html @@ -46,7 +46,7 @@

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/sharing/components/shares-dashboard/smb-card/smb-card.component.html b/src/app/pages/sharing/components/shares-dashboard/smb-card/smb-card.component.html index 34dae68ec41..146d40576d9 100644 --- a/src/app/pages/sharing/components/shares-dashboard/smb-card/smb-card.component.html +++ b/src/app/pages/sharing/components/shares-dashboard/smb-card/smb-card.component.html @@ -46,7 +46,7 @@

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.component.html b/src/app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.component.html index 28ff91105b2..d57ba136efb 100644 --- a/src/app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.component.html +++ b/src/app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.component.html @@ -1,5 +1,5 @@ - +

{{ 'Authorized Access' | translate }}

@@ -26,7 +26,7 @@

{{ 'Authorized Access' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/sharing/iscsi/extent/extent-list/extent-list.component.html b/src/app/pages/sharing/iscsi/extent/extent-list/extent-list.component.html index 4935b00d771..52bce92efbc 100644 --- a/src/app/pages/sharing/iscsi/extent/extent-list/extent-list.component.html +++ b/src/app/pages/sharing/iscsi/extent/extent-list/extent-list.component.html @@ -1,5 +1,5 @@ - +

{{ 'Extents' | translate }}

@@ -27,7 +27,7 @@

{{ 'Extents' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/sharing/iscsi/global-target-configuration/global-target-configuration.component.ts b/src/app/pages/sharing/iscsi/global-target-configuration/global-target-configuration.component.ts index fdbd9bfb17e..6b973796127 100644 --- a/src/app/pages/sharing/iscsi/global-target-configuration/global-target-configuration.component.ts +++ b/src/app/pages/sharing/iscsi/global-target-configuration/global-target-configuration.component.ts @@ -58,7 +58,7 @@ export class GlobalTargetConfigurationComponent implements OnInit { protected isLoading = signal(false); isHaSystem = false; - form = this.fb.group({ + form = this.fb.nonNullable.group({ basename: ['', Validators.required], isns_servers: [[] as string[]], pool_avail_threshold: [null as number | null], @@ -139,7 +139,7 @@ export class GlobalTargetConfigurationComponent implements OnInit { } if (isHa && !this.form.controls.alua) { - this.form.addControl('alua', new FormControl(false)); + this.form.addControl('alua', new FormControl(false, { nonNullable: true })); } this.cdr.markForCheck(); diff --git a/src/app/pages/sharing/iscsi/initiator/initiator-form/initiator-form.component.ts b/src/app/pages/sharing/iscsi/initiator/initiator-form/initiator-form.component.ts index a4a8208e131..b2c741c78a9 100644 --- a/src/app/pages/sharing/iscsi/initiator/initiator-form/initiator-form.component.ts +++ b/src/app/pages/sharing/iscsi/initiator/initiator-form/initiator-form.component.ts @@ -61,7 +61,7 @@ export class InitiatorFormComponent implements OnInit { isFormLoading = false; pk: number; - form = this.fb.group({ + form = this.fb.nonNullable.group({ all: [false], comment: [''], new_initiator: [''], @@ -79,7 +79,7 @@ export class InitiatorFormComponent implements OnInit { }); get isAllowAll(): boolean { - return this.form.value.all; + return this.form.getRawValue().all; } readonly helptext = helptextSharingIscsi; @@ -119,7 +119,7 @@ export class InitiatorFormComponent implements OnInit { onSubmit(): void { const payload = { - comment: this.form.value.comment, + comment: this.form.getRawValue().comment, initiators: this.isAllowAll ? [] : this.selectedInitiators().map((item) => item.id), }; diff --git a/src/app/pages/sharing/iscsi/initiator/initiator-list/initiator-list.component.html b/src/app/pages/sharing/iscsi/initiator/initiator-list/initiator-list.component.html index adf54387d12..628e96f8176 100644 --- a/src/app/pages/sharing/iscsi/initiator/initiator-list/initiator-list.component.html +++ b/src/app/pages/sharing/iscsi/initiator/initiator-list/initiator-list.component.html @@ -1,5 +1,5 @@ - +

{{ 'Initiators Groups' | translate }}

@@ -26,7 +26,7 @@

{{ 'Initiators Groups' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/sharing/iscsi/iscsi-wizard/iscsi-wizard.component.ts b/src/app/pages/sharing/iscsi/iscsi-wizard/iscsi-wizard.component.ts index c331b7b442e..39112d91f0a 100644 --- a/src/app/pages/sharing/iscsi/iscsi-wizard/iscsi-wizard.component.ts +++ b/src/app/pages/sharing/iscsi/iscsi-wizard/iscsi-wizard.component.ts @@ -94,12 +94,12 @@ export class IscsiWizardComponent implements OnInit { toStop = false; namesInUse: string[] = []; - createdZvol: Dataset; - createdExtent: IscsiExtent; - createdPortal: IscsiPortal; - createdInitiator: IscsiInitiatorGroup; - createdTarget: IscsiTarget; - createdTargetExtent: IscsiTargetExtent; + createdZvol: Dataset | undefined; + createdExtent: IscsiExtent | undefined; + createdPortal: IscsiPortal | undefined; + createdInitiator: IscsiInitiatorGroup | undefined; + createdTarget: IscsiTarget | undefined; + createdTargetExtent: IscsiTargetExtent | undefined; form = this.fb.group({ target: this.fb.group({ @@ -115,18 +115,18 @@ export class IscsiWizardComponent implements OnInit { type: [IscsiExtentType.Disk, [Validators.required]], path: [mntPath, [Validators.required]], filesize: [0, [Validators.required]], - disk: [null as string, [Validators.required]], + disk: [null as string | null, [Validators.required]], dataset: ['', [Validators.required]], - volsize: [null as number, [Validators.required]], + volsize: [null as number | null, [Validators.required]], usefor: [IscsiExtentUsefor.Vmware, [Validators.required]], }), options: this.fb.group({ - portal: [null as typeof newOption | number, [Validators.required]], + portal: [null as typeof newOption | number | null, [Validators.required]], listen: this.fb.array([]), initiators: [[] as string[]], fcport: this.fb.group({ port: [nullOption as string, [Validators.required]], - host_id: [null as number, [Validators.required]], + host_id: [null as number | null, [Validators.required]], }), }), }, { @@ -220,7 +220,7 @@ export class IscsiWizardComponent implements OnInit { } get targetPayload(): IscsiTargetUpdate { - const value = this.form.value; + const value = this.form.getRawValue(); return { name: value.extent.name, diff --git a/src/app/pages/sharing/iscsi/portal/portal-list/portal-list.component.html b/src/app/pages/sharing/iscsi/portal/portal-list/portal-list.component.html index 0baf67ca55f..4680c6db5a3 100644 --- a/src/app/pages/sharing/iscsi/portal/portal-list/portal-list.component.html +++ b/src/app/pages/sharing/iscsi/portal/portal-list/portal-list.component.html @@ -1,5 +1,5 @@ - +

{{ 'Portals' | translate }}

@@ -26,7 +26,7 @@

{{ 'Portals' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/sharing/iscsi/target/all-targets/target-list/target-list.component.html b/src/app/pages/sharing/iscsi/target/all-targets/target-list/target-list.component.html index ecc3dd20261..92e79601e4a 100644 --- a/src/app/pages/sharing/iscsi/target/all-targets/target-list/target-list.component.html +++ b/src/app/pages/sharing/iscsi/target/all-targets/target-list/target-list.component.html @@ -1,5 +1,5 @@ - +

{{ 'Targets' | translate }}

@@ -25,7 +25,7 @@

{{ 'Targets' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider()" - [isLoading]="dataProvider().isLoading$ | async" + [isLoading]="!!(dataProvider().isLoading$ | async)" (expanded)="expanded($event)" > diff --git a/src/app/pages/sharing/iscsi/target/target-form/target-form.component.ts b/src/app/pages/sharing/iscsi/target/target-form/target-form.component.ts index 7ceb2a313a9..974914f4bd0 100644 --- a/src/app/pages/sharing/iscsi/target/target-form/target-form.component.ts +++ b/src/app/pages/sharing/iscsi/target/target-form/target-form.component.ts @@ -146,7 +146,7 @@ export class TargetFormComponent implements OnInit { fcForm = this.formBuilder.group({ port: [nullOption as string, [Validators.required]], - host_id: [null as number, [Validators.required]], + host_id: [null as number | null, [Validators.required]], }); constructor( @@ -187,7 +187,7 @@ export class TargetFormComponent implements OnInit { } onSubmit(): void { - const values = this.form.value; + const values = this.form.getRawValue(); this.isLoading = true; this.cdr.markForCheck(); diff --git a/src/app/pages/sharing/nfs/nfs-list/nfs-list.component.html b/src/app/pages/sharing/nfs/nfs-list/nfs-list.component.html index 2185e090606..2edd6cb7c18 100644 --- a/src/app/pages/sharing/nfs/nfs-list/nfs-list.component.html +++ b/src/app/pages/sharing/nfs/nfs-list/nfs-list.component.html @@ -1,5 +1,5 @@ - +

{{ 'NFS' | translate }}

@@ -37,7 +37,7 @@

{{ 'NFS' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/sharing/nfs/nfs-session-list/nfs-session-list.component.html b/src/app/pages/sharing/nfs/nfs-session-list/nfs-session-list.component.html index 41147050513..5dae8a639e6 100644 --- a/src/app/pages/sharing/nfs/nfs-session-list/nfs-session-list.component.html +++ b/src/app/pages/sharing/nfs/nfs-session-list/nfs-session-list.component.html @@ -61,7 +61,7 @@ ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/sharing/smb/smb-acl/smb-acl.component.ts b/src/app/pages/sharing/smb/smb-acl/smb-acl.component.ts index e042bccc2d4..dcb6670eaf6 100644 --- a/src/app/pages/sharing/smb/smb-acl/smb-acl.component.ts +++ b/src/app/pages/sharing/smb/smb-acl/smb-acl.component.ts @@ -127,7 +127,7 @@ export class SmbAclComponent implements OnInit { private errorHandler: FormErrorHandlerService, private translate: TranslateService, private userService: UserService, - public slideInRef: SlideInRef, + public slideInRef: SlideInRef, ) { this.shareName = slideInRef.getData(); } @@ -150,8 +150,8 @@ export class SmbAclComponent implements OnInit { both: [null as never], user: [null as never], group: [null as never], - ae_perm: [null as SmbSharesecPermission], - ae_type: [null as SmbSharesecType], + ae_perm: [null as SmbSharesecPermission | null], + ae_type: [null as SmbSharesecType | null], }), ); } diff --git a/src/app/pages/sharing/smb/smb-form/smb-form.component.ts b/src/app/pages/sharing/smb/smb-form/smb-form.component.ts index 68826fb5517..9b7222623c4 100644 --- a/src/app/pages/sharing/smb/smb-form/smb-form.component.ts +++ b/src/app/pages/sharing/smb/smb-form/smb-form.component.ts @@ -5,7 +5,9 @@ import { Component, OnInit, } from '@angular/core'; -import { Validators, FormBuilder, ReactiveFormsModule } from '@angular/forms'; +import { + Validators, ReactiveFormsModule, NonNullableFormBuilder, +} from '@angular/forms'; import { MatButton } from '@angular/material/button'; import { MatCard, MatCardContent } from '@angular/material/card'; import { MatDialog } from '@angular/material/dialog'; @@ -88,8 +90,8 @@ import { selectService } from 'app/store/services/services.selectors'; ], }) export class SmbFormComponent implements OnInit, AfterViewInit { - private existingSmbShare: SmbShare | null; - defaultSmbShare: SmbShare; + private existingSmbShare: SmbShare | undefined; + defaultSmbShare: SmbShare | undefined; isLoading = false; isAdvancedMode = false; @@ -193,7 +195,7 @@ export class SmbFormComponent implements OnInit, AfterViewInit { form = this.formBuilder.group({ path: ['', Validators.required], name: ['', Validators.required], - purpose: [null as SmbPresetType], + purpose: [null as SmbPresetType | null], comment: [''], enabled: [true], acl: [false], @@ -205,7 +207,7 @@ export class SmbFormComponent implements OnInit, AfterViewInit { hostsdeny: [[] as string[]], home: [false], timemachine: [false], - timemachine_quota: [null as number], + timemachine_quota: [null as number | null], afp: [false], shadowcopy: [false], recyclebin: [false], @@ -225,7 +227,7 @@ export class SmbFormComponent implements OnInit, AfterViewInit { constructor( public formatter: IxFormatterService, private cdr: ChangeDetectorRef, - private formBuilder: FormBuilder, + private formBuilder: NonNullableFormBuilder, private api: ApiService, private matDialog: MatDialog, private dialogService: DialogService, @@ -375,9 +377,9 @@ export class SmbFormComponent implements OnInit, AfterViewInit { /** * @returns Observable to allow setting warnings for values changes once default or previous preset is applied */ - setupAndApplyPurposePresets(): Observable { + setupAndApplyPurposePresets(): Observable { return this.api.call('sharing.smb.presets').pipe( - switchMap((presets) => { + tap((presets) => { const nonClusterPresets = Object.entries(presets).reduce( (acc, [presetName, preset]) => { if (!preset.cluster) { @@ -399,7 +401,6 @@ export class SmbFormComponent implements OnInit, AfterViewInit { : this.existingSmbShare?.purpose, ); this.cdr.markForCheck(); - return of(null); }), ); } diff --git a/src/app/pages/sharing/smb/smb-list/smb-list.component.html b/src/app/pages/sharing/smb/smb-list/smb-list.component.html index b1f7ea46a65..545bf7b2022 100644 --- a/src/app/pages/sharing/smb/smb-list/smb-list.component.html +++ b/src/app/pages/sharing/smb/smb-list/smb-list.component.html @@ -1,5 +1,5 @@ - +

{{ 'SMB' | translate }}

{{ 'SMB' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/sharing/smb/smb-status/components/smb-lock-list/smb-lock-list.component.html b/src/app/pages/sharing/smb/smb-status/components/smb-lock-list/smb-lock-list.component.html index d6a42abeef8..9a5b491bd60 100644 --- a/src/app/pages/sharing/smb/smb-status/components/smb-lock-list/smb-lock-list.component.html +++ b/src/app/pages/sharing/smb/smb-status/components/smb-lock-list/smb-lock-list.component.html @@ -28,7 +28,7 @@

{{ 'Locks' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/sharing/smb/smb-status/components/smb-notification-list/smb-notification-list.component.html b/src/app/pages/sharing/smb/smb-status/components/smb-notification-list/smb-notification-list.component.html index 7737ed1caa6..c5a158b3c31 100644 --- a/src/app/pages/sharing/smb/smb-status/components/smb-notification-list/smb-notification-list.component.html +++ b/src/app/pages/sharing/smb/smb-status/components/smb-notification-list/smb-notification-list.component.html @@ -27,7 +27,7 @@

{{ 'Notifications' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/sharing/smb/smb-status/components/smb-open-files/smb-open-files.component.html b/src/app/pages/sharing/smb/smb-status/components/smb-open-files/smb-open-files.component.html index bf7f5654ef4..8612c1049a2 100644 --- a/src/app/pages/sharing/smb/smb-status/components/smb-open-files/smb-open-files.component.html +++ b/src/app/pages/sharing/smb/smb-status/components/smb-open-files/smb-open-files.component.html @@ -17,7 +17,7 @@

{{ 'Open Files' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/sharing/smb/smb-status/components/smb-session-list/smb-session-list.component.html b/src/app/pages/sharing/smb/smb-status/components/smb-session-list/smb-session-list.component.html index fee4238ec34..fa03881b19a 100644 --- a/src/app/pages/sharing/smb/smb-status/components/smb-session-list/smb-session-list.component.html +++ b/src/app/pages/sharing/smb/smb-status/components/smb-session-list/smb-session-list.component.html @@ -27,7 +27,7 @@

{{ 'Sessions' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/sharing/smb/smb-status/components/smb-share-list/smb-share-list.component.html b/src/app/pages/sharing/smb/smb-status/components/smb-share-list/smb-share-list.component.html index d41bd1df503..cdcc1576186 100644 --- a/src/app/pages/sharing/smb/smb-status/components/smb-share-list/smb-share-list.component.html +++ b/src/app/pages/sharing/smb/smb-status/components/smb-share-list/smb-share-list.component.html @@ -27,7 +27,7 @@

{{ 'Shares' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/storage/modules/disks/components/disk-list/disk-list.component.html b/src/app/pages/storage/modules/disks/components/disk-list/disk-list.component.html index 35bc86672e0..739387fbec5 100644 --- a/src/app/pages/storage/modules/disks/components/disk-list/disk-list.component.html +++ b/src/app/pages/storage/modules/disks/components/disk-list/disk-list.component.html @@ -1,4 +1,4 @@ - + @@ -49,7 +49,7 @@ detailsRowIdentifier="identifier" [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/storage/modules/disks/components/smart-test-result-list/smart-test-result-list.component.html b/src/app/pages/storage/modules/disks/components/smart-test-result-list/smart-test-result-list.component.html index 4bc78c20bac..3dc9b019915 100644 --- a/src/app/pages/storage/modules/disks/components/smart-test-result-list/smart-test-result-list.component.html +++ b/src/app/pages/storage/modules/disks/components/smart-test-result-list/smart-test-result-list.component.html @@ -17,7 +17,7 @@ ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > 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 1cb3da1cdd0..a6cce1f6ad6 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 @@ -31,7 +31,7 @@

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/system/advanced/init-shutdown/init-shutdown-card/init-shutdown-card.component.html b/src/app/pages/system/advanced/init-shutdown/init-shutdown-card/init-shutdown-card.component.html index 4dacf991631..436588ab5a2 100644 --- a/src/app/pages/system/advanced/init-shutdown/init-shutdown-card/init-shutdown-card.component.html +++ b/src/app/pages/system/advanced/init-shutdown/init-shutdown-card/init-shutdown-card.component.html @@ -31,7 +31,7 @@

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/system/advanced/sysctl/sysctl-card/sysctl-card.component.html b/src/app/pages/system/advanced/sysctl/sysctl-card/sysctl-card.component.html index 62b8790ef94..1f236e8ecf5 100644 --- a/src/app/pages/system/advanced/sysctl/sysctl-card/sysctl-card.component.html +++ b/src/app/pages/system/advanced/sysctl/sysctl-card/sysctl-card.component.html @@ -33,7 +33,7 @@

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/system/advanced/sysctl/tunable-list/tunable-list.component.html b/src/app/pages/system/advanced/sysctl/tunable-list/tunable-list.component.html index b1b6f246e91..2c9c79d01f8 100644 --- a/src/app/pages/system/advanced/sysctl/tunable-list/tunable-list.component.html +++ b/src/app/pages/system/advanced/sysctl/tunable-list/tunable-list.component.html @@ -21,7 +21,7 @@ ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/system/alert-service/alert-service-list/alert-service-list.component.html b/src/app/pages/system/alert-service/alert-service-list/alert-service-list.component.html index b8d705ee54d..be32dd556de 100644 --- a/src/app/pages/system/alert-service/alert-service-list/alert-service-list.component.html +++ b/src/app/pages/system/alert-service/alert-service-list/alert-service-list.component.html @@ -33,7 +33,7 @@

{{ 'Alert Services' | translate }}

ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/system/bootenv/bootenv-list/bootenv-list.component.html b/src/app/pages/system/bootenv/bootenv-list/bootenv-list.component.html index 2e4062c5b52..a81031ed32f 100644 --- a/src/app/pages/system/bootenv/bootenv-list/bootenv-list.component.html +++ b/src/app/pages/system/bootenv/bootenv-list/bootenv-list.component.html @@ -1,4 +1,4 @@ - + diff --git a/src/app/pages/system/enclosure/components/jbof-list/jbof-list.component.html b/src/app/pages/system/enclosure/components/jbof-list/jbof-list.component.html index f7cfb8de4e6..a0574ede011 100644 --- a/src/app/pages/system/enclosure/components/jbof-list/jbof-list.component.html +++ b/src/app/pages/system/enclosure/components/jbof-list/jbof-list.component.html @@ -28,7 +28,7 @@ ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > diff --git a/src/app/pages/vm/devices/device-list/device-list/device-list.component.html b/src/app/pages/vm/devices/device-list/device-list/device-list.component.html index 3e126548efb..6c1c61f0b87 100644 --- a/src/app/pages/vm/devices/device-list/device-list/device-list.component.html +++ b/src/app/pages/vm/devices/device-list/device-list/device-list.component.html @@ -20,7 +20,7 @@ ix-table-body [columns]="columns" [dataProvider]="dataProvider" - [isLoading]="dataProvider.isLoading$ | async" + [isLoading]="!!(dataProvider.isLoading$ | async)" > { diff --git a/src/assets/i18n/es-ar.json b/src/assets/i18n/es-ar.json index b3130ca0776..51b8187dea6 100644 --- a/src/assets/i18n/es-ar.json +++ b/src/assets/i18n/es-ar.json @@ -2,12 +2,6 @@ "": "", "Archs": "", "Flash Identify Light": "", - "Force-remove iXVolumes": "Forzar la eliminación de iXVolumes", - "Generic dataset suitable for any share type.": "Conjunto de datos genérico adecuado para cualquier tipo de compartición", - "Group Bind Path": "Ruta de enlace de grupo", - "Group Execute": "Ejecución grupal", - "Group Quota Manager": "Administrador de cuotas de grupo", - "KDC": "KDC", "Kerberos Keytabs": "", "Kerberos Principal": "", "Kerberos Realms": "", @@ -20,7 +14,6 @@ "LACPDU Rate": "", "LBA of First Error": "", "LDAP Realm": "", - "LDAP Timeout": "Tiempo de espera de LDAP", "LDAP User DN": "", "LDAP User DN Password": "", "LDAP configuration updated": "", @@ -28,35 +21,20 @@ "LUN ID": "", "LUN RPM": "", "Lan": "", - "Last Resilver": "Último resilver", - "Leaving": "Saliendo", "Licensed Serials": "", - "Light status is unknown.": "Estado de la luz desconocido", "Locks": "", - "Log Excerpt": "Extracto del registro", - "Log In To Outlook": "Iniciar sesión en Outlook", - "Log VDEVs": "VDEVs de registro", "Log in to {oauthType} to set up Oauth credentials.": "", "Logged In To Outlook": "", - "Login To Jira To Submit": "Iniciar sesión en Jira para enviar", - "Login error. Please try again.": "Error de inicio de sesión. Probá de nuevo.", - "Login was canceled. Please try again if you want to connect your account.": "Se canceló el inicio de sesión. Probá de nuevo si deseás conectar tu cuenta.", "MOTD": "", "Machine Time: {machineTime} \n Browser Time: {browserTime}": "", - "Macvlan NICs": "NICs de macvlan", "Mail Server Port": "", - "Major": "Importante", "Make the currently active TrueNAS controller the default when both TrueNAS controllers are online and HA is enabled. To change the default TrueNAS controller, unset this option on the default TrueNAS controller and allow the system to fail over. This briefly interrupts system services.": "", "Makes the group available for permissions editors over SMB protocol (and the share ACL editor). It is not used for SMB authentication or determining the user session token or internal permissions checks.": "", "Manage Global SED Password": "", "Max Concurrent Calls": "", "Max concurrent calls limit reached.\n There are more than 20 calls queued.\n See queued calls in the browser's console logs": "", - "Memory device": "Dispositivo de memoria", - "Memory usage of app": "Uso de memoria de la app", "Metadata (Special) Small Block Size": "", - "Metadata VDEVs": "VDEVs de metadatos", "Method Call": "", - "Method of snapshot transfer:
": "Método de transferencia de instantáneas:
  • SSH es compatible con la mayoría de los sistemas. Requiere una conexión creada previamente en Sistema > Conexiones SSH.
  • SSH+NETCAT utiliza SSH para establecer una conexión con el sistema de destino y luego utiliza py-libzfs para enviar un flujo de datos sin cifrar para lograr velocidades de transferencia más altas. Esto solo funciona cuando se replica a un TrueNAS u otro sistema con py-libzfs instalado.
  • LOCAL replica de manera eficiente las instantáneas a otro conjunto de datos en el mismo sistema sin usar la red.
  • HEREDADO utiliza el motor de replicación heredado de FreeNAS 11.2 y versiones anteriores.
", "Mixing disks of different sizes in a vdev is not recommended.": "", "Modern OS: Extent block size 4k, TPC enabled, no Xen compat mode, SSD speed": "", "NAA": "", @@ -83,7 +61,6 @@ "New Virtual Machine": "", "No Enclosure Dispersal Strategy": "", "No Isolated GPU Device(s) configured": "", - "No connections": "Sin conexiones", "Offload Read": "", "Offload Write": "", "One-Time Password (if necessary)": "", @@ -98,7 +75,6 @@ "Other node is currently configuring the system dataset.": "", "Other node is currently processing a failover event.": "", "Outgoing Mail Server": "", - "Outlook": "Outlook", "PCI Passthrough Device": "", "PCI device does not have a reset mechanism defined and you may experience inconsistent/degraded behavior when starting/stopping the VM.": "", "Parent": "", @@ -155,24 +131,6 @@ "Quota Fill Warning (in %)": "", "Quota settings updated": "", "Quotas added": "", - "Quotas set for {n, plural, one {# group} other {# groups} }": "Cuotas establecidas para {n, plural, one {# grupo} other {# grupos} }", - "Quotas set for {n, plural, one {# user} other {# users} }": "Cuotas establecidas para {n, plural, one {# usuario} other {# usuarios} }", - "Quotas updated": "Cuotas actualizadas", - "REQUIRE": "REQUIERE", - "Read ACL": "Leer ACL", - "Read Attributes": "Leer propiedades", - "Read Data": "Leer datos", - "Read Named Attributes": "Leer propiedades nombradas", - "Rear": "Trasero", - "Reboot Local": "Reiniciar local", - "Reboot of the other node is required for FIPS changes.": "Es necesario reiniciar el otro nodo para realizar cambios de FIPS.", - "Reboot of this node is required for FIPS changes.": "Es necesario reiniciar este nodo para realizar cambios de FIPS.", - "Received: {received}/s Sent: {sent}/s": "Recibido: {received}/s Enviado: {sent}/s", - "Redfish administrative password.": "Contraseña administrativa de Redfish.", - "Redfish administrative username.": "Nombre de usuario administrativo de Redfish.", - "Register": "Registro", - "Register Default Gateway": "Registrar puerta de enlace predeterminada", - "Regularly scheduled system checks and updates.": "Comprobaciones y actualizaciones del sistema programadas periódicamente.", "Release": "", "Replication Task Config Read": "", "Replication Task Config Write": "", @@ -181,27 +139,8 @@ "Replication Task Wizard": "", "Replication Task Write": "", "Replication Task Write Pull": "", - "Replication «{name}» has started.": "Se inició la replicación «{name}».", "Reporting Exporter": "", "Reporting Exporters": "", - "Reporting Read": "Informe de lectura", - "Reporting Write": "Informe de escritura", - "Requested action performed for selected Applications": "Acción solicitada realizada para aplicaciones seleccionadas", - "Requested action performed for selected Instances": "Acción solicitada realizada para instancias seleccionadas", - "Require IDENT Authentication": "Requerir autenticación IDENT", - "Required reset to fix system operation issues.": "Reinicio necesario para solucionar problemas de funcionamiento del sistema.", - "Required restart after new software installation.": "Es necesario reiniciar después de instalar un nuevo software.", - "Required – always encrypt transport (rejecting access if client does not support encryption – incompatible with SMB1 server enable_smb1)": "Obligatorio: siempre cifrar el transporte (rechazar el acceso si el cliente no admite el cifrado; incompatible con el servidor SMB1 enable_smb1)", - "Reset Default Config": "Restablecer config predeterminada", - "Reset Defaults": "Restablecer valores predeterminados", - "Reset Search": "Restablecer búsqueda", - "Resilver configuration saved": "Configuración de Resilver guardada", - "Resilvering": "Resilverización", - "Resilvering Status": "Estado de la resilverización", - "Resilvering pool: ": "Resilverización del pool", - "Resilvering:": "Resilverización:", - "Retry": "Reintentar", - "Rolling back...": "Retrocediendo...", "Root TCP Socket": "", "SAN": "", "SMB - Operation Close": "", @@ -218,15 +157,12 @@ "SMB Lock": "", "SMB Locks": "", "SMB Open File": "", - "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": "El multicanal SMB permite a los servidores utilizar varias conexiones de red simultáneamente combinando el ancho de banda de varias tarjetas de interfaz de red (NIC) para lograr un mejor rendimiento. El multicanal SMB no funciona si se combinan las NIC en un LAGG. Más información en la documentación", - "SMB preset sets most optimal settings for SMB sharing.": "Los ajustes preestablecidos de SMB establecen las configuraciones más óptimas para compartir SMB.", "SSSD Compat": "", "Script": "", "Scrub Boot Pool": "", "Search UI": "", "Serial Shell": "", "Service = \"SMB\" AND Event = \"CLOSE\"": "", - "Set an expiration date-time for the API key.": "Establecer una fecha y hora de vencimiento para la clave de API.", "Set to automatically configure the IPv6. Only one interface can be configured this way.": "", "Set to boot a debug kernel after the next system restart.": "", "Set to enable Samba to do DNS updates when joining a domain.": "", @@ -282,19 +218,6 @@ "Tests are only performed when Never is selected.": "", "Thank you for sharing your feedback with us! Your insights are valuable in helping us improve our product.": "", "Thank you. Ticket was submitted succesfully.": "", - "The {name} dataset and all snapshots stored with it will be permanently deleted.": "El conjunto de datos {name} y todas las instantáneas almacenadas con él se van a eliminar permanentemente.", - "The {name} zvol and all snapshots stored with it will be permanently deleted.": "El zvol {name} y todas las instantáneas almacenadas con él se van a eliminar permanentemente.", - "The SMB share ACL defines access rights for users of this SMB share up to, but not beyond, the access granted by filesystem ACLs.": "Las ACL del recurso compartido SMB define los derechos de acceso para los usuarios de este recurso compartido SMB hasta, pero no más allá, del acceso otorgado por las ACL del sistema de archivos.", - "The TrueNAS controllers do not have the same quantity of disks.": "Los controladores TrueNAS no tienen la misma cantidad de discos.", - "The VM could not start because the current configuration could potentially require more RAM than is available on the system. Memory overcommitment allows multiple VMs to be launched when there is not enough free memory for configured RAM of all VMs. Use with caution. Would you like to overcommit memory?": "La VM no pudo iniciarse porque la configuración actual podría requerir más RAM de la que está disponible en el sistema. La sobreasignación de memoria permite que se inicien varias VMs cuando no hay suficiente memoria libre para la RAM configurada de todas las VMs. Usá con precaución. ¿Deseás sobreasignar memoria?", - "The chosen preset ACL will REPLACE the ACL currently displayed in the form and delete any unsaved changes.": "La ACL preestablecida elegida va a REEMPLAZAR la ACL que se muestra actualmente en el formulario y va a eliminar cualquier cambio no guardado.", - "The credentials are valid.": "Las credenciales son válidas.", - "The current pool layout is not recommended. Override the following errors?": "El diseño actual de pool no es el recomendado. ¿Deseás anular los siguientes errores?", - "The default \"Checksum\" value for datasets with deduplication used to be SHA256.\n Our testing has shown that SHA512 performs better for such datasets.\n We've changed the checksum value from SHA256 to SHA512. You can change it back in \"Advanced Options\".": "El valor predeterminado de \"Suma de comprobación\" para los conjuntos de datos con deduplicación solía ser SHA256.\n Nuestras pruebas demostraron que SHA512 funciona mejor para dichos conjuntos de datos.\n Canbiamos el valor de suma de comprobación de SHA256 a SHA512. Podés volver a cambiarlo en \"Opciones avanzadas\".", - "The directory base suffix to use for SID/uid/gid mapping entries. Example: dc=test,dc=org. When undefined, idmap_ldap defaults to using the ldap idmap suffix option from smb.conf.": "El sufijo base del directorio que se va a usar para las entradas de mapeo de SID/uid/gid. Ejemplo: dc=test,dc=org. Cuando no está definido, idmap_ldap utiliza de manera predeterminada la opción de sufijo idmap de ldap de smb.conf.", - "The domain for local users is the NetBIOS name of the TrueNAS server.": "El dominio para los usuarios locales es el nombre NetBIOS del servidor TrueNAS.", - "The expanded vdev uses the pre-expanded parity ratio, which reduces the total vdev capacity. To reset the vdev parity ratio and fully use the new capacity, manually rewrite all data in the vdev. This process takes time and is irreversible.": "El vdev ampliado utiliza la proporción de paridad preexpandida, lo que reduce la capacidad total del vdev. Para restablecer la relación de paridad del vdev y utilizar por completo la nueva capacidad, reescribí manualmente todos los datos en el vdev. Este proceso lleva tiempo y es irreversible.", - "The filesystem {filesystemName} is {filesystemDescription}, but datastore {datastoreName} is {datastoreDescription}. Is this correct?": "El sistema de archivos {filesystemName} es {filesystemDescription}, pero el almacén de datos {datastoreName} es {datastoreDescription}. ¿Es correcto?", "The following { n, plural, one {boot environment} other {# boot environments} } will be deleted. Are you sure you want to proceed?": "", "Tunable": "", "UI Search Result: {result}": "", @@ -2273,6 +2196,7 @@ "Force the VM to stop if it has not already stopped within the specified shutdown timeout. Without this option selected, the VM will receive the shutdown signal, but may or may not complete the shutdown process.": "Obliga a la VM a detenerse si aún no se detuvo dentro del tiempo de espera de apagado especificado. Sin esta opción seleccionada, la VM recibirá la señal de apagado, pero puede o no completar el proceso de apagado.", "Force unmount": "Forzar desmontaje", "Force using Signature Version 2 to sign API requests. Set this only if your AWS provider does not support default version 4 signatures.": "Forzar el uso de Signature Version 2 para firmar solicitudes de API. Establecé esta opción solo si tu proveedor de AWS no admite firmas de la versión 4 predeterminadas.", + "Force-remove iXVolumes": "Forzar la eliminación de iXVolumes", "Forces the addition of the NTP server, even if it is currently unreachable.": "Fuerza la adición del servidor NTP, incluso si actualmente no es accesible.", "Forcing the other TrueNAS controller to become active requires a failover. This will temporarily interrupt system services. After confirmation, SAVE AND FAILOVER must be clicked on the previous screen.": "Para forzar la activación del otro controlador TrueNAS es necesario realizar una conmutación por error. Esto interrumpirá temporalmente los servicios del sistema. Después de la confirmación, se debe hacer clic en GUARDAR Y CONMUTACIÓN POR ERROR en la pantalla anterior.", "Forums": "Foros", @@ -2322,6 +2246,7 @@ "Generate an alert when the pool has this percent space remaining. This is typically configured at the pool level when using zvols or at the extent level for both file and device based extents.": "Genere una alerta cuando el pool tenga este porcentaje de espacio restante. Esto generalmente se configura a nivel de pool cuando se usan zvols o en el nivel de extensión para extensiones basadas en archivos y dispositivos.", "Generate idmap low range based on same algorithm that SSSD uses by default.": "Genere un rango bajo de idmap basado en el mismo algoritmo que SSSD usa de manera predeterminada.", "Generic": "Genérico", + "Generic dataset suitable for any share type.": "Conjunto de datos genérico adecuado para cualquier tipo de compartición", "Get Support": "Conseguir ayuda", "Give your exporter configuration a name": "Dale un nombre a tu configuración de exportador", "Gives control of how much of the new device is made available to ZFS. Set to use the entire capacity of the new device.": "Da el control de cuánto del nuevo dispositivo está disponible para ZFS. Configurado para usar toda la capacidad del nuevo dispositivo.", @@ -2352,13 +2277,16 @@ "Google Drive": "Google Drive", "Google Photos": "Google Fotos", "Group": "Grupo", + "Group Bind Path": "Ruta de enlace de grupo", "Group Configuration": "Configuración del grupo", "Group Data Quota ": "Cuota de datos de grupo ", + "Group Execute": "Ejecución grupal", "Group ID": "ID de Grupo", "Group ID created in Authorized Access. Required when the Discovery Authentication Method is set to CHAP or Mutual CHAP.": "ID del grupo creado en Acceso Autorizado. Requerido cuando el Método de Autenticación de Descubrimiento se establece en CHAP o CHAP Mutuo.", "Group Members": "Miembros del grupo", "Group Obj": "Obj de grupo", "Group Object Quota": "Cuota de objetos de grupo", + "Group Quota Manager": "Administrador de cuotas de grupo", "Group Quotas": "Cuotas de grupo", "Group Read": "Lectura del grupo", "Group Write": "Escritura del grupo", @@ -2693,6 +2621,7 @@ "Joining": "Uniendo", "Jul": "Julio", "Jun": "Junio", + "KDC": "KDC", "KMIP": "KMIP", "KMIP Key Status": "Estado de clave KMIP", "KMIP Read": "Lectura de KMIP", @@ -2729,6 +2658,7 @@ "LDAP - Primary Domain": "LDAP: Dominio Primario", "LDAP Domain": "Dominio LDAP", "LDAP Server": "Servidor LDAP", + "LDAP Timeout": "Tiempo de espera de LDAP", "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.": "Nombres de host del servidor LDAP o direcciones IP. Entradas separadas con un espacio vacío. Se pueden ingresar varios nombres de host o direcciones IP para crear una lista de prioridades de conmutación por error LDAP. Si un host no responde, se prueba el siguiente host de la lista hasta que se establezca una nueva conexión.", "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.": "Servidor LDAP para usar para entradas de mapa SID/uid/gid. Cuando no está definido, idmap_ldap usa * ldap://localhost/*. Ejemplo: ldap: //ldap.netscape.com/o=Airius.com.", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "Tiempo de espera de LDAP en segundos. Aumente este valor si se produce un tiempo de espera de ticket Kerberos.", @@ -2743,6 +2673,7 @@ "Last 24 hours": "Ultimas 24 horas", "Last 3 days": "Últimos 3 días", "Last Page": "Última página", + "Last Resilver": "Último resilver", "Last Run": "Última ejecución", "Last Scan": "Último escaneo", "Last Scan Duration": "Duración del último escaneo", @@ -2766,6 +2697,7 @@ "Leave empty or select number of existing portal to use.": "Dejá en blanco o seleccioná el número de portal existente para usar.", "Leave empty to allow all host CPUs to be used.": "Dejá vacío para permitir el uso de todas las CPUs del host.", "Leave empty to not limit instance memory.": "Dejá vacío para no limitar la memoria de la instancia.", + "Leaving": "Saliendo", "Leaving the domain requires sufficient privileges. Enter your credentials below.": "Dejar el dominio requiere suficientes privilegios. Ingresá tus credenciales a continuación.", "Legacy": "Heredado", "Legacy AFP Compatibility": "Compatibilidad con AFP heredada", @@ -2784,6 +2716,7 @@ "License": "Licencia", "License Update": "Actualización de licencia", "Lifetime": "Toda la vida", + "Light status is unknown.": "Estado de la luz desconocido", "Limit": "Limitar", "Limit Pool To A Single Enclosure": "Limitar pool a un solo recinto", "Limit To {name} Enclosure": "Limitar al recinto {name}", @@ -2830,12 +2763,15 @@ "Locking Dataset": "Bloqueo de conjunto de datos", "Log": "Registro", "Log Details": "Detalles del registro", + "Log Excerpt": "Extracto del registro", "Log In": "Iniciar sesión", "Log In To Gmail": "Iniciar sesión en Gmail", + "Log In To Outlook": "Iniciar sesión en Outlook", "Log In To Provider": "Iniciar sesión en el proveedor", "Log Level": "Nivel de registro", "Log Out": "Cerrar sesión", "Log Path": "Ruta de registro", + "Log VDEVs": "VDEVs de registro", "Logged In To Gmail": "Inició sesión en Gmail", "Logged In To Jira": "Inició sesión en Jira", "Logged In To Provider": "Inició sesión en el proveedor", @@ -2844,6 +2780,9 @@ "Logical Block Size": "Tamaño del bloque lógico", "Login Attempts": "Intentos de acceso", "Login Banner": "Pancarta de inicio de sesión", + "Login To Jira To Submit": "Iniciar sesión en Jira para enviar", + "Login error. Please try again.": "Error de inicio de sesión. Probá de nuevo.", + "Login was canceled. Please try again if you want to connect your account.": "Se canceló el inicio de sesión. Probá de nuevo si deseás conectar tu cuenta.", "Logoff": "Desconectarse", "Logout": "Cerrar sesión", "Logs": "Registros", @@ -2865,8 +2804,10 @@ "MTU": "MTU", "Mac Address": "Dirección Mac", "Machine": "Máquina", + "Macvlan NICs": "NICs de macvlan", "Main menu": "Menú principal", "Maintenance Window": "Ventana de mantenimiento", + "Major": "Importante", "Make Destination Dataset Read-only?": "¿Hacer que el conjunto de datos de destino sea de solo lectura?", "Manage": "Gestionar", "Manage Advanced Settings": "Administrar configuraciones avanzadas", @@ -2948,10 +2889,14 @@ "Memory Stats": "Estadísticas de memoria", "Memory Usage": "Uso de memoria", "Memory Utilization": "Utilización de memoria", + "Memory device": "Dispositivo de memoria", + "Memory usage of app": "Uso de memoria de la app", "Message": "Mensaje", "Message verbosity level in the replication task log.": "Nivel de verbosidad del mensaje en el registro de tareas de replicación.", "Metadata": "Metadados", + "Metadata VDEVs": "VDEVs de metadatos", "Method": "Método", + "Method of snapshot transfer:
  • SSH is supported by most systems. It requires a previously created connection in System > SSH Connections.
  • SSH+NETCAT uses SSH to establish a connection to the destination system, then uses py-libzfs to send an unencrypted data stream for higher transfer speeds. This only works when replicating to a TrueNAS, or other system with py-libzfs installed.
  • LOCAL efficiently replicates snapshots to another dataset on the same system without using the network.
  • LEGACY uses the legacy replication engine from FreeNAS 11.2 and earlier.
": "Método de transferencia de instantáneas:
  • SSH es compatible con la mayoría de los sistemas. Requiere una conexión creada previamente en Sistema > Conexiones SSH.
  • SSH+NETCAT utiliza SSH para establecer una conexión con el sistema de destino y luego utiliza py-libzfs para enviar un flujo de datos sin cifrar para lograr velocidades de transferencia más altas. Esto solo funciona cuando se replica a un TrueNAS u otro sistema con py-libzfs instalado.
  • LOCAL replica de manera eficiente las instantáneas a otro conjunto de datos en el mismo sistema sin usar la red.
  • HEREDADO utiliza el motor de replicación heredado de FreeNAS 11.2 y versiones anteriores.
", "Metrics": "Métricas", "MiB": "MiB", "MiB. Units smaller than MiB are not allowed.": "MiB. Las unidades más pequeñas que MiB no están permitidas.", @@ -3170,6 +3115,7 @@ "No VDEVs added.": "No se agregaron VDEVs.", "No arguments are passed": "No se pasan argumentos", "No available licensed Expansion Shelves ": "No hay estantes de expansión con licencia disponibles", + "No connections": "Sin conexiones", "No containers are available.": "No hay contenedores disponibles.", "No descriptor provided": "No se proporcionó ninguna descripción", "No devices added.": "No hay dispositivos añadidos.", @@ -3324,6 +3270,7 @@ "Outbound Network": "Red saliente", "Outbound Network:": "Red de salida", "Outgoing [{networkInterfaceName}]": "Saliente [{networkInterfaceName}]", + "Outlook": "Outlook", "Override Admin Email": "Anular correo del administrador", "Overrides default directory creation mask of 0777 which grants directory read, write and execute access for everybody.": "Reemplaza la máscara de creación de directorios predeterminada de 0777 que concede acceso de lectura, escritura y ejecución de directorios para todos.", "Overrides default file creation mask of 0666 which creates files with read and write access for everybody.": "Reemplaza la máscara de creación de archivos predeterminada de 0666 que crea archivos con acceso de lectura y escritura para todos.", @@ -3500,11 +3447,15 @@ "Quota for this dataset and all children": "Cuota para este conjunto de datos y todos los secundarios", "Quota size is too small, enter a value of 1 GiB or larger.": "El tamaño de la cuota es demasiado pequeño, ingresá un valor de 1 GiB o mayor.", "Quota warning alert at, %": "Alerta de advertencia de cuota en, %", + "Quotas set for {n, plural, one {# group} other {# groups} }": "Cuotas establecidas para {n, plural, one {# grupo} other {# grupos} }", + "Quotas set for {n, plural, one {# user} other {# users} }": "Cuotas establecidas para {n, plural, one {# usuario} other {# usuarios} }", + "Quotas updated": "Cuotas actualizadas", "RAIDZ1": "RAIDZ1", "RAIDZ2": "RAIDZ2", "RAIDZ3": "RAIDZ3", "RAM": "RAM", "REMOTE": "REMOTO", + "REQUIRE": "REQUIERE", "Randomly generate an encryption key for securing this dataset. Disabling requires manually defining the encryption key.
WARNING: the encryption key is the only means to decrypt the information stored in this dataset. Store the encryption key in a secure location.": "Genere aleatoriamente una clave de cifrado para proteger este conjunto de datos. La desactivación requiere la definición manual de la clave de cifrado. ADVERTENCIA: la clave de cifrado es el único medio para descifrar la información almacenada en este conjunto de datos. Almacene la clave de cifrado en una ubicación segura.", "Range High": "Rango alto", "Range Low": "Rango bajo", @@ -3516,16 +3467,25 @@ "Re-Open": "Reabrir", "Re-Open All Alerts": "Reabrir todas las alertas", "Read": "Leer", + "Read ACL": "Leer ACL", + "Read Attributes": "Leer propiedades", + "Read Data": "Leer datos", "Read Errors": "Errores de lectura", + "Read Named Attributes": "Leer propiedades nombradas", "Read Only": "Solo lectura", "Read-only": "Sólo lectura", "Readonly Admin": "Administrador de solo lectura", "Realm": "Reino", + "Rear": "Trasero", "Reason": "Motivo", "Reboot": "Reiniciar", + "Reboot Local": "Reiniciar local", "Reboot Remote": "Reinicio remoto", "Reboot Required": "Reinicio requerido", + "Reboot of the other node is required for FIPS changes.": "Es necesario reiniciar el otro nodo para realizar cambios de FIPS.", + "Reboot of this node is required for FIPS changes.": "Es necesario reiniciar este nodo para realizar cambios de FIPS.", "Rebuild Directory Service Cache": "Reconstruir caché del servicio de directorio", + "Received: {received}/s Sent: {sent}/s": "Recibido: {received}/s Enviado: {sent}/s", "Recent Searches": "Búsquedas recientes", "Recommended Apps": "Apps recomendadas", "Recommended block size based on pool topology:": "Tamaño de bloque recomendado según la topología del pool:", @@ -3534,6 +3494,8 @@ "Reconnect": "Reconectar", "Record Size": "Tamaño del registro", "Recursive": "Recursivo", + "Redfish administrative password.": "Contraseña administrativa de Redfish.", + "Redfish administrative username.": "Nombre de usuario administrativo de Redfish.", "Redirect HTTP connections to HTTPS. A GUI SSL Certificate is required for HTTPS. Activating this also sets the HTTP Strict Transport Security (HSTS) maximum age to 31536000 seconds (one year). This means that after a browser connects to the web interface for the first time, the browser continues to use HTTPS and renews this setting every year.": "Redireccioar las conexiones HTTP a HTTPS. Se requiere un certificado SSL de GUI para HTTPS. Activar esto también establece la seguridad de transporte estricta HTTP (HSTS) edad máxima a 31536000 segundos (un año). Esto significa que después de que un navegador se conecta a la interfaz web por primera vez, el navegador continúa usando HTTPS y renueva esta configuración cada año.", "Reenter Password": "Reingresá la contraseña", "Referenced": "Referenciado", @@ -3544,6 +3506,9 @@ "Region": "Región", "Region Name": "Nombre de región", "Region name - optional (rclone documentation).": "Nombre de la región: opcional (documentación de rclone) .", + "Register": "Registro", + "Register Default Gateway": "Registrar puerta de enlace predeterminada", + "Regularly scheduled system checks and updates.": "Comprobaciones y actualizaciones del sistema programadas periódicamente.", "Reject": "Rechazar", "Release Notes": "Notas de la versión", "Reload now": "Recargar ahora", @@ -3611,14 +3576,23 @@ "Replication from scratch": "Replicación desde cero", "Replication task created.": "Tarea de replicación creada.", "Replication task saved.": "Tarea de replicación guardada.", + "Replication «{name}» has started.": "Se inició la replicación «{name}».", "Report Bug": "Informar error", "Report a bug": "Informar un error", "Report if drive temperature is at or above this temperature in Celsius. 0 disables the report.": "Informa si la temperatura de la unidad es igual o superior a esta temperatura en grados Celsius. 0 deshabilita el informe.", "Report if the temperature of a drive has changed by this many degrees Celsius since the last report. 0 disables the report.": "Informa si la temperatura de una unidad ha cambiado tantos grados Celsius desde el último informe. 0 deshabilita el informe.", "Reporting": "Informes", + "Reporting Read": "Informe de lectura", + "Reporting Write": "Informe de escritura", "Reports": "Informes", + "Requested action performed for selected Applications": "Acción solicitada realizada para aplicaciones seleccionadas", + "Requested action performed for selected Instances": "Acción solicitada realizada para instancias seleccionadas", + "Require IDENT Authentication": "Requerir autenticación IDENT", "Require Kerberos for NFSv4": "Requerir Kerberos para NFSv4", + "Required reset to fix system operation issues.": "Reinicio necesario para solucionar problemas de funcionamiento del sistema.", + "Required restart after new software installation.": "Es necesario reiniciar después de instalar un nuevo software.", "Required unless Enable password login is No. Passwords cannot contain a ?.": "Se requiere a menos que Habilitar inicio de sesión con contraseña sea No . Las contraseñas no pueden contener un ? .", + "Required – always encrypt transport (rejecting access if client does not support encryption – incompatible with SMB1 server enable_smb1)": "Obligatorio: siempre cifrar el transporte (rechazar el acceso si el cliente no admite el cifrado; incompatible con el servidor SMB1 enable_smb1)", "Reservation": "Reserva", "Reservation (in GiB)": "Reserva (en GiB)", "Reserved for Dataset": "Reservado para el conjunto de datos", @@ -3628,6 +3602,9 @@ "Reset": "Reestablecer", "Reset Config": "Restablecer Config", "Reset Configuration": "Restablecer configuración", + "Reset Default Config": "Restablecer config predeterminada", + "Reset Defaults": "Restablecer valores predeterminados", + "Reset Search": "Restablecer búsqueda", "Reset Step": "Restablecer paso", "Reset Zoom": "Restablecer zoom", "Reset configuration": "Restablecer configuración", @@ -3639,6 +3616,11 @@ "Resetting system configuration to default settings. The system will restart.": "Restablecer la configuración del sistema a la configuración predeterminada. El sistema se va a reiniciar.", "Resetting. Please wait...": "Reiniciando. Por favor esperá...", "Resilver Priority": "Prioridad de resilver", + "Resilver configuration saved": "Configuración de Resilver guardada", + "Resilvering": "Resilverización", + "Resilvering Status": "Estado de la resilverización", + "Resilvering pool: ": "Resilverización del pool", + "Resilvering:": "Resilverización:", "Resolution": "Resolución", "Restart": "Reiniciar", "Restart After Update": "Reiniciar después actualizar", @@ -3679,6 +3661,7 @@ "Resume Scrub": "Continuar limpieza", "Retention": "Retención", "Retention (in days)": "Retención (en días)", + "Retry": "Reintentar", "Return to pool list": "Volver a la lista de pools", "Revert Changes": "Revertir cambios", "Revert Network Interface Changes": "Revertir cambios en la interfaz de red", @@ -3695,6 +3678,7 @@ "Roll back snapshots": "Revertir instantáneas", "Roll back snapshots of ix_volumes": "Revertir instantáneas de ix_volumes", "Rollback": "Retroceder", + "Rolling back...": "Retrocediendo...", "Root dataset ACL cannot be edited.": "El conjunto de datos root ACL no se puede editar.", "Rotation Rate": "Velocidad de rotación", "Rotation Rate (RPM)": "Velocidad de rotación (RPM)", @@ -3764,6 +3748,8 @@ "SMB Shares": "Comparticiones SMB", "SMB Status": "Estado de SMB", "SMB User": "Usuario 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": "El multicanal SMB permite a los servidores utilizar varias conexiones de red simultáneamente combinando el ancho de banda de varias tarjetas de interfaz de red (NIC) para lograr un mejor rendimiento. El multicanal SMB no funciona si se combinan las NIC en un LAGG. Más información en la documentación", + "SMB preset sets most optimal settings for SMB sharing.": "Los ajustes preestablecidos de SMB establecen las configuraciones más óptimas para compartir SMB.", "SMB/NFSv4": "SMB/NFSv4", "SMTP": "SMTP", "SMTP Authentication": "Autenticación SMTP", @@ -4040,6 +4026,7 @@ "Set Quota": "Establecer cuota", "Set Quotas": "Establecer cuotas", "Set Warning Level": "Establecer nivel de advertencia", + "Set an expiration date-time for the API key.": "Establecer una fecha y hora de vencimiento para la clave de API.", "Set email": "Establecer correo", "Set enable sending messages to the address defined in the Email field.": "Configure habilitar el envío de mensajes a la dirección definida en el campo Email.", "Set font size": "Establecer tamaño de fuente", @@ -4472,22 +4459,35 @@ "Tests the server connection and verifies the chosen Certificate chain. To test, configure the Server and Port values, select a Certificate and Certificate Authority, enable this setting, and click SAVE.": "Prueba la conexión del servidor y verifica la cadena Certificado elegida. Para probar, configurá los valores de Servidor y Puerto, seleccioná un Certificado y Autoridad de certificación, habilitá esta configuración y hacé clic en GUARDAR.", "The TrueNAS Community Forums are the best place to ask questions and interact with fellow TrueNAS users.": "Los foros de la comunidad TrueNAS son el mejor lugar para hacer preguntas e interactuar con otros usuarios de TrueNAS.", "The TrueNAS Documentation Site is a collaborative website with helpful guides and information about your new storage system.": "El sitio de documentación de TrueNAS es un sitio web colaborativo con guías útiles e información sobre tu nuevo sistema de almacenamiento.", + "The {name} dataset and all snapshots stored with it will be permanently deleted.": "El conjunto de datos {name} y todas las instantáneas almacenadas con él se van a eliminar permanentemente.", + "The {name} zvol and all snapshots stored with it will be permanently deleted.": "El zvol {name} y todas las instantáneas almacenadas con él se van a eliminar permanentemente.", "The Alias field can either be left empty or have an alias defined for each path in the share.": "El campo Alias puede dejarse vacío o tener un alias definido para cada ruta en el recurso compartido.", "The Use Apple-style character encoding value has changed. This parameter affects how file names are read from and written to storage. Changes to this parameter after data is written can prevent accessing or deleting files containing mangled characters.": "El valor de Usar codificación de caracteres estilo Apple ha cambiado. Este parámetro afecta cómo se leen y escriben los nombres de archivo en el almacenamiento. Los cambios a este parámetro después de que se escriben los datos pueden evitar el acceso o la eliminación de archivos que contienen caracteres alterados.", "The Group ID (GID) is a unique number used to identify a Unix group. Enter a number above 1000 for a group with user accounts. Groups used by a service must have an ID that matches the default port number used by the service.": "La ID de grupo (GID) es un número único utilizado para identificar un grupo Unix. Ingresá un número superior a 1000 para un grupo con cuentas de usuario. Los grupos utilizados por un servicio deben tener una ID que coincida con el número de puerto predeterminado utilizado por el servicio.", "The Idmap cache should be cleared after finalizing idmap changes. Click \"Continue\" to clear the cache.": "El caché de Idmap debe borrarse después de finalizar los cambios de idmap. Hacé clic en \"Continuar\" para borrar el caché.", "The OU in which new computer accounts are created. The OU string is read from top to bottom without RDNs. Slashes (\"/\") are used as delimiters, like Computers/Servers/NAS. The backslash (\"\\\") is used to escape characters but not as a separator. Backslashes are interpreted at multiple levels and might require doubling or even quadrupling to take effect. When this field is blank, new computer accounts are created in the Active Directory default OU.": "La unidad organizativa en la que se crean nuevas cuentas de computadora. La cadena OU se lee de arriba a abajo sin RDN. Las barras inclinadas (\"/\") se usan como delimitadores, como Computers / Servers / NAS . La barra invertida (\"\\\\\") se usa para escapar caracteres pero no como separador. Las barras invertidas se interpretan en múltiples niveles y pueden requerir duplicarse o incluso cuadruplicarse para que surtan efecto. Cuando este campo está en blanco, se crean nuevas cuentas de computadora en la unidad organizativa predeterminada de Active Directory.", "The SMB service has been restarted.": "El servicio SMB fue iniciado.", + "The SMB share ACL defines access rights for users of this SMB share up to, but not beyond, the access granted by filesystem ACLs.": "Las ACL del recurso compartido SMB define los derechos de acceso para los usuarios de este recurso compartido SMB hasta, pero no más allá, del acceso otorgado por las ACL del sistema de archivos.", "The SSL certificate to be used for TLS FTP connections. To create a certificate, use System --> Certificates.": "El certificado SSL que se utilizará para las conexiones FTP de TLS. Para crear un certificado, use Sistema -> Certificados .", + "The TrueNAS controllers do not have the same quantity of disks.": "Los controladores TrueNAS no tienen la misma cantidad de discos.", "The URI used to provision an OTP. The URI (which contains the secret) is encoded in a QR Code. To set up an OTP app like Google Authenticator, use the app to scan the QR code or enter the secret manually into the app. The URI is produced by the system when Two-Factor Authentication is first activated.": "El URI solía aprovisionar una OTP. El URI (que contiene el secreto) está codificado en un código QR. Para configurar una aplicación OTP como Google Authenticator, use la aplicación para escanear el código QR o ingresá el secreto manualmente en la aplicación. El sistema produce el URI cuando la autenticación de dos factores se activa por primera vez.", + "The VM could not start because the current configuration could potentially require more RAM than is available on the system. Memory overcommitment allows multiple VMs to be launched when there is not enough free memory for configured RAM of all VMs. Use with caution. Would you like to overcommit memory?": "La VM no pudo iniciarse porque la configuración actual podría requerir más RAM de la que está disponible en el sistema. La sobreasignación de memoria permite que se inicien varias VMs cuando no hay suficiente memoria libre para la RAM configurada de todas las VMs. Usá con precaución. ¿Deseás sobreasignar memoria?", "The base name is automatically prepended if the target name does not start with iqn. Lowercase alphanumeric characters plus dot (.), dash (-), and colon (:) are allowed. See the Constructing iSCSI names using the iqn.format section of RFC3721.": "El nombre base se antepone automáticamente si el nombre del objetivo no comienza con iqn . Se permiten caracteres alfanuméricos en minúscula más punto (.), Guión (-) y dos puntos (:). Vea la Construcción de nombres iSCSI utilizando la sección iqn.format de RFC3721 .", "The cache has been cleared.": "La caché ya se borró.", "The cache is being rebuilt.": "La caché se está reconstruyendo.", "The certificate's public key is used to encipher user data only during key agreement operations. Requires that Key Agreement is also set.": "La clave pública del certificado se utiliza para cifrar datos de usuario solo durante las operaciones de acuerdo de claves. Requiere que Acuerdo de clave también esté establecido.", + "The chosen preset ACL will REPLACE the ACL currently displayed in the form and delete any unsaved changes.": "La ACL preestablecida elegida va a REEMPLAZAR la ACL que se muestra actualmente en el formulario y va a eliminar cualquier cambio no guardado.", "The contents of all added disks will be erased.": "Se va a borrar el contenido de todos los discos agregados.", + "The credentials are valid.": "Las credenciales son válidas.", "The cryptographic algorithm to use. The default SHA256 only needs to be changed if the organization requires a different algorithm.": "El algoritmo criptográfico a usar. El SHA256 predeterminado solo necesita cambiarse si la organización requiere un algoritmo diferente.", + "The current pool layout is not recommended. Override the following errors?": "El diseño actual de pool no es el recomendado. ¿Deseás anular los siguientes errores?", + "The default \"Checksum\" value for datasets with deduplication used to be SHA256.\n Our testing has shown that SHA512 performs better for such datasets.\n We've changed the checksum value from SHA256 to SHA512. You can change it back in \"Advanced Options\".": "El valor predeterminado de \"Suma de comprobación\" para los conjuntos de datos con deduplicación solía ser SHA256.\n Nuestras pruebas demostraron que SHA512 funciona mejor para dichos conjuntos de datos.\n Canbiamos el valor de suma de comprobación de SHA256 a SHA512. Podés volver a cambiarlo en \"Opciones avanzadas\".", + "The directory base suffix to use for SID/uid/gid mapping entries. Example: dc=test,dc=org. When undefined, idmap_ldap defaults to using the ldap idmap suffix option from smb.conf.": "El sufijo base del directorio que se va a usar para las entradas de mapeo de SID/uid/gid. Ejemplo: dc=test,dc=org. Cuando no está definido, idmap_ldap utiliza de manera predeterminada la opción de sufijo idmap de ldap de smb.conf.", + "The domain for local users is the NetBIOS name of the TrueNAS server.": "El dominio para los usuarios locales es el nombre NetBIOS del servidor TrueNAS.", "The domain to access the Active Directory server when using the LDAP server inside the Active Directory server.": "El dominio para acceder al servidor de Active Directory cuando se utiliza el servidor LDAP dentro del servidor de Active Directory.", + "The expanded vdev uses the pre-expanded parity ratio, which reduces the total vdev capacity. To reset the vdev parity ratio and fully use the new capacity, manually rewrite all data in the vdev. This process takes time and is irreversible.": "El vdev ampliado utiliza la proporción de paridad preexpandida, lo que reduce la capacidad total del vdev. Para restablecer la relación de paridad del vdev y utilizar por completo la nueva capacidad, reescribí manualmente todos los datos en el vdev. Este proceso lleva tiempo y es irreversible.", "The file used to manually update the system. Browse to the update file stored on the system logged into the web interface to upload and apply. Update file names end with -manual-update-unsigned.tar": "El archivo utilizado para actualizar manualmente el sistema. Buscá el archivo de actualización almacenado en el sistema conectado a la interfaz web para cargar y aplicar. Los nombres de los archivos de actualización terminan con -manual-update-unsigned.tar", + "The filesystem {filesystemName} is {filesystemDescription}, but datastore {datastoreName} is {datastoreDescription}. Is this correct?": "El sistema de archivos {filesystemName} es {filesystemDescription}, pero el almacén de datos {datastoreName} es {datastoreDescription}. ¿Es correcto?", "The following changes to this SMB Share require the SMB Service to be restarted before they can take effect.": "Los siguientes cambios en este recurso compartido SMB requieren que se reinicie el servicio SMB antes de que puedan tener efecto.", "The following datasets cannot be unlocked.": "Los siguientes conjuntos de datos no se pueden desbloquear.", "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.": "Los siguientes discos tienen pools exportados en ellos.\n El uso de esos discos va a hacer que los pools existentes en ellos no se puedan importar.\n Vas a perder todos los datos en los discos seleccionados.", @@ -5315,4 +5315,4 @@ "{used} of {total} ({used_pct})": "{used} de {total} ({used_pct})", "{version} is available!": "¡{version} ya está disponible!", "{view} on {enclosure}": "{view} en {enclosure}" -} +} \ No newline at end of file From 58f308a77b9e825446ffa90a2104c908856dd09b Mon Sep 17 00:00:00 2001 From: Alex Karpov Date: Sat, 4 Jan 2025 11:58:55 +0200 Subject: [PATCH 05/32] NAS-131275 / 25.04 / UI Search behavior: side menu does not close when search autonavigates to a different screen (#11257) * NAS-131275: UI Search behavior: side menu does not close when search autonavigates to a different screen * NAS-131275: UI Search behavior: side menu does not close when search autonavigates to a different screen * NAS-131275: PR Update --- .../ui-search/extract-ui-search-elements.ts | 4 + scripts/ui-search/parse-ui-search-elements.ts | 6 +- .../global-search-results.component.html | 2 +- .../global-search-results.component.spec.ts | 1 + .../global-search-results.component.ts | 2 - .../ui-searchable-element.interface.ts | 16 +- .../available-apps/available-apps.elements.ts | 1 + .../docker-images-list.elements.ts | 4 +- .../installed-apps/installed-apps.elements.ts | 1 + src/app/pages/audit/audit.elements.ts | 1 + .../backup-credentials.elements.ts | 4 +- .../certificates-dash.elements.ts | 4 +- .../groups/group-list/group-list.elements.ts | 1 + .../privilege-list/privilege-list.elements.ts | 4 +- .../pages/credentials/kmip/kmip.elements.ts | 4 +- .../users/user-list/user-list.elements.ts | 1 + .../dashboard/dashboard.elements.ts | 1 + .../cloud-backup-list.elements.ts | 1 + .../cloudsync-list/cloudsync-list.elements.ts | 1 + .../data-protection-dashboard.elements.ts | 1 + .../replication-list.elements.ts | 1 + .../rsync-task-list.elements.ts | 1 + .../resilver-config.elements.ts | 4 +- .../scrub-list/scrub-list.elements.ts | 1 + .../smart-task-list.elements.ts | 1 + .../snapshot-task-list.elements.ts | 1 + .../vmware-snapshot-list.elements.ts | 4 +- .../dataset-management.elements.ts | 4 +- .../idmap-list/idmap-list.elements.ts | 4 +- .../kerberos-keytabs-list.elements.ts | 4 +- .../kerberos-realms-list.elements.ts | 4 +- .../directory-services.elements.ts | 4 +- src/app/pages/jobs/jobs-list.elements.ts | 4 +- src/app/pages/network/network.elements.ts | 4 +- .../reporting-exporters-list.elements.ts | 4 +- .../reports-dashboard.elements.ts | 4 +- src/app/pages/services/services.elements.ts | 4 +- .../shares-dashboard.elements.ts | 1 + .../authorized-access-list.elements.ts | 4 +- .../extent-list/extent-list.elements.ts | 4 +- .../fibre-channel-ports.elements.ts | 4 +- .../initiator-form/initiator-form.elements.ts | 1 + .../initiator-list/initiator-list.elements.ts | 4 +- .../portal-list/portal-list.elements.ts | 4 +- .../target-list/target-list.elements.ts | 4 +- .../sharing/nfs/nfs-list/nfs-list.elements.ts | 4 +- .../nfs-session-list.elements.ts | 4 +- .../sharing/smb/smb-list/smb-list.elements.ts | 4 +- src/app/pages/shell/shell.elements.ts | 4 +- .../disk-list/disk-list.elements.ts | 1 + .../pages/storage/pools-dashboard.elements.ts | 1 + .../advanced/advanced-settings.elements.ts | 1 + .../cron/cron-list/cron-list.elements.ts | 4 +- .../init-shutdown-list.elements.ts | 4 +- .../tunable-list/tunable-list.elements.ts | 4 +- .../alert-service-list.elements.ts | 4 +- .../bootenv-list/bootenv-list.elements.ts | 4 +- .../bootenv-status/bootenv-status.elements.ts | 4 +- .../jbof-list/jbof-list.elements.ts | 4 +- .../failover-settings.elements.ts | 4 +- .../general-settings.elements.ts | 1 + .../support/eula/eula.elements.ts | 4 +- .../support-card/support-card.elements.ts | 4 +- .../manual-update-form.elements.ts | 4 +- .../two-factor-auth/two-factor.elements.ts | 4 +- src/app/pages/vm/vm-list.elements.ts | 1 + src/assets/i18n/ko.json | 186 +++++++++--------- src/assets/ui-searchable-elements.json | 114 +++++------ 68 files changed, 311 insertions(+), 197 deletions(-) diff --git a/scripts/ui-search/extract-ui-search-elements.ts b/scripts/ui-search/extract-ui-search-elements.ts index 226a766dc75..630ac066993 100644 --- a/scripts/ui-search/extract-ui-search-elements.ts +++ b/scripts/ui-search/extract-ui-search-elements.ts @@ -8,6 +8,10 @@ * 2️⃣. Create .elements.ts config file near the .component.html file ~ [pools-dashboard.elements.ts] * * Example of creating a new searchable element: + * + * !! It's required to add anchor to the element where you do not specify hierarchy explicitly !! + * You will get TS error if it's not provided correctly + * export const customSearchableElements = { hierarchy: [T('System'), T('Advanced Settings'), T('Access')], diff --git a/scripts/ui-search/parse-ui-search-elements.ts b/scripts/ui-search/parse-ui-search-elements.ts index 1ad6bf73c65..399761a6e9f 100644 --- a/scripts/ui-search/parse-ui-search-elements.ts +++ b/scripts/ui-search/parse-ui-search-elements.ts @@ -61,14 +61,16 @@ export function parseUiSearchElements( function createUiSearchElement( cheerioRoot$: (selector: CheerioElement | string) => { attr: (attr: string) => string }, element: CheerioElement, - elementConfig: UiSearchableElement, + elementConfig: Record, parentKey: keyof UiSearchableElement, childKey: keyof UiSearchableElement, componentProperties: Record, ): UiSearchableElement { try { const parent = (elementConfig?.[parentKey] || elementConfig) as UiSearchableElement; - const child = parent?.elements?.[childKey] || parent?.manualRenderElements?.[childKey] || {}; + const child = parent?.elements?.[childKey] + || parent?.manualRenderElements?.[childKey] + || {} as UiSearchableElement; const hierarchy = [...parent?.hierarchy || [], ...child?.hierarchy || []]; const visibleTokens = [...parent?.visibleTokens || [], ...child?.visibleTokens || []]; diff --git a/src/app/modules/global-search/components/global-search-results/global-search-results.component.html b/src/app/modules/global-search/components/global-search-results/global-search-results.component.html index 7459c816b5e..3b38bde1bc4 100644 --- a/src/app/modules/global-search/components/global-search-results/global-search-results.component.html +++ b/src/app/modules/global-search/components/global-search-results/global-search-results.component.html @@ -7,7 +7,7 @@

@if (getElementsBySection(section.value)?.length) {
@if (getLimitedSectionResults(section.value); as sectionResults) { - @for (result of sectionResults; track trackById(i, result); let i = $index) { + @for (result of sectionResults; track result.anchor; let i = $index) {
{ const mockResults: UiSearchableElement[] = [ ...['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'].map((adjustment) => ({ ...mockedUiElement, + anchor: adjustment, hierarchy: [...mockedUiElement.hierarchy, adjustment], })), ]; diff --git a/src/app/modules/global-search/components/global-search-results/global-search-results.component.ts b/src/app/modules/global-search/components/global-search-results/global-search-results.component.ts index d278c02a69b..348a562e5d4 100644 --- a/src/app/modules/global-search/components/global-search-results/global-search-results.component.ts +++ b/src/app/modules/global-search/components/global-search-results/global-search-results.component.ts @@ -12,7 +12,6 @@ import { Option } from 'app/interfaces/option.interface'; import { IxSimpleChanges } from 'app/interfaces/simple-changes.interface'; import { AuthService } from 'app/modules/auth/auth.service'; import { GlobalSearchSection } from 'app/modules/global-search/enums/global-search-section.enum'; -import { generateIdFromHierarchy } from 'app/modules/global-search/helpers/generate-id-from-hierarchy'; import { processHierarchy } from 'app/modules/global-search/helpers/process-hierarchy'; import { UiSearchableElement } from 'app/modules/global-search/interfaces/ui-searchable-element.interface'; import { GlobalSearchSectionsProvider } from 'app/modules/global-search/services/global-search-sections.service'; @@ -46,7 +45,6 @@ export class GlobalSearchResultsComponent implements OnChanges { readonly GlobalSearchSection = GlobalSearchSection; readonly initialResultsLimit = this.globalSearchSectionsProvider.globalSearchInitialLimit; readonly trackBySection: TrackByFunction> = (_, section) => section.value; - readonly trackById: TrackByFunction = (_, item) => generateIdFromHierarchy(item.hierarchy); processHierarchy = processHierarchy; diff --git a/src/app/modules/global-search/interfaces/ui-searchable-element.interface.ts b/src/app/modules/global-search/interfaces/ui-searchable-element.interface.ts index 2ecdd7a8411..d398b15c611 100644 --- a/src/app/modules/global-search/interfaces/ui-searchable-element.interface.ts +++ b/src/app/modules/global-search/interfaces/ui-searchable-element.interface.ts @@ -2,11 +2,9 @@ import { Role } from 'app/enums/role.enum'; import { GlobalSearchSection } from 'app/modules/global-search/enums/global-search-section.enum'; import { GlobalSearchVisibleToken } from 'app/modules/global-search/enums/global-search-visible-token.enum'; -export interface UiSearchableElement { - hierarchy?: string[]; +interface UiSearchableElementBase { section?: GlobalSearchSection; anchorRouterLink?: string[]; - anchor?: string; triggerAnchor?: string; synonyms?: string[]; requiredRoles?: Role[]; @@ -16,3 +14,15 @@ export interface UiSearchableElement { manualRenderElements?: Record; visibleTokens?: GlobalSearchVisibleToken[]; } + +export type UiSearchableElementWithHierarchy = UiSearchableElementBase & { + hierarchy: string[]; + anchor?: string; +}; + +export type UiSearchableElementWithAnchor = UiSearchableElementBase & { + hierarchy?: never; + anchor: string; +}; + +export type UiSearchableElement = UiSearchableElementWithHierarchy | UiSearchableElementWithAnchor; diff --git a/src/app/pages/apps/components/available-apps/available-apps.elements.ts b/src/app/pages/apps/components/available-apps/available-apps.elements.ts index 1467759ecad..9a314fd3496 100644 --- a/src/app/pages/apps/components/available-apps/available-apps.elements.ts +++ b/src/app/pages/apps/components/available-apps/available-apps.elements.ts @@ -7,6 +7,7 @@ export const availableAppsElements = { anchorRouterLink: ['/apps', 'available'], elements: { available: { + anchor: 'available-apps-list', synonyms: [T('Apps'), T('Applications')], }, }, diff --git a/src/app/pages/apps/components/docker-images/docker-images-list/docker-images-list.elements.ts b/src/app/pages/apps/components/docker-images/docker-images-list/docker-images-list.elements.ts index ba6189e99aa..5e78e0985b4 100644 --- a/src/app/pages/apps/components/docker-images/docker-images-list/docker-images-list.elements.ts +++ b/src/app/pages/apps/components/docker-images/docker-images-list/docker-images-list.elements.ts @@ -5,7 +5,9 @@ export const dockerImagesListElements = { hierarchy: [T('Applications'), T('Manage Container Images')], anchorRouterLink: ['/apps', 'manage-container-images'], elements: { - dockerImagesList: {}, + dockerImagesList: { + anchor: 'docker-images-list', + }, pullImage: { hierarchy: [T('Pull Image')], synonyms: [T('Add Image')], diff --git a/src/app/pages/apps/components/installed-apps/installed-apps.elements.ts b/src/app/pages/apps/components/installed-apps/installed-apps.elements.ts index 92194f65037..2db96a53d1c 100644 --- a/src/app/pages/apps/components/installed-apps/installed-apps.elements.ts +++ b/src/app/pages/apps/components/installed-apps/installed-apps.elements.ts @@ -7,6 +7,7 @@ export const installedAppsElements = { anchorRouterLink: ['/apps', 'installed'], elements: { installed: { + anchor: 'installed-apps-list', synonyms: [T('Apps'), T('Applications')], }, }, diff --git a/src/app/pages/audit/audit.elements.ts b/src/app/pages/audit/audit.elements.ts index e45a10af2f4..0edd064f6dd 100644 --- a/src/app/pages/audit/audit.elements.ts +++ b/src/app/pages/audit/audit.elements.ts @@ -6,6 +6,7 @@ export const auditElements = { anchorRouterLink: ['/system', 'audit'], elements: { audit: { + anchor: 'audit-list', synonyms: [T('Logs')], }, }, diff --git a/src/app/pages/credentials/backup-credentials/backup-credentials.elements.ts b/src/app/pages/credentials/backup-credentials/backup-credentials.elements.ts index 3bf5b1ea62e..6b2acd99b92 100644 --- a/src/app/pages/credentials/backup-credentials/backup-credentials.elements.ts +++ b/src/app/pages/credentials/backup-credentials/backup-credentials.elements.ts @@ -5,6 +5,8 @@ export const backupCredentialsElements = { hierarchy: [T('Credentials'), T('Backup Credentials')], anchorRouterLink: ['/credentials', 'backup-credentials'], elements: { - backupCredentials: {}, + backupCredentials: { + anchor: 'backup-credentials', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/credentials/certificates-dash/certificates-dash.elements.ts b/src/app/pages/credentials/certificates-dash/certificates-dash.elements.ts index e519ace3c6f..3f23b5411cb 100644 --- a/src/app/pages/credentials/certificates-dash/certificates-dash.elements.ts +++ b/src/app/pages/credentials/certificates-dash/certificates-dash.elements.ts @@ -5,6 +5,8 @@ export const certificatesDashElements = { hierarchy: [T('Credentials'), T('Certificates')], anchorRouterLink: ['/credentials', 'certificates'], elements: { - certificatesDash: {}, + certificatesDash: { + anchor: 'certificates-dash', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/credentials/groups/group-list/group-list.elements.ts b/src/app/pages/credentials/groups/group-list/group-list.elements.ts index 5786c8ccb5e..bc2118e5ab4 100644 --- a/src/app/pages/credentials/groups/group-list/group-list.elements.ts +++ b/src/app/pages/credentials/groups/group-list/group-list.elements.ts @@ -6,6 +6,7 @@ export const groupListElements = { anchorRouterLink: ['/credentials', 'groups'], elements: { list: { + anchor: 'groups-list', synonyms: [T('Local Groups')], }, add: { diff --git a/src/app/pages/credentials/groups/privilege/privilege-list/privilege-list.elements.ts b/src/app/pages/credentials/groups/privilege/privilege-list/privilege-list.elements.ts index 420b2e95c68..78d7ba70357 100644 --- a/src/app/pages/credentials/groups/privilege/privilege-list/privilege-list.elements.ts +++ b/src/app/pages/credentials/groups/privilege/privilege-list/privilege-list.elements.ts @@ -5,7 +5,9 @@ export const privilegesListElements = { hierarchy: [T('Credentials'), T('Groups'), T('Privileges')], anchorRouterLink: ['/credentials', 'groups', 'privileges'], elements: { - list: {}, + list: { + anchor: 'privileges-list', + }, add: { hierarchy: [T('Add Privilege')], synonyms: [T('Add Privilege'), T('New Privilege'), T('Create Privilege'), T('Privilege')], diff --git a/src/app/pages/credentials/kmip/kmip.elements.ts b/src/app/pages/credentials/kmip/kmip.elements.ts index e76c2906f82..1624651154d 100644 --- a/src/app/pages/credentials/kmip/kmip.elements.ts +++ b/src/app/pages/credentials/kmip/kmip.elements.ts @@ -5,6 +5,8 @@ export const kmipElements = { hierarchy: [T('Credentials'), T('KMIP')], anchorRouterLink: ['/credentials', 'kmip'], elements: { - kmip: {}, + kmip: { + anchor: 'kmip', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/credentials/users/user-list/user-list.elements.ts b/src/app/pages/credentials/users/user-list/user-list.elements.ts index dc14ea485fb..f6f50c43ae1 100644 --- a/src/app/pages/credentials/users/user-list/user-list.elements.ts +++ b/src/app/pages/credentials/users/user-list/user-list.elements.ts @@ -6,6 +6,7 @@ export const userListElements = { anchorRouterLink: ['/credentials', 'users'], elements: { list: { + anchor: 'users-list', synonyms: [ T('Local Users'), T('Users'), diff --git a/src/app/pages/dashboard/components/dashboard/dashboard.elements.ts b/src/app/pages/dashboard/components/dashboard/dashboard.elements.ts index de0e3e1ccf2..340c14e9a3a 100644 --- a/src/app/pages/dashboard/components/dashboard/dashboard.elements.ts +++ b/src/app/pages/dashboard/components/dashboard/dashboard.elements.ts @@ -6,6 +6,7 @@ export const dashboardElements = { anchorRouterLink: ['/dashboard'], elements: { dashboard: { + anchor: 'main-dashboard', synonyms: [T('Widgets')], }, configure: { diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-list/cloud-backup-list.elements.ts b/src/app/pages/data-protection/cloud-backup/cloud-backup-list/cloud-backup-list.elements.ts index 128abf3e0a8..fc24ce65cdd 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-list/cloud-backup-list.elements.ts +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-list/cloud-backup-list.elements.ts @@ -6,6 +6,7 @@ export const cloudBackupListElements = { anchorRouterLink: ['/data-protection', 'cloud-backup'], elements: { tasks: { + anchor: 'cloud-backup-tasks', synonyms: [T('Data Protection'), T('Tasks'), T('Cloud Backup')], }, add: { diff --git a/src/app/pages/data-protection/cloudsync/cloudsync-list/cloudsync-list.elements.ts b/src/app/pages/data-protection/cloudsync/cloudsync-list/cloudsync-list.elements.ts index eca3dda15b9..a8f0800ac52 100644 --- a/src/app/pages/data-protection/cloudsync/cloudsync-list/cloudsync-list.elements.ts +++ b/src/app/pages/data-protection/cloudsync/cloudsync-list/cloudsync-list.elements.ts @@ -6,6 +6,7 @@ export const cloudSyncListElements = { anchorRouterLink: ['/data-protection', 'cloudsync'], elements: { tasks: { + anchor: 'cloudsync-tasks', synonyms: [ T('Data Protection'), T('Tasks'), diff --git a/src/app/pages/data-protection/data-protection-dashboard.elements.ts b/src/app/pages/data-protection/data-protection-dashboard.elements.ts index 3a5828ad12d..a1f9a4c5023 100644 --- a/src/app/pages/data-protection/data-protection-dashboard.elements.ts +++ b/src/app/pages/data-protection/data-protection-dashboard.elements.ts @@ -6,6 +6,7 @@ export const dataProtectionDashboardElements = { anchorRouterLink: ['/data-protection'], elements: { dashboard: { + anchor: 'data-protection-dashboard', synonyms: [T('Tasks')], }, }, diff --git a/src/app/pages/data-protection/replication/replication-list/replication-list.elements.ts b/src/app/pages/data-protection/replication/replication-list/replication-list.elements.ts index 7d91310d51c..fe61644a1ca 100644 --- a/src/app/pages/data-protection/replication/replication-list/replication-list.elements.ts +++ b/src/app/pages/data-protection/replication/replication-list/replication-list.elements.ts @@ -6,6 +6,7 @@ export const replicationListElements = { anchorRouterLink: ['/data-protection', 'replication'], elements: { tasks: { + anchor: 'replication-tasks', synonyms: [T('Data Protection'), T('Tasks')], }, add: { diff --git a/src/app/pages/data-protection/rsync-task/rsync-task-list/rsync-task-list.elements.ts b/src/app/pages/data-protection/rsync-task/rsync-task-list/rsync-task-list.elements.ts index 33e52becfeb..42346e26110 100644 --- a/src/app/pages/data-protection/rsync-task/rsync-task-list/rsync-task-list.elements.ts +++ b/src/app/pages/data-protection/rsync-task/rsync-task-list/rsync-task-list.elements.ts @@ -6,6 +6,7 @@ export const rsyncTaskListElements = { anchorRouterLink: ['/data-protection', 'rsync'], elements: { tasks: { + anchor: 'rsync-tasks', synonyms: [T('Data Protection'), T('Tasks')], }, add: { diff --git a/src/app/pages/data-protection/scrub-task/resilver-config/resilver-config.elements.ts b/src/app/pages/data-protection/scrub-task/resilver-config/resilver-config.elements.ts index e9bfb805dfa..64ccdabea9e 100644 --- a/src/app/pages/data-protection/scrub-task/resilver-config/resilver-config.elements.ts +++ b/src/app/pages/data-protection/scrub-task/resilver-config/resilver-config.elements.ts @@ -6,6 +6,8 @@ export const resilverConfigElements = { synonyms: [T('Data Protection'), T('Scrub Tasks')], anchorRouterLink: ['/data-protection', 'scrub', 'priority'], elements: { - priority: {}, + priority: { + anchor: 'scrub-priority', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/data-protection/scrub-task/scrub-list/scrub-list.elements.ts b/src/app/pages/data-protection/scrub-task/scrub-list/scrub-list.elements.ts index 5a89946bd88..66725b2611e 100644 --- a/src/app/pages/data-protection/scrub-task/scrub-list/scrub-list.elements.ts +++ b/src/app/pages/data-protection/scrub-task/scrub-list/scrub-list.elements.ts @@ -6,6 +6,7 @@ export const scrubListElements = { anchorRouterLink: ['/data-protection', 'scrub'], elements: { tasks: { + anchor: 'scrub-tasks', synonyms: [T('Data Protection'), T('Tasks')], }, add: { diff --git a/src/app/pages/data-protection/smart-task/smart-task-list/smart-task-list.elements.ts b/src/app/pages/data-protection/smart-task/smart-task-list/smart-task-list.elements.ts index 31ad7cc61b3..d0047245126 100644 --- a/src/app/pages/data-protection/smart-task/smart-task-list/smart-task-list.elements.ts +++ b/src/app/pages/data-protection/smart-task/smart-task-list/smart-task-list.elements.ts @@ -6,6 +6,7 @@ export const smartTaskListElements = { anchorRouterLink: ['/data-protection', 'smart'], elements: { tasks: { + anchor: 'smart-tasks', synonyms: [ T('Data Protection'), T('Tasks'), diff --git a/src/app/pages/data-protection/snapshot-task/snapshot-task-list/snapshot-task-list.elements.ts b/src/app/pages/data-protection/snapshot-task/snapshot-task-list/snapshot-task-list.elements.ts index c9773fc51c2..d6dac7b2009 100644 --- a/src/app/pages/data-protection/snapshot-task/snapshot-task-list/snapshot-task-list.elements.ts +++ b/src/app/pages/data-protection/snapshot-task/snapshot-task-list/snapshot-task-list.elements.ts @@ -6,6 +6,7 @@ export const snapshotTaskListElements = { anchorRouterLink: ['/data-protection', 'snapshot'], elements: { tasks: { + anchor: 'snapshot-tasks', synonyms: [T('Data Protection'), T('Tasks')], }, add: { diff --git a/src/app/pages/data-protection/vmware-snapshot/vmware-snapshot-list/vmware-snapshot-list.elements.ts b/src/app/pages/data-protection/vmware-snapshot/vmware-snapshot-list/vmware-snapshot-list.elements.ts index 9c85d499b52..2d90371b92c 100644 --- a/src/app/pages/data-protection/vmware-snapshot/vmware-snapshot-list/vmware-snapshot-list.elements.ts +++ b/src/app/pages/data-protection/vmware-snapshot/vmware-snapshot-list/vmware-snapshot-list.elements.ts @@ -5,6 +5,8 @@ export const vmwareSnapshotListElements = { hierarchy: [T('Data Protection'), T('VMware Snapshots')], anchorRouterLink: ['/data-protection', 'vmware-snapshots'], elements: { - vmwareSnapshots: {}, + vmwareSnapshots: { + anchor: 'vmware-snapshots', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/datasets/components/dataset-management/dataset-management.elements.ts b/src/app/pages/datasets/components/dataset-management/dataset-management.elements.ts index 4b475bff41b..fd2fa98ccff 100644 --- a/src/app/pages/datasets/components/dataset-management/dataset-management.elements.ts +++ b/src/app/pages/datasets/components/dataset-management/dataset-management.elements.ts @@ -6,6 +6,8 @@ export const datasetManagementElements = { anchorRouterLink: ['/datasets'], synonyms: [T('Manage Datasets')], elements: { - datasets: {}, + datasets: { + anchor: 'datasets', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/directory-service/components/idmap-list/idmap-list.elements.ts b/src/app/pages/directory-service/components/idmap-list/idmap-list.elements.ts index 6da67e60c6d..99f3c50d8cd 100644 --- a/src/app/pages/directory-service/components/idmap-list/idmap-list.elements.ts +++ b/src/app/pages/directory-service/components/idmap-list/idmap-list.elements.ts @@ -5,7 +5,9 @@ export const idMapElements = { hierarchy: [T('Directory Services'), T('Idmap')], anchorRouterLink: ['/directoryservice', 'idmap'], elements: { - idMap: {}, + idMap: { + anchor: 'idmap', + }, add: { hierarchy: [T('Add Idmap')], anchor: 'add-idmap', diff --git a/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-list/kerberos-keytabs-list.elements.ts b/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-list/kerberos-keytabs-list.elements.ts index c06a04ac64a..d036ea8fc57 100644 --- a/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-list/kerberos-keytabs-list.elements.ts +++ b/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-list/kerberos-keytabs-list.elements.ts @@ -5,7 +5,9 @@ export const kerberosKeytabsListElements = { hierarchy: [T('Directory Services'), T('Kerberos Keytabs')], anchorRouterLink: ['/directoryservice', 'kerberoskeytabs'], elements: { - kerberosKeytabs: {}, + kerberosKeytabs: { + anchor: 'kerberoskeytabs', + }, add: { hierarchy: [T('Add Kerberos Keytab')], anchor: 'add-kerberos-keytab', diff --git a/src/app/pages/directory-service/components/kerberos-realms/kerberos-realms-list.elements.ts b/src/app/pages/directory-service/components/kerberos-realms/kerberos-realms-list.elements.ts index 150a84638bf..a0ba9ca2a7e 100644 --- a/src/app/pages/directory-service/components/kerberos-realms/kerberos-realms-list.elements.ts +++ b/src/app/pages/directory-service/components/kerberos-realms/kerberos-realms-list.elements.ts @@ -5,7 +5,9 @@ export const kerberosRealmsListElements = { hierarchy: [T('Directory Services'), T('Kerberos Realms')], anchorRouterLink: ['/directoryservice', 'kerberosrealms'], elements: { - kerberosRealms: {}, + kerberosRealms: { + anchor: 'kerberosrealms', + }, add: { hierarchy: [T('Add Kerberos Realm')], anchor: 'add-kerberos-realm', diff --git a/src/app/pages/directory-service/directory-services.elements.ts b/src/app/pages/directory-service/directory-services.elements.ts index 43383bfd23e..85414bf471d 100644 --- a/src/app/pages/directory-service/directory-services.elements.ts +++ b/src/app/pages/directory-service/directory-services.elements.ts @@ -5,7 +5,9 @@ export const directoryServicesElements = { hierarchy: [T('Credentials'), T('Directory Services')], anchorRouterLink: ['/credentials', 'directory-services'], elements: { - directoryServices: {}, + directoryServices: { + anchor: 'directory-services', + }, configureActiveDirectory: { hierarchy: [T('Configure Active Directory')], synonyms: [T('Active Directory')], diff --git a/src/app/pages/jobs/jobs-list.elements.ts b/src/app/pages/jobs/jobs-list.elements.ts index 04ed0a1e176..33e0c88df7e 100644 --- a/src/app/pages/jobs/jobs-list.elements.ts +++ b/src/app/pages/jobs/jobs-list.elements.ts @@ -6,6 +6,8 @@ export const jobsListElements = { anchorRouterLink: ['/jobs'], synonyms: [T('Jobs History'), T('Completed Jobs'), T('Failed Jobs'), T('Jobs in progress'), T('History')], elements: { - jobs: {}, + jobs: { + anchor: 'jobs', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/network/network.elements.ts b/src/app/pages/network/network.elements.ts index 731dcf481ea..440952b18aa 100644 --- a/src/app/pages/network/network.elements.ts +++ b/src/app/pages/network/network.elements.ts @@ -5,6 +5,8 @@ export const networkElements = { hierarchy: [T('Network')], anchorRouterLink: ['/network'], elements: { - network: {}, + network: { + anchor: 'network-dashboard', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.elements.ts b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.elements.ts index 9b56e7e440c..c39f37aebdf 100644 --- a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.elements.ts +++ b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.elements.ts @@ -5,7 +5,9 @@ export const reportingExportersElements = { hierarchy: [T('Reporting'), T('Reporting Exporters')], anchorRouterLink: ['/reportsdashboard', 'exporters'], elements: { - exporters: {}, + exporters: { + anchor: 'exporters', + }, add: { hierarchy: [T('Add Reporting Exporter')], anchor: 'add-reporting-exporter', diff --git a/src/app/pages/reports-dashboard/reports-dashboard.elements.ts b/src/app/pages/reports-dashboard/reports-dashboard.elements.ts index a8b9d25d566..fcda59ec0c3 100644 --- a/src/app/pages/reports-dashboard/reports-dashboard.elements.ts +++ b/src/app/pages/reports-dashboard/reports-dashboard.elements.ts @@ -6,6 +6,8 @@ export const reportingElements = { synonyms: [T('Stats')], anchorRouterLink: ['/reportsdashboard'], elements: { - reporting: {}, + reporting: { + anchor: 'reports-dashboard', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/services/services.elements.ts b/src/app/pages/services/services.elements.ts index 721a0cf75b8..57830a176cd 100644 --- a/src/app/pages/services/services.elements.ts +++ b/src/app/pages/services/services.elements.ts @@ -5,7 +5,9 @@ export const servicesElements = { hierarchy: [T('System'), T('Services')], anchorRouterLink: ['/system', 'services'], elements: { - services: {}, + services: { + anchor: 'services', + }, }, manualRenderElements: { smb: { diff --git a/src/app/pages/sharing/components/shares-dashboard/shares-dashboard.elements.ts b/src/app/pages/sharing/components/shares-dashboard/shares-dashboard.elements.ts index 9166af52e8c..b15e83990c4 100644 --- a/src/app/pages/sharing/components/shares-dashboard/shares-dashboard.elements.ts +++ b/src/app/pages/sharing/components/shares-dashboard/shares-dashboard.elements.ts @@ -7,6 +7,7 @@ export const sharesDashboardElements = { anchorRouterLink: ['/sharing'], elements: { sharing: { + anchor: 'shares-dashboard', synonyms: [ T('Shares'), T('Add Share'), diff --git a/src/app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.elements.ts b/src/app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.elements.ts index ab29be003c7..f73243d617d 100644 --- a/src/app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.elements.ts +++ b/src/app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.elements.ts @@ -5,6 +5,8 @@ export const authorizedAccessListElements = { hierarchy: [T('Shares'), T('iSCSI'), T('Authorized Access')], anchorRouterLink: ['/sharing', 'iscsi', 'authorized-access'], elements: { - list: {}, + list: { + anchor: 'authorized-access-list', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/sharing/iscsi/extent/extent-list/extent-list.elements.ts b/src/app/pages/sharing/iscsi/extent/extent-list/extent-list.elements.ts index a357123b33c..9418aca6cb7 100644 --- a/src/app/pages/sharing/iscsi/extent/extent-list/extent-list.elements.ts +++ b/src/app/pages/sharing/iscsi/extent/extent-list/extent-list.elements.ts @@ -5,6 +5,8 @@ export const extentListElements = { hierarchy: [T('Shares'), T('iSCSI'), T('Extents')], anchorRouterLink: ['/sharing', 'iscsi', 'extents'], elements: { - list: {}, + list: { + anchor: 'extent-list', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/sharing/iscsi/fibre-channel-ports/fibre-channel-ports.elements.ts b/src/app/pages/sharing/iscsi/fibre-channel-ports/fibre-channel-ports.elements.ts index 668c399d92e..ae57ee1cc1d 100644 --- a/src/app/pages/sharing/iscsi/fibre-channel-ports/fibre-channel-ports.elements.ts +++ b/src/app/pages/sharing/iscsi/fibre-channel-ports/fibre-channel-ports.elements.ts @@ -5,6 +5,8 @@ export const fibreChannelPortsElements = { hierarchy: [T('Shares'), T('iSCSI'), T('Fibre Channel Ports')], anchorRouterLink: ['/sharing', 'iscsi', 'fibre-channel-ports'], elements: { - list: {}, + list: { + anchor: 'fibre-channel-ports-list', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/sharing/iscsi/initiator/initiator-form/initiator-form.elements.ts b/src/app/pages/sharing/iscsi/initiator/initiator-form/initiator-form.elements.ts index ec644285a9b..54ef5d0557c 100644 --- a/src/app/pages/sharing/iscsi/initiator/initiator-form/initiator-form.elements.ts +++ b/src/app/pages/sharing/iscsi/initiator/initiator-form/initiator-form.elements.ts @@ -6,6 +6,7 @@ export const initiatorFormElements = { anchorRouterLink: ['/sharing', 'iscsi', 'initiators', 'add'], elements: { addInitiator: { + anchor: 'add-initiator', synonyms: [T('Initiators')], }, }, diff --git a/src/app/pages/sharing/iscsi/initiator/initiator-list/initiator-list.elements.ts b/src/app/pages/sharing/iscsi/initiator/initiator-list/initiator-list.elements.ts index 00b4f5ccc27..b4e117c664c 100644 --- a/src/app/pages/sharing/iscsi/initiator/initiator-list/initiator-list.elements.ts +++ b/src/app/pages/sharing/iscsi/initiator/initiator-list/initiator-list.elements.ts @@ -6,6 +6,8 @@ export const initiatorListElements = { synonyms: [T('Initiator Group')], anchorRouterLink: ['/sharing', 'iscsi', 'initiators'], elements: { - list: {}, + list: { + anchor: 'initiator-list', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/sharing/iscsi/portal/portal-list/portal-list.elements.ts b/src/app/pages/sharing/iscsi/portal/portal-list/portal-list.elements.ts index 180ff6e61b5..1dd19b8d5c5 100644 --- a/src/app/pages/sharing/iscsi/portal/portal-list/portal-list.elements.ts +++ b/src/app/pages/sharing/iscsi/portal/portal-list/portal-list.elements.ts @@ -5,6 +5,8 @@ export const portalListElements = { hierarchy: [T('Shares'), T('iSCSI'), T('Portals')], anchorRouterLink: ['/sharing', 'iscsi', 'portals'], elements: { - list: {}, + list: { + anchor: 'portal-list', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/sharing/iscsi/target/all-targets/target-list/target-list.elements.ts b/src/app/pages/sharing/iscsi/target/all-targets/target-list/target-list.elements.ts index 339039f55bc..f3ebfe1415c 100644 --- a/src/app/pages/sharing/iscsi/target/all-targets/target-list/target-list.elements.ts +++ b/src/app/pages/sharing/iscsi/target/all-targets/target-list/target-list.elements.ts @@ -5,6 +5,8 @@ export const targetListElements = { hierarchy: [T('Shares'), T('iSCSI'), T('Targets')], anchorRouterLink: ['/sharing', 'iscsi', 'targets'], elements: { - list: {}, + list: { + anchor: 'target-list', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/sharing/nfs/nfs-list/nfs-list.elements.ts b/src/app/pages/sharing/nfs/nfs-list/nfs-list.elements.ts index bb62f6894c0..65e0b9a0a9d 100644 --- a/src/app/pages/sharing/nfs/nfs-list/nfs-list.elements.ts +++ b/src/app/pages/sharing/nfs/nfs-list/nfs-list.elements.ts @@ -5,7 +5,9 @@ export const nfsListElements = { hierarchy: [T('Shares'), T('NFS')], anchorRouterLink: ['/sharing', 'nfs'], elements: { - nfs: {}, + nfs: { + anchor: 'nfs-list', + }, createNfsShare: { hierarchy: [T('Add NFS Share')], synonyms: [ diff --git a/src/app/pages/sharing/nfs/nfs-session-list/nfs-session-list.elements.ts b/src/app/pages/sharing/nfs/nfs-session-list/nfs-session-list.elements.ts index b312c8c166a..d62ac197930 100644 --- a/src/app/pages/sharing/nfs/nfs-session-list/nfs-session-list.elements.ts +++ b/src/app/pages/sharing/nfs/nfs-session-list/nfs-session-list.elements.ts @@ -5,6 +5,8 @@ export const nfsSessionListElements = { hierarchy: [T('Shares'), T('NFS'), T('NFS Sessions')], anchorRouterLink: ['/sharing', 'nfs', 'sessions'], elements: { - nfsSessions: {}, + nfsSessions: { + anchor: 'nfs-session-list', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/sharing/smb/smb-list/smb-list.elements.ts b/src/app/pages/sharing/smb/smb-list/smb-list.elements.ts index 9e53939eb8c..6dc461a3b35 100644 --- a/src/app/pages/sharing/smb/smb-list/smb-list.elements.ts +++ b/src/app/pages/sharing/smb/smb-list/smb-list.elements.ts @@ -6,7 +6,9 @@ export const smbListElements = { anchorRouterLink: ['/sharing', 'smb'], synonyms: [T('Samba')], elements: { - smbList: {}, + smbList: { + anchor: 'smb-list', + }, createSmbShare: { hierarchy: [T('Add SMB Share')], synonyms: diff --git a/src/app/pages/shell/shell.elements.ts b/src/app/pages/shell/shell.elements.ts index 6050b469a51..c635e4dcecd 100644 --- a/src/app/pages/shell/shell.elements.ts +++ b/src/app/pages/shell/shell.elements.ts @@ -6,6 +6,8 @@ export const shellElements = { anchorRouterLink: ['/system', 'shell'], synonyms: [T('CLI'), T('Terminal'), T('Console'), T('Command Line Interface'), T('Prompt')], elements: { - shell: {}, + shell: { + anchor: 'shell', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/storage/modules/disks/components/disk-list/disk-list.elements.ts b/src/app/pages/storage/modules/disks/components/disk-list/disk-list.elements.ts index 0d84f6beb54..27bd0937294 100644 --- a/src/app/pages/storage/modules/disks/components/disk-list/disk-list.elements.ts +++ b/src/app/pages/storage/modules/disks/components/disk-list/disk-list.elements.ts @@ -6,6 +6,7 @@ export const diskListElements = { anchorRouterLink: ['/storage', 'disks'], elements: { disks: { + anchor: 'disk-list', synonyms: [T('Manage Disks')], }, }, diff --git a/src/app/pages/storage/pools-dashboard.elements.ts b/src/app/pages/storage/pools-dashboard.elements.ts index 9ac5df08cae..992e8e04c0d 100644 --- a/src/app/pages/storage/pools-dashboard.elements.ts +++ b/src/app/pages/storage/pools-dashboard.elements.ts @@ -6,6 +6,7 @@ export const storageElements = { hierarchy: [T('Storage')], elements: { storageDashboard: { + anchor: 'storage-dashboard', synonyms: [ T('Pools'), T('Storage Dashboard'), diff --git a/src/app/pages/system/advanced/advanced-settings.elements.ts b/src/app/pages/system/advanced/advanced-settings.elements.ts index bbc7e7ddee7..59aa0e6d31e 100644 --- a/src/app/pages/system/advanced/advanced-settings.elements.ts +++ b/src/app/pages/system/advanced/advanced-settings.elements.ts @@ -6,6 +6,7 @@ export const advancedSettingsElements = { anchorRouterLink: ['/system', 'advanced'], elements: { advanced: { + anchor: 'advanced-settings', synonyms: [T('Settings')], }, }, diff --git a/src/app/pages/system/advanced/cron/cron-list/cron-list.elements.ts b/src/app/pages/system/advanced/cron/cron-list/cron-list.elements.ts index e3fe18ec942..e3d9f00bcdc 100644 --- a/src/app/pages/system/advanced/cron/cron-list/cron-list.elements.ts +++ b/src/app/pages/system/advanced/cron/cron-list/cron-list.elements.ts @@ -5,6 +5,8 @@ export const cronElements = { hierarchy: [T('System'), T('Cron Jobs')], anchorRouterLink: ['/system', 'cron'], elements: { - cron: {}, + cron: { + anchor: 'cron', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/system/advanced/init-shutdown/init-shutdown-list/init-shutdown-list.elements.ts b/src/app/pages/system/advanced/init-shutdown/init-shutdown-list/init-shutdown-list.elements.ts index 970d48f70d1..7dbc27e9604 100644 --- a/src/app/pages/system/advanced/init-shutdown/init-shutdown-list/init-shutdown-list.elements.ts +++ b/src/app/pages/system/advanced/init-shutdown/init-shutdown-list/init-shutdown-list.elements.ts @@ -5,6 +5,8 @@ export const initShudownListElements = { hierarchy: [T('System'), T('Init/Shutdown Scripts')], anchorRouterLink: ['/system', 'initshutdown'], elements: { - initShutDown: {}, + initShutDown: { + anchor: 'init-shutdown', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/system/advanced/sysctl/tunable-list/tunable-list.elements.ts b/src/app/pages/system/advanced/sysctl/tunable-list/tunable-list.elements.ts index ac8e94630ab..cc594416b7c 100644 --- a/src/app/pages/system/advanced/sysctl/tunable-list/tunable-list.elements.ts +++ b/src/app/pages/system/advanced/sysctl/tunable-list/tunable-list.elements.ts @@ -5,6 +5,8 @@ export const tunableListElements = { hierarchy: [T('System'), T('Tunables')], anchorRouterLink: ['/system', 'tunable'], elements: { - tunables: {}, + tunables: { + anchor: 'tunable', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/system/alert-service/alert-service-list/alert-service-list.elements.ts b/src/app/pages/system/alert-service/alert-service-list/alert-service-list.elements.ts index 4c785f90442..18ed2c25642 100644 --- a/src/app/pages/system/alert-service/alert-service-list/alert-service-list.elements.ts +++ b/src/app/pages/system/alert-service/alert-service-list/alert-service-list.elements.ts @@ -6,7 +6,9 @@ export const alertServiceListElements = { anchorRouterLink: ['/system', 'alert-settings', 'services'], synonyms: [T('Alerts'), T('Configure Notifications'), T('Configure Alerts')], elements: { - alertServiceList: {}, + alertServiceList: { + anchor: 'alert-service-list', + }, add: { hierarchy: [T('Add Alert')], anchor: 'add-alert-service', diff --git a/src/app/pages/system/bootenv/bootenv-list/bootenv-list.elements.ts b/src/app/pages/system/bootenv/bootenv-list/bootenv-list.elements.ts index 99e904fd58d..b00a3cf0ce9 100644 --- a/src/app/pages/system/bootenv/bootenv-list/bootenv-list.elements.ts +++ b/src/app/pages/system/bootenv/bootenv-list/bootenv-list.elements.ts @@ -6,7 +6,9 @@ export const bootListElements = { anchorRouterLink: ['/system', 'boot'], synonyms: [T('Create boot environment')], elements: { - boot: {}, + boot: { + anchor: 'boot-list', + }, stats: { hierarchy: [T('Stats/Settings')], }, diff --git a/src/app/pages/system/bootenv/bootenv-status/bootenv-status.elements.ts b/src/app/pages/system/bootenv/bootenv-status/bootenv-status.elements.ts index afe76e04b59..ff261ab52a7 100644 --- a/src/app/pages/system/bootenv/bootenv-status/bootenv-status.elements.ts +++ b/src/app/pages/system/bootenv/bootenv-status/bootenv-status.elements.ts @@ -5,6 +5,8 @@ export const bootEnvStatusElements = { hierarchy: [T('System'), T('Boot'), T('Boot Pool Status')], anchorRouterLink: ['/system', 'boot', 'status'], elements: { - bootStatus: {}, + bootStatus: { + anchor: 'boot-status', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/system/enclosure/components/jbof-list/jbof-list.elements.ts b/src/app/pages/system/enclosure/components/jbof-list/jbof-list.elements.ts index ac2b345f171..d8ed9d1faa0 100644 --- a/src/app/pages/system/enclosure/components/jbof-list/jbof-list.elements.ts +++ b/src/app/pages/system/enclosure/components/jbof-list/jbof-list.elements.ts @@ -6,7 +6,9 @@ export const jbofListElements = { hierarchy: [T('System'), T('View Enclosure'), T('NVMe-oF Expansion Shelves')], anchorRouterLink: ['/system', 'viewenclosure', 'jbof'], elements: { - jbof: {}, + jbof: { + anchor: 'jbof', + }, }, visibleTokens: [GlobalSearchVisibleToken.Enclosure], } satisfies UiSearchableElement; diff --git a/src/app/pages/system/failover-settings/failover-settings.elements.ts b/src/app/pages/system/failover-settings/failover-settings.elements.ts index 3adb3bb9f87..e63e5185af9 100644 --- a/src/app/pages/system/failover-settings/failover-settings.elements.ts +++ b/src/app/pages/system/failover-settings/failover-settings.elements.ts @@ -6,7 +6,9 @@ export const failoverElements = { hierarchy: [T('System'), T('Failover')], anchorRouterLink: ['/system', 'failover'], elements: { - failover: {}, + failover: { + anchor: 'failover', + }, syncToPeer: { hierarchy: [T('Sync To Peer')], }, diff --git a/src/app/pages/system/general-settings/general-settings.elements.ts b/src/app/pages/system/general-settings/general-settings.elements.ts index 8977c68955a..2f5724636f4 100644 --- a/src/app/pages/system/general-settings/general-settings.elements.ts +++ b/src/app/pages/system/general-settings/general-settings.elements.ts @@ -6,6 +6,7 @@ export const generalSettingsElements = { anchorRouterLink: ['/system', 'general'], elements: { general: { + anchor: 'general-settings', synonyms: [T('Settings')], }, }, diff --git a/src/app/pages/system/general-settings/support/eula/eula.elements.ts b/src/app/pages/system/general-settings/support/eula/eula.elements.ts index 0fa89935564..5e82dfb69b2 100644 --- a/src/app/pages/system/general-settings/support/eula/eula.elements.ts +++ b/src/app/pages/system/general-settings/support/eula/eula.elements.ts @@ -5,6 +5,8 @@ export const eulaElements = { hierarchy: [T('System'), T('Support'), T('Eula')], anchorRouterLink: ['/system', 'support', 'eula'], elements: { - eula: {}, + eula: { + anchor: 'eula', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/system/general-settings/support/support-card/support-card.elements.ts b/src/app/pages/system/general-settings/support/support-card/support-card.elements.ts index e1e0205aa20..90f84451109 100644 --- a/src/app/pages/system/general-settings/support/support-card/support-card.elements.ts +++ b/src/app/pages/system/general-settings/support/support-card/support-card.elements.ts @@ -5,7 +5,9 @@ export const supportCardElements = { hierarchy: [T('System'), T('Support')], anchorRouterLink: ['/system', 'support'], elements: { - support: {}, + support: { + anchor: 'support', + }, updateLicense: { hierarchy: [T('License')], synonyms: [ diff --git a/src/app/pages/system/update/components/manual-update-form/manual-update-form.elements.ts b/src/app/pages/system/update/components/manual-update-form/manual-update-form.elements.ts index 8857f48aaa1..ebe5665a36e 100644 --- a/src/app/pages/system/update/components/manual-update-form/manual-update-form.elements.ts +++ b/src/app/pages/system/update/components/manual-update-form/manual-update-form.elements.ts @@ -6,6 +6,8 @@ export const systemManualUpdateFormElements = { anchorRouterLink: ['/system', 'update', 'manualupdate'], synonyms: [T('Install Manual Update File'), T('Manual Update'), T('Manual Upgrade'), T('Upload Manual Update File')], elements: { - manualUpdate: {}, + manualUpdate: { + anchor: 'manual-update', + }, }, } satisfies UiSearchableElement; diff --git a/src/app/pages/two-factor-auth/two-factor.elements.ts b/src/app/pages/two-factor-auth/two-factor.elements.ts index 8a7d8232027..5b710f1bf83 100644 --- a/src/app/pages/two-factor-auth/two-factor.elements.ts +++ b/src/app/pages/two-factor-auth/two-factor.elements.ts @@ -5,7 +5,9 @@ export const twoFactorElements = { hierarchy: [T('Credentials'), T('Two-Factor Authentication')], anchorRouterLink: ['/credentials', 'two-factor'], elements: { - twoFactor: {}, + twoFactor: { + anchor: 'two-factor', + }, configure2FaSecret: { hierarchy: [T('Configure 2FA Secret')], anchor: 'configure-2fa-secret', diff --git a/src/app/pages/vm/vm-list.elements.ts b/src/app/pages/vm/vm-list.elements.ts index 39d8cb3ea59..ee79d63a8f9 100644 --- a/src/app/pages/vm/vm-list.elements.ts +++ b/src/app/pages/vm/vm-list.elements.ts @@ -7,6 +7,7 @@ export const vmListElements = { anchorRouterLink: ['/vm'], elements: { vm: { + anchor: 'vm-list', synonyms: [T('VM'), T('Virtualization')], }, add: { diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index 24d8be1229b..7f614eab07e 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -207,7 +207,6 @@ "LBA of First Error": "", "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.": "", - "LONG": "LONG", "Leave at the default of 512 unless the initiator requires a different block size.": "", "Leave blank to allow all or enter a list of initiator hostnames. Separate entries by pressing Enter.": "", "Leave empty for default (OpsGenie API)": "", @@ -244,7 +243,6 @@ "Method": "", "Method Call": "", "Metrics": "", - "MiB": "MiB", "Microsoft Azure": "", "Microsoft Onedrive Access Token. Log in to the Microsoft account to add an access token.": "", "Minimum Passive Port": "", @@ -254,26 +252,7 @@ "Mutual secret password. Required when Peer User is set. Must be different than the Secret.": "", "NIC modifications are currently restricted due to pending network changes.": "", "NIC selection is currently restricted due to pending network changes.": "", - "NIC was added": "NIC 추가함", - "Name must start and end with a lowercase alphanumeric character. Hyphen is allowed in the middle e.g abc123, abc, abcd-1232": "이름은 반드시 알파벳 소문자로 시작하고 끝나야 합니다. 하이픈(-)은 중간에 사용할 수 있습니다(예: abc123, abc, abcd-1232).", - "Name of the WebDAV site, service, or software being used.": "사용중인 WebDAV 사이트, 서비스 또는 소프트웨어의 이름입니다.", - "Name of the new alert service.": "새로운 경고 서비스의 이름입니다.", - "Name of the new cloned boot environment. Alphanumeric characters, dashes (-), underscores (_), and periods (.) are allowed.": "새롭게 복제한 시작 환경의 이름입니다. 알파벳과 숫자, 대시(-), 밑줄(_), 온점(.)을 사용할 수 있습니다.", - "Name of the new dataset created from the cloned snapshot.": "복제한 스냅샷으로부터 생성된 새로운 데이터셋의 이름입니다.", - "Name of the pool is required": "풀 이름 필요", - "Name of the pool must be correct": "올바르지 않은 풀 이름", - "Name of the zvol is required": "ZVOL 이름 필요", - "Name of the zvol must be correct": "올바르지 않은 ZVOL 이름", - "Name of this SSH connection. SSH connection names must be unique.": "이 SSH 연결의 이름입니다. SSH 연결 이름은 고유해야 합니다.", - "Name of this replication configuration.": "이 복제 구성의 이름입니다.", - "Name or Naming Schema must be provided.": "이름 또는 이름짓기 방식을 제공해야 합니다.", "Name ~ \"admin\"": "", - "Negotiate – only encrypt transport if explicitly requested by the SMB client": "협상 – SMB 클라이언트가 명시적으로 요청하는 경우에만 전송 암호화", - "Netcat Active Side": "Netcat 액티브 사이드", - "Netcat Active Side Connect Address": "Netcat 액티브 사이드 연결 주소", - "Netcat Active Side Listen Address": "Netcat 액티브 사이드 수신 주소", - "Netcat Active Side Max Port": "Netcat 액티브 사이드 최대 포트", - "Netcat Active Side Min Port": "Netcat 액티브 사이드 최소 포트", "Network addresses allowed to use this initiator. Leave blank to allow all networks or list network addresses with a CIDR mask. Separate entries by pressing Enter.": "", "Network addresses allowed use this initiator. Each address can include an optional CIDR netmask. Click + to add the network address to the list. Example: 192.168.2.0/24.": "", "Network community string. The community string acts like a user ID or password. A user with the correct community string has access to network information. The default is public. For more information, see What is an SNMP Community String?.": "", @@ -301,9 +280,6 @@ "Number of virtual CPUs to allocate to the virtual machine. The VM operating system might have operational or licensing restrictions on the number of CPUs.": "", "OQ % Used": "", "OQ Used": "", - "Off by default. When set, smbd(8) attempts to authenticate users with the insecure and vulnerable NTLMv1 encryption. This setting allows backward compatibility with older versions of Windows, but is not recommended and should not be used on untrusted networks.": "기본으로 꺼져있습니다. 설정하면 smbd(8)은(는) 안전하지 않고 취약한 NTLMv1 암호화로 사용자를 인증하려고 시도합니다. 이 설정은 이전 버전의 Windows와의 하위 호환성을 허용하지만 권장하지 않으며, 신뢰할 수 없는 네트워크에서는 사용해서는 안 됩니다.", - "Offload Read": "오프로드 읽기", - "Offload Write": "오프로드 쓰기", "Once an enclosure is selected, all other VDEV creation steps will limit disk selection options to disks in the selected enclosure. If the enclosure selection is changed, all disk selections will be reset.": "", "Once enabled, users will be required to set up two factor authentication next time they login.": "", "One half widget and two quarter widgets below": "", @@ -322,73 +298,14 @@ "Only one can be active at a time.": "", "Only override the default if the initiator requires a different block size.": "", "Only replicate snapshots that match a defined creation time. To specify which snapshots will be replicated, set this checkbox and define the snapshot creation times that will be replicated. For example, setting this time frame to Hourly will only replicate snapshots that were created at the beginning of each hour.": "", - "Open ticket": "티켓 발행", "OpenStack Swift": "", "Opened at": "", - "Optional IP": "선택적 IP", - "Optional IP of 2nd Redfish management interface.": "2번째 Redfish 관리 인터페이스의 선택적 IP입니다.", - "Optional description. Portals are automatically assigned a numeric group.": "선택적 설명입니다. 포털에는 자동으로 숫자 그룹이 지정됩니다.", - "Optional user-friendly name.": "선택적 사용자 친화 이름입니다.", - "Optional. Enter a server description.": "선택사항입니다. 서버 설명을 입력합니다.", - "Optional. Only needed for private images.": "선택사항입니다. 개인 이미지에만 필요합니다.", - "Optional: CPU Set (Examples: 0-3,8-11)": "선택사항: CPU 세트 (예시: 0-3,8-11)", - "Optional: Choose installation media image": "선택사항: 설치 매체 이미지 선택", - "Optional: NUMA nodeset (Example: 0-1)": "선택사항: NUMA 노드세트 (예시: 0-1)", - "Options": "선택사항", - "Options cannot be loaded": "선택사항 불러올 수 없음", - "Options for encrypting the LDAP connection:
  • OFF: do not encrypt the LDAP connection.
  • ON: encrypt the LDAP connection with SSL on port 636.
  • START_TLS: encrypt the LDAP connection with STARTTLS on the default LDAP port 389.
": "LDAP 연결 암호화 선택사항:
  • 꺼짐: LDAP 연결을 암호화하지 않습니다.
  • 켜짐: 636번 포트에서 SSL을 사용하여 LDAP 연결을 암호화합니다.
  • START_TLS: 기본 LDAP 포트인 389번 포트에서 STARTTLS를 사용하여 LDAP 연결을 암호화합니다.
", "Other Execute": "", - "Other node is currently processing a failover event.": "다른 노드가 장애조치 진행중입니다.", - "Others": "기타", - "Outgoing Mail Server": "발송 메일 서버", - "Outlook": "OUTLOOK", - "Overrides default directory creation mask of 0777 which grants directory read, write and execute access for everybody.": "모든 사용자에게 디렉터리 읽기, 쓰기, 실행 권한을 부여하는 기본 디렉터리 생성 마스크인 0777을 대체합니다.", - "Overrides default file creation mask of 0666 which creates files with read and write access for everybody.": "모든 사용자가 읽고 쓸 수 있는 파일을 생성하는 기본 파일 생성 마스크인 0666을 대체합니다.", - "PCI Passthrough Device": "PCI 통과 장치", - "PCI device does not have a reset mechanism defined and you may experience inconsistent/degraded behavior when starting/stopping the VM.": "PCI 장치에는 재설정 메커니즘이 정의되어 있지 않으므로, 가상머신을 시작/중지할 때 일관되지 않거나 저하된 동작이 발생할 수 있습니다.", - "POSIX": "POSIX", - "POSIX Permissions": "POSIX 권한", "PULL": "", "PUSH": "", - "PagerDuty client name.": "PagerDuty 클라이언트 이름입니다.", - "Pair this certificate's public key with the Certificate Authority private key used to sign this certificate.": "이 인증서의 공개키를 이 인증서에 서명하는 데 사용한 인증기관의 개인 키와 묶습니다.", - "Passive Controller": "패시브 컨트롤러", - "Passthrough": "통과", - "Password associated with the LDAP User DN.": "LDAP 사용자 DN과 연결된 비밀번호입니다.", - "Password for the Active Directory administrator account. Required the first time a domain is configured. After initial configuration, the password is not needed to edit, start, or stop the service.": "액티브 디렉터리 관리자 계정의 비밀번호입니다. 도메인을 처음 구성할 때 필요합니다. 초기 구성이 끝나면 서비스를 수정, 시작 또는 멈추는 데 비밀번호가 필요하지 않습니다.", - "Password for the Bind DN.": "Bind DN의 비밀번호입니다.", - "Password to encrypt and decrypt remote data. Warning: Always securely back up this password! Losing the encryption password will result in data loss.": "원격 데이터를 암호화 및 복호화하는 비밀번호입니다. 위험: 항상 이 비밀번호를 안전한 곳에 보관하십시오! 암호화 비밀번호를 잃으면 데이터도 잃습니다.", - "Passwords cannot contain a ?. Passwords should be at least eight characters and contain a mix of lower and upper case, numbers, and special characters.": "비밀번호에 물음표(?)를 포함할 수 없습니다. 비밀번호는 최소 8자 이상이어야 하고 대소문자, 숫자, 특수문자를 포함해야 합니다.", - "Paste either or both public and private keys. If only a public key is entered, it will be stored alone. If only a private key is pasted, the public key will be automatically calculated and entered in the public key field. Click Generate Keypair to create a new keypair. Encrypted keypairs or keypairs with passphrases are not supported.": "공개 키와 개인 키를 붙여넣습니다. 공개 키만 입력한 경우 단독으로 저장합니다. 개인 키만 입력한 경우 자동으로 계산한 공개 키가 입력됩니다. 키쌍 생성을 누르면 새로운 키쌍을 생성합니다. 암호화된 키쌍 또는 비밀구절이 있는 키쌍은 지원하지 않습니다.", - "Paste the incoming webhook URL associated with this service.": "이 서비스와 연결된 웹훅 수신 URL을 붙여넣습니다.", - "Paste the certificate for the CA.": "인증기관의 인증서를 붙여넣습니다.", - "Paste the contents of your Certificate Signing Request here.": "인증서 서명 요청의 내용을 여기에 붙여넣습니다.", - "Paste the private key associated with the Certificate when available. Please provide a key at least 1024 bits long.": "가능한 경우 인증서와 연결된 개인 키를 붙여넣습니다. 키 길이는 최소 1024비트여야 합니다.", - "Pattern of naming custom snapshots to include in the replication with the periodic snapshot schedule. Enter the strftime(3) strings that match the snapshots to include in the replication.

When a periodic snapshot is not linked to the replication, enter the naming schema for manually created snapshots. Has the same %Y, %m, %d, %H, and %M string requirements as the Naming Schema in a Periodic Snapshot Task. Separate entries by pressing Enter.": "주기적인 스냅샷 일정에 따라 복제할 사용자 정의 스냅샷의 이름짓기 패턴입니다. 복제에 포함할 스냅샷과 일치하는 strftime(3) 문자열을 입력합니다.

주기적인 스냅샷 작업이 복제 작업과 연결되어있지 않은 경우, 수동으로 생성한 스냅샷의 이름짓기 방식을 입력하십시오. 주기적인 스냅샷 작업이름짓기 방식과 같이 %Y, %m, %d, %H%M 문자열이 필요합니다. Enter키를 눌러 항목을 구분합니다.", - "Pattern of naming custom snapshots to be replicated. Enter the name and strftime(3) %Y, %m, %d, %H, and %M strings that match the snapshots to include in the replication. Separate entries by pressing Enter. The number of snapshots matching the patterns are shown.": "복제할 사용자 정의 스냅샷의 이름짓기 패턴입니다. 복제에 포함할 스냅샷과 일치하는 이름과 strftime(3) %Y, %m, %d, %H%M 문자열을 입력합니다. Enter키를 눌러 항목을 구분합니다. 패턴과 일치하는 스냅샷의 수가 표시됩니다.", - "Peer Secret": "다른 지점 시크릿", - "Peer Secret (Confirm)": "다른 지점 시크릿 (수락)", - "Peer User": "다른 지점 사용자", - "Percentage used of dataset quota at which to generate a critical alert.": "심각 경고를 생성할 데이터셋 할당량의 사용율입니다.", - "Percentage used of dataset quota at which to generate a warning alert.": "위험 경고를 생성할 데이터셋 할당량의 사용율입니다.", - "Perform Reverse DNS Lookups": "역방향 DNS 조회 수행", - "Performs authentication from an LDAP server.": "LDAP 서버에서 인증을 수행합니다.", - "Photo Library API client secret generated from the Google API Console": "Google API 콘솔에서 생성한 사진 라이브러리 API 클라이언트 시크릿", "Pin vcpus": "", - "Please accept the terms of service for the given ACME Server.": "해당 ACME 서버의 서비스 약관에 동의해 주십시오.", - "Please click the button below to create a pool.": "풀을 생성하려면 아래 버튼을 눌러 주십시오.", - "Please specify the name of the image to pull. Format for the name is \"registry/repo/image\"": "가져올 이미지의 이름을 지정해 주십시오. 이름의 형식은 \"registry/repo/image\"입니다.", - "Please specify trains from which UI should retrieve available applications for the catalog.": "UI가 카탈로그에 사용 가능한 애플리케이션을 검색할 버전 구분을 지정해 주십시오.", - "Pool is using more than {maxPct}% of available space": "풀이 사용 가능한 공간의 {maxPct}% 이상을 사용함", "Power On Hours Ago": "", - "Predefined certificate extensions. Choose a profile that best matches your certificate usage scenario.": "사전 정의된 인증서 확장입니다. 인증서의 용도에 가장 부합하는 프로파일을 선택하십시오.", - "Predefined permission combinations:
Read: Read access and Execute permission on the object (RX).
Change: Read access, Execute permission, Write access, and Delete object (RXWD).
Full: Read access, Execute permission, Write access, Delete object, change Permissions, and take Ownership (RXWDPO).

For more details, see smbacls(1).": "사전 정의된 권한 조합:
읽기: 개체에 대한 읽기 및 실행 권한(RX)
변경: 읽기, 실행, 쓰기 및 개체 삭제(RXWD)
전체: 읽기, 실행, 쓰기, 개체 삭제, 권한 변경 및 소유권 취득(RXWDPO)

보다 자세한 사항은 smbacls(1)을(를) 참고하십시오.", - "Prevent the user from logging in or using password-based services until this option is unset. Locking an account is only possible when Disable Password is No and a Password has been created for the account.": "이 선택사항을 설정 해제하기 전에는 사용자가 로그인하거나 비밀번호 기반 서비스를 사용할 수 없습니다. 비밀번호 비활성화아니오이고 계정 비밀번호가 생성된 경우에만 계정을 잠글 수 있습니다.", - "Priority Code Point": "우선순위 코드 포인트(PCP)", - "Proceed with upgrading the pool? WARNING: Upgrading a pool is a one-way operation that might make some features of the pool incompatible with older versions of TrueNAS: ": "풀을 업그레이드하시겠습니까? 위험: 풀 업그레이드는 되돌릴 수 없고, 일부 풀 기능이 이전 버전의 TrueNAS와 호환되지 않을 수 있습니다: ", "Prototyping": "", - "Provide helpful notations related to the share, e.g. ‘Shared to everybody’. Maximum length is 120 characters.": "공유에대한 유용한 설명을 제공합니다(예: '모두에게 공유됨'). 최대 길이는 120자입니다.", - "Provides a plugin interface for Winbind to use varying backends to store SID/uid/gid mapping tables. The correct setting depends on the environment in which the NAS is deployed.": "Winbind가 다양한 백엔드를 사용하여 SID/uid/gid 매핑 테이블을 저장할 수 있도록 플러그인 인터페이스를 제공합니다. 올바른 설정은 NAS가 배포된 환경에 따라 달라집니다.", "Prune By": "", "Pull": "", "Pull Image": "", @@ -398,16 +315,7 @@ "Quiet": "", "Realm": "", "Rear": "", - "Restrict share visibility to users with read or write access to the share. See the smb.conf manual page.": "공유가 읽기 또는 쓰기 권한을 가진 사용자에게만 보이도록 제한합니다. smb.conf 매뉴얼을 참고하십시오.", - "SHORT": "SHORT", "Series": "", - "Session dialect": "세션 변형", - "Set for the LDAP server to disable authentication and allow read and write access to any client.": "LDAP 서버가 인증을 비활성화하고 모든 클라이언트에 대해 읽기와 쓰기 권한을 허용하도록 설정합니다.", - "Set for the default configuration to listen on all interfaces using the known values of user: upsmon and password: fixmepass.": "모든 인터페이스가 기본적으로 알려진 값(사용자: upsmon, 비밀번호: fixmepass)을 사용해 수신하도록 구성합니다.", - "Set only if required by the NFS client. Set to allow serving non-root mount requests.": "NFS 클라이언트에서 요청하는 경우 설정합니다. root가 아닌 탑재 요청을 허용합니다.", - "Set production status as active": "운영 상태를 활성화합니다.", - "Set specific times to snapshot the Source Datasets and replicate the snapshots to the Destination Dataset. Select a preset schedule or choose Custom to use the advanced scheduler.": "원본 데이터셋의 스냅샷을 저장하고 도착지 데이터셋으로 복제할 시각을 지정합니다. 사전설정 일정을 선택하거나 사용자 정의를 선택해 고급 일정관리를 사용합니다.", - "Set to determine if the system participates in a browser election. Leave unset when the network contains an AD or LDAP server, or when Vista or Windows 7 machines are present.": "시스템을 브라우저 선정에 포함할지 여부를 결정합니다. 네트워크에 AD 또는 LDAP 서버가 있거나, Vista 또는 Windows 7 장치가 있는 경우 설정하지 않습니다.", "Short": "", "Tail Lines": "", "Thick": "", @@ -2665,6 +2573,7 @@ "LINK STATE UNKNOWN": "연결 상태 불명", "LINK STATE UP": "연결 상태 양호", "LOCAL": "로컬", + "LONG": "LONG", "LUN ID": "LUN ID", "LUN RPM": "LUN RPM", "Label": "이름표", @@ -2877,6 +2786,7 @@ "Metadata (Special) Small Block Size": "메타데이터(특별) 작은 블록 크기", "Metadata VDEVs": "메타데이터 VDEV", "Method of snapshot transfer:
  • SSH is supported by most systems. It requires a previously created connection in System > SSH Connections.
  • SSH+NETCAT uses SSH to establish a connection to the destination system, then uses py-libzfs to send an unencrypted data stream for higher transfer speeds. This only works when replicating to a TrueNAS, or other system with py-libzfs installed.
  • LOCAL efficiently replicates snapshots to another dataset on the same system without using the network.
  • LEGACY uses the legacy replication engine from FreeNAS 11.2 and earlier.
": "스냅샷 전송 방식:
  • SSH은(는) 대부분의 시스템에서 사용할 수 있습니다. 미리 시스템 > SSH 연결을 통해 연결을 생성해야 합니다.
  • SSH+NETCAT은(는) 원격 연결을 수립하기 위해 SSH를 사용하고, py-libzfs을(를) 사용해 암호화되지 않은 데이터 스트림을 빠른 속도로 전송합니다. TrueNAS 시스템 혹은 py-libzfs이(가) 설치된 시스템으로 복제할 때만 사용할 수 있습니다.
  • 로컬은 네트워크를 통하지 않고 같은 시스템의 다른 데이터셋으로 스냅샷을 복제하는 효율적인 방법입니다.
  • 예전은 FreeNAS 11.2 까지 사용했던 오래된 복제 엔진을 사용합니다.
", + "MiB": "MiB", "MiB. Units smaller than MiB are not allowed.": "MiB보다 작은 단위는 사용할 수 없습니다.", "Middleware": "미들웨어", "Middleware - Credentials": "미들웨어 - 자격증명", @@ -2938,6 +2848,7 @@ "NFSv4 DNS Domain": "NFSv4 DNS 도메인", "NIC": "NIC", "NIC To Attach": "탑재할 NIC", + "NIC was added": "NIC 추가함", "NOTICE": "공지", "NS": "NS", "NTLMv1 Auth": "NTLMv1 인증", @@ -2952,11 +2863,23 @@ "Name and Options": "이름과 옵션", "Name and Provider": "이름과 공급자", "Name and Type": "이름과 유형", + "Name must start and end with a lowercase alphanumeric character. Hyphen is allowed in the middle e.g abc123, abc, abcd-1232": "이름은 반드시 알파벳 소문자로 시작하고 끝나야 합니다. 하이픈(-)은 중간에 사용할 수 있습니다(예: abc123, abc, abcd-1232).", "Name not added": "이름 추가되지 않음", "Name not found": "찾을 수 없는 이름", "Name of the channel to receive notifications. This overrides the default channel in the incoming webhook settings.": "알림을 수신할 채널의 이름입니다. 수신 웹훅 설정의 기본 채널보다 우선합니다.", "Name of the InfluxDB database.": "InfluxDB 데이터베이스의 이름입니다.", + "Name of the WebDAV site, service, or software being used.": "사용중인 WebDAV 사이트, 서비스 또는 소프트웨어의 이름입니다.", "Name of the extent. If the Extent size is not 0, it cannot be an existing file within the pool or dataset.": "익스텐트의 이름입니다. 익스텐트 크기0이 아니면, 풀이나 데이터셋의 기존 파일일 수 없습니다.", + "Name of the new alert service.": "새로운 경고 서비스의 이름입니다.", + "Name of the new cloned boot environment. Alphanumeric characters, dashes (-), underscores (_), and periods (.) are allowed.": "새롭게 복제한 시작 환경의 이름입니다. 알파벳과 숫자, 대시(-), 밑줄(_), 온점(.)을 사용할 수 있습니다.", + "Name of the new dataset created from the cloned snapshot.": "복제한 스냅샷으로부터 생성된 새로운 데이터셋의 이름입니다.", + "Name of the pool is required": "풀 이름 필요", + "Name of the pool must be correct": "올바르지 않은 풀 이름", + "Name of the zvol is required": "ZVOL 이름 필요", + "Name of the zvol must be correct": "올바르지 않은 ZVOL 이름", + "Name of this SSH connection. SSH connection names must be unique.": "이 SSH 연결의 이름입니다. SSH 연결 이름은 고유해야 합니다.", + "Name of this replication configuration.": "이 복제 구성의 이름입니다.", + "Name or Naming Schema must be provided.": "이름 또는 이름짓기 방식을 제공해야 합니다.", "Nameserver": "네임서버", "Nameserver (DHCP)": "네임서버 (DHCP)", "Nameserver 1": "네임서버 1", @@ -2965,10 +2888,16 @@ "Nameserver {n}": "네임서버 {n}", "Nameservers": "네임서버", "Naming Schema": "이름짓기 방식", + "Negotiate – only encrypt transport if explicitly requested by the SMB client": "협상 – SMB 클라이언트가 명시적으로 요청하는 경우에만 전송 암호화", "NetBIOS": "NetBIOS", "NetBIOS Alias": "NetBIOS 별칭", "NetBIOS Name": "NetBIOS 이름", "NetBIOS Name of this NAS. This name must differ from the Workgroup name and be no greater than 15 characters.": "이 NAS의 NetBIOS 이름입니다. 반드시 Workgroup 이름과 달라야 하며 15자를 초과할 수 없습니다.", + "Netcat Active Side": "Netcat 액티브 사이드", + "Netcat Active Side Connect Address": "Netcat 액티브 사이드 연결 주소", + "Netcat Active Side Listen Address": "Netcat 액티브 사이드 수신 주소", + "Netcat Active Side Max Port": "Netcat 액티브 사이드 최대 포트", + "Netcat Active Side Min Port": "Netcat 액티브 사이드 최소 포트", "Network": "네트워크", "Network Configuration": "네트워크 구성", "Network General Read": "네트워크 일반 읽기", @@ -3151,10 +3080,13 @@ "Object Quota": "오브젝트 할당량", "Oct": "10월", "Off": "꺼짐", + "Off by default. When set, smbd(8) attempts to authenticate users with the insecure and vulnerable NTLMv1 encryption. This setting allows backward compatibility with older versions of Windows, but is not recommended and should not be used on untrusted networks.": "기본으로 꺼져있습니다. 설정하면 smbd(8)은(는) 안전하지 않고 취약한 NTLMv1 암호화로 사용자를 인증하려고 시도합니다. 이 설정은 이전 버전의 Windows와의 하위 호환성을 허용하지만 권장하지 않으며, 신뢰할 수 없는 네트워크에서는 사용해서는 안 됩니다.", "Offline": "오프라인", "Offline Disk": "오프라인 디스크", "Offline VDEVs": "오프라인 VDEV", "Offline disk {name}?": "디스크 {name}의 연결을 끊으시겠습니까?", + "Offload Read": "오프로드 읽기", + "Offload Write": "오프로드 쓰기", "Ok": "확인", "Okay": "확인", "On": "켜짐", @@ -3169,11 +3101,24 @@ "Open": "열기", "Open Files": "파일 열기", "Open TrueCommand User Interface": "TrueCommand 사용자 인터페이스 열기", + "Open ticket": "티켓 발행", "Openstack API key or password. This is the OS_PASSWORD from an OpenStack credentials file.": "Openstack API 키 또는 비밀번호입니다. OpenStack 자격증명 파일의 OS_PASSWORD 입니다.", "Openstack user name for login. This is the OS_USERNAME from an OpenStack credentials file.": "Openstack 로그인 사용자 이름입니다. OpenStack 자격증명 파일의 OS_USERNAME 입니다.", "Operating System": "운영체제", "Operation": "작업", "Operation will change permissions on path: {path}": "이 작업은 다음 경로에 대한 권한을 변경합니다: {path}", + "Optional IP": "선택적 IP", + "Optional IP of 2nd Redfish management interface.": "2번째 Redfish 관리 인터페이스의 선택적 IP입니다.", + "Optional description. Portals are automatically assigned a numeric group.": "선택적 설명입니다. 포털에는 자동으로 숫자 그룹이 지정됩니다.", + "Optional user-friendly name.": "선택적 사용자 친화 이름입니다.", + "Optional. Enter a server description.": "선택사항입니다. 서버 설명을 입력합니다.", + "Optional. Only needed for private images.": "선택사항입니다. 개인 이미지에만 필요합니다.", + "Optional: CPU Set (Examples: 0-3,8-11)": "선택사항: CPU 세트 (예시: 0-3,8-11)", + "Optional: Choose installation media image": "선택사항: 설치 매체 이미지 선택", + "Optional: NUMA nodeset (Example: 0-1)": "선택사항: NUMA 노드세트 (예시: 0-1)", + "Options": "선택사항", + "Options cannot be loaded": "선택사항 불러올 수 없음", + "Options for encrypting the LDAP connection:
  • OFF: do not encrypt the LDAP connection.
  • ON: encrypt the LDAP connection with SSL on port 636.
  • START_TLS: encrypt the LDAP connection with STARTTLS on the default LDAP port 389.
": "LDAP 연결 암호화 선택사항:
  • 꺼짐: LDAP 연결을 암호화하지 않습니다.
  • 켜짐: 636번 포트에서 SSL을 사용하여 LDAP 연결을 암호화합니다.
  • START_TLS: 기본 LDAP 포트인 389번 포트에서 STARTTLS를 사용하여 LDAP 연결을 암호화합니다.
", "Order": "명령", "Organization": "조직", "Organizational Unit": "조직 단위", @@ -3187,25 +3132,39 @@ "Other TrueNAS controller has not finished booting.": "다른 TrueNAS 컨트롤러의 부팅이 완료되지 않았습니다.", "Other Write": "그 외 쓰기", "Other node is currently configuring the system dataset.": "다른 지점에서 시스템 데이터셋을 구성하고 있습니다.", + "Other node is currently processing a failover event.": "다른 노드가 장애조치 진행중입니다.", + "Others": "기타", "Out": "송신", "Outbound Activity": "송신 활동", "Outbound Network": "송신 네트워크", "Outbound Network:": "송신 네트워크", + "Outgoing Mail Server": "발송 메일 서버", "Outgoing [{networkInterfaceName}]": "[{networkInterfaceName}] 송신", + "Outlook": "OUTLOOK", "Override Admin Email": "관리자 이메일 대체", + "Overrides default directory creation mask of 0777 which grants directory read, write and execute access for everybody.": "모든 사용자에게 디렉터리 읽기, 쓰기, 실행 권한을 부여하는 기본 디렉터리 생성 마스크인 0777을 대체합니다.", + "Overrides default file creation mask of 0666 which creates files with read and write access for everybody.": "모든 사용자가 읽고 쓸 수 있는 파일을 생성하는 기본 파일 생성 마스크인 0666을 대체합니다.", "Overview": "개요", "Owner": "소유자", "Owner Group": "소유자 그룹", "Owner:": "소유자:", "PASSPHRASE": "비밀구절", + "PCI Passthrough Device": "PCI 통과 장치", + "PCI device does not have a reset mechanism defined and you may experience inconsistent/degraded behavior when starting/stopping the VM.": "PCI 장치에는 재설정 메커니즘이 정의되어 있지 않으므로, 가상머신을 시작/중지할 때 일관되지 않거나 저하된 동작이 발생할 수 있습니다.", + "POSIX": "POSIX", + "POSIX Permissions": "POSIX 권한", + "PagerDuty client name.": "PagerDuty 클라이언트 이름입니다.", + "Pair this certificate's public key with the Certificate Authority private key used to sign this certificate.": "이 인증서의 공개키를 이 인증서에 서명하는 데 사용한 인증기관의 개인 키와 묶습니다.", "Parent": "상위", "Parent Interface": "상위 인터페이스", "Parent Path": "상위 경로", "Parent dataset path (read-only).": "상위 데이터셋 경로입니다 (읽기전용).", "Partition": "파티션", + "Passive Controller": "패시브 컨트롤러", "Passphrase": "비밀구절", "Passphrase and confirmation should match.": "비밀구절과 확인은 일치해야 합니다.", "Passphrase value must match Confirm Passphrase": "비밀구절은 비밀구절 확인과 일치해야 합니다.", + "Passthrough": "통과", "Password": "비밀번호", "Password Disabled": "비밀번호 비활성화", "Password Login": "비밀번호 로그인", @@ -3213,27 +3172,46 @@ "Password Server": "비밀번호 서버", "Password Servers": "비밀번호 서버", "Password and confirmation should match.": "비밀번호와 확인은 일치해야 합니다.", + "Password associated with the LDAP User DN.": "LDAP 사용자 DN과 연결된 비밀번호입니다.", + "Password for the Active Directory administrator account. Required the first time a domain is configured. After initial configuration, the password is not needed to edit, start, or stop the service.": "액티브 디렉터리 관리자 계정의 비밀번호입니다. 도메인을 처음 구성할 때 필요합니다. 초기 구성이 끝나면 서비스를 수정, 시작 또는 멈추는 데 비밀번호가 필요하지 않습니다.", + "Password for the Bind DN.": "Bind DN의 비밀번호입니다.", "Password for the SSH Username account.": "SSH 사용자 이름 계정의 비밀번호입니다.", "Password for the user account.": "사용자 계정의 비밀번호입니다.", "Password is not set": "비밀번호 설정되지 않음", "Password is set": "비밀번호 설정됨", "Password login enabled": "비밀번호 로그인 활성화", + "Password to encrypt and decrypt remote data. Warning: Always securely back up this password! Losing the encryption password will result in data loss.": "원격 데이터를 암호화 및 복호화하는 비밀번호입니다. 위험: 항상 이 비밀번호를 안전한 곳에 보관하십시오! 암호화 비밀번호를 잃으면 데이터도 잃습니다.", "Password updated.": "비밀번호가 갱신되었습니다.", + "Passwords cannot contain a ?. Passwords should be at least eight characters and contain a mix of lower and upper case, numbers, and special characters.": "비밀번호에 물음표(?)를 포함할 수 없습니다. 비밀번호는 최소 8자 이상이어야 하고 대소문자, 숫자, 특수문자를 포함해야 합니다.", "Passwords do not match": "비밀번호 불일치", + "Paste either or both public and private keys. If only a public key is entered, it will be stored alone. If only a private key is pasted, the public key will be automatically calculated and entered in the public key field. Click Generate Keypair to create a new keypair. Encrypted keypairs or keypairs with passphrases are not supported.": "공개 키와 개인 키를 붙여넣습니다. 공개 키만 입력한 경우 단독으로 저장합니다. 개인 키만 입력한 경우 자동으로 계산한 공개 키가 입력됩니다. 키쌍 생성을 누르면 새로운 키쌍을 생성합니다. 암호화된 키쌍 또는 비밀구절이 있는 키쌍은 지원하지 않습니다.", + "Paste the incoming webhook URL associated with this service.": "이 서비스와 연결된 웹훅 수신 URL을 붙여넣습니다.", + "Paste the certificate for the CA.": "인증기관의 인증서를 붙여넣습니다.", + "Paste the contents of your Certificate Signing Request here.": "인증서 서명 요청의 내용을 여기에 붙여넣습니다.", + "Paste the private key associated with the Certificate when available. Please provide a key at least 1024 bits long.": "가능한 경우 인증서와 연결된 개인 키를 붙여넣습니다. 키 길이는 최소 1024비트여야 합니다.", "Path": "경로", "Path Length": "경로 길이", "Path Suffix": "경로 접미사", "Path to the Extent": "익스텐트 경로", "Pattern": "패턴", + "Pattern of naming custom snapshots to include in the replication with the periodic snapshot schedule. Enter the strftime(3) strings that match the snapshots to include in the replication.

When a periodic snapshot is not linked to the replication, enter the naming schema for manually created snapshots. Has the same %Y, %m, %d, %H, and %M string requirements as the Naming Schema in a Periodic Snapshot Task. Separate entries by pressing Enter.": "주기적인 스냅샷 일정에 따라 복제할 사용자 정의 스냅샷의 이름짓기 패턴입니다. 복제에 포함할 스냅샷과 일치하는 strftime(3) 문자열을 입력합니다.

주기적인 스냅샷 작업이 복제 작업과 연결되어있지 않은 경우, 수동으로 생성한 스냅샷의 이름짓기 방식을 입력하십시오. 주기적인 스냅샷 작업이름짓기 방식과 같이 %Y, %m, %d, %H%M 문자열이 필요합니다. Enter키를 눌러 항목을 구분합니다.", + "Pattern of naming custom snapshots to be replicated. Enter the name and strftime(3) %Y, %m, %d, %H, and %M strings that match the snapshots to include in the replication. Separate entries by pressing Enter. The number of snapshots matching the patterns are shown.": "복제할 사용자 정의 스냅샷의 이름짓기 패턴입니다. 복제에 포함할 스냅샷과 일치하는 이름과 strftime(3) %Y, %m, %d, %H%M 문자열을 입력합니다. Enter키를 눌러 항목을 구분합니다. 패턴과 일치하는 스냅샷의 수가 표시됩니다.", "Pause Scrub": "스크럽 일시정지", + "Peer Secret": "다른 지점 시크릿", + "Peer Secret (Confirm)": "다른 지점 시크릿 (수락)", + "Peer User": "다른 지점 사용자", "Pending": "보류중", "Pending Network Changes": "보류중인 네트워크 변경사항", "Pending Sync": "보류중인 동기화", "Pending Sync Keys Cleared": "보류중인 동기화 키 지움", "Percentage": "백분율", "Percentage of total core utilization": "전체 코어 활용 백분율", + "Percentage used of dataset quota at which to generate a critical alert.": "심각 경고를 생성할 데이터셋 할당량의 사용율입니다.", + "Percentage used of dataset quota at which to generate a warning alert.": "위험 경고를 생성할 데이터셋 할당량의 사용율입니다.", + "Perform Reverse DNS Lookups": "역방향 DNS 조회 수행", "Performance": "성능", "Performance Optimization": "성능 최적화", + "Performs authentication from an LDAP server.": "LDAP 서버에서 인증을 수행합니다.", "Periodic S.M.A.R.T. Tests": "주기적인 S.M.A.R.T. 검사", "Periodic Snapshot Tasks": "주기적인 스냅샷 작업", "Permission": "권한", @@ -3248,8 +3226,11 @@ "Permissions saved.": "권한을 저장했습니다.", "Phone": "전화", "Phone Number": "전화번호", + "Photo Library API client secret generated from the Google API Console": "Google API 콘솔에서 생성한 사진 라이브러리 API 클라이언트 시크릿", "Plain (No Encryption)": "평문 (암호화 없음)", "Platform": "플랫폼", + "Please accept the terms of service for the given ACME Server.": "해당 ACME 서버의 서비스 약관에 동의해 주십시오.", + "Please click the button below to create a pool.": "풀을 생성하려면 아래 버튼을 눌러 주십시오.", "Please describe:\n1. Steps to reproduce\n2. Expected Result\n3. Actual Result\n\nPlease use English for your report.": "다음을 설명해주십시오:\n1. 재현을 위한 단계\n2. 원하는 결과\n3. 실제 결과\n\n영어로 작성해주시기 바랍니다.", "Please input password.": "비밀번호를 입력해 주십시오.", "Please input user name.": "사용자 이름을 입력해 주십시오.", @@ -3258,6 +3239,8 @@ "Please specify a valid git repository uri.": "올바른 git 보관소 uri를 지정해 주십시오.", "Please specify branch of git repository to use for the catalog.": "카탈로그로 사용할 git 보관소의 브랜치를 지정해 주십시오.", "Please specify name to be used to lookup catalog.": "카탈로그를 조회하는 데 사용할 이름을 지정해 주십시오.", + "Please specify the name of the image to pull. Format for the name is \"registry/repo/image\"": "가져올 이미지의 이름을 지정해 주십시오. 이름의 형식은 \"registry/repo/image\"입니다.", + "Please specify trains from which UI should retrieve available applications for the catalog.": "UI가 카탈로그에 사용 가능한 애플리케이션을 검색할 버전 구분을 지정해 주십시오.", "Please specify whether to install NVIDIA driver or not.": "NVIDIA 드라이버 설치 여부를 지정해 주십시오.", "Please wait": "기다려 주십시오", "Pods": "파드", @@ -3279,6 +3262,7 @@ "Pool imported successfully.": "풀을 성공적으로 불러왔습니다.", "Pool is not healthy": "풀 건강상태 나쁨", "Pool is not selected": "풀을 선택하지 않음", + "Pool is using more than {maxPct}% of available space": "풀이 사용 가능한 공간의 {maxPct}% 이상을 사용함", "Pool options for {poolName} successfully saved.": "풀 {poolName}에 대한 선택사항이 성공적으로 저장되었습니다.", "Pool status is {status}": "풀이 {status} 상태임", "Pool updated successfully": "풀 갱신 성공", @@ -3309,6 +3293,8 @@ "Pre Init": "초기화 이전", "Pre Script": "이전 스크립트", "Pre-script": "이전 스크립트", + "Predefined certificate extensions. Choose a profile that best matches your certificate usage scenario.": "사전 정의된 인증서 확장입니다. 인증서의 용도에 가장 부합하는 프로파일을 선택하십시오.", + "Predefined permission combinations:
Read: Read access and Execute permission on the object (RX).
Change: Read access, Execute permission, Write access, and Delete object (RXWD).
Full: Read access, Execute permission, Write access, Delete object, change Permissions, and take Ownership (RXWDPO).

For more details, see smbacls(1).": "사전 정의된 권한 조합:
읽기: 개체에 대한 읽기 및 실행 권한(RX)
변경: 읽기, 실행, 쓰기 및 개체 삭제(RXWD)
전체: 읽기, 실행, 쓰기, 개체 삭제, 권한 변경 및 소유권 취득(RXWDPO)

보다 자세한 사항은 smbacls(1)을(를) 참고하십시오.", "Prefer": "선호", "Preferred Trains": "선호 버전 구분", "Preserve Extended Attributes": "확장 속성 유지", @@ -3319,11 +3305,13 @@ "Preset Name": "사전설정 이름", "Presets": "사전설정", "Prevent source system snapshots that have failed replication from being automatically removed by the Snapshot Retention Policy.": "스냅샷 보유 정책에 따라 복제에 실패한 원본 시스템 스냅샷이 자동으로 제거되는 것을 방지합니다.", + "Prevent the user from logging in or using password-based services until this option is unset. Locking an account is only possible when Disable Password is No and a Password has been created for the account.": "이 선택사항을 설정 해제하기 전에는 사용자가 로그인하거나 비밀번호 기반 서비스를 사용할 수 없습니다. 비밀번호 비활성화아니오이고 계정 비밀번호가 생성된 경우에만 계정을 잠글 수 있습니다.", "Preview JSON Service Account Key": "JSON 서비스 계정 키 미리보기", "Previous Page": "이전 페이지", "Primary Contact": "기본 연락처", "Primary DNS server.": "기본 DNS 서버", "Primary Group": "기본 그룹", + "Priority Code Point": "우선순위 코드 포인트(PCP)", "Privacy Passphrase": "개인정보 보호 비밀구절", "Privacy Protocol": "개인정보 보호 프로토콜", "Private Key": "개인 키", @@ -3332,6 +3320,7 @@ "Proactive Support": "사전 지원", "Proactive support settings is not available.": "사전 지원 설정을 사용할 수 없습니다.", "Proceed": "진행", + "Proceed with upgrading the pool? WARNING: Upgrading a pool is a one-way operation that might make some features of the pool incompatible with older versions of TrueNAS: ": "풀을 업그레이드하시겠습니까? 위험: 풀 업그레이드는 되돌릴 수 없고, 일부 풀 기능이 이전 버전의 TrueNAS와 호환되지 않을 수 있습니다: ", "Processor": "프로세서", "Product": "제품", "Product ID": "제품 ID", @@ -3344,8 +3333,10 @@ "Properties Exclude": "제외할 속성", "Properties Override": "덮어쓸 속성", "Protocol Options": "프로토콜 선택사항", + "Provide helpful notations related to the share, e.g. ‘Shared to everybody’. Maximum length is 120 characters.": "공유에대한 유용한 설명을 제공합니다(예: '모두에게 공유됨'). 최대 길이는 120자입니다.", "Provide keys/passphrases manually": "키/비밀구절을 수동으로 제공", "Provider": "공급자", + "Provides a plugin interface for Winbind to use varying backends to store SID/uid/gid mapping tables. The correct setting depends on the environment in which the NAS is deployed.": "Winbind가 다양한 백엔드를 사용하여 SID/uid/gid 매핑 테이블을 저장할 수 있도록 플러그인 인터페이스를 제공합니다. 올바른 설정은 NAS가 배포된 환경에 따라 달라집니다.", "Provisioning Type": "프로비저닝 유형", "Provisioning URI (includes Secret - Read only):": "프로비저닝 URI (시크릿 포함 - 읽기 전용)", "Proxies": "프록시", @@ -3587,6 +3578,7 @@ "Restores files to the selected directory.": "선택한 디렉터리로 파일을 복원합니다.", "Restoring backup": "백업 복원", "Restrict PAM": "PAM 제한", + "Restrict share visibility to users with read or write access to the share. See the smb.conf manual page.": "공유가 읽기 또는 쓰기 권한을 가진 사용자에게만 보이도록 제한합니다. smb.conf 매뉴얼을 참고하십시오.", "Restricted": "제한됨", "Resume Scrub": "스크럽 다시 시작", "Retention": "보유", @@ -3657,6 +3649,7 @@ "SFTP": "SFTP", "SFTP Log Facility": "SFTP 기록 기관", "SFTP Log Level": "SFTP 기록 수준", + "SHORT": "SHORT", "SID": "SID", "SMB": "SMB", "SMB - Client Account": "SMB - 클라이언트 계정", @@ -3965,6 +3958,7 @@ "Session ID": "세션 ID", "Session Timeout": "세션 시간 제한", "Session Token Lifetime": "세션 토큰 수명", + "Session dialect": "세션 변형", "Sessions": "세션", "Set": "설정", "Set ACL": "ACL 설정", @@ -3979,11 +3973,16 @@ "Set email": "이메일 설정", "Set enable sending messages to the address defined in the Email field.": "이메일 필드에 정의된 주소로의 메시지 전송을 활성화합니다.", "Set font size": "글꼴 크기 설정", + "Set for the LDAP server to disable authentication and allow read and write access to any client.": "LDAP 서버가 인증을 비활성화하고 모든 클라이언트에 대해 읽기와 쓰기 권한을 허용하도록 설정합니다.", "Set for the UPS to power off after shutting down the system.": "시스템을 종료한 후 UPS도 종료되도록 설정합니다.", + "Set for the default configuration to listen on all interfaces using the known values of user: upsmon and password: fixmepass.": "모든 인터페이스가 기본적으로 알려진 값(사용자: upsmon, 비밀번호: fixmepass)을 사용해 수신하도록 구성합니다.", "Set if the initiator does not support physical block size values over 4K (MS SQL).": "이니시에이터가 4K 이상의 물리 블록 크기를 지원하지 않는 경우 설정합니다(MS SQL).", "Set new password": "새로운 비밀번호 설정", + "Set only if required by the NFS client. Set to allow serving non-root mount requests.": "NFS 클라이언트에서 요청하는 경우 설정합니다. root가 아닌 탑재 요청을 허용합니다.", "Set or change the password of this SED. This password is used instead of the global SED password.": "이 SED의 비밀번호를 설정하거나 변경합니다. 전역 SED 비밀번호 대신 사용합니다.", "Set password for TrueNAS administrative user:": "TrueNAS 관리권한 사용자에 대한 비밀번호 설정:", + "Set production status as active": "운영 상태를 활성화합니다.", + "Set specific times to snapshot the Source Datasets and replicate the snapshots to the Destination Dataset. Select a preset schedule or choose Custom to use the advanced scheduler.": "원본 데이터셋의 스냅샷을 저장하고 도착지 데이터셋으로 복제할 시각을 지정합니다. 사전설정 일정을 선택하거나 사용자 정의를 선택해 고급 일정관리를 사용합니다.", "Set the maximum number of connections per IP address. 0 means unlimited.": "IP 주소 당 최대 연결수를 설정합니다. 0은 제한을 두지 않습니다.", "Set the number of data copies on this dataset.": "이 데이터셋의 데이터 사본의 수를 설정합니다.", "Set the port the FTP service listens on.": "FTP 서비스가 열어둘 포트를 설정합니다.", @@ -4001,6 +4000,7 @@ "Set to automatically create the defined Remote Path if it does not exist.": "원격 경로가 존재하지 않을 경우 자동으로 정의합니다.", "Set to boot a debug kernel after the next system restart.": "다음 시스템 재시작시 커널 디버그로 부팅합니다.", "Set to create a new primary group with the same name as the user. Unset to select an existing group for the user.": "사용자 이름과 동일한 새로운 기본 그룹을 만듭니다. 설정하지 않으면 기존 그룹을 선택합니다.", + "Set to determine if the system participates in a browser election. Leave unset when the network contains an AD or LDAP server, or when Vista or Windows 7 machines are present.": "시스템을 브라우저 선정에 포함할지 여부를 결정합니다. 네트워크에 AD 또는 LDAP 서버가 있거나, Vista 또는 Windows 7 장치가 있는 경우 설정하지 않습니다.", "Set to display image upload options.": "이미지 업로드 선택사항을 표시합니다.", "Set to either start this replication task immediately after the linked periodic snapshot task completes or continue to create a separate Schedule for this replication.": "연결된 주기적인 스냅샷 작업을 완료한 후 즉시 이 복제 작업을 시작하거나, 이 복제작업에 대한 별도의 일정을 계속 생성합니다.", "Set to enable DHCP. Leave unset to create a static IPv4 or IPv6 configuration. Only one interface can be configured for DHCP.": "DHCP을(를) 활성화합니다. 선택하지 않으면 정적 IPv4 또는 IPv6 구성을 생성합니다. 하나의 인터페이스만 DHCP로 구성할 수 있습니다.", @@ -5315,4 +5315,4 @@ "{used} of {total} ({used_pct})": "{total} 중 {used} ({used_pct})", "{version} is available!": "{version}이 준비되었습니다!", "{view} on {enclosure}": "{enclousure}의 {view}" -} +} \ No newline at end of file diff --git a/src/assets/ui-searchable-elements.json b/src/assets/ui-searchable-elements.json index 2cec9363c6f..a72595a3e6c 100644 --- a/src/assets/ui-searchable-elements.json +++ b/src/assets/ui-searchable-elements.json @@ -234,7 +234,7 @@ "available" ], "routerLink": null, - "anchor": "applications-discover", + "anchor": "available-apps-list", "triggerAnchor": null, "section": "ui" }, @@ -342,7 +342,7 @@ "audit" ], "routerLink": null, - "anchor": "system-audit", + "anchor": "audit-list", "triggerAnchor": null, "section": "ui" }, @@ -359,7 +359,7 @@ "backup-credentials" ], "routerLink": null, - "anchor": "credentials-backup-credentials", + "anchor": "backup-credentials", "triggerAnchor": null, "section": "ui" }, @@ -628,7 +628,7 @@ "certificates" ], "routerLink": null, - "anchor": "credentials-certificates", + "anchor": "certificates-dash", "triggerAnchor": null, "section": "ui" }, @@ -739,7 +739,7 @@ "groups" ], "routerLink": null, - "anchor": "credentials-groups", + "anchor": "groups-list", "triggerAnchor": null, "section": "ui" }, @@ -784,7 +784,7 @@ "privileges" ], "routerLink": null, - "anchor": "credentials-groups-privileges", + "anchor": "privileges-list", "triggerAnchor": null, "section": "ui" }, @@ -801,7 +801,7 @@ "kmip" ], "routerLink": null, - "anchor": "credentials-kmip", + "anchor": "kmip", "triggerAnchor": null, "section": "ui" }, @@ -913,7 +913,7 @@ "users" ], "routerLink": null, - "anchor": "credentials-users", + "anchor": "users-list", "triggerAnchor": null, "section": "ui" }, @@ -952,7 +952,7 @@ "/dashboard" ], "routerLink": null, - "anchor": "dashboard", + "anchor": "main-dashboard", "triggerAnchor": null, "section": "ui" }, @@ -999,7 +999,7 @@ "cloud-backup" ], "routerLink": null, - "anchor": "data-protection-truecloud-backup-tasks", + "anchor": "cloud-backup-tasks", "triggerAnchor": null, "section": "ui" }, @@ -1061,7 +1061,7 @@ "cloudsync" ], "routerLink": null, - "anchor": "data-protection-cloud-sync-tasks", + "anchor": "cloudsync-tasks", "triggerAnchor": null, "section": "ui" }, @@ -1078,7 +1078,7 @@ "/data-protection" ], "routerLink": null, - "anchor": "data-protection", + "anchor": "data-protection-dashboard", "triggerAnchor": null, "section": "ui" }, @@ -1122,7 +1122,7 @@ "replication" ], "routerLink": null, - "anchor": "data-protection-replication-tasks", + "anchor": "replication-tasks", "triggerAnchor": null, "section": "ui" }, @@ -1165,7 +1165,7 @@ "rsync" ], "routerLink": null, - "anchor": "data-protection-rsync-tasks", + "anchor": "rsync-tasks", "triggerAnchor": null, "section": "ui" }, @@ -1184,7 +1184,7 @@ "priority" ], "routerLink": null, - "anchor": "data-protection-scrub-tasks-resilver-priority", + "anchor": "scrub-priority", "triggerAnchor": null, "section": "ui" }, @@ -1227,7 +1227,7 @@ "scrub" ], "routerLink": null, - "anchor": "data-protection-scrub-tasks", + "anchor": "scrub-tasks", "triggerAnchor": null, "section": "ui" }, @@ -1308,7 +1308,7 @@ "smart" ], "routerLink": null, - "anchor": "data-protection-periodic-s.m.a.r.t.-tests", + "anchor": "smart-tasks", "triggerAnchor": null, "section": "ui" }, @@ -1377,7 +1377,7 @@ "snapshot" ], "routerLink": null, - "anchor": "data-protection-periodic-snapshot-tasks", + "anchor": "snapshot-tasks", "triggerAnchor": null, "section": "ui" }, @@ -1394,7 +1394,7 @@ "vmware-snapshots" ], "routerLink": null, - "anchor": "data-protection-vmware-snapshots", + "anchor": "vmware-snapshots", "triggerAnchor": null, "section": "ui" }, @@ -1752,7 +1752,7 @@ "idmap" ], "routerLink": null, - "anchor": "directory-services-idmap", + "anchor": "idmap", "triggerAnchor": null, "section": "ui" }, @@ -1793,7 +1793,7 @@ "kerberoskeytabs" ], "routerLink": null, - "anchor": "directory-services-kerberos-keytabs", + "anchor": "kerberoskeytabs", "triggerAnchor": null, "section": "ui" }, @@ -1834,7 +1834,7 @@ "kerberosrealms" ], "routerLink": null, - "anchor": "directory-services-kerberos-realms", + "anchor": "kerberosrealms", "triggerAnchor": null, "section": "ui" }, @@ -1893,7 +1893,7 @@ "directory-services" ], "routerLink": null, - "anchor": "credentials-directory-services", + "anchor": "directory-services", "triggerAnchor": null, "section": "ui" }, @@ -2114,7 +2114,7 @@ "/network" ], "routerLink": null, - "anchor": "network", + "anchor": "network-dashboard", "triggerAnchor": null, "section": "ui" }, @@ -2158,7 +2158,7 @@ "exporters" ], "routerLink": null, - "anchor": "reporting-reporting-exporters", + "anchor": "exporters", "triggerAnchor": null, "section": "ui" }, @@ -2344,7 +2344,7 @@ "/reportsdashboard" ], "routerLink": null, - "anchor": "reporting", + "anchor": "reports-dashboard", "triggerAnchor": null, "section": "ui" }, @@ -2523,7 +2523,7 @@ "services" ], "routerLink": null, - "anchor": "system-services", + "anchor": "services", "triggerAnchor": null, "section": "ui" }, @@ -2567,7 +2567,7 @@ "/sharing" ], "routerLink": null, - "anchor": "shares", + "anchor": "shares-dashboard", "triggerAnchor": null, "section": "ui" }, @@ -2586,7 +2586,7 @@ "authorized-access" ], "routerLink": null, - "anchor": "shares-iscsi-authorized-access", + "anchor": "authorized-access-list", "triggerAnchor": null, "section": "ui" }, @@ -2605,7 +2605,7 @@ "extents" ], "routerLink": null, - "anchor": "shares-iscsi-extents", + "anchor": "extent-list", "triggerAnchor": null, "section": "ui" }, @@ -2624,7 +2624,7 @@ "fibre-channel-ports" ], "routerLink": null, - "anchor": "shares-iscsi-fibre-channel-ports", + "anchor": "fibre-channel-ports-list", "triggerAnchor": null, "section": "ui" }, @@ -2643,7 +2643,7 @@ "fibre-channel-ports" ], "routerLink": null, - "anchor": "shares-iscsi-fibre-channel-ports", + "anchor": "fibre-channel-ports-list", "triggerAnchor": null, "section": "ui" }, @@ -2663,7 +2663,7 @@ "add" ], "routerLink": null, - "anchor": "shares-initiators-add-initiator", + "anchor": "add-initiator", "triggerAnchor": null, "section": "ui" }, @@ -2684,7 +2684,7 @@ "initiators" ], "routerLink": null, - "anchor": "shares-iscsi-initiators", + "anchor": "initiator-list", "triggerAnchor": null, "section": "ui" }, @@ -2723,7 +2723,7 @@ "portals" ], "routerLink": null, - "anchor": "shares-iscsi-portals", + "anchor": "portal-list", "triggerAnchor": null, "section": "ui" }, @@ -2742,7 +2742,7 @@ "targets" ], "routerLink": null, - "anchor": "shares-iscsi-targets", + "anchor": "target-list", "triggerAnchor": null, "section": "ui" }, @@ -2786,7 +2786,7 @@ "nfs" ], "routerLink": null, - "anchor": "shares-nfs", + "anchor": "nfs-list", "triggerAnchor": null, "section": "ui" }, @@ -2805,7 +2805,7 @@ "sessions" ], "routerLink": null, - "anchor": "shares-nfs-nfs-sessions", + "anchor": "nfs-session-list", "triggerAnchor": null, "section": "ui" }, @@ -2852,7 +2852,7 @@ "smb" ], "routerLink": null, - "anchor": "shares-smb", + "anchor": "smb-list", "triggerAnchor": null, "section": "ui" }, @@ -2971,7 +2971,7 @@ "shell" ], "routerLink": null, - "anchor": "system-shell", + "anchor": "shell", "triggerAnchor": null, "section": "ui" }, @@ -3147,7 +3147,7 @@ "disks" ], "routerLink": null, - "anchor": "storage-disks", + "anchor": "disk-list", "triggerAnchor": null, "section": "ui" }, @@ -3214,7 +3214,7 @@ "/storage" ], "routerLink": null, - "anchor": "storage", + "anchor": "storage-dashboard", "triggerAnchor": null, "section": "ui" }, @@ -3342,7 +3342,7 @@ "advanced" ], "routerLink": null, - "anchor": "system-advanced-settings", + "anchor": "advanced-settings", "triggerAnchor": null, "section": "ui" }, @@ -3700,7 +3700,7 @@ "cron" ], "routerLink": null, - "anchor": "system-cron-jobs", + "anchor": "cron", "triggerAnchor": null, "section": "ui" }, @@ -3849,7 +3849,7 @@ "initshutdown" ], "routerLink": null, - "anchor": "system-init/shutdown-scripts", + "anchor": "init-shutdown", "triggerAnchor": null, "section": "ui" }, @@ -4259,7 +4259,7 @@ "tunable" ], "routerLink": null, - "anchor": "system-tunables", + "anchor": "tunable", "triggerAnchor": null, "section": "ui" }, @@ -4418,7 +4418,7 @@ "services" ], "routerLink": null, - "anchor": "system-alert-settings-alert-services", + "anchor": "alert-service-list", "triggerAnchor": null, "section": "ui" }, @@ -4510,7 +4510,7 @@ "boot" ], "routerLink": null, - "anchor": "system-boot-environments", + "anchor": "boot-list", "triggerAnchor": null, "section": "ui" }, @@ -4529,7 +4529,7 @@ "status" ], "routerLink": null, - "anchor": "system-boot-boot-pool-status", + "anchor": "boot-status", "triggerAnchor": null, "section": "ui" }, @@ -4550,7 +4550,7 @@ "jbof" ], "routerLink": null, - "anchor": "system-view-enclosure-nvme-of-expansion-shelves", + "anchor": "jbof", "triggerAnchor": null, "section": "ui" }, @@ -4569,7 +4569,7 @@ "failover" ], "routerLink": null, - "anchor": "system-failover", + "anchor": "failover", "triggerAnchor": null, "section": "ui" }, @@ -4696,7 +4696,7 @@ "general" ], "routerLink": null, - "anchor": "system-general-settings", + "anchor": "general-settings", "triggerAnchor": null, "section": "ui" }, @@ -5240,7 +5240,7 @@ "eula" ], "routerLink": null, - "anchor": "system-support-eula", + "anchor": "eula", "triggerAnchor": null, "section": "ui" }, @@ -5257,7 +5257,7 @@ "support" ], "routerLink": null, - "anchor": "system-support", + "anchor": "support", "triggerAnchor": null, "section": "ui" }, @@ -5324,7 +5324,7 @@ "manualupdate" ], "routerLink": null, - "anchor": "system-update-manual-update", + "anchor": "manual-update", "triggerAnchor": null, "section": "ui" }, @@ -5390,7 +5390,7 @@ "two-factor" ], "routerLink": null, - "anchor": "credentials-two-factor-authentication", + "anchor": "two-factor", "triggerAnchor": null, "section": "ui" }, @@ -5455,7 +5455,7 @@ "/vm" ], "routerLink": null, - "anchor": "virtual-machines", + "anchor": "vm-list", "triggerAnchor": null, "section": "ui" } From 464a06e861876d4c0bfe7bd13431d7bb70b60793 Mon Sep 17 00:00:00 2001 From: RehanY147 Date: Mon, 6 Jan 2025 03:40:07 +0500 Subject: [PATCH 06/32] NAS-131829 / 25.04 / Adds error log for middleware and efficient calls (#11253) --- src/app/app.component.ts | 6 +- .../core/testing/classes/mock-api.service.ts | 4 +- .../mock-enclosure-api.service.ts | 4 +- .../core/testing/utils/empty-auth.service.ts | 1 - src/app/core/testing/utils/mock-api.utils.ts | 10 +- src/app/core/testing/utils/mock-auth.utils.ts | 9 +- .../modules/auth/auth-guard.service.spec.ts | 4 +- src/app/modules/auth/auth-guard.service.ts | 6 +- src/app/modules/auth/auth.service.spec.ts | 35 +++--- src/app/modules/auth/auth.service.ts | 34 ++---- .../auth/two-factor-guard.service.spec.ts | 5 +- .../modules/auth/two-factor-guard.service.ts | 4 +- .../translations/translations-loaded.guard.ts | 6 +- src/app/modules/websocket/api.service.ts | 4 +- .../modules/websocket/ping.service.spec.ts | 6 +- src/app/modules/websocket/ping.service.ts | 8 +- .../subscription-manager.service.spec.ts | 9 +- .../websocket/subscription-manager.service.ts | 15 ++- .../websocket/websocket-handler.service.ts | 25 +++-- .../credentials/users/store/user.effects.ts | 3 +- src/app/pages/signin/signin.component.spec.ts | 4 +- src/app/pages/signin/signin.component.ts | 6 +- .../pages/signin/store/signin.store.spec.ts | 5 +- src/app/pages/signin/store/signin.store.ts | 4 +- .../config-reset.component.spec.ts | 5 +- .../config-reset/config-reset.component.ts | 4 +- .../failover/failover.component.ts | 4 +- .../failover-settings.component.spec.ts | 4 +- .../gui/gui-form/gui-form.component.spec.ts | 10 +- .../gui/gui-form/gui-form.component.ts | 4 +- .../manual-update-form.component.spec.ts | 4 - .../services/websocket-status.service.spec.ts | 104 ++++++++++++++++++ src/app/services/websocket-status.service.ts | 44 ++++++++ .../store/preferences/preferences.effects.ts | 18 ++- src/main.ts | 8 +- 35 files changed, 302 insertions(+), 124 deletions(-) create mode 100644 src/app/services/websocket-status.service.spec.ts create mode 100644 src/app/services/websocket-status.service.ts diff --git a/src/app/app.component.ts b/src/app/app.component.ts index b8ddb79253a..1c07d95c335 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -6,10 +6,10 @@ import { Router, NavigationEnd, RouterOutlet } from '@angular/router'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { filter, tap } from 'rxjs'; import { WINDOW } from 'app/helpers/window.helper'; -import { AuthService } from 'app/modules/auth/auth.service'; import { LayoutService } from 'app/modules/layout/layout.service'; import { PingService } from 'app/modules/websocket/ping.service'; import { DetectBrowserService } from 'app/services/detect-browser.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; @UntilDestroy() @Component({ @@ -24,13 +24,13 @@ export class AppComponent implements OnInit { constructor( public title: Title, private router: Router, - private authService: AuthService, + private wsStatus: WebSocketStatusService, private detectBrowser: DetectBrowserService, private layoutService: LayoutService, private pingService: PingService, @Inject(WINDOW) private window: Window, ) { - this.authService.isAuthenticated$.pipe(untilDestroyed(this)).subscribe((isAuthenticated) => { + this.wsStatus.isAuthenticated$.pipe(untilDestroyed(this)).subscribe((isAuthenticated) => { this.isAuthenticated = isAuthenticated; }); this.title.setTitle('TrueNAS - ' + this.window.location.hostname); diff --git a/src/app/core/testing/classes/mock-api.service.ts b/src/app/core/testing/classes/mock-api.service.ts index 16c31e8ed88..7fe01659149 100644 --- a/src/app/core/testing/classes/mock-api.service.ts +++ b/src/app/core/testing/classes/mock-api.service.ts @@ -22,6 +22,7 @@ import { Job } from 'app/interfaces/job.interface'; import { ApiService } from 'app/modules/websocket/api.service'; import { SubscriptionManagerService } from 'app/modules/websocket/subscription-manager.service'; import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; /** * Better than just expect.anything() because it allows null and undefined. @@ -47,10 +48,11 @@ export class MockApiService extends ApiService { constructor( wsHandler: WebSocketHandlerService, + wsStatus: WebSocketStatusService, subscriptionManager: SubscriptionManagerService, translate: TranslateService, ) { - super(wsHandler, subscriptionManager, translate); + super(wsHandler, wsStatus, subscriptionManager, translate); this.call = jest.fn(); this.job = jest.fn(); diff --git a/src/app/core/testing/mock-enclosure/mock-enclosure-api.service.ts b/src/app/core/testing/mock-enclosure/mock-enclosure-api.service.ts index f9ec4dc6de4..b20ba4ae8f2 100644 --- a/src/app/core/testing/mock-enclosure/mock-enclosure-api.service.ts +++ b/src/app/core/testing/mock-enclosure/mock-enclosure-api.service.ts @@ -10,6 +10,7 @@ import { SystemInfo } from 'app/interfaces/system-info.interface'; import { ApiService } from 'app/modules/websocket/api.service'; import { SubscriptionManagerService } from 'app/modules/websocket/subscription-manager.service'; import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; @Injectable({ providedIn: 'root', @@ -20,10 +21,11 @@ export class MockEnclosureApiService extends ApiService { constructor( wsManager: WebSocketHandlerService, + wsStatus: WebSocketStatusService, subscriptionManager: SubscriptionManagerService, translate: TranslateService, ) { - super(wsManager, subscriptionManager, translate); + super(wsManager, wsStatus, subscriptionManager, translate); console.warn('MockEnclosureApiService is in effect. Some calls will be mocked'); } diff --git a/src/app/core/testing/utils/empty-auth.service.ts b/src/app/core/testing/utils/empty-auth.service.ts index 62d28659523..042356fb1ee 100644 --- a/src/app/core/testing/utils/empty-auth.service.ts +++ b/src/app/core/testing/utils/empty-auth.service.ts @@ -3,7 +3,6 @@ import { AuthService } from 'app/modules/auth/auth.service'; export class EmptyAuthService { readonly authToken$ = getMissingInjectionErrorObservable(AuthService.name); - readonly isAuthenticated$ = getMissingInjectionErrorObservable(AuthService.name); readonly user$ = getMissingInjectionErrorObservable(AuthService.name); readonly isSysAdmin$ = getMissingInjectionErrorObservable(AuthService.name); readonly userTwoFactorConfig$ = getMissingInjectionErrorObservable(AuthService.name); diff --git a/src/app/core/testing/utils/mock-api.utils.ts b/src/app/core/testing/utils/mock-api.utils.ts index ab3fc3b7644..a617bc365b6 100644 --- a/src/app/core/testing/utils/mock-api.utils.ts +++ b/src/app/core/testing/utils/mock-api.utils.ts @@ -14,6 +14,7 @@ import { Job } from 'app/interfaces/job.interface'; import { ApiService } from 'app/modules/websocket/api.service'; import { SubscriptionManagerService } from 'app/modules/websocket/subscription-manager.service'; import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; /** * This is a sugar syntax for creating simple api mocks. @@ -49,11 +50,12 @@ export function mockApi( { provide: ApiService, useFactory: ( + wsStatus: WebSocketStatusService, wsHandler: WebSocketHandlerService, translate: TranslateService, ) => { const subscriptionManager = {} as SubscriptionManagerService; - const mockApiService = new MockApiService(wsHandler, subscriptionManager, translate); + const mockApiService = new MockApiService(wsHandler, wsStatus, subscriptionManager, translate); (mockResponses || []).forEach((mockResponse) => { if (mockResponse.type === MockApiResponseType.Call) { mockApiService.mockCall(mockResponse.method, mockResponse.response); @@ -66,7 +68,11 @@ export function mockApi( }); return mockApiService; }, - deps: [WebSocketHandlerService, TranslateService], + deps: [WebSocketStatusService, WebSocketHandlerService, TranslateService], + }, + { + provide: WebSocketStatusService, + useValue: ({} as WebSocketStatusService), }, { provide: MockApiService, diff --git a/src/app/core/testing/utils/mock-auth.utils.ts b/src/app/core/testing/utils/mock-auth.utils.ts index 98778a5df6d..b986099cef7 100644 --- a/src/app/core/testing/utils/mock-auth.utils.ts +++ b/src/app/core/testing/utils/mock-auth.utils.ts @@ -11,8 +11,8 @@ import { Role } from 'app/enums/role.enum'; import { LoggedInUser } from 'app/interfaces/ds-cache.interface'; import { AuthService } from 'app/modules/auth/auth.service'; import { ApiService } from 'app/modules/websocket/api.service'; -import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; import { TokenLastUsedService } from 'app/services/token-last-used.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; export const dummyUser = { privilege: { @@ -40,13 +40,14 @@ export function mockAuth( provide: AuthService, useFactory: () => { const mockService = new MockAuthService( - createSpyObject(WebSocketHandlerService, { - isConnected$: of(true), - }), createSpyObject(Store), createSpyObject(ApiService), createSpyObject(TokenLastUsedService), createSpyObject(Window), + createSpyObject(WebSocketStatusService, { + isConnected$: of(true), + isAuthenticated$: of(false), + }), ); mockService.setUser(user as LoggedInUser); diff --git a/src/app/modules/auth/auth-guard.service.spec.ts b/src/app/modules/auth/auth-guard.service.spec.ts index 72d67f0ec21..2c67e9eb4b1 100644 --- a/src/app/modules/auth/auth-guard.service.spec.ts +++ b/src/app/modules/auth/auth-guard.service.spec.ts @@ -6,7 +6,7 @@ import { } from '@ngneat/spectator/jest'; import { BehaviorSubject } from 'rxjs'; import { AuthGuardService } from 'app/modules/auth/auth-guard.service'; -import { AuthService } from 'app/modules/auth/auth.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; describe('AuthGuardService', () => { const redirectUrl = 'storage/disks'; @@ -17,7 +17,7 @@ describe('AuthGuardService', () => { let spectator: SpectatorService; const createService = createServiceFactory({ service: AuthGuardService, - providers: [mockProvider(AuthService, { isAuthenticated$ })], + providers: [mockProvider(WebSocketStatusService, { isAuthenticated$ })], }); beforeEach(() => { diff --git a/src/app/modules/auth/auth-guard.service.ts b/src/app/modules/auth/auth-guard.service.ts index 48b98da2782..aa29ba14d1d 100644 --- a/src/app/modules/auth/auth-guard.service.ts +++ b/src/app/modules/auth/auth-guard.service.ts @@ -2,7 +2,7 @@ import { Inject, Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { WINDOW } from 'app/helpers/window.helper'; -import { AuthService } from 'app/modules/auth/auth.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; @UntilDestroy() @Injectable({ @@ -12,10 +12,10 @@ export class AuthGuardService { isAuthenticated = false; constructor( private router: Router, - private authService: AuthService, + private wsStatus: WebSocketStatusService, @Inject(WINDOW) private window: Window, ) { - this.authService.isAuthenticated$.pipe(untilDestroyed(this)).subscribe((isLoggedIn) => { + this.wsStatus.isAuthenticated$.pipe(untilDestroyed(this)).subscribe((isLoggedIn) => { this.isAuthenticated = isLoggedIn; }); } diff --git a/src/app/modules/auth/auth.service.spec.ts b/src/app/modules/auth/auth.service.spec.ts index 6a0bc54de51..a51e7c1364c 100644 --- a/src/app/modules/auth/auth.service.spec.ts +++ b/src/app/modules/auth/auth.service.spec.ts @@ -7,7 +7,9 @@ import { StorageStrategyStub, withLocalStorage, } from 'ngx-webstorage'; import * as rxjs from 'rxjs'; -import { firstValueFrom, of } from 'rxjs'; +import { + BehaviorSubject, firstValueFrom, +} from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; import { MockApiService } from 'app/core/testing/classes/mock-api.service'; import { mockCall, mockApi } from 'app/core/testing/utils/mock-api.utils'; @@ -21,7 +23,7 @@ import { LoggedInUser } from 'app/interfaces/ds-cache.interface'; import { Preferences } from 'app/interfaces/preferences.interface'; import { AuthService } from 'app/modules/auth/auth.service'; import { ApiService } from 'app/modules/websocket/api.service'; -import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; const authMeUser = { pw_dir: 'dir', @@ -40,9 +42,12 @@ const authMeUser = { }, } as LoggedInUser; +const mockWsStatus = new WebSocketStatusService(); + describe('AuthService', () => { let spectator: SpectatorService; let testScheduler: TestScheduler; + let timer$: BehaviorSubject<0>; const createService = createServiceFactory({ service: AuthService, providers: [ @@ -59,9 +64,10 @@ describe('AuthService', () => { }, } as LoginExResponse), ]), - mockProvider(WebSocketHandlerService, { - isConnected$: of(true), - }), + { + provide: WebSocketStatusService, + useValue: mockWsStatus, + }, { provide: STORAGE_STRATEGIES, useFactory: () => new StorageStrategyStub(LocalStorageStrategy.strategyName), @@ -78,11 +84,14 @@ describe('AuthService', () => { testScheduler = new TestScheduler((actual, expected) => { expect(actual).toEqual(expected); }); + mockWsStatus.setConnectionStatus(true); + timer$ = new BehaviorSubject(0); + jest.spyOn(rxjs, 'timer').mockReturnValue(timer$.asObservable()); }); describe('Login', () => { it('initializes auth session with triggers and token with username/password login', () => { - jest.spyOn(rxjs, 'timer').mockReturnValueOnce(of(0)); + timer$.next(0); const obs$ = spectator.service.login('dummy', 'dummy'); @@ -91,10 +100,6 @@ describe('AuthService', () => { '(a|)', { a: LoginResult.Success }, ); - expectObservable(spectator.service.isAuthenticated$).toBe( - 'c', - { c: true }, - ); expectObservable(spectator.service.authToken$).toBe( 'd', { d: 'DUMMY_TOKEN' }, @@ -109,7 +114,7 @@ describe('AuthService', () => { }); it('initializes auth session with triggers and token with token login', () => { - jest.spyOn(rxjs, 'timer').mockReturnValueOnce(of(0)); + timer$.next(0); const obs$ = spectator.service.loginWithToken(); @@ -118,10 +123,6 @@ describe('AuthService', () => { '(a|)', { a: LoginResult.Success }, ); - expectObservable(spectator.service.isAuthenticated$).toBe( - 'c', - { c: true }, - ); expectObservable(spectator.service.authToken$).toBe( 'd', { d: 'DUMMY_TOKEN' }, @@ -146,10 +147,6 @@ describe('AuthService', () => { a: undefined, }, ); - expectObservable(spectator.service.isAuthenticated$).toBe( - 'c', - { c: false }, - ); expectObservable(spectator.service.authToken$).toBe( '|', {}, diff --git a/src/app/modules/auth/auth.service.ts b/src/app/modules/auth/auth.service.ts index 33b6d6834a3..71c816b10bd 100644 --- a/src/app/modules/auth/auth.service.ts +++ b/src/app/modules/auth/auth.service.ts @@ -3,7 +3,6 @@ import { Store } from '@ngrx/store'; import { LocalStorage } from 'ngx-webstorage'; import { BehaviorSubject, - combineLatest, filter, map, Observable, @@ -23,8 +22,8 @@ import { LoginExMechanism, LoginExResponse, LoginExResponseType } from 'app/inte import { LoggedInUser } from 'app/interfaces/ds-cache.interface'; import { GlobalTwoFactorConfig } from 'app/interfaces/two-factor-config.interface'; import { ApiService } from 'app/modules/websocket/api.service'; -import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; import { TokenLastUsedService } from 'app/services/token-last-used.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; import { AppState } from 'app/store'; import { adminUiInitialized } from 'app/store/admin-panel/admin.actions'; @@ -51,19 +50,8 @@ export class AuthService { return Boolean(this.token) && this.token !== 'null'; } - private isLoggedIn$ = new BehaviorSubject(false); - private generateTokenSubscription: Subscription | null; - readonly isAuthenticated$ = combineLatest([ - this.wsManager.isConnected$, - this.isLoggedIn$.asObservable(), - ]).pipe( - switchMap(([isConnected, isLoggedIn]) => { - return of(isConnected && isLoggedIn); - }), - ); - readonly user$ = this.loggedInUser$.asObservable(); /** @@ -82,11 +70,11 @@ export class AuthService { private cachedGlobalTwoFactorConfig: GlobalTwoFactorConfig | null; constructor( - private wsManager: WebSocketHandlerService, private store$: Store, private api: ApiService, private tokenLastUsedService: TokenLastUsedService, @Inject(WINDOW) private window: Window, + private wsStatus: WebSocketStatusService, ) { this.setupAuthenticationUpdate(); this.setupWsConnectionUpdate(); @@ -183,7 +171,7 @@ export class AuthService { tap(() => { this.clearAuthToken(); this.api.clearSubscriptions(); - this.isLoggedIn$.next(false); + this.wsStatus.setLoginStatus(false); }), ); } @@ -202,18 +190,18 @@ export class AuthService { this.loggedInUser$.next(result.user_info); if (!result.user_info?.privilege?.webui_access) { - this.isLoggedIn$.next(false); + this.wsStatus.setLoginStatus(false); return of(LoginResult.NoAccess); } - this.isLoggedIn$.next(true); + this.wsStatus.setLoginStatus(true); this.window.sessionStorage.setItem('loginBannerDismissed', 'true'); return this.authToken$.pipe( take(1), map(() => LoginResult.Success), ); } - this.isLoggedIn$.next(false); + this.wsStatus.setLoginStatus(false); if (result.response_type === LoginExResponseType.OtpRequired) { return of(LoginResult.NoOtp); @@ -226,8 +214,8 @@ export class AuthService { private setupPeriodicTokenGeneration(): void { if (!this.generateTokenSubscription || this.generateTokenSubscription.closed) { this.generateTokenSubscription = timer(0, this.tokenRegenerationTimeMillis).pipe( - switchMap(() => this.isAuthenticated$.pipe(take(1))), - filter((isAuthenticated) => isAuthenticated), + switchMap(() => this.wsStatus.isAuthenticated$.pipe(take(1))), + filter(Boolean), switchMap(() => this.api.call('auth.generate_token')), tap((token) => this.latestTokenGenerated$.next(token)), ).subscribe(); @@ -243,7 +231,7 @@ export class AuthService { } private setupAuthenticationUpdate(): void { - this.isAuthenticated$.subscribe({ + this.wsStatus.isAuthenticated$.subscribe({ next: (isAuthenticated) => { if (isAuthenticated) { this.store$.dispatch(adminUiInitialized()); @@ -260,8 +248,8 @@ export class AuthService { } private setupWsConnectionUpdate(): void { - this.wsManager.isConnected$.pipe(filter((isConnected) => !isConnected)).subscribe(() => { - this.isLoggedIn$.next(false); + this.wsStatus.isConnected$.pipe(filter((isConnected) => !isConnected)).subscribe(() => { + this.wsStatus.setLoginStatus(false); }); } diff --git a/src/app/modules/auth/two-factor-guard.service.spec.ts b/src/app/modules/auth/two-factor-guard.service.spec.ts index 721b59de6fb..3ca8fe323f5 100644 --- a/src/app/modules/auth/two-factor-guard.service.spec.ts +++ b/src/app/modules/auth/two-factor-guard.service.spec.ts @@ -5,6 +5,7 @@ import { GlobalTwoFactorConfig, UserTwoFactorConfig } from 'app/interfaces/two-f import { AuthService } from 'app/modules/auth/auth.service'; import { TwoFactorGuardService } from 'app/modules/auth/two-factor-guard.service'; import { DialogService } from 'app/modules/dialog/dialog.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; describe('TwoFactorGuardService', () => { let spectator: SpectatorService; @@ -18,8 +19,10 @@ describe('TwoFactorGuardService', () => { service: TwoFactorGuardService, providers: [ mockProvider(Router), - mockProvider(AuthService, { + mockProvider(WebSocketStatusService, { isAuthenticated$, + }), + mockProvider(AuthService, { userTwoFactorConfig$, getGlobalTwoFactorConfig, hasRole: jest.fn(() => hasRole$), diff --git a/src/app/modules/auth/two-factor-guard.service.ts b/src/app/modules/auth/two-factor-guard.service.ts index 58ae5ce005f..96b961fad3f 100644 --- a/src/app/modules/auth/two-factor-guard.service.ts +++ b/src/app/modules/auth/two-factor-guard.service.ts @@ -10,6 +10,7 @@ import { import { Role } from 'app/enums/role.enum'; import { AuthService } from 'app/modules/auth/auth.service'; import { DialogService } from 'app/modules/dialog/dialog.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; @UntilDestroy() @Injectable({ @@ -19,12 +20,13 @@ export class TwoFactorGuardService implements CanActivateChild { constructor( private router: Router, private authService: AuthService, + private wsStatus: WebSocketStatusService, private dialogService: DialogService, private translate: TranslateService, ) { } canActivateChild(_: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - return this.authService.isAuthenticated$.pipe( + return this.wsStatus.isAuthenticated$.pipe( take(1), switchMap((isAuthenticated) => { if (!isAuthenticated) { diff --git a/src/app/modules/language/translations/translations-loaded.guard.ts b/src/app/modules/language/translations/translations-loaded.guard.ts index c8de8dba5f4..6cb6d3b18af 100644 --- a/src/app/modules/language/translations/translations-loaded.guard.ts +++ b/src/app/modules/language/translations/translations-loaded.guard.ts @@ -5,7 +5,7 @@ import { catchError, map, timeout, } from 'rxjs/operators'; import { LanguageService } from 'app/modules/language/language.service'; -import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; /** * Ensures that translations have been loaded. @@ -18,9 +18,9 @@ export class TranslationsLoadedGuard { isConnected = false; constructor( private languageService: LanguageService, - private wsHandler: WebSocketHandlerService, + private wsStatus: WebSocketStatusService, ) { - this.wsHandler.isConnected$.pipe(untilDestroyed(this)).subscribe((isConnected) => { + this.wsStatus.isConnected$.pipe(untilDestroyed(this)).subscribe((isConnected) => { this.isConnected = isConnected; }); } diff --git a/src/app/modules/websocket/api.service.ts b/src/app/modules/websocket/api.service.ts index 596e13559ad..ffa3952252e 100644 --- a/src/app/modules/websocket/api.service.ts +++ b/src/app/modules/websocket/api.service.ts @@ -34,6 +34,7 @@ import { import { Job } from 'app/interfaces/job.interface'; import { SubscriptionManagerService } from 'app/modules/websocket/subscription-manager.service'; import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; @Injectable({ providedIn: 'root', @@ -43,10 +44,11 @@ export class ApiService { constructor( protected wsHandler: WebSocketHandlerService, + protected wsStatus: WebSocketStatusService, protected subscriptionManager: SubscriptionManagerService, protected translate: TranslateService, ) { - this.wsHandler.isConnected$?.subscribe((isConnected) => { + this.wsStatus.isConnected$?.subscribe((isConnected) => { if (!isConnected) { this.clearSubscriptions(); } diff --git a/src/app/modules/websocket/ping.service.spec.ts b/src/app/modules/websocket/ping.service.spec.ts index 95d77e61a13..e451ccb8dd4 100644 --- a/src/app/modules/websocket/ping.service.spec.ts +++ b/src/app/modules/websocket/ping.service.spec.ts @@ -1,9 +1,9 @@ import { discardPeriodicTasks, fakeAsync, tick } from '@angular/core/testing'; import { createServiceFactory, mockProvider, SpectatorService } from '@ngneat/spectator/jest'; import { BehaviorSubject, of } from 'rxjs'; -import { AuthService } from 'app/modules/auth/auth.service'; import { PingService } from 'app/modules/websocket/ping.service'; import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; describe('PingService', () => { let spectator: SpectatorService; @@ -15,9 +15,9 @@ describe('PingService', () => { providers: [ mockProvider(WebSocketHandlerService, { scheduleCall: jest.fn(), - isConnected$: of(true), }), - mockProvider(AuthService, { + mockProvider(WebSocketStatusService, { + isConnected$: of(true), isAuthenticated$, }), ], diff --git a/src/app/modules/websocket/ping.service.ts b/src/app/modules/websocket/ping.service.ts index fe86feca98c..4298e2a21fd 100644 --- a/src/app/modules/websocket/ping.service.ts +++ b/src/app/modules/websocket/ping.service.ts @@ -4,8 +4,8 @@ import { UUID } from 'angular2-uuid'; import { filter, interval, switchMap, tap, } from 'rxjs'; -import { AuthService } from 'app/modules/auth/auth.service'; import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; @UntilDestroy() @Injectable({ @@ -16,14 +16,14 @@ export class PingService { constructor( private wsHandler: WebSocketHandlerService, - private authService: AuthService, + private wsStatus: WebSocketStatusService, ) {} setupPing(): void { interval(this.pingTimeoutMillis).pipe( - switchMap(() => this.wsHandler.isConnected$), + switchMap(() => this.wsStatus.isConnected$), filter(Boolean), - switchMap(() => this.authService.isAuthenticated$), + switchMap(() => this.wsStatus.isAuthenticated$), filter(Boolean), tap(() => this.wsHandler.scheduleCall({ id: UUID.UUID(), diff --git a/src/app/modules/websocket/subscription-manager.service.spec.ts b/src/app/modules/websocket/subscription-manager.service.spec.ts index 9c66b06343a..9a943276166 100644 --- a/src/app/modules/websocket/subscription-manager.service.spec.ts +++ b/src/app/modules/websocket/subscription-manager.service.spec.ts @@ -1,8 +1,9 @@ import { createServiceFactory, mockProvider, SpectatorService } from '@ngneat/spectator/jest'; import { UUID } from 'angular2-uuid'; -import { Subject } from 'rxjs'; +import { of, Subject } from 'rxjs'; import { SubscriptionManagerService } from 'app/modules/websocket/subscription-manager.service'; import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; describe('SubscriptionManagerService', () => { let spectator: SpectatorService; @@ -16,6 +17,12 @@ describe('SubscriptionManagerService', () => { responses$, scheduleCall: jest.fn(), }), + mockProvider(WebSocketStatusService, { + isConnected$: of(true), + isAuthenticated$: of(true), + isConnected: true, + isAuthenticated: true, + }), ], }); diff --git a/src/app/modules/websocket/subscription-manager.service.ts b/src/app/modules/websocket/subscription-manager.service.ts index b8be6932725..59143d46818 100644 --- a/src/app/modules/websocket/subscription-manager.service.ts +++ b/src/app/modules/websocket/subscription-manager.service.ts @@ -6,6 +6,7 @@ import { import { isCollectionUpdateMessage, isSuccessfulResponse } from 'app/helpers/api.helper'; import { ApiEventMethod, ApiEventTyped, CollectionUpdateMessage } from 'app/interfaces/api-message.interface'; import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; type Method = ApiEventMethod | `${ApiEventMethod}:${string}`; @@ -35,6 +36,7 @@ export class SubscriptionManagerService { private subscriptionsToClose = new Set(); constructor( + private wsStatus: WebSocketStatusService, private wsHandler: WebSocketHandlerService, ) { this.listenForSubscriptionsToBeEstablished(); @@ -122,11 +124,14 @@ export class SubscriptionManagerService { private cancelSubscription(method: Method): void { const backendSubscriptionId = this.establishedSubscriptions.get(method); - this.wsHandler.scheduleCall({ - id: UUID.UUID(), - method: 'core.unsubscribe', - params: [backendSubscriptionId], - }); + const isAuthenticated = this.wsStatus.isAuthenticated; + if (isAuthenticated) { + this.wsHandler.scheduleCall({ + id: UUID.UUID(), + method: 'core.unsubscribe', + params: [backendSubscriptionId], + }); + } this.establishedSubscriptions.delete(method); this.openSubscriptions.delete(method); diff --git a/src/app/modules/websocket/websocket-handler.service.ts b/src/app/modules/websocket/websocket-handler.service.ts index 912b61d875d..cf12840ec5b 100644 --- a/src/app/modules/websocket/websocket-handler.service.ts +++ b/src/app/modules/websocket/websocket-handler.service.ts @@ -17,12 +17,15 @@ import { timer, } from 'rxjs'; import { webSocket as rxjsWebSocket } from 'rxjs/webSocket'; -import { makeRequestMessage } from 'app/helpers/api.helper'; +import { isErrorResponse, makeRequestMessage } from 'app/helpers/api.helper'; import { WEBSOCKET } from 'app/helpers/websocket.helper'; import { WINDOW } from 'app/helpers/window.helper'; -import { RequestMessage, IncomingMessage } from 'app/interfaces/api-message.interface'; +import { + RequestMessage, IncomingMessage, +} from 'app/interfaces/api-message.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; import { WebSocketConnection } from 'app/modules/websocket/websocket-connection.class'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; type ApiCall = Required>; @@ -34,9 +37,6 @@ export class WebSocketHandlerService { private readonly wsConnection: WebSocketConnection = new WebSocketConnection(this.webSocket); private connectionUrl = (this.window.location.protocol === 'https:' ? 'wss://' : 'ws://') + environment.remote + '/api/current'; - private readonly connectionEstablished$ = new BehaviorSubject(false); - readonly isConnected$ = this.connectionEstablished$.asObservable(); - private readonly reconnectTimeoutMillis = 5 * 1000; private reconnectTimerSubscription: Subscription | undefined; private readonly maxConcurrentCalls = 20; @@ -71,9 +71,8 @@ export class WebSocketHandlerService { private showingConcurrentCallsError = false; private callsInConcurrentCallsError = new Set(); - private subscriptionIds: Record = {}; - constructor( + private wsStatus: WebSocketStatusService, private dialogService: DialogService, private translate: TranslateService, @Inject(WINDOW) protected window: Window, @@ -90,7 +89,7 @@ export class WebSocketHandlerService { private setupScheduledCalls(): void { combineLatest([ this.triggerNextCall$, - this.isConnected$, + this.wsStatus.isConnected$, ]).pipe( filter(([, isConnected]) => isConnected), tap(() => { @@ -114,7 +113,11 @@ export class WebSocketHandlerService { return this.responses$.pipe( filter((message) => 'id' in message && message.id === call.id), take(1), - tap(() => { + tap((message) => { + // Following `if` block needs to be removed once NAS-131829 is resolved + if (isErrorResponse(message)) { + console.error('Error: ', message.error); + } this.activeCalls--; this.pendingCalls.delete(call.id); this.triggerNextCall$.next(); @@ -178,7 +181,7 @@ export class WebSocketHandlerService { } private onClose(event: CloseEvent): void { - this.connectionEstablished$.next(false); + this.wsStatus.setConnectionStatus(false); this.isConnectionLive$.next(false); if (this.reconnectTimerSubscription) { return; @@ -203,7 +206,7 @@ export class WebSocketHandlerService { return; } this.shutDownInProgress = false; - this.connectionEstablished$.next(true); + this.wsStatus.setConnectionStatus(true); performance.mark('WS Connected'); performance.measure('Establishing WS connection', 'WS Init', 'WS Connected'); diff --git a/src/app/pages/credentials/users/store/user.effects.ts b/src/app/pages/credentials/users/store/user.effects.ts index b33edebf2d1..58179cd50bc 100644 --- a/src/app/pages/credentials/users/store/user.effects.ts +++ b/src/app/pages/credentials/users/store/user.effects.ts @@ -5,6 +5,7 @@ import { TranslateService } from '@ngx-translate/core'; import { of } from 'rxjs'; import { catchError, filter, map, switchMap, + take, } from 'rxjs/operators'; import { CollectionChangeType } from 'app/enums/api.enum'; import { QueryParams } from 'app/interfaces/query-api.interface'; @@ -24,7 +25,7 @@ import { waitForPreferences } from 'app/store/preferences/preferences.selectors' export class UserEffects { loadUsers$ = createEffect(() => this.actions$.pipe( ofType(userPageEntered, builtinUsersToggled), - switchMap(() => this.store$.pipe(waitForPreferences)), + switchMap(() => this.store$.pipe(waitForPreferences, take(1))), switchMap((preferences) => { let params: QueryParams = []; if (preferences.hideBuiltinUsers) { diff --git a/src/app/pages/signin/signin.component.spec.ts b/src/app/pages/signin/signin.component.spec.ts index 2e7a08cc350..2dd8fef9e1e 100644 --- a/src/app/pages/signin/signin.component.spec.ts +++ b/src/app/pages/signin/signin.component.spec.ts @@ -4,7 +4,6 @@ import { BehaviorSubject, of } from 'rxjs'; import { AuthService } from 'app/modules/auth/auth.service'; import { DialogService } from 'app/modules/dialog/dialog.service'; import { CopyrightLineComponent } from 'app/modules/layout/copyright-line/copyright-line.component'; -import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; import { DisconnectedMessageComponent, } from 'app/pages/signin/disconnected-message/disconnected-message.component'; @@ -18,6 +17,7 @@ import { TrueCommandStatusComponent, } from 'app/pages/signin/true-command-status/true-command-status.component'; import { TokenLastUsedService } from 'app/services/token-last-used.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; describe('SigninComponent', () => { let spectator: Spectator; @@ -58,7 +58,7 @@ describe('SigninComponent', () => { mockProvider(TokenLastUsedService, { isTokenWithinTimeline$, }), - mockProvider(WebSocketHandlerService, { + mockProvider(WebSocketStatusService, { isConnected$, }), ], diff --git a/src/app/pages/signin/signin.component.ts b/src/app/pages/signin/signin.component.ts index c15315f0238..3b65b39a2db 100644 --- a/src/app/pages/signin/signin.component.ts +++ b/src/app/pages/signin/signin.component.ts @@ -17,13 +17,13 @@ import { AuthService } from 'app/modules/auth/auth.service'; import { DialogService } from 'app/modules/dialog/dialog.service'; import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; import { CopyrightLineComponent } from 'app/modules/layout/copyright-line/copyright-line.component'; -import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; import { DisconnectedMessageComponent } from 'app/pages/signin/disconnected-message/disconnected-message.component'; import { SetAdminPasswordFormComponent } from 'app/pages/signin/set-admin-password-form/set-admin-password-form.component'; import { SigninFormComponent } from 'app/pages/signin/signin-form/signin-form.component'; import { SigninStore } from 'app/pages/signin/store/signin.store'; import { TrueCommandStatusComponent } from 'app/pages/signin/true-command-status/true-command-status.component'; import { TokenLastUsedService } from 'app/services/token-last-used.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; @UntilDestroy() @Component({ @@ -53,7 +53,7 @@ export class SigninComponent implements OnInit { readonly wasAdminSet$ = this.signinStore.wasAdminSet$; readonly canLogin$ = this.signinStore.canLogin$; - readonly isConnected$ = this.wsManager.isConnected$; + readonly isConnected$ = this.wsStatus.isConnected$; isConnectedDelayed$: Observable = of(null).pipe( delay(1000), switchMap(() => this.isConnected$), @@ -70,7 +70,7 @@ export class SigninComponent implements OnInit { ); constructor( - private wsManager: WebSocketHandlerService, + private wsStatus: WebSocketStatusService, private signinStore: SigninStore, private dialog: DialogService, private authService: AuthService, diff --git a/src/app/pages/signin/store/signin.store.spec.ts b/src/app/pages/signin/store/signin.store.spec.ts index d470a65ffdf..e0b91f5e330 100644 --- a/src/app/pages/signin/store/signin.store.spec.ts +++ b/src/app/pages/signin/store/signin.store.spec.ts @@ -15,6 +15,7 @@ import { SigninStore } from 'app/pages/signin/store/signin.store'; import { SystemGeneralService } from 'app/services/system-general.service'; import { TokenLastUsedService } from 'app/services/token-last-used.service'; import { UpdateService } from 'app/services/update.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; describe('SigninStore', () => { let spectator: SpectatorService; @@ -31,8 +32,10 @@ describe('SigninStore', () => { mockCall('auth.twofactor.config', { enabled: false } as GlobalTwoFactorConfig), mockCall('system.advanced.login_banner', ''), ]), - mockProvider(WebSocketHandlerService, { + mockProvider(WebSocketStatusService, { isConnected$: of(true), + }), + mockProvider(WebSocketHandlerService, { responses$: of(), }), mockProvider(TokenLastUsedService, { diff --git a/src/app/pages/signin/store/signin.store.ts b/src/app/pages/signin/store/signin.store.ts index 211c0cf4e11..3a59c54190c 100644 --- a/src/app/pages/signin/store/signin.store.ts +++ b/src/app/pages/signin/store/signin.store.ts @@ -22,6 +22,7 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; import { SystemGeneralService } from 'app/services/system-general.service'; import { TokenLastUsedService } from 'app/services/token-last-used.service'; import { UpdateService } from 'app/services/update.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; import { loginBannerUpdated } from 'app/store/system-config/system-config.actions'; interface SigninState { @@ -43,7 +44,7 @@ export class SigninStore extends ComponentStore { wasAdminSet$ = this.select((state) => state.wasAdminSet); isLoading$ = this.select((state) => state.isLoading); - canLogin$ = this.wsManager.isConnected$; + canLogin$ = this.wsStatus.isConnected$; private handleLoginResult = (loginResult: LoginResult): void => { if (loginResult !== LoginResult.Success) { @@ -66,6 +67,7 @@ export class SigninStore extends ComponentStore { private authService: AuthService, private updateService: UpdateService, private actions$: Actions, + private wsStatus: WebSocketStatusService, private activatedRoute: ActivatedRoute, @Inject(WINDOW) private window: Window, ) { diff --git a/src/app/pages/system-tasks/config-reset/config-reset.component.spec.ts b/src/app/pages/system-tasks/config-reset/config-reset.component.spec.ts index d0ffcef1c88..883f35eb513 100644 --- a/src/app/pages/system-tasks/config-reset/config-reset.component.spec.ts +++ b/src/app/pages/system-tasks/config-reset/config-reset.component.spec.ts @@ -13,6 +13,7 @@ import { CopyrightLineComponent } from 'app/modules/layout/copyright-line/copyri import { ApiService } from 'app/modules/websocket/api.service'; import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; import { ConfigResetComponent } from 'app/pages/system-tasks/config-reset/config-reset.component'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; describe('ConfigResetComponent', () => { let spectator: Spectator; @@ -31,9 +32,11 @@ describe('ConfigResetComponent', () => { mockProvider(MatDialog), mockProvider(Location), mockProvider(WebSocketHandlerService, { - isConnected$, prepareShutdown: jest.fn(), }), + mockProvider(WebSocketStatusService, { + isConnected$, + }), mockProvider(DialogService, { jobDialog: jest.fn(() => ({ afterClosed: () => of({}), diff --git a/src/app/pages/system-tasks/config-reset/config-reset.component.ts b/src/app/pages/system-tasks/config-reset/config-reset.component.ts index f8094f25504..5b77f69caaa 100644 --- a/src/app/pages/system-tasks/config-reset/config-reset.component.ts +++ b/src/app/pages/system-tasks/config-reset/config-reset.component.ts @@ -15,6 +15,7 @@ import { AppLoaderService } from 'app/modules/loader/app-loader.service'; import { ApiService } from 'app/modules/websocket/api.service'; import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; import { ErrorHandlerService } from 'app/services/error-handler.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; @UntilDestroy() @Component({ @@ -35,6 +36,7 @@ export class ConfigResetComponent implements OnInit, OnDestroy { constructor( private wsManager: WebSocketHandlerService, + private wsStatus: WebSocketStatusService, protected router: Router, protected loader: AppLoaderService, private errorHandler: ErrorHandlerService, @@ -47,7 +49,7 @@ export class ConfigResetComponent implements OnInit, OnDestroy { isWsConnected(): void { // TODO: isConnected$ doesn't work correctly. - this.wsManager.isConnected$.pipe(untilDestroyed(this)).subscribe({ + this.wsStatus.isConnected$.pipe(untilDestroyed(this)).subscribe({ next: (isConnected) => { if (isConnected) { this.loader.close(); diff --git a/src/app/pages/system-tasks/failover/failover.component.ts b/src/app/pages/system-tasks/failover/failover.component.ts index 73f376d7ab9..1d87148bde3 100644 --- a/src/app/pages/system-tasks/failover/failover.component.ts +++ b/src/app/pages/system-tasks/failover/failover.component.ts @@ -14,6 +14,7 @@ import { AppLoaderService } from 'app/modules/loader/app-loader.service'; import { ApiService } from 'app/modules/websocket/api.service'; import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; import { ErrorHandlerService } from 'app/services/error-handler.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; import { passiveNodeReplaced } from 'app/store/system-info/system-info.actions'; @UntilDestroy() @@ -36,6 +37,7 @@ export class FailoverComponent implements OnInit { protected api: ApiService, private errorHandler: ErrorHandlerService, private wsManager: WebSocketHandlerService, + private wsStatus: WebSocketStatusService, protected router: Router, protected loader: AppLoaderService, protected dialogService: DialogService, @@ -45,7 +47,7 @@ export class FailoverComponent implements OnInit { ) {} isWsConnected(): void { - this.wsManager.isConnected$.pipe(untilDestroyed(this)).subscribe({ + this.wsStatus.isConnected$.pipe(untilDestroyed(this)).subscribe({ next: (isConnected) => { if (isConnected) { this.loader.close(); diff --git a/src/app/pages/system/failover-settings/failover-settings.component.spec.ts b/src/app/pages/system/failover-settings/failover-settings.component.spec.ts index 649364de111..4d1367ba8cb 100644 --- a/src/app/pages/system/failover-settings/failover-settings.component.spec.ts +++ b/src/app/pages/system/failover-settings/failover-settings.component.spec.ts @@ -13,8 +13,8 @@ import { IxFormHarness } from 'app/modules/forms/ix-forms/testing/ix-form.harnes import { SearchInput1Component } from 'app/modules/forms/search-input1/search-input1.component'; import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; import { ApiService } from 'app/modules/websocket/api.service'; -import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; import { FailoverSettingsComponent } from 'app/pages/system/failover-settings/failover-settings.component'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; describe('FailoverComponent', () => { let spectator: Spectator; @@ -41,7 +41,7 @@ describe('FailoverComponent', () => { }), ]), mockProvider(SnackbarService), - mockProvider(WebSocketHandlerService, { + mockProvider(WebSocketStatusService, { isConnected$: of(true), }), ], diff --git a/src/app/pages/system/general-settings/gui/gui-form/gui-form.component.spec.ts b/src/app/pages/system/general-settings/gui/gui-form/gui-form.component.spec.ts index c191d66b0a8..67428af99d2 100644 --- a/src/app/pages/system/general-settings/gui/gui-form/gui-form.component.spec.ts +++ b/src/app/pages/system/general-settings/gui/gui-form/gui-form.component.spec.ts @@ -23,6 +23,7 @@ import { ApiService } from 'app/modules/websocket/api.service'; import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; import { GuiFormComponent } from 'app/pages/system/general-settings/gui/gui-form/gui-form.component'; import { SystemGeneralService } from 'app/services/system-general.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; import { themeChangedInGuiForm } from 'app/store/preferences/preferences.actions'; import { selectPreferences, selectTheme } from 'app/store/preferences/preferences.selectors'; import { selectGeneralConfig } from 'app/store/system-config/system-config.selectors'; @@ -69,6 +70,7 @@ describe('GuiFormComponent', () => { slideInClosed$: of(), }), mockProvider(WebSocketHandlerService), + mockProvider(WebSocketStatusService), mockProvider(DialogService, { confirm: jest.fn(() => of(true)), }), @@ -166,8 +168,8 @@ describe('GuiFormComponent', () => { }); it('shows confirm dialog if HTTPS redirect is enabled', async () => { - const websocketManager = spectator.inject(WebSocketHandlerService); - Object.defineProperty(websocketManager, 'isConnected$', { + const wsStatus = spectator.inject(WebSocketStatusService); + Object.defineProperty(wsStatus, 'isConnected$', { get: jest.fn(() => new BehaviorSubject(true)), }); @@ -186,8 +188,8 @@ describe('GuiFormComponent', () => { }); it('shows confirm dialog if service restart is needed and restarts it', async () => { - const websocketManager = spectator.inject(WebSocketHandlerService); - Object.defineProperty(websocketManager, 'isConnected$', { + const wsStatus = spectator.inject(WebSocketStatusService); + Object.defineProperty(wsStatus, 'isConnected$', { get: jest.fn(() => new BehaviorSubject(true)), }); diff --git a/src/app/pages/system/general-settings/gui/gui-form/gui-form.component.ts b/src/app/pages/system/general-settings/gui/gui-form/gui-form.component.ts index 2f94573952f..033afd16ece 100644 --- a/src/app/pages/system/general-settings/gui/gui-form/gui-form.component.ts +++ b/src/app/pages/system/general-settings/gui/gui-form/gui-form.component.ts @@ -34,6 +34,7 @@ import { ApiService } from 'app/modules/websocket/api.service'; import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; import { ErrorHandlerService } from 'app/services/error-handler.service'; import { SystemGeneralService } from 'app/services/system-general.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; import { AppState } from 'app/store'; import { guiFormSubmitted, themeChangedInGuiForm } from 'app/store/preferences/preferences.actions'; import { waitForPreferences } from 'app/store/preferences/preferences.selectors'; @@ -97,6 +98,7 @@ export class GuiFormComponent { private cdr: ChangeDetectorRef, private api: ApiService, private wsManager: WebSocketHandlerService, + private wsStatus: WebSocketStatusService, private dialog: DialogService, private loader: AppLoaderService, private translate: TranslateService, @@ -110,7 +112,7 @@ export class GuiFormComponent { } replaceHrefWhenWsConnected(href: string): void { - this.wsManager.isConnected$.pipe(untilDestroyed(this)).subscribe((isConnected) => { + this.wsStatus.isConnected$.pipe(untilDestroyed(this)).subscribe((isConnected) => { if (isConnected) { this.loader.close(); this.window.location.replace(href); diff --git a/src/app/pages/system/update/components/manual-update-form/manual-update-form.component.spec.ts b/src/app/pages/system/update/components/manual-update-form/manual-update-form.component.spec.ts index caafdc84c52..f2a5e75c640 100644 --- a/src/app/pages/system/update/components/manual-update-form/manual-update-form.component.spec.ts +++ b/src/app/pages/system/update/components/manual-update-form/manual-update-form.component.spec.ts @@ -16,7 +16,6 @@ import { Preferences } from 'app/interfaces/preferences.interface'; import { SystemInfo } from 'app/interfaces/system-info.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; import { IxSelectHarness } from 'app/modules/forms/ix-forms/components/ix-select/ix-select.harness'; -import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; import { ManualUpdateFormComponent } from 'app/pages/system/update/components/manual-update-form/manual-update-form.component'; import { SystemGeneralService } from 'app/services/system-general.service'; import { selectIsHaLicensed } from 'app/store/ha-info/ha-info.selectors'; @@ -58,9 +57,6 @@ describe('ManualUpdateFormComponent', () => { getItem: () => ProductType.ScaleEnterprise, }, }), - mockProvider(WebSocketHandlerService, { - isConnected$: of(true), - }), provideMockStore({ selectors: [ { diff --git a/src/app/services/websocket-status.service.spec.ts b/src/app/services/websocket-status.service.spec.ts new file mode 100644 index 00000000000..63df9903a47 --- /dev/null +++ b/src/app/services/websocket-status.service.spec.ts @@ -0,0 +1,104 @@ +import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; +import { TestScheduler } from 'rxjs/testing'; +import { getTestScheduler } from 'app/core/testing/utils/get-test-scheduler.utils'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; + +describe('WebSocketStatusSerice', () => { + let spectator: SpectatorService; + let testScheduler: TestScheduler; + + const createService = createServiceFactory({ + service: WebSocketStatusService, + }); + + beforeEach(() => { + spectator = createService(); + testScheduler = getTestScheduler(); + }); + + it('starts with false statuses', () => { + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.isAuthenticated$).toBe('a', { a: false }); + }); + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.isConnected$).toBe('a', { a: false }); + }); + expect(spectator.service.isAuthenticated).toBe(false); + expect(spectator.service.isConnected).toBe(false); + }); + + it('updates connection status', () => { + spectator.service.setConnectionStatus(true); + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.isAuthenticated$).toBe('a', { a: false }); + }); + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.isConnected$).toBe('a', { a: true }); + }); + expect(spectator.service.isAuthenticated).toBe(false); + expect(spectator.service.isConnected).toBe(true); + }); + + it('updates login status and auth status also updates', () => { + spectator.service.setConnectionStatus(true); + spectator.service.setLoginStatus(true); + + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.isAuthenticated$).toBe('a', { a: true }); + }); + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.isConnected$).toBe('a', { a: true }); + }); + expect(spectator.service.isAuthenticated).toBe(true); + expect(spectator.service.isConnected).toBe(true); + }); + + it('reverses auth status when logout', () => { + spectator.service.setConnectionStatus(true); + spectator.service.setLoginStatus(true); + + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.isAuthenticated$).toBe('a', { a: true }); + }); + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.isConnected$).toBe('a', { a: true }); + }); + expect(spectator.service.isAuthenticated).toBe(true); + expect(spectator.service.isConnected).toBe(true); + + spectator.service.setLoginStatus(false); + + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.isAuthenticated$).toBe('a', { a: false }); + }); + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.isConnected$).toBe('a', { a: true }); + }); + expect(spectator.service.isAuthenticated).toBe(false); + expect(spectator.service.isConnected).toBe(true); + }); + + it('reverses auth status when connection closes', () => { + spectator.service.setConnectionStatus(true); + spectator.service.setLoginStatus(true); + + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.isAuthenticated$).toBe('a', { a: true }); + }); + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.isConnected$).toBe('a', { a: true }); + }); + expect(spectator.service.isAuthenticated).toBe(true); + expect(spectator.service.isConnected).toBe(true); + + spectator.service.setConnectionStatus(false); + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.isAuthenticated$).toBe('a', { a: false }); + }); + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.isConnected$).toBe('a', { a: false }); + }); + expect(spectator.service.isAuthenticated).toBe(false); + expect(spectator.service.isConnected).toBe(false); + }); +}); diff --git a/src/app/services/websocket-status.service.ts b/src/app/services/websocket-status.service.ts new file mode 100644 index 00000000000..2866c4dc26d --- /dev/null +++ b/src/app/services/websocket-status.service.ts @@ -0,0 +1,44 @@ +import { Injectable } from '@angular/core'; +import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; +import { + BehaviorSubject, combineLatest, + tap, +} from 'rxjs'; + +@UntilDestroy() +@Injectable({ + providedIn: 'root', +}) +export class WebSocketStatusService { + private readonly connectionEstablished$ = new BehaviorSubject(false); + readonly isConnected$ = this.connectionEstablished$.asObservable(); + + get isConnected(): boolean { + return this.connectionEstablished$.getValue(); + } + + private readonly isLoggedIn$ = new BehaviorSubject(false); + private readonly authStatus$ = new BehaviorSubject(false); + readonly isAuthenticated$ = this.authStatus$.asObservable(); + get isAuthenticated(): boolean { + return this.authStatus$.getValue(); + } + + constructor() { + combineLatest([ + this.isConnected$, + this.isLoggedIn$.asObservable(), + ]).pipe( + tap(([isConnected, isLoggedIn]) => this.authStatus$.next(isConnected && isLoggedIn)), + untilDestroyed(this), + ).subscribe(); + } + + setLoginStatus(isLoggedIn: boolean): void { + this.isLoggedIn$.next(isLoggedIn); + } + + setConnectionStatus(connected: boolean): void { + this.connectionEstablished$.next(connected); + } +} diff --git a/src/app/store/preferences/preferences.effects.ts b/src/app/store/preferences/preferences.effects.ts index 6cf8eb75b0f..059fbf27f6e 100644 --- a/src/app/store/preferences/preferences.effects.ts +++ b/src/app/store/preferences/preferences.effects.ts @@ -1,9 +1,10 @@ import { Injectable } from '@angular/core'; import { Actions, createEffect, ofType } from '@ngrx/effects'; import { Store } from '@ngrx/store'; -import { EMPTY, throwError } from 'rxjs'; +import { isEqual } from 'lodash'; +import { EMPTY } from 'rxjs'; import { - catchError, filter, map, mergeMap, switchMap, withLatestFrom, + catchError, filter, map, mergeMap, pairwise, switchMap, take, withLatestFrom, } from 'rxjs/operators'; import { AuthService } from 'app/modules/auth/auth.service'; import { ApiService } from 'app/modules/websocket/api.service'; @@ -18,7 +19,7 @@ import { themeNotFound, updateRebootAfterManualUpdate, } from 'app/store/preferences/preferences.actions'; -import { selectPreferencesState } from 'app/store/preferences/preferences.selectors'; +import { waitForPreferences } from 'app/store/preferences/preferences.selectors'; import { sidenavUpdated } from 'app/store/topbar/topbar.actions'; import { snapshotExtraColumnsToggled, dashboardStateLoaded, noPreferencesFound, noDashboardStateFound, @@ -71,13 +72,10 @@ export class PreferencesEffects { updateRebootAfterManualUpdate, autoRefreshReportsToggled, ), - withLatestFrom(this.store$.select(selectPreferencesState)), - switchMap(([, state]) => { - if (!state.areLoaded) { - return throwError(() => new Error('Attempting to save user preferences before they were loaded.')); - } - - return this.api.call('auth.set_attribute', ['preferences', state.preferences]); + withLatestFrom(this.store$.pipe(waitForPreferences, take(1), pairwise())), + filter(([, [prevPrefs, newPrefs]]) => !isEqual(prevPrefs, newPrefs)), + switchMap(([, preferences]) => { + return this.api.call('auth.set_attribute', ['preferences', preferences]); }), ), { dispatch: false }); diff --git a/src/main.ts b/src/main.ts index 598ec9c99a6..ba118c9e2ce 100644 --- a/src/main.ts +++ b/src/main.ts @@ -42,6 +42,7 @@ import { ApiService } from 'app/modules/websocket/api.service'; import { SubscriptionManagerService } from 'app/modules/websocket/subscription-manager.service'; import { WebSocketHandlerService } from 'app/modules/websocket/websocket-handler.service'; import { ErrorHandlerService } from 'app/services/error-handler.service'; +import { WebSocketStatusService } from 'app/services/websocket-status.service'; import { rootReducers, rootEffects } from 'app/store'; import { CustomRouterStateSerializer } from 'app/store/router/custom-router-serializer'; @@ -117,16 +118,17 @@ bootstrapApplication(AppComponent, { }, { provide: ApiService, - deps: [WebSocketHandlerService, SubscriptionManagerService, TranslateService], + deps: [WebSocketStatusService, WebSocketHandlerService, SubscriptionManagerService, TranslateService], useFactory: ( + wsStatus: WebSocketStatusService, connection: WebSocketHandlerService, subscriptionManager: SubscriptionManagerService, translate: TranslateService, ) => { if (environment.mockConfig.enabled) { - return new MockEnclosureApiService(connection, subscriptionManager, translate); + return new MockEnclosureApiService(connection, wsStatus, subscriptionManager, translate); } - return new ApiService(connection, subscriptionManager, translate); + return new ApiService(connection, wsStatus, subscriptionManager, translate); }, }, provideCharts(withDefaultRegisterables()), From d07b24fed591c1e5278d0e1516d06efc0cda3151 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Sall=C3=A9?= Date: Mon, 6 Jan 2025 09:49:18 +0100 Subject: [PATCH 07/32] Add translate pipe for hints (#11287) Changes: Add translate pipe for hints Testing: Check if hints translated properly in another language. --- .../components/instance-wizard/instance-wizard.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.html b/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.html index e1ed8a4287a..f224bfec1a2 100644 --- a/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.html +++ b/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.html @@ -41,7 +41,7 @@ From 4e63ed362b373d40769e0437294de0bc3599fdba Mon Sep 17 00:00:00 2001 From: Alex Karpov Date: Mon, 6 Jan 2025 12:20:08 +0200 Subject: [PATCH 08/32] NAS-133325 / 25.04 / Migrate more instances of OldSlideInService #4 (#11278) * NAS-133300: Migrate more instances of OldSlideInService * NAS-133300: NAS-133317: Migrate more instances of OldSlideInService #2 * NAS-133319: Migrate more instances of OldSlideInService #3 * NAS-133319: PR update * NAS-133319: Skip * NAS-133325: Migrate more instances of OldSlideInService #4 * NAS-133325: PR Update * NAS-133325: PR update --- src/app/modules/slide-ins/slide-in.ts | 10 + .../app-wizard/app-wizard.component.spec.ts | 16 +- .../utils/dataset-form.service.spec.ts | 11 +- .../utils/dataset-form.service.ts | 8 +- .../zvol-form/zvol-form.component.spec.ts | 1 - .../authorized-access-form.component.html | 6 +- .../authorized-access-form.component.spec.ts | 25 ++- .../authorized-access-form.component.ts | 19 +- .../authorized-access-list.component.spec.ts | 20 +- .../authorized-access-list.component.ts | 19 +- .../extent-form/extent-form.component.html | 6 +- .../extent-form/extent-form.component.spec.ts | 25 ++- .../extent-form/extent-form.component.ts | 19 +- .../extent-list/extent-list.component.spec.ts | 20 +- .../extent-list/extent-list.component.ts | 20 +- .../portal-form/portal-form.component.html | 8 +- .../portal-form/portal-form.component.spec.ts | 37 ++-- .../portal-form/portal-form.component.ts | 20 +- .../portal-list/portal-list.component.spec.ts | 20 +- .../portal-list/portal-list.component.ts | 18 +- .../import-pool/import-pool.component.html | 4 +- .../import-pool/import-pool.component.spec.ts | 10 +- .../import-pool/import-pool.component.ts | 10 +- .../disk-info-card.component.spec.ts | 40 ++-- .../disk-info-card.component.ts | 10 +- .../disk-bulk-edit.component.html | 4 +- .../disk-bulk-edit.component.spec.ts | 15 +- .../disk-bulk-edit.component.ts | 18 +- .../disk-form/disk-form.component.html | 4 +- .../disk-form/disk-form.component.spec.ts | 16 +- .../disk-form/disk-form.component.ts | 11 +- .../disk-list/disk-list.component.spec.ts | 16 +- .../disk-list/disk-list.component.ts | 20 +- .../storage/pools-dashboard.component.ts | 10 +- .../alert-service-list.component.spec.ts | 12 +- .../alert-service-list.component.ts | 16 +- .../alert-service.component.html | 4 +- .../alert-service.component.spec.ts | 27 +-- .../alert-service/alert-service.component.ts | 16 +- .../bootenv-form/bootenv-form.component.html | 4 +- .../bootenv-form.component.spec.ts | 25 ++- .../bootenv-form/bootenv-form.component.ts | 24 +-- .../bootenv-list.component.spec.ts | 9 +- .../bootenv-list/bootenv-list.component.ts | 18 +- .../jbof-form/jbof-form.component.html | 7 +- .../jbof-form/jbof-form.component.spec.ts | 43 +++-- .../jbof-form/jbof-form.component.ts | 19 +- .../jbof-list/jbof-list.component.spec.ts | 11 +- .../jbof-list/jbof-list.component.ts | 10 +- .../email-card/email-card.component.spec.ts | 14 +- .../email/email-card/email-card.component.ts | 11 +- .../email-form/email-form.component.html | 4 +- .../email-form/email-form.component.spec.ts | 16 +- .../email/email-form/email-form.component.ts | 19 +- .../gui/gui-card/gui-card.component.spec.ts | 8 +- .../gui/gui-card/gui-card.component.ts | 9 +- .../gui/gui-form/gui-form.component.html | 5 +- .../gui/gui-form/gui-form.component.spec.ts | 12 +- .../gui/gui-form/gui-form.component.ts | 15 +- .../localization-card.component.spec.ts | 8 +- .../localization-card.component.ts | 6 +- .../localization-form.component.html | 4 +- .../localization-form.component.spec.ts | 44 ++--- .../localization-form.component.ts | 17 +- .../ntp-server-card.component.spec.ts | 13 +- .../ntp-server-card.component.ts | 16 +- .../ntp-server-form.component.html | 6 +- .../ntp-server-form.component.spec.ts | 42 +++-- .../ntp-server-form.component.ts | 19 +- .../support/license/license.component.html | 7 +- .../support/license/license.component.spec.ts | 20 +- .../support/license/license.component.ts | 10 +- .../proactive/proactive.component.html | 4 +- .../proactive/proactive.component.scss | 4 + .../proactive/proactive.component.spec.ts | 21 ++- .../support/proactive/proactive.component.ts | 10 +- .../support-card/support-card.component.ts | 8 +- .../device-form/device-form.component.html | 7 +- .../device-form/device-form.component.spec.ts | 175 +++++++----------- .../device-form/device-form.component.ts | 23 +-- .../device-list/device-list.component.spec.ts | 10 +- .../device-list/device-list.component.ts | 31 ++-- src/app/pages/vm/vm-list.component.spec.ts | 11 +- src/app/pages/vm/vm-list.component.ts | 13 +- .../vm/vm-wizard/vm-wizard.component.html | 4 +- .../vm/vm-wizard/vm-wizard.component.spec.ts | 20 +- .../pages/vm/vm-wizard/vm-wizard.component.ts | 10 +- 87 files changed, 777 insertions(+), 660 deletions(-) diff --git a/src/app/modules/slide-ins/slide-in.ts b/src/app/modules/slide-ins/slide-in.ts index 7c2e03217eb..fcbf7e7bb22 100644 --- a/src/app/modules/slide-ins/slide-in.ts +++ b/src/app/modules/slide-ins/slide-in.ts @@ -82,6 +82,16 @@ export class SlideIn extends ComponentStore { }; }); + closeLast = this.updater((state) => { + const newMap = new Map(state.components); + const { id } = this.getAliveComponents(newMap).pop(); + newMap.set(id, { ...newMap.get(id), isComponentAlive: false }); + this.focusOnTheCloseButton(); + return { + components: newMap, + }; + }); + closeAll = this.updater(() => { this.focusOnTheCloseButton(); return { diff --git a/src/app/pages/apps/components/app-wizard/app-wizard.component.spec.ts b/src/app/pages/apps/components/app-wizard/app-wizard.component.spec.ts index c1eb03c0baf..be88bceebb8 100644 --- a/src/app/pages/apps/components/app-wizard/app-wizard.component.spec.ts +++ b/src/app/pages/apps/components/app-wizard/app-wizard.component.spec.ts @@ -16,14 +16,13 @@ import { DialogService } from 'app/modules/dialog/dialog.service'; import { IxInputHarness } from 'app/modules/forms/ix-forms/components/ix-input/ix-input.harness'; import { IxFormHarness } from 'app/modules/forms/ix-forms/testing/ix-form.harness'; import { PageHeaderComponent } from 'app/modules/page-header/page-title-header/page-header.component'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; -import { SLIDE_IN_DATA } from 'app/modules/slide-ins/slide-in.token'; +import { SlideIn } from 'app/modules/slide-ins/slide-in'; +import { SlideInRef } from 'app/modules/slide-ins/slide-in-ref'; import { ApiService } from 'app/modules/websocket/api.service'; import { AppWizardComponent } from 'app/pages/apps/components/app-wizard/app-wizard.component'; import { DockerHubRateInfoDialogComponent } from 'app/pages/apps/components/dockerhub-rate-limit-info-dialog/dockerhub-rate-limit-info-dialog.component'; import { ApplicationsService } from 'app/pages/apps/services/applications.service'; import { DockerStore } from 'app/pages/apps/store/docker.store'; -import { OldSlideInService } from 'app/services/old-slide-in.service'; const appVersion121 = { healthy: true, @@ -270,6 +269,12 @@ describe('AppWizardComponent', () => { }, } as App; + const slideInRef: SlideInRef = { + close: jest.fn(), + requireConfirmationWhen: jest.fn(), + getData: jest.fn(() => undefined), + }; + const createComponent = createComponentFactory({ component: AppWizardComponent, imports: [ @@ -281,7 +286,7 @@ describe('AppWizardComponent', () => { mockProvider(MatDialog), ], providers: [ - mockProvider(OldSlideInService), + mockProvider(SlideIn), mockProvider(DialogService, { jobDialog: jest.fn(() => ({ afterClosed: () => of({}), @@ -308,10 +313,9 @@ describe('AppWizardComponent', () => { mockProvider(DockerStore, { selectedPool$: of('pool set'), }), - mockProvider(OldSlideInRef), + mockProvider(SlideInRef, slideInRef), mockProvider(Router), mockAuth(), - { provide: SLIDE_IN_DATA, useValue: undefined }, ], }); diff --git a/src/app/pages/datasets/components/dataset-form/utils/dataset-form.service.spec.ts b/src/app/pages/datasets/components/dataset-form/utils/dataset-form.service.spec.ts index fbeac6c8926..acec4e4b7b8 100644 --- a/src/app/pages/datasets/components/dataset-form/utils/dataset-form.service.spec.ts +++ b/src/app/pages/datasets/components/dataset-form/utils/dataset-form.service.spec.ts @@ -6,9 +6,9 @@ import { inherit } from 'app/enums/with-inherit.enum'; import { helptextDatasetForm } from 'app/helptext/storage/volumes/datasets/dataset-form'; import { Dataset } from 'app/interfaces/dataset.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; +import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { ApiService } from 'app/modules/websocket/api.service'; import { DatasetFormService } from 'app/pages/datasets/components/dataset-form/utils/dataset-form.service'; -import { OldSlideInService } from 'app/services/old-slide-in.service'; describe('DatasetFormService', () => { let spectator: SpectatorService; @@ -22,7 +22,10 @@ describe('DatasetFormService', () => { mockProvider(DialogService, { warn: jest.fn(() => of(true)), }), - mockProvider(OldSlideInService), + mockProvider(SlideIn, { + components$: of([]), + closeLast: jest.fn(), + }), ], }); @@ -37,7 +40,7 @@ describe('DatasetFormService', () => { helptextDatasetForm.pathWarningTitle, helptextDatasetForm.pathIsTooLongWarning, ); - expect(spectator.inject(OldSlideInService).closeLast).toHaveBeenCalled(); + expect(spectator.inject(SlideIn).closeLast).toHaveBeenCalled(); }); it('checks parent path, shows error if it nesting level is too deep and closes slide in', async () => { @@ -48,7 +51,7 @@ describe('DatasetFormService', () => { helptextDatasetForm.pathWarningTitle, helptextDatasetForm.pathIsTooDeepWarning, ); - expect(spectator.inject(OldSlideInService).closeLast).toHaveBeenCalled(); + expect(spectator.inject(SlideIn).closeLast).toHaveBeenCalled(); }); }); diff --git a/src/app/pages/datasets/components/dataset-form/utils/dataset-form.service.ts b/src/app/pages/datasets/components/dataset-form/utils/dataset-form.service.ts index 49e5fcc7488..0cf624fd5d5 100644 --- a/src/app/pages/datasets/components/dataset-form/utils/dataset-form.service.ts +++ b/src/app/pages/datasets/components/dataset-form/utils/dataset-form.service.ts @@ -10,8 +10,8 @@ import { helptextDatasetForm } from 'app/helptext/storage/volumes/datasets/datas import { Dataset } from 'app/interfaces/dataset.interface'; import { Option } from 'app/interfaces/option.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; +import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { ApiService } from 'app/modules/websocket/api.service'; -import { OldSlideInService } from 'app/services/old-slide-in.service'; @Injectable({ providedIn: 'root', @@ -21,7 +21,7 @@ export class DatasetFormService { private dialog: DialogService, private api: ApiService, private translate: TranslateService, - private slideInService: OldSlideInService, + private slideIn: SlideIn, ) {} checkAndWarnForLengthAndDepth(path: string): Observable { @@ -35,7 +35,7 @@ export class DatasetFormService { this.translate.instant(helptextDatasetForm.pathWarningTitle), this.translate.instant(helptextDatasetForm.pathIsTooDeepWarning), ).pipe( - tap(() => this.slideInService.closeLast()), + tap(() => this.slideIn.closeLast()), map(() => false), ); } @@ -44,7 +44,7 @@ export class DatasetFormService { this.translate.instant(helptextDatasetForm.pathWarningTitle), this.translate.instant(helptextDatasetForm.pathIsTooLongWarning), ).pipe( - tap(() => this.slideInService.closeLast()), + tap(() => this.slideIn.closeLast()), map(() => false), ); } diff --git a/src/app/pages/datasets/components/zvol-form/zvol-form.component.spec.ts b/src/app/pages/datasets/components/zvol-form/zvol-form.component.spec.ts index bfcb4a1aebb..f5052c2f57c 100644 --- a/src/app/pages/datasets/components/zvol-form/zvol-form.component.spec.ts +++ b/src/app/pages/datasets/components/zvol-form/zvol-form.component.spec.ts @@ -191,7 +191,6 @@ describe('ZvolFormComponent', () => { spectator = createComponent({ providers: [ mockProvider(SlideInRef, { ...slideInRef, getData: jest.fn(() => ({ isNew: false, parentId: 'test pool' })) }), - ], }); loader = TestbedHarnessEnvironment.loader(spectator.fixture); diff --git a/src/app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component.html b/src/app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component.html index cbe8e5d923c..2ad24fd2d76 100644 --- a/src/app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component.html +++ b/src/app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component.html @@ -1,4 +1,8 @@ - + diff --git a/src/app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component.spec.ts b/src/app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component.spec.ts index 82f10184aef..f54b2657d43 100644 --- a/src/app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component.spec.ts +++ b/src/app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component.spec.ts @@ -3,18 +3,18 @@ import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { ReactiveFormsModule } from '@angular/forms'; import { MatButtonHarness } from '@angular/material/button/testing'; import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; +import { of } from 'rxjs'; import { mockCall, mockApi } from 'app/core/testing/utils/mock-api.utils'; import { mockAuth } from 'app/core/testing/utils/mock-auth.utils'; import { IscsiAuthAccess } from 'app/interfaces/iscsi.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; import { IxFormHarness } from 'app/modules/forms/ix-forms/testing/ix-form.harness'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; -import { SLIDE_IN_DATA } from 'app/modules/slide-ins/slide-in.token'; +import { SlideIn } from 'app/modules/slide-ins/slide-in'; +import { SlideInRef } from 'app/modules/slide-ins/slide-in-ref'; import { ApiService } from 'app/modules/websocket/api.service'; import { AuthorizedAccessFormComponent, } from 'app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component'; -import { OldSlideInService } from 'app/services/old-slide-in.service'; describe('AuthorizedAccessFormComponent', () => { let spectator: Spectator; @@ -30,6 +30,12 @@ describe('AuthorizedAccessFormComponent', () => { peersecret: 'peer123456789012', } as IscsiAuthAccess; + const slideInRef: SlideInRef = { + close: jest.fn(), + requireConfirmationWhen: jest.fn(), + getData: jest.fn(() => undefined), + }; + const createComponent = createComponentFactory({ component: AuthorizedAccessFormComponent, imports: [ @@ -37,14 +43,15 @@ describe('AuthorizedAccessFormComponent', () => { ], providers: [ mockAuth(), - mockProvider(OldSlideInService), + mockProvider(SlideIn, { + components$: of([]), + }), mockProvider(DialogService), mockApi([ mockCall('iscsi.auth.create'), mockCall('iscsi.auth.update'), ]), - mockProvider(OldSlideInRef), - { provide: SLIDE_IN_DATA, useValue: undefined }, + mockProvider(SlideInRef, slideInRef), ], }); @@ -77,7 +84,7 @@ describe('AuthorizedAccessFormComponent', () => { peersecret: 'peer123456789012', discovery_auth: 'NONE', }]); - expect(spectator.inject(OldSlideInRef).close).toHaveBeenCalled(); + expect(spectator.inject(SlideInRef).close).toHaveBeenCalled(); }); }); @@ -85,7 +92,7 @@ describe('AuthorizedAccessFormComponent', () => { beforeEach(async () => { spectator = createComponent({ providers: [ - { provide: SLIDE_IN_DATA, useValue: existingAuthorizedAccess }, + mockProvider(SlideInRef, { ...slideInRef, getData: () => existingAuthorizedAccess }), ], }); loader = TestbedHarnessEnvironment.loader(spectator.fixture); @@ -135,7 +142,7 @@ describe('AuthorizedAccessFormComponent', () => { }, ], ); - expect(spectator.inject(OldSlideInRef).close).toHaveBeenCalled(); + expect(spectator.inject(SlideInRef).close).toHaveBeenCalled(); }); }); }); diff --git a/src/app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component.ts b/src/app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component.ts index 56a84a0d495..d1160d4953f 100644 --- a/src/app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component.ts +++ b/src/app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component.ts @@ -1,5 +1,5 @@ import { - ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnInit, + ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, } from '@angular/core'; import { FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatButton } from '@angular/material/button'; @@ -25,9 +25,8 @@ import { doesNotEqualFgValidator, matchOthersFgValidator, } from 'app/modules/forms/ix-forms/validators/password-validation/password-validation'; -import { OldModalHeaderComponent } from 'app/modules/slide-ins/components/old-modal-header/old-modal-header.component'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; -import { SLIDE_IN_DATA } from 'app/modules/slide-ins/slide-in.token'; +import { ModalHeaderComponent } from 'app/modules/slide-ins/components/modal-header/modal-header.component'; +import { SlideInRef } from 'app/modules/slide-ins/slide-in-ref'; import { TestDirective } from 'app/modules/test-id/test.directive'; import { ApiService } from 'app/modules/websocket/api.service'; @@ -38,7 +37,7 @@ import { ApiService } from 'app/modules/websocket/api.service'; changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - OldModalHeaderComponent, + ModalHeaderComponent, MatCard, MatCardContent, ReactiveFormsModule, @@ -105,6 +104,7 @@ export class AuthorizedAccessFormComponent implements OnInit { isLoading = false; discoveryAuthOptions$: Observable[]>; + protected editingAccess: IscsiAuthAccess | undefined; readonly defaultDiscoveryAuthOptions = [ { @@ -139,9 +139,10 @@ export class AuthorizedAccessFormComponent implements OnInit { private cdr: ChangeDetectorRef, private api: ApiService, private validatorService: IxValidatorsService, - private slideInRef: OldSlideInRef, - @Inject(SLIDE_IN_DATA) private editingAccess: IscsiAuthAccess, - ) {} + public slideInRef: SlideInRef, + ) { + this.editingAccess = this.slideInRef.getData(); + } ngOnInit(): void { this.discoveryAuthOptions$ = of(this.defaultDiscoveryAuthOptions); @@ -205,7 +206,7 @@ export class AuthorizedAccessFormComponent implements OnInit { request$.pipe(untilDestroyed(this)).subscribe({ next: () => { this.isLoading = false; - this.slideInRef.close(true); + this.slideInRef.close({ response: true, error: null }); }, error: (error: unknown) => { this.isLoading = false; diff --git a/src/app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.component.spec.ts b/src/app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.component.spec.ts index 891622c23ce..a3e9d37c4ae 100644 --- a/src/app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.component.spec.ts +++ b/src/app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.component.spec.ts @@ -16,11 +16,11 @@ import { IxTableColumnsSelectorComponent, } from 'app/modules/ix-table/components/ix-table-columns-selector/ix-table-columns-selector.component'; import { FakeProgressBarComponent } from 'app/modules/loader/components/fake-progress-bar/fake-progress-bar.component'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; +import { SlideIn } from 'app/modules/slide-ins/slide-in'; +import { SlideInRef } from 'app/modules/slide-ins/slide-in-ref'; import { ApiService } from 'app/modules/websocket/api.service'; import { AuthorizedAccessFormComponent } from 'app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component'; import { AuthorizedAccessListComponent } from 'app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.component'; -import { OldSlideInService } from 'app/services/old-slide-in.service'; const authAccess: IscsiAuthAccess[] = [ { @@ -36,6 +36,12 @@ describe('AuthorizedAccessListComponent', () => { let loader: HarnessLoader; let table: IxTableHarness; + const slideInRef: SlideInRef = { + close: jest.fn(), + requireConfirmationWhen: jest.fn(), + getData: jest.fn(() => undefined), + }; + const createComponent = createComponentFactory({ component: AuthorizedAccessListComponent, imports: [ @@ -50,12 +56,12 @@ describe('AuthorizedAccessListComponent', () => { mockCall('iscsi.auth.query', authAccess), mockCall('iscsi.auth.delete'), ]), - mockProvider(OldSlideInRef), + mockProvider(SlideInRef, slideInRef), mockProvider(DialogService, { confirm: jest.fn(() => of(true)), }), - mockProvider(OldSlideInService, { - open: jest.fn(() => ({ slideInClosed$: of(true) })), + mockProvider(SlideIn, { + open: jest.fn(() => of()), }), mockProvider(MatDialog, { open: jest.fn(), @@ -78,14 +84,14 @@ describe('AuthorizedAccessListComponent', () => { const addButton = await loader.getHarness(MatButtonHarness.with({ text: 'Add' })); await addButton.click(); - expect(spectator.inject(OldSlideInService).open).toHaveBeenCalledWith(AuthorizedAccessFormComponent); + expect(spectator.inject(SlideIn).open).toHaveBeenCalledWith(AuthorizedAccessFormComponent); }); it('opens authorized access form when "Edit" button is pressed', async () => { const editButton = await table.getHarnessInCell(IxIconHarness.with({ name: 'edit' }), 1, 3); await editButton.click(); - expect(spectator.inject(OldSlideInService).open).toHaveBeenCalledWith(AuthorizedAccessFormComponent, { + expect(spectator.inject(SlideIn).open).toHaveBeenCalledWith(AuthorizedAccessFormComponent, { data: authAccess[0], }); }); diff --git a/src/app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.component.ts b/src/app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.component.ts index dc42ac38413..38a676d1dd2 100644 --- a/src/app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.component.ts +++ b/src/app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.component.ts @@ -30,6 +30,7 @@ import { IxTableEmptyDirective } from 'app/modules/ix-table/directives/ix-table- import { createTable } from 'app/modules/ix-table/utils'; import { AppLoaderService } from 'app/modules/loader/app-loader.service'; import { FakeProgressBarComponent } from 'app/modules/loader/components/fake-progress-bar/fake-progress-bar.component'; +import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { TestDirective } from 'app/modules/test-id/test.directive'; import { ApiService } from 'app/modules/websocket/api.service'; import { AuthorizedAccessFormComponent } from 'app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component'; @@ -38,7 +39,6 @@ import { } from 'app/pages/sharing/iscsi/authorized-access/authorized-access-list/authorized-access-list.elements'; import { ErrorHandlerService } from 'app/services/error-handler.service'; import { IscsiService } from 'app/services/iscsi.service'; -import { OldSlideInService } from 'app/services/old-slide-in.service'; @UntilDestroy() @Component({ @@ -100,10 +100,11 @@ export class AuthorizedAccessListComponent implements OnInit { iconName: iconMarker('edit'), tooltip: this.translate.instant('Edit'), onClick: (row) => { - const slideInRef = this.slideInService.open(AuthorizedAccessFormComponent, { data: row }); - slideInRef.slideInClosed$ - .pipe(filter(Boolean), untilDestroyed(this)) - .subscribe(() => this.refresh()); + this.slideIn.open(AuthorizedAccessFormComponent, { data: row }) + .pipe( + filter((response) => !!response.response), + untilDestroyed(this), + ).subscribe(() => this.refresh()); }, }, { @@ -140,7 +141,7 @@ export class AuthorizedAccessListComponent implements OnInit { private dialogService: DialogService, private api: ApiService, private translate: TranslateService, - private slideInService: OldSlideInService, + private slideIn: SlideIn, private errorHandler: ErrorHandlerService, private cdr: ChangeDetectorRef, private iscsiService: IscsiService, @@ -161,8 +162,10 @@ export class AuthorizedAccessListComponent implements OnInit { } doAdd(): void { - const slideInRef = this.slideInService.open(AuthorizedAccessFormComponent); - slideInRef.slideInClosed$.pipe(filter(Boolean), untilDestroyed(this)).subscribe(() => this.refresh()); + this.slideIn.open(AuthorizedAccessFormComponent).pipe( + filter((response) => !!response.response), + untilDestroyed(this), + ).subscribe(() => this.refresh()); } onListFiltered(query: string): void { diff --git a/src/app/pages/sharing/iscsi/extent/extent-form/extent-form.component.html b/src/app/pages/sharing/iscsi/extent/extent-form/extent-form.component.html index 2aef200cc8a..82d59a8149b 100644 --- a/src/app/pages/sharing/iscsi/extent/extent-form/extent-form.component.html +++ b/src/app/pages/sharing/iscsi/extent/extent-form/extent-form.component.html @@ -1,4 +1,8 @@ - + diff --git a/src/app/pages/sharing/iscsi/extent/extent-form/extent-form.component.spec.ts b/src/app/pages/sharing/iscsi/extent/extent-form/extent-form.component.spec.ts index 51ee7b876d6..df5c6c6ad1d 100644 --- a/src/app/pages/sharing/iscsi/extent/extent-form/extent-form.component.spec.ts +++ b/src/app/pages/sharing/iscsi/extent/extent-form/extent-form.component.spec.ts @@ -3,6 +3,7 @@ import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { ReactiveFormsModule } from '@angular/forms'; import { MatButtonHarness } from '@angular/material/button/testing'; import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; +import { of } from 'rxjs'; import { KiB } from 'app/constants/bytes.constant'; import { mockCall, mockApi } from 'app/core/testing/utils/mock-api.utils'; import { mockAuth } from 'app/core/testing/utils/mock-auth.utils'; @@ -11,11 +12,10 @@ import { Choices } from 'app/interfaces/choices.interface'; import { IscsiExtent } from 'app/interfaces/iscsi.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; import { IxFormHarness } from 'app/modules/forms/ix-forms/testing/ix-form.harness'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; -import { SLIDE_IN_DATA } from 'app/modules/slide-ins/slide-in.token'; +import { SlideIn } from 'app/modules/slide-ins/slide-in'; +import { SlideInRef } from 'app/modules/slide-ins/slide-in-ref'; import { ApiService } from 'app/modules/websocket/api.service'; import { ExtentFormComponent } from 'app/pages/sharing/iscsi/extent/extent-form/extent-form.component'; -import { OldSlideInService } from 'app/services/old-slide-in.service'; import { StorageService } from 'app/services/storage.service'; describe('ExtentFormComponent', () => { @@ -23,6 +23,12 @@ describe('ExtentFormComponent', () => { let loader: HarnessLoader; let form: IxFormHarness; + const slideInRef: SlideInRef = { + close: jest.fn(), + requireConfirmationWhen: jest.fn(), + getData: jest.fn(() => undefined), + }; + const existingExtent = { id: 123, name: 'test_name', @@ -49,7 +55,9 @@ describe('ExtentFormComponent', () => { ], providers: [ mockAuth(), - mockProvider(OldSlideInService), + mockProvider(SlideIn, { + components$: of([]), + }), mockProvider(StorageService), mockProvider(DialogService), mockApi([ @@ -61,8 +69,7 @@ describe('ExtentFormComponent', () => { key_device_3: 'value_device_3', } as Choices), ]), - mockProvider(OldSlideInRef), - { provide: SLIDE_IN_DATA, useValue: undefined }, + mockProvider(SlideInRef, slideInRef), ], }); @@ -124,7 +131,7 @@ describe('ExtentFormComponent', () => { type: IscsiExtentType.Disk, xen: true, }]); - expect(spectator.inject(OldSlideInRef).close).toHaveBeenCalled(); + expect(spectator.inject(SlideInRef).close).toHaveBeenCalled(); }); }); @@ -132,7 +139,7 @@ describe('ExtentFormComponent', () => { beforeEach(async () => { spectator = createComponent({ providers: [ - { provide: SLIDE_IN_DATA, useValue: existingExtent }, + mockProvider(SlideInRef, { ...slideInRef, getData: () => existingExtent }), ], }); loader = TestbedHarnessEnvironment.loader(spectator.fixture); @@ -188,7 +195,7 @@ describe('ExtentFormComponent', () => { xen: true, }, ]); - expect(spectator.inject(OldSlideInRef).close).toHaveBeenCalled(); + expect(spectator.inject(SlideInRef).close).toHaveBeenCalled(); }); }); }); diff --git a/src/app/pages/sharing/iscsi/extent/extent-form/extent-form.component.ts b/src/app/pages/sharing/iscsi/extent/extent-form/extent-form.component.ts index 81d2d735d2e..cebe94acbe0 100644 --- a/src/app/pages/sharing/iscsi/extent/extent-form/extent-form.component.ts +++ b/src/app/pages/sharing/iscsi/extent/extent-form/extent-form.component.ts @@ -1,5 +1,5 @@ import { - ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnInit, + ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, } from '@angular/core'; import { Validators, ReactiveFormsModule } from '@angular/forms'; import { MatButton } from '@angular/material/button'; @@ -28,9 +28,8 @@ import { IxInputComponent } from 'app/modules/forms/ix-forms/components/ix-input import { IxSelectComponent } from 'app/modules/forms/ix-forms/components/ix-select/ix-select.component'; import { FormErrorHandlerService } from 'app/modules/forms/ix-forms/services/form-error-handler.service'; import { IxFormatterService } from 'app/modules/forms/ix-forms/services/ix-formatter.service'; -import { OldModalHeaderComponent } from 'app/modules/slide-ins/components/old-modal-header/old-modal-header.component'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; -import { SLIDE_IN_DATA } from 'app/modules/slide-ins/slide-in.token'; +import { ModalHeaderComponent } from 'app/modules/slide-ins/components/modal-header/modal-header.component'; +import { SlideInRef } from 'app/modules/slide-ins/slide-in-ref'; import { TestDirective } from 'app/modules/test-id/test.directive'; import { ApiService } from 'app/modules/websocket/api.service'; import { FilesystemService } from 'app/services/filesystem.service'; @@ -44,7 +43,7 @@ import { IscsiService } from 'app/services/iscsi.service'; changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - OldModalHeaderComponent, + ModalHeaderComponent, MatCard, MatCardContent, ReactiveFormsModule, @@ -98,6 +97,7 @@ export class ExtentFormComponent implements OnInit { }); isLoading = false; + protected editingExtent: IscsiExtent | undefined; private extentDiskBeingEdited$ = new BehaviorSubject

} - @if (isReady && !report()?.errorConf) { + @if (isReady && !report().errorConf) {
diff --git a/src/app/pages/reports-dashboard/components/report/report.component.ts b/src/app/pages/reports-dashboard/components/report/report.component.ts index 333e50a8cd9..92bb212e412 100644 --- a/src/app/pages/reports-dashboard/components/report/report.component.ts +++ b/src/app/pages/reports-dashboard/components/report/report.component.ts @@ -90,7 +90,7 @@ export class ReportComponent implements OnInit, OnChanges { private readonly lineChart = viewChild(LineChartComponent); - updateReport$ = new BehaviorSubject>(null); + updateReport$ = new BehaviorSubject | null>(null); fetchReport$ = new BehaviorSubject(null); autoRefreshTimer: Subscription; autoRefreshEnabled: boolean; @@ -130,7 +130,8 @@ export class ReportComponent implements OnInit, OnChanges { get reportTitle(): string { const trimmed = this.report().title.replace(/[()]/g, ''); - return this.identifier() ? trimmed.replace(/{identifier}/, this.identifier()) : this.report().title; + const identifier = this.identifier(); + return identifier ? trimmed.replace(/{identifier}/, identifier) : this.report().title; } get currentZoomLevel(): ReportZoomLevel { diff --git a/src/app/pages/reports-dashboard/components/reports-global-controls/reports-global-controls.component.ts b/src/app/pages/reports-dashboard/components/reports-global-controls/reports-global-controls.component.ts index d6c1a9e7221..3d025f7d5c3 100644 --- a/src/app/pages/reports-dashboard/components/reports-global-controls/reports-global-controls.component.ts +++ b/src/app/pages/reports-dashboard/components/reports-global-controls/reports-global-controls.component.ts @@ -4,7 +4,7 @@ import { ChangeDetectorRef, Component, OnInit, output, } from '@angular/core'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; +import { NonNullableFormBuilder, ReactiveFormsModule } from '@angular/forms'; import { MatButton } from '@angular/material/button'; import { MatMenuTrigger, MatMenu, MatMenuItem } from '@angular/material/menu'; import { ActivatedRoute, RouterLink } from '@angular/router'; @@ -56,7 +56,7 @@ export class ReportsGlobalControlsComponent implements OnInit { metrics: [[] as string[]], }); - protected activeTab: ReportTab; + protected activeTab: ReportTab | undefined; protected allTabs: ReportTab[]; protected diskDevices$ = this.reportsService.getDiskDevices(); protected diskMetrics$ = this.reportsService.getDiskMetrics(); @@ -65,7 +65,7 @@ export class ReportsGlobalControlsComponent implements OnInit { protected readonly searchableElements = reportingGlobalControlsElements; constructor( - private fb: FormBuilder, + private fb: NonNullableFormBuilder, private route: ActivatedRoute, private store$: Store, private reportsService: ReportsService, diff --git a/src/app/pages/services/components/service-ssh/service-ssh.component.ts b/src/app/pages/services/components/service-ssh/service-ssh.component.ts index 56d9ff21211..f62990f8c4d 100644 --- a/src/app/pages/services/components/service-ssh/service-ssh.component.ts +++ b/src/app/pages/services/components/service-ssh/service-ssh.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, } from '@angular/core'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; +import { NonNullableFormBuilder, ReactiveFormsModule } from '@angular/forms'; import { MatButton } from '@angular/material/button'; import { MatCard, MatCardContent } from '@angular/material/card'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; @@ -69,15 +69,15 @@ export class ServiceSshComponent implements OnInit { }; form = this.fb.group({ - tcpport: [null as number], - password_login_groups: [null as string[]], + tcpport: [null as number | null], + password_login_groups: [null as string[] | null], passwordauth: [false], kerberosauth: [false], tcpfwd: [false], bindiface: [[] as string[]], compression: [false], - sftp_log_level: [null as SshSftpLogLevel], - sftp_log_facility: [null as SshSftpLogFacility], + sftp_log_level: [null as SshSftpLogLevel | null], + sftp_log_facility: [null as SshSftpLogFacility | null], weak_ciphers: [[] as SshWeakCipher[]], options: [''], }); @@ -106,7 +106,7 @@ export class ServiceSshComponent implements OnInit { private errorHandler: ErrorHandlerService, private cdr: ChangeDetectorRef, private formErrorHandler: FormErrorHandlerService, - private fb: FormBuilder, + private fb: NonNullableFormBuilder, private dialogService: DialogService, private userService: UserService, private translate: TranslateService, 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 c0f664028e8..41d78c56c69 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 @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, } from '@angular/core'; -import { FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; +import { Validators, ReactiveFormsModule, NonNullableFormBuilder } from '@angular/forms'; import { MatButton } from '@angular/material/button'; import { MatCard, MatCardContent } from '@angular/material/card'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; @@ -63,25 +63,25 @@ export class ServiceUpsComponent implements OnInit { isMasterMode = true; form = this.fb.group({ - identifier: [null as string, [Validators.required, Validators.pattern(/^[\w|,|.|\-|_]+$/)]], - mode: [null as UpsMode], - remotehost: [null as string, Validators.required], - remoteport: [null as number, Validators.required], - driver: [null as string, Validators.required], - port: [null as string, Validators.required], - monuser: [null as string, Validators.required], - monpwd: [null as string, Validators.pattern(/^((?![#|\s]).)*$/)], - extrausers: [null as string], + identifier: [null as string | null, [Validators.required, Validators.pattern(/^[\w|,|.|\-|_]+$/)]], + mode: [null as UpsMode | null], + remotehost: [null as string | null, Validators.required], + remoteport: [null as number | null, Validators.required], + driver: [null as string | null, Validators.required], + port: [null as string | null, Validators.required], + monuser: [null as string | null, Validators.required], + monpwd: [null as string | null, Validators.pattern(/^((?![#|\s]).)*$/)], + extrausers: [null as string | null], rmonitor: [false], - shutdown: [null as string], - shutdowntimer: [null as number], - shutdowncmd: [null as string], + shutdown: [null as string | null], + shutdowntimer: [null as number | null], + shutdowncmd: [null as string | null], powerdown: [false], nocommwarntime: [300], hostsync: [15], - description: [null as string], - options: [null as string], - optionsupsd: [null as string], + description: [null as string | null], + options: [null as string | null], + optionsupsd: [null as string | null], }); readonly helptext = helptextServiceUps; @@ -150,7 +150,7 @@ export class ServiceUpsComponent implements OnInit { private formErrorHandler: FormErrorHandlerService, private cdr: ChangeDetectorRef, private errorHandler: ErrorHandlerService, - private fb: FormBuilder, + private fb: NonNullableFormBuilder, private dialogService: DialogService, private translate: TranslateService, private snackbar: SnackbarService, diff --git a/src/app/pages/sharing/components/shares-dashboard/iscsi-card/iscsi-card.component.html b/src/app/pages/sharing/components/shares-dashboard/iscsi-card/iscsi-card.component.html index 405e69bed05..a0e89ef17c9 100644 --- a/src/app/pages/sharing/components/shares-dashboard/iscsi-card/iscsi-card.component.html +++ b/src/app/pages/sharing/components/shares-dashboard/iscsi-card/iscsi-card.component.html @@ -10,7 +10,7 @@

@@ -20,7 +20,7 @@

mat-button [ixTest]="['iscsi-share', 'wizard']" [ixUiSearch]="searchableElements.elements.wizard" - (click)="openForm(null, true)" + (click)="openForm(undefined, true)" > {{ 'Wizard' | translate }} diff --git a/src/app/pages/sharing/components/shares-dashboard/iscsi-card/iscsi-card.component.ts b/src/app/pages/sharing/components/shares-dashboard/iscsi-card/iscsi-card.component.ts index aa503517719..b9d020a655f 100644 --- a/src/app/pages/sharing/components/shares-dashboard/iscsi-card/iscsi-card.component.ts +++ b/src/app/pages/sharing/components/shares-dashboard/iscsi-card/iscsi-card.component.ts @@ -79,7 +79,7 @@ export class IscsiCardComponent implements OnInit { Role.SharingWrite, ]; - targets = signal(null); + targets = signal(null); protected readonly searchableElements = iscsiCardElements; @@ -98,9 +98,7 @@ export class IscsiCardComponent implements OnInit { title: this.translate.instant('Mode'), propertyName: 'mode', hidden: true, - getValue: (row) => (iscsiTargetModeNames.has(row.mode) - ? this.translate.instant(iscsiTargetModeNames.get(row.mode)) - : row.mode || '-'), + getValue: (row) => this.translate.instant(iscsiTargetModeNames.get(row.mode) || row.mode) || '-', }), actionsColumn({ actions: [ diff --git a/src/app/pages/sharing/components/shares-dashboard/nfs-card/nfs-card.component.html b/src/app/pages/sharing/components/shares-dashboard/nfs-card/nfs-card.component.html index db4c53e705d..a810dc527d1 100644 --- a/src/app/pages/sharing/components/shares-dashboard/nfs-card/nfs-card.component.html +++ b/src/app/pages/sharing/components/shares-dashboard/nfs-card/nfs-card.component.html @@ -10,7 +10,7 @@

diff --git a/src/app/pages/sharing/components/shares-dashboard/smb-card/smb-card.component.html b/src/app/pages/sharing/components/shares-dashboard/smb-card/smb-card.component.html index 146d40576d9..4b71c159cf6 100644 --- a/src/app/pages/sharing/components/shares-dashboard/smb-card/smb-card.component.html +++ b/src/app/pages/sharing/components/shares-dashboard/smb-card/smb-card.component.html @@ -10,7 +10,7 @@

diff --git a/src/app/pages/sharing/components/shares-dashboard/smb-card/smb-card.component.ts b/src/app/pages/sharing/components/shares-dashboard/smb-card/smb-card.component.ts index b7f71077361..fe3437277fe 100644 --- a/src/app/pages/sharing/components/shares-dashboard/smb-card/smb-card.component.ts +++ b/src/app/pages/sharing/components/shares-dashboard/smb-card/smb-card.component.ts @@ -123,7 +123,7 @@ export class SmbCardComponent implements OnInit { { iconName: iconMarker('edit'), tooltip: this.translate.instant('Edit'), - disabled: (row) => this.loadingMap$.pipe(map((ids) => ids.get(row.id))), + disabled: (row) => this.loadingMap$.pipe(map((ids) => Boolean(ids.get(row.id)))), onClick: (row) => this.openForm(row), }, { diff --git a/src/app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component.ts b/src/app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component.ts index d1160d4953f..f447bacd462 100644 --- a/src/app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component.ts +++ b/src/app/pages/sharing/iscsi/authorized-access/authorized-access-form/authorized-access-form.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, } from '@angular/core'; -import { FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; +import { Validators, ReactiveFormsModule, NonNullableFormBuilder } from '@angular/forms'; import { MatButton } from '@angular/material/button'; import { MatCard, MatCardContent } from '@angular/material/card'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; @@ -63,7 +63,7 @@ export class AuthorizedAccessFormComponent implements OnInit { } form = this.formBuilder.group({ - tag: [null as number, [Validators.required, Validators.min(0)]], + tag: [null as number | null, [Validators.required, Validators.min(0)]], user: ['', Validators.required], secret: ['', [ Validators.minLength(12), @@ -134,7 +134,7 @@ export class AuthorizedAccessFormComponent implements OnInit { constructor( private translate: TranslateService, - private formBuilder: FormBuilder, + private formBuilder: NonNullableFormBuilder, private errorHandler: FormErrorHandlerService, private cdr: ChangeDetectorRef, private api: ApiService, @@ -188,7 +188,7 @@ export class AuthorizedAccessFormComponent implements OnInit { } onSubmit(): void { - const values = this.form.value; + const values = this.form.getRawValue(); const payload = { tag: values.tag, user: values.user, diff --git a/src/app/pages/sharing/iscsi/iscsi-wizard/steps/extent-wizard-step/extent-wizard-step.component.ts b/src/app/pages/sharing/iscsi/iscsi-wizard/steps/extent-wizard-step/extent-wizard-step.component.ts index 866082a8d85..60c4d17ae90 100644 --- a/src/app/pages/sharing/iscsi/iscsi-wizard/steps/extent-wizard-step/extent-wizard-step.component.ts +++ b/src/app/pages/sharing/iscsi/iscsi-wizard/steps/extent-wizard-step/extent-wizard-step.component.ts @@ -33,7 +33,7 @@ import { IscsiService } from 'app/services/iscsi.service'; ], }) export class ExtentWizardStepComponent implements OnInit { - readonly form = input(); + readonly form = input.required(); readonly helptextSharingIscsi = helptextSharingIscsi; readonly fileNodeProvider = this.filesystemService.getFilesystemNodeProvider(); diff --git a/src/app/pages/sharing/iscsi/iscsi-wizard/steps/protocol-options-wizard-step/protocol-options-wizard-step.component.ts b/src/app/pages/sharing/iscsi/iscsi-wizard/steps/protocol-options-wizard-step/protocol-options-wizard-step.component.ts index 70fea6402b7..c52058a9ff6 100644 --- a/src/app/pages/sharing/iscsi/iscsi-wizard/steps/protocol-options-wizard-step/protocol-options-wizard-step.component.ts +++ b/src/app/pages/sharing/iscsi/iscsi-wizard/steps/protocol-options-wizard-step/protocol-options-wizard-step.component.ts @@ -35,7 +35,7 @@ import { IscsiService } from 'app/services/iscsi.service'; ], }) export class ProtocolOptionsWizardStepComponent implements OnInit { - form = input(); + form = input.required(); isFibreChannelMode = input(false); readonly helptextSharingIscsi = helptextSharingIscsi; diff --git a/src/app/pages/sharing/iscsi/iscsi-wizard/steps/target-wizard-step/target-wizard-step.component.ts b/src/app/pages/sharing/iscsi/iscsi-wizard/steps/target-wizard-step/target-wizard-step.component.ts index 300d3ee1bd2..db20ad88fe1 100644 --- a/src/app/pages/sharing/iscsi/iscsi-wizard/steps/target-wizard-step/target-wizard-step.component.ts +++ b/src/app/pages/sharing/iscsi/iscsi-wizard/steps/target-wizard-step/target-wizard-step.component.ts @@ -28,7 +28,7 @@ import { IscsiService } from 'app/services/iscsi.service'; ], }) export class TargetWizardStepComponent { - form = input(); + form = input.required(); readonly helptextSharingIscsi = helptextSharingIscsi; diff --git a/src/app/pages/sharing/iscsi/target/all-targets/target-details/associated-extents-card/associated-extents-card.component.html b/src/app/pages/sharing/iscsi/target/all-targets/target-details/associated-extents-card/associated-extents-card.component.html index 027ba6db32c..bf094042ff0 100644 --- a/src/app/pages/sharing/iscsi/target/all-targets/target-details/associated-extents-card/associated-extents-card.component.html +++ b/src/app/pages/sharing/iscsi/target/all-targets/target-details/associated-extents-card/associated-extents-card.component.html @@ -9,13 +9,13 @@

} @else {
diff --git a/src/app/pages/system/general-settings/manage-configuration-menu/manage-configuration-menu.component.ts b/src/app/pages/system/general-settings/manage-configuration-menu/manage-configuration-menu.component.ts index bf92c7cf639..7f2817061b9 100644 --- a/src/app/pages/system/general-settings/manage-configuration-menu/manage-configuration-menu.component.ts +++ b/src/app/pages/system/general-settings/manage-configuration-menu/manage-configuration-menu.component.ts @@ -62,11 +62,12 @@ export class ManageConfigurationMenuComponent { this.matDialog.open(UploadConfigDialogComponent); } - onResetDefaults(): void { + onResetToDefaults(): void { this.dialogService.confirm({ title: helptext.reset_config_form.title, message: helptext.reset_config_form.message, buttonText: helptext.reset_config_form.button_text, + buttonColor: 'warn', }) .pipe( filter(Boolean), diff --git a/src/app/pages/system/general-settings/ntp-server/ntp-server-card/ntp-server-card.component.ts b/src/app/pages/system/general-settings/ntp-server/ntp-server-card/ntp-server-card.component.ts index 95c47693199..a198dbf601a 100644 --- a/src/app/pages/system/general-settings/ntp-server/ntp-server-card/ntp-server-card.component.ts +++ b/src/app/pages/system/general-settings/ntp-server/ntp-server-card/ntp-server-card.component.ts @@ -131,6 +131,7 @@ export class NtpServerCardComponent implements OnInit { { address: server.address }, ), buttonText: this.translate.instant('Delete'), + buttonColor: 'warn', }).pipe( filter(Boolean), switchMap(() => this.api.call('system.ntpserver.delete', [server.id])), diff --git a/src/app/pages/system/general-settings/upload-config-dialog/upload-config-dialog.component.html b/src/app/pages/system/general-settings/upload-config-dialog/upload-config-dialog.component.html index 650626a823e..3c8496c1a62 100644 --- a/src/app/pages/system/general-settings/upload-config-dialog/upload-config-dialog.component.html +++ b/src/app/pages/system/general-settings/upload-config-dialog/upload-config-dialog.component.html @@ -15,7 +15,7 @@

{{ 'Upload Config' | translate }}

*ixRequiresRoles="requiredRoles" mat-button type="submit" - color="primary" + color="warn" ixTest="upload" [disabled]="form.invalid" > diff --git a/src/app/pages/vm/devices/device-list/device-delete-modal/device-delete-modal.component.html b/src/app/pages/vm/devices/device-list/device-delete-modal/device-delete-modal.component.html index b3254db7379..1f93ed37d89 100644 --- a/src/app/pages/vm/devices/device-list/device-delete-modal/device-delete-modal.component.html +++ b/src/app/pages/vm/devices/device-list/device-delete-modal/device-delete-modal.component.html @@ -51,7 +51,7 @@

{{ 'Delete' | translate }}

*ixRequiresRoles="requiredRoles" type="submit" mat-button - color="primary" + color="warn" ixTest="delete-device" [disabled]="form.invalid" > diff --git a/src/app/pages/vm/vm-list/delete-vm-dialog/delete-vm-dialog.component.html b/src/app/pages/vm/vm-list/delete-vm-dialog/delete-vm-dialog.component.html index 15efed6bb8d..c5c4a21d86b 100644 --- a/src/app/pages/vm/vm-list/delete-vm-dialog/delete-vm-dialog.component.html +++ b/src/app/pages/vm/vm-list/delete-vm-dialog/delete-vm-dialog.component.html @@ -30,7 +30,7 @@

{{ 'Delete Virtual Machine' | translate }}

+
+ + + @if (showLabels()) { +
{{ option.label | translate }}
+ @if (option.description) { + {{ option.description | translate }} + } + } +
} @empty { {{ 'No options are passed' | translate }} } diff --git a/src/app/modules/forms/ix-forms/components/ix-icon-group/ix-icon-group.component.scss b/src/app/modules/forms/ix-forms/components/ix-icon-group/ix-icon-group.component.scss index 6b5d0bdd38c..05fb0a91e58 100644 --- a/src/app/modules/forms/ix-forms/components/ix-icon-group/ix-icon-group.component.scss +++ b/src/app/modules/forms/ix-forms/components/ix-icon-group/ix-icon-group.component.scss @@ -20,3 +20,51 @@ .selected { color: var(--primary); } + +.title, +.description { + display: block; + margin: 0; + text-align: center; +} + +.title { + font-size: 14px; + margin-bottom: 2px; + margin-top: 8px; +} + +.description { + color: var(--fg2); +} + +.with-labels { + gap: 16px; + + ::ng-deep .mdc-icon-button { + border: 2px solid var(--lines); + border-radius: 0; + height: 100px !important; + line-height: 100px; + width: 100px !important; + + .mdc-icon-button__ripple, + .mat-ripple { + border-radius: 0 !important; + height: 100px !important; + width: 100px !important; + } + + .ix-icon, + .ix-icon svg { + font-size: 40px; + height: 40px; + line-height: 1; + width: 40px; + } + + &.selected { + border-color: var(--primary); + } + } +} diff --git a/src/app/modules/forms/ix-forms/components/ix-icon-group/ix-icon-group.component.spec.ts b/src/app/modules/forms/ix-forms/components/ix-icon-group/ix-icon-group.component.spec.ts index bd02b7b5265..6320dd8658a 100644 --- a/src/app/modules/forms/ix-forms/components/ix-icon-group/ix-icon-group.component.spec.ts +++ b/src/app/modules/forms/ix-forms/components/ix-icon-group/ix-icon-group.component.spec.ts @@ -28,6 +28,7 @@ describe('IxIconGroupComponent', () => { [tooltip]="tooltip" [required]="required" [formControl]="formControl" + [showLabels]="true" >`, { hostProps: { @@ -85,6 +86,14 @@ describe('IxIconGroupComponent', () => { formControl.setValue('edit'); expect(await iconGroupHarness.getValue()).toBe('edit'); }); + it('shows labels when `showLabels` is set to true', async () => { + const icons = await iconGroupHarness.getIcons(); + expect(icons).toHaveLength(2); + + const labels = spectator.queryAll('h5.title').map((el) => el.textContent); + expect(labels[0]).toBe('Edit'); + expect(labels[1]).toBe('Delete'); + }); }); it('updates form control value when user presses the button', async () => { diff --git a/src/app/modules/forms/ix-forms/components/ix-icon-group/ix-icon-group.component.ts b/src/app/modules/forms/ix-forms/components/ix-icon-group/ix-icon-group.component.ts index 0a342a0dece..b2cee9d93ca 100644 --- a/src/app/modules/forms/ix-forms/components/ix-icon-group/ix-icon-group.component.ts +++ b/src/app/modules/forms/ix-forms/components/ix-icon-group/ix-icon-group.component.ts @@ -20,13 +20,13 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - IxLabelComponent, - MatIconButton, - IxIconComponent, IxErrorsComponent, + IxIconComponent, + IxLabelComponent, ReactiveFormsModule, - TranslateModule, TestDirective, + TranslateModule, + MatIconButton, ], hostDirectives: [ { ...registeredDirectiveConfig }, @@ -37,6 +37,7 @@ export class IxIconGroupComponent implements ControlValueAccessor { readonly label = input(); readonly tooltip = input(); readonly required = input(false); + readonly showLabels = input(false); protected isDisabled = false; protected value: IconGroupOption['value']; diff --git a/src/app/pages/datasets/components/dataset-node/dataset-roles-cell/dataset-roles-cell.component.html b/src/app/pages/datasets/components/dataset-node/dataset-roles-cell/dataset-roles-cell.component.html index ee7dcc1cfe7..5efa3ff9ad8 100644 --- a/src/app/pages/datasets/components/dataset-node/dataset-roles-cell/dataset-roles-cell.component.html +++ b/src/app/pages/datasets/components/dataset-node/dataset-roles-cell/dataset-roles-cell.component.html @@ -22,7 +22,7 @@ @if (dataset().vms?.length) { } diff --git a/src/app/pages/datasets/components/dataset-node/dataset-roles-cell/dataset-roles-cell.component.spec.ts b/src/app/pages/datasets/components/dataset-node/dataset-roles-cell/dataset-roles-cell.component.spec.ts index 39b37646603..775b6e73fc7 100644 --- a/src/app/pages/datasets/components/dataset-node/dataset-roles-cell/dataset-roles-cell.component.spec.ts +++ b/src/app/pages/datasets/components/dataset-node/dataset-roles-cell/dataset-roles-cell.component.spec.ts @@ -51,7 +51,7 @@ describe('DatasetRolesCellComponent', () => { it('shows "VM" icon and tooltip when dataset has vms', async () => { await setupTest({ name: 'root', vms: [{ name: 'vm1', path: '' }, { name: 'vm1', path: '' }, { name: 'vm2', path: '' }] } as DatasetDetails, false); - expect(await ixIcon.getName()).toBe('computer'); + expect(await ixIcon.getName()).toBe('mdi-laptop'); expect(spectator.query(MatTooltip)!.message).toBe('This dataset is used by: vm1, vm2'); }); @@ -71,7 +71,7 @@ describe('DatasetRolesCellComponent', () => { it('shows "VM" icon when dataset has VMs', async () => { await setupTest({ name: 'root', vms: [{}] } as DatasetDetails, false); - expect(await ixIcon.getName()).toBe('computer'); + expect(await ixIcon.getName()).toBe('mdi-laptop'); }); it('shows "SMB Share" icon for dataset', async () => { diff --git a/src/app/pages/datasets/components/roles-card/roles-card.component.html b/src/app/pages/datasets/components/roles-card/roles-card.component.html index 106b6f8eeaa..42adb41c8ba 100644 --- a/src/app/pages/datasets/components/roles-card/roles-card.component.html +++ b/src/app/pages/datasets/components/roles-card/roles-card.component.html @@ -44,7 +44,7 @@

{{ 'Roles' | translate }}

} @if (dataset().vms?.length) {
- +
{{ 'VM' | translate }}:
{{ 'This dataset is used by: {vms}' | translate: { vms: vmNames() } }} diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/add-device-menu/add-device-menu.component.ts b/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/add-device-menu/add-device-menu.component.ts index cf41980cb50..ac0dc197054 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/add-device-menu/add-device-menu.component.ts +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/add-device-menu/add-device-menu.component.ts @@ -7,7 +7,7 @@ import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { pickBy } from 'lodash-es'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; -import { VirtualizationDeviceType, VirtualizationGpuType, VirtualizationType } from 'app/enums/virtualization.enum'; +import { VirtualizationDeviceType, VirtualizationGpuType } from 'app/enums/virtualization.enum'; import { AvailableUsb, VirtualizationDevice, @@ -42,7 +42,7 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; export class AddDeviceMenuComponent { private readonly usbChoices = toSignal(this.api.call('virt.device.usb_choices'), { initialValue: {} }); // TODO: Stop hardcoding params - private readonly gpuChoices = toSignal(this.api.call('virt.device.gpu_choices', [VirtualizationType.Container, VirtualizationGpuType.Physical]), { initialValue: {} }); + private readonly gpuChoices = toSignal(this.api.call('virt.device.gpu_choices', [VirtualizationGpuType.Physical]), { initialValue: {} }); protected readonly isLoadingDevices = this.deviceStore.isLoading; diff --git a/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.html b/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.html index f224bfec1a2..02751cc20de 100644 --- a/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.html +++ b/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.html @@ -16,6 +16,14 @@ [required]="true" > + +
- @if ((usbDevices$ | async); as usbDevices) { - @if (usbDevices.length > 0) { - 0) { + + - - - } + [options]="usbDevices$" + > + } - @if ((gpuDevices$ | async); as gpuDevices) { - @if (gpuDevices.length > 0) { - 0) { + + - - - } + [options]="gpuDevices$" + > + }
diff --git a/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.spec.ts b/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.spec.ts index 3418b6fad98..6c1c75763f7 100644 --- a/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.spec.ts +++ b/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.spec.ts @@ -1,6 +1,7 @@ import { HarnessLoader } from '@angular/cdk/testing'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { MatButtonHarness } from '@angular/material/button/testing'; +import { MatCheckboxHarness } from '@angular/material/checkbox/testing'; import { MatDialog } from '@angular/material/dialog'; import { Router } from '@angular/router'; import { @@ -25,6 +26,7 @@ import { VirtualizationInstance } from 'app/interfaces/virtualization.interface' import { AuthService } from 'app/modules/auth/auth.service'; import { DialogService } from 'app/modules/dialog/dialog.service'; import { IxCheckboxHarness } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.harness'; +import { IxIconGroupHarness } from 'app/modules/forms/ix-forms/components/ix-icon-group/ix-icon-group.harness'; import { IxListHarness } from 'app/modules/forms/ix-forms/components/ix-list/ix-list.harness'; import { IxFormHarness } from 'app/modules/forms/ix-forms/testing/ix-form.harness'; import { PageHeaderComponent } from 'app/modules/page-header/page-title-header/page-header.component'; @@ -34,8 +36,7 @@ import { InstanceWizardComponent } from 'app/pages/virtualization/components/ins import { VirtualizationImageWithId } from 'app/pages/virtualization/components/instance-wizard/select-image-dialog/select-image-dialog.component'; import { FilesystemService } from 'app/services/filesystem.service'; -// TODO: https://ixsystems.atlassian.net/browse/NAS-133118 -describe.skip('InstanceWizardComponent', () => { +describe('InstanceWizardComponent', () => { let spectator: SpectatorRouting; let loader: HarnessLoader; let form: IxFormHarness; @@ -57,7 +58,15 @@ describe.skip('InstanceWizardComponent', () => { autostart: false, cpu: 'Intel Xeon', memory: 2 * GiB, - } as VirtualizationInstance]), + }, + { + id: 'testVM', + name: 'testVM', + type: VirtualizationType.Vm, + autostart: false, + cpu: 'Intel Xeon', + memory: 4 * GiB, + }] as VirtualizationInstance[]), mockCall('interface.has_pending_changes', false), mockCall('virt.device.nic_choices', { nic1: 'nic1', @@ -113,18 +122,98 @@ describe.skip('InstanceWizardComponent', () => { expect(spectator.inject(MatDialog).open).toHaveBeenCalled(); expect(await form.getValues()).toMatchObject({ - Image: 'Almalinux 8 Cloud', + Image: 'almalinux/8/cloud', + }); + }); + + it('creates new container instance when form is submitted', async () => { + await form.fillForm({ + Name: 'new', + 'CPU Configuration': '1-2', + 'Memory Size': '1 GiB', }); + + const browseButton = await loader.getHarness(MatButtonHarness.with({ text: 'Browse Catalog' })); + await browseButton.click(); + + const diskList = await loader.getHarness(IxListHarness.with({ label: 'Disks' })); + await diskList.pressAddButton(); + const diskForm = await diskList.getLastListItem(); + await diskForm.fillForm({ + Source: '/mnt/source', + Destination: 'destination', + }); + + const proxiesList = await loader.getHarness(IxListHarness.with({ label: 'Proxies' })); + await proxiesList.pressAddButton(); + const proxyForm = await proxiesList.getLastListItem(); + await proxyForm.fillForm({ + 'Host Port': 3000, + 'Host Protocol': 'TCP', + 'Instance Port': 2000, + 'Instance Protocol': 'UDP', + }); + + // TODO: Fix this to use IxCheckboxHarness + const usbDeviceCheckbox = await loader.getHarness(MatCheckboxHarness.with({ + label: 'xHCI Host Controller (0003)', + })); + await usbDeviceCheckbox.check(); + + const useDefaultNetworkCheckbox = await loader.getHarness(IxCheckboxHarness.with({ label: 'Use default network settings' })); + await useDefaultNetworkCheckbox.setValue(false); + + // TODO: Fix this to use IxCheckboxHarness + const nicDeviceCheckbox = await loader.getHarness(MatCheckboxHarness.with({ label: 'nic1' })); + await nicDeviceCheckbox.check(); + + // TODO: Fix this to use IxCheckboxHarness + const gpuDeviceCheckbox = await loader.getHarness(MatCheckboxHarness.with({ label: 'NVIDIA GeForce GTX 1080' })); + await gpuDeviceCheckbox.check(); + + const createButton = await loader.getHarness(MatButtonHarness.with({ text: 'Create' })); + await createButton.click(); + + expect(spectator.inject(ApiService).job).toHaveBeenCalledWith('virt.instance.create', [{ + name: 'new', + autostart: true, + cpu: '1-2', + instance_type: VirtualizationType.Container, + devices: [ + { + dev_type: VirtualizationDeviceType.Disk, + source: '/mnt/source', + destination: 'destination', + }, + { + dev_type: VirtualizationDeviceType.Proxy, + source_port: 3000, + source_proto: VirtualizationProxyProtocol.Tcp, + dest_port: 2000, + dest_proto: VirtualizationProxyProtocol.Udp, + }, + { dev_type: VirtualizationDeviceType.Nic, nic_type: VirtualizationNicType.Bridged, parent: 'nic1' }, + { dev_type: VirtualizationDeviceType.Usb, product_id: '0003' }, + { dev_type: VirtualizationDeviceType.Gpu, pci: 'pci_0000_01_00_0' }, + ], + image: 'almalinux/8/cloud', + memory: GiB, + environment: {}, + }]); + expect(spectator.inject(DialogService).jobDialog).toHaveBeenCalled(); + expect(spectator.inject(SnackbarService).success).toHaveBeenCalled(); }); - it('creates new instance when form is submitted', async () => { + it('creates new vm instance when form is submitted', async () => { await form.fillForm({ Name: 'new', - Autostart: true, 'CPU Configuration': '1-2', 'Memory Size': '1 GiB', }); + const instanceType = await loader.getHarness(IxIconGroupHarness.with({ label: 'Virtualization Method' })); + await instanceType.setValue('VM'); + const browseButton = await loader.getHarness(MatButtonHarness.with({ text: 'Browse Catalog' })); await browseButton.click(); @@ -146,17 +235,22 @@ describe.skip('InstanceWizardComponent', () => { 'Instance Protocol': 'UDP', }); - const usbDeviceCheckbox = await loader.getHarness(IxCheckboxHarness.with({ label: 'xHCI Host Controller (0003)' })); - await usbDeviceCheckbox.setValue(true); + // TODO: Fix this to use IxCheckboxHarness + const usbDeviceCheckbox = await loader.getHarness(MatCheckboxHarness.with({ + label: 'xHCI Host Controller (0003)', + })); + await usbDeviceCheckbox.check(); const useDefaultNetworkCheckbox = await loader.getHarness(IxCheckboxHarness.with({ label: 'Use default network settings' })); await useDefaultNetworkCheckbox.setValue(false); - const nicDeviceCheckbox = await loader.getHarness(IxCheckboxHarness.with({ label: 'nic1' })); - await nicDeviceCheckbox.setValue(true); + // TODO: Fix this to use IxCheckboxHarness + const nicDeviceCheckbox = await loader.getHarness(MatCheckboxHarness.with({ label: 'nic1' })); + await nicDeviceCheckbox.check(); - const gpuDeviceCheckbox = await loader.getHarness(IxCheckboxHarness.with({ label: 'NVIDIA GeForce GTX 1080' })); - await gpuDeviceCheckbox.setValue(true); + // TODO: Fix this to use IxCheckboxHarness + const gpuDeviceCheckbox = await loader.getHarness(MatCheckboxHarness.with({ label: 'NVIDIA GeForce GTX 1080' })); + await gpuDeviceCheckbox.check(); const createButton = await loader.getHarness(MatButtonHarness.with({ text: 'Create' })); await createButton.click(); @@ -165,6 +259,7 @@ describe.skip('InstanceWizardComponent', () => { name: 'new', autostart: true, cpu: '1-2', + instance_type: VirtualizationType.Vm, devices: [ { dev_type: VirtualizationDeviceType.Disk, @@ -193,7 +288,6 @@ describe.skip('InstanceWizardComponent', () => { it('sends no NIC devices when default network settings checkbox is set', async () => { await form.fillForm({ Name: 'new', - Autostart: true, 'CPU Configuration': '1-2', 'Memory Size': '1 GiB', }); @@ -204,10 +298,12 @@ describe.skip('InstanceWizardComponent', () => { const useDefaultNetworkCheckbox = await loader.getHarness(IxCheckboxHarness.with({ label: 'Use default network settings' })); await useDefaultNetworkCheckbox.setValue(false); - const nicDeviceCheckbox = await loader.getHarness(IxCheckboxHarness.with({ label: 'nic1' })); - await nicDeviceCheckbox.setValue(true); + // TODO: Fix this to use IxCheckboxHarness + const nicDeviceCheckbox = await loader.getHarness(MatCheckboxHarness.with({ label: 'nic1' })); + await nicDeviceCheckbox.check(); await useDefaultNetworkCheckbox.setValue(true); // no nic1 should be send now + spectator.detectChanges(); const createButton = await loader.getHarness(MatButtonHarness.with({ text: 'Create' })); await createButton.click(); @@ -220,6 +316,7 @@ describe.skip('InstanceWizardComponent', () => { image: 'almalinux/8/cloud', memory: GiB, environment: {}, + instance_type: 'CONTAINER', }]); expect(spectator.inject(DialogService).jobDialog).toHaveBeenCalled(); expect(spectator.inject(SnackbarService).success).toHaveBeenCalled(); diff --git a/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.ts b/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.ts index 807e77dbb99..a2ed66c7ff9 100644 --- a/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.ts +++ b/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.ts @@ -14,6 +14,7 @@ import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { + filter, map, Observable, of, } from 'rxjs'; import { Role } from 'app/enums/role.enum'; @@ -26,6 +27,8 @@ import { virtualizationProxyProtocolLabels, VirtualizationRemote, VirtualizationType, + virtualizationTypeIcons, + virtualizationTypeLabels, } from 'app/enums/virtualization.enum'; import { mapToOptions } from 'app/helpers/options.helper'; import { containersHelptext } from 'app/helptext/virtualization/containers'; @@ -42,6 +45,7 @@ import { IxCheckboxListComponent } from 'app/modules/forms/ix-forms/components/i import { IxExplorerComponent } from 'app/modules/forms/ix-forms/components/ix-explorer/ix-explorer.component'; import { IxFormGlossaryComponent } from 'app/modules/forms/ix-forms/components/ix-form-glossary/ix-form-glossary.component'; import { IxFormSectionComponent } from 'app/modules/forms/ix-forms/components/ix-form-section/ix-form-section.component'; +import { IxIconGroupComponent } from 'app/modules/forms/ix-forms/components/ix-icon-group/ix-icon-group.component'; import { IxInputComponent } from 'app/modules/forms/ix-forms/components/ix-input/ix-input.component'; import { IxListItemComponent } from 'app/modules/forms/ix-forms/components/ix-list/ix-list-item/ix-list-item.component'; import { IxListComponent } from 'app/modules/forms/ix-forms/components/ix-list/ix-list.component'; @@ -64,23 +68,24 @@ import { FilesystemService } from 'app/services/filesystem.service'; selector: 'ix-instance-wizard', standalone: true, imports: [ - PageHeaderComponent, - IxInputComponent, - ReactiveFormsModule, - TranslateModule, - IxCheckboxComponent, - MatButton, - TestDirective, - ReadOnlyComponent, AsyncPipe, - IxListComponent, + IxCheckboxComponent, + IxCheckboxListComponent, + IxExplorerComponent, IxFormGlossaryComponent, IxFormSectionComponent, - IxCheckboxListComponent, + IxInputComponent, + IxListComponent, IxListItemComponent, IxSelectComponent, - IxExplorerComponent, + MatButton, NgxSkeletonLoaderModule, + PageHeaderComponent, + ReactiveFormsModule, + ReadOnlyComponent, + TestDirective, + TranslateModule, + IxIconGroupComponent, ], templateUrl: './instance-wizard.component.html', styleUrls: ['./instance-wizard.component.scss'], @@ -90,6 +95,8 @@ export class InstanceWizardComponent { protected readonly isLoading = signal(false); protected readonly requiredRoles = [Role.VirtGlobalWrite]; protected readonly VirtualizationNicType = VirtualizationNicType; + protected readonly virtualizationTypeOptions$ = of(mapToOptions(virtualizationTypeLabels, this.translate)); + protected readonly virtualizationTypeIcons = virtualizationTypeIcons; protected readonly hasPendingInterfaceChanges = toSignal(this.api.call('interface.has_pending_changes')); @@ -109,10 +116,9 @@ export class InstanceWizardComponent { }))), ); - // TODO: MV supports only [Container, Physical] for now (based on the response) gpuDevices$ = this.api.call( 'virt.device.gpu_choices', - [VirtualizationType.Container, VirtualizationGpuType.Physical], + [VirtualizationGpuType.Physical], ).pipe( map((choices) => Object.entries(choices).map(([pci, gpu]) => ({ label: gpu.description, @@ -121,10 +127,11 @@ export class InstanceWizardComponent { ); protected readonly form = this.formBuilder.nonNullable.group({ - name: ['', Validators.required], - image: ['', Validators.required], + name: ['', [Validators.required, Validators.minLength(1), Validators.maxLength(200)]], + instance_type: [VirtualizationType.Container, Validators.required], + image: ['', [Validators.required, Validators.minLength(1), Validators.maxLength(200)]], cpu: ['', [cpuValidator()]], - memory: [null as number | null], + memory: [null as number], use_default_network: [true], usb_devices: [[] as string[]], gpu_devices: [[] as string[]], @@ -132,9 +139,9 @@ export class InstanceWizardComponent { mac_vlan_nics: [[] as string[]], proxies: this.formBuilder.array; - source_port: FormControl; + source_port: FormControl; dest_proto: FormControl; - dest_port: FormControl; + dest_port: FormControl; }>>([]), disks: this.formBuilder.array; @@ -167,25 +174,22 @@ export class InstanceWizardComponent { minWidth: '90vw', data: { remote: VirtualizationRemote.LinuxContainers, + type: this.form.controls.instance_type.value, }, }) .afterClosed() - .pipe(untilDestroyed(this)) + .pipe(filter(Boolean), untilDestroyed(this)) .subscribe((image: VirtualizationImageWithId) => { - if (!image) { - return; - } - this.form.controls.image.setValue(image.id); }); } protected addProxy(): void { - const control = this.formBuilder.nonNullable.group({ + const control = this.formBuilder.group({ source_proto: [VirtualizationProxyProtocol.Tcp], - source_port: [null as number | null, Validators.required], + source_port: [null as number, Validators.required], dest_proto: [VirtualizationProxyProtocol.Tcp], - dest_port: [null as number | null, Validators.required], + dest_port: [null as number, Validators.required], }); this.form.controls.proxies.push(control); @@ -196,7 +200,7 @@ export class InstanceWizardComponent { } protected addDisk(): void { - const control = this.formBuilder.nonNullable.group({ + const control = this.formBuilder.group({ source: ['', Validators.required], destination: ['', Validators.required], }); @@ -228,7 +232,7 @@ export class InstanceWizardComponent { } addEnvironmentVariable(): void { - const control = this.formBuilder.nonNullable.group({ + const control = this.formBuilder.group({ name: ['', Validators.required], value: ['', Validators.required], }); @@ -246,6 +250,7 @@ export class InstanceWizardComponent { return { devices, autostart: true, + instance_type: this.form.controls.instance_type.value, name: this.form.controls.name.value, cpu: this.form.controls.cpu.value, memory: this.form.controls.memory.value, @@ -297,23 +302,26 @@ export class InstanceWizardComponent { dev_type: VirtualizationDeviceType.Gpu, }); } - const macVlanNics: { parent: string; dev_type: VirtualizationDeviceType; nic_type: VirtualizationNicType }[] = []; - for (const parent of this.form.controls.mac_vlan_nics.value) { - macVlanNics.push({ - parent, - dev_type: VirtualizationDeviceType.Nic, - nic_type: VirtualizationNicType.Macvlan, - }); + if (!this.form.controls.use_default_network.value) { + for (const parent of this.form.controls.mac_vlan_nics.value) { + macVlanNics.push({ + parent, + dev_type: VirtualizationDeviceType.Nic, + nic_type: VirtualizationNicType.Macvlan, + }); + } } const bridgedNics: { parent: string; dev_type: VirtualizationDeviceType; nic_type: VirtualizationNicType }[] = []; - for (const parent of this.form.controls.bridged_nics.value) { - bridgedNics.push({ - parent, - dev_type: VirtualizationDeviceType.Nic, - nic_type: VirtualizationNicType.Bridged, - }); + if (!this.form.controls.use_default_network.value) { + for (const parent of this.form.controls.bridged_nics.value) { + bridgedNics.push({ + parent, + dev_type: VirtualizationDeviceType.Nic, + nic_type: VirtualizationNicType.Bridged, + }); + } } const proxies = this.form.controls.proxies.value.map((proxy) => ({ diff --git a/src/app/pages/virtualization/components/instance-wizard/select-image-dialog/select-image-dialog.component.spec.ts b/src/app/pages/virtualization/components/instance-wizard/select-image-dialog/select-image-dialog.component.spec.ts index 2ae49a09c2a..c3b0e7f0f2d 100644 --- a/src/app/pages/virtualization/components/instance-wizard/select-image-dialog/select-image-dialog.component.spec.ts +++ b/src/app/pages/virtualization/components/instance-wizard/select-image-dialog/select-image-dialog.component.spec.ts @@ -12,7 +12,7 @@ import { mockCall, mockApi, } from 'app/core/testing/utils/mock-api.utils'; -import { VirtualizationRemote } from 'app/enums/virtualization.enum'; +import { VirtualizationRemote, VirtualizationType } from 'app/enums/virtualization.enum'; import { VirtualizationImage } from 'app/interfaces/virtualization.interface'; import { IxFormHarness } from 'app/modules/forms/ix-forms/testing/ix-form.harness'; import { ApiService } from 'app/modules/websocket/api.service'; @@ -25,6 +25,7 @@ const imageChoices: Record = { release: '8', archs: ['arm64'], variant: 'cloud', + instance_types: [VirtualizationType.Container], } as VirtualizationImage, 'alpine/3.18/default': { label: 'Alpine 3.18 (armhf, default)', @@ -32,6 +33,7 @@ const imageChoices: Record = { release: '3.18', archs: ['armhf'], variant: 'default', + instance_types: [VirtualizationType.Container], } as VirtualizationImage, } as Record; @@ -47,7 +49,10 @@ describe('SelectImageDialogComponent', () => { mockProvider(MatDialogRef), { provide: MAT_DIALOG_DATA, - useValue: { remote: VirtualizationRemote.LinuxContainers }, + useValue: { + remote: VirtualizationRemote.LinuxContainers, + type: VirtualizationType.Container, + }, }, ], }); diff --git a/src/app/pages/virtualization/components/instance-wizard/select-image-dialog/select-image-dialog.component.ts b/src/app/pages/virtualization/components/instance-wizard/select-image-dialog/select-image-dialog.component.ts index 52ee27272d3..7822dffdc9d 100644 --- a/src/app/pages/virtualization/components/instance-wizard/select-image-dialog/select-image-dialog.component.ts +++ b/src/app/pages/virtualization/components/instance-wizard/select-image-dialog/select-image-dialog.component.ts @@ -1,5 +1,6 @@ import { ChangeDetectionStrategy, Component, Inject, signal, OnInit, + computed, } from '@angular/core'; import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; import { MatButton, MatIconButton } from '@angular/material/button'; @@ -11,7 +12,7 @@ import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { catchError, Observable, of } from 'rxjs'; import { EmptyType } from 'app/enums/empty-type.enum'; -import { VirtualizationRemote } from 'app/enums/virtualization.enum'; +import { VirtualizationRemote, VirtualizationType } from 'app/enums/virtualization.enum'; import { EmptyConfig } from 'app/interfaces/empty-config.interface'; import { Option } from 'app/interfaces/option.interface'; import { VirtualizationImage } from 'app/interfaces/virtualization.interface'; @@ -71,13 +72,17 @@ export class SelectImageDialogComponent implements OnInit { large: true, } as EmptyConfig); + protected isContainer = computed(() => { + return this.data.type === VirtualizationType.Container; + }); + constructor( private api: ApiService, private dialogRef: MatDialogRef, private fb: FormBuilder, private translate: TranslateService, private errorHandler: ErrorHandlerService, - @Inject(MAT_DIALOG_DATA) protected data: { remote: VirtualizationRemote }, + @Inject(MAT_DIALOG_DATA) protected data: { remote: VirtualizationRemote; type: VirtualizationType }, ) { this.filterForm.valueChanges.pipe(untilDestroyed(this)).subscribe(() => this.filterImages()); } @@ -95,7 +100,7 @@ export class SelectImageDialogComponent implements OnInit { } private getImages(): void { - this.api.call('virt.instance.image_choices', [this.data]) + this.api.call('virt.instance.image_choices', [{ remote: this.data.remote }]) .pipe( catchError((error: unknown) => { this.errorHandler.showErrorModal(error); @@ -114,7 +119,10 @@ export class SelectImageDialogComponent implements OnInit { const variantSet = new Set(); const releaseSet = new Set(); - const imageArray = Object.entries(images).map(([id, image]) => ({ ...image, id })); + const imageArray = Object.entries(images) + .filter(([_, image]) => image?.instance_types?.includes(this.data.type)) + .map(([id, image]) => ({ ...image, id })); + this.images.set(imageArray); imageArray.forEach((image) => { diff --git a/src/app/services/navigation/navigation.service.ts b/src/app/services/navigation/navigation.service.ts index 49a2038a839..fb7076b2644 100644 --- a/src/app/services/navigation/navigation.service.ts +++ b/src/app/services/navigation/navigation.service.ts @@ -90,17 +90,15 @@ export class NavigationService { name: T('Virtualization'), type: MenuItemType.Link, tooltip: T('Virtualization'), - icon: iconMarker('computer'), - state: 'vm', - isVisible$: this.hasVms$, + icon: iconMarker('mdi-laptop'), + state: 'virtualization', }, { - name: T('Containers (WIP)'), + name: T('Virtualization (Old)'), type: MenuItemType.Link, - tooltip: T('Containers'), - icon: iconMarker('view_in_ar'), - state: 'virtualization', - isVisible$: this.hasApps$, + tooltip: T('Virtualization (Old)'), + icon: iconMarker('mdi-laptop'), + state: 'vm', }, { name: T('Apps'), diff --git a/src/assets/i18n/af.json b/src/assets/i18n/af.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/af.json +++ b/src/assets/i18n/af.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/ar.json b/src/assets/i18n/ar.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/ar.json +++ b/src/assets/i18n/ar.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/ast.json b/src/assets/i18n/ast.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/ast.json +++ b/src/assets/i18n/ast.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/az.json b/src/assets/i18n/az.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/az.json +++ b/src/assets/i18n/az.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/be.json b/src/assets/i18n/be.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/be.json +++ b/src/assets/i18n/be.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/bg.json b/src/assets/i18n/bg.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/bg.json +++ b/src/assets/i18n/bg.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/bn.json b/src/assets/i18n/bn.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/bn.json +++ b/src/assets/i18n/bn.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/br.json b/src/assets/i18n/br.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/br.json +++ b/src/assets/i18n/br.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/bs.json b/src/assets/i18n/bs.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/bs.json +++ b/src/assets/i18n/bs.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/ca.json b/src/assets/i18n/ca.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/ca.json +++ b/src/assets/i18n/ca.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/cs.json b/src/assets/i18n/cs.json index 6b46f75e981..a8e45134625 100644 --- a/src/assets/i18n/cs.json +++ b/src/assets/i18n/cs.json @@ -149,6 +149,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -660,7 +661,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2005,6 +2005,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4178,6 +4179,7 @@ "Variant": "", "View logs": "", "Virtual Ports": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4185,6 +4187,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization settings updated": "", "WARNING: A failover will temporarily interrupt system services.": "", "WARNING: Adding data VDEVs with different numbers of disks is not recommended.": "", diff --git a/src/assets/i18n/cy.json b/src/assets/i18n/cy.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/cy.json +++ b/src/assets/i18n/cy.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/da.json b/src/assets/i18n/da.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/da.json +++ b/src/assets/i18n/da.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 02f06add9ed..894a887b4ee 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -289,6 +289,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any system service can communicate externally.": "", "Api Keys": "", "App": "", @@ -723,7 +724,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -1807,6 +1807,7 @@ "Link Aggregation Protocol": "", "Link aggregation interface": "", "Linked Service": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -3674,6 +3675,7 @@ "Virtual Machines": "", "Virtual Ports": "", "Virtual machine created": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -3681,6 +3683,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/dsb.json b/src/assets/i18n/dsb.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/dsb.json +++ b/src/assets/i18n/dsb.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/el.json b/src/assets/i18n/el.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/el.json +++ b/src/assets/i18n/el.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/en-au.json b/src/assets/i18n/en-au.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/en-au.json +++ b/src/assets/i18n/en-au.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/en-gb.json b/src/assets/i18n/en-gb.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/en-gb.json +++ b/src/assets/i18n/en-gb.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/eo.json b/src/assets/i18n/eo.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/eo.json +++ b/src/assets/i18n/eo.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/es-ar.json b/src/assets/i18n/es-ar.json index 586002a4d7c..417802c0c07 100644 --- a/src/assets/i18n/es-ar.json +++ b/src/assets/i18n/es-ar.json @@ -1,5 +1,6 @@ { "": "", + "Any OS": "", "Archs": "", "Flash Identify Light": "", "Key Cert Sign": "", @@ -12,6 +13,7 @@ "LUN ID": "", "LUN RPM": "", "Lan": "", + "Linux Only": "", "Locks": "", "MOTD": "", "Machine Time: {machineTime} \n Browser Time: {browserTime}": "", @@ -85,6 +87,8 @@ "The following { n, plural, one {boot environment} other {# boot environments} } will be deleted. Are you sure you want to proceed?": "", "USB Passthrough Device": "", "Unlock Child Encrypted Roots": "", + "Virtualization (Old)": "", + "Virtualization Method": "", "everyone@": "", "group@": "", "\n It looks like your session has been inactive for more than {lifetime} seconds.
\n For security reasons we will log you out at {time}.\n ": "\nParece que tu sesión estuvo inactiva durante más de {lifetime} segundos.
\nPor razones de seguridad, vamos a cerrar tu sesión a las {time}.\n", @@ -1080,7 +1084,6 @@ "Container Shell": "Shell del contenedor", "Container Write": "Escritura del contenedor", "Containers": "Contenedores", - "Containers (WIP)": "Contenedores (en proceso)", "Content Commitment": "Compromiso de contenido", "Contents of the uploaded Service Account JSON file.": "Contenido del archivo JSON de cuenta de servicio cargado.", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "Las operaciones de copiar y pegar del menú contextual están deshabilitadas en el Shell. Los accesos directos para copiar y pegar para Mac son Command+c y Command+v. Para la mayoría de los sistemas operativos, use Ctrl+Insertar para copiar y Mayús+Insertar para pegar.", diff --git a/src/assets/i18n/es-co.json b/src/assets/i18n/es-co.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/es-co.json +++ b/src/assets/i18n/es-co.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/es-mx.json b/src/assets/i18n/es-mx.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/es-mx.json +++ b/src/assets/i18n/es-mx.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/es-ni.json b/src/assets/i18n/es-ni.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/es-ni.json +++ b/src/assets/i18n/es-ni.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/es-ve.json b/src/assets/i18n/es-ve.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/es-ve.json +++ b/src/assets/i18n/es-ve.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index 1e2ff977be7..16523543d4a 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -386,6 +386,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -880,7 +881,6 @@ "Container Read": "", "Container Shell": "", "Container Write": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2269,6 +2269,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4530,6 +4531,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4537,6 +4539,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/et.json b/src/assets/i18n/et.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/et.json +++ b/src/assets/i18n/et.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/eu.json b/src/assets/i18n/eu.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/eu.json +++ b/src/assets/i18n/eu.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/fa.json b/src/assets/i18n/fa.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/fa.json +++ b/src/assets/i18n/fa.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/fi.json b/src/assets/i18n/fi.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/fi.json +++ b/src/assets/i18n/fi.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index 504758cd911..0eca8840e58 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -29,6 +29,7 @@ "Admins": "", "Age": "", "Alias": "", + "Any OS": "", "Api Keys": "", "App": "", "App Info": "", @@ -122,7 +123,6 @@ "Container Read": "", "Container Shell": "", "Container Write": "", - "Containers (WIP)": "", "Continue in background": "", "Contract Type": "", "Controller": "", @@ -384,6 +384,7 @@ "Link Aggregation Protocol": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "Locks": "", "MOTD": "", "Machine": "", @@ -825,6 +826,7 @@ "Vendor ID": "", "Verbose Logging": "", "Virtual Ports": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -832,6 +834,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Voltage": "", "WWPN": "", "WWPN (B)": "", diff --git a/src/assets/i18n/fy.json b/src/assets/i18n/fy.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/fy.json +++ b/src/assets/i18n/fy.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/ga.json b/src/assets/i18n/ga.json index 7c604f78351..b0894ca0154 100644 --- a/src/assets/i18n/ga.json +++ b/src/assets/i18n/ga.json @@ -29,6 +29,7 @@ "Allow clients to access the TrueNAS server if they are members of domains that have a trust relationship with the domain to which TrueNAS is joined. This requires valid idmap backend configuration for all trusted domains.": "", "Also unlock any separate encryption roots that are children of this dataset. Child datasets that inherit encryption from this encryption root will be unlocked in either case.": "", "An update is already applied. Please restart the system.": "", + "Any OS": "", "Api Keys": "", "App Info": "", "App Network": "", @@ -72,7 +73,6 @@ "Container ID": "", "Container Logs": "", "Container Shell": "", - "Containers (WIP)": "", "Continue in background": "", "Controller": "", "Controller A WWPN": "", @@ -189,6 +189,7 @@ "Leave empty to allow all host CPUs to be used.": "", "Leave empty to not limit instance memory.": "", "Legacy OS: Extent block size 512b, TPC enabled, no Xen compat mode, SSD speed": "", + "Linux Only": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", "Log In To Outlook": "", "Log in to {oauthType} to set up Oauth credentials.": "", @@ -359,6 +360,7 @@ "View Logs": "", "View logs": "", "Virtual Ports": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -366,6 +368,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization settings updated": "", "Volume Mounts": "", "WWPN": "", diff --git a/src/assets/i18n/gd.json b/src/assets/i18n/gd.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/gd.json +++ b/src/assets/i18n/gd.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/gl.json b/src/assets/i18n/gl.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/gl.json +++ b/src/assets/i18n/gl.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/he.json b/src/assets/i18n/he.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/he.json +++ b/src/assets/i18n/he.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/hi.json b/src/assets/i18n/hi.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/hi.json +++ b/src/assets/i18n/hi.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/hr.json b/src/assets/i18n/hr.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/hr.json +++ b/src/assets/i18n/hr.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/hsb.json b/src/assets/i18n/hsb.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/hsb.json +++ b/src/assets/i18n/hsb.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/hu.json b/src/assets/i18n/hu.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/hu.json +++ b/src/assets/i18n/hu.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/ia.json b/src/assets/i18n/ia.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/ia.json +++ b/src/assets/i18n/ia.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/id.json b/src/assets/i18n/id.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/id.json +++ b/src/assets/i18n/id.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/io.json b/src/assets/i18n/io.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/io.json +++ b/src/assets/i18n/io.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/is.json b/src/assets/i18n/is.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/is.json +++ b/src/assets/i18n/is.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/it.json b/src/assets/i18n/it.json index bec9d1afbe6..61e6f110290 100644 --- a/src/assets/i18n/it.json +++ b/src/assets/i18n/it.json @@ -382,6 +382,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -868,7 +869,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2323,6 +2323,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -3821,6 +3822,7 @@ "Vdevs spans enclosure": "", "View logs": "", "Virtual Ports": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -3828,6 +3830,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization settings updated": "", "WARNING: Adding data VDEVs with different numbers of disks is not recommended.": "", "WWPN": "", diff --git a/src/assets/i18n/ja.json b/src/assets/i18n/ja.json index 792cd157375..a0f74565233 100644 --- a/src/assets/i18n/ja.json +++ b/src/assets/i18n/ja.json @@ -358,6 +358,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any system service can communicate externally.": "", "Api Keys": "", "App": "", @@ -826,7 +827,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Continue in background": "", @@ -2215,6 +2215,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4492,6 +4493,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4499,6 +4501,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/ka.json b/src/assets/i18n/ka.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/ka.json +++ b/src/assets/i18n/ka.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/kk.json b/src/assets/i18n/kk.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/kk.json +++ b/src/assets/i18n/kk.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/km.json b/src/assets/i18n/km.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/km.json +++ b/src/assets/i18n/km.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/kn.json b/src/assets/i18n/kn.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/kn.json +++ b/src/assets/i18n/kn.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index d4d1b53f218..e2da57e7e65 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -1,5 +1,6 @@ { "": "", + "Any OS": "", "Change Session Timeout in": "", "Change from public to increase system security. Can only contain alphanumeric characters, underscores, dashes, periods, and spaces. This can be left empty for SNMPv3 networks.": "", "Changes to Hosts Allow or Hosts Deny take effect when the SMB service restarts.": "", @@ -68,6 +69,7 @@ "Front": "", "Hot Spare": "", "Hottest": "", + "Linux Only": "", "Long": "", "Name ~ \"admin\"": "", "Networking": "", @@ -93,6 +95,8 @@ "Thick": "", "Unkeep": "", "Until": "", + "Virtualization (Old)": "", + "Virtualization Method": "", "\n It looks like your session has been inactive for more than {lifetime} seconds.
\n For security reasons we will log you out at {time}.\n ": "세션의 비활성화 시간이 {lifetime}초를 넘었습니다.
보안을 위해 {time}에 로그아웃 되었습니다.", " Est. Usable Raw Capacity": " 사용 가능한 원시 용량 추정", " When the UPS Mode is set to slave. Enter the open network port number of the UPS Master system. The default port is 3493.": " UPS 모드슬레이브일 때, 마스터 UPS 시스템의 네트워크 포트 번호를 입력합니다. 기본 포트는 3493입니다.", @@ -1041,7 +1045,6 @@ "Container Shell": "컨테이너 셸", "Container Write": "컨테이너 쓰기", "Containers": "콘테이너", - "Containers (WIP)": "콘테이너 (WIP)", "Contents of the uploaded Service Account JSON file.": "업로드한 서비스 계정 JSON 파일의 내용입니다.", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "셸에선 컨텍스트 메뉴의 복사와 붙여넣기를 사용할 수 없습니다. 복사와 붙여넣기의 Mac 단축키는 Command+cCommand+v입니다. 대부분의 운영체제는 Ctrl+Insert로 복사하고 Shift+Insert로 붙여넣을 수 있습니다.", "Continue": "계속", diff --git a/src/assets/i18n/lb.json b/src/assets/i18n/lb.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/lb.json +++ b/src/assets/i18n/lb.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/lt.json b/src/assets/i18n/lt.json index 673da2e4057..3c45116c5ba 100644 --- a/src/assets/i18n/lt.json +++ b/src/assets/i18n/lt.json @@ -408,6 +408,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -979,7 +980,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2504,6 +2504,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4967,6 +4968,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4974,6 +4976,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/lv.json b/src/assets/i18n/lv.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/lv.json +++ b/src/assets/i18n/lv.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/mk.json b/src/assets/i18n/mk.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/mk.json +++ b/src/assets/i18n/mk.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/ml.json b/src/assets/i18n/ml.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/ml.json +++ b/src/assets/i18n/ml.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/mn.json b/src/assets/i18n/mn.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/mn.json +++ b/src/assets/i18n/mn.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/mr.json b/src/assets/i18n/mr.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/mr.json +++ b/src/assets/i18n/mr.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/my.json b/src/assets/i18n/my.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/my.json +++ b/src/assets/i18n/my.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/nb.json b/src/assets/i18n/nb.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/nb.json +++ b/src/assets/i18n/nb.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/ne.json b/src/assets/i18n/ne.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/ne.json +++ b/src/assets/i18n/ne.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/nl.json b/src/assets/i18n/nl.json index a7fe4a2bdb8..9616a1b6428 100644 --- a/src/assets/i18n/nl.json +++ b/src/assets/i18n/nl.json @@ -1,15 +1,19 @@ { "": "", + "Any OS": "", "Choose a new virtual port": "", "Create new virtual port": "", "Delete Target \"{name}\"": "", "Delete {n} associated {n, plural, one {extent} other {extents}}": "", "Do not connect to a fibre channel port": "", "Existing Ports": "", + "Linux Only": "", "New Cloud Credential": "", "Protocol Options": "", "Use an existing port": "", "Use current port": "", + "Virtualization (Old)": "", + "Virtualization Method": "", "Warning: iSCSI Target is currently in use.
": "", "You are about to delete the target \"{name}\".": "", "You are about to delete the target \"{name}\". You may also choose to delete all extents associated with this target. Note the volumes will not be deleted with the extents.": "", @@ -1008,7 +1012,6 @@ "Container Shell": "Container shell", "Container Write": "Container Schrijven", "Containers": "Containers", - "Containers (WIP)": "Containers (WIP)", "Content Commitment": "Inhoudsbevestiging", "Contents of the uploaded Service Account JSON file.": "Inhoud van het geüploade serviceaccount JSON-bestand.", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "Kopieer- en plakbewerkingen in het contextmenu zijn uitgeschakeld in de Shell. Snelkoppelingen voor kopiëren en plakken voor Mac zijn Command+c en Command+v. Gebruik voor de meeste besturingssystemen Ctrl+Insert om te kopiëren en Shift+Insert om te plakken.", diff --git a/src/assets/i18n/nn.json b/src/assets/i18n/nn.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/nn.json +++ b/src/assets/i18n/nn.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/os.json b/src/assets/i18n/os.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/os.json +++ b/src/assets/i18n/os.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/pa.json b/src/assets/i18n/pa.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/pa.json +++ b/src/assets/i18n/pa.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/pl.json b/src/assets/i18n/pl.json index 40bdb558b96..27c3821c720 100644 --- a/src/assets/i18n/pl.json +++ b/src/assets/i18n/pl.json @@ -368,6 +368,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -938,7 +939,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2456,6 +2456,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4899,6 +4900,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4906,6 +4908,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/pt-br.json b/src/assets/i18n/pt-br.json index a965c276f6f..e31fae75039 100644 --- a/src/assets/i18n/pt-br.json +++ b/src/assets/i18n/pt-br.json @@ -356,6 +356,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -927,7 +928,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2451,6 +2451,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4917,6 +4918,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4924,6 +4926,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/pt.json b/src/assets/i18n/pt.json index 9eaa08a8cd5..fe11df70117 100644 --- a/src/assets/i18n/pt.json +++ b/src/assets/i18n/pt.json @@ -193,6 +193,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Api Keys": "", "App": "", "App Info": "", @@ -436,7 +437,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", "Continue in background": "", @@ -1434,6 +1434,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -3199,6 +3200,7 @@ "Virtual IP Address (Failover Address)": "", "Virtual Machine": "", "Virtual Ports": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -3206,6 +3208,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Voltage": "", diff --git a/src/assets/i18n/ro.json b/src/assets/i18n/ro.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/ro.json +++ b/src/assets/i18n/ro.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/ru.json b/src/assets/i18n/ru.json index f1506e01662..19a81dbf56e 100644 --- a/src/assets/i18n/ru.json +++ b/src/assets/i18n/ru.json @@ -257,6 +257,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any system service can communicate externally.": "", "Api Keys": "", "App": "", @@ -598,7 +599,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Continue in background": "", "Continue with the upgrade": "", @@ -1548,6 +1548,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -3305,6 +3306,7 @@ "Virtual Machine": "", "Virtual Ports": "", "Virtual machine created": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -3312,6 +3314,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Voltage": "", diff --git a/src/assets/i18n/sk.json b/src/assets/i18n/sk.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/sk.json +++ b/src/assets/i18n/sk.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/sl.json b/src/assets/i18n/sl.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/sl.json +++ b/src/assets/i18n/sl.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/sq.json b/src/assets/i18n/sq.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/sq.json +++ b/src/assets/i18n/sq.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/sr-latn.json b/src/assets/i18n/sr-latn.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/sr-latn.json +++ b/src/assets/i18n/sr-latn.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/sr.json b/src/assets/i18n/sr.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/sr.json +++ b/src/assets/i18n/sr.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/strings.json b/src/assets/i18n/strings.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/strings.json +++ b/src/assets/i18n/strings.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/sv.json b/src/assets/i18n/sv.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/sv.json +++ b/src/assets/i18n/sv.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/sw.json b/src/assets/i18n/sw.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/sw.json +++ b/src/assets/i18n/sw.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/ta.json b/src/assets/i18n/ta.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/ta.json +++ b/src/assets/i18n/ta.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/te.json b/src/assets/i18n/te.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/te.json +++ b/src/assets/i18n/te.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/th.json b/src/assets/i18n/th.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/th.json +++ b/src/assets/i18n/th.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/tr.json +++ b/src/assets/i18n/tr.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/tt.json b/src/assets/i18n/tt.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/tt.json +++ b/src/assets/i18n/tt.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/udm.json b/src/assets/i18n/udm.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/udm.json +++ b/src/assets/i18n/udm.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/uk.json b/src/assets/i18n/uk.json index 39d2f8333e5..3862fee8975 100644 --- a/src/assets/i18n/uk.json +++ b/src/assets/i18n/uk.json @@ -158,6 +158,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Api Keys": "", "App": "", "App Info": "", @@ -390,7 +391,6 @@ "Container Read": "", "Container Shell": "", "Container Write": "", - "Containers (WIP)": "", "Continue in background": "", "Continue with the upgrade": "", "Contract Type": "", @@ -1008,6 +1008,7 @@ "Link Aggregation Interfaces": "", "Link Aggregation Protocol": "", "Linked Service": "", + "Linux Only": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", "List of groups for which to generate audit messages. Keep this list empty to Watch All.": "", "List of groups to ignore when auditing. If conflict arises between Watch List and Ignore List (based on user group membership), then Watch List will take precedence and ops will be audited.": "", @@ -2025,6 +2026,7 @@ "Virtual IP Address (Failover Address)": "", "Virtual Machine": "", "Virtual Ports": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -2032,6 +2034,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Voltage": "", diff --git a/src/assets/i18n/vi.json b/src/assets/i18n/vi.json index a69c7620a87..b1f680347a8 100644 --- a/src/assets/i18n/vi.json +++ b/src/assets/i18n/vi.json @@ -413,6 +413,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -985,7 +986,6 @@ "Container Shell": "", "Container Write": "", "Containers": "", - "Containers (WIP)": "", "Content Commitment": "", "Contents of the uploaded Service Account JSON file.": "", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "", @@ -2510,6 +2510,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -4976,6 +4977,7 @@ "Virtual Ports": "", "Virtual machine created": "", "Virtualization": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -4983,6 +4985,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", diff --git a/src/assets/i18n/zh-hans.json b/src/assets/i18n/zh-hans.json index e7cec50b2dc..b7bc31bbfce 100644 --- a/src/assets/i18n/zh-hans.json +++ b/src/assets/i18n/zh-hans.json @@ -1,7 +1,11 @@ { "": "", "...": "", + "Any OS": "", "Both": "", + "Linux Only": "", + "Virtualization (Old)": "", + "Virtualization Method": "", "{n, plural, one {Pool in Enclosure} other {Pools in Enclosure} }": "", "\n It looks like your session has been inactive for more than {lifetime} seconds.
\n For security reasons we will log you out at {time}.\n ": "\n您的会话似乎已超过 {lifetime} 秒处于非活动状态。
\n 出于安全原因,我们将在 {time} 后注销您的会话。\n", " Est. Usable Raw Capacity": "估计可用原始容量", @@ -995,7 +999,6 @@ "Container Shell": "容器 Shell", "Container Write": "容器写入", "Containers": "容器", - "Containers (WIP)": "容器(WIP)", "Content Commitment": "内容承诺", "Contents of the uploaded Service Account JSON file.": "已上传的服务帐户 JSON 文件的内容。", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "命令行管理程序中禁用了上下文菜单复制和粘贴操作。Mac 的复制和粘贴快捷键是Command+cCommand+v。对于大多数操作系统,请使用Ctrl+Insert复制和Shift+Insert粘贴。", diff --git a/src/assets/i18n/zh-hant.json b/src/assets/i18n/zh-hant.json index d120af5dd76..bbc8d2667b0 100644 --- a/src/assets/i18n/zh-hant.json +++ b/src/assets/i18n/zh-hant.json @@ -239,6 +239,7 @@ "An update is already applied. Please restart the system.": "", "Anonymous User Download Bandwidth": "", "Anonymous User Upload Bandwidth": "", + "Any OS": "", "Any notes about initiators.": "", "Any system service can communicate externally.": "", "Api Keys": "", @@ -1613,6 +1614,7 @@ "Link aggregation interface": "", "Linked Service": "", "Linux": "", + "Linux Only": "", "List any existing dataset properties to remove from the replicated files.": "", "List of chat IDs": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", @@ -3407,6 +3409,7 @@ "Virtual Machine": "", "Virtual Ports": "", "Virtual machine created": "", + "Virtualization (Old)": "", "Virtualization Global Read": "", "Virtualization Global Write": "", "Virtualization Image Read": "", @@ -3414,6 +3417,7 @@ "Virtualization Instance Delete": "", "Virtualization Instance Read": "", "Virtualization Instance Write": "", + "Virtualization Method": "", "Virtualization is not supported": "", "Virtualization settings updated": "", "Visible": "", @@ -4117,7 +4121,6 @@ "Container Shell": "容器命令列", "Container Write": "容器寫入", "Containers": "容器", - "Containers (WIP)": "容器 (進行中)", "Continue": "繼續", "Continue in background": "在背景繼續", "Continue with download?": "繼續並下載嗎?", diff --git a/src/assets/icons/sprite-config.json b/src/assets/icons/sprite-config.json index ea5ff843078..f46094f44bd 100644 --- a/src/assets/icons/sprite-config.json +++ b/src/assets/icons/sprite-config.json @@ -1,3 +1,3 @@ { - "iconUrl": "assets/icons/sprite.svg?v=0a208a877e" + "iconUrl": "assets/icons/sprite.svg?v=aa5e18694d" } \ No newline at end of file diff --git a/src/assets/icons/sprite.svg b/src/assets/icons/sprite.svg index b7f0748fbb1..6b2355ddcdb 100644 --- a/src/assets/icons/sprite.svg +++ b/src/assets/icons/sprite.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 2df646d74a6913b3f8c70ea92a8180c7be89a11b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Sall=C3=A9?= Date: Mon, 6 Jan 2025 20:14:03 +0100 Subject: [PATCH 16/32] Update fr.json (#11293) Add some French translations --- src/assets/i18n/fr.json | 98 ++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index 0eca8840e58..bf72ea89fb9 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -97,7 +97,7 @@ "Certificate Subject": "", "Certificate Write": "", "Check": "", - "Choose a new virtual port": "", + "Choose a new virtual port": "Choisissez un nouveau port virtuel", "Clear": "", "Client ID": "", "Close Instance Form": "", @@ -273,10 +273,10 @@ "HTTP Proxy:": "", "HTTPS Port": "", "HTTPS Redirect": "", - "Hardware Change": "", + "Hardware Change": "Changement de matériel", "Has Allow List": "", "Healthy": "", - "Hide Password": "", + "Hide Password": "Masquer le mot de passe", "Home Widgets": "", "Host Model": "", "Host Mounts": "", @@ -390,7 +390,7 @@ "Machine": "", "Macvlan NICs": "", "Main menu": "", - "Maintenance Window": "", + "Maintenance Window": "Maintenance programmée", "Manual Test": "", "Manual Upgrade": "", "Mapall Group": "", @@ -444,12 +444,12 @@ "Network Interface Read": "", "Network Interface Write": "", "Network Reconnection Issue": "", - "Network Reset": "", - "Network Settings": "", - "Network Stats": "", - "Network Traffic": "", + "Network Reset": "Réinitialisation du réseau", + "Network Settings": "Paramètres réseau", + "Network Stats": "Stats réseau", + "Network Traffic": "Trafic réseau", "Network Usage": "", - "Network Utilization": "", + "Network Utilization": "Utilisation du réseau", "New Backup Credential": "", "New Bucket Name": "", "New CSR": "", @@ -503,7 +503,7 @@ "Parent Interface": "", "Passive Controller": "", "Passthrough": "", - "Password Login": "", + "Password Login": "Mot de passe de connexion", "Pattern": "", "Pause Scrub": "", "Pending": "", @@ -519,9 +519,9 @@ "Privilege": "", "Privileges": "", "Processor": "", - "Product": "", - "Product ID": "", - "Promote": "", + "Product": "Produit", + "Product ID": "ID produit", + "Promote": "Promouvoir", "Prompt": "", "Properties Exclude": "", "Properties Override": "", @@ -540,15 +540,15 @@ "RAM": "", "Range Size": "", "Raw Filesize": "", - "Re-Open": "", - "Re-Open All Alerts": "", + "Re-Open": "Réouvrir", + "Re-Open All Alerts": "Réouvrir toutes les alertes", "Read Only": "", "Readonly Admin": "", "Rear": "", - "Reason": "", - "Reboot Local": "", - "Reboot Remote": "", - "Reboot Required": "", + "Reason": "Raison", + "Reboot Local": "Redémarrage local", + "Reboot Remote": "Redémarrage à distance", + "Reboot Required": "Redémarrage requis", "Release": "", "Remove extent association": "", "Replication Admin": "", @@ -577,7 +577,7 @@ "Routing": "", "Rsync": "", "Run As Context": "", - "Running Jobs": "", + "Running Jobs": "Tâches en cours", "S.M.A.R.T.": "", "SAS Connector": "", "SAS Expander": "", @@ -705,7 +705,7 @@ "Snapshot Time": "", "Snapshot Time {time}": "", "Snapshot Write": "", - "Software Installation": "", + "Software Installation": "Installation logiciel", "Sort": "", "Source Path": "", "Spares": "", @@ -731,10 +731,10 @@ "Support License": "", "Support Read": "", "Support Write": "", - "Switch To Advanced": "", - "Switch To Wizard": "", + "Switch To Advanced": "Basculer vers les optiond avancées", + "Switch To Wizard": "Basculer vers l'assistant", "Synced": "", - "Syslog Settings": "", + "Syslog Settings": "Paramètres Syslog", "Syslog TLS Certificate": "", "Syslog TLS Certificate Authority": "", "System Advanced Read": "", @@ -743,25 +743,25 @@ "System Audit Write": "", "System Data Pool": "", "System Dataset": "", - "System Freeze": "", + "System Freeze": "Freeze du système", "System General Read": "", "System General Write": "", - "System Image": "", + "System Image": "Image système", "System Information – Active": "", "System Information – Standby": "", - "System Overload": "", - "System Reports": "", - "System Security Settings": "", + "System Overload": "Surcharge du système", + "System Reports": "Rapports système", + "System Security Settings": "Paramètres de sécurité du système", "System Serial": "", - "System Stats": "", - "System Update": "", - "System Uptime": "", - "System Utilization": "", - "System Version": "", - "TLS No Empty Fragments": "", + "System Stats": "Stats du système", + "System Update": "Mise à jour du système", + "System Uptime": "Durée de fonctionnement du système", + "System Utilization": "Utilisation du système", + "System Version": "Version du Système", + "TLS No Empty Fragments": "TLS Aucun fragment vide", "TLS Policy": "", "Table Actions of Expandable Table": "", - "Task": "", + "Task": "Tâche", "Tenant Domain": "", "Terminal": "", "Test": "", @@ -771,8 +771,8 @@ "Timestamp": "", "Toggle Sidenav": "", "Tolerance Window": "", - "Toolbar": "", - "Tools": "", + "Toolbar": "Barre d'outils", + "Tools": "Outils", "Top": "", "Top bar": "", "Total": "", @@ -782,7 +782,7 @@ "Translate App": "", "Transmit Hash Policy": "", "Transport Encryption Behavior": "", - "Troubleshooting Issues": "", + "Troubleshooting Issues": "Résolution des problèmes", "TrueCommand Read": "", "TrueCommand Write": "", "Tunable": "", @@ -790,14 +790,14 @@ "UNIX Charset": "", "URL": "", "Unix NSS Info": "", - "Unix Primary Group": "", - "Unix Socket": "", + "Unix Primary Group": "Groupe primaire Unix", + "Unix Socket": "Socket Unix", "Unlink": "", - "Updating pool settings": "", + "Updating pool settings": "Mise à jour des paramètres du volume", "Usage Collection": "", "Usages": "", - "Use an existing port": "", - "Use current port": "", + "Use an existing port": "Utiliser un port existant", + "Use current port": "Utiliser le port actuel", "User API Keys": "", "User Bind Path": "", "User CN": "", @@ -819,8 +819,8 @@ "VMWare Sync": "", "VMware Snapshot": "", "Validate Certificates": "", - "Validate Remote Path": "", - "Validate effective ACL": "", + "Validate Remote Path": "Valider le chemin d'accès distant", + "Validate effective ACL": "Valider l'ACL effective", "Variant": "", "Vdevs spans enclosure": "", "Vendor ID": "", @@ -838,7 +838,7 @@ "Voltage": "", "WWPN": "", "WWPN (B)": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.
": "Avertissement : la cible iSCSI est en cours d'utilisation.
.", "Watch List": "", "Weak Ciphers": "", "WebDAV": "", @@ -3674,7 +3674,7 @@ "Power Off": "Éteindre", "Power Off UPS": "Mettre l'onduleur hors tension", "Power On Hours Ago": "Mise sous tension il y a quelques heures", - "Power Outage": "Panne de courant", + "Power Outage": "Coupure de courant", "Power Supply": "Alimentation électrique", "Pre Init": "Initialisation préalable", "Pre-script": "Pré-script", @@ -5318,4 +5318,4 @@ "{used} of {total} ({used_pct})": "{used} de {total} ({used_pct})", "{version} is available!": "{version} est disponible !", "{view} on {enclosure}": "{view} sur {enclosure}" -} \ No newline at end of file +} From 9e504297300ef3486506de3d5442daa4fb7c0194 Mon Sep 17 00:00:00 2001 From: Evgeny Stepanovych Date: Mon, 6 Jan 2025 16:33:27 -0500 Subject: [PATCH 17/32] NAS-133365 / 25.04 / Reporting exporters form is broken (#11282) --- .../api/api-call-directory.interface.ts | 4 +- .../reporting-exporters.interface.ts | 4 +- src/app/interfaces/schema.interface.ts | 2 +- ...reporting-exporters-form.component.spec.ts | 7 +- .../reporting-exporters-form.component.ts | 16 ++-- ...reporting-exporters-list.component.spec.ts | 13 ++- .../reporting-exporters-list.component.ts | 12 +-- src/assets/i18n/fr.json | 96 +++++++++---------- 8 files changed, 84 insertions(+), 70 deletions(-) diff --git a/src/app/interfaces/api/api-call-directory.interface.ts b/src/app/interfaces/api/api-call-directory.interface.ts index b536d92a127..378f7e124a0 100644 --- a/src/app/interfaces/api/api-call-directory.interface.ts +++ b/src/app/interfaces/api/api-call-directory.interface.ts @@ -199,7 +199,7 @@ import { ReplicationTask, } from 'app/interfaces/replication-task.interface'; import { - CreateReportingExporter, ReportingExporter, ReportingExporterSchema, UpdateReportingExporter, + ReportingExporter, ReportingExporterSchema, UpdateReportingExporter, } from 'app/interfaces/reporting-exporters.interface'; import { ReportingGraph } from 'app/interfaces/reporting-graph.interface'; import { @@ -695,7 +695,7 @@ export interface ApiCallDirectory { 'replication.update': { params: [id: number, update: Partial]; response: ReplicationTask }; // Reporting - 'reporting.exporters.create': { params: [CreateReportingExporter]; response: ReportingExporter }; + 'reporting.exporters.create': { params: [UpdateReportingExporter]; response: ReportingExporter }; 'reporting.exporters.delete': { params: [id: number]; response: boolean }; 'reporting.exporters.exporter_schemas': { params: void; response: ReportingExporterSchema[] }; 'reporting.exporters.query': { params: QueryParams; response: ReportingExporter[] }; diff --git a/src/app/interfaces/reporting-exporters.interface.ts b/src/app/interfaces/reporting-exporters.interface.ts index 2d0acff06ef..504917c6684 100644 --- a/src/app/interfaces/reporting-exporters.interface.ts +++ b/src/app/interfaces/reporting-exporters.interface.ts @@ -17,10 +17,8 @@ export interface ReportingExporterList { export interface ReportingExporter { name: string; id: number; - type: string; enabled: boolean; attributes: Record; } -export type CreateReportingExporter = Omit; -export type UpdateReportingExporter = Omit; +export type UpdateReportingExporter = Partial>; diff --git a/src/app/interfaces/schema.interface.ts b/src/app/interfaces/schema.interface.ts index 842ffe17c46..19a4fca0274 100644 --- a/src/app/interfaces/schema.interface.ts +++ b/src/app/interfaces/schema.interface.ts @@ -12,7 +12,7 @@ export interface OldSchema { type: SchemaType | SchemaType[]; _name_: string; _required_: boolean; - + const?: string; } export interface SchemaProperties { diff --git a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.spec.ts b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.spec.ts index 6994bab2afe..7871c4ac9b9 100644 --- a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.spec.ts +++ b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.spec.ts @@ -23,8 +23,8 @@ describe('ReportingExportersFormComponent', () => { const existingExporter: ReportingExporter = { name: 'test', id: 123, - type: ReportingExporterKey.Graphite, attributes: { + exporter_type: ReportingExporterKey.Graphite, access_key_id: 'access_key_id', secret_access_key: 'secret_access_key', }, @@ -94,11 +94,11 @@ describe('ReportingExportersFormComponent', () => { expect(spectator.inject(ApiService).call).toHaveBeenCalledWith('reporting.exporters.create', [{ name: 'exporter1', - type: ReportingExporterKey.Graphite, enabled: true, attributes: { access_key_id: 'abcde', secret_access_key: 'abcd', + exporter_type: ReportingExporterKey.Graphite, }, }]); expect(spectator.inject(SlideInRef).close).toHaveBeenCalled(); @@ -130,7 +130,7 @@ describe('ReportingExportersFormComponent', () => { expect(values).toEqual({ Name: existingExporter.name, - Type: existingExporter.type, + Type: existingExporter.attributes.exporter_type, Enable: existingExporter.enabled, 'Secret Access Key ID': existingExporter.attributes.secret_access_key, 'Access Key ID': existingExporter.attributes.access_key_id, @@ -163,6 +163,7 @@ describe('ReportingExportersFormComponent', () => { attributes: { secret_access_key: existingExporter.attributes.secret_access_key, access_key_id: 'efghi', + exporter_type: ReportingExporterKey.Graphite, }, }, ], diff --git a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.ts b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.ts index 9d044425eb7..bd30c3b310c 100644 --- a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.ts +++ b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.ts @@ -131,7 +131,10 @@ export class ReportingExportersFormComponent implements OnInit { this.createExporterControls(schemas); if (!this.isNew) { - this.form.patchValue(this.editingExporter); + this.form.patchValue({ + ...this.editingExporter, + type: this.editingExporter.attributes['exporter_type'] as string, + }); } this.isLoading = false; @@ -162,7 +165,7 @@ export class ReportingExportersFormComponent implements OnInit { for (const input of schema.schema) { this.form.controls.attributes.addControl( input._name_, - new FormControl('', input._required_ ? [Validators.required] : []), + new FormControl(input.const || '', input._required_ ? [Validators.required] : []), ); } } @@ -180,7 +183,9 @@ export class ReportingExportersFormComponent implements OnInit { } parseSchemaForDynamicSchema(schema: ReportingExporterSchema): DynamicFormSchemaNode[] { - return schema.schema.map((input) => getDynamicFormSchemaNode(input)); + return schema.schema + .filter((input) => !input.const) + .map((input) => getDynamicFormSchemaNode(input)); } parseSchemaForExporterList(schema: ReportingExporterSchema): ReportingExporterList { @@ -217,9 +222,8 @@ export class ReportingExportersFormComponent implements OnInit { ...this.form.value, }; - if (!this.isNew) { - delete values.type; - } + values.attributes['exporter_type'] = values.type; + delete values.type; for (const [key, value] of Object.entries(values.attributes)) { if (value == null || value === '') { diff --git a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.spec.ts b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.spec.ts index bc478c4578b..3b7299c51ea 100644 --- a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.spec.ts +++ b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.spec.ts @@ -1,6 +1,7 @@ import { HarnessLoader } from '@angular/cdk/testing'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { MatButtonHarness } from '@angular/material/button/testing'; +import { MatSlideToggleHarness } from '@angular/material/slide-toggle/testing'; import { Spectator, createComponentFactory, mockProvider } from '@ngneat/spectator/jest'; import { of } from 'rxjs'; import { mockCall, mockApi } from 'app/core/testing/utils/mock-api.utils'; @@ -23,10 +24,10 @@ const exporters: ReportingExporter[] = [ attributes: { secret: 'abcd', email: 'testemail', + exporter_type: ReportingExporterKey.Graphite, }, enabled: true, name: 'test', - type: ReportingExporterKey.Graphite, }, ]; @@ -98,6 +99,16 @@ describe('ReportingExportersListComponent', () => { expect(spectator.inject(ApiService).call).toHaveBeenCalledWith('reporting.exporters.delete', [1]); }); + it('updates a reporting exporter when Enabled checkbox is toggled', async () => { + const toggle = await table.getHarnessInCell(MatSlideToggleHarness, 1, 2); + await toggle.toggle(); + + expect(spectator.inject(ApiService).call).toHaveBeenCalledWith('reporting.exporters.update', [ + 1, + { enabled: false }, + ]); + }); + it('should show table rows', async () => { const expectedRows = [ ['Name', 'Type', 'Enabled', ''], diff --git a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.ts b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.ts index 86b4328beb1..1346943151e 100644 --- a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.ts +++ b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.ts @@ -80,7 +80,7 @@ export class ReportingExporterListComponent implements OnInit { }), textColumn({ title: this.translate.instant('Type'), - propertyName: 'type', + getValue: (row) => row.attributes['exporter_type'], }), toggleColumn({ title: this.translate.instant('Enabled'), @@ -93,13 +93,13 @@ export class ReportingExporterListComponent implements OnInit { { name: row.name, checked: checked ? 'Enabling' : 'Disabling' }, ), ); - const exporter = { ...row }; - delete exporter.type; - delete exporter.id; - this.api.call('reporting.exporters.update', [row.id, { ...exporter, enabled: checked }]).pipe( + this.api.call('reporting.exporters.update', [row.id, { enabled: checked }]).pipe( untilDestroyed(this), ).subscribe({ - complete: () => this.appLoader.close(), + complete: () => { + this.appLoader.close(); + this.getExporters(); + }, error: (error: unknown) => this.errorCaught(error), }); }, diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index bf72ea89fb9..bf9a5ea2e4e 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -97,7 +97,6 @@ "Certificate Subject": "", "Certificate Write": "", "Check": "", - "Choose a new virtual port": "Choisissez un nouveau port virtuel", "Clear": "", "Client ID": "", "Close Instance Form": "", @@ -273,10 +272,8 @@ "HTTP Proxy:": "", "HTTPS Port": "", "HTTPS Redirect": "", - "Hardware Change": "Changement de matériel", "Has Allow List": "", "Healthy": "", - "Hide Password": "Masquer le mot de passe", "Home Widgets": "", "Host Model": "", "Host Mounts": "", @@ -390,7 +387,6 @@ "Machine": "", "Macvlan NICs": "", "Main menu": "", - "Maintenance Window": "Maintenance programmée", "Manual Test": "", "Manual Upgrade": "", "Mapall Group": "", @@ -444,12 +440,7 @@ "Network Interface Read": "", "Network Interface Write": "", "Network Reconnection Issue": "", - "Network Reset": "Réinitialisation du réseau", - "Network Settings": "Paramètres réseau", - "Network Stats": "Stats réseau", - "Network Traffic": "Trafic réseau", "Network Usage": "", - "Network Utilization": "Utilisation du réseau", "New Backup Credential": "", "New Bucket Name": "", "New CSR": "", @@ -503,7 +494,6 @@ "Parent Interface": "", "Passive Controller": "", "Passthrough": "", - "Password Login": "Mot de passe de connexion", "Pattern": "", "Pause Scrub": "", "Pending": "", @@ -519,9 +509,6 @@ "Privilege": "", "Privileges": "", "Processor": "", - "Product": "Produit", - "Product ID": "ID produit", - "Promote": "Promouvoir", "Prompt": "", "Properties Exclude": "", "Properties Override": "", @@ -540,15 +527,9 @@ "RAM": "", "Range Size": "", "Raw Filesize": "", - "Re-Open": "Réouvrir", - "Re-Open All Alerts": "Réouvrir toutes les alertes", "Read Only": "", "Readonly Admin": "", "Rear": "", - "Reason": "Raison", - "Reboot Local": "Redémarrage local", - "Reboot Remote": "Redémarrage à distance", - "Reboot Required": "Redémarrage requis", "Release": "", "Remove extent association": "", "Replication Admin": "", @@ -577,7 +558,6 @@ "Routing": "", "Rsync": "", "Run As Context": "", - "Running Jobs": "Tâches en cours", "S.M.A.R.T.": "", "SAS Connector": "", "SAS Expander": "", @@ -705,7 +685,6 @@ "Snapshot Time": "", "Snapshot Time {time}": "", "Snapshot Write": "", - "Software Installation": "Installation logiciel", "Sort": "", "Source Path": "", "Spares": "", @@ -731,10 +710,7 @@ "Support License": "", "Support Read": "", "Support Write": "", - "Switch To Advanced": "Basculer vers les optiond avancées", - "Switch To Wizard": "Basculer vers l'assistant", "Synced": "", - "Syslog Settings": "Paramètres Syslog", "Syslog TLS Certificate": "", "Syslog TLS Certificate Authority": "", "System Advanced Read": "", @@ -743,25 +719,13 @@ "System Audit Write": "", "System Data Pool": "", "System Dataset": "", - "System Freeze": "Freeze du système", "System General Read": "", "System General Write": "", - "System Image": "Image système", "System Information – Active": "", "System Information – Standby": "", - "System Overload": "Surcharge du système", - "System Reports": "Rapports système", - "System Security Settings": "Paramètres de sécurité du système", "System Serial": "", - "System Stats": "Stats du système", - "System Update": "Mise à jour du système", - "System Uptime": "Durée de fonctionnement du système", - "System Utilization": "Utilisation du système", - "System Version": "Version du Système", - "TLS No Empty Fragments": "TLS Aucun fragment vide", "TLS Policy": "", "Table Actions of Expandable Table": "", - "Task": "Tâche", "Tenant Domain": "", "Terminal": "", "Test": "", @@ -771,8 +735,6 @@ "Timestamp": "", "Toggle Sidenav": "", "Tolerance Window": "", - "Toolbar": "Barre d'outils", - "Tools": "Outils", "Top": "", "Top bar": "", "Total": "", @@ -782,7 +744,6 @@ "Translate App": "", "Transmit Hash Policy": "", "Transport Encryption Behavior": "", - "Troubleshooting Issues": "Résolution des problèmes", "TrueCommand Read": "", "TrueCommand Write": "", "Tunable": "", @@ -790,14 +751,9 @@ "UNIX Charset": "", "URL": "", "Unix NSS Info": "", - "Unix Primary Group": "Groupe primaire Unix", - "Unix Socket": "Socket Unix", "Unlink": "", - "Updating pool settings": "Mise à jour des paramètres du volume", "Usage Collection": "", "Usages": "", - "Use an existing port": "Utiliser un port existant", - "Use current port": "Utiliser le port actuel", "User API Keys": "", "User Bind Path": "", "User CN": "", @@ -819,8 +775,6 @@ "VMWare Sync": "", "VMware Snapshot": "", "Validate Certificates": "", - "Validate Remote Path": "Valider le chemin d'accès distant", - "Validate effective ACL": "Valider l'ACL effective", "Variant": "", "Vdevs spans enclosure": "", "Vendor ID": "", @@ -838,7 +792,6 @@ "Voltage": "", "WWPN": "", "WWPN (B)": "", - "Warning: iSCSI Target is currently in use.
": "Avertissement : la cible iSCSI est en cours d'utilisation.
.", "Watch List": "", "Weak Ciphers": "", "WebDAV": "", @@ -1624,6 +1577,7 @@ "Choose a date format.": "Choisissez un format de date.", "Choose a location to store the installer image file.": "Choisissez un emplacement pour stocker le fichier image du programme d'installation.", "Choose a new disk for the pool. To protect any existing data, adding the selected disk is stopped when the disk is already in use or has partitions present.": "Choisissez un nouveau disque pour la volume. Pour protéger les données existantes, l'ajout du disque sélectionné est arrêté lorsque le disque est déjà utilisé ou qu'il y a des partitions présentes.", + "Choose a new virtual port": "Choisissez un nouveau port virtuel", "Choose a path to the user's home directory. If the directory exists and matches the username, it is set as the user's home directory. When the path does not end with a subdirectory matching the username, a new subdirectory is created only if the 'Create Home Directory' field is marked checked. The full path to the user's home directory is shown here when editing a user.": "Choisissez un chemin vers le répertoire personnel de l'utilisateur. Si le répertoire existe et correspond au nom d'utilisateur, il est défini comme répertoire personnel de l'utilisateur. Lorsque le chemin ne se termine pas par un sous-répertoire correspondant au nom d'utilisateur, un nouveau sous-répertoire est créé uniquement si le champ 'Créer un répertoire personnel' est coché. Le chemin complet vers le répertoire personnel de l'utilisateur est affiché ici lors de l'édition d'un utilisateur.", "Choose a pool for Apps": "Choisissez un volume pour les applications", "Choose a pool to scrub.": "Choisissez un volume à nettoyer.", @@ -2738,6 +2692,7 @@ "HTTP host URL.": "URL de l'hôte HTTP.", "HTTPS Protocols": "Protocoles HTTPS", "Hardware": "Matériel", + "Hardware Change": "Changement de matériel", "Hardware Disk Encryption": "Chiffrement matériel du disque", "Help": "Aide", "Hidden": "Caché", @@ -2745,6 +2700,7 @@ "Hide": "Cacher", "Hide Extra Columns": "Cacher les colonnes supplémentaires", "Hide Job": "Cacher la tâche", + "Hide Password": "Masquer le mot de passe", "Hide Standard Error": "Masquer l'erreur standard", "Hide Standard Output": "Masquer la sortie standard", "Hide Stderr": "Masquer Stderr", @@ -3133,6 +3089,7 @@ "Mac Address": "Adresse Mac", "Machine Time: {machineTime} \n Browser Time: {browserTime}": "Machine Time: {machineTime} \n Heure du navigateur : {browserTime}", "Mail Server Port": "Port du serveur de messagerie", + "Maintenance Window": "Maintenance programmée", "Major": "Majeure", "Make Destination Dataset Read-only?": "Rendre le dataset de destination en lecture seule ?", "Make the currently active TrueNAS controller the default when both TrueNAS controllers are online and HA is enabled. To change the default TrueNAS controller, unset this option on the default TrueNAS controller and allow the system to fail over. This briefly interrupts system services.": "Faire du contrôleur TrueNAS actuellement actif le contrôleur par défaut lorsque les deux contrôleurs TrueNAS sont en ligne et que HA est activé. Pour changer le contrôleur TrueNAS par défaut, désactivez cette option sur le contrôleur TrueNAS par défaut et permettez au système de basculer. Cela interrompt brièvement les services du système.", @@ -3310,7 +3267,12 @@ "Network Configuration": "Configuration réseau", "Network Interface": "Interface réseau", "Network Reports": "Rapports réseau", + "Network Reset": "Réinitialisation du réseau", + "Network Settings": "Paramètres réseau", + "Network Stats": "Stats réseau", "Network Timeout Before Initiating Failover": "Délai d'attente réseau avant d'initier le basculement", + "Network Traffic": "Trafic réseau", + "Network Utilization": "Utilisation du réseau", "Network addresses allowed to use this initiator. Leave blank to allow all networks or list network addresses with a CIDR mask. Separate entries by pressing Enter.": "Les adresses de réseau sont autorisées à utiliser cet initiateur. Laissez vide pour autoriser tous les réseaux ou pour énumérer les adresses de réseau avec un masque CIDR. Séparez les entrées en appuyant sur la touche Entrée.", "Network addresses allowed use this initiator. Each address can include an optional CIDR netmask. Click + to add the network address to the list. Example: 192.168.2.0/24.": "Les adresses réseau autorisées utilisent cet initiateur. Chaque adresse peut inclure un masque de réseau CIDR en option. Cliquez sur + pour ajouter l'adresse réseau à la liste. Exemple : 192.168.2.0.0/24.", "Network changes applied successfully.": "Les modifications apportées au réseau ont été appliquées avec succès.", @@ -3560,6 +3522,7 @@ "Passphrase value must match Confirm Passphrase": "La valeur de la passphrase doit correspondre à : Confirmer la passphrase", "Password": "Mot de passe", "Password Disabled": "Mot de passe désactivé", + "Password Login": "Mot de passe de connexion", "Password Login Groups": "Groupes de connexion par mot de passe", "Password Server": "Serveur de mots de passe", "Password Servers": "Serveurs de mots de passe", @@ -3701,10 +3664,13 @@ "Proactive support settings is not available.": "Les paramètres de support proactif ne sont pas disponibles.", "Proceed": "Procéder", "Proceed with upgrading the pool? WARNING: Upgrading a pool is a one-way operation that might make some features of the pool incompatible with older versions of TrueNAS: ": "Procéder à la mise à niveau du volume ? AVERTISSEMENT : La mise à niveau d'un volume est une opération à sens unique qui pourrait rendre certaines fonctionnalités du volume incompatibles avec les anciennes versions de TrueNAS: ", + "Product": "Produit", + "Product ID": "ID produit", "Production": "Production", "Production status successfully updated": "Statut de production mis à jour avec succès", "Profile": "Profil", "Prohibits writes to this share.": "Interdit les écritures sur ce partage.", + "Promote": "Promouvoir", "Prototyping": "Prototypage", "Provide helpful notations related to the share, e.g. ‘Shared to everybody’. Maximum length is 120 characters.": "Fournissez des notations utiles liées au partage, par ex. « Partagé avec tout le monde ». La longueur maximale est de 120 caractères.", "Provide keys/passphrases manually": "Fournir manuellement les clés/phrases de passe", @@ -3744,6 +3710,8 @@ "Range Low and Range High set the range of UID/GID numbers which this IDMap backend translates. If an external credential like a Windows SID maps to a UID or GID number outside this range, the external credential is ignored.": "Range Low et Range High définissent la plage de numéros UID/GID que ce backend IDMap traduit. Si un identifiant externe tel qu'un SID Windows correspond à un numéro UID ou GID en dehors de cette plage, l'identifiant externe est ignoré.", "Rate this page": "Évaluer cette page", "Raw File": "Fichier brut", + "Re-Open": "Réouvrir", + "Re-Open All Alerts": "Réouvrir toutes les alertes", "Read": "Lire", "Read ACL": "Lire ACL", "Read Attributes": "Lire les attributs", @@ -3752,7 +3720,11 @@ "Read Named Attributes": "Lire les attributs nommés", "Read-only": "Lecture seule", "Realm": "Domaine", + "Reason": "Raison", "Reboot": "Redémarrer", + "Reboot Local": "Redémarrage local", + "Reboot Remote": "Redémarrage à distance", + "Reboot Required": "Redémarrage requis", "Reboot of the other node is required for FIPS changes.": "Le redémarrage de l'autre nœud est requis pour les modifications FIPS.", "Reboot of this node is required for FIPS changes.": "Le redémarrage de ce nœud est requis pour les modifications FIPS.", "Rebuild Directory Service Cache": "Reconstruction du cache du service d'annuaire", @@ -3959,6 +3931,7 @@ "Run «{name}» Cloud Sync now?": "Exécuter cette synchronisation cloud maintenant ?", "Run «{name}» Rsync now?": "Exécuter «{name}» Rsync maintenant?", "Running": "Actif", + "Running Jobs": "Tâches en cours", "S.M.A.R.T. Extra Options": "Options supplémentaires S.M.A.R.T.", "S.M.A.R.T. Info for {disk}": "Informations S.M.A.R.T. pour {disk}", "S.M.A.R.T. Options": "Options S.M.A.R.T", @@ -4396,6 +4369,7 @@ "Snapshots could not be loaded": "Les instantanés ne peuvent pas être chargés", "Snapshots must not have dependent clones": "Les instantanés ne doivent pas avoir de clones dépendants", "Snapshots will be created automatically.": "Les instantanés seront créés automatiquement.", + "Software Installation": "Installation logiciel", "Some of the disks are attached to the exported pools\n mentioned in this list. Checking a pool name means you want to\n allow reallocation of the disks attached to that pool.": "Certains des disques sont attachés aux volumes exportés\n mentionnés dans cette liste. Cocher un nom de volume signifie que vous souhaitez\n autoriser la réallocation des disques attachés à ce volume.", "Some of the selected disks have exported pools on them. Using those disks will make existing pools on them unable to be imported. You will lose any and all data in selected disks.": "Certains des disques sélectionnés contiennent des volumes exportés. L'utilisation de ces disques empêchera l'importation des volumes existants sur ces disques. Vous perdrez toutes les données des disques sélectionnés.", "Source": "Source", @@ -4503,7 +4477,9 @@ "Sun": "Dim", "Sunday": "Dimanche", "Support": "Support", + "Switch To Advanced": "Basculer vers les optiond avancées", "Switch To Basic": "Basculé sur Basique", + "Switch To Wizard": "Basculer vers l'assistant", "Switch Train": "Changer de canal", "Switch to Advanced Options": "Basculer sur Options avancées", "Switch update trains?": "Changer de canal de mise à jour ?", @@ -4524,14 +4500,25 @@ "Syslog": "Syslog", "Syslog Level": "Niveau Syslog", "Syslog Server": "Serveur syslog", + "Syslog Settings": "Paramètres Syslog", "Syslog Transport": "Transport Syslog", "System": "Système", "System Clock": "Horloge système", "System Dataset Pool": "Volume du dataset système", + "System Freeze": "Freeze du système", + "System Image": "Image système", "System Information": "Informations système", + "System Overload": "Surcharge du système", + "System Reports": "Rapports système", "System Security": "Sécurité du système", + "System Security Settings": "Paramètres de sécurité du système", "System Security Settings Updated.": "Paramètres de sécurité du système mis à jour.", + "System Stats": "Stats du système", "System Time Zone:": "Fuseau horaire du système :", + "System Update": "Mise à jour du système", + "System Uptime": "Durée de fonctionnement du système", + "System Utilization": "Utilisation du système", + "System Version": "Version du Système", "System dataset updated.": "Le dataset système a été mis à jour.", "System domain name, like example.com": "Nom de domaine système, comme exemple.com", "System hostname.": "Nom d'hôte du système.", @@ -4550,6 +4537,7 @@ "TLS Export Certificate Data": "TLS - Données du certificat d'exportation", "TLS Export Standard Vars": "TLS - Variables standard d'exportation", "TLS IP Address Required": "TLS - Aucun fragment vide", + "TLS No Empty Fragments": "TLS Aucun fragment vide", "TLS No Session Reuse Required": "TLS - Aucune réutilisation de session requise", "Tag": "Étiquette", "Tags": "Tags", @@ -4565,6 +4553,7 @@ "Target dataset encryption will be inherited from its parent dataset.": "Le chiffrement du dataset cible sera hérité de son dataset parent.", "Target with this name already exists": "La cible portant ce nom existe déjà", "Targets": "Cibles", + "Task": "Tâche", "Task Details for {task}": "Détails de la tâche pour {task}", "Task Name": "Nom de la tâche", "Task Settings": "Paramètres des tâches", @@ -4793,6 +4782,8 @@ "Token created with Google Drive.": "Jeton créé avec Google Drive.", "Token created with Google Drive. Access Tokens expire periodically and must be refreshed.": "Token créé avec Google Drive. Les jetons d'accès expirent périodiquement et doivent être actualisés.", "Token expired": "Le jeton a expiré", + "Toolbar": "Barre d'outils", + "Tools": "Outils", "Top level of the LDAP directory tree to be used when searching for resources. Example: dc=test,dc=org.": "Niveau supérieur de l'arborescence LDAP à utiliser lors de la recherche de ressources. Exemple : dc=test,dc=org.", "Topic Amazon Resource Name (ARN) for publishing. Example: arn:aws:sns:us-west-2:111122223333:MyTopic.": "Sujet Amazon Resource Name (ARN) pour la publication. Exemple : arn:aws:aws:sns:us-west-2:11112122223333:MyTopic.", "Topology": "Topologie", @@ -4814,6 +4805,7 @@ "Transport Options": "Options de transport", "Traverse": "Traverser", "Treat Disk Size as Minimum": "Considérer la taille du disque comme minimum", + "Troubleshooting Issues": "Résolution des problèmes", "TrueCloud Backup Tasks": "Tâches de sauvegarde TrueCloud", "TrueCommand": "TrueCommand", "TrueCommand Cloud Service": "Service Cloud TrueCommand", @@ -4878,6 +4870,8 @@ "Unit": "Unité", "Unix Permissions": "Permissions Unix", "Unix Permissions Editor": "Éditeur de permissions Unix", + "Unix Primary Group": "Groupe primaire Unix", + "Unix Socket": "Socket Unix", "Unkeep": "Enlever", "Unknown": "Inconnu", "Unknown CPU": "CPU inconnu", @@ -4936,6 +4930,7 @@ "Updating Instance": "Mise à jour de l'instance", "Updating custom app": "Mise à jour de l'app personnalisée", "Updating key type": "Mise à jour du type de clé", + "Updating pool settings": "Mise à jour des paramètres du volume", "Updating settings": "Mise à jour des paramètres", "Upgrade": "Mise à niveau ", "Upgrade All Selected": "Mettre à jour tous les éléments sélectionnés", @@ -4977,9 +4972,11 @@ "Use Sudo For ZFS Commands": "Utiliser Sudo pour les commandes ZFS", "Use Syslog Only": "Utiliser uniquement Syslog", "Use all disk space": "Utiliser tout l'espace disque", + "Use an existing port": "Utiliser un port existant", "Use an exported encryption key file to unlock datasets.": "Utilisez un fichier de clé de chiffrement exporté pour déverrouiller les datasets.", "Use as Home Share": "Utiliser comme partage d'accueil (home)", "Use compressed WRITE records to make the stream more efficient. The destination system must also support compressed WRITE records. See zfs(8).": "Utilisez des enregistrements WRITE compressés pour rendre le flux plus efficace. Le système de destination doit également prendre en charge les enregistrements WRITE compressés. Voir zfs(8).", + "Use current port": "Utiliser le port actuel", "Use default network settings": "Utiliser les paramètres réseau par défaut", "Use existing disk image": "Utiliser l'image disque existante", "Use settings from a saved replication.": "Utilisez les paramètres d'une réplication enregistrée.", @@ -5053,6 +5050,8 @@ "VMware Sync": "VMWare Sync", "VMware: Extent block size 512b, TPC enabled, no Xen compat mode, SSD speed": "VMware : taille de bloc étendue 512b, TPC activé, pas de mode de compatibilité Xen, vitesse SSD", "Validate Connection": "Valider la connexion", + "Validate Remote Path": "Valider le chemin d'accès distant", + "Validate effective ACL": "Valider l'ACL effective", "Value": "Valeur", "Value must be a number": "La valeur doit être un nombre", "Value must be a valid email address": "La valeur doit être une adresse email valide", @@ -5119,6 +5118,7 @@ "Warning": "Attention", "Warning!": "Attention !", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "Avertissement : les debugs peuvent contenir des fichiers journaux contenant des informations personnelles telles que des noms d'utilisateur ou d'autres informations d'identification sur votre système. Veuillez examiner les debugs et rédiger toute information sensible avant de la partager avec des entités externes.", + "Warning: iSCSI Target is currently in use.
": "Avertissement : la cible iSCSI est en cours d'utilisation.
.", "Warning: {n} of {total} boot environments could not be deleted.": "Avertissement: {n} sur {total} environments de boot n'ont pas pu être supprimés.", "Warning: {n} of {total} docker images could not be deleted.": "Avertissement: {n} sur {total} images docker n'ont pas pu être supprimées.", "Warning: {n} of {total} snapshots could not be deleted.": "Avertissement: {n} sur {total} instantanés n'ont pas pu être supprimés.", @@ -5318,4 +5318,4 @@ "{used} of {total} ({used_pct})": "{used} de {total} ({used_pct})", "{version} is available!": "{version} est disponible !", "{view} on {enclosure}": "{view} sur {enclosure}" -} +} \ No newline at end of file From 474b93c39dab57ab09851e572f6b3284876941fa Mon Sep 17 00:00:00 2001 From: RehanY147 Date: Tue, 7 Jan 2025 12:08:20 +0500 Subject: [PATCH 18/32] NAS-133118: Add tests (#11288) --- .../ix-forms/services/ix-form.service.spec.ts | 122 ++++++++++-------- .../ix-forms/services/ix-form.service.ts | 8 +- 2 files changed, 71 insertions(+), 59 deletions(-) diff --git a/src/app/modules/forms/ix-forms/services/ix-form.service.spec.ts b/src/app/modules/forms/ix-forms/services/ix-form.service.spec.ts index f1cf85bdf7e..bd78c0e4e4d 100644 --- a/src/app/modules/forms/ix-forms/services/ix-form.service.spec.ts +++ b/src/app/modules/forms/ix-forms/services/ix-form.service.spec.ts @@ -1,78 +1,90 @@ -import { NgControl } from '@angular/forms'; +import { ElementRef } from '@angular/core'; +import { FormControl, NgControl } from '@angular/forms'; import { SpectatorService, createServiceFactory } from '@ngneat/spectator/jest'; +import { TestScheduler } from 'rxjs/testing'; +import { getTestScheduler } from 'app/core/testing/utils/get-test-scheduler.utils'; +import { IxFormSectionComponent } from 'app/modules/forms/ix-forms/components/ix-form-section/ix-form-section.component'; +import { ixControlLabelTag } from 'app/modules/forms/ix-forms/directives/registered-control.directive'; import { IxFormService } from 'app/modules/forms/ix-forms/services/ix-form.service'; -// TODO: https://ixsystems.atlassian.net/browse/NAS-133118 -describe.skip('IxFormService', () => { +class MockNgControl extends NgControl { + override control = new FormControl('mock-value'); + + override viewToModelUpdate(newValue: string): void { + this.control.setValue(newValue); + } +} + +describe('IxFormService', () => { let spectator: SpectatorService; + let testScheduler: TestScheduler; const createService = createServiceFactory({ service: IxFormService, }); - const fakeComponents = [ - { - control: { - name: 'test_control_1', - }, - element: { - nativeElement: { - id: 'test_element_1', - }, - getAttribute: () => 'Test Element 1', - }, - }, - { - control: { - name: 'test_control_2', - }, - element: { - nativeElement: { - id: 'test_element_2', - }, - getAttribute: () => 'Test Element 2', - }, - }, - ] as { - control: NgControl; - element: { nativeElement: HTMLElement; getAttribute: () => string }; - }[]; - beforeEach(() => { spectator = createService(); - fakeComponents.forEach((component) => { - spectator.service.registerControl(component.control.name!.toString(), component.element); - }); + testScheduler = getTestScheduler(); }); - describe('getControlsNames', () => { - it('returns a list of control names', () => { - expect(spectator.service.getControlNames()).toEqual([ - 'test_control_1', - 'test_control_2', - ]); + describe('handles control register/unregister', () => { + it('registers control', () => { + const elRef = new ElementRef(document.createElement('input')); + elRef.nativeElement.setAttribute('id', 'control1'); + elRef.nativeElement.setAttribute(ixControlLabelTag, 'Control1'); + spectator.service.registerControl( + 'control1', + elRef, + ); + + expect(spectator.service.getControlNames()).toEqual(['control1']); + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.controlNamesWithLabels$).toBe('a', { + a: [{ label: 'Control1', name: 'control1' }], + }); + }); + expect(spectator.service.getElementByControlName('control1')).toEqual(elRef.nativeElement); + expect(spectator.service.getElementByLabel('Control1')).toEqual(elRef.nativeElement); }); - }); - describe('getControls', () => { - it('returns a list of controls', () => { - expect(spectator.service.getControlNames()).toEqual([ - 'test_control_1', - 'test_control_2', - ]); + it('unregisters control', () => { + const elRef = new ElementRef(document.createElement('input')); + elRef.nativeElement.setAttribute('id', 'control1'); + elRef.nativeElement.setAttribute(ixControlLabelTag, 'Control1'); + spectator.service.registerControl( + 'control1', + elRef, + ); + + expect(spectator.service.getControlNames()).toEqual(['control1']); + spectator.service.unregisterControl('control1'); + expect(spectator.service.getControlNames()).toEqual([]); }); }); - describe('getControlByName', () => { - it('returns control by name', () => { - expect(spectator.service.getControlNames()).toEqual(['test_control_2']); + it('registers section control', () => { + const ngControl = new MockNgControl(); + const formSection = { + label(): string { return 'Form Section'; }, + } as IxFormSectionComponent; + spectator.service.registerSectionControl( + ngControl, + formSection, + ); + + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.controlSections$).toBe('a', { + a: [ + { section: formSection, controls: [ngControl] }, + ], + }); }); - }); - describe('getElementByControlName', () => { - it('returns element by control name', () => { - expect(spectator.service.getElementByControlName('test_control_2')).toEqual({ - id: 'test_element_2', + spectator.service.unregisterSectionControl(formSection, ngControl); + testScheduler.run(({ expectObservable }) => { + expectObservable(spectator.service.controlSections$).toBe('a', { + a: [], }); }); }); diff --git a/src/app/modules/forms/ix-forms/services/ix-form.service.ts b/src/app/modules/forms/ix-forms/services/ix-form.service.ts index 7ad6aa8a009..a2978b3270e 100644 --- a/src/app/modules/forms/ix-forms/services/ix-form.service.ts +++ b/src/app/modules/forms/ix-forms/services/ix-form.service.ts @@ -7,13 +7,13 @@ import { ixControlLabelTag } from 'app/modules/forms/ix-forms/directives/registe @Injectable({ providedIn: 'root' }) export class IxFormService { - private controls = new Map(); - private sections = new Map(); + private readonly controls = new Map(); + private readonly sections = new Map(); private readonly controlNamesWithlabels = new BehaviorSubject([]); private readonly controlSections = new BehaviorSubject([]); - controlNamesWithLabels$: Observable = this.controlNamesWithlabels.asObservable(); - controlSections$: Observable = this.controlSections.asObservable(); + readonly controlNamesWithLabels$: Observable = this.controlNamesWithlabels.asObservable(); + readonly controlSections$: Observable = this.controlSections.asObservable(); getControlNames(): (string | number | null)[] { return [...this.controls.keys()]; From 4d628d65d23a67e75f98309cd3943fc53eba5aca Mon Sep 17 00:00:00 2001 From: Alex Karpov Date: Tue, 7 Jan 2025 12:23:36 +0200 Subject: [PATCH 19/32] NAS-133371 / 25.04 / Cleanup OldSlideInService (#11297) * NAS-133300: Migrate more instances of OldSlideInService * NAS-133300: NAS-133317: Migrate more instances of OldSlideInService #2 * NAS-133319: Migrate more instances of OldSlideInService #3 * NAS-133319: PR update * NAS-133319: Skip * NAS-133325: Migrate more instances of OldSlideInService #4 * NAS-133325: PR Update * NAS-133371: Cleanup OldSlideInService * NAS-133371: PR update --- .../admin-layout/admin-layout.component.html | 1 - .../admin-layout/admin-layout.component.ts | 2 - .../modal-header/modal-header.component.scss | 12 -- .../old-modal-header.component.html | 24 --- .../old-modal-header.component.scss | 41 ----- .../old-modal-header.component.ts | 46 ------ src/app/modules/slide-ins/old-slide-in-ref.ts | 20 --- .../slide-ins/old-slide-in.component.html | 17 --- .../slide-ins/old-slide-in.component.scss | 79 ---------- .../slide-ins/old-slide-in.component.spec.ts | 68 --------- .../slide-ins/old-slide-in.component.ts | 140 ------------------ src/app/modules/slide-ins/slide-in.token.ts | 4 - src/app/modules/slide-ins/slide-in.ts | 2 +- .../cloud-credentials-card.component.spec.ts | 2 - .../ssh-connection-card.component.spec.ts | 2 - .../widget-group-form.component.spec.ts | 6 +- .../cloud-backup-card.component.spec.ts | 2 - .../cloud-backup-list.component.spec.ts | 2 - .../cloudsync-list.component.spec.ts | 9 +- .../cloudsync-task-card.component.spec.ts | 9 +- .../cloudsync-provider.component.spec.ts | 2 - .../cloudsync-what-and-when.component.spec.ts | 6 +- .../transport-section.component.spec.ts | 4 - .../replication-list.component.spec.ts | 2 - .../replication-task-card.component.spec.ts | 2 - .../rsync-task-card.component.spec.ts | 2 - .../resilver-config.component.spec.ts | 2 - .../interface-form.component.spec.ts | 6 +- .../initiator-list.component.spec.ts | 6 - src/app/services/old-slide-in.service.spec.ts | 130 ---------------- src/app/services/old-slide-in.service.ts | 113 -------------- src/assets/icons/sprite-config.json | 2 +- src/assets/icons/sprite.svg | 2 +- src/setup-jest.ts | 4 - tsconfig.strictNullChecks.json | 1 - 35 files changed, 19 insertions(+), 753 deletions(-) delete mode 100644 src/app/modules/slide-ins/components/old-modal-header/old-modal-header.component.html delete mode 100644 src/app/modules/slide-ins/components/old-modal-header/old-modal-header.component.scss delete mode 100644 src/app/modules/slide-ins/components/old-modal-header/old-modal-header.component.ts delete mode 100644 src/app/modules/slide-ins/old-slide-in-ref.ts delete mode 100644 src/app/modules/slide-ins/old-slide-in.component.html delete mode 100644 src/app/modules/slide-ins/old-slide-in.component.scss delete mode 100644 src/app/modules/slide-ins/old-slide-in.component.spec.ts delete mode 100644 src/app/modules/slide-ins/old-slide-in.component.ts delete mode 100644 src/app/modules/slide-ins/slide-in.token.ts delete mode 100644 src/app/services/old-slide-in.service.spec.ts delete mode 100644 src/app/services/old-slide-in.service.ts diff --git a/src/app/modules/layout/admin-layout/admin-layout.component.html b/src/app/modules/layout/admin-layout/admin-layout.component.html index 406661ac52d..c8b80e309f6 100644 --- a/src/app/modules/layout/admin-layout/admin-layout.component.html +++ b/src/app/modules/layout/admin-layout/admin-layout.component.html @@ -102,5 +102,4 @@ - diff --git a/src/app/modules/layout/admin-layout/admin-layout.component.ts b/src/app/modules/layout/admin-layout/admin-layout.component.ts index 3f3148237af..ae91b101d34 100644 --- a/src/app/modules/layout/admin-layout/admin-layout.component.ts +++ b/src/app/modules/layout/admin-layout/admin-layout.component.ts @@ -34,7 +34,6 @@ import { SidenavService } from 'app/modules/layout/sidenav.service'; import { TopbarComponent } from 'app/modules/layout/topbar/topbar.component'; import { DefaultPageHeaderComponent } from 'app/modules/page-header/default-page-header/default-page-header.component'; import { SlideInControllerComponent } from 'app/modules/slide-ins/components/slide-in-controller/slide-in-controller.component'; -import { OldSlideInComponent } from 'app/modules/slide-ins/old-slide-in.component'; import { TestDirective } from 'app/modules/test-id/test.directive'; import { ThemeService } from 'app/modules/theme/theme.service'; import { SentryService } from 'app/services/sentry.service'; @@ -66,7 +65,6 @@ import { selectCopyrightText, selectIsEnterprise, waitForSystemInfo } from 'app/ ConsoleFooterComponent, AlertsPanelComponent, SlideInControllerComponent, - OldSlideInComponent, AsyncPipe, TranslateModule, TestDirective, diff --git a/src/app/modules/slide-ins/components/modal-header/modal-header.component.scss b/src/app/modules/slide-ins/components/modal-header/modal-header.component.scss index 96e87082e25..054402ace1a 100644 --- a/src/app/modules/slide-ins/components/modal-header/modal-header.component.scss +++ b/src/app/modules/slide-ins/components/modal-header/modal-header.component.scss @@ -25,18 +25,6 @@ .ix-form-title { color: var(--fg1); word-break: break-all; - - // TODO: Remove this when we finish with Slide In Migration - &::after { - background-color: var(--primary); - border-radius: 50%; - content: ''; - display: inline-block; - height: 6px; - margin-left: 6px; - vertical-align: middle; - width: 6px; - } } #ix-close-icon { diff --git a/src/app/modules/slide-ins/components/old-modal-header/old-modal-header.component.html b/src/app/modules/slide-ins/components/old-modal-header/old-modal-header.component.html deleted file mode 100644 index 62be07d2edd..00000000000 --- a/src/app/modules/slide-ins/components/old-modal-header/old-modal-header.component.html +++ /dev/null @@ -1,24 +0,0 @@ -
-

- {{ title() | translate }} - @if (requiredRoles().length && !(hasRequiredRoles() | async)) { - - } -

- - @if (!disableClose()) { - - } -
- -@if (loading()) { - -} diff --git a/src/app/modules/slide-ins/components/old-modal-header/old-modal-header.component.scss b/src/app/modules/slide-ins/components/old-modal-header/old-modal-header.component.scss deleted file mode 100644 index 036b7b239bd..00000000000 --- a/src/app/modules/slide-ins/components/old-modal-header/old-modal-header.component.scss +++ /dev/null @@ -1,41 +0,0 @@ -:host { - display: block; - position: sticky; - top: 0; - width: 100%; - z-index: 20000; -} - -.ix-slidein-title-bar { - align-items: center; - background-color: var(--bg2); - border-bottom: 2px solid var(--lines); - display: flex; - height: 75px; - margin: 0 -20px; - padding: 0 30px; - place-content: center space-between; -} - -.ix-formtitle { - color: var(--fg1); - word-break: break-all; -} - -#ix-close-icon { - color: var(--fg1); - cursor: pointer; - - &:focus { - border-radius: 50%; - outline: 1.5px solid var(--primary); - } -} - -mat-progress-bar { - bottom: 0; - left: -20px; - position: absolute; - width: calc(100% + 40px); - z-index: 10005; -} diff --git a/src/app/modules/slide-ins/components/old-modal-header/old-modal-header.component.ts b/src/app/modules/slide-ins/components/old-modal-header/old-modal-header.component.ts deleted file mode 100644 index bebef78edee..00000000000 --- a/src/app/modules/slide-ins/components/old-modal-header/old-modal-header.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { AsyncPipe } from '@angular/common'; -import { - ChangeDetectionStrategy, Component, computed, input, -} from '@angular/core'; -import { MatProgressBar } from '@angular/material/progress-bar'; -import { TranslateModule } from '@ngx-translate/core'; -import { Role } from 'app/enums/role.enum'; -import { AuthService } from 'app/modules/auth/auth.service'; -import { ReadOnlyComponent } from 'app/modules/forms/ix-forms/components/readonly-badge/readonly-badge.component'; -import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; - -/** - * @deprecated Use SlideIn and ix-modal-header. - */ -@Component({ - selector: 'ix-old-modal-header', - templateUrl: './old-modal-header.component.html', - styleUrls: ['./old-modal-header.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, - imports: [ - ReadOnlyComponent, - IxIconComponent, - MatProgressBar, - AsyncPipe, - TranslateModule, - ], -}) -export class OldModalHeaderComponent { - readonly title = input(); - readonly loading = input(); - readonly disableClose = input(false); - readonly requiredRoles = input([]); - - readonly hasRequiredRoles = computed(() => this.authService.hasRole(this.requiredRoles())); - - constructor( - private slideInRef: OldSlideInRef, - private authService: AuthService, - ) {} - - close(): void { - this.slideInRef.close(); - } -} diff --git a/src/app/modules/slide-ins/old-slide-in-ref.ts b/src/app/modules/slide-ins/old-slide-in-ref.ts deleted file mode 100644 index 8c9d0131249..00000000000 --- a/src/app/modules/slide-ins/old-slide-in-ref.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { ComponentRef } from '@angular/core'; -import { Subject } from 'rxjs'; - -/** - * @deprecated Use `SlideIn` and `SlideInRef` instead. - */ -export class OldSlideInRef { - readonly slideInClosed$ = new Subject(); - componentRef: ComponentRef; - id: string; - - get componentInstance(): T { - return this.componentRef.instance; - } - - close(response?: D): void { - this.slideInClosed$.next(response); - this.slideInClosed$.complete(); - } -} diff --git a/src/app/modules/slide-ins/old-slide-in.component.html b/src/app/modules/slide-ins/old-slide-in.component.html deleted file mode 100644 index 8b3993a4af4..00000000000 --- a/src/app/modules/slide-ins/old-slide-in.component.html +++ /dev/null @@ -1,17 +0,0 @@ -
-
- -
-
- -
diff --git a/src/app/modules/slide-ins/old-slide-in.component.scss b/src/app/modules/slide-ins/old-slide-in.component.scss deleted file mode 100644 index 672b3c8c8e7..00000000000 --- a/src/app/modules/slide-ins/old-slide-in.component.scss +++ /dev/null @@ -1,79 +0,0 @@ -@import 'scss-imports/cssvars'; - -/* MODAL STYLES --------------------------------*/ - -.ix-slide-in-form { - bottom: 0; - min-width: 480px; - - /* enables scrolling for tall modals */ - overflow: auto; - position: fixed; - right: -480px; - top: 48px; - transition: 200ms; - width: 480px; - - /* z-index must be higher than .ix-slide-in-background */ - /* ...but less than 1000 otherwise you cover select */ - z-index: 999; -} - -.ix-slide-in-form.open { - overflow-x: hidden; - overflow-y: auto; - right: 0; - transition: 200ms; -} - -.ix-slide-in-form.open.wide { - width: 800px; - - @media(max-width: $breakpoint-sm) { - width: 100%; - } -} - -.ix-slide-in-body { - background: #fff; - - /* margin exposes part of the modal background */ - margin: 40px; - padding: 0 20px 20px; -} - -.ix-slide-in-form .ix-slide-in-body { - background-color: var(--bg2); - margin: 0; - min-height: 100%; -} - -.ix-slide-in-background { - /* semi-transparent black */ - background-color: #000; - bottom: 0; - left: 0; - opacity: 0.75; - /* modal background fixed across whole screen */ - position: fixed; - right: 0; - top: 48px; - transition: 100ms; - - /* z-index must be below .ix-slide-in and above everything else */ - z-index: -10; -} - -.ix-slide-in-background.open { - transition: 200ms; - z-index: 900; -} - -@media #{$media-lt-sm} { - .ix-slide-in-form { - min-width: 100%; - right: -100%; - width: 100%; - } -} diff --git a/src/app/modules/slide-ins/old-slide-in.component.spec.ts b/src/app/modules/slide-ins/old-slide-in.component.spec.ts deleted file mode 100644 index 60fa3d13eb5..00000000000 --- a/src/app/modules/slide-ins/old-slide-in.component.spec.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { - ChangeDetectionStrategy, - Component, ElementRef, Inject, -} from '@angular/core'; -import { fakeAsync } from '@angular/core/testing'; -import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; -import { OldSlideInComponent } from 'app/modules/slide-ins/old-slide-in.component'; -import { SLIDE_IN_DATA } from 'app/modules/slide-ins/slide-in.token'; - -/** Simple component for testing IxSlideInComponent */ -@Component({ - selector: 'ix-test', - template: '

{{text}}

', - standalone: true, - changeDetection: ChangeDetectionStrategy.OnPush, -}) -class TestClassComponent { - text: string; - constructor( - @Inject(SLIDE_IN_DATA) value: string, - ) { - this.text = value; - } -} - -describe('SlideInComponent', () => { - let spectator: Spectator; - - const createComponent = createComponentFactory({ - component: OldSlideInComponent, - imports: [ - A11yModule, - TestClassComponent, - ], - providers: [ - mockProvider(ElementRef, { - nativeElement: {} as HTMLElement, - }), - - ], - }); - - beforeEach(() => { - spectator = createComponent(); - spectator.inject(ElementRef); - }); - - it('call \'openSlideIn\' should create a host element in the body of the slide', () => { - spectator.component.openSlideIn(TestClassComponent, { wide: true, data: 'Component created dynamically' }); - const dynamicElement = (spectator.debugElement.nativeElement as Element).querySelector('h1'); - spectator.fixture.detectChanges(); - - expect(dynamicElement).toHaveText('Component created dynamically'); - }); - - it('call \'closeSlideIn\' should remove a created host element after 200ms', fakeAsync(() => { - spectator.component.openSlideIn( - TestClassComponent, - { wide: true, data: 'Component created dynamically' }, - ); - spectator.component.closeSlideIn(); - - spectator.tick(200); - const dynamicElement = (spectator.debugElement.nativeElement as Element).querySelector('.ix-slide-in-body'); - expect(dynamicElement).toBeEmpty(); - })); -}); diff --git a/src/app/modules/slide-ins/old-slide-in.component.ts b/src/app/modules/slide-ins/old-slide-in.component.ts deleted file mode 100644 index 32418a77f1b..00000000000 --- a/src/app/modules/slide-ins/old-slide-in.component.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { CdkTrapFocus } from '@angular/cdk/a11y'; -import { - ChangeDetectionStrategy, ChangeDetectorRef, - Component, - ElementRef, - HostListener, - Injector, - OnDestroy, - OnInit, - Renderer2, - Type, - ViewContainerRef, - viewChild, - input, -} from '@angular/core'; -import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; -import { UUID } from 'angular2-uuid'; -import { Subscription, timer } from 'rxjs'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; -import { SLIDE_IN_DATA } from 'app/modules/slide-ins/slide-in.token'; -import { OldSlideInService } from 'app/services/old-slide-in.service'; - -@UntilDestroy() -@Component({ - selector: 'ix-old-slide-in', - templateUrl: './old-slide-in.component.html', - styleUrls: ['./old-slide-in.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, - imports: [CdkTrapFocus], -}) -export class OldSlideInComponent implements OnInit, OnDestroy { - readonly id = input(); - - private readonly slideInBody = viewChild.required('body', { read: ViewContainerRef }); - - @HostListener('document:keydown.escape') onKeydownHandler(): void { - this.onBackdropClicked(); - } - - isSlideInOpen = false; - wide = false; - private element: HTMLElement; - private wasBodyCleared = false; - private timeOutOfClear: Subscription; - - constructor( - private el: ElementRef, - private slideInService: OldSlideInService, - private renderer: Renderer2, - private cdr: ChangeDetectorRef, - private defaultInjector: Injector, - ) { - this.element = this.el.nativeElement as HTMLElement; - } - - ngOnInit(): void { - // ensure id attribute exists - if (!this.id()) { - return; - } - - // move element to bottom of page (just before ) so it can be displayed above everything else - document.body.appendChild(this.element); - this.slideInService.setSlideComponent(this); - } - - onBackdropClicked(): void { - if (!this.element || !this.isSlideInOpen) { - return; - } - this.slideInService.closeLast(); - } - - closeSlideIn(): void { - this.isSlideInOpen = false; - this.renderer.removeStyle(document.body, 'overflow'); - this.wasBodyCleared = true; - this.cdr.markForCheck(); - this.timeOutOfClear = timer(200).pipe(untilDestroyed(this)).subscribe(() => { - // Destroying child component later improves performance a little bit. - // 200ms matches transition duration - this.slideInBody().clear(); - this.wasBodyCleared = false; - this.cdr.markForCheck(); - }); - } - - openSlideIn( - componentType: Type, - params?: { wide?: boolean; data?: D; injector?: Injector }, - ): OldSlideInRef { - if (this.isSlideInOpen) { - console.error('SlideIn is already open'); - } - - this.isSlideInOpen = true; - this.renderer.setStyle(document.body, 'overflow', 'hidden'); - this.wide = !!params?.wide; - - if (this.wasBodyCleared) { - this.timeOutOfClear.unsubscribe(); - } - this.slideInBody().clear(); - this.wasBodyCleared = false; - // clear body and close all slides - - this.cdr.markForCheck(); - - return this.createSlideInRef( - componentType, - params?.data, - params?.injector || this.defaultInjector, - ); - } - - private createSlideInRef( - componentType: Type, - data?: D, - parentInjector?: Injector, - ): OldSlideInRef { - const slideInRef = new OldSlideInRef(); - const injector = Injector.create({ - providers: [ - { provide: SLIDE_IN_DATA, useValue: data }, - { provide: OldSlideInRef, useValue: slideInRef }, - ], - parent: parentInjector, - }); - slideInRef.componentRef = this.slideInBody().createComponent(componentType, { injector }); - slideInRef.id = UUID.UUID(); - - return slideInRef; - } - - ngOnDestroy(): void { - this.element.remove(); - this.slideInService.closeAll(); - } -} diff --git a/src/app/modules/slide-ins/slide-in.token.ts b/src/app/modules/slide-ins/slide-in.token.ts deleted file mode 100644 index 0fc9ba02877..00000000000 --- a/src/app/modules/slide-ins/slide-in.token.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { InjectionToken } from '@angular/core'; - -// eslint-disable-next-line @typescript-eslint/naming-convention -export const SLIDE_IN_DATA = new InjectionToken('SLIDE_IN_DATA'); diff --git a/src/app/modules/slide-ins/slide-in.ts b/src/app/modules/slide-ins/slide-in.ts index fcbf7e7bb22..9391fd8495f 100644 --- a/src/app/modules/slide-ins/slide-in.ts +++ b/src/app/modules/slide-ins/slide-in.ts @@ -73,7 +73,7 @@ export class SlideIn extends ComponentStore { return close$.asObservable().pipe(tap(() => this.focusService.restoreFocus())); } - popComponent = this.updater((state, id: string) => { + popComponent = this.updater((state, id: string | undefined) => { const newMap = new Map(state.components); newMap.set(id, { ...newMap.get(id), isComponentAlive: false }); this.focusOnTheCloseButton(); diff --git a/src/app/pages/credentials/backup-credentials/cloud-credentials-card/cloud-credentials-card.component.spec.ts b/src/app/pages/credentials/backup-credentials/cloud-credentials-card/cloud-credentials-card.component.spec.ts index 9ea20cccb10..78d70cd12a8 100644 --- a/src/app/pages/credentials/backup-credentials/cloud-credentials-card/cloud-credentials-card.component.spec.ts +++ b/src/app/pages/credentials/backup-credentials/cloud-credentials-card/cloud-credentials-card.component.spec.ts @@ -15,7 +15,6 @@ import { IxTableHarness } from 'app/modules/ix-table/components/ix-table/ix-tabl import { IxTablePagerShowMoreComponent, } from 'app/modules/ix-table/components/ix-table-pager-show-more/ix-table-pager-show-more.component'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { ApiService } from 'app/modules/websocket/api.service'; import { CloudCredentialsCardComponent } from 'app/pages/credentials/backup-credentials/cloud-credentials-card/cloud-credentials-card.component'; @@ -75,7 +74,6 @@ describe('CloudCredentialsCardComponent', () => { mockProvider(SlideIn, { open: jest.fn(() => of()), }), - mockProvider(OldSlideInRef), mockProvider(MatDialog, { open: jest.fn(() => ({ afterClosed: () => of(true), diff --git a/src/app/pages/credentials/backup-credentials/ssh-connection-card/ssh-connection-card.component.spec.ts b/src/app/pages/credentials/backup-credentials/ssh-connection-card/ssh-connection-card.component.spec.ts index b4147f769b7..c8d9b537aa2 100644 --- a/src/app/pages/credentials/backup-credentials/ssh-connection-card/ssh-connection-card.component.spec.ts +++ b/src/app/pages/credentials/backup-credentials/ssh-connection-card/ssh-connection-card.component.spec.ts @@ -13,7 +13,6 @@ import { IxTableHarness } from 'app/modules/ix-table/components/ix-table/ix-tabl import { IxTablePagerShowMoreComponent, } from 'app/modules/ix-table/components/ix-table-pager-show-more/ix-table-pager-show-more.component'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { ApiService } from 'app/modules/websocket/api.service'; import { SshConnectionCardComponent } from 'app/pages/credentials/backup-credentials/ssh-connection-card/ssh-connection-card.component'; @@ -69,7 +68,6 @@ describe('SshConnectionCardComponent', () => { mockProvider(SlideIn, { open: jest.fn(() => of()), }), - mockProvider(OldSlideInRef), mockProvider(MatDialog, { open: jest.fn(() => ({ afterClosed: () => of(true), diff --git a/src/app/pages/dashboard/components/widget-group-form/widget-group-form.component.spec.ts b/src/app/pages/dashboard/components/widget-group-form/widget-group-form.component.spec.ts index 86b5addba13..ac3a016a6b7 100644 --- a/src/app/pages/dashboard/components/widget-group-form/widget-group-form.component.spec.ts +++ b/src/app/pages/dashboard/components/widget-group-form/widget-group-form.component.spec.ts @@ -10,6 +10,7 @@ import { of } from 'rxjs'; import { mockAuth } from 'app/core/testing/utils/mock-auth.utils'; import { IxIconGroupHarness } from 'app/modules/forms/ix-forms/components/ix-icon-group/ix-icon-group.harness'; import { FormErrorHandlerService } from 'app/modules/forms/ix-forms/services/form-error-handler.service'; +import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { SlideInRef } from 'app/modules/slide-ins/slide-in-ref'; import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; import { WidgetEditorGroupComponent } from 'app/pages/dashboard/components/widget-group-form/widget-editor-group/widget-editor-group.component'; @@ -18,7 +19,6 @@ import { WidgetGroupSlotFormComponent } from 'app/pages/dashboard/components/wid import { SlotPosition } from 'app/pages/dashboard/types/slot-position.enum'; import { WidgetGroup, WidgetGroupLayout } from 'app/pages/dashboard/types/widget-group.interface'; import { SlotSize, WidgetType } from 'app/pages/dashboard/types/widget.interface'; -import { OldSlideInService } from 'app/services/old-slide-in.service'; describe('WidgetGroupFormComponent', () => { let spectator: Spectator; @@ -43,7 +43,9 @@ describe('WidgetGroupFormComponent', () => { providers: [ mockAuth(), mockProvider(SlideInRef, slideInRef), - mockProvider(OldSlideInService), + mockProvider(SlideIn, { + components$: of([]), + }), mockProvider(FormErrorHandlerService), mockProvider(SnackbarService), ], diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-card/cloud-backup-card.component.spec.ts b/src/app/pages/data-protection/cloud-backup/cloud-backup-card/cloud-backup-card.component.spec.ts index f66ef37eead..22172b2f9f3 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-card/cloud-backup-card.component.spec.ts +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-card/cloud-backup-card.component.spec.ts @@ -14,7 +14,6 @@ import { DialogService } from 'app/modules/dialog/dialog.service'; import { IxIconHarness } from 'app/modules/ix-icon/ix-icon.harness'; import { IxTableHarness } from 'app/modules/ix-table/components/ix-table/ix-table.harness'; import { selectJobs } from 'app/modules/jobs/store/job.selectors'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { ApiService } from 'app/modules/websocket/api.service'; import { @@ -62,7 +61,6 @@ describe('CloudBackupCardComponent', () => { mockProvider(DialogService, { confirm: jest.fn(() => of(true)), }), - mockProvider(OldSlideInRef), mockProvider(SlideIn, { open: jest.fn(() => of({ response: true, diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-list/cloud-backup-list.component.spec.ts b/src/app/pages/data-protection/cloud-backup/cloud-backup-list/cloud-backup-list.component.spec.ts index efe96de3f76..00986002c17 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-list/cloud-backup-list.component.spec.ts +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-list/cloud-backup-list.component.spec.ts @@ -19,7 +19,6 @@ import { IxTableHarness } from 'app/modules/ix-table/components/ix-table/ix-tabl import { SortDirection } from 'app/modules/ix-table/enums/sort-direction.enum'; import { selectJobs } from 'app/modules/jobs/store/job.selectors'; import { PageHeaderComponent } from 'app/modules/page-header/page-title-header/page-header.component'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { ApiService } from 'app/modules/websocket/api.service'; import { CloudBackupDetailsComponent } from 'app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-details.component'; @@ -74,7 +73,6 @@ describe('CloudBackupListComponent', () => { mockProvider(DialogService, { confirm: jest.fn(() => of(true)), }), - mockProvider(OldSlideInRef), mockProvider(SlideIn, { open: jest.fn(() => of({ response: true, diff --git a/src/app/pages/data-protection/cloudsync/cloudsync-list/cloudsync-list.component.spec.ts b/src/app/pages/data-protection/cloudsync/cloudsync-list/cloudsync-list.component.spec.ts index d0e6baa8536..798058c6d18 100644 --- a/src/app/pages/data-protection/cloudsync/cloudsync-list/cloudsync-list.component.spec.ts +++ b/src/app/pages/data-protection/cloudsync/cloudsync-list/cloudsync-list.component.spec.ts @@ -29,14 +29,12 @@ import { IxTableDetailsRowDirective } from 'app/modules/ix-table/directives/ix-t import { selectJob } from 'app/modules/jobs/store/job.selectors'; import { LocaleService } from 'app/modules/language/locale.service'; import { PageHeaderComponent } from 'app/modules/page-header/page-title-header/page-header.component'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; import { ApiService } from 'app/modules/websocket/api.service'; import { CloudSyncFormComponent } from 'app/pages/data-protection/cloudsync/cloudsync-form/cloudsync-form.component'; import { CloudSyncListComponent } from 'app/pages/data-protection/cloudsync/cloudsync-list/cloudsync-list.component'; import { CloudSyncRestoreDialogComponent } from 'app/pages/data-protection/cloudsync/cloudsync-restore-dialog/cloudsync-restore-dialog.component'; -import { OldSlideInService } from 'app/services/old-slide-in.service'; import { TaskService } from 'app/services/task.service'; describe('CloudSyncListComponent', () => { @@ -124,12 +122,9 @@ describe('CloudSyncListComponent', () => { mockProvider(DialogService, { confirm: jest.fn(() => of(true)), }), - mockProvider(OldSlideInService, { - open: jest.fn(() => { - return { slideInClosed$: of() }; - }), + mockProvider(SlideIn, { + open: jest.fn(() => of()), }), - mockProvider(OldSlideInRef), mockProvider(MatDialog, { open: jest.fn(() => ({ afterClosed: () => of(true), diff --git a/src/app/pages/data-protection/cloudsync/cloudsync-task-card/cloudsync-task-card.component.spec.ts b/src/app/pages/data-protection/cloudsync/cloudsync-task-card/cloudsync-task-card.component.spec.ts index 68b69edefcd..bfa8599d32b 100644 --- a/src/app/pages/data-protection/cloudsync/cloudsync-task-card/cloudsync-task-card.component.spec.ts +++ b/src/app/pages/data-protection/cloudsync/cloudsync-task-card/cloudsync-task-card.component.spec.ts @@ -25,7 +25,6 @@ import { } from 'app/modules/ix-table/components/ix-table-body/cells/ix-cell-schedule/ix-cell-schedule.component'; import { selectJobs } from 'app/modules/jobs/store/job.selectors'; import { LocaleService } from 'app/modules/language/locale.service'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; import { ApiService } from 'app/modules/websocket/api.service'; @@ -37,7 +36,6 @@ import { CloudSyncTaskCardComponent, } from 'app/pages/data-protection/cloudsync/cloudsync-task-card/cloudsync-task-card.component'; import { CloudSyncWizardComponent } from 'app/pages/data-protection/cloudsync/cloudsync-wizard/cloudsync-wizard.component'; -import { OldSlideInService } from 'app/services/old-slide-in.service'; import { TaskService } from 'app/services/task.service'; import { selectSystemConfigState } from 'app/store/system-config/system-config.selectors'; @@ -134,11 +132,8 @@ describe('CloudSyncTaskCardComponent', () => { mockProvider(SlideIn, { open: jest.fn(() => of()), }), - mockProvider(OldSlideInRef), - mockProvider(OldSlideInService, { - open: jest.fn(() => ({ - slideInClosed$: of(), - })), + mockProvider(SlideIn, { + open: jest.fn(() => of()), }), mockProvider(MatDialog, { open: jest.fn(() => ({ diff --git a/src/app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-provider/cloudsync-provider.component.spec.ts b/src/app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-provider/cloudsync-provider.component.spec.ts index fc1d5815ea5..4a6c6fe970f 100644 --- a/src/app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-provider/cloudsync-provider.component.spec.ts +++ b/src/app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-provider/cloudsync-provider.component.spec.ts @@ -12,7 +12,6 @@ import { CloudCredentialsSelectComponent, } from 'app/modules/forms/custom-selects/cloud-credentials-select/cloud-credentials-select.component'; import { IxFormHarness } from 'app/modules/forms/ix-forms/testing/ix-form.harness'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { SlideInRef } from 'app/modules/slide-ins/slide-in-ref'; import { ApiService } from 'app/modules/websocket/api.service'; @@ -73,7 +72,6 @@ describe('CloudSyncProviderComponent', () => { afterClosed: () => of(), })), }), - mockProvider(OldSlideInRef), mockProvider(DialogService, { confirm: jest.fn(() => of()), }), diff --git a/src/app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-what-and-when/cloudsync-what-and-when.component.spec.ts b/src/app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-what-and-when/cloudsync-what-and-when.component.spec.ts index 624ad6a8720..c520aaf21f2 100644 --- a/src/app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-what-and-when/cloudsync-what-and-when.component.spec.ts +++ b/src/app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-what-and-when/cloudsync-what-and-when.component.spec.ts @@ -12,13 +12,13 @@ import { DialogService } from 'app/modules/dialog/dialog.service'; import { IxInputHarness } from 'app/modules/forms/ix-forms/components/ix-input/ix-input.harness'; import { IxSelectHarness } from 'app/modules/forms/ix-forms/components/ix-select/ix-select.harness'; import { IxFormHarness } from 'app/modules/forms/ix-forms/testing/ix-form.harness'; +import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { SlideInRef } from 'app/modules/slide-ins/slide-in-ref'; import { CloudSyncFormComponent } from 'app/pages/data-protection/cloudsync/cloudsync-form/cloudsync-form.component'; import { googlePhotosCreds, googlePhotosProvider } from 'app/pages/data-protection/cloudsync/cloudsync-wizard/cloudsync-wizard.testing.utils'; import { CloudSyncWhatAndWhenComponent } from 'app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-what-and-when/cloudsync-what-and-when.component'; import { TransferModeExplanationComponent } from 'app/pages/data-protection/cloudsync/transfer-mode-explanation/transfer-mode-explanation.component'; import { DatasetService } from 'app/services/dataset-service/dataset.service'; -import { OldSlideInService } from 'app/services/old-slide-in.service'; describe('CloudSyncWhatAndWhenComponent', () => { let spectator: Spectator; @@ -47,7 +47,9 @@ describe('CloudSyncWhatAndWhenComponent', () => { mockCall('cloudsync.credentials.query', [googlePhotosCreds]), mockCall('cloudsync.providers', [googlePhotosProvider]), ]), - mockProvider(OldSlideInService), + mockProvider(SlideIn, { + components$: of([]), + }), mockProvider(DatasetService), mockProvider(MatDialog, { open: jest.fn(() => ({ diff --git a/src/app/pages/data-protection/replication/replication-form/sections/transport-section/transport-section.component.spec.ts b/src/app/pages/data-protection/replication/replication-form/sections/transport-section/transport-section.component.spec.ts index 00b6f17c887..bea45651252 100644 --- a/src/app/pages/data-protection/replication/replication-form/sections/transport-section/transport-section.component.spec.ts +++ b/src/app/pages/data-protection/replication/replication-form/sections/transport-section/transport-section.component.spec.ts @@ -15,8 +15,6 @@ import { } from 'app/modules/forms/custom-selects/ssh-credentials-select/ssh-credentials-select.component'; import { IxCheckboxHarness } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.harness'; import { IxFieldsetHarness } from 'app/modules/forms/ix-forms/components/ix-fieldset/ix-fieldset.harness'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; -import { SLIDE_IN_DATA } from 'app/modules/slide-ins/slide-in.token'; import { TransportSectionComponent, } from 'app/pages/data-protection/replication/replication-form/sections/transport-section/transport-section.component'; @@ -43,8 +41,6 @@ describe('TransportSectionComponent', () => { afterClosed: () => of(true), })), }), - mockProvider(OldSlideInRef), - { provide: SLIDE_IN_DATA, useValue: undefined }, ], }); diff --git a/src/app/pages/data-protection/replication/replication-list/replication-list.component.spec.ts b/src/app/pages/data-protection/replication/replication-list/replication-list.component.spec.ts index 2b537d7f9c2..c3f7d3b19fc 100644 --- a/src/app/pages/data-protection/replication/replication-list/replication-list.component.spec.ts +++ b/src/app/pages/data-protection/replication/replication-list/replication-list.component.spec.ts @@ -32,7 +32,6 @@ import { import { IxTableDetailsRowDirective } from 'app/modules/ix-table/directives/ix-table-details-row.directive'; import { selectJobs } from 'app/modules/jobs/store/job.selectors'; import { PageHeaderComponent } from 'app/modules/page-header/page-title-header/page-header.component'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { ApiService } from 'app/modules/websocket/api.service'; import { ReplicationFormComponent } from 'app/pages/data-protection/replication/replication-form/replication-form.component'; @@ -155,7 +154,6 @@ describe('ReplicationListComponent', () => { mockProvider(DialogService, { confirm: jest.fn(() => of(true)), }), - mockProvider(OldSlideInRef), mockProvider(MatDialog, { open: jest.fn(() => ({ afterClosed: () => of(true), diff --git a/src/app/pages/data-protection/replication/replication-task-card/replication-task-card.component.spec.ts b/src/app/pages/data-protection/replication/replication-task-card/replication-task-card.component.spec.ts index 5053555aae9..7de33db22d6 100644 --- a/src/app/pages/data-protection/replication/replication-task-card/replication-task-card.component.spec.ts +++ b/src/app/pages/data-protection/replication/replication-task-card/replication-task-card.component.spec.ts @@ -13,7 +13,6 @@ import { ReplicationTask } from 'app/interfaces/replication-task.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; import { IxIconHarness } from 'app/modules/ix-icon/ix-icon.harness'; import { IxTableHarness } from 'app/modules/ix-table/components/ix-table/ix-table.harness'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { ApiService } from 'app/modules/websocket/api.service'; import { ReplicationFormComponent } from 'app/pages/data-protection/replication/replication-form/replication-form.component'; @@ -92,7 +91,6 @@ describe('ReplicationTaskCardComponent', () => { mockProvider(SlideIn, { open: jest.fn(() => of()), }), - mockProvider(OldSlideInRef), mockProvider(MatDialog, { open: jest.fn(() => ({ afterClosed: () => of(true), diff --git a/src/app/pages/data-protection/rsync-task/rsync-task-card/rsync-task-card.component.spec.ts b/src/app/pages/data-protection/rsync-task/rsync-task-card/rsync-task-card.component.spec.ts index 1e7c2b7cefb..1b2342bd1b8 100644 --- a/src/app/pages/data-protection/rsync-task/rsync-task-card/rsync-task-card.component.spec.ts +++ b/src/app/pages/data-protection/rsync-task/rsync-task-card/rsync-task-card.component.spec.ts @@ -16,7 +16,6 @@ import { IxIconHarness } from 'app/modules/ix-icon/ix-icon.harness'; import { IxTableHarness } from 'app/modules/ix-table/components/ix-table/ix-table.harness'; import { selectJobs } from 'app/modules/jobs/store/job.selectors'; import { LocaleService } from 'app/modules/language/locale.service'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { ApiService } from 'app/modules/websocket/api.service'; import { RsyncTaskCardComponent } from 'app/pages/data-protection/rsync-task/rsync-task-card/rsync-task-card.component'; @@ -101,7 +100,6 @@ describe('RsyncTaskCardComponent', () => { mockProvider(SlideIn, { open: jest.fn(() => of()), }), - mockProvider(OldSlideInRef), mockProvider(MatDialog, { open: jest.fn(() => ({ afterClosed: () => of(true), diff --git a/src/app/pages/data-protection/scrub-task/resilver-config/resilver-config.component.spec.ts b/src/app/pages/data-protection/scrub-task/resilver-config/resilver-config.component.spec.ts index 1eb12f5a691..ef4e5686d61 100644 --- a/src/app/pages/data-protection/scrub-task/resilver-config/resilver-config.component.spec.ts +++ b/src/app/pages/data-protection/scrub-task/resilver-config/resilver-config.component.spec.ts @@ -13,7 +13,6 @@ import { IxFormHarness } from 'app/modules/forms/ix-forms/testing/ix-form.harnes import { LanguageService } from 'app/modules/language/language.service'; import { LocaleService } from 'app/modules/language/locale.service'; import { ApiService } from 'app/modules/websocket/api.service'; -import { OldSlideInService } from 'app/services/old-slide-in.service'; import { ResilverConfigComponent } from './resilver-config.component'; describe('ResilverConfigComponent', () => { @@ -36,7 +35,6 @@ describe('ResilverConfigComponent', () => { } as ResilverConfig), mockCall('pool.resilver.update'), ]), - mockProvider(OldSlideInService), mockProvider(FormErrorHandlerService), mockProvider(DialogService), mockProvider(Router), diff --git a/src/app/pages/network/components/interface-form/interface-form.component.spec.ts b/src/app/pages/network/components/interface-form/interface-form.component.spec.ts index 0f32ec24ca5..ec768bd2332 100644 --- a/src/app/pages/network/components/interface-form/interface-form.component.spec.ts +++ b/src/app/pages/network/components/interface-form/interface-form.component.spec.ts @@ -26,6 +26,7 @@ import { import { IxListHarness } from 'app/modules/forms/ix-forms/components/ix-list/ix-list.harness'; import { IxSelectHarness } from 'app/modules/forms/ix-forms/components/ix-select/ix-select.harness'; import { IxFormHarness } from 'app/modules/forms/ix-forms/testing/ix-form.harness'; +import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { SlideInRef } from 'app/modules/slide-ins/slide-in-ref'; import { ApiService } from 'app/modules/websocket/api.service'; import { @@ -33,7 +34,6 @@ import { } from 'app/pages/network/components/default-gateway-dialog/default-gateway-dialog.component'; import { InterfaceFormComponent } from 'app/pages/network/components/interface-form/interface-form.component'; import { NetworkService } from 'app/services/network.service'; -import { OldSlideInService } from 'app/services/old-slide-in.service'; import { SystemGeneralService } from 'app/services/system-general.service'; import { haInfoReducer } from 'app/store/ha-info/ha-info.reducer'; import { haInfoStateKey } from 'app/store/ha-info/ha-info.selectors'; @@ -133,7 +133,9 @@ describe('InterfaceFormComponent', () => { ], }), mockProvider(DialogService), - mockProvider(OldSlideInService), + mockProvider(SlideIn, { + components$: of([]), + }), mockProvider(SystemGeneralService, { getProductType: () => ProductType.ScaleEnterprise, }), diff --git a/src/app/pages/sharing/iscsi/initiator/initiator-list/initiator-list.component.spec.ts b/src/app/pages/sharing/iscsi/initiator/initiator-list/initiator-list.component.spec.ts index b2aba435bf8..97ae13b51b0 100644 --- a/src/app/pages/sharing/iscsi/initiator/initiator-list/initiator-list.component.spec.ts +++ b/src/app/pages/sharing/iscsi/initiator/initiator-list/initiator-list.component.spec.ts @@ -18,10 +18,8 @@ import { IxTableColumnsSelectorComponent, } from 'app/modules/ix-table/components/ix-table-columns-selector/ix-table-columns-selector.component'; import { FakeProgressBarComponent } from 'app/modules/loader/components/fake-progress-bar/fake-progress-bar.component'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; import { ApiService } from 'app/modules/websocket/api.service'; import { InitiatorListComponent } from 'app/pages/sharing/iscsi/initiator/initiator-list/initiator-list.component'; -import { OldSlideInService } from 'app/services/old-slide-in.service'; const initiators: IscsiInitiatorGroup[] = [ { @@ -49,13 +47,9 @@ describe('InitiatorListComponent', () => { mockCall('iscsi.initiator.query', initiators), mockCall('iscsi.initiator.delete'), ]), - mockProvider(OldSlideInRef), mockProvider(DialogService, { confirm: jest.fn(() => of(true)), }), - mockProvider(OldSlideInService, { - open: jest.fn(() => ({ slideInClosed$: of(true) })), - }), mockProvider(MatDialog, { open: jest.fn(), }), diff --git a/src/app/services/old-slide-in.service.spec.ts b/src/app/services/old-slide-in.service.spec.ts deleted file mode 100644 index 76bd8ed558e..00000000000 --- a/src/app/services/old-slide-in.service.spec.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { Location } from '@angular/common'; -import { - ChangeDetectionStrategy, Component, ElementRef, Inject, -} from '@angular/core'; -import { fakeAsync, tick } from '@angular/core/testing'; -import { Router } from '@angular/router'; -import { - createServiceFactory, mockProvider, SpectatorService, createComponentFactory, Spectator, -} from '@ngneat/spectator/jest'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; -import { OldSlideInComponent } from 'app/modules/slide-ins/old-slide-in.component'; -import { SLIDE_IN_DATA } from 'app/modules/slide-ins/slide-in.token'; -import { DiskFormComponent } from 'app/pages/storage/modules/disks/components/disk-form/disk-form.component'; -import { OldSlideInService } from 'app/services/old-slide-in.service'; - -/** Simple component for testing IxSlideInComponent */ -@Component({ - selector: 'ix-test', - template: '

{{text}}

', - standalone: true, - changeDetection: ChangeDetectionStrategy.OnPush, -}) -class TestComponent { - text: string; - constructor( - public slideInRef: OldSlideInRef, - @Inject(SLIDE_IN_DATA) private value: string, - ) { - this.text = value; - } - - close(): void { - this.slideInRef.close(); - } -} - -describe('IxSlideInService', () => { - let spectator: SpectatorService; - let service: OldSlideInService; - let spectatorComponent: Spectator; - - const createService = createServiceFactory({ - service: OldSlideInService, - providers: [ - Location, - Router, - ], - }); - const createComponent = createComponentFactory({ - component: OldSlideInComponent, - providers: [ - mockProvider(ElementRef), - OldSlideInService, - ], - imports: [ - A11yModule, - ], - }); - - beforeEach(() => { - spectator = createService(); - service = spectator.service; - spectatorComponent = createComponent({ - props: { id: 'ix-slide-in-form' }, - }); - }); - - describe('slideInService', () => { - it('the \'open\' method should return instance of IxSlideInRef', () => { - jest.spyOn(service.slideInComponent, 'openSlideIn'); - - const instanceRef = service.open(TestComponent, { wide: true, data: 'Component created dynamically' }); - - expect(service.slideInComponent.openSlideIn).toHaveBeenCalledWith(TestComponent, { wide: true, data: 'Component created dynamically' }); - expect(instanceRef).toBeInstanceOf(OldSlideInRef); - }); - - it('should be call \'closeAll\' method after route navigation', async () => { - jest.spyOn(service, 'closeAll'); - service.open(TestComponent); - - await spectator.inject(Router).navigate(['/']); - - expect(service.closeAll).toHaveBeenCalled(); - }); - - it('should be call \'closeAll\' method after changing URL using location service', fakeAsync(() => { - const location = spectator.inject(Location); - location.go('/'); - jest.spyOn(service, 'closeAll'); - service.open(TestComponent, { wide: true, data: '' }); - - location.back(); - tick(200); - expect(service.closeAll).toHaveBeenCalled(); - })); - }); - - describe('IxSlideInRef', () => { - it('should be passed the correct data to the dynamically created component after call \'open\'', () => { - const slideInRef = service.open(TestComponent, { wide: true, data: 'Component created dynamically' }); - // check injected (SLIDE_IN_DATA) - const componentInstance = slideInRef.componentInstance; - - expect(componentInstance.text).toBe('Component created dynamically'); - }); - - it('should be injected IxSlideInRef to the dynamically created component after calling \'open\',', () => { - const slideInRef = service.open(TestComponent, { wide: true, data: 'Component created dynamically' }); - // check injected SlideInRef - - expect(slideInRef.componentInstance.slideInRef).toBeInstanceOf(OldSlideInRef); - }); - - it('after close slide observable \'slideInClosed$\' should emit response', () => { - jest.spyOn(spectatorComponent.component, 'closeSlideIn'); - - let response; - const data = { value: true }; - const slideInRef = service.open(TestComponent); - - slideInRef.slideInClosed$.subscribe((val) => response = val); - slideInRef.close(data); - - expect(response).toBe(data); - expect(spectatorComponent.component.closeSlideIn).toHaveBeenCalled(); - }); - }); -}); diff --git a/src/app/services/old-slide-in.service.ts b/src/app/services/old-slide-in.service.ts deleted file mode 100644 index 3eca31c93bf..00000000000 --- a/src/app/services/old-slide-in.service.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { Location } from '@angular/common'; -import { Injectable, Injector, Type } from '@angular/core'; -import { NavigationEnd, Router } from '@angular/router'; -import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; -import { - merge, Observable, Subject, timer, -} from 'rxjs'; -import { filter, take } from 'rxjs/operators'; -import { OldSlideInRef } from 'app/modules/slide-ins/old-slide-in-ref'; -import { OldSlideInComponent } from 'app/modules/slide-ins/old-slide-in.component'; -import { FocusService } from 'app/services/focus.service'; - -/** - * @deprecated Use SlideInService instead. - */ -@UntilDestroy() -@Injectable({ - providedIn: 'root', -}) -export class OldSlideInService { - slideInComponent: OldSlideInComponent; - slideInRefMap = new Map>(); - /** - * Emits when any slide in has been closed. - * Prefer to use slideInClosed$ in slideInRef to tell when an individual slide in is closed. - */ - readonly onClose$ = new Subject(); - - constructor( - private location: Location, - private router: Router, - private focusService: FocusService, - ) { - this.closeOnNavigation(); - } - - get isSlideInOpen(): boolean { - return this.slideInComponent?.isSlideInOpen; - } - - // TODO: Rework via cdk overlays or something else that would make it easier to use in tests. - setSlideComponent(slideComponent: OldSlideInComponent): void { - this.slideInComponent = slideComponent; - } - - open( - component: Type, - params?: { wide?: boolean; data?: D; injector?: Injector }, - ): OldSlideInRef { - this.slideInRefMap.forEach((ref) => ref.close()); - - const slideInRef = this.slideInComponent.openSlideIn(component, params); - this.slideInRefMap.set(slideInRef.id, slideInRef); - slideInRef.slideInClosed$.pipe(untilDestroyed(this)).subscribe((response?: D) => { - this.deleteRef(slideInRef.id); - if (response === undefined) { - response = null; - } - this.onClose$.next(); - }); - - this.focusService.captureCurrentFocus(); - this.focusOnTheCloseButton(); - - return slideInRef; - } - - closeLast(): void { - if (!this.isSlideInOpen) { - return; - } - - const lastSlideInRef = Array.from(this.slideInRefMap.values()).pop(); - lastSlideInRef?.close(); - } - - closeAll(): void { - if (!this.isSlideInOpen) { - return; - } - - this.slideInRefMap.forEach((ref) => ref.close()); - } - - deleteRef(id: string): void { - this.slideInRefMap.delete(id); - - if (this.isSlideInOpen) { - this.slideInComponent.closeSlideIn(); - } - - this.focusService.restoreFocus(); - } - - private closeOnNavigation(): void { - merge( - new Observable((observer) => { - this.location.subscribe((event) => { - observer.next(event); - }); - }), - this.router.events.pipe(filter((event) => event instanceof NavigationEnd)), - ) - .pipe(untilDestroyed(this)) - .subscribe(() => { - this.closeAll(); - }); - } - - private focusOnTheCloseButton(): void { - timer(100).pipe(take(1)).subscribe(() => this.focusService.focusElementById('ix-close-icon')); - } -} diff --git a/src/assets/icons/sprite-config.json b/src/assets/icons/sprite-config.json index f46094f44bd..7852d40d854 100644 --- a/src/assets/icons/sprite-config.json +++ b/src/assets/icons/sprite-config.json @@ -1,3 +1,3 @@ { - "iconUrl": "assets/icons/sprite.svg?v=aa5e18694d" + "iconUrl": "assets/icons/sprite.svg?v=1ec6f0c0c9" } \ No newline at end of file diff --git a/src/assets/icons/sprite.svg b/src/assets/icons/sprite.svg index 6b2355ddcdb..1ca6af5b14d 100644 --- a/src/assets/icons/sprite.svg +++ b/src/assets/icons/sprite.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/setup-jest.ts b/src/setup-jest.ts index 4e03d60bad8..4ff7b9487b8 100644 --- a/src/setup-jest.ts +++ b/src/setup-jest.ts @@ -84,9 +84,6 @@ import { import { ModalHeaderComponent, } from 'app/modules/slide-ins/components/modal-header/modal-header.component'; -import { - OldModalHeaderComponent, -} from 'app/modules/slide-ins/components/old-modal-header/old-modal-header.component'; import { TestOverrideDirective } from 'app/modules/test-id/test-override/test-override.directive'; import { TestDirective } from 'app/modules/test-id/test.directive'; import { ApiService } from 'app/modules/websocket/api.service'; @@ -130,7 +127,6 @@ defineGlobalsInjections({ IxRadioGroupComponent, IxSelectComponent, IxFieldsetComponent, - OldModalHeaderComponent, ModalHeaderComponent, IxFormSectionComponent, RegisteredControlDirective, diff --git a/tsconfig.strictNullChecks.json b/tsconfig.strictNullChecks.json index 26355112f03..d708a8359c2 100644 --- a/tsconfig.strictNullChecks.json +++ b/tsconfig.strictNullChecks.json @@ -437,7 +437,6 @@ "./src/app/modules/forms/ix-forms/components/ix-select/ix-select.harness.ts", "./src/app/modules/forms/ix-forms/components/ix-select/option.harness.ts", "./src/app/modules/forms/ix-forms/components/ix-select/select.harness.ts", - "./src/app/modules/slide-ins/slide-in.token.ts", "./src/app/modules/forms/ix-forms/components/ix-slide-toggle/ix-slide-toggle.component.ts", "./src/app/modules/forms/ix-forms/components/ix-slide-toggle/ix-slide-toggle.harness.ts", "./src/app/modules/forms/ix-forms/components/ix-star-rating/ix-star-rating.component.ts", From a39dbfd8a9781a08adc92f2845d4d2131c3a983a Mon Sep 17 00:00:00 2001 From: Denys Butenko Date: Tue, 7 Jan 2025 17:58:44 +0700 Subject: [PATCH 20/32] NAS-133438 / 25.04 / Update text for delete iscsi dialog (#11299) --- .../delete-target-dialog.component.html | 4 ++-- .../delete-target-dialog.component.ts | 8 ++++---- src/assets/i18n/af.json | 2 +- src/assets/i18n/ar.json | 2 +- src/assets/i18n/ast.json | 2 +- src/assets/i18n/az.json | 2 +- src/assets/i18n/be.json | 2 +- src/assets/i18n/bg.json | 2 +- src/assets/i18n/bn.json | 2 +- src/assets/i18n/br.json | 2 +- src/assets/i18n/bs.json | 2 +- src/assets/i18n/ca.json | 2 +- src/assets/i18n/cs.json | 2 +- src/assets/i18n/cy.json | 2 +- src/assets/i18n/da.json | 2 +- src/assets/i18n/de.json | 2 +- src/assets/i18n/dsb.json | 2 +- src/assets/i18n/el.json | 2 +- src/assets/i18n/en-au.json | 2 +- src/assets/i18n/en-gb.json | 2 +- src/assets/i18n/en.json | 2 +- src/assets/i18n/eo.json | 2 +- src/assets/i18n/es-ar.json | 2 +- src/assets/i18n/es-co.json | 2 +- src/assets/i18n/es-mx.json | 2 +- src/assets/i18n/es-ni.json | 2 +- src/assets/i18n/es-ve.json | 2 +- src/assets/i18n/es.json | 2 +- src/assets/i18n/et.json | 2 +- src/assets/i18n/eu.json | 2 +- src/assets/i18n/fa.json | 2 +- src/assets/i18n/fi.json | 2 +- src/assets/i18n/fr.json | 2 +- src/assets/i18n/fy.json | 2 +- src/assets/i18n/ga.json | 2 +- src/assets/i18n/gd.json | 2 +- src/assets/i18n/gl.json | 2 +- src/assets/i18n/he.json | 2 +- src/assets/i18n/hi.json | 2 +- src/assets/i18n/hr.json | 2 +- src/assets/i18n/hsb.json | 2 +- src/assets/i18n/hu.json | 2 +- src/assets/i18n/ia.json | 2 +- src/assets/i18n/id.json | 2 +- src/assets/i18n/io.json | 2 +- src/assets/i18n/is.json | 2 +- src/assets/i18n/it.json | 2 +- src/assets/i18n/ja.json | 2 +- src/assets/i18n/ka.json | 2 +- src/assets/i18n/kk.json | 2 +- src/assets/i18n/km.json | 2 +- src/assets/i18n/kn.json | 2 +- src/assets/i18n/ko.json | 2 +- src/assets/i18n/lb.json | 2 +- src/assets/i18n/lt.json | 2 +- src/assets/i18n/lv.json | 2 +- src/assets/i18n/mk.json | 2 +- src/assets/i18n/ml.json | 2 +- src/assets/i18n/mn.json | 2 +- src/assets/i18n/mr.json | 2 +- src/assets/i18n/my.json | 2 +- src/assets/i18n/nb.json | 2 +- src/assets/i18n/ne.json | 2 +- src/assets/i18n/nl.json | 2 +- src/assets/i18n/nn.json | 2 +- src/assets/i18n/os.json | 2 +- src/assets/i18n/pa.json | 2 +- src/assets/i18n/pl.json | 2 +- src/assets/i18n/pt-br.json | 2 +- src/assets/i18n/pt.json | 2 +- src/assets/i18n/ro.json | 2 +- src/assets/i18n/ru.json | 2 +- src/assets/i18n/sk.json | 2 +- src/assets/i18n/sl.json | 2 +- src/assets/i18n/sq.json | 2 +- src/assets/i18n/sr-latn.json | 2 +- src/assets/i18n/sr.json | 2 +- src/assets/i18n/strings.json | 2 +- src/assets/i18n/sv.json | 2 +- src/assets/i18n/sw.json | 2 +- src/assets/i18n/ta.json | 2 +- src/assets/i18n/te.json | 2 +- src/assets/i18n/th.json | 2 +- src/assets/i18n/tr.json | 2 +- src/assets/i18n/tt.json | 2 +- src/assets/i18n/udm.json | 2 +- src/assets/i18n/uk.json | 2 +- src/assets/i18n/vi.json | 2 +- src/assets/i18n/zh-hans.json | 2 +- src/assets/i18n/zh-hant.json | 2 +- 90 files changed, 94 insertions(+), 94 deletions(-) diff --git a/src/app/pages/sharing/iscsi/target/delete-target-dialog/delete-target-dialog.component.html b/src/app/pages/sharing/iscsi/target/delete-target-dialog/delete-target-dialog.component.html index 6df147f80b0..dd43e33b5cb 100644 --- a/src/app/pages/sharing/iscsi/target/delete-target-dialog/delete-target-dialog.component.html +++ b/src/app/pages/sharing/iscsi/target/delete-target-dialog/delete-target-dialog.component.html @@ -1,8 +1,8 @@

{{ 'Delete Target "{name}"' | translate:{ name: target.name } }}

- @if (warningMessage) { -

+ @if (warningMessage()) { +

}

diff --git a/src/app/pages/sharing/iscsi/target/delete-target-dialog/delete-target-dialog.component.ts b/src/app/pages/sharing/iscsi/target/delete-target-dialog/delete-target-dialog.component.ts index be513d49a58..93084739bce 100644 --- a/src/app/pages/sharing/iscsi/target/delete-target-dialog/delete-target-dialog.component.ts +++ b/src/app/pages/sharing/iscsi/target/delete-target-dialog/delete-target-dialog.component.ts @@ -47,7 +47,7 @@ export class DeleteTargetDialogComponent implements OnInit { protected readonly requiredRoles = [Role.SharingIscsiTargetWrite]; readonly targetExtents = signal([]); - protected warningMessage = ''; + protected warningMessage = signal(''); form = this.formBuilder.group({ delete_extents: [false], @@ -73,11 +73,11 @@ export class DeleteTargetDialogComponent implements OnInit { (sessions) => { sessions.forEach((session) => { if (Number(session.target.split(':')[1]) === this.target.id) { - this.warningMessage = `${this.translate.instant('Warning: iSCSI Target is currently in use.
')}`; + this.warningMessage.set(`${ + this.translate.instant('Warning: iSCSI Target is currently in use.') + }
`); } }); - - this.cdr.markForCheck(); }, ); } diff --git a/src/assets/i18n/af.json b/src/assets/i18n/af.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/af.json +++ b/src/assets/i18n/af.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/ar.json b/src/assets/i18n/ar.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/ar.json +++ b/src/assets/i18n/ar.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/ast.json b/src/assets/i18n/ast.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/ast.json +++ b/src/assets/i18n/ast.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/az.json b/src/assets/i18n/az.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/az.json +++ b/src/assets/i18n/az.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/be.json b/src/assets/i18n/be.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/be.json +++ b/src/assets/i18n/be.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/bg.json b/src/assets/i18n/bg.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/bg.json +++ b/src/assets/i18n/bg.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/bn.json b/src/assets/i18n/bn.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/bn.json +++ b/src/assets/i18n/bn.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/br.json b/src/assets/i18n/br.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/br.json +++ b/src/assets/i18n/br.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/bs.json b/src/assets/i18n/bs.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/bs.json +++ b/src/assets/i18n/bs.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/ca.json b/src/assets/i18n/ca.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/ca.json +++ b/src/assets/i18n/ca.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/cs.json b/src/assets/i18n/cs.json index a8e45134625..d4a5d6dadbc 100644 --- a/src/assets/i18n/cs.json +++ b/src/assets/i18n/cs.json @@ -4207,7 +4207,7 @@ "Waiting for standby controller": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/cy.json b/src/assets/i18n/cy.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/cy.json +++ b/src/assets/i18n/cy.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/da.json b/src/assets/i18n/da.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/da.json +++ b/src/assets/i18n/da.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 894a887b4ee..0ad3a52fabe 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -3707,7 +3707,7 @@ "Waiting for standby controller": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/dsb.json b/src/assets/i18n/dsb.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/dsb.json +++ b/src/assets/i18n/dsb.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/el.json b/src/assets/i18n/el.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/el.json +++ b/src/assets/i18n/el.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/en-au.json b/src/assets/i18n/en-au.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/en-au.json +++ b/src/assets/i18n/en-au.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/en-gb.json b/src/assets/i18n/en-gb.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/en-gb.json +++ b/src/assets/i18n/en-gb.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/eo.json b/src/assets/i18n/eo.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/eo.json +++ b/src/assets/i18n/eo.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/es-ar.json b/src/assets/i18n/es-ar.json index 417802c0c07..a790998d5bf 100644 --- a/src/assets/i18n/es-ar.json +++ b/src/assets/i18n/es-ar.json @@ -5046,7 +5046,7 @@ "Warning": "Advertencia", "Warning!": "¡Advertencia!", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "Advertencia: los archivos de depuración pueden contener archivos de registro con información personal, como nombres de usuario u otra información de identificación sobre su sistema. Revisá los archivos de depuración y eliminá cualquier información confidencial antes de compartirlos con entidades externas.", - "Warning: iSCSI Target is currently in use.
": "Advertencia: el objetivo iSCSI está actualmente en uso.
", + "Warning: iSCSI Target is currently in use.": "Advertencia: el objetivo iSCSI está actualmente en uso.", "Warning: {n} of {total} boot environments could not be deleted.": "Advertencia: no se pudieron eliminar {n} de {total} entornos de arranque.", "Warning: {n} of {total} docker images could not be deleted.": "Advertencia: no se pudieron eliminar {n} de {total} imágenes de Docker.", "Warning: {n} of {total} snapshots could not be deleted.": "Advertencia: no se pudieron eliminar {n} de {total} instantáneas.", diff --git a/src/assets/i18n/es-co.json b/src/assets/i18n/es-co.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/es-co.json +++ b/src/assets/i18n/es-co.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/es-mx.json b/src/assets/i18n/es-mx.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/es-mx.json +++ b/src/assets/i18n/es-mx.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/es-ni.json b/src/assets/i18n/es-ni.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/es-ni.json +++ b/src/assets/i18n/es-ni.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/es-ve.json b/src/assets/i18n/es-ve.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/es-ve.json +++ b/src/assets/i18n/es-ve.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index 16523543d4a..ef05d0317c5 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -4565,7 +4565,7 @@ "Waiting for standby controller": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/et.json b/src/assets/i18n/et.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/et.json +++ b/src/assets/i18n/et.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/eu.json b/src/assets/i18n/eu.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/eu.json +++ b/src/assets/i18n/eu.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/fa.json b/src/assets/i18n/fa.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/fa.json +++ b/src/assets/i18n/fa.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/fi.json b/src/assets/i18n/fi.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/fi.json +++ b/src/assets/i18n/fi.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index bf9a5ea2e4e..1bb36fb8012 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -5118,7 +5118,7 @@ "Warning": "Attention", "Warning!": "Attention !", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "Avertissement : les debugs peuvent contenir des fichiers journaux contenant des informations personnelles telles que des noms d'utilisateur ou d'autres informations d'identification sur votre système. Veuillez examiner les debugs et rédiger toute information sensible avant de la partager avec des entités externes.", - "Warning: iSCSI Target is currently in use.
": "Avertissement : la cible iSCSI est en cours d'utilisation.
.", + "Warning: iSCSI Target is currently in use.": "Avertissement : la cible iSCSI est en cours d'utilisation.", "Warning: {n} of {total} boot environments could not be deleted.": "Avertissement: {n} sur {total} environments de boot n'ont pas pu être supprimés.", "Warning: {n} of {total} docker images could not be deleted.": "Avertissement: {n} sur {total} images docker n'ont pas pu être supprimées.", "Warning: {n} of {total} snapshots could not be deleted.": "Avertissement: {n} sur {total} instantanés n'ont pas pu être supprimés.", diff --git a/src/assets/i18n/fy.json b/src/assets/i18n/fy.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/fy.json +++ b/src/assets/i18n/fy.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/ga.json b/src/assets/i18n/ga.json index b0894ca0154..bc32b31c88e 100644 --- a/src/assets/i18n/ga.json +++ b/src/assets/i18n/ga.json @@ -378,7 +378,7 @@ "Wait for 5 minutes": "", "Wait for container to shut down cleanly": "", "Waiting for standby controller": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "We encountered an issue while applying the new network changes. Unfortunately, we were unable to reconnect to the system after the changes were implemented. As a result, we have restored the previous network configuration to ensure continued connectivity.": "", "We’re unable to access the enclosure at the moment. Please ensure it’s connected properly and reload the page.": "", "Xen: Extent block size 512b, TPC enabled, Xen compat mode enabled, SSD speed": "", diff --git a/src/assets/i18n/gd.json b/src/assets/i18n/gd.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/gd.json +++ b/src/assets/i18n/gd.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/gl.json b/src/assets/i18n/gl.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/gl.json +++ b/src/assets/i18n/gl.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/he.json b/src/assets/i18n/he.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/he.json +++ b/src/assets/i18n/he.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/hi.json b/src/assets/i18n/hi.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/hi.json +++ b/src/assets/i18n/hi.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/hr.json b/src/assets/i18n/hr.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/hr.json +++ b/src/assets/i18n/hr.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/hsb.json b/src/assets/i18n/hsb.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/hsb.json +++ b/src/assets/i18n/hsb.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/hu.json b/src/assets/i18n/hu.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/hu.json +++ b/src/assets/i18n/hu.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/ia.json b/src/assets/i18n/ia.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/ia.json +++ b/src/assets/i18n/ia.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/id.json b/src/assets/i18n/id.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/id.json +++ b/src/assets/i18n/id.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/io.json b/src/assets/i18n/io.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/io.json +++ b/src/assets/i18n/io.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/is.json b/src/assets/i18n/is.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/is.json +++ b/src/assets/i18n/is.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/it.json b/src/assets/i18n/it.json index 61e6f110290..f6d355a9b58 100644 --- a/src/assets/i18n/it.json +++ b/src/assets/i18n/it.json @@ -3840,7 +3840,7 @@ "Wait for 5 minutes": "", "Wait for container to shut down cleanly": "", "Wait to start VM until SPICE client connects.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Watch List": "", "Weak Ciphers": "", "WebDAV": "", diff --git a/src/assets/i18n/ja.json b/src/assets/i18n/ja.json index a0f74565233..370d01804c3 100644 --- a/src/assets/i18n/ja.json +++ b/src/assets/i18n/ja.json @@ -4528,7 +4528,7 @@ "Waiting for standby controller": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/ka.json b/src/assets/i18n/ka.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/ka.json +++ b/src/assets/i18n/ka.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/kk.json b/src/assets/i18n/kk.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/kk.json +++ b/src/assets/i18n/kk.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/km.json b/src/assets/i18n/km.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/km.json +++ b/src/assets/i18n/km.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/kn.json b/src/assets/i18n/kn.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/kn.json +++ b/src/assets/i18n/kn.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index e2da57e7e65..936c6627030 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -5044,7 +5044,7 @@ "Warning": "위험", "Warning!": "위험!", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "위험: 디버그에는 사용자 이름과 같은 개인정보가 담긴 기록 파일이나 시스템을 식별하기 위한 정보가 포함될 수 있습니다. 외부로 공유하기 전에 디버그를 검토하여 민감한 정보는 삭제하시기 바랍니다.", - "Warning: iSCSI Target is currently in use.
": "위험: iSCSI 대상이 현재 사용중입니다.
", + "Warning: iSCSI Target is currently in use.": "위험: iSCSI 대상이 현재 사용중입니다.", "Warning: {n} of {total} boot environments could not be deleted.": "위험: 부트환경 {total}개 중 {n}개를 삭제할 수 없습니다.", "Warning: {n} of {total} docker images could not be deleted.": "위험: 도커 이미지 {total}개 중 {n}개를 삭제할 수 없습니다.", "Warning: {n} of {total} snapshots could not be deleted.": "위험: 스냅샷 {total}개 중 {n}개를 삭제할 수 없습니다.", diff --git a/src/assets/i18n/lb.json b/src/assets/i18n/lb.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/lb.json +++ b/src/assets/i18n/lb.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/lt.json b/src/assets/i18n/lt.json index 3c45116c5ba..20c89bcde68 100644 --- a/src/assets/i18n/lt.json +++ b/src/assets/i18n/lt.json @@ -5004,7 +5004,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/lv.json b/src/assets/i18n/lv.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/lv.json +++ b/src/assets/i18n/lv.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/mk.json b/src/assets/i18n/mk.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/mk.json +++ b/src/assets/i18n/mk.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/ml.json b/src/assets/i18n/ml.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/ml.json +++ b/src/assets/i18n/ml.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/mn.json b/src/assets/i18n/mn.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/mn.json +++ b/src/assets/i18n/mn.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/mr.json b/src/assets/i18n/mr.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/mr.json +++ b/src/assets/i18n/mr.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/my.json b/src/assets/i18n/my.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/my.json +++ b/src/assets/i18n/my.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/nb.json b/src/assets/i18n/nb.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/nb.json +++ b/src/assets/i18n/nb.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/ne.json b/src/assets/i18n/ne.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/ne.json +++ b/src/assets/i18n/ne.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/nl.json b/src/assets/i18n/nl.json index 9616a1b6428..d23d1c2c2d9 100644 --- a/src/assets/i18n/nl.json +++ b/src/assets/i18n/nl.json @@ -14,7 +14,7 @@ "Use current port": "", "Virtualization (Old)": "", "Virtualization Method": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "You are about to delete the target \"{name}\".": "", "You are about to delete the target \"{name}\". You may also choose to delete all extents associated with this target. Note the volumes will not be deleted with the extents.": "", "You can select multiple items with the Ctrl and Shift keys.": "", diff --git a/src/assets/i18n/nn.json b/src/assets/i18n/nn.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/nn.json +++ b/src/assets/i18n/nn.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/os.json b/src/assets/i18n/os.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/os.json +++ b/src/assets/i18n/os.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/pa.json b/src/assets/i18n/pa.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/pa.json +++ b/src/assets/i18n/pa.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/pl.json b/src/assets/i18n/pl.json index 27c3821c720..dffc179f7dd 100644 --- a/src/assets/i18n/pl.json +++ b/src/assets/i18n/pl.json @@ -4936,7 +4936,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/pt-br.json b/src/assets/i18n/pt-br.json index e31fae75039..f3562ad50cd 100644 --- a/src/assets/i18n/pt-br.json +++ b/src/assets/i18n/pt-br.json @@ -4954,7 +4954,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/pt.json b/src/assets/i18n/pt.json index fe11df70117..e15aaa566c4 100644 --- a/src/assets/i18n/pt.json +++ b/src/assets/i18n/pt.json @@ -3231,7 +3231,7 @@ "Wait to start VM until SPICE client connects.": "", "Waiting for standby controller": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/ro.json b/src/assets/i18n/ro.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/ro.json +++ b/src/assets/i18n/ro.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/ru.json b/src/assets/i18n/ru.json index 19a81dbf56e..74643729e91 100644 --- a/src/assets/i18n/ru.json +++ b/src/assets/i18n/ru.json @@ -3337,7 +3337,7 @@ "Waiting for standby controller": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/sk.json b/src/assets/i18n/sk.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/sk.json +++ b/src/assets/i18n/sk.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/sl.json b/src/assets/i18n/sl.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/sl.json +++ b/src/assets/i18n/sl.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/sq.json b/src/assets/i18n/sq.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/sq.json +++ b/src/assets/i18n/sq.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/sr-latn.json b/src/assets/i18n/sr-latn.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/sr-latn.json +++ b/src/assets/i18n/sr-latn.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/sr.json b/src/assets/i18n/sr.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/sr.json +++ b/src/assets/i18n/sr.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/strings.json b/src/assets/i18n/strings.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/strings.json +++ b/src/assets/i18n/strings.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/sv.json b/src/assets/i18n/sv.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/sv.json +++ b/src/assets/i18n/sv.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/sw.json b/src/assets/i18n/sw.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/sw.json +++ b/src/assets/i18n/sw.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/ta.json b/src/assets/i18n/ta.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/ta.json +++ b/src/assets/i18n/ta.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/te.json b/src/assets/i18n/te.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/te.json +++ b/src/assets/i18n/te.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/th.json b/src/assets/i18n/th.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/th.json +++ b/src/assets/i18n/th.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/tr.json +++ b/src/assets/i18n/tr.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/tt.json b/src/assets/i18n/tt.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/tt.json +++ b/src/assets/i18n/tt.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/udm.json b/src/assets/i18n/udm.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/udm.json +++ b/src/assets/i18n/udm.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/uk.json b/src/assets/i18n/uk.json index 3862fee8975..78a6895e17a 100644 --- a/src/assets/i18n/uk.json +++ b/src/assets/i18n/uk.json @@ -2051,7 +2051,7 @@ "Wait to start VM until SPICE client connects.": "", "Waiting for standby controller": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/vi.json b/src/assets/i18n/vi.json index b1f680347a8..f892bac8c7e 100644 --- a/src/assets/i18n/vi.json +++ b/src/assets/i18n/vi.json @@ -5013,7 +5013,7 @@ "Warning": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", diff --git a/src/assets/i18n/zh-hans.json b/src/assets/i18n/zh-hans.json index b7bc31bbfce..fcf5f78c356 100644 --- a/src/assets/i18n/zh-hans.json +++ b/src/assets/i18n/zh-hans.json @@ -5045,7 +5045,7 @@ "Warning": "警告", "Warning!": "警告!", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "警告:调试可能包含带有个人信息的日志文件,例如用户名或有关您的系统的其他识别信息。请在与其他人分享日志之前编辑任何敏感信息。", - "Warning: iSCSI Target is currently in use.
": "警告:iSCSI目标当前正被使用。
", + "Warning: iSCSI Target is currently in use.": "警告:iSCSI目标当前正被使用。", "Warning: {n} of {total} boot environments could not be deleted.": "警告: {n} 个启动环境无法被删除,共处理 {total} 个启动环境。", "Warning: {n} of {total} docker images could not be deleted.": "警告:{n} 个 docker 镜像无法被删除,共处理 {total} 个 docker 镜像。", "Warning: {n} of {total} snapshots could not be deleted.": "警告:{n} 个快照无法被删除,共处理 {total} 个快照。", diff --git a/src/assets/i18n/zh-hant.json b/src/assets/i18n/zh-hant.json index bbc8d2667b0..bb9fb45f9f6 100644 --- a/src/assets/i18n/zh-hant.json +++ b/src/assets/i18n/zh-hant.json @@ -3442,7 +3442,7 @@ "Waiting for standby controller": "", "Warning!": "", "Warning: Debugs may contain log files with personal information such as usernames or other identifying information about your system. Please review debugs and redact any sensitive information before sharing with external entities.": "", - "Warning: iSCSI Target is currently in use.
": "", + "Warning: iSCSI Target is currently in use.": "", "Warning: {n} of {total} boot environments could not be deleted.": "", "Warning: {n} of {total} docker images could not be deleted.": "", "Warning: {n} of {total} snapshots could not be deleted.": "", From 591cf5dd8db658b264ea82274667e079083e9ec7 Mon Sep 17 00:00:00 2001 From: ken1010533 <104290713+ken1010533@users.noreply.github.com> Date: Tue, 7 Jan 2025 22:01:51 +0800 Subject: [PATCH 21/32] Update zh-hant.json (#11298) --- src/assets/i18n/zh-hant.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/assets/i18n/zh-hant.json b/src/assets/i18n/zh-hant.json index bb9fb45f9f6..406aaaa9584 100644 --- a/src/assets/i18n/zh-hant.json +++ b/src/assets/i18n/zh-hant.json @@ -1,23 +1,23 @@ { "": "", - "\n It looks like your session has been inactive for more than {lifetime} seconds.
\n For security reasons we will log you out at {time}.\n ": "", - " bytes.": "", - "\"Power On Hours\" are how many hours have passed while the disk has been powered on. \"Power On Hours Ago\" is how many power on hours have passed since each test.": "", - "...": "", - "... Make sure the TrueNAS system is powered on and connected to the network.": "", - "AWS resources in a geographic area. Leave empty to automatically detect the correct public region for the bucket. Entering a private region name allows interacting with Amazon buckets created in that region. For example, enter us-gov-east-1 to discover buckets created in the eastern AWS GovCloud region.": "", + "\n It looks like your session has been inactive for more than {lifetime} seconds.
\n For security reasons we will log you out at {time}.\n ": "\n 您的連線已閒置超過 {lifetime} 秒.
\n 為了安全,我們將在 {time} 秒登出您.\n ", + " bytes.": "位元組", + "\"Power On Hours\" are how many hours have passed while the disk has been powered on. \"Power On Hours Ago\" is how many power on hours have passed since each test.": "\"Power On Hours\" 表示磁碟通電運行的總時數. \"Power On Hours Ago\" 是指自每次測試以來經過的通電時數.", + "...": "...", + "... Make sure the TrueNAS system is powered on and connected to the network.": "...請確保 TrueNAS 系統已開機並連接到網路", + "AWS resources in a geographic area. Leave empty to automatically detect the correct public region for the bucket. Entering a private region name allows interacting with Amazon buckets created in that region. For example, enter us-gov-east0 to discover buckets created in the eastern AWS GovCloud region.": "", "pCloud Access Token. These tokens can expire and require extension.": "", "Authentication protocol used to authenticate messages sent on behalf of the specified Username.": "", "Encryption protocol used to encrypt messages sent on behalf of the specified Username.": "", "Extended attributes are preserved, but must be supported by both systems.": "", " TrueNAS Forums - Find answers from other users in the forums.": "", - "Transport Protocol for the remote system log server connection. Choosing Transport Layer Security (TLS) also requires selecting a preconfigured system Certificate.": "", - "Backblaze B2 Application Key. To generate a new application key, log in to the Backblaze account, go to the App Keys page, and add a new application key. Copy the applicationKey string to this field.": "", + "Transport Protocol for the remote system log server connection. Choosing Transport Layer Security (TLS) also requires selecting a preconfigured system Certificate.": "", + "Backblaze B2 Application Key. To generate a new application key, log in to the Backblaze account, go to the App Keys page, and add a new application key. Copy the applicationKey string to this field.": "", " TrueNAS Licensing - Learn more about enterprise-grade support.": "", " TrueNAS Documentation Hub - Read and contribute to the open-source documentation.": "", - "COPY: Files from the source are copied to the destination. If files with the same names are present on the destination, they are overwritten.": "", - "Copy & Paste
\n Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+C and Command+V. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.

\n Kill Process
\n Kill process shortcut is Ctrl+C.": "", - "MOVE: After files are copied from the source to the destination, they are deleted from the source. Files with the same names on the destination are overwritten.": "", + "COPY: Files from the source are copied to the destination. If files with the same names are present on the destination, they are overwritten.": "複製: 檔案會從來源 複製 到目的地. 如果目的地已存在同名檔案, 將會被 o覆蓋", + "Copy & Paste
\n Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+C and Command+V. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.

\n Kill Process
\n Kill process shortcut is Ctrl+C.": "複製與貼上(Copy & Paste)
\n Shell(終端) 中禁用了右鍵選單的複製和貼上的操作. Mac 的複製和貼上快捷鍵是 Command+CCommand+V. 對大多數的操作系統, 可以用 Ctrl+Insert 來複製和 Shift+Insert 來貼上.

\n 終止程序 (Kill Process)
\n 終止程序的快捷鍵是 Ctrl+C.", + "MOVE: After files are copied from the source to the destination, they are deleted from the source. Files with the same names on the destination are overwritten.": "移動 (MOVE): 檔案會先從來源 複製 到目的地, 然後再從來源 刪除 目的地中同名檔案將會被 覆蓋.", "SET will changes all destination datasets to readonly=on after finishing the replication.
REQUIRE stops replication unless all existing destination datasets to have the property readonly=on.
IGNORE disables checking the readonly property during replication.": "", "SYNC: Files on the destination are changed to match those on the source. If a file does not exist on the source, it is also deleted from the destination.": "", "WARNING: Rolling the dataset back destroys data on the dataset and can destroy additional snapshots that are related to the dataset. This can result in permanent data loss! Do not roll back until all desired data and snapshots are backed up.": "", @@ -5318,4 +5318,4 @@ "zstd-5 (slow)": "zstd-5 (較慢)", "zstd-7 (very slow)": "zstd-7 (非常慢)", "zstd-fast (default level, 1)": "zstd-fast (預設等級, 1)" -} \ No newline at end of file +} From 062c1bd1e26e429a13fa1694b4249801b5f5898b Mon Sep 17 00:00:00 2001 From: Lee Jihaeng <75159489+SejoWuigui@users.noreply.github.com> Date: Tue, 7 Jan 2025 23:02:39 +0900 Subject: [PATCH 22/32] Update ko.json (#11296) --- src/assets/i18n/ko.json | 420 ++++++++++++++++++++-------------------- 1 file changed, 210 insertions(+), 210 deletions(-) diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index 936c6627030..ba7c7e3a55f 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -1,114 +1,114 @@ { "": "", - "Any OS": "", - "Change Session Timeout in": "", - "Change from public to increase system security. Can only contain alphanumeric characters, underscores, dashes, periods, and spaces. This can be left empty for SNMPv3 networks.": "", - "Changes to Hosts Allow or Hosts Deny take effect when the SMB service restarts.": "", - "Changes to ACL type affect how on-disk ZFS ACL is written and read.\nWhen the ACL type is changed from POSIX to NFSv4, no migration is performed for default and access ACLs encoded in the posix1e acl extended attributes to native ZFS ACLs.\nWhen ACL type is changed from NFSv4 to POSIX, native ZFS ACLs are not converted to posix1e extended attributes, but the native ACL will be used internally by ZFS for access checks.\n\nThis means that the user must manually set new ACLs recursively on the dataset after ACL type changes in order to avoid unexpected permissions behavior.\n\nThis action will be destructive, and so it is advised to take a ZFS snapshot of the dataset prior to ACL type changes and permissions modifications.": "", - "Changing Advanced settings can be dangerous when done incorrectly. Please use caution before saving.": "", - "Changing dataset permission mode can severely affect existing permissions.": "", - "Changing global 2FA settings might cause user secrets to reset. Which means users will have to reconfigure their 2FA. Are you sure you want to continue?": "", - "Choose File for {label}": "", - "Choose a connection that has been saved in Credentials > Backup Credentials > SSH Connections.": "", - "Choose a location to store the installer image file.": "", - "Choose a new disk for the pool. To protect any existing data, adding the selected disk is stopped when the disk is already in use or has partitions present.": "", - "Choose a path to the user's home directory. If the directory exists and matches the username, it is set as the user's home directory. When the path does not end with a subdirectory matching the username, a new subdirectory is created only if the 'Create Home Directory' field is marked checked. The full path to the user's home directory is shown here when editing a user.": "", - "Choose a recent IP address to limit the usage when accessing the administrative GUI. The built-in HTTP server binds to the wildcard address of 0.0.0.0 (any address) and issues an alert if the specified address becomes unavailable.": "", - "Choose a recent IPv6 address to limit the usage when accessing the administrative GUI. The built-in HTTP server binds to the wildcard address of 0.0.0.0 (any address) and issues an alert if the specified address becomes unavailable.": "", - "Choose a safety level for the rollback action. The rollback is canceled when the safety check finds additional snapshots that are directly related to the dataset being rolled back.": "", - "Choose a saved SSH Keypair or select Generate New to create a new keypair and use it for this connection.": "", - "Choose a temporary location for the encryption key that will decrypt replicated data.": "", - "Choose a time format.": "", - "Choose an alert service to display options for that service.": "", - "Choose an encryption mode to use with LDAP.": "", - "Choose between Internal CA, Intermediate CA, and Import CA. An Internal CA functions like a publicly trusted CA to sign certificates for an internal network. They are not trusted outside the private network. An Intermediate CA lives between the root and end entity certificates and its main purpose is to define and authorize the types of certificates that can be requested from the root CA. Import CA allows an existing CA to be imported onto the system.
For more information see What are Subordinate CAs and Why Would You Want Your Own?": "", - "Choose between a Hex (base 16 numeral) or Passphrase (alphanumeric) style encryption key.": "", - "Choose how many log entries to create. Choices range from the least log entries (Emergency) to the most (Debug).": "", - "Choose one of the presets or choose Custom to use the advanced scheduler.": "", - "Choose one of the presets or select Custom to open the advanced scheduler.": "", - "Choose the backend to map Windows security identifiers (SIDs) to UNIX UIDs and GIDs. Click Edit to configure that backend.": "", - "Choose the hour and minute when new resilver tasks are not allowed to start. This does not affect active resilver tasks.": "", - "Choose the hour and minute when resilver tasks can be started.": "", - "Choose the platform that will use this share. The associated options are applied to this share.": "", - "Choose the schema to use when querying AD for user/group info. rfc2307 uses the schema support included in Windows 2003 R2, sfu is for Service For Unix 3.0 or 3.5, and sfu20 is for Service For Unix 2.0.": "", - "Choose the schema to use with LDAP authentication for SMB shares. The LDAP server must be configured with Samba attributes to use a Samba Schema. Options include RFC2307 (included in Windows 2003 R2) and Service for Unix (SFU). For SFU 3.0 or 3.5, choose \"SFU\". For SFU 2.0, choose \"SFU20\".": "", - "Choose the speed in bps used by the serial port.": "", - "Choose the test type. See smartctl(8) for descriptions of each type. Some types will degrade performance or take disks offline. Avoid scheduling S.M.A.R.T. tests simultaneously with scrub or resilver operations.": "", - "Choose the type of interface. Bridge creates a logical link between multiple networks. Link Aggregation combines multiple network connections into a single interface. A Virtual LAN (VLAN) partitions and isolates a segment of the connection. Read-only when editing an interface.": "", - "Choose the type of permissions. Basic shows general permissions. Advanced shows each specific type of permission for finer control.": "", - "Choose the type that matches the type of client accessing the pool/dataset.": "", - "Choose to connect using either SSH private key stored in user's home directory or SSH connection from the keychain": "", - "Choose to either use a custom-defined remote module of the rsync server or to use an SSH configuration for the rsync task.": "", - "Choose when the UPS initiates shutdown.": "", - "Choosing an entry loads a preset ACL that is configured to match general permissions situations.": "", - "Classification for each S3 object. Choose a class based on the specific use case or performance requirements. See Amazon S3 Storage Classes for more information.": "", - "Click \"Add\" to specify NFS client hosts for this share. If both networks and hosts are empty the share will be exported to everyone.": "", - "Click \"Add\" to specify NFS client network ranges for this share. If both networks and hosts are empty the share will be exported to everyone.": "", - "Clicking Continue allows TrueNAS to finish the update in the background while Abort stops the process and reverts the dataset ACL to the previously active ACL.": "", - "Combine multiple, critical-for-failover interfaces into a group. Groups apply to single systems. A failover occurs when every interface in the group fails. Groups with a single interface trigger a failover when that interface fails. Configuring the system to failover when any interface fails requires marking each interface as critical and placing them in separate groups.": "", - "Connect using:": "", - "Content Commitment": "", - "Enter a list of chat IDs separated by space, comma or semicolon. To find your chat ID send a message to the bot, group or channel and visit https://api.telegram.org/bot(BOT_TOKEN)/getUpdates.": "", - "Enter a list of denied hostnames or IP addresses. Separate entries by pressing Enter. If neither *Hosts Allow* or *Hosts Deny* contains an entry, then SMB share access is allowed for any host.

If there is a *Hosts Allow* list but no *Hosts Deny* list, then only allow hosts on the *Hosts Allow* list.

If there is a *Hosts Deny* list but no *Hosts Allow* list, then allow all hosts that are not on the *Hosts Deny* list.

If there is both a *Hosts Allow* and *Hosts Deny* list, then allow all hosts that are on the *Hosts Allow* list.

If there is a host not on the *Hosts Allow* and not on the *Hosts Deny* list, then allow it.": "", - "Enter a long string of random characters for use as salt for the encryption password. Warning: Always securely back up the encryption salt value! Losing the salt value will result in data loss.": "", - "Enter a name for the interface. Use the format bondX, vlanX, or brX where X is a number representing a non-parent interface. Read-only when editing an interface.": "", - "Enter a name for this Keytab.": "", - "Enter a number of degrees in Celsius. S.M.A.R.T. reports if the temperature of a drive has changed by N degrees Celsius since the last report.": "", - "Enter a number of seconds to wait before alerting that the service cannot reach any UPS. Warnings continue until the situation is fixed.": "", - "Enter a one to three paragraph summary of the issue. Describe the problem and provide any steps to replicate the issue.": "", - "Enter a password for the rancher user. This is used to log in to the VM from the serial shell.": "", - "Enter a password for the SPICE display.": "", - "Enter a port to bind rpc.lockd(8).": "", - "Enter a port to bind mountd(8).": "", - "Enter a port to bind rpc.statd(8).": "", - "Enter a shell glob pattern to match files and directories to exclude from the backup.": "", - "Enter a value in seconds for the the UPS to wait before initiating shutdown. Shutdown will not occur if power is restored while the timer is counting down. This value only applies when Shutdown mode is set to UPS goes on battery.": "", - "Enter a value to use for the sysctl variable.": "", - "Enter additional smb.conf options. See the Samba Guide for more information on these settings.
To log more details when a client attempts to authenticate to the share, add log level = 1, auth_audit:5.": "", - "Error details for ": "", - "Front": "", - "Hot Spare": "", - "Hottest": "", - "Linux Only": "", - "Long": "", - "Name ~ \"admin\"": "", - "Networking": "", - "OpenStack Swift": "", - "Opened at": "", - "Other Execute": "", - "PULL": "", - "PUSH": "", - "Pin vcpus": "", - "Power On Hours Ago": "", - "Prototyping": "", + "Any OS": "모든 OS", + "Change Session Timeout in": "세션 제한시간 변경:", + "Change from public to increase system security. Can only contain alphanumeric characters, underscores, dashes, periods, and spaces. This can be left empty for SNMPv3 networks.": "시스템 보안을 강화하기 위해 공개 상태에서 변경합니다. 영문자와 숫자, 밑줄, 대시, 마침표, 공백만 포함할 수 있습니다. SNMPv3 네트워크의 경우 비워둘 수 있습니다.", + "Changes to Hosts Allow or Hosts Deny take effect when the SMB service restarts.": "허용한 호스트 또는 거부한 호스트의 변경사항은 SMB 서비스를 재시작해야 적용됩니다.", + "Changes to ACL type affect how on-disk ZFS ACL is written and read.\nWhen the ACL type is changed from POSIX to NFSv4, no migration is performed for default and access ACLs encoded in the posix1e acl extended attributes to native ZFS ACLs.\nWhen ACL type is changed from NFSv4 to POSIX, native ZFS ACLs are not converted to posix1e extended attributes, but the native ACL will be used internally by ZFS for access checks.\n\nThis means that the user must manually set new ACLs recursively on the dataset after ACL type changes in order to avoid unexpected permissions behavior.\n\nThis action will be destructive, and so it is advised to take a ZFS snapshot of the dataset prior to ACL type changes and permissions modifications.": "ACL 유형을 변경하면 디스크상의 ZFS ACL을 작성하고 읽는 방식도 영향을 받습니다.\n ACL 유형을 POSIX에서 NFSv4로 변경하면, posix1e ACL 확장 속성에 인코딩된 기본 ACL 및 액세스 ACL을 네이티브 ZFS ACL로 마이그레이션하지 않습니다.\n ACL 유형을 NFSv4에서 POSIX로 변경하면, 네이티브 ZFS ACL을 posix1e 확장 속성으로 변환하지 않고 ZFS는 내부적으로 네이티브 ACL을 접근 검사를 위해 사용합니다.\n\n 즉, 예상치 못한 권한 동작을 방지하려면, ACL 유형을 변경한 후 사용자가 데이터셋에 대해 새로운 ACL을 직접 하위항목까지 설정해야 합니다.\n\n 이 작업은 파괴적이므로, ACL 유형을 변경하고 권한을 편집하기 전에 데이터셋의 ZFS 스냅샷을 만드는 것을 권장합니다.", + "Changing Advanced settings can be dangerous when done incorrectly. Please use caution before saving.": "고급설정은 올바르지 않게 설정할 경우 위험할 수 있습니다. 저장하기 전에 주의하시기 바랍니다.", + "Changing dataset permission mode can severely affect existing permissions.": "데이터셋의 권한 모드를 변경하면 기존 권한에 치명적인 영향을 미칠 수 있습니다.", + "Changing global 2FA settings might cause user secrets to reset. Which means users will have to reconfigure their 2FA. Are you sure you want to continue?": "전역 2단계 인증 설정을 변경하면 사용자 시크릿이 재설정될 수 있습니다. 사용자는 각자의 2단계 인증을 다시 구성해야 합니다. 계속하시겠습니까?", + "Choose File for {label}": "{label}의 파일 선택", + "Choose a connection that has been saved in Credentials > Backup Credentials > SSH Connections.": "자격증명 > 백업 자격증명 > SSH 연결에 저장된 연결을 선택합니다.", + "Choose a location to store the installer image file.": "설치 이미지 파일을 저장할 위치를 선택합니다.", + "Choose a new disk for the pool. To protect any existing data, adding the selected disk is stopped when the disk is already in use or has partitions present.": "풀에 할당할 새로운 디스크를 선택합니다. 기존 데이터를 보호하기 위해, 디스크가 사용중이거나 파티션이 존재하는 경우 선택한 디스크의 추가를 멈춥니다.", + "Choose a path to the user's home directory. If the directory exists and matches the username, it is set as the user's home directory. When the path does not end with a subdirectory matching the username, a new subdirectory is created only if the 'Create Home Directory' field is marked checked. The full path to the user's home directory is shown here when editing a user.": "사용자의 홈 디렉터리 경로를 선택합니다. 디렉터리가 존재하고 사용자 이름과 일치하면, 해당 디렉터리는 사용자의 홈 디렉터리가 됩니다. 경로가 사용자 이름과 일치하는 하위 디렉터리로 끝나지 않으면, '홈 디렉터리 생성'을 선택했다면 새로운 디렉터리를 생성합니다. 사용자 홈 디렉터리의 전체 경로는 사용자를 수정할 때 이곳에 표시됩니다.", + "Choose a recent IP address to limit the usage when accessing the administrative GUI. The built-in HTTP server binds to the wildcard address of 0.0.0.0 (any address) and issues an alert if the specified address becomes unavailable.": "관리 GUI로 접근시 사용을 제한할 최근 IP 주소를 선택합니다. 내장된 HTTP 서버는 와일드카드 주소인 0.0.0.0(모든 주소)에 묶이고, 지정한 주소를 사용할 수 없는 경우 경고를 발행합니다.", + "Choose a recent IPv6 address to limit the usage when accessing the administrative GUI. The built-in HTTP server binds to the wildcard address of 0.0.0.0 (any address) and issues an alert if the specified address becomes unavailable.": "관리 GUI로 접근시 사용을 제한할 최근 IPv6 주소를 선택합니다. 내장된 HTTP 서버는 와일드카드 주소인 0.0.0.0(모든 주소)에 묶이고, 지정한 주소를 사용할 수 없는 경우 경고를 발행합니다.", + "Choose a safety level for the rollback action. The rollback is canceled when the safety check finds additional snapshots that are directly related to the dataset being rolled back.": "되돌리기 동작의 안전 수준을 선택합니다. 안전 검사에서 되돌리는 데이터셋과 직접적으로 연결된 추가 스냅샷을 발견할 경우 되돌리기 작업을 취소합니다.", + "Choose a saved SSH Keypair or select Generate New to create a new keypair and use it for this connection.": "저장된 SSH 키쌍을 선택하거나 새로 생성을 눌러 새로운 키쌍을 생성해 이 연결에 사용합니다.", + "Choose a temporary location for the encryption key that will decrypt replicated data.": "복제한 데이터를 복호화 할 암호화 키를 임시로 저장할 위치를 선택합니다.", + "Choose a time format.": "시간 형식을 선택합니다.", + "Choose an alert service to display options for that service.": "경고 서비스를 선택해 해당 서비스의 선택사항을 표시합니다.", + "Choose an encryption mode to use with LDAP.": "LDAP에 사용할 암호화 모드를 선택합니다.", + "Choose between Internal CA, Intermediate CA, and Import CA. An Internal CA functions like a publicly trusted CA to sign certificates for an internal network. They are not trusted outside the private network. An Intermediate CA lives between the root and end entity certificates and its main purpose is to define and authorize the types of certificates that can be requested from the root CA. Import CA allows an existing CA to be imported onto the system.
For more information see What are Subordinate CAs and Why Would You Want Your Own?": "내부 인증기관, 중간 인증기관, 또는 인증기관 불러오기 중에 선택합니다. 내부 인증기관은 공개된 신뢰할 수 있는 인증기관처럼 기능해 내부 네트워크를 위한 인증서에 서명합니다. 사설 네트워크 밖에선 신뢰되지 없습니다. 중간 인증기관은 루트 인증서와 개인 인증서 사이에 있으며, 주 목적은 루트 인증기관이 요구할 수 있는 인증서 유형을 정의하고 인증하는 것입니다. 인증기관 불러오기는 기존 인증기관을 시스템으로 불러옵니다.
자세한 내용은 하위 인증기관이란 무엇이고, 왜 자체 인증기관이 필요한가요?를 참고하시기 바랍니다.", + "Choose between a Hex (base 16 numeral) or Passphrase (alphanumeric) style encryption key.": "16진수(HEX) 또는 비밀구절(영문자, 숫자) 유형의 암호화 키를 선택합니다.", + "Choose how many log entries to create. Choices range from the least log entries (Emergency) to the most (Debug).": "기록 항목을 얼마나 많이 생성할지를 선택합니다. 범위는 가장 적은 것(긴급)부터 가장 많은 것(디버그)까지입니다.", + "Choose one of the presets or choose Custom to use the advanced scheduler.": "사전설정 중에 선택하거나 사용자 정의를 선택해 고급 일정구성을 사용합니다.", + "Choose one of the presets or select Custom to open the advanced scheduler.": "사전설정 중에 선택하거나 사용자 정의를 선택해 고급 일정구성을 엽니다.", + "Choose the backend to map Windows security identifiers (SIDs) to UNIX UIDs and GIDs. Click Edit to configure that backend.": "Windows 보안 식별자(SID)를 유닉스 UID 및 GID에 연결할 백엔드를 선택합니다. 수정을 눌러 백엔드를 구성할 수 있습니다.", + "Choose the hour and minute when new resilver tasks are not allowed to start. This does not affect active resilver tasks.": "새로운 리실버 작업을 시작하지 않을 시간(시, 분)을 선택합니다. 활성화된 리실버 작업에는 영향을 미치지 않습니다.", + "Choose the hour and minute when resilver tasks can be started.": "리실버 작업을 시작할 수 있는 시간(시, 분)을 선택합니다.", + "Choose the platform that will use this share. The associated options are applied to this share.": "이 공유를 사용할 플랫폼을 선택합니다. 연결된 선택사항이 이 공유에 적용됩니다.", + "Choose the schema to use when querying AD for user/group info. rfc2307 uses the schema support included in Windows 2003 R2, sfu is for Service For Unix 3.0 or 3.5, and sfu20 is for Service For Unix 2.0.": "AD에서 사용자/그룹 정보를 요청할 때 사용할 방식을 선택합니다. rfc2307은 Windows 2003 R2에 포함된 방식 지원용, sfu는 Service for Unix 3.0 또는 3.5 용, sfu20은 Service for Unix 2.0 용입니다.", + "Choose the schema to use with LDAP authentication for SMB shares. The LDAP server must be configured with Samba attributes to use a Samba Schema. Options include RFC2307 (included in Windows 2003 R2) and Service for Unix (SFU). For SFU 3.0 or 3.5, choose \"SFU\". For SFU 2.0, choose \"SFU20\".": "SMB 공유에서 LDAP 인증에 사용할 방식을 선택합니다. LDAP 서버가 Samba 방식을 사용하려면 반드신 Samba 속성으로 구성되어야 합니다. 선택사항은 RFC2307(Windows 2003 R2에 포함)과 Service for Unix(SFU)입니다. SFU 3.0 또는 3.5를 위해선 \"SFU\"를 선택합니다. SFU 2.0을 위해선 \"SFU20\"을 선택합니다.", + "Choose the speed in bps used by the serial port.": "시리얼 포트의 속도(bps)를 선택합니다.", + "Choose the test type. See smartctl(8) for descriptions of each type. Some types will degrade performance or take disks offline. Avoid scheduling S.M.A.R.T. tests simultaneously with scrub or resilver operations.": "검사 유형을 선택합니다. 각 유형의 설명은 smartctl(8)을(를) 참고하십시오. 어떤 유형은 성능을 떨어뜨리거나 디스크를 오프라인 상태로 바꿉니다. S.M.A.R.T. 검사를 스트럽이나 리실버 작업과 동시에 진행하지 마십시오.", + "Choose the type of interface. Bridge creates a logical link between multiple networks. Link Aggregation combines multiple network connections into a single interface. A Virtual LAN (VLAN) partitions and isolates a segment of the connection. Read-only when editing an interface.": "인터페이스의 유형을 선택합니다. 브리지는 여러 네트워크 사이에 논리적 연결을 생성합니다. 링크 애그리게이션은 여러 네트워크 연결을 하나의 인터페이스로 조합합니다. 가상 랜(VLAN)은 각 연결을 분할하고 격리합니다. 인터페이스를 수정하는 중에는 읽기전용으로 바뀝니다.", + "Choose the type of permissions. Basic shows general permissions. Advanced shows each specific type of permission for finer control.": "권한 유형을 선택합니다. 기본은 일반적인 권한만 보여줍니다. 고급은 세부적인 조정을 위해 구체적인 권한 유형을 보여줍니다.", + "Choose the type that matches the type of client accessing the pool/dataset.": "풀/데이터셋에 접근하려는 클라이언트의 유형과 일치하는 유형을 선택합니다.", + "Choose to connect using either SSH private key stored in user's home directory or SSH connection from the keychain": "연결에 사용자 홈 디렉터리에 저장된 SSH 개인 키를 사용할지 키체인의 SSH 연결을 사용할지 선택합니다.", + "Choose to either use a custom-defined remote module of the rsync server or to use an SSH configuration for the rsync task.": "Rsync 서버의 사용자 정의된 원격 모듈을 사용할지 Rsync 작업의 SSH 구성을 사용할지 선택합니다.", + "Choose when the UPS initiates shutdown.": "언제 UPS를 종료할지 선택합니다.", + "Choosing an entry loads a preset ACL that is configured to match general permissions situations.": "항목을 선택하면 일반적인 권한 상황에 맞추어 구성한 ACL 사전설정을 불러옵니다.", + "Classification for each S3 object. Choose a class based on the specific use case or performance requirements. See Amazon S3 Storage Classes for more information.": "각 S3 객체에 대한 분류입니다. 특정 사용 사례 또는 성능 요구 사항에 따라 단계를 선택합니다. 자세한 내용은 Amazon S3 Storage Classes을(를) 참고하십시오.", + "Click \"Add\" to specify NFS client hosts for this share. If both networks and hosts are empty the share will be exported to everyone.": "\"추가\"를 눌러 이 공유의 NFS 클라이언트 호스트를 지정합니다. 네트워크와 호스트가 모두 비어 있으면 공유가 모든 사용자에게 표시됩니다.", + "Click \"Add\" to specify NFS client network ranges for this share. If both networks and hosts are empty the share will be exported to everyone.": "\"추가\"를 눌러 이 공유의 NFS 클라이언트 네트워크 범위를 지정합니다. 네트워크와 호스트가 모두 비어 있으면 공유가 모든 사용자에게 표시됩니다.", + "Clicking Continue allows TrueNAS to finish the update in the background while Abort stops the process and reverts the dataset ACL to the previously active ACL.": "'계속'을 누르면 TrueNAS가 백그라운드에서 갱신을 완료하고, '중단'을 누르면 작업을 중지하고 데이터셋 ACL을(를) 이전 활성 ACL로 되돌립니다. ", + "Combine multiple, critical-for-failover interfaces into a group. Groups apply to single systems. A failover occurs when every interface in the group fails. Groups with a single interface trigger a failover when that interface fails. Configuring the system to failover when any interface fails requires marking each interface as critical and placing them in separate groups.": "장애조치시 중요 인터페이스를 포함한 여러 인터페이스를 그룹으로 묶습니다. 그룹은 단일 시스템에 적용됩니다. 그룹 내의 모든 인터페이스가 실패하면 장애조치를 실행합니다. 그룹에 하나의 인터페이스만 있는 경우 해당 인터페이스가 실패하면 장애조치를 실행합니다. 어떤 인터페이스에 장애가 발생했을 때 시스템이 장애조치를 실행하도록 구성하려면, 각 인터페이스를 중요로 표시하고 별도의 그룹으로 배치해야 합니다.", + "Connect using:": "다음을 사용하여 연결:", + "Content Commitment": "Content Commitment", + "Enter a list of chat IDs separated by space, comma or semicolon. To find your chat ID send a message to the bot, group or channel and visit https://api.telegram.org/bot(BOT_TOKEN)/getUpdates.": "공백 또는 쉼표, 쌍반점으로 구분한 채팅 ID의 목록을 입력합니다. 채팅 ID를 찾으려면 봇이나 그룹, 채널에 메시지를 보내고 https://api.telegram.org/bot(BOT_TOKEN)/getUpdates(으)로 방문합니다.", + "Enter a list of denied hostnames or IP addresses. Separate entries by pressing Enter. If neither *Hosts Allow* or *Hosts Deny* contains an entry, then SMB share access is allowed for any host.

If there is a *Hosts Allow* list but no *Hosts Deny* list, then only allow hosts on the *Hosts Allow* list.

If there is a *Hosts Deny* list but no *Hosts Allow* list, then allow all hosts that are not on the *Hosts Deny* list.

If there is both a *Hosts Allow* and *Hosts Deny* list, then allow all hosts that are on the *Hosts Allow* list.

If there is a host not on the *Hosts Allow* and not on the *Hosts Deny* list, then allow it.": "거부한 호스트 이름 또는 IP 주소의 목록을 입력합니다. Enter키를 눌러 항목을 구분합니다. *허용한 호스트* 또는 *거부한 호스트*에 항목이 없으면 SMB 공유는 모든 호스트의 접근을 허용합니다.

만약 *허용한 호스트* 목록은 있고 *거부한 호스트* 목록은 없으면, *허용한 호스트* 목록에 있는 호스트만 허용합니다.

만약 *거부한 호스트* 목록은 있고 *허용한 호스트* 목록은 없으면, *거부한 호스트* 목록에 있는 호스트를 제외한 모든 호스트를 허용합니다.

*허용한 호스트*과 *거부한 호스트*목록이 모두 있으면, *허용한 호스트* 목록에 있는 호스트만 허용합니다.

*허용한 호스트* 및 *거부한 호스트* 목록에 없는 호스트는 허용합니다.", + "Enter a long string of random characters for use as salt for the encryption password. Warning: Always securely back up the encryption salt value! Losing the salt value will result in data loss.": "암호화 비밀번호의 솔트(salt)로 사용할 긴 무작위 문자열을 입력합니다. 위험: 암호화 솔트 값은 안전하게 보관하십시오! 솔트 값을 잃으면 데이터도 잃습니다.", + "Enter a name for the interface. Use the format bondX, vlanX, or brX where X is a number representing a non-parent interface. Read-only when editing an interface.": "인터페이스의 이름을 입력합니다. bondX 또는 vlanX, brX 형식을 사용합니다. X는 상위 인터페이스가 아님을 나타내는 숫자입니다. 인터페이스를 수정하는 중에는 읽기전용으로 바뀝니다.", + "Enter a name for this Keytab.": "이 키탭의 이름을 입력합니다.", + "Enter a number of degrees in Celsius. S.M.A.R.T. reports if the temperature of a drive has changed by N degrees Celsius since the last report.": "섭씨 온도를 입력합니다. 드라이브의 온도가 마지막 보고로부터 섭씨 N도 이상 변화하면 S.M.A.R.T.에서 보고합니다.", + "Enter a number of seconds to wait before alerting that the service cannot reach any UPS. Warnings continue until the situation is fixed.": "서비스가 어떤 UPS에도 접근하지 못할 때, 경고하기까지 기다릴 시간(초)입니다. 상황이 해결될 때가지 경고는 계속됩니다.", + "Enter a one to three paragraph summary of the issue. Describe the problem and provide any steps to replicate the issue.": "해당 문제를 1~3문단으로 작성합니다. 문제에 대해 설명하고 재현 방법을 제공합니다.", + "Enter a password for the rancher user. This is used to log in to the VM from the serial shell.": "rancher 사용자의 비밀번호를 입력합니다. 시리얼 셸에서 가상머신으로 로그인할 때 사용됩니다.", + "Enter a password for the SPICE display.": "SPICE 화면의 비밀번호를 입력합니다.", + "Enter a port to bind rpc.lockd(8).": "rpc.lockd(8)에 연결할 포트를 입력합니다.", + "Enter a port to bind mountd(8).": "mountd(8)에 연결할 포트를 입력합니다.", + "Enter a port to bind rpc.statd(8).": "rpc.statd(8)에 연결할 포트를 입력합니다.", + "Enter a shell glob pattern to match files and directories to exclude from the backup.": "백업에서 제외할 파일과 디렉터리의 셸 글로브 패턴을 입력합니다.", + "Enter a value in seconds for the the UPS to wait before initiating shutdown. Shutdown will not occur if power is restored while the timer is counting down. This value only applies when Shutdown mode is set to UPS goes on battery.": "UPS가 종료하기 전에 기다릴 시간(초)입니다. 이 시간동안 전원이 복원되면 종료하지 않습니다. 이 값은 종료 모드UPS 배터리로 전환일 경우에만 적용됩니다.", + "Enter a value to use for the sysctl variable.": "사용할 sysctl 변수를 입력합니다.", + "Enter additional smb.conf options. See the Samba Guide for more information on these settings.
To log more details when a client attempts to authenticate to the share, add log level = 1, auth_audit:5.": "추가 smb.conf 선택사항을 입력합니다. 이 설정에 대한 자세한 내용은 Samba 안내서를 참고하십시오.
클라이언트가 공유로 인증을 시도할 때 더 상세한 기록을 남기려면 log level = 1, auth_audit:5을(를) 추가합니다.", + "Error details for ": "오류 상세: ", + "Front": "앞", + "Hot Spare": "대기중인 여분", + "Hottest": "최고온도", + "Linux Only": "리눅스 전용", + "Long": "Long", + "Name ~ \"admin\"": "Name ~ \"admin\"", + "Networking": "네트워크", + "OpenStack Swift": "OpenStack Swift", + "Opened at": "개시 시각", + "Other Execute": "기타 실행", + "PULL": "PULL", + "PUSH": "PUSH", + "Pin vcpus": "vCPU 핀", + "Power On Hours Ago": "검사 후 전원 인가 시간", + "Prototyping": "시제품", "Prune By": "", - "Pull": "", + "Pull": "Pull", "Pull Image": "", "Pulling...": "", - "Push": "", - "Quick": "", + "Push": "Push", + "Quick": "빠르게", "Quiet": "", - "Realm": "", - "Rear": "", - "Short": "", + "Realm": "영역", + "Rear": "뒤", + "Short": "Short", "Tail Lines": "", - "Thick": "", - "Unkeep": "", - "Until": "", - "Virtualization (Old)": "", - "Virtualization Method": "", + "Thick": "Thick", + "Unkeep": "유지하지 않음", + "Until": "만료일", + "Virtualization (Old)": "가상화 (예전)", + "Virtualization Method": "가상화 방식", "\n It looks like your session has been inactive for more than {lifetime} seconds.
\n For security reasons we will log you out at {time}.\n ": "세션의 비활성화 시간이 {lifetime}초를 넘었습니다.
보안을 위해 {time}에 로그아웃 되었습니다.", " Est. Usable Raw Capacity": " 사용 가능한 원시 용량 추정", " When the UPS Mode is set to slave. Enter the open network port number of the UPS Master system. The default port is 3493.": " UPS 모드슬레이브일 때, 마스터 UPS 시스템의 네트워크 포트 번호를 입력합니다. 기본 포트는 3493입니다.", " as of {dateTime}": " ({dateTime} 기준)", " bytes.": " 바이트입니다.", " seconds.": " 초입니다.", - "\"Power On Hours\" are how many hours have passed while the disk has been powered on. \"Power On Hours Ago\" is how many power on hours have passed since each test.": "\"Power On Hours\"은(는) 디스크에 전원이 인가된 시간입니다. \"Power On Hours Ago\"은(는) 각 검사 후 전원이 인가된 시간입니다.", + "\"Power On Hours\" are how many hours have passed while the disk has been powered on. \"Power On Hours Ago\" is how many power on hours have passed since each test.": "\"전원 인가 시간\"은 디스크에 전원이 인가된 시간입니다. \"검사 후 전원 인가 시간\"은 각 검사 후 전원이 인가된 시간입니다.", "% of all cores": "% (전체 코어) ", "'Hosts Allow' or 'Hosts Deny' has been set": "'허용한 호스트' 또는 '거부한 호스트' 설정됨", "'Hosts Allow' or 'Hosts Deny' has been updated": "'허용한 호스트' 또는 '거부한 호스트' 갱신함", "(24 Hours)": "(24시간제)", - "(Examples: 500 KiB, 500M, 2 TB)": "(예시: 500 KiB, 500M 2TB)", + "(Examples: 500 KiB, 500M, 2 TB)": "(예시: 500 KiB, 500M, 2TB)", "(No description)": "(설명 없음)", "(Optional)": "(선택사항)", "(Remove pool from database)": "(데이터베이스에서 풀 제거)", @@ -142,7 +142,7 @@ "6 months": "6개월", "6 months ago": "6개월 전", "S3 API endpoint URL. When using AWS, the endpoint field can be empty to use the default endpoint for the region, and available buckets are automatically fetched. Refer to the AWS Documentation for a list of Simple Storage Service Website Endpoints.": "S3 API 엔드포인트 URL입니다. AWS를 사용하는 경우 엔드포인트 값을 비워두면 해당 지역의 기본 엔드포인트를 사용하고, 사용 가능한 버킷은 자동으로 가져옵니다. AWS 문서를 통해 심플 스토리지 서비스 웹사이트 엔드포인트 목록을 참고하십시오.", - "AWS resources in a geographic area. Leave empty to automatically detect the correct public region for the bucket. Entering a private region name allows interacting with Amazon buckets created in that region. For example, enter us-gov-east-1 to discover buckets created in the eastern AWS GovCloud region.": "지리적 영역의 AWS 리소스입니다. 버킷의 올바른 공용 리전을 자동으로 감지하려면 비워두십시오. 개인 리전 이름을 입력하면 해당 리전에서 생성된 Amazon 버킷과 상호 작용할 수 있습니다. 예를 들어, 동쪽의 AWS GovCloud 리전에서 생성된 버킷을 찾으려면 us-gov-east-1을(를) 입력하십시오.", + "AWS resources in a geographic area. Leave empty to automatically detect the correct public region for the bucket. Entering a private region name allows interacting with Amazon buckets created in that region. For example, enter us-gov-east-1 to discover buckets created in the eastern AWS GovCloud region.": "지리적 영역의 AWS 리소스입니다. 버킷의 올바른 공용 리전을 자동으로 감지하려면 비워두십시오. 개인 리전 이름을 입력하면 해당 리전에서 생성된 Amazon 버킷과 상호 작용할 수 있습니다. 예를 들어, 동쪽의 AWS GovCloud 리전에서 생성된 버킷을 찾으려면 us-gov-east-1을(를) 입력합니다.", "Microsoft Azure account name.": "Microsoft Azure 계정 이름입니다.", "pCloud Access Token. These tokens can expire and require extension.": "pCloud 접근 토큰입니다. 이러한 토큰은 만료될 수 있으며 연장이 필요할 수 있습니다.", "Authentication protocol used to authenticate messages sent on behalf of the specified Username.": "사용자 이름을 대표하여 보낸 메시지를 인증하기 위해 사용되는 인증 프로토콜입니다.", @@ -173,7 +173,7 @@ "Certificate Signing Requests control when an external CA will issue (sign) the certificate. Typically used with ACME or other CAs that most popular browsers trust by default Import Certificate Signing Request lets you import an existing CSR onto the system. Typically used with ACME or internal CAs.": "인증서 서명 요청(Certificate Signing Requests)은 외부 인증기관이 인증서를 발급(서명)할 때 제어합니다. 보통 ACME 또는 다른 대부분의 인기 있는 브라우저가 기본적으로 신뢰하는 기타 인증기관과 함께 사용됩니다. 인증서 서명 요청 가져오기(Import Certificate Signing Request)를 사용하면 기존 CSR을 시스템에 가져올 수 있습니다. 보통 ACME 또는 내부 인증기관과 함께 사용됩니다.", "Device provides virtual storage access to zvols, zvol snapshots, or physical devices. File provides virtual storage access to a single file.": "장치(Device)는 zvol, zvol 스냅샷 또는 물리적 장치에 대한 가상 저장소 액세스를 제공합니다. 파일(File)은 단일 파일에 대한 가상 저장소 액세스를 제공합니다.", "Intel e82545 (e1000) emulates the same Intel Ethernet card. This provides compatibility with most operating systems. VirtIO provides better performance when the operating system installed in the VM supports VirtIO paravirtualized network drivers.": "Intel e82545 (e1000)은 동일한 인텔 이더넷 카드를 에뮬레이트합니다. 이는 대부분의 운영체제와 호환됩니다. VirtIO는 가상머신에 설치된 운영체제가 VirtIO paravirtualized 네트워크 드라이버를 지원할 경우 더 나은 성능을 제공합니다.", - "Internal Certificates use system-managed CAs for certificate issuance. Import Certificate lets you import an existing certificate onto the system.": "내부 인증서는 시스템 관리 CA를 사용하여 인증서 발급을 처리합니다. 인증서 가져오기는 기존 인증서를 시스템에 가져올 수 있게 합니다.", + "Internal Certificates use system-managed CAs for certificate issuance. Import Certificate lets you import an existing certificate onto the system.": "내부 인증서는 시스템 관리 CA를 사용하여 인증서 발급을 처리합니다. 인증서 불러오기는 기존 인증서를 시스템에 가져올 수 있게 합니다.", "PUSH sends data to cloud storage. PULL receives data from cloud storage. Changing the direction resets the Transfer Mode to COPY.": "PUSH는 데이터를 클라우드 저장소로 보냅니다. PULL은 클라우드 저장소에서 데이터를 받습니다. 방향을 변경하면 전송 모드가 COPY로 재설정됩니다.", "PUSH sends snapshots to a destination system.

PULL connects to a remote system and retrieves snapshots matching a Naming Schema.": "PUSH는 스냅샷을 대상 시스템으로 보냅니다.

PULL은 원격 시스템에 연결하고 이름 규칙과 일치하는 스냅샷을 찾습니다.", "Quick erases only the partitioning information on a disk without clearing other old data. Full with zeros overwrites the entire disk with zeros. Full with random data overwrites the entire disk with random binary data.": "Quick는 디스크의 파티션 정보만 삭제하고 다른 이전 데이터는 지우지 않습니다. Full with zeros는 디스크 전체를 0으로 덮어씁니다. Full with random data는 디스크 전체를 무작위 이진 데이터로 덮어씁니다.", @@ -287,7 +287,7 @@ "Add Cloud Backup": "클라우드 백업 추가", "Add Cloud Credential": "클라우드 자격증명 추가", "Add Cloud Sync Task": "클라우드 동기화 작업 추가", - "Add Container": "콘테이너 추가", + "Add Container": "컨테이너 추가", "Add Credential": "자격증명 추가", "Add Cron Job": "Cron 작업 추가", "Add Custom App": "사용자 앱 추가", @@ -360,8 +360,8 @@ "Add Widget": "위젯 추가", "Add Zvol": "ZVOL 추가", "Add a new bucket to your Storj account.": "Storj 계정에 새로운 버킷을 추가합니다.", - "Add any more sshd_config(5) options not covered in this screen. Enter one option per line. These options are case-sensitive. Misspellings can prevent the SSH service from starting.": "이 화면에서 다루지 않은 sshd_config(5) 옵션을 추가하십시오. 한 줄에 하나의 옵션을 입력하십시오. 이 옵션들은 대소문자를 구분합니다. 오타가 있으면 SSH 서비스가 시작되지 않을 수 있습니다.", - "Add any notes about this zvol.": "이 ZVOL에 대한 비고를 입력하십시오.", + "Add any more sshd_config(5) options not covered in this screen. Enter one option per line. These options are case-sensitive. Misspellings can prevent the SSH service from starting.": "이 화면에서 다루지 않은 sshd_config(5) 옵션을 추가하십시오. 한 줄에 하나의 옵션을 입력합니다. 이 옵션들은 대소문자를 구분합니다. 오타가 있으면 SSH 서비스가 시작되지 않을 수 있습니다.", + "Add any notes about this zvol.": "이 ZVOL에 대한 비고를 입력합니다.", "Add bucket": "버킷 추가", "Add catalog to system even if some trains are unhealthy.": "일부 구성요소에 문제가 있더라도 카탈로그를 시스템에 추가합니다.", "Add entry": "항목 추가", @@ -421,7 +421,7 @@ "Alert List Write": "경고 목록 쓰기", "Alert Services": "경고 서비스", "Alert Settings": "경고 설정", - "Alert service saved": "경고 서비스 저장됨", + "Alert service saved": "경고 서비스 저장함", "Alerts": "경고", "Alerts could not be loaded": "경고를 불러오지 못함", "Algorithm": "알고리듬", @@ -695,8 +695,8 @@ "Background (lowest)": "백그라운드 (가장 낮음)", "Backup": "백업", "Backup Config": "구성 백업", - "Backup Credential": "자격증명 백업", - "Backup Credentials": "자격증명 백업", + "Backup Credential": "백업 자격증명", + "Backup Credentials": "백업 자격증명", "Backup Tasks": "백업 작업", "Backup to Cloud or another TrueNAS via links below": "아래 링크를 통해 클라우드나 다른 TrueNAS에 백업", "Bandwidth": "대역폭", @@ -711,7 +711,7 @@ "Basic Constraints Config": "기본 제약사항 구성", "Basic Info": "기본 정보", "Basic Mode": "기본 모드", - "Basic Options": "기본 옵션", + "Basic Options": "기본 선택사항", "Basic Settings": "기본 설정", "Batch Operations": "일괄 작업", "Before updating, please read the release notes.": "업데이트하기 전에, 릴리스 노트를 읽으시기 바랍니다.", @@ -771,7 +771,7 @@ "Bulk actions": "일괄 동작", "Burst": "Burst", "By clicking the share creation checkbox below, a new share will be created on form submission with the default share settings Additionally, local TrueNAS users will have access to the resulting share and some more configuration options will be available.": "아래 공유 생성 선택상자를 누르면, 작성된 양식과 기본 공유 설정으로 새로운 공유를 생성하고, 로컬 TrueNAS 사용자는 생성된 공유에 접근할 수 있으며 몇가지 추가 선택사항을 구성할 수 있습니다.", - "By default, Samba uses a hashing algorithm for NTFS illegal characters. Enabling this option translates NTFS illegal characters to the Unicode private range.": "기본적으로 Samba는 NTFS 사용 금지 문자에 대해 해싱 알고리즘을 사용합니다. 이 옵션을 활성화 해 NTFS 사용 금지 문자를 유니코드 사용자 영역으로 변환합니다.", + "By default, Samba uses a hashing algorithm for NTFS illegal characters. Enabling this option translates NTFS illegal characters to the Unicode private range.": "기본적으로 Samba는 NTFS 사용 금지 문자에 대해 해싱 알고리즘을 사용합니다. 이 선택사항을 활성화 하면 NTFS 사용 금지 문자를 유니코드 사용자 영역으로 변환합니다.", "By default, the VM receives an auto-generated random MAC address. Enter a custom address into the field to override the default. Click Generate MAC Address to add a new randomized address into this field.": "기본적으로 VM에는 임의의 MAC 주소가 자동으로 부여됩니다. 이 필드에 사용자 정의 주소를 입력하여 기본값을 덮어쓸 수 있습니다. MAC 주소 생성을 눌러 임의의 주소를 생성할 수 있습니다.", "By snapshot creation time": "스냅샷 생성 시각으로", "CA": "인증기관(CA)", @@ -858,7 +858,7 @@ "Change log": "변경내역", "Change the default password to improve system security. The new password cannot contain a space or #.": "기본 비밀번호를 바꿔 시스템 보안을 향상시킵니다. 비밀번호는 공백이나 #을(를) 포함할 수 없습니다.", "Changelog": "변경내역", - "Changes Saved": "변경사항 저장됨", + "Changes Saved": "변경사항 저장함", "Changing to a nightly train is one-way. Changing back to a stable train is not supported! ": "개발자 버전으로의 전환은 되돌릴 수 없습니다. 안정 버전으로 돌아갈 수 없습니다!", "Channel": "채널", "Channel {n}": "채널 {n}", @@ -899,7 +899,7 @@ "Choose a privacy protocol.": "개인정보 보호 프로토콜을 선택합니다.", "Choose an authentication method.": "인증 방식을 선택하십시오.", "Choose container": "컨테이너 선택", - "Choose if the .zfs snapshot directory is Visible or Invisible on this dataset.": "이 데이터셋의 .zfs 스냅샷 디렉터리를 보임 또는 안 보임으로 설정합니다.", + "Choose if the .zfs snapshot directory is Visible or Invisible on this dataset.": "이 데이터셋의 .zfs 스냅샷 디렉터리를 보임 또는 숨김으로 설정합니다.", "Choose log": "기록 선택", "Choose pod": "파드 선택", "Choose the VM operating system type.": "가상머신 운영체제 유형을 선택합니다.", @@ -936,7 +936,7 @@ "Cloud Backup Write": "클라우드 백업 쓰기", "Cloud Backup «{name}» has started.": "클라우드 백업 «{name}»을(를) 시작했습니다.", "Cloud Credential": "클라우드 자격증명", - "Cloud Credentials": "클라우드 작업증명", + "Cloud Credentials": "클라우드 자격증명", "Cloud Sync": "클라우드 동기화 ", "Cloud Sync Read": "클라우드 동기화 읽기", "Cloud Sync Task": "클라우드 동기화 작업", @@ -1026,7 +1026,7 @@ "Connect Timeout": "연결 시간 제한", "Connect to TrueCommand Cloud": "TrueCommand 클라우드 연결", "Connected Initiators": "연결된 이니시에이터", - "Connected at": "연결 위치", + "Connected at": "연결 시각", "Connecting to TrueCommand": "TrueCommand 접속중", "Connecting to TrueNAS": "TrueNAS 접속중", "Connection Error": "연결 오류", @@ -1037,14 +1037,14 @@ "Console Menu": "콘솔 메뉴", "Console Settings": "콘솔 설정", "Contact": "연락처", - "Container": "콘테이너", - "Container ID": "콘테이너 ID", - "Container Images": "콘테이너 이미지", - "Container Logs": "콘테이너 기록", + "Container": "컨테이너", + "Container ID": "컨테이너 ID", + "Container Images": "컨테이너 이미지", + "Container Logs": "컨테이너 기록", "Container Read": "컨테이너 읽기", "Container Shell": "컨테이너 셸", "Container Write": "컨테이너 쓰기", - "Containers": "콘테이너", + "Containers": "컨테이너", "Contents of the uploaded Service Account JSON file.": "업로드한 서비스 계정 JSON 파일의 내용입니다.", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "셸에선 컨텍스트 메뉴의 복사와 붙여넣기를 사용할 수 없습니다. 복사와 붙여넣기의 Mac 단축키는 Command+cCommand+v입니다. 대부분의 운영체제는 Ctrl+Insert로 복사하고 Shift+Insert로 붙여넣을 수 있습니다.", "Continue": "계속", @@ -1205,7 +1205,7 @@ "Daily time range for the specific periodic snapshots to replicate, in 15 minute increments. Periodic snapshots created before the Begin time will not be included in the replication.": "복제할 특정 주기적 스냅샷의 일간 시간 범위를 15분 간격으로 지정합니다. 시작 시각보다 앞서 생성된 주기적 스냅샷은 복제작업에 포함하지 않습니다.", "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.": "복제할 특정 주기적 스냅샷의 일간 시간 범위를 15분 간격으로 지정합니다. 종료 시각보다 늦게 생성된 주기적 스냅샷은 복제작업에 포함하지 않습니다.", "Dashboard": "대시보드", - "Dashboard settings saved": "대시보드 설정 저장됨", + "Dashboard settings saved": "대시보드 설정 저장함", "Data": "데이터", "Data Devices": "데이터 장치", "Data Encipherment": "데이터 암호화", @@ -1292,8 +1292,8 @@ "Define an alias that can connect to the interface on either TrueNAS controller. This address remains active if a Controller failover occurs.": "TrueNAS 컨트롤러의 인터페이스에 연결하는 별칭을 정의합니다. 이 주소는 컨트롤러 장애조치가 발생하더라도 활성화 상태를 유지합니다.", "Define the maximum number of chunks for a multipart upload. This can be useful if a service does not support the 10,000 chunk AWS S3 specification.": "멀티파트 업로드시 조각낼 최대 수량을 정의합니다. 서비스가 AWS S3 명세의 10,000개 조각을 지원하지 않을때 유용합니다.", "Define the number of UIDS/GIDS available per domain range. The minimum is 2000 and the recommended default is 100000.": "도메인 범위별 사용 가능한 UIDS/GIDS 수를 정의합니다. 최소값은 2000이고 권장하는 기본값은 100000입니다.", - "Define the path to a system location that has snapshots to replicate. Click the folder to see all locations on the source system or click in the field to manually type a location (Example: pool1/dataset1). Multiple source locations can be selected or manually defined with a comma (,) separator.": "스냅샷을 복제할 시스템 위치의 경로를 정의합니다. folder을(를) 눌러 원본 시스템의 모든 경로를 보거나 칸을 눌러 직접 입력할 수 있습니다(예시: pool1/dataset1). 복수의 원본 경로를 선택하거나 반점(,)으로 구분해 직접 정의할 수 있습니다.", - "Define the path to a system location that has snapshots to replicate. Click the folder to see all locations on the source system or click in the field to manually type a location (Example: pool1/dataset1). Multiple source locations can be selected or manually defined with a comma (,) separator.

Selecting a location displays the number of existing snapshots that can be replicated. Selecting a location that has no snapshots configures the replication task to take a manual snapshot of that location and replicate it to the destination.": "스냅샷을 복제할 시스템 위치의 경로를 정의합니다. folder을(를) 눌러 원본 시스템의 모든 경로를 보거나 칸을 눌러 직접 입력할 수 있습니다(예시: pool1/dataset1). 복수의 원본 경로를 선택하거나 반점(,)으로 구분해 직접 정의할 수 있습니다.

위치를 선택하면 복제 가능한 기존 스냅샷의 수를 확인할 수 잇습니다. 스냅샷이 없는 위치를 선택하면 복제 작업이 해당 위치의 스냅샷을 저장해 도착지로 복제하도록 구성합니다.", + "Define the path to a system location that has snapshots to replicate. Click the folder to see all locations on the source system or click in the field to manually type a location (Example: pool1/dataset1). Multiple source locations can be selected or manually defined with a comma (,) separator.": "스냅샷을 복제할 시스템 위치의 경로를 정의합니다. folder을(를) 눌러 원본 시스템의 모든 경로를 보거나 칸을 눌러 직접 입력할 수 있습니다(예시: pool1/dataset1). 복수의 원본 경로를 선택하거나 쉼표(,)로 구분해 직접 정의할 수 있습니다.", + "Define the path to a system location that has snapshots to replicate. Click the folder to see all locations on the source system or click in the field to manually type a location (Example: pool1/dataset1). Multiple source locations can be selected or manually defined with a comma (,) separator.

Selecting a location displays the number of existing snapshots that can be replicated. Selecting a location that has no snapshots configures the replication task to take a manual snapshot of that location and replicate it to the destination.": "스냅샷을 복제할 시스템 위치의 경로를 정의합니다. folder을(를) 눌러 원본 시스템의 모든 경로를 보거나 칸을 눌러 직접 입력할 수 있습니다(예시: pool1/dataset1). 복수의 원본 경로를 선택하거나 쉼표(,)로 구분해 직접 정의할 수 있습니다.

위치를 선택하면 복제 가능한 기존 스냅샷의 수를 확인할 수 잇습니다. 스냅샷이 없는 위치를 선택하면 복제 작업이 해당 위치의 스냅샷을 저장해 도착지로 복제하도록 구성합니다.", "Define the path to a system location that will store replicated snapshots. Click the folder to see all locations on the destination system or click in the field to manually type a location path (Example: pool1/dataset1). Selecting a location defines the full path to that location as the destination. Appending a name to the path will create new zvol at that location.

For example, selecting pool1/dataset1 will store snapshots in dataset1, but clicking the path and typing /zvol1 after dataset1 will create zvol1 for snapshot storage.": "스냅샷을 복제할 시스템 위치의 경로를 정의합니다. folder을(를) 눌러 원본 시스템의 모든 경로를 보거나 칸을 눌러 직접 입력할 수 있습니다(예시: pool1/dataset1). 위치를 선택하면 전체 경로를 도착지 경로로 정의합니다. 경로에 이름을 추가하면 해당 위치에 새로운 ZVOL을(를) 생성합니다.

예를 들어, pool1/dataset1을(를) 선택하면 스냅샷을 dataset1에 저장하지만, 경로 칸을 눌러 dataset1 뒤에 /zvol1을(를) 추가하면 스냅샷 저장소로 zvol1을(를) 생성합니다.", "Define the path to an existing zvol for VM use.": "가상머신이 사용할 ZVOL의 경로를 정의합니다.", "Define the server where all changes to the database are performed.": "모든 데이터베이스의 변경이 수행될 서버를 정의합니다.", @@ -1370,7 +1370,7 @@ "Deploying": "배포중", "Deregister": "해지", "Deregister TrueCommand Cloud Service": "TrueCommand 클라우드 서비스를 해지합니다.", - "Describe the UPS device. It can contain alphanumeric, period, comma, hyphen, and underscore characters.": "UPS 장치의 설명입니다. 영문자와 숫자, 온점, 반점, 하이픈, 밑줄 문자를 포함할 수 있습니다.", + "Describe the UPS device. It can contain alphanumeric, period, comma, hyphen, and underscore characters.": "UPS 장치의 설명입니다. 영문자와 숫자, 마침표, 쉼표, 하이픈, 밑줄 문자를 포함할 수 있습니다.", "Describe the scrub task.": "스크럽 작업을 설명합니다.", "Describe this service.": "이 서비스를 설명합니다.", "Description": "설명", @@ -1468,7 +1468,7 @@ "Disk device name.": "디스크 장치 이름입니다.", "Disk is unavailable": "디스크 사용할 수 없음", "Disk not attached to any pools.": "디스크가 풀에 탑재되지 않았습니다.", - "Disk saved": "디스크 저장됨", + "Disk saved": "디스크 저장함", "Disk settings successfully saved.": "디스크 설정을 성공적으로 저장했습니다.", "Disks": "디스크", "Disks Overview": "디스크 개요", @@ -1482,11 +1482,11 @@ "Dismiss All Alerts": "모든 경고 무시", "Dismissed": "무시됨", "Dispersal Strategy": "분산 전략", - "Display": "디스플레이", - "Display Login": "디스플레이 로그인", - "Display Port": "디스플레이 포트", + "Display": "화면", + "Display Login": "화면 로그인", + "Display Port": "화면 포트", "Display console messages in real time at the bottom of the browser.": "브라우저 하단에 실시간으로 콘솔 메시지를 표시합니다.", - "Distinguished Name": "고유 이름", + "Distinguished Name": "고유 이름(DN)", "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.": "윈도우를 개시자로 사용하는 경우 이 설정을 바꾸지 마십시오. 정확한 통계 보고를 위해 시스템이 특정 RPM을 사용하는 대규모 환경에서만 필요합니다.", "Do any of them look similar?": "비슷한 것이 있습니까?", @@ -1568,7 +1568,7 @@ "Edit Device": "장치 수정", "Edit Disk": "디스크 수정", "Edit Disk(s)": "디스크 수정", - "Edit Encryption Options for {dataset}": "{dataset}의 암호화 옵션 수정", + "Edit Encryption Options for {dataset}": "{dataset}의 암호화 선택사항 수정", "Edit Expansion Shelf": "확장 선반 수정", "Edit Extent": "익스텐트 수정", "Edit Filesystem ACL": "파일시스템 ACL 수정", @@ -1615,7 +1615,7 @@ "Element": "요소", "Elements": "요소", "Email": "이메일", - "Email Options": "이메일 옵션", + "Email Options": "이메일 선택사항", "Email Subject": "이메일 제목", "Email addresses must be entered in the format local-name@domain.com, with entries separated by pressing Enter.": "이메일 주소는 반드시 local-name@domain.com 형식으로 작성해야 하며, Enter키를 눌러 항목을 구분할 수 있습니다.", "Email addresses to receive copies of iXsystems Support messages about this issue. Use the format name@domain.com. Separate entries by pressing Enter.": "이 이슈에 대한 iXsystems 지원 메시지의 사본을 받을 이메일 주소입니다. name@domain.com 형식을 사용합니다. Enter키를 눌러 항목을 구분할 수 있습니다.", @@ -1635,7 +1635,7 @@ "Enable Apple SMB2/3 Protocol Extensions": "Apple SMB2/3 프로토콜 확장 활성화", "Enable Atime": "Atime 활성화", "Enable Debug Kernel": "커널 디버그 활성화", - "Enable Display": "디스플레이 활성화", + "Enable Display": "화면 활성화", "Enable FIPS": "FIPS 활성화", "Enable FSRVP": "FSRVP 활성화", "Enable FXP": "FXP 활성화", @@ -1689,7 +1689,7 @@ "Enabling Time Machine on an SMB share requires restarting the SMB service.": "SMB 공유를 통한 타임머신을 활성화하려면 SMB 서비스를 재시작해야 합니다.", "Enabling allows using a password to authenticate the SSH login. Warning: when directory services are enabled, allowing password authentication can grant access to all users imported by the directory service.
Disabling changes authentication to require keys for all users. This requires additional setup on both the SSH client and server.": "SSH 로그인 인증에 비밀번호를 사용할 수 있도록 허용합니다. 위험: 디렉터리 서비스가 활성화되어 있다면, 비밀번호 인증은 디렉터리 서비스에서 불러온 사용자에게 접근 권한을 부여합니다.
비활성화하면 모든 사용자의 인증에 키를 요구합니다. 이를 위해 SSH 클라이언트와 서버에 추가적인 설정이 필요합니다.", "Enabling redirect will require all URLs served from current host to be served via HTTPS regardless of port used. This may make some App portals inaccessible if they don't use HTTPS. Do you wish to continue?": "재연결을 활성화하면 현재 호스트가 제공하는 모든 URL이 포트에 상관없이 HTTPS로 연결됩니다. HTTPS를 사용하지 않는 앱 포털의 경우 접속이 불가할 수 있습니다. 계속하시겠습니까?", - "Enabling this option is not recommended as it bypasses a security mechanism.": "이 옵션은 보안 설정을 우회하므로 활성화를 권장하지 않습니다.", + "Enabling this option is not recommended as it bypasses a security mechanism.": "이 선택사항은 보안 설정을 우회하므로 활성화를 권장하지 않습니다.", "Encipher Only": "암호화 전용", "Enclosure": "인클로저", "Enclosure Options": "인클로저 선택사항", @@ -1697,7 +1697,7 @@ "Enclosure Services Controller Electronics": "인클로저 서비스 컨트롤러 전자장치(ESCE)", "Enclosure Unavailable": "인클로저 사용불가", "Enclosure Write": "인클로저 쓰기", - "Encode information in less space than the original data occupies. It is recommended to choose a compression algorithm that balances disk performance with the amount of saved space.
LZ4 is generally recommended as it maximizes performance and dynamically identifies the best files to compress.
GZIP options range from 1 for least compression, best performance, through 9 for maximum compression with greatest performance impact.
ZLE is a fast algorithm that only eliminates runs of zeroes.": "원본 데이터가 차지하는 공간보다 적은 공간에 정보를 부호화합니다. 디스크 성능과 공간 절약의 균형을 맞춘 압축 알고리듬을 선택하길 권장합니다.
LZ4은(는) 압축할 최적의 파일을 동적으로 파악해 성능을 극대화 해, 일반적으로 권장됩니다.
GZIP은(는) 압축률이 가장 낮고 성능기 가장 좋은 1부터, 압축률이 가장 높고 성능에 가장 큰 영향을 미치는 9까지 선택할 수 있습니다.
ZLE는 연속된 0만 제거하는 빠른 알고리듬입니다.", + "Encode information in less space than the original data occupies. It is recommended to choose a compression algorithm that balances disk performance with the amount of saved space.
LZ4 is generally recommended as it maximizes performance and dynamically identifies the best files to compress.
GZIP options range from 1 for least compression, best performance, through 9 for maximum compression with greatest performance impact.
ZLE is a fast algorithm that only eliminates runs of zeroes.": "원본 데이터가 차지하는 공간보다 적은 공간에 정보를 부호화합니다. 디스크 성능과 공간 절약의 균형을 맞춘 압축 알고리듬을 선택하길 권장합니다.
LZ4은(는) 압축할 최적의 파일을 동적으로 파악해 성능을 극대화 해, 일반적으로 권장됩니다.
GZIP은(는) 압축률이 가장 낮고 성능이 가장 좋은 1부터, 압축률이 가장 높고 성능에 가장 큰 영향을 미치는 9까지 선택할 수 있습니다.
ZLE는 연속된 0만 제거하는 빠른 알고리듬입니다.", "Encrypted Datasets": "암호화된 데이터셋", "Encryption": "암호화", "Encryption (more secure, but slower)": "암호화 (더 안전하지만, 더 느림)", @@ -1705,8 +1705,8 @@ "Encryption Key Format": "암호화 키 형식", "Encryption Key Location in Target System": "대상 시스템의 암호화 키 위치", "Encryption Mode": "암호화 모드", - "Encryption Options": "암호화 옵션", - "Encryption Options Saved": "암호화 옵션 저장됨", + "Encryption Options": "암호화 선택사항", + "Encryption Options Saved": "암호화 선택사항 저장함", "Encryption Password": "암호화 비밀번호", "Encryption Protocol": "암호화 프로토콜", "Encryption Root": "암호화 루트", @@ -1724,49 +1724,49 @@ "Endpoint URL": "엔드포인트 URL", "Endpoint type to choose from the service catalogue. Public is recommended, see the rclone documentation.": "서비스 카탈로그에서 엔드포인트 유형을 선택합니다. 권장값은 Public입니다. Rclone 문서를 참고하십시오.", "Enforce the use of FIPS 140-2 compliant algorithms": "FIPS 140-2 준수 알고리듬 사용 강제", - "Ensure Display Device": "출력 장치임", + "Ensure Display Device": "영상 출력 장치 확인", "Ensure that ACL permissions are validated for all users and groups. Disabling this may allow configurations that do not provide the intended access. It is recommended to keep this option enabled.": "ACL 권한이 모든 사용자와 그룹에 대해 검증되었는지 확인하십시오. 이를 비활성화하면 의도한 접근을 제공하지 않는 구성이 허용될 수 있습니다. 이 선택사항은 활성화하기를 권장합니다.", "Ensure valid entries exist in Directory Services > Kerberos Realms and Directory Services > Kerberos Keytabs and the system can communicate with the Kerberos Domain Controller before enabling this option.": "이 선택사항을 활성화하기 전에 검증된 항목이 디렉터리 서비스 > Kerberos 영역디렉터리 서비스 > Kerberos 키탭에 존재하고 시스템이 Kerberos 도메인 컨트롤러와 통신할 수 있는지 확인하십시오.", "Enter {pool} below to confirm": "{pool}을(를) 아래에 입력하여 승인", "Enter {zvolName} below to confirm.": "{zvolName}을(를) 아래에 입력하여 승인", "Enter a Name (optional)": "이름 입력 (선택사항)", "Enter a SPICE password to automatically pass to the SPICE session.": "SPICE 세션으로 자동으로 넘어가기 위해 SPICE 비밀번호를 입력합니다.", - "Enter a description of the Cloud Sync Task.": "클라우드 동기화 작업의 설명을 입력하십시오.", - "Enter a description of the cron job.": "Cron 작업의 설명을 입력하십시오.", - "Enter a description of the interface.": "인터페이스의 설명을 입력하십시오.", - "Enter a description of the rsync task.": "Rsync 작업의 설명을 입력하십시오.", - "Enter a description of the static route.": "정적 경로의 설명을 입력하십시오.", + "Enter a description of the Cloud Sync Task.": "클라우드 동기화 작업의 설명을 입력합니다.", + "Enter a description of the cron job.": "Cron 작업의 설명을 입력합니다.", + "Enter a description of the interface.": "인터페이스의 설명을 입력합니다.", + "Enter a description of the rsync task.": "Rsync 작업의 설명을 입력합니다.", + "Enter a description of the static route.": "정적 경로의 설명을 입력합니다.", "Enter a description of the tunable.": "튜너블의 설명을 입력합니다.", - "Enter a descriptive title for the new issue.": "새로운 이슈를 설명할 제목을 입력하십시오.", - "Enter a list of allowed hostnames or IP addresses. Separate entries by pressing Enter. A more detailed description with examples can be found here.

If neither *Hosts Allow* or *Hosts Deny* contains an entry, then SMB share access is allowed for any host.

If there is a *Hosts Allow* list but no *Hosts Deny* list, then only allow hosts on the *Hosts Allow* list.

If there is a *Hosts Deny* list but no *Hosts Allow* list, then allow all hosts that are not on the *Hosts Deny* list.

If there is both a *Hosts Allow* and *Hosts Deny* list, then allow all hosts that are on the *Hosts Allow* list.

If there is a host not on the *Hosts Allow* and not on the *Hosts Deny* list, then allow it.": "허용한 호스트 이름이나 IP 주소의 목록을 입력합니다. Enter키를 눌러 항목을 구분합니다. 예시를 포함한 상세한 설명은 이곳을 확인하십시오.

*허용한 호스트* 또는 *거부한 호스트*에 추가한 항목이 없으면, SMB 공유 접근은 모든 호스트에 허용됩니다.

만약 *허용한 호스트* 목록은 있고 *거부한 호스트* 목록이 없으면, *허용한 호스트* 목록에 있는 호스트만 허용합니다.

만약 *거부한 호스트* 목록은 있고 *허용한 호스트* 목록이 없으면, *거부한 호스트* 목록에 있는 호스트를 제외한 모든 호스트를 허용합니다.

*허용한 호스트*과 *거부한 호스트*목록이 모두 있으면, *허용한 호스트* 목록에 있는 호스트만 허용합니다.

*허용한 호스트*와 *거부한 호스트* 목록에 없는 호스트는 허용됩니다.", - "Enter a name for the new credential.": "새로운 자격증명의 이름을 입력하십시오.", - "Enter a name for the share.": "공유할 이름을 입력하십시오.", - "Enter a name of the TrueCloud Backup Task.": "TrueCloud 백업 작업의 이름을 입력하십시오.", + "Enter a descriptive title for the new issue.": "새로운 이슈를 설명할 제목을 입력합니다.", + "Enter a list of allowed hostnames or IP addresses. Separate entries by pressing Enter. A more detailed description with examples can be found here.

If neither *Hosts Allow* or *Hosts Deny* contains an entry, then SMB share access is allowed for any host.

If there is a *Hosts Allow* list but no *Hosts Deny* list, then only allow hosts on the *Hosts Allow* list.

If there is a *Hosts Deny* list but no *Hosts Allow* list, then allow all hosts that are not on the *Hosts Deny* list.

If there is both a *Hosts Allow* and *Hosts Deny* list, then allow all hosts that are on the *Hosts Allow* list.

If there is a host not on the *Hosts Allow* and not on the *Hosts Deny* list, then allow it.": "허용한 호스트 이름이나 IP 주소의 목록을 입력합니다. Enter키를 눌러 항목을 구분합니다. 예시를 포함한 상세한 설명은 이곳을 참고하십시오.

*허용한 호스트* 또는 *거부한 호스트*에 항목이 없으면 SMB 공유는 모든 호스트의 접근을 허용합니다.

만약 *허용한 호스트* 목록은 있고 *거부한 호스트* 목록은 없으면, *허용한 호스트* 목록에 있는 호스트만 허용합니다.

만약 *거부한 호스트* 목록은 있고 *허용한 호스트* 목록은 없으면, *거부한 호스트* 목록에 있는 호스트를 제외한 모든 호스트를 허용합니다.

*허용한 호스트*과 *거부한 호스트*목록이 모두 있으면, *허용한 호스트* 목록에 있는 호스트만 허용합니다.

*허용한 호스트* 및 *거부한 호스트* 목록에 없는 호스트는 허용합니다.", + "Enter a name for the new credential.": "새로운 자격증명의 이름을 입력합니다.", + "Enter a name for the share.": "공유할 이름을 입력합니다.", + "Enter a name of the TrueCloud Backup Task.": "TrueCloud 백업 작업의 이름을 입력합니다.", "Enter a password of at least eight characters.": "8자 이상의 비밀번호를 입력하십시오.", - "Enter a separate privacy passphrase. Password is used when this is left empty.": "별도의 개인 비밀구절을 입력하십시오. 비워두면 비밀번호를 사용합니다.", + "Enter a separate privacy passphrase. Password is used when this is left empty.": "별도의 개인 비밀구절을 입력합니다. 비워두면 비밀번호를 사용합니다.", "Enter a threshold temperature in Celsius. S.M.A.R.T. will message with a log level of LOG_CRIT and send an email if the temperature is higher than the threshold.": "임계 온도를 섭씨로 입력합니다. 이 값보다 온도가 높을 경우 S.M.A.R.T.에서 LOG_CRIT로 보고하며 이메일을 발송합니다.", "Enter a threshold temperature in Celsius. S.M.A.R.T. will message with a log level of LOG_INFO if the temperature is higher than the threshold.": "임계 온도를 섭씨로 입력합니다. 이 값보다 온도가 높을 경우 S.M.A.R.T.에서 LOG_INFO로 보고합니다.", "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.": "데이터셋의 고유한 이름을 입력합니다. 데이터셋 이름의 길이는 이 값과 상위 경로 값에 길이를 더해 계산합니다. '상위 경로'와 '이름'의 길이를 더해서 200자를 넘을 수 없습니다. 그렇기에 이 값의 검증은 상위 경로도 고려합니다. 거기에 최대 디렉터리 깊이는 50단계입니다. 상위 경로의 중첩 수준을 고려하면 디렉터리 계층이 51번째 단계인 데이터 세트는 만들 수 없습니다.", - "Enter a user to associate with this service. Keeping the default is recommended.": "이 서비스와 연결할 사용자를 입력하십시오. 기본값을 유지하길 권장합니다.", - "Enter a username to register with this service.": "이 서비스에 등록할 사용자 이름을 입력하십시오.", - "Enter a valid IPv4 address.": "올바른 IPv4 주소를 입력하십시오.", + "Enter a user to associate with this service. Keeping the default is recommended.": "이 서비스와 연결할 사용자를 입력합니다. 기본값을 유지하길 권장합니다.", + "Enter a username to register with this service.": "이 서비스에 등록할 사용자 이름을 입력합니다.", + "Enter a valid IPv4 address.": "유효한 IPv4 주소를 입력합니다.", "Enter accounts that have administrative access. See upsd.users(5) for examples.": "관리를 위해 접근을 허용할 계정을 입력합니다. 예시는 upsd.users(5)을(를) 참고하십시오.", - "Enter an IPv4 address. This overrides the default gateway provided by DHCP.": "IPv4 주소를 입력하십시오. DHCP가 부여한 기본 게이트웨이를 대체합니다.", - "Enter an IPv6 address. This overrides the default gateway provided by DHCP.": "IPv6 주소를 입력하십시오. DHCP가 부여한 기본 게이트웨이를 대체합니다.", - "Enter an alphanumeric encryption key. Only available when Passphrase is the chosen key format.": "영문자와 숫자로 구성된 암호화 키를 입력하십시오. 키 형식을 비밀구절로 선택했을 때만 사용됩니다.", - "Enter an alphanumeric name for the certificate. Underscore (_), and dash (-) characters are allowed.": "영문자와 숫자로 구성된 인증서의 이름을 입력하십시오. 밑줄(_)과 대시(-) 문자도 사용할 수 있습니다.", - "Enter an alphanumeric name for the virtual machine.": "영문자와 숫자로 구성된 가상머신의 이름을 입력하십시오.", - "Enter an email address to override the admin account’s default email. If left blank, the admin account’s email address will be used": "관리자 계정의 기본 이메일을 대체할 이메일 주소를 입력하십시오. 비워두면 관리자 계정의 이메일 계정을 사용합니다.", + "Enter an IPv4 address. This overrides the default gateway provided by DHCP.": "IPv4 주소를 입력합니다. DHCP가 부여한 기본 게이트웨이를 대체합니다.", + "Enter an IPv6 address. This overrides the default gateway provided by DHCP.": "IPv6 주소를 입력합니다. DHCP가 부여한 기본 게이트웨이를 대체합니다.", + "Enter an alphanumeric encryption key. Only available when Passphrase is the chosen key format.": "암호화 키를 영문자와 숫자로 입력합니다. 키 형식을 비밀구절로 선택했을 때만 사용됩니다.", + "Enter an alphanumeric name for the certificate. Underscore (_), and dash (-) characters are allowed.": "인증서의 이름을 영문자와 숫자로 입력합니다. 밑줄(_)과 대시(-) 문자도 사용할 수 있습니다.", + "Enter an alphanumeric name for the virtual machine.": "가상머신의 이름을 영문자와 숫자로 입력합니다.", + "Enter an email address to override the admin account’s default email. If left blank, the admin account’s email address will be used": "관리자 계정의 기본 이메일을 대체할 이메일 주소를 입력합니다. 비워두면 관리자 계정의 이메일 계정을 사용합니다.", "Enter an optimal number of threads used by the kernel NFS server.": "커널 NFS 서버가 사용할 최적의 스레드 수를 입력합니다.", "Enter any additional snmpd.conf(5) options. Add one option for each line.": "snmpd.conf(5)의 추가 선택사항을 입력합니다. 한 줄에 하나의 선택사항을 추가합니다.", "Enter any aliases, separated by spaces. Each alias can be up to 15 characters long.": "별칭을 입력합니다. 공백으로 구분합니다. 각 별칭의 최대 길이는 15자입니다.", "Enter any email addresses to receive status updates. Separate entries by pressing Enter.": "상태 갱신을 수신할 이메일 주소를 입력합니다. Enter키를 눌러 항목을 구분합니다.", "Enter any extra options from UPS.CONF(5).": "UPS.CONF(5)의 추가 선택사항을 입력합니다.", "Enter any extra options from UPSD.CONF(5).": "UPSD.CONF(5)의 추가 선택사항을 입력합니다.", - "Enter any information about this S.M.A.R.T. test.": "이 S.M.A.R.T. 검사에 대한 정보를 입력하십시오.", - "Enter any notes about this dataset.": "이 데이터셋에 대한 비고를 입력하십시오.", + "Enter any information about this S.M.A.R.T. test.": "이 S.M.A.R.T. 검사에 대한 정보를 입력합니다.", + "Enter any notes about this dataset.": "이 데이터셋에 대한 비고를 입력합니다.", "Enter dataset name to continue.": "계속하려면 데이터셋 이름을 입력하십시오.", - "Enter or paste a string to use as the encryption key for this dataset.": "이 데이터셋에 사용할 암호화 키를 붙여넣거나 입력하십시오.", + "Enter or paste a string to use as the encryption key for this dataset.": "이 데이터셋에 사용할 암호화 키를 붙여넣거나 입력합니다.", "Enter or paste the \"integration/service\" key for this system to access the PagerDuty API.": "PagerDuty API에 시스템이 접근할 수 있도록 \"integration/service\"키를 입력하거나 붙여넣습니다. ", "Enter or paste the incoming webhook URL associated with this service.": "이 서비스와 연결된 웹훅 수신 URL을 입력하거나 붙여넣습니다.", "Enter or paste the API key. Find the API key by signing into the OpsGenie web interface and going to Integrations/Configured Integrations. Click the desired integration, Settings, and read the API Key field.": "API 키를 입력하거나 붙여넣습니다. OpsGenie 웹 인터페이스로 접속 후 Integrations/Configured Integrations에서 API 키를 찾을 수 있습니다. 원하는 integration을 누르고, 설정으로 들어가, API 키 칸을 읽습니다.", @@ -1774,31 +1774,31 @@ "Enter or paste the VictorOps routing key.": "VictorOps 라우팅 키를 입력합니다.", "Enter or paste the public SSH key of the user for any key-based authentication. Do not paste the private key.": "키 기반 인증에 사용할 사용자의 공개 SSH 키를 입력하거나 붙여넣습니다. 개인 키를 붙여넣지 마십시오.", "Enter or paste the API key provided from iXsystems Account Services. Login or signup is required.": "iXsystems 계정 서비스에서 제공하는 API 키를 입력하거나 붙여넣습니다. 로그인 또는 회원가입이 필요합니다.", - "Enter or select the cloud storage location to use for this task.": "이 작업을 수행할 클라우드 저장소의 위치를 선택하거나 입력하십시오.", - "Enter password.": "비밀번호를 입력하십시오.", + "Enter or select the cloud storage location to use for this task.": "이 작업을 수행할 클라우드 저장소의 위치를 선택하거나 입력합니다.", + "Enter password.": "비밀번호를 입력합니다.", "Enter path for {label}.{multiple}": "{label}.{multiple}의 경로를 입력합니다.", "Enter the AWS account region.": "AWS 계정 지역을 입력합니다.", "Enter the InfluxDB hostname.": "InfluxDB 호스트 이름을 입력합니다.", "Enter the fully-qualified hostname (FQDN) of the system. This name must be unique within a certificate chain.": "시스템의 정규화 된 도메인 이름(FQDN)입니다. 이 이름은 인증서 체인 내에서 고유해야 합니다.", "Enter the Active Directory administrator account name.": "액티브 디렉터리 관리자 계정 이름을 입력합니다.", "Enter the Active Directory domain (example.com) or child domain (sales.example.com).": "액티브 디렉터리 도메인(example.com) 또는 하위 도메인(sales.example.com)을 입력합니다.", - "Enter the IP address of the gateway.": "게이트웨이의 IP 주소를 입력하십시오.", - "Enter the IP address or hostname of the VMware host. When clustering, this is the vCenter server for the cluster.": "IP 주소나 VMware 호스트의 호스트 이름을 입력하십시오. 클러스터 작업시 vCenter 서버가 됩니다.", - "Enter the IP address or hostname of the remote system that will store the copy. Use the format username@remote_host if the username differs on the remote host.": "복사본을 저장할 원격 시스템의 IP 주소나 호스트 이름을 입력하십시오. 원격 호스트의 사용자 이름이 다를 경우 사용자_이름@리모트_호스트형식을 사용하십시오.", - "Enter the SSH Port of the remote system.": "원격 시스템의 SSH 포트를 입력하십시오.", - "Enter the command with any options.": "옵션을 포함한 명령어를 입력하십시오.", - "Enter the default gateway of the IPv4 connection.": "IPv4 연결의 기본 게이트웨이를 입력하십시오.", - "Enter the desired address into the field to override the randomized MAC address.": "임의의 MAC 주소를 대체할 원하는 주소를 입력하십시오.", - "Enter the device name of the interface. This cannot be changed after the interface is created.": "인터페이스의 장치 이름을 입력하십시오. 인터페이스를 만들고 난 뒤에는 바꿀 수 없습니다.", - "Enter the email address of the new user.": "새로운 사용자의 이메일 주소를 입력하십시오.", + "Enter the IP address of the gateway.": "게이트웨이의 IP 주소를 입력합니다.", + "Enter the IP address or hostname of the VMware host. When clustering, this is the vCenter server for the cluster.": "IP 주소나 VMware 호스트의 호스트 이름을 입력합니다. 클러스터 작업시 vCenter 서버가 됩니다.", + "Enter the IP address or hostname of the remote system that will store the copy. Use the format username@remote_host if the username differs on the remote host.": "복사본을 저장할 원격 시스템의 IP 주소나 호스트 이름을 입력합니다. 원격 호스트의 사용자 이름이 다를 경우 사용자_이름@리모트_호스트형식을 사용하십시오.", + "Enter the SSH Port of the remote system.": "원격 시스템의 SSH 포트를 입력합니다.", + "Enter the command with any options.": "선택사항을 포함한 명령어를 입력합니다.", + "Enter the default gateway of the IPv4 connection.": "IPv4 연결의 기본 게이트웨이를 입력합니다.", + "Enter the desired address into the field to override the randomized MAC address.": "임의의 MAC 주소를 대체할 원하는 주소를 입력합니다.", + "Enter the device name of the interface. This cannot be changed after the interface is created.": "인터페이스의 장치 이름을 입력합니다. 인터페이스를 만든 후에는 바꿀 수 없습니다.", + "Enter the email address of the new user.": "새로운 사용자의 이메일 주소를 입력합니다.", "Enter the email address of the person responsible for the CA.": "CA 담당자의 이메일 주소를 입력합니다.", "Enter the email of the contact person. Use the format name@domain.com.": "연락 가능한 이메일을 입력합니다. 이름@도메인.com 형식을 사용합니다.", - "Enter the filesystem to snapshot.": "스냅샷을 수행할 파일시스템을 입력하십시오.", - "Enter the full path to the command or script to be run.": "실행할 명령어나 스크립트의 전체 경로를 입력하십시오.", - "Enter the hostname or IP address of the NTP server.": "NTP서버의 호스트 이름이나 IP 주소를 입력하십시오.", - "Enter the hostname to connect to.": "연결할 호스트 이름을 입력하십시오.", - "Enter the location of the organization. For example, the city.": "조직의 위치를 입력하십시오. 예를 들어 도시를 입력할 수 있습니다.", - "Enter the location of the system.": "시스템의 위치를 입력하십시오.", + "Enter the filesystem to snapshot.": "스냅샷을 수행할 파일시스템을 입력합니다.", + "Enter the full path to the command or script to be run.": "실행할 명령어나 스크립트의 전체 경로를 입력합니다.", + "Enter the hostname or IP address of the NTP server.": "NTP서버의 호스트 이름이나 IP 주소를 입력합니다.", + "Enter the hostname to connect to.": "연결할 호스트 이름을 입력합니다.", + "Enter the location of the organization. For example, the city.": "조직의 위치를 입력합니다. 예를 들어, 'Seoul'이라고 입력합니다.", + "Enter the location of the system.": "시스템의 위치를 입력합니다.", "Enter the maximum number of attempts before client is disconnected. Increase this if users are prone to typos.": "클라이언트가 연결 해제되기 전 최대 시도 횟수를 입력합니다. 사용자가 오타를 자주 치는 경우 이 숫자를 늘립니다.", "Enter the name of the Key Distribution Center.": "키 배포 센터의 이름을 입력합니다.", "Enter the name of the company or organization.": "회사나 조직의 이름을 입력해주십시오.", @@ -1808,19 +1808,19 @@ "Enter the name of the sysctl variable to configure. sysctl tunables are used to configure kernel parameters while the system is running and generally take effect immediately.": "구성할 Sysctl 변수의 이름을 입력합니다. Sysctl 튜너블은 시스템이 작동하는 동안 커널 매개변수를 구성하고, 효과는 대개 즉시 나타납니다.", "Enter the number of last kept backups.": "유지할 최근 백업 수를 입력합니다.", "Enter the numeric tag configured in the switched network.": "교환망에 구성된 숫자 태그를 입력합니다.", - "Enter the passphrase for the Private Key.": "개인 키에 대한 비밀구절을 입력하십시오.", - "Enter the password associated with Username.": "사용자 이름에 연결된 비밀번호를 입력하십시오.", - "Enter the password for the SMTP server. Only plain ASCII characters are accepted.": "SMTP 서버의 비밀번호를 입력하십시오. 평문의 ASCII 문자만 입력할 수 있습니다.", - "Enter the password used to connect to the IPMI interface from a web browser.": "웹 브라우저를 통한 IPMI 인터페이스 접속을 위한 비밀번호를 입력하십시오.", + "Enter the passphrase for the Private Key.": "개인 키에 대한 비밀구절을 입력합니다.", + "Enter the password associated with Username.": "사용자 이름에 연결된 비밀번호를 입력합니다.", + "Enter the password for the SMTP server. Only plain ASCII characters are accepted.": "SMTP 서버의 비밀번호를 입력합니다. 평문의 ASCII 문자만 입력할 수 있습니다.", + "Enter the password used to connect to the IPMI interface from a web browser.": "웹 브라우저를 통한 IPMI 인터페이스 접속을 위한 비밀번호를 입력합니다.", "Enter the phone number of the contact person.": "연락 가능한 전화번호를 입력합니다.", - "Enter the pre-Windows 2000 domain name.": "Windows 2000 이전의 도메인 네임을 입력하십시오.", + "Enter the pre-Windows 2000 domain name.": "Windows 2000 이전의 도메인 네임을 입력합니다.", "Enter the pre-defined S3 bucket to use.": "사용할 사전 정의된 S3 버킷을 입력합니다.", "Enter the relative distinguished name of the site object in the Active Directory.": "액티브 디렉터리에서 사이트 개체의 상대적 고유 이름을 입력합니다.", "Enter the state or province of the organization.": "조직의 주(州) 또는 도(道)를 입력합니다.", - "Enter the subject for status emails.": "상태 이메일의 제목을 입력하십시오.", - "Enter the user on the VMware host with permission to snapshot virtual machines.": "가상머신 스냅샷의 권한을 가진 VMware 호스트 사용자를 입력하십시오.", - "Enter the username if the SMTP server requires authentication.": "SMTP 서버 인증이 필요한 경우 사용자 이름을 입력하십시오.", - "Enter the version to roll back to.": "되돌릴 버전을 입력하십시오.", + "Enter the subject for status emails.": "상태 이메일의 제목을 입력합니다.", + "Enter the user on the VMware host with permission to snapshot virtual machines.": "가상머신 스냅샷의 권한을 가진 VMware 호스트 사용자를 입력합니다.", + "Enter the username if the SMTP server requires authentication.": "SMTP 서버 인증이 필요한 경우 사용자 이름을 입력합니다.", + "Enter the version to roll back to.": "되돌릴 버전을 입력합니다.", "Enter vm name to continue.": "가상머신의 이름을 입력해 계속합니다.", "Enter zvol name to continue.": "Zvol의 이름을 입력해 계속합니다.", "Enter {value} below to confirm.": "승인하려면 아래에 {value}을(를) 입력합니다.", @@ -2181,7 +2181,7 @@ "Hostname or IP address of the remote system.": "원격 시스템의 호스트 이름 또는 IP 주소입니다.", "Hostname or IP address of the remote system. A valid URL scheme is required. Example: https://10.231.3.76": "원격 시스템의 호스트 이름 또는 IP 주소입니다. 유효한 URL 형식으로 작성해야 합니다. 예시: https://10.231.3.76", "Hostname or IP address of the system to receive SNMP trap notifications.": "시스템이 SNMP 트랩 알림을 수신할 호스트 이름 또는 IP 주소입니다.", - "Hostname – Active": "호스트 이름 – 액티브", + "Hostname – Active": "호스트 이름 – 활성", "Hostname – Passive": "호스트 이름 – 패시브", "Hostname:": "호스트 이름:", "Hostname: {hostname}": "호스트 이름: {hostname}", @@ -2249,7 +2249,7 @@ "Identify light is now off.": "식별등이 꺼졌습니다.", "Identify light is off.": "식별등이 꺼졌습니다.", "Identify light is on.": "식별등이 켜졌습니다.", - "Identify the purpose for this public key. Typically used for end entity certificates. Multiple usages can be selected. Do not mark this extension critical when the Usage is ANY_EXTENDED_KEY_USAGE.

Using both Extended Key Usage and Key Usage extensions requires that the purpose of the certificate is consistent with both extensions. See RFC 3280, section 4.2.1.13 for more details.": "이 공개 키의 용도를 식별합니다. 일반적으로 최종 신원 증명용입니다. 여러 용도를 선택할 수 있습니다. 용도ANY_EXTENDED_KEY_USAGE인 경우 이 확장을 중요하다고 표시하지 마십시오.

확장된 키 용도키 용도 확장을 모두 사용하려면 인증서의 용도가 두 확장과 일치해야 합니다. 자세한 내용을 RFC 3280, 섹션 4.2.1.13을 참고하십시오.", + "Identify the purpose for this public key. Typically used for end entity certificates. Multiple usages can be selected. Do not mark this extension critical when the Usage is ANY_EXTENDED_KEY_USAGE.

Using both Extended Key Usage and Key Usage extensions requires that the purpose of the certificate is consistent with both extensions. See RFC 3280, section 4.2.1.13 for more details.": "이 공개 키의 용도를 식별합니다. 일반적으로 개인 인증서에 사용됩니다. 여러 용도를 선택할 수 있습니다. 용도ANY_EXTENDED_KEY_USAGE인 경우 이 확장을 중요하다고 표시하지 마십시오.

확장된 키 용도키 용도 확장을 모두 사용하려면 인증서의 용도가 두 확장과 일치해야 합니다. 자세한 내용을 RFC 3280, 섹션 4.2.1.13을 참고하십시오.", "Identify this certificate as a Certificate Authority (CA).": "이 인증서를 인증기관(CA)으로 식별합니다.", "Identify this extension as critical for the certificate. Critical extensions must be recognized by the certificate-using system or this certificate will be rejected. Extensions identified as not critical can be ignored by the certificate-using system and the certificate still approved.": "이 확장을 인증서에 중요한 것으로 식별합니다. 중요한 확장은 인증서를 사용하는 시스템에서 인식되어야 하며, 그렇지 않으면 이 인증서는 거부됩니다. 중요하지 않은 것으로 식별된 확장은 인증서를 사용하는 시스템에서 무시될 수 있지만, 인증서는 여전히 승인됩니다.", "Idle": "유휴", @@ -2398,8 +2398,8 @@ "Invalid value. Missing numerical value or invalid numerical value/unit.": "올바르지 않은 값입니다. 숫자가 아니거나 잘못된 숫자 혹은 단위입니다.", "Invalid value. Must be greater than or equal to ": "올바르지 않은 값입니다. 다음과 같거나 커야 합니다: ", "Invalid value. Must be less than or equal to ": "올바르지 않은 값입니다. 다음과 같거나 작아야 합니다: ", - "Invalid value. Valid values are numbers followed by optional unit letters, like 256k or 1 G or 2 MiB.": "올바르지 않은 값입니다. 256k1 G, 2 MiB와 같이 숫자 뒤에 단위를 입력하십시오.", - "Invisible": "안 보임", + "Invalid value. Valid values are numbers followed by optional unit letters, like 256k or 1 G or 2 MiB.": "올바르지 않은 값입니다. 256k 또는 1 G, 2 MiB와 같이 숫자 뒤에 단위를 입력하십시오.", + "Invisible": "숨김", "Ipmi": "IPMI", "Is planned to be automatically destroyed at {datetime}": "{datetime}에 자동으로 파기할 예정", "Isolated GPU Device(s)": "분리된 GPU 장치", @@ -2437,7 +2437,7 @@ "Keep Last": "최종 유지", "Keep for": "유지", "Keep snapshot for": "스냅샷 유지", - "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 (:).": "이름은 짧게, 소문자로 짓습니다. 이름은 63자보다 길게 지으면 블록 장치에 접근하지 못할 수 있습니다. 사용 가능한 문자: 영문자, 숫자, 온점(.), 대시(-), 쌍점(:)", + "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 (:).": "이름은 짧게, 소문자로 짓습니다. 이름은 63자보다 길게 지으면 블록 장치에 접근하지 못할 수 있습니다. 사용 가능한 문자: 영문자, 숫자, 마침표(.), 대시(-), 쌍점(:)", "Keep the zvol name short. Using a zvol name longer than 63 characters can prevent accessing the zvol as a device.": "ZVOL 이름은 짧게 짓습니다. ZVOL 이름을 63자보다 길게 지으면 ZVOL을 장치로서 접근하지 못할 수 있습니다.", "Keep this Boot Environment?": "이 시작 환경을 유지하시겠습니까?", "Kerberos Keytab": "Kerberos 키탭", @@ -2621,7 +2621,7 @@ "Loss of Functionality": "기능 상실", "Low Bandwidth (4)": "낮은 대역폭 (4)", "Low Capacity": "낮은 용량", - "Lowercase alphanumeric characters plus dot (.), dash (-), and colon (:) are allowed. See the Constructing iSCSI names using the iqn.format section of RFC3721.": "소문자 영문자, 숫자와 온점(.), 대시(-), 쌍점(:)을 입력할 수 있습니다. RFC3721iqn. 형식을 사용해 iSCSI 이름 구성하기 부분을 참고하십시오.", + "Lowercase alphanumeric characters plus dot (.), dash (-), and colon (:) are allowed. See the Constructing iSCSI names using the iqn.format section of RFC3721.": "소문자 영문자, 숫자와 마침표(.), 대시(-), 쌍점(:)을 입력할 수 있습니다. RFC3721iqn. 형식을 사용해 iSCSI 이름 구성하기 부분을 참고하십시오.", "Lowest Temperature": "최저 온도", "Lowest port number of the active side listen address that is open to connections.": "연결에 열려 있는 활성 측 수신 주소의 가장 낮은 포트 번호입니다.", "MAC Address": "MAC 주소", @@ -2647,7 +2647,7 @@ "Manage Certificates": "인증서 관리", "Manage Cloud Sync Tasks": "클라우드 동기화 작업 관리", "Manage Configuration": "구성 관리", - "Manage Container Images": "콘테이너 이미지 관리", + "Manage Container Images": "컨테이너 이미지 관리", "Manage Credentials": "자격증명 관리", "Manage Datasets": "데이터셋 관리", "Manage Devices": "장치 관리", @@ -2780,7 +2780,7 @@ "Move selected items to the right side list": "선택 항목을 오른쪽 목록으로 이동", "Move widget down": "아래로 위젯 이동", "Move widget up": "위로 위젯 이동", - "Multi-domain support. Enter additional domains to secure. Separate domains by pressing Enter For example, if the primary domain is example.com, entering www.example.com secures both addresses.": "다중 도메인을 지원합니다. 보호할 추가 도메인을 입력하십시오. Enter키를 눌러 도메인을 구분합니다. 예를 들어, 기본 도메인이 example.com 이라면, www.example.com을 입력해 두 주소 모두 보호할 수 있습니다.", + "Multi-domain support. Enter additional domains to secure. Separate domains by pressing Enter For example, if the primary domain is example.com, entering www.example.com secures both addresses.": "다중 도메인을 지원합니다. 보호할 추가 도메인을 입력합니다. Enter키를 눌러 도메인을 구분합니다. 예를 들어, 기본 도메인이 example.com 이라면, www.example.com을 입력해 두 주소 모두 보호할 수 있습니다.", "Multicast DNS. Uses the system Hostname to advertise enabled and running services. For example, this controls if the server appears under Network on MacOS clients.": "멀티캐스트 DNS 입니다. 시스템의 호스트 이름을 사용해 활성화되었음을 알리고 서비스를 실행합니다. 예를 들어, 이 설정은 서버가 MacOS 클라이언트의 네트워크에 나타나는지 여부를 제어합니다.", "Multichannel": "다중 채널", "Multiple Errors": "다중 오류", @@ -2829,7 +2829,7 @@ "Name of the WebDAV site, service, or software being used.": "사용중인 WebDAV 사이트, 서비스 또는 소프트웨어의 이름입니다.", "Name of the extent. If the Extent size is not 0, it cannot be an existing file within the pool or dataset.": "익스텐트의 이름입니다. 익스텐트 크기0이 아니면, 풀이나 데이터셋의 기존 파일일 수 없습니다.", "Name of the new alert service.": "새로운 경고 서비스의 이름입니다.", - "Name of the new cloned boot environment. Alphanumeric characters, dashes (-), underscores (_), and periods (.) are allowed.": "새롭게 복제한 시작 환경의 이름입니다. 영문자와 숫자, 대시(-), 밑줄(_), 온점(.)을 사용할 수 있습니다.", + "Name of the new cloned boot environment. Alphanumeric characters, dashes (-), underscores (_), and periods (.) are allowed.": "새롭게 복제한 시작 환경의 이름입니다. 영문자와 숫자, 대시(-), 밑줄(_), 마침표(.)을 사용할 수 있습니다.", "Name of the new dataset created from the cloned snapshot.": "복제한 스냅샷으로부터 생성된 새로운 데이터셋의 이름입니다.", "Name of the pool is required": "풀 이름 필요", "Name of the pool must be correct": "올바르지 않은 풀 이름", @@ -2901,7 +2901,7 @@ "New Cloud Backup": "새로운 클라우드 백업", "New Cloud Credential": "새로운 클라우드 자격증명", "New Cloud Sync Task": "새로운 클라우드 동기화 작업", - "New Credential": "새로운 작업증명", + "New Credential": "새로운 자격증명", "New Cron Job": "새로운 Cron 작업", "New DNS Authenticator": "새로운 DNS 인증기", "New Dataset": "새로운 데이터셋", @@ -3094,7 +3094,7 @@ "Only entered when configuring mutual CHAP. Usually the same value as User.": "상호 CHAP를 구성할 때 입력합니다. 일반적으로 사용자와 같은 값입니다.", "Only first {number} examples are shown.": "처음 {number}개의 예시만 나타납니다.", "Only image(s) will be updated": "이미지만 갱신함", - "Only lowercase alphanumeric characters plus dot (.), dash (-), and colon (:) are allowed.": "소문자 영문자, 숫자와 온점(.), 대시(-), 쌍점(:)만 입력할 수 있습니다.", + "Only lowercase alphanumeric characters plus dot (.), dash (-), and colon (:) are allowed.": "소문자 영문자, 숫자와 마침표(.), 대시(-), 쌍점(:)만 입력할 수 있습니다.", "Only needed when connecting to a Team Drive. The ID of the top level folder of the Team Drive.": "Team Drive에 연결할 때만 필요합니다. Team Drive 최상위 폴더의 ID입니다.", "Only numeric ids are allowed.": "숫자로 이루어진 ID만 입력할 수 있습니다.", "Only one can be active at a time.": "한 번에 하나씩만 활성화할 수 있습니다.", @@ -3123,8 +3123,8 @@ "Options for encrypting the LDAP connection:

  • OFF: do not encrypt the LDAP connection.
  • ON: encrypt the LDAP connection with SSL on port 636.
  • START_TLS: encrypt the LDAP connection with STARTTLS on the default LDAP port 389.
": "LDAP 연결 암호화 선택사항:
  • 꺼짐: LDAP 연결을 암호화하지 않습니다.
  • 켜짐: 636번 포트에서 SSL을 사용하여 LDAP 연결을 암호화합니다.
  • START_TLS: 기본 LDAP 포트인 389번 포트에서 STARTTLS를 사용하여 LDAP 연결을 암호화합니다.
", "Order": "순서", "Organization": "조직", - "Organizational Unit": "조직 단위", - "Organizational unit of the entity.": "항목의 조직 구성 단위입니다.", + "Organizational Unit": "조직 단위(OU)", + "Organizational unit of the entity.": "인증서의 조직 구성 단위입니다.", "Other": "Other", "Other Options": "그 외 선택사항", "Other Read": "그 외 읽기", @@ -3196,7 +3196,7 @@ "Path Suffix": "경로 접미사", "Path to the Extent": "익스텐트 경로", "Pattern": "패턴", - "Pattern of naming custom snapshots to include in the replication with the periodic snapshot schedule. Enter the strftime(3) strings that match the snapshots to include in the replication.

When a periodic snapshot is not linked to the replication, enter the naming schema for manually created snapshots. Has the same %Y, %m, %d, %H, and %M string requirements as the Naming Schema in a Periodic Snapshot Task. Separate entries by pressing Enter.": "주기적인 스냅샷 일정에 따라 복제할 사용자 정의 스냅샷의 이름짓기 패턴입니다. 복제에 포함할 스냅샷과 일치하는 strftime(3) 문자열을 입력합니다.

주기적인 스냅샷 작업이 복제 작업과 연결되어있지 않은 경우, 수동으로 생성한 스냅샷의 이름짓기 방식을 입력하십시오. 주기적인 스냅샷 작업이름짓기 방식과 같이 %Y, %m, %d, %H%M 문자열이 필요합니다. Enter키를 눌러 항목을 구분합니다.", + "Pattern of naming custom snapshots to include in the replication with the periodic snapshot schedule. Enter the strftime(3) strings that match the snapshots to include in the replication.

When a periodic snapshot is not linked to the replication, enter the naming schema for manually created snapshots. Has the same %Y, %m, %d, %H, and %M string requirements as the Naming Schema in a Periodic Snapshot Task. Separate entries by pressing Enter.": "주기적인 스냅샷 일정에 따라 복제할 사용자 정의 스냅샷의 이름짓기 패턴입니다. 복제에 포함할 스냅샷과 일치하는 strftime(3) 문자열을 입력합니다.

주기적인 스냅샷 작업이 복제 작업과 연결되어있지 않은 경우, 수동으로 생성한 스냅샷의 이름짓기 방식을 입력합니다. 주기적인 스냅샷 작업이름짓기 방식과 같이 %Y, %m, %d, %H%M 문자열이 필요합니다. Enter키를 눌러 항목을 구분합니다.", "Pattern of naming custom snapshots to be replicated. Enter the name and strftime(3) %Y, %m, %d, %H, and %M strings that match the snapshots to include in the replication. Separate entries by pressing Enter. The number of snapshots matching the patterns are shown.": "복제할 사용자 정의 스냅샷의 이름짓기 패턴입니다. 복제에 포함할 스냅샷과 일치하는 이름과 strftime(3) %Y, %m, %d, %H%M 문자열을 입력합니다. Enter키를 눌러 항목을 구분합니다. 패턴과 일치하는 스냅샷의 수가 표시됩니다.", "Pause Scrub": "스크럽 일시정지", "Peer Secret": "피어 시크릿", @@ -3343,7 +3343,7 @@ "Provisioning URI (includes Secret - Read only):": "프로비저닝 URI (시크릿 포함 - 읽기 전용)", "Proxies": "프록시", "Proxy": "프록시", - "Proxy saved": "프록시 저장됨", + "Proxy saved": "프록시 저장함", "Prune": "정리", "Prune Deduplication Table": "중복제거 테이블 정리", "Pruning Deduplication Table": "중복제거 테이블 정리중", @@ -3540,7 +3540,7 @@ "Resetting system configuration to default settings. The system will restart.": "시스템 구성을 기본값으로 재설정합니다. 시스템을 재시작합니다.", "Resetting. Please wait...": "재설정 중입니다. 잠시만 기다려주십시오...", "Resilver Priority": "리실버 우선순위", - "Resilver configuration saved": "리실버 구성 저장됨", + "Resilver configuration saved": "리실버 구성 저장함", "Resilvering": "리실버 중", "Resilvering Status": "리실버 상태", "Resilvering pool: ": "풀 리실버", @@ -3702,7 +3702,7 @@ "SNMPv3 Security Model": "SNMPv3 보안 모델", "SSH": "SSH", "SSH Connection": "SSH 연결", - "SSH Connection saved": "SSH 연결 저장됨", + "SSH Connection saved": "SSH 연결 저장함", "SSH Connections": "SSH 연결", "SSH Host to connect to.": "연결할 SSH 호스트입니다.", "SSH Key": "SSH 키", @@ -3718,7 +3718,7 @@ "SSH connection from the keychain": "키체인을 통한 SSH 연결", "SSH password login enabled": "SSH 비밀번호 로그인 활성화됨", "SSH port number. Leave empty to use the default port 22.": "SSH 포트 번호입니다. 비워두면 기본값인 22번을 사용합니다.", - "SSH private key stored in user's home directory": "SSH 개인 키가 사용자의 홈 디렉터리에 저장됨", + "SSH private key stored in user's home directory": "SSH 개인 키를 사용자의 홈 디렉터리에 저장함", "SSL (Implicit TLS)": "SSL (암묵적 TLS)", "SSL Certificate": "SSL 인증서", "SSL Protocols": "SSL 프로토콜", @@ -3929,7 +3929,7 @@ "Sensitive": "꼼꼼하게", "Sep": "9월", "Separate multiple values by pressing Enter.": "Enter키를 눌러 여러 값을 구분합니다.", - "Separate values with commas, and without spaces.": "공백 없이 반점으로 값을 구분합니다.", + "Separate values with commas, and without spaces.": "공백 없이 쉼표로 값을 구분합니다.", "Serial": "일련번호", "Serial Port": "직렬포트", "Serial Shell": "시리얼 셸", @@ -3937,8 +3937,8 @@ "Serial number for this disk.": "이 디스크의 시리얼 번호입니다.", "Serial numbers of each disk being edited.": "수정한 각 디스크의 시리얼 번호입니다.", "Serial or USB port connected to the UPS. To automatically detect and manage the USB port settings, select auto.

When an SNMP driver is selected, enter the IP address or hostname of the SNMP UPS device.": "UPS에 연결된 직렬포트 또는 USB 포트입니다. 자동을 선택해 USB 포트 설정을 자동으로 감지하고 관리합니다.

SNMP 드라이버를 선택했다면, SNMP UPS 장치의 IP 주소나 호스트 이름을 입력합니다.", - "Serial – Active": "시리얼 – 액티브", - "Serial – Passive": "시리얼 – 패시브", + "Serial – Active": "일련번호 – 활성", + "Serial – Passive": "일련번호 – 패시브", "Series": "시리즈", "Server": "서버", "Server Side Encryption": "서버측 암호화", @@ -3952,7 +3952,7 @@ "Service Name": "서비스 이름", "Service Read": "서비스 읽기", "Service Write": "서비스 쓰기", - "Service configuration saved": "서비스 구성 저장됨", + "Service configuration saved": "서비스 구성 저장함", "Service started": "서비스 시작됨", "Service status": "서비스 상태", "Service stopped": "서비스 멈춤", @@ -4062,7 +4062,7 @@ "Setting this option will result in timeouts if identd is not running on the client.": "이 선택사항은 identd이(가) 클라이언트에서 실행되지 않을 때 시간 초과 오류가 발생하도록 설정합니다.", "Settings": "설정", "Settings Menu": "설정 메뉴", - "Settings saved": "설정 저장됨", + "Settings saved": "설정 저장함", "Settings saved.": "설정이 저장되었습니다.", "Setup Cron Job": "Cron 작업 설정", "Setup Method": "설정 방식", @@ -4070,7 +4070,7 @@ "Setup Pool To Install": "설치할 풀 설정", "Severity Level": "심각도", "Share ACL for {share}": "{share}을(를) 위한 공유 ACL", - "Share Attached": "공유 첨부함", + "Share Attached": "공유 설정됨", "Share Path updated": "공유 경로 갱신함", "Share with this name already exists": "공유 이름 존재", "Share your thoughts on our product's features, usability, or any suggestions for improvement.": "우리 제품의 기능, 사용성, 제안사항 등 여러분의 생각을 나눠주십시오. 개선에 도움이 됩니다.", @@ -4208,7 +4208,7 @@ "Spare": "여분", "Spare VDEVs": "여분 VDEV", "Spares": "여분", - "Sparse": "희박", + "Sparse": "Sparse", "Special Allocation class, used to create Fusion pools. Optional VDEV type which is used to speed up metadata and small block IO.": "퓨전 풀을 만드는 데 사용하는 특수 할당 클래스입니다. 메타데이터와 작은 블록 IO를 가속하는 선택적 VDEV 유형입니다.", "Specifies level of authentication and cryptographic protection. SYS or none should be used if no KDC is available. If a KDC is available, e.g. Active Directory, KRB5 is recommended. If desired KRB5I (integrity protection) and/or KRB5P (privacy protection) may be included with KRB5.": "인증 및 암호화 보호 수준을 지정합니다. 'KDC'를 사용할 수 없는 경우 'SYS' 또는 '없음'을 사용해야 합니다. KDC(예: Active Directory)를 사용할 수 있는 경우 KRB5를 권장합니다. 원하는 경우 KRB5I(무결성 보호) 및/또는 KRB5P(개인 정보 보호)를 KRB5에 포함할 수 있습니다.", "Specifies the auxiliary directory service ID provider.": "보조 디렉터리 서비스 ID 공급자를 지정합니다.", @@ -4226,7 +4226,7 @@ "Specify whether to use the certificate for a Certificate Authority and whether this extension is critical. Clients must recognize critical extensions to prevent rejection. Web certificates typically require you to disable CA and enable Critical Extension.": "인증기관에 인증서를 사용할지 여부와, 이 확장이 중요한지 여부를 지정합니다. 클라이언트는 거부를 방지하기 위해 중요한 확장을 인식해야 합니다. 웹 인증서는 일반적으로 CA를 비활성화하고 중요한 확장을 활성화해야 합니다.", "Speeds up the initial synchronization (seconds instead of minutes).": "초기 동기화 속도를 높입니다(분 대신 초).", "Split": "분할", - "Staging": "스테이징", + "Staging": "운영 준비", "Standard": "표준", "Standby": "대기", "Standby: TrueNAS Controller {id}": "대기: TrueNAS 컨트롤러 {id}", @@ -4451,7 +4451,7 @@ "Test email sent.": "이메일 발송을 검사합니다.", "Test network interface changes for ": "네트워크 인터페이스 변경사항을 검사할 시간은 ", "Test network interface changes? Network connectivity can be interrupted.": "네트워크 인터페이스 변경사항을 검사하시겠습니까? 네트워크 연결이 중단될 수 있습니다.", - "Testing": "검사중", + "Testing": "점검", "Tests are only performed when Never is selected.": "하지 않음을 선택해야 검사를 수행합니다.", "Tests the server connection and verifies the chosen Certificate chain. To test, configure the Server and Port values, select a Certificate and Certificate Authority, enable this setting, and click SAVE.": "서버 연결을 검사하고 선택한 인증서 체인을 검증합니다. 검사를 위해 서버포트를 구성하고, 인증서인증기관을 선택한 다음, 이 설정을 활성화하고 저장을 누릅니다.", "Thank you for sharing your feedback with us! Your insights are valuable in helping us improve our product.": "피드백을 공유해주셔서 감사합니다! 귀하의 통찰력은 당사의 제품을 개선하는 데 큰 도움이 됩니다.", @@ -4471,7 +4471,7 @@ "The TrueNAS controllers do not have the same quantity of disks.": "TrueNAS 컨트롤러에 같은 수의 디스크가 없습니다.", "The URI used to provision an OTP. The URI (which contains the secret) is encoded in a QR Code. To set up an OTP app like Google Authenticator, use the app to scan the QR code or enter the secret manually into the app. The URI is produced by the system when Two-Factor Authentication is first activated.": "OTP를 제공하는 URI입니다. 시크릿을 포함한 URI는 QR코드로 부호화되어 있습니다. Google Authenticator와 같은 OTP 앱에서 설정하려면, 해당 앱으로 QR코드를 스캔하거나 앱에 시크릿 코드를 직접 입력해야 합니다. URI는 2단계 인증이 시스템에서 처음 활성화될 때 생성됩니다.", "The VM could not start because the current configuration could potentially require more RAM than is available on the system. Memory overcommitment allows multiple VMs to be launched when there is not enough free memory for configured RAM of all VMs. Use with caution. Would you like to overcommit memory?": "현재 가상머신 구성이 시스템에서 사용할 수 있는 RAM보다 더 많은 RAM을 요구할 수 있어 가상머신을 실행할 수 없습니다. 메모리 과잉 할당을 통해 실행하고자 하는 가상머신에 구성된 RAM보다 여유 메모리가 적을 때에도 여러 가상머신을 실행할 수 있습니다. 주의해서 사용하십시오. 메모리 과잉 할당을 수행하시겠습니까?", - "The base name is automatically prepended if the target name does not start with iqn. Lowercase alphanumeric characters plus dot (.), dash (-), and colon (:) are allowed. See the Constructing iSCSI names using the iqn.format section of RFC3721.": "기초 이름은 대상 이름이 iqn으로 시작하지 않는 경우 자동으로 붙는 접두어입니다. 소문자 영문자와 숫자, 온점(.), 대시(-), 쌍점(:)을 사용할 수 있습니다. RFC3721iqn. 형식을 사용해 iSCSI 이름 구성하기 부분을 참고하십시오.", + "The base name is automatically prepended if the target name does not start with iqn. Lowercase alphanumeric characters plus dot (.), dash (-), and colon (:) are allowed. See the Constructing iSCSI names using the iqn.format section of RFC3721.": "기초 이름은 대상 이름이 iqn으로 시작하지 않는 경우 자동으로 붙는 접두어입니다. 소문자 영문자와 숫자, 마침표(.), 대시(-), 쌍점(:)을 사용할 수 있습니다. RFC3721iqn. 형식을 사용해 iSCSI 이름 구성하기 부분을 참고하십시오.", "The cache has been cleared.": "캐시를 비웠습니다.", "The cache is being rebuilt.": "캐시를 재구성하는 중입니다.", "The certificate's public key is used to encipher user data only during key agreement operations. Requires that Key Agreement is also set.": "인증서의 공개 키는 키 계약 작업 중에만 사용자 데이터를 암호화하는 데 사용됩니다. 키 계약 또한 설정되어 있어야 합니다.", @@ -4537,7 +4537,7 @@ "The system will restart and be briefly unavailable while applying updates. Apply updates and restart?": "업데이트를 적용하기 위해 시스템을 재시작하여 잠시 사용할 수 없습니다. 업데이트를 적용하고 재시작하시겠습니까?", "The ticket was created successfully (see link below), but the debug file failed to attach. Please download the debug manually (System → Advanced → Save Debug), upload it to a third-party storage service and provide a link in the JIRA issue comment.": "티켓을 성공적으로 발행했으나(아래 링크 참고), 디버그 파일을 첨부하지 못했습니다. 디버그를 직접 저장하고(시스템 → 고급 → 디버그 저장), 서드 파티 저장소 서비스에 업로드한 후 JIRA 이슈 덧글로 링크를 제공해주십시오.", "The time in seconds the system waits for the VM to cleanly shut down. During system shutdown, the system initiates poweroff for the VM after the shutdown timeout has expired.": "VM이 정상적으로 종료될 때까지 시스템이 기다릴 시간(초)입니다. 시스템 종료 시, 시스템은 종료 시간 제한이 지난 후 VM의 종료 절차를 수행합니다.", - "The time values when the task will run. Accepts standard crontab(5) values.

Symbols:
A comma (,) separates individual values.
An asterisk (*) means \"match all values\".
Hyphenated numbers (1-5) sets a range of time.
A slash (/) designates a step in the value: */2 means every other minute.

Example: 30-35 in Minutes, 1,14 in Hours, and */2 in Days means the task will run on 1:30 - 1:35 AM and 2:30 - 2:35 PM every other day.": "작업을 수행할 시간입니다. crontab(5) 표준으로 입력합니다.

심볼:
반점(,)으로 각 값을 구분합니다.
별표(*)는 \"일치하는 모든 값\"을 의미합니다.
하이픈으로 연결한 수(1-5)는 시간 범위를 지정합니다.
빗금(/)은 값의 단계를 지정합니다: '*/2'은(는) '2분마다'를 의미합니다.

예시: '분'에 '30-35', '시'에 '1,14', '일'에 '*/2'를 입력하면, '2일마다 오전 1시 30-35분, 오후 2시 30-35분'에 작업을 실행합니다.", + "The time values when the task will run. Accepts standard crontab(5) values.

Symbols:
A comma (,) separates individual values.
An asterisk (*) means \"match all values\".
Hyphenated numbers (1-5) sets a range of time.
A slash (/) designates a step in the value: */2 means every other minute.

Example: 30-35 in Minutes, 1,14 in Hours, and */2 in Days means the task will run on 1:30 - 1:35 AM and 2:30 - 2:35 PM every other day.": "작업을 수행할 시간입니다. crontab(5) 표준으로 입력합니다.

심볼:
쉼표(,)로 각 값을 구분합니다.
별표(*)는 \"일치하는 모든 값\"을 의미합니다.
하이픈으로 연결한 수(1-5)는 시간 범위를 지정합니다.
빗금(/)은 값의 단계를 지정합니다: '*/2'은(는) '2분마다'를 의미합니다.

예시: '분'에 '30-35', '시'에 '1,14', '일'에 '*/2'를 입력하면, '2일마다 오전 1시 30-35분, 오후 2시 30-35분'에 작업을 실행합니다.", "The update file is temporarily stored here before being applied.": "업데이트 파일을 적용하기 전에 이곳에 잠시 보관합니다.", "The user account Email address to use for the envelope From email address. The user account Email in Accounts > Users > Edit must be configured first.": "편지봉투의 보낸 사람 이메일 주소로 사용할 사용자 계정의 이메일 주소입니다.", "The user-defined string that can unlock this dataset.": "이 데이터셋의 잠금을 해제하는 사용자 정의 문자열입니다.", @@ -5292,7 +5292,7 @@ "{n} RPM": "{n} RPM", "{n} from {dataset}": "{dataset}에서 {n}개", "{n}% Uploaded": "{n}% 업로드 됨", - "{oauthType} credentials have been applied.": "{oauthType} 작업증명을 적용했습니다.", + "{oauthType} credentials have been applied.": "{oauthType} 자격증명을 적용했습니다.", "{port} (virtual)": "{portal} (가상)", "{rate} RPM": "{rate} RPM", "{seconds, plural, =1 {# second} other {# seconds}}": "{seconds}초", @@ -5318,4 +5318,4 @@ "{used} of {total} ({used_pct})": "{total} 중 {used} ({used_pct})", "{version} is available!": "{version}이 준비되었습니다!", "{view} on {enclosure}": "{enclousure}의 {view}" -} \ No newline at end of file +} From 7ab090707ee2514e31555fc3a0c712cab0ea5979 Mon Sep 17 00:00:00 2001 From: Evgeny Stepanovych Date: Tue, 7 Jan 2025 10:44:10 -0500 Subject: [PATCH 23/32] NAS-133432: Disk overview is broken in enclosure (#11294) --- .../pages/enclosure-page/enclosure-page.component.html | 2 +- .../pages/enclosure-page/enclosure-page.component.spec.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/pages/system/enclosure/components/pages/enclosure-page/enclosure-page.component.html b/src/app/pages/system/enclosure/components/pages/enclosure-page/enclosure-page.component.html index 8f93fabc137..f80fef07096 100644 --- a/src/app/pages/system/enclosure/components/pages/enclosure-page/enclosure-page.component.html +++ b/src/app/pages/system/enclosure/components/pages/enclosure-page/enclosure-page.component.html @@ -26,7 +26,7 @@
@if (selectedSlot()) { - + } @else { } diff --git a/src/app/pages/system/enclosure/components/pages/enclosure-page/enclosure-page.component.spec.ts b/src/app/pages/system/enclosure/components/pages/enclosure-page/enclosure-page.component.spec.ts index bd5613560c1..4d72cc2cef8 100644 --- a/src/app/pages/system/enclosure/components/pages/enclosure-page/enclosure-page.component.spec.ts +++ b/src/app/pages/system/enclosure/components/pages/enclosure-page/enclosure-page.component.spec.ts @@ -109,6 +109,7 @@ describe('EnclosurePageComponent', () => { it('shows disk details overview is selected', () => { expect(spectator.query(DiskDetailsOverviewComponent)).toExist(); + expect(spectator.query(DiskDetailsOverviewComponent).selectedSlot).toEqual(selectedSlot()); }); it('redirects to a separate MINI page when selected enclosure is a MINI', () => { From 247cab3a64c012bfd4f0c9305dc432d5ca3982fa Mon Sep 17 00:00:00 2001 From: Evgeny Stepanovych Date: Tue, 7 Jan 2025 10:45:17 -0500 Subject: [PATCH 24/32] NAS-132661: Move 2FA text (#11295) --- .../signin-form/signin-form.component.html | 4 ++++ .../signin-form/signin-form.component.ts | 20 +++++++++---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/app/pages/signin/signin-form/signin-form.component.html b/src/app/pages/signin/signin-form/signin-form.component.html index f3da2c2b7a1..09ae43720ef 100644 --- a/src/app/pages/signin/signin-form/signin-form.component.html +++ b/src/app/pages/signin/signin-form/signin-form.component.html @@ -39,6 +39,10 @@ } } @if (hasTwoFactor) { +

+ {{ '2FA has been configured for this account. Enter the OTP to continue.' | translate }} +

+ Date: Tue, 7 Jan 2025 11:21:20 -0500 Subject: [PATCH 25/32] NAS-133378: Fix `checkin.spec.ts` after Slide In migration (#11281) --- src/app/pages/network/tests/checkin.spec.ts | 48 +---- src/assets/i18n/ko.json | 186 ++++++++++---------- src/assets/i18n/zh-hant.json | 24 +-- 3 files changed, 114 insertions(+), 144 deletions(-) diff --git a/src/app/pages/network/tests/checkin.spec.ts b/src/app/pages/network/tests/checkin.spec.ts index 05186483471..e46ca77581e 100644 --- a/src/app/pages/network/tests/checkin.spec.ts +++ b/src/app/pages/network/tests/checkin.spec.ts @@ -5,11 +5,11 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatButtonHarness } from '@angular/material/button/testing'; import { MatInputModule } from '@angular/material/input'; import { - createHostFactory, - mockProvider, SpectatorHost, + createComponentFactory, + mockProvider, Spectator, } from '@ngneat/spectator/jest'; import { MockComponents } from 'ng-mocks'; -import { of, Subject } from 'rxjs'; +import { of } from 'rxjs'; import { MockApiService } from 'app/core/testing/classes/mock-api.service'; import { mockCall, mockApi } from 'app/core/testing/utils/mock-api.utils'; import { mockAuth } from 'app/core/testing/utils/mock-auth.utils'; @@ -18,7 +18,6 @@ import { ProductType } from 'app/enums/product-type.enum'; import { helptextInterfaces } from 'app/helptext/network/interfaces/interfaces-list'; import { NetworkInterface, PhysicalNetworkInterface } from 'app/interfaces/network-interface.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; -import { IxInputHarness } from 'app/modules/forms/ix-forms/components/ix-input/ix-input.harness'; import { IxIpInputWithNetmaskComponent, } from 'app/modules/forms/ix-forms/components/ix-ip-input-with-netmask/ix-ip-input-with-netmask.component'; @@ -29,7 +28,6 @@ import { IxTableCellDirective } from 'app/modules/ix-table/directives/ix-table-c import { SlideInComponent } from 'app/modules/slide-ins/components/slide-in/slide-in.component'; import { SlideIn } from 'app/modules/slide-ins/slide-in'; import { SlideInRef } from 'app/modules/slide-ins/slide-in-ref'; -import { SlideInResponse } from 'app/modules/slide-ins/slide-in.interface'; import { InterfaceFormComponent } from 'app/pages/network/components/interface-form/interface-form.component'; import { InterfacesCardComponent } from 'app/pages/network/components/interfaces-card/interfaces-card.component'; import { IpmiCardComponent } from 'app/pages/network/components/ipmi-card/ipmi-card.component'; @@ -44,13 +42,9 @@ import { InterfacesStore } from 'app/pages/network/stores/interfaces.store'; import { NetworkService } from 'app/services/network.service'; import { SystemGeneralService } from 'app/services/system-general.service'; -/** - * Ignored for now, to merge PR first, not sure about the quick solution for this one for now. - */ -describe.skip('NetworkComponent', () => { - let spectator: SpectatorHost; +describe('NetworkComponent', () => { + let spectator: Spectator; let loader: HarnessLoader; - let rootLoader: HarnessLoader; let api: MockApiService; const existingInterface = { @@ -74,7 +68,7 @@ describe.skip('NetworkComponent', () => { let isTestingChanges = false; let wasEditMade = false; - const createHost = createHostFactory({ + const createComponent = createComponentFactory({ component: NetworkComponent, imports: [ ReactiveFormsModule, @@ -111,10 +105,6 @@ describe.skip('NetworkComponent', () => { isTestingChanges = false; return undefined; }), - mockCall('interface.update', () => { - wasEditMade = true; - return undefined; - }), mockCall('interface.commit', () => { isTestingChanges = true; return undefined; @@ -147,26 +137,10 @@ describe.skip('NetworkComponent', () => { ], }); - const mockComponentInfo = { - id: 'test-slide-in', - component: InterfaceFormComponent, - wide: false, - data: existingInterface, - close$: new Subject(), - }; - beforeEach(() => { - spectator = createHost(` - - - `, { - hostProps: { - componentInfoMock: mockComponentInfo, - }, - }); + spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - rootLoader = TestbedHarnessEnvironment.documentRootLoader(spectator.fixture); api = spectator.inject(MockApiService); isTestingChanges = false; @@ -174,15 +148,11 @@ describe.skip('NetworkComponent', () => { }); async function makeEdit(): Promise { + wasEditMade = true; + const table = await loader.getHarness(IxTableHarness); const editIcon = await table.getHarnessInRow(IxIconHarness.with({ name: 'edit' }), 'eno1'); await editIcon.click(); - - const input = await rootLoader.getHarness(IxInputHarness.with({ label: 'Description' })); - await input.setValue('test'); - - const saveButton = await rootLoader.getHarness(MatButtonHarness.with({ text: 'Save' })); - await saveButton.click(); spectator.detectComponentChanges(); } diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index ba7c7e3a55f..46bbb24e202 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -1,102 +1,10 @@ { "": "", - "Any OS": "모든 OS", - "Change Session Timeout in": "세션 제한시간 변경:", - "Change from public to increase system security. Can only contain alphanumeric characters, underscores, dashes, periods, and spaces. This can be left empty for SNMPv3 networks.": "시스템 보안을 강화하기 위해 공개 상태에서 변경합니다. 영문자와 숫자, 밑줄, 대시, 마침표, 공백만 포함할 수 있습니다. SNMPv3 네트워크의 경우 비워둘 수 있습니다.", - "Changes to Hosts Allow or Hosts Deny take effect when the SMB service restarts.": "허용한 호스트 또는 거부한 호스트의 변경사항은 SMB 서비스를 재시작해야 적용됩니다.", - "Changes to ACL type affect how on-disk ZFS ACL is written and read.\nWhen the ACL type is changed from POSIX to NFSv4, no migration is performed for default and access ACLs encoded in the posix1e acl extended attributes to native ZFS ACLs.\nWhen ACL type is changed from NFSv4 to POSIX, native ZFS ACLs are not converted to posix1e extended attributes, but the native ACL will be used internally by ZFS for access checks.\n\nThis means that the user must manually set new ACLs recursively on the dataset after ACL type changes in order to avoid unexpected permissions behavior.\n\nThis action will be destructive, and so it is advised to take a ZFS snapshot of the dataset prior to ACL type changes and permissions modifications.": "ACL 유형을 변경하면 디스크상의 ZFS ACL을 작성하고 읽는 방식도 영향을 받습니다.\n ACL 유형을 POSIX에서 NFSv4로 변경하면, posix1e ACL 확장 속성에 인코딩된 기본 ACL 및 액세스 ACL을 네이티브 ZFS ACL로 마이그레이션하지 않습니다.\n ACL 유형을 NFSv4에서 POSIX로 변경하면, 네이티브 ZFS ACL을 posix1e 확장 속성으로 변환하지 않고 ZFS는 내부적으로 네이티브 ACL을 접근 검사를 위해 사용합니다.\n\n 즉, 예상치 못한 권한 동작을 방지하려면, ACL 유형을 변경한 후 사용자가 데이터셋에 대해 새로운 ACL을 직접 하위항목까지 설정해야 합니다.\n\n 이 작업은 파괴적이므로, ACL 유형을 변경하고 권한을 편집하기 전에 데이터셋의 ZFS 스냅샷을 만드는 것을 권장합니다.", - "Changing Advanced settings can be dangerous when done incorrectly. Please use caution before saving.": "고급설정은 올바르지 않게 설정할 경우 위험할 수 있습니다. 저장하기 전에 주의하시기 바랍니다.", - "Changing dataset permission mode can severely affect existing permissions.": "데이터셋의 권한 모드를 변경하면 기존 권한에 치명적인 영향을 미칠 수 있습니다.", - "Changing global 2FA settings might cause user secrets to reset. Which means users will have to reconfigure their 2FA. Are you sure you want to continue?": "전역 2단계 인증 설정을 변경하면 사용자 시크릿이 재설정될 수 있습니다. 사용자는 각자의 2단계 인증을 다시 구성해야 합니다. 계속하시겠습니까?", - "Choose File for {label}": "{label}의 파일 선택", - "Choose a connection that has been saved in Credentials > Backup Credentials > SSH Connections.": "자격증명 > 백업 자격증명 > SSH 연결에 저장된 연결을 선택합니다.", - "Choose a location to store the installer image file.": "설치 이미지 파일을 저장할 위치를 선택합니다.", - "Choose a new disk for the pool. To protect any existing data, adding the selected disk is stopped when the disk is already in use or has partitions present.": "풀에 할당할 새로운 디스크를 선택합니다. 기존 데이터를 보호하기 위해, 디스크가 사용중이거나 파티션이 존재하는 경우 선택한 디스크의 추가를 멈춥니다.", - "Choose a path to the user's home directory. If the directory exists and matches the username, it is set as the user's home directory. When the path does not end with a subdirectory matching the username, a new subdirectory is created only if the 'Create Home Directory' field is marked checked. The full path to the user's home directory is shown here when editing a user.": "사용자의 홈 디렉터리 경로를 선택합니다. 디렉터리가 존재하고 사용자 이름과 일치하면, 해당 디렉터리는 사용자의 홈 디렉터리가 됩니다. 경로가 사용자 이름과 일치하는 하위 디렉터리로 끝나지 않으면, '홈 디렉터리 생성'을 선택했다면 새로운 디렉터리를 생성합니다. 사용자 홈 디렉터리의 전체 경로는 사용자를 수정할 때 이곳에 표시됩니다.", - "Choose a recent IP address to limit the usage when accessing the administrative GUI. The built-in HTTP server binds to the wildcard address of 0.0.0.0 (any address) and issues an alert if the specified address becomes unavailable.": "관리 GUI로 접근시 사용을 제한할 최근 IP 주소를 선택합니다. 내장된 HTTP 서버는 와일드카드 주소인 0.0.0.0(모든 주소)에 묶이고, 지정한 주소를 사용할 수 없는 경우 경고를 발행합니다.", - "Choose a recent IPv6 address to limit the usage when accessing the administrative GUI. The built-in HTTP server binds to the wildcard address of 0.0.0.0 (any address) and issues an alert if the specified address becomes unavailable.": "관리 GUI로 접근시 사용을 제한할 최근 IPv6 주소를 선택합니다. 내장된 HTTP 서버는 와일드카드 주소인 0.0.0.0(모든 주소)에 묶이고, 지정한 주소를 사용할 수 없는 경우 경고를 발행합니다.", - "Choose a safety level for the rollback action. The rollback is canceled when the safety check finds additional snapshots that are directly related to the dataset being rolled back.": "되돌리기 동작의 안전 수준을 선택합니다. 안전 검사에서 되돌리는 데이터셋과 직접적으로 연결된 추가 스냅샷을 발견할 경우 되돌리기 작업을 취소합니다.", - "Choose a saved SSH Keypair or select Generate New to create a new keypair and use it for this connection.": "저장된 SSH 키쌍을 선택하거나 새로 생성을 눌러 새로운 키쌍을 생성해 이 연결에 사용합니다.", - "Choose a temporary location for the encryption key that will decrypt replicated data.": "복제한 데이터를 복호화 할 암호화 키를 임시로 저장할 위치를 선택합니다.", - "Choose a time format.": "시간 형식을 선택합니다.", - "Choose an alert service to display options for that service.": "경고 서비스를 선택해 해당 서비스의 선택사항을 표시합니다.", - "Choose an encryption mode to use with LDAP.": "LDAP에 사용할 암호화 모드를 선택합니다.", - "Choose between Internal CA, Intermediate CA, and Import CA. An Internal CA functions like a publicly trusted CA to sign certificates for an internal network. They are not trusted outside the private network. An Intermediate CA lives between the root and end entity certificates and its main purpose is to define and authorize the types of certificates that can be requested from the root CA. Import CA allows an existing CA to be imported onto the system.
For more information see What are Subordinate CAs and Why Would You Want Your Own?": "내부 인증기관, 중간 인증기관, 또는 인증기관 불러오기 중에 선택합니다. 내부 인증기관은 공개된 신뢰할 수 있는 인증기관처럼 기능해 내부 네트워크를 위한 인증서에 서명합니다. 사설 네트워크 밖에선 신뢰되지 없습니다. 중간 인증기관은 루트 인증서와 개인 인증서 사이에 있으며, 주 목적은 루트 인증기관이 요구할 수 있는 인증서 유형을 정의하고 인증하는 것입니다. 인증기관 불러오기는 기존 인증기관을 시스템으로 불러옵니다.
자세한 내용은 하위 인증기관이란 무엇이고, 왜 자체 인증기관이 필요한가요?를 참고하시기 바랍니다.", - "Choose between a Hex (base 16 numeral) or Passphrase (alphanumeric) style encryption key.": "16진수(HEX) 또는 비밀구절(영문자, 숫자) 유형의 암호화 키를 선택합니다.", - "Choose how many log entries to create. Choices range from the least log entries (Emergency) to the most (Debug).": "기록 항목을 얼마나 많이 생성할지를 선택합니다. 범위는 가장 적은 것(긴급)부터 가장 많은 것(디버그)까지입니다.", - "Choose one of the presets or choose Custom to use the advanced scheduler.": "사전설정 중에 선택하거나 사용자 정의를 선택해 고급 일정구성을 사용합니다.", - "Choose one of the presets or select Custom to open the advanced scheduler.": "사전설정 중에 선택하거나 사용자 정의를 선택해 고급 일정구성을 엽니다.", - "Choose the backend to map Windows security identifiers (SIDs) to UNIX UIDs and GIDs. Click Edit to configure that backend.": "Windows 보안 식별자(SID)를 유닉스 UID 및 GID에 연결할 백엔드를 선택합니다. 수정을 눌러 백엔드를 구성할 수 있습니다.", - "Choose the hour and minute when new resilver tasks are not allowed to start. This does not affect active resilver tasks.": "새로운 리실버 작업을 시작하지 않을 시간(시, 분)을 선택합니다. 활성화된 리실버 작업에는 영향을 미치지 않습니다.", - "Choose the hour and minute when resilver tasks can be started.": "리실버 작업을 시작할 수 있는 시간(시, 분)을 선택합니다.", - "Choose the platform that will use this share. The associated options are applied to this share.": "이 공유를 사용할 플랫폼을 선택합니다. 연결된 선택사항이 이 공유에 적용됩니다.", - "Choose the schema to use when querying AD for user/group info. rfc2307 uses the schema support included in Windows 2003 R2, sfu is for Service For Unix 3.0 or 3.5, and sfu20 is for Service For Unix 2.0.": "AD에서 사용자/그룹 정보를 요청할 때 사용할 방식을 선택합니다. rfc2307은 Windows 2003 R2에 포함된 방식 지원용, sfu는 Service for Unix 3.0 또는 3.5 용, sfu20은 Service for Unix 2.0 용입니다.", - "Choose the schema to use with LDAP authentication for SMB shares. The LDAP server must be configured with Samba attributes to use a Samba Schema. Options include RFC2307 (included in Windows 2003 R2) and Service for Unix (SFU). For SFU 3.0 or 3.5, choose \"SFU\". For SFU 2.0, choose \"SFU20\".": "SMB 공유에서 LDAP 인증에 사용할 방식을 선택합니다. LDAP 서버가 Samba 방식을 사용하려면 반드신 Samba 속성으로 구성되어야 합니다. 선택사항은 RFC2307(Windows 2003 R2에 포함)과 Service for Unix(SFU)입니다. SFU 3.0 또는 3.5를 위해선 \"SFU\"를 선택합니다. SFU 2.0을 위해선 \"SFU20\"을 선택합니다.", - "Choose the speed in bps used by the serial port.": "시리얼 포트의 속도(bps)를 선택합니다.", - "Choose the test type. See smartctl(8) for descriptions of each type. Some types will degrade performance or take disks offline. Avoid scheduling S.M.A.R.T. tests simultaneously with scrub or resilver operations.": "검사 유형을 선택합니다. 각 유형의 설명은 smartctl(8)을(를) 참고하십시오. 어떤 유형은 성능을 떨어뜨리거나 디스크를 오프라인 상태로 바꿉니다. S.M.A.R.T. 검사를 스트럽이나 리실버 작업과 동시에 진행하지 마십시오.", - "Choose the type of interface. Bridge creates a logical link between multiple networks. Link Aggregation combines multiple network connections into a single interface. A Virtual LAN (VLAN) partitions and isolates a segment of the connection. Read-only when editing an interface.": "인터페이스의 유형을 선택합니다. 브리지는 여러 네트워크 사이에 논리적 연결을 생성합니다. 링크 애그리게이션은 여러 네트워크 연결을 하나의 인터페이스로 조합합니다. 가상 랜(VLAN)은 각 연결을 분할하고 격리합니다. 인터페이스를 수정하는 중에는 읽기전용으로 바뀝니다.", - "Choose the type of permissions. Basic shows general permissions. Advanced shows each specific type of permission for finer control.": "권한 유형을 선택합니다. 기본은 일반적인 권한만 보여줍니다. 고급은 세부적인 조정을 위해 구체적인 권한 유형을 보여줍니다.", - "Choose the type that matches the type of client accessing the pool/dataset.": "풀/데이터셋에 접근하려는 클라이언트의 유형과 일치하는 유형을 선택합니다.", - "Choose to connect using either SSH private key stored in user's home directory or SSH connection from the keychain": "연결에 사용자 홈 디렉터리에 저장된 SSH 개인 키를 사용할지 키체인의 SSH 연결을 사용할지 선택합니다.", - "Choose to either use a custom-defined remote module of the rsync server or to use an SSH configuration for the rsync task.": "Rsync 서버의 사용자 정의된 원격 모듈을 사용할지 Rsync 작업의 SSH 구성을 사용할지 선택합니다.", - "Choose when the UPS initiates shutdown.": "언제 UPS를 종료할지 선택합니다.", - "Choosing an entry loads a preset ACL that is configured to match general permissions situations.": "항목을 선택하면 일반적인 권한 상황에 맞추어 구성한 ACL 사전설정을 불러옵니다.", - "Classification for each S3 object. Choose a class based on the specific use case or performance requirements. See Amazon S3 Storage Classes for more information.": "각 S3 객체에 대한 분류입니다. 특정 사용 사례 또는 성능 요구 사항에 따라 단계를 선택합니다. 자세한 내용은 Amazon S3 Storage Classes을(를) 참고하십시오.", - "Click \"Add\" to specify NFS client hosts for this share. If both networks and hosts are empty the share will be exported to everyone.": "\"추가\"를 눌러 이 공유의 NFS 클라이언트 호스트를 지정합니다. 네트워크와 호스트가 모두 비어 있으면 공유가 모든 사용자에게 표시됩니다.", - "Click \"Add\" to specify NFS client network ranges for this share. If both networks and hosts are empty the share will be exported to everyone.": "\"추가\"를 눌러 이 공유의 NFS 클라이언트 네트워크 범위를 지정합니다. 네트워크와 호스트가 모두 비어 있으면 공유가 모든 사용자에게 표시됩니다.", - "Clicking Continue allows TrueNAS to finish the update in the background while Abort stops the process and reverts the dataset ACL to the previously active ACL.": "'계속'을 누르면 TrueNAS가 백그라운드에서 갱신을 완료하고, '중단'을 누르면 작업을 중지하고 데이터셋 ACL을(를) 이전 활성 ACL로 되돌립니다. ", - "Combine multiple, critical-for-failover interfaces into a group. Groups apply to single systems. A failover occurs when every interface in the group fails. Groups with a single interface trigger a failover when that interface fails. Configuring the system to failover when any interface fails requires marking each interface as critical and placing them in separate groups.": "장애조치시 중요 인터페이스를 포함한 여러 인터페이스를 그룹으로 묶습니다. 그룹은 단일 시스템에 적용됩니다. 그룹 내의 모든 인터페이스가 실패하면 장애조치를 실행합니다. 그룹에 하나의 인터페이스만 있는 경우 해당 인터페이스가 실패하면 장애조치를 실행합니다. 어떤 인터페이스에 장애가 발생했을 때 시스템이 장애조치를 실행하도록 구성하려면, 각 인터페이스를 중요로 표시하고 별도의 그룹으로 배치해야 합니다.", - "Connect using:": "다음을 사용하여 연결:", - "Content Commitment": "Content Commitment", - "Enter a list of chat IDs separated by space, comma or semicolon. To find your chat ID send a message to the bot, group or channel and visit https://api.telegram.org/bot(BOT_TOKEN)/getUpdates.": "공백 또는 쉼표, 쌍반점으로 구분한 채팅 ID의 목록을 입력합니다. 채팅 ID를 찾으려면 봇이나 그룹, 채널에 메시지를 보내고 https://api.telegram.org/bot(BOT_TOKEN)/getUpdates(으)로 방문합니다.", - "Enter a list of denied hostnames or IP addresses. Separate entries by pressing Enter. If neither *Hosts Allow* or *Hosts Deny* contains an entry, then SMB share access is allowed for any host.

If there is a *Hosts Allow* list but no *Hosts Deny* list, then only allow hosts on the *Hosts Allow* list.

If there is a *Hosts Deny* list but no *Hosts Allow* list, then allow all hosts that are not on the *Hosts Deny* list.

If there is both a *Hosts Allow* and *Hosts Deny* list, then allow all hosts that are on the *Hosts Allow* list.

If there is a host not on the *Hosts Allow* and not on the *Hosts Deny* list, then allow it.": "거부한 호스트 이름 또는 IP 주소의 목록을 입력합니다. Enter키를 눌러 항목을 구분합니다. *허용한 호스트* 또는 *거부한 호스트*에 항목이 없으면 SMB 공유는 모든 호스트의 접근을 허용합니다.

만약 *허용한 호스트* 목록은 있고 *거부한 호스트* 목록은 없으면, *허용한 호스트* 목록에 있는 호스트만 허용합니다.

만약 *거부한 호스트* 목록은 있고 *허용한 호스트* 목록은 없으면, *거부한 호스트* 목록에 있는 호스트를 제외한 모든 호스트를 허용합니다.

*허용한 호스트*과 *거부한 호스트*목록이 모두 있으면, *허용한 호스트* 목록에 있는 호스트만 허용합니다.

*허용한 호스트* 및 *거부한 호스트* 목록에 없는 호스트는 허용합니다.", - "Enter a long string of random characters for use as salt for the encryption password. Warning: Always securely back up the encryption salt value! Losing the salt value will result in data loss.": "암호화 비밀번호의 솔트(salt)로 사용할 긴 무작위 문자열을 입력합니다. 위험: 암호화 솔트 값은 안전하게 보관하십시오! 솔트 값을 잃으면 데이터도 잃습니다.", - "Enter a name for the interface. Use the format bondX, vlanX, or brX where X is a number representing a non-parent interface. Read-only when editing an interface.": "인터페이스의 이름을 입력합니다. bondX 또는 vlanX, brX 형식을 사용합니다. X는 상위 인터페이스가 아님을 나타내는 숫자입니다. 인터페이스를 수정하는 중에는 읽기전용으로 바뀝니다.", - "Enter a name for this Keytab.": "이 키탭의 이름을 입력합니다.", - "Enter a number of degrees in Celsius. S.M.A.R.T. reports if the temperature of a drive has changed by N degrees Celsius since the last report.": "섭씨 온도를 입력합니다. 드라이브의 온도가 마지막 보고로부터 섭씨 N도 이상 변화하면 S.M.A.R.T.에서 보고합니다.", - "Enter a number of seconds to wait before alerting that the service cannot reach any UPS. Warnings continue until the situation is fixed.": "서비스가 어떤 UPS에도 접근하지 못할 때, 경고하기까지 기다릴 시간(초)입니다. 상황이 해결될 때가지 경고는 계속됩니다.", - "Enter a one to three paragraph summary of the issue. Describe the problem and provide any steps to replicate the issue.": "해당 문제를 1~3문단으로 작성합니다. 문제에 대해 설명하고 재현 방법을 제공합니다.", - "Enter a password for the rancher user. This is used to log in to the VM from the serial shell.": "rancher 사용자의 비밀번호를 입력합니다. 시리얼 셸에서 가상머신으로 로그인할 때 사용됩니다.", - "Enter a password for the SPICE display.": "SPICE 화면의 비밀번호를 입력합니다.", - "Enter a port to bind rpc.lockd(8).": "rpc.lockd(8)에 연결할 포트를 입력합니다.", - "Enter a port to bind mountd(8).": "mountd(8)에 연결할 포트를 입력합니다.", - "Enter a port to bind rpc.statd(8).": "rpc.statd(8)에 연결할 포트를 입력합니다.", - "Enter a shell glob pattern to match files and directories to exclude from the backup.": "백업에서 제외할 파일과 디렉터리의 셸 글로브 패턴을 입력합니다.", - "Enter a value in seconds for the the UPS to wait before initiating shutdown. Shutdown will not occur if power is restored while the timer is counting down. This value only applies when Shutdown mode is set to UPS goes on battery.": "UPS가 종료하기 전에 기다릴 시간(초)입니다. 이 시간동안 전원이 복원되면 종료하지 않습니다. 이 값은 종료 모드UPS 배터리로 전환일 경우에만 적용됩니다.", - "Enter a value to use for the sysctl variable.": "사용할 sysctl 변수를 입력합니다.", - "Enter additional smb.conf options. See the Samba Guide for more information on these settings.
To log more details when a client attempts to authenticate to the share, add log level = 1, auth_audit:5.": "추가 smb.conf 선택사항을 입력합니다. 이 설정에 대한 자세한 내용은 Samba 안내서를 참고하십시오.
클라이언트가 공유로 인증을 시도할 때 더 상세한 기록을 남기려면 log level = 1, auth_audit:5을(를) 추가합니다.", - "Error details for ": "오류 상세: ", - "Front": "앞", - "Hot Spare": "대기중인 여분", - "Hottest": "최고온도", - "Linux Only": "리눅스 전용", - "Long": "Long", - "Name ~ \"admin\"": "Name ~ \"admin\"", - "Networking": "네트워크", - "OpenStack Swift": "OpenStack Swift", - "Opened at": "개시 시각", - "Other Execute": "기타 실행", - "PULL": "PULL", - "PUSH": "PUSH", - "Pin vcpus": "vCPU 핀", - "Power On Hours Ago": "검사 후 전원 인가 시간", - "Prototyping": "시제품", "Prune By": "", - "Pull": "Pull", "Pull Image": "", "Pulling...": "", - "Push": "Push", - "Quick": "빠르게", "Quiet": "", - "Realm": "영역", - "Rear": "뒤", - "Short": "Short", "Tail Lines": "", - "Thick": "Thick", - "Unkeep": "유지하지 않음", - "Until": "만료일", - "Virtualization (Old)": "가상화 (예전)", - "Virtualization Method": "가상화 방식", "\n It looks like your session has been inactive for more than {lifetime} seconds.
\n For security reasons we will log you out at {time}.\n ": "세션의 비활성화 시간이 {lifetime}초를 넘었습니다.
보안을 위해 {time}에 로그아웃 되었습니다.", " Est. Usable Raw Capacity": " 사용 가능한 원시 용량 추정", " When the UPS Mode is set to slave. Enter the open network port number of the UPS Master system. The default port is 3493.": " UPS 모드슬레이브일 때, 마스터 UPS 시스템의 네트워크 포트 번호를 입력합니다. 기본 포트는 3493입니다.", @@ -515,6 +423,7 @@ "An update is already applied. Please restart the system.": "업데이트가 이미 적용되었습니다. 시스템을 재시작해 주십시오.", "Anonymous User Download Bandwidth": "익명 사용자 다운로드 대역폭", "Anonymous User Upload Bandwidth": "익명 사용자 업로드 대역폭", + "Any OS": "모든 OS", "Any notes about initiators.": "이니시에이터에 대한 비고입니다.", "Any system service can communicate externally.": "시스템 서비스는 외부와 통신할 수 있습니다.", "Api Keys": "API 키", @@ -855,10 +764,17 @@ "Change Number Of Virtual Ports": "가상 포트 번호 변경", "Change Password": "비밀번호 변경", "Change Server": "서버 변경", + "Change Session Timeout in": "세션 제한시간 변경:", + "Change from public to increase system security. Can only contain alphanumeric characters, underscores, dashes, periods, and spaces. This can be left empty for SNMPv3 networks.": "시스템 보안을 강화하기 위해 공개 상태에서 변경합니다. 영문자와 숫자, 밑줄, 대시, 마침표, 공백만 포함할 수 있습니다. SNMPv3 네트워크의 경우 비워둘 수 있습니다.", "Change log": "변경내역", "Change the default password to improve system security. The new password cannot contain a space or #.": "기본 비밀번호를 바꿔 시스템 보안을 향상시킵니다. 비밀번호는 공백이나 #을(를) 포함할 수 없습니다.", "Changelog": "변경내역", "Changes Saved": "변경사항 저장함", + "Changes to Hosts Allow or Hosts Deny take effect when the SMB service restarts.": "허용한 호스트 또는 거부한 호스트의 변경사항은 SMB 서비스를 재시작해야 적용됩니다.", + "Changes to ACL type affect how on-disk ZFS ACL is written and read.\nWhen the ACL type is changed from POSIX to NFSv4, no migration is performed for default and access ACLs encoded in the posix1e acl extended attributes to native ZFS ACLs.\nWhen ACL type is changed from NFSv4 to POSIX, native ZFS ACLs are not converted to posix1e extended attributes, but the native ACL will be used internally by ZFS for access checks.\n\nThis means that the user must manually set new ACLs recursively on the dataset after ACL type changes in order to avoid unexpected permissions behavior.\n\nThis action will be destructive, and so it is advised to take a ZFS snapshot of the dataset prior to ACL type changes and permissions modifications.": "ACL 유형을 변경하면 디스크상의 ZFS ACL을 작성하고 읽는 방식도 영향을 받습니다.\n ACL 유형을 POSIX에서 NFSv4로 변경하면, posix1e ACL 확장 속성에 인코딩된 기본 ACL 및 액세스 ACL을 네이티브 ZFS ACL로 마이그레이션하지 않습니다.\n ACL 유형을 NFSv4에서 POSIX로 변경하면, 네이티브 ZFS ACL을 posix1e 확장 속성으로 변환하지 않고 ZFS는 내부적으로 네이티브 ACL을 접근 검사를 위해 사용합니다.\n\n 즉, 예상치 못한 권한 동작을 방지하려면, ACL 유형을 변경한 후 사용자가 데이터셋에 대해 새로운 ACL을 직접 하위항목까지 설정해야 합니다.\n\n 이 작업은 파괴적이므로, ACL 유형을 변경하고 권한을 편집하기 전에 데이터셋의 ZFS 스냅샷을 만드는 것을 권장합니다.", + "Changing Advanced settings can be dangerous when done incorrectly. Please use caution before saving.": "고급설정은 올바르지 않게 설정할 경우 위험할 수 있습니다. 저장하기 전에 주의하시기 바랍니다.", + "Changing dataset permission mode can severely affect existing permissions.": "데이터셋의 권한 모드를 변경하면 기존 권한에 치명적인 영향을 미칠 수 있습니다.", + "Changing global 2FA settings might cause user secrets to reset. Which means users will have to reconfigure their 2FA. Are you sure you want to continue?": "전역 2단계 인증 설정을 변경하면 사용자 시크릿이 재설정될 수 있습니다. 사용자는 각자의 2단계 인증을 다시 구성해야 합니다. 계속하시겠습니까?", "Changing to a nightly train is one-way. Changing back to a stable train is not supported! ": "개발자 버전으로의 전환은 되돌릴 수 없습니다. 안정 버전으로 돌아갈 수 없습니다!", "Channel": "채널", "Channel {n}": "채널 {n}", @@ -889,31 +805,68 @@ "Choose Master if the UPS is plugged directly into the system serial port. The UPS will remain the last item to shut down. Choose Slave to have this system shut down before Master. See the Network UPS Tools Overview.": "UPS를 시스템 시리얼 포트에 직접 연결했으면 마스터를 선택합니다. UPS가 마지막으로 종료됩니다. 마스터 이전에 시스템을 종료하려면 슬레이브를 선택합니다. Network UPS Tools 개요를 참고하십시오.", "Choose ON to update the access time for files when they are read. Choose Off to prevent producing log traffic when reading files. This can result in significant performance gains.": "켜짐은 파일을 읽을 때마다 접근 시각을 갱신합니다. 꺼짐은 파일을 읽을 때 기록 트래픽이 발생하지 않도록 합니다. 이를 통해 상당한 성능 향상을 가져올 수 있습니다.", "Choose File": "파일 선택", + "Choose File for {label}": "{label}의 파일 선택", "Choose Pool": "풀 선택", "Choose a DNS provider and configure any required authenticator attributes.": "DNS 공급자를 선택해 필요한 인증기 속성을 구성합니다.", "Choose a Tag": "태그 선택", + "Choose a connection that has been saved in Credentials > Backup Credentials > SSH Connections.": "자격증명 > 백업 자격증명 > SSH 연결에 저장된 연결을 선택합니다.", "Choose a date format.": "날자 유형을 선택합니다.", + "Choose a location to store the installer image file.": "설치 이미지 파일을 저장할 위치를 선택합니다.", + "Choose a new disk for the pool. To protect any existing data, adding the selected disk is stopped when the disk is already in use or has partitions present.": "풀에 할당할 새로운 디스크를 선택합니다. 기존 데이터를 보호하기 위해, 디스크가 사용중이거나 파티션이 존재하는 경우 선택한 디스크의 추가를 멈춥니다.", "Choose a new virtual port": "새로운 가상 포트 선택", + "Choose a path to the user's home directory. If the directory exists and matches the username, it is set as the user's home directory. When the path does not end with a subdirectory matching the username, a new subdirectory is created only if the 'Create Home Directory' field is marked checked. The full path to the user's home directory is shown here when editing a user.": "사용자의 홈 디렉터리 경로를 선택합니다. 디렉터리가 존재하고 사용자 이름과 일치하면, 해당 디렉터리는 사용자의 홈 디렉터리가 됩니다. 경로가 사용자 이름과 일치하는 하위 디렉터리로 끝나지 않으면, '홈 디렉터리 생성'을 선택했다면 새로운 디렉터리를 생성합니다. 사용자 홈 디렉터리의 전체 경로는 사용자를 수정할 때 이곳에 표시됩니다.", "Choose a pool for Apps": "앱을 위한 풀 선택", "Choose a pool to scrub.": "스크럽 할 풀을 선택합니다.", "Choose a privacy protocol.": "개인정보 보호 프로토콜을 선택합니다.", + "Choose a recent IP address to limit the usage when accessing the administrative GUI. The built-in HTTP server binds to the wildcard address of 0.0.0.0 (any address) and issues an alert if the specified address becomes unavailable.": "관리 GUI로 접근시 사용을 제한할 최근 IP 주소를 선택합니다. 내장된 HTTP 서버는 와일드카드 주소인 0.0.0.0(모든 주소)에 묶이고, 지정한 주소를 사용할 수 없는 경우 경고를 발행합니다.", + "Choose a recent IPv6 address to limit the usage when accessing the administrative GUI. The built-in HTTP server binds to the wildcard address of 0.0.0.0 (any address) and issues an alert if the specified address becomes unavailable.": "관리 GUI로 접근시 사용을 제한할 최근 IPv6 주소를 선택합니다. 내장된 HTTP 서버는 와일드카드 주소인 0.0.0.0(모든 주소)에 묶이고, 지정한 주소를 사용할 수 없는 경우 경고를 발행합니다.", + "Choose a safety level for the rollback action. The rollback is canceled when the safety check finds additional snapshots that are directly related to the dataset being rolled back.": "되돌리기 동작의 안전 수준을 선택합니다. 안전 검사에서 되돌리는 데이터셋과 직접적으로 연결된 추가 스냅샷을 발견할 경우 되돌리기 작업을 취소합니다.", + "Choose a saved SSH Keypair or select Generate New to create a new keypair and use it for this connection.": "저장된 SSH 키쌍을 선택하거나 새로 생성을 눌러 새로운 키쌍을 생성해 이 연결에 사용합니다.", + "Choose a temporary location for the encryption key that will decrypt replicated data.": "복제한 데이터를 복호화 할 암호화 키를 임시로 저장할 위치를 선택합니다.", + "Choose a time format.": "시간 형식을 선택합니다.", + "Choose an alert service to display options for that service.": "경고 서비스를 선택해 해당 서비스의 선택사항을 표시합니다.", "Choose an authentication method.": "인증 방식을 선택하십시오.", + "Choose an encryption mode to use with LDAP.": "LDAP에 사용할 암호화 모드를 선택합니다.", + "Choose between Internal CA, Intermediate CA, and Import CA. An Internal CA functions like a publicly trusted CA to sign certificates for an internal network. They are not trusted outside the private network. An Intermediate CA lives between the root and end entity certificates and its main purpose is to define and authorize the types of certificates that can be requested from the root CA. Import CA allows an existing CA to be imported onto the system.
For more information see What are Subordinate CAs and Why Would You Want Your Own?": "내부 인증기관, 중간 인증기관, 또는 인증기관 불러오기 중에 선택합니다. 내부 인증기관은 공개된 신뢰할 수 있는 인증기관처럼 기능해 내부 네트워크를 위한 인증서에 서명합니다. 사설 네트워크 밖에선 신뢰되지 없습니다. 중간 인증기관은 루트 인증서와 개인 인증서 사이에 있으며, 주 목적은 루트 인증기관이 요구할 수 있는 인증서 유형을 정의하고 인증하는 것입니다. 인증기관 불러오기는 기존 인증기관을 시스템으로 불러옵니다.
자세한 내용은 하위 인증기관이란 무엇이고, 왜 자체 인증기관이 필요한가요?를 참고하시기 바랍니다.", + "Choose between a Hex (base 16 numeral) or Passphrase (alphanumeric) style encryption key.": "16진수(HEX) 또는 비밀구절(영문자, 숫자) 유형의 암호화 키를 선택합니다.", "Choose container": "컨테이너 선택", + "Choose how many log entries to create. Choices range from the least log entries (Emergency) to the most (Debug).": "기록 항목을 얼마나 많이 생성할지를 선택합니다. 범위는 가장 적은 것(긴급)부터 가장 많은 것(디버그)까지입니다.", "Choose if the .zfs snapshot directory is Visible or Invisible on this dataset.": "이 데이터셋의 .zfs 스냅샷 디렉터리를 보임 또는 숨김으로 설정합니다.", "Choose log": "기록 선택", + "Choose one of the presets or choose Custom to use the advanced scheduler.": "사전설정 중에 선택하거나 사용자 정의를 선택해 고급 일정구성을 사용합니다.", + "Choose one of the presets or select Custom to open the advanced scheduler.": "사전설정 중에 선택하거나 사용자 정의를 선택해 고급 일정구성을 엽니다.", "Choose pod": "파드 선택", "Choose the VM operating system type.": "가상머신 운영체제 유형을 선택합니다.", + "Choose the backend to map Windows security identifiers (SIDs) to UNIX UIDs and GIDs. Click Edit to configure that backend.": "Windows 보안 식별자(SID)를 유닉스 UID 및 GID에 연결할 백엔드를 선택합니다. 수정을 눌러 백엔드를 구성할 수 있습니다.", + "Choose the hour and minute when new resilver tasks are not allowed to start. This does not affect active resilver tasks.": "새로운 리실버 작업을 시작하지 않을 시간(시, 분)을 선택합니다. 활성화된 리실버 작업에는 영향을 미치지 않습니다.", + "Choose the hour and minute when resilver tasks can be started.": "리실버 작업을 시작할 수 있는 시간(시, 분)을 선택합니다.", + "Choose the platform that will use this share. The associated options are applied to this share.": "이 공유를 사용할 플랫폼을 선택합니다. 연결된 선택사항이 이 공유에 적용됩니다.", + "Choose the schema to use when querying AD for user/group info. rfc2307 uses the schema support included in Windows 2003 R2, sfu is for Service For Unix 3.0 or 3.5, and sfu20 is for Service For Unix 2.0.": "AD에서 사용자/그룹 정보를 요청할 때 사용할 방식을 선택합니다. rfc2307은 Windows 2003 R2에 포함된 방식 지원용, sfu는 Service for Unix 3.0 또는 3.5 용, sfu20은 Service for Unix 2.0 용입니다.", + "Choose the schema to use with LDAP authentication for SMB shares. The LDAP server must be configured with Samba attributes to use a Samba Schema. Options include RFC2307 (included in Windows 2003 R2) and Service for Unix (SFU). For SFU 3.0 or 3.5, choose \"SFU\". For SFU 2.0, choose \"SFU20\".": "SMB 공유에서 LDAP 인증에 사용할 방식을 선택합니다. LDAP 서버가 Samba 방식을 사용하려면 반드신 Samba 속성으로 구성되어야 합니다. 선택사항은 RFC2307(Windows 2003 R2에 포함)과 Service for Unix(SFU)입니다. SFU 3.0 또는 3.5를 위해선 \"SFU\"를 선택합니다. SFU 2.0을 위해선 \"SFU20\"을 선택합니다.", + "Choose the speed in bps used by the serial port.": "시리얼 포트의 속도(bps)를 선택합니다.", + "Choose the test type. See smartctl(8) for descriptions of each type. Some types will degrade performance or take disks offline. Avoid scheduling S.M.A.R.T. tests simultaneously with scrub or resilver operations.": "검사 유형을 선택합니다. 각 유형의 설명은 smartctl(8)을(를) 참고하십시오. 어떤 유형은 성능을 떨어뜨리거나 디스크를 오프라인 상태로 바꿉니다. S.M.A.R.T. 검사를 스트럽이나 리실버 작업과 동시에 진행하지 마십시오.", + "Choose the type of interface. Bridge creates a logical link between multiple networks. Link Aggregation combines multiple network connections into a single interface. A Virtual LAN (VLAN) partitions and isolates a segment of the connection. Read-only when editing an interface.": "인터페이스의 유형을 선택합니다. 브리지는 여러 네트워크 사이에 논리적 연결을 생성합니다. 링크 애그리게이션은 여러 네트워크 연결을 하나의 인터페이스로 조합합니다. 가상 랜(VLAN)은 각 연결을 분할하고 격리합니다. 인터페이스를 수정하는 중에는 읽기전용으로 바뀝니다.", + "Choose the type of permissions. Basic shows general permissions. Advanced shows each specific type of permission for finer control.": "권한 유형을 선택합니다. 기본은 일반적인 권한만 보여줍니다. 고급은 세부적인 조정을 위해 구체적인 권한 유형을 보여줍니다.", + "Choose the type that matches the type of client accessing the pool/dataset.": "풀/데이터셋에 접근하려는 클라이언트의 유형과 일치하는 유형을 선택합니다.", + "Choose to connect using either SSH private key stored in user's home directory or SSH connection from the keychain": "연결에 사용자 홈 디렉터리에 저장된 SSH 개인 키를 사용할지 키체인의 SSH 연결을 사용할지 선택합니다.", + "Choose to either use a custom-defined remote module of the rsync server or to use an SSH configuration for the rsync task.": "Rsync 서버의 사용자 정의된 원격 모듈을 사용할지 Rsync 작업의 SSH 구성을 사용할지 선택합니다.", + "Choose when the UPS initiates shutdown.": "언제 UPS를 종료할지 선택합니다.", + "Choosing an entry loads a preset ACL that is configured to match general permissions situations.": "항목을 선택하면 일반적인 권한 상황에 맞추어 구성한 ACL 사전설정을 불러옵니다.", "City": "도시", + "Classification for each S3 object. Choose a class based on the specific use case or performance requirements. See Amazon S3 Storage Classes for more information.": "각 S3 객체에 대한 분류입니다. 특정 사용 사례 또는 성능 요구 사항에 따라 단계를 선택합니다. 자세한 내용은 Amazon S3 Storage Classes을(를) 참고하십시오.", "Clear": "지움", "Clear SED Password": "SED 비밀번호 지움", "Clear Sync Keys": "동기화 키 지움", "Clear the Idmap Cache": "Idmap 캐시 지움", "Clear the SED password for this disk.": "이 디스크에 대한 SED 비밀번호를 지웁니다.", "Clearing Cache...": "캐시 지우는 중...", + "Click \"Add\" to specify NFS client hosts for this share. If both networks and hosts are empty the share will be exported to everyone.": "\"추가\"를 눌러 이 공유의 NFS 클라이언트 호스트를 지정합니다. 네트워크와 호스트가 모두 비어 있으면 공유가 모든 사용자에게 표시됩니다.", + "Click \"Add\" to specify NFS client network ranges for this share. If both networks and hosts are empty the share will be exported to everyone.": "\"추가\"를 눌러 이 공유의 NFS 클라이언트 네트워크 범위를 지정합니다. 네트워크와 호스트가 모두 비어 있으면 공유가 모든 사용자에게 표시됩니다.", "Click Add to add first VDEV.": "추가를 눌러 첫 VDEV를 추가합니다.", "Click an item to view NFSv4 permissions": "NFSv4 권한을 볼 항목을 누릅니다.", "Click for information on TrueNAS SCALE Migration, Nightly trains and other upgrade options.": "TrueNAS SCALE로의 전환이나 최신 개발자 버전, 업그레이드 방법에 대해 더 알아봅니다.", "Click to give {index} star rating.": "별점 {index}점을 줍니다.", + "Clicking Continue allows TrueNAS to finish the update in the background while Abort stops the process and reverts the dataset ACL to the previously active ACL.": "'계속'을 누르면 TrueNAS가 백그라운드에서 갱신을 완료하고, '중단'을 누르면 작업을 중지하고 데이터셋 ACL을(를) 이전 활성 ACL로 되돌립니다. ", "Client ID": "클라이언트 ID", "Client Name": "클라이언트 이름", "Clients": "클라이언트", @@ -953,6 +906,7 @@ "Collapse": "축소", "Collapse Row": "행 축소", "Columns": "열", + "Combine multiple, critical-for-failover interfaces into a group. Groups apply to single systems. A failover occurs when every interface in the group fails. Groups with a single interface trigger a failover when that interface fails. Configuring the system to failover when any interface fails requires marking each interface as critical and placing them in separate groups.": "장애조치시 중요 인터페이스를 포함한 여러 인터페이스를 그룹으로 묶습니다. 그룹은 단일 시스템에 적용됩니다. 그룹 내의 모든 인터페이스가 실패하면 장애조치를 실행합니다. 그룹에 하나의 인터페이스만 있는 경우 해당 인터페이스가 실패하면 장애조치를 실행합니다. 어떤 인터페이스에 장애가 발생했을 때 시스템이 장애조치를 실행하도록 구성하려면, 각 인터페이스를 중요로 표시하고 별도의 그룹으로 배치해야 합니다.", "Command": "명령어", "Command / Script": "명령어 / 스크립트", "Command Line Interface": "명령줄 인터페이스", @@ -1025,6 +979,7 @@ "Connect": "연결", "Connect Timeout": "연결 시간 제한", "Connect to TrueCommand Cloud": "TrueCommand 클라우드 연결", + "Connect using:": "다음을 사용하여 연결:", "Connected Initiators": "연결된 이니시에이터", "Connected at": "연결 시각", "Connecting to TrueCommand": "TrueCommand 접속중", @@ -1045,6 +1000,7 @@ "Container Shell": "컨테이너 셸", "Container Write": "컨테이너 쓰기", "Containers": "컨테이너", + "Content Commitment": "Content Commitment", "Contents of the uploaded Service Account JSON file.": "업로드한 서비스 계정 JSON 파일의 내용입니다.", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "셸에선 컨텍스트 메뉴의 복사와 붙여넣기를 사용할 수 없습니다. 복사와 붙여넣기의 Mac 단축키는 Command+cCommand+v입니다. 대부분의 운영체제는 Ctrl+Insert로 복사하고 Shift+Insert로 붙여넣을 수 있습니다.", "Continue": "계속", @@ -1739,18 +1695,35 @@ "Enter a description of the tunable.": "튜너블의 설명을 입력합니다.", "Enter a descriptive title for the new issue.": "새로운 이슈를 설명할 제목을 입력합니다.", "Enter a list of allowed hostnames or IP addresses. Separate entries by pressing Enter. A more detailed description with examples can be found here.

If neither *Hosts Allow* or *Hosts Deny* contains an entry, then SMB share access is allowed for any host.

If there is a *Hosts Allow* list but no *Hosts Deny* list, then only allow hosts on the *Hosts Allow* list.

If there is a *Hosts Deny* list but no *Hosts Allow* list, then allow all hosts that are not on the *Hosts Deny* list.

If there is both a *Hosts Allow* and *Hosts Deny* list, then allow all hosts that are on the *Hosts Allow* list.

If there is a host not on the *Hosts Allow* and not on the *Hosts Deny* list, then allow it.": "허용한 호스트 이름이나 IP 주소의 목록을 입력합니다. Enter키를 눌러 항목을 구분합니다. 예시를 포함한 상세한 설명은 이곳을 참고하십시오.

*허용한 호스트* 또는 *거부한 호스트*에 항목이 없으면 SMB 공유는 모든 호스트의 접근을 허용합니다.

만약 *허용한 호스트* 목록은 있고 *거부한 호스트* 목록은 없으면, *허용한 호스트* 목록에 있는 호스트만 허용합니다.

만약 *거부한 호스트* 목록은 있고 *허용한 호스트* 목록은 없으면, *거부한 호스트* 목록에 있는 호스트를 제외한 모든 호스트를 허용합니다.

*허용한 호스트*과 *거부한 호스트*목록이 모두 있으면, *허용한 호스트* 목록에 있는 호스트만 허용합니다.

*허용한 호스트* 및 *거부한 호스트* 목록에 없는 호스트는 허용합니다.", + "Enter a list of chat IDs separated by space, comma or semicolon. To find your chat ID send a message to the bot, group or channel and visit https://api.telegram.org/bot(BOT_TOKEN)/getUpdates.": "공백 또는 쉼표, 쌍반점으로 구분한 채팅 ID의 목록을 입력합니다. 채팅 ID를 찾으려면 봇이나 그룹, 채널에 메시지를 보내고 https://api.telegram.org/bot(BOT_TOKEN)/getUpdates(으)로 방문합니다.", + "Enter a list of denied hostnames or IP addresses. Separate entries by pressing Enter. If neither *Hosts Allow* or *Hosts Deny* contains an entry, then SMB share access is allowed for any host.

If there is a *Hosts Allow* list but no *Hosts Deny* list, then only allow hosts on the *Hosts Allow* list.

If there is a *Hosts Deny* list but no *Hosts Allow* list, then allow all hosts that are not on the *Hosts Deny* list.

If there is both a *Hosts Allow* and *Hosts Deny* list, then allow all hosts that are on the *Hosts Allow* list.

If there is a host not on the *Hosts Allow* and not on the *Hosts Deny* list, then allow it.": "거부한 호스트 이름 또는 IP 주소의 목록을 입력합니다. Enter키를 눌러 항목을 구분합니다. *허용한 호스트* 또는 *거부한 호스트*에 항목이 없으면 SMB 공유는 모든 호스트의 접근을 허용합니다.

만약 *허용한 호스트* 목록은 있고 *거부한 호스트* 목록은 없으면, *허용한 호스트* 목록에 있는 호스트만 허용합니다.

만약 *거부한 호스트* 목록은 있고 *허용한 호스트* 목록은 없으면, *거부한 호스트* 목록에 있는 호스트를 제외한 모든 호스트를 허용합니다.

*허용한 호스트*과 *거부한 호스트*목록이 모두 있으면, *허용한 호스트* 목록에 있는 호스트만 허용합니다.

*허용한 호스트* 및 *거부한 호스트* 목록에 없는 호스트는 허용합니다.", + "Enter a long string of random characters for use as salt for the encryption password. Warning: Always securely back up the encryption salt value! Losing the salt value will result in data loss.": "암호화 비밀번호의 솔트(salt)로 사용할 긴 무작위 문자열을 입력합니다. 위험: 암호화 솔트 값은 안전하게 보관하십시오! 솔트 값을 잃으면 데이터도 잃습니다.", + "Enter a name for the interface. Use the format bondX, vlanX, or brX where X is a number representing a non-parent interface. Read-only when editing an interface.": "인터페이스의 이름을 입력합니다. bondX 또는 vlanX, brX 형식을 사용합니다. X는 상위 인터페이스가 아님을 나타내는 숫자입니다. 인터페이스를 수정하는 중에는 읽기전용으로 바뀝니다.", "Enter a name for the new credential.": "새로운 자격증명의 이름을 입력합니다.", "Enter a name for the share.": "공유할 이름을 입력합니다.", + "Enter a name for this Keytab.": "이 키탭의 이름을 입력합니다.", "Enter a name of the TrueCloud Backup Task.": "TrueCloud 백업 작업의 이름을 입력합니다.", + "Enter a number of degrees in Celsius. S.M.A.R.T. reports if the temperature of a drive has changed by N degrees Celsius since the last report.": "섭씨 온도를 입력합니다. 드라이브의 온도가 마지막 보고로부터 섭씨 N도 이상 변화하면 S.M.A.R.T.에서 보고합니다.", + "Enter a number of seconds to wait before alerting that the service cannot reach any UPS. Warnings continue until the situation is fixed.": "서비스가 어떤 UPS에도 접근하지 못할 때, 경고하기까지 기다릴 시간(초)입니다. 상황이 해결될 때가지 경고는 계속됩니다.", + "Enter a one to three paragraph summary of the issue. Describe the problem and provide any steps to replicate the issue.": "해당 문제를 1~3문단으로 작성합니다. 문제에 대해 설명하고 재현 방법을 제공합니다.", + "Enter a password for the rancher user. This is used to log in to the VM from the serial shell.": "rancher 사용자의 비밀번호를 입력합니다. 시리얼 셸에서 가상머신으로 로그인할 때 사용됩니다.", + "Enter a password for the SPICE display.": "SPICE 화면의 비밀번호를 입력합니다.", "Enter a password of at least eight characters.": "8자 이상의 비밀번호를 입력하십시오.", + "Enter a port to bind rpc.lockd(8).": "rpc.lockd(8)에 연결할 포트를 입력합니다.", + "Enter a port to bind mountd(8).": "mountd(8)에 연결할 포트를 입력합니다.", + "Enter a port to bind rpc.statd(8).": "rpc.statd(8)에 연결할 포트를 입력합니다.", "Enter a separate privacy passphrase. Password is used when this is left empty.": "별도의 개인 비밀구절을 입력합니다. 비워두면 비밀번호를 사용합니다.", + "Enter a shell glob pattern to match files and directories to exclude from the backup.": "백업에서 제외할 파일과 디렉터리의 셸 글로브 패턴을 입력합니다.", "Enter a threshold temperature in Celsius. S.M.A.R.T. will message with a log level of LOG_CRIT and send an email if the temperature is higher than the threshold.": "임계 온도를 섭씨로 입력합니다. 이 값보다 온도가 높을 경우 S.M.A.R.T.에서 LOG_CRIT로 보고하며 이메일을 발송합니다.", "Enter a threshold temperature in Celsius. S.M.A.R.T. will message with a log level of LOG_INFO if the temperature is higher than the threshold.": "임계 온도를 섭씨로 입력합니다. 이 값보다 온도가 높을 경우 S.M.A.R.T.에서 LOG_INFO로 보고합니다.", "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.": "데이터셋의 고유한 이름을 입력합니다. 데이터셋 이름의 길이는 이 값과 상위 경로 값에 길이를 더해 계산합니다. '상위 경로'와 '이름'의 길이를 더해서 200자를 넘을 수 없습니다. 그렇기에 이 값의 검증은 상위 경로도 고려합니다. 거기에 최대 디렉터리 깊이는 50단계입니다. 상위 경로의 중첩 수준을 고려하면 디렉터리 계층이 51번째 단계인 데이터 세트는 만들 수 없습니다.", "Enter a user to associate with this service. Keeping the default is recommended.": "이 서비스와 연결할 사용자를 입력합니다. 기본값을 유지하길 권장합니다.", "Enter a username to register with this service.": "이 서비스에 등록할 사용자 이름을 입력합니다.", "Enter a valid IPv4 address.": "유효한 IPv4 주소를 입력합니다.", + "Enter a value in seconds for the the UPS to wait before initiating shutdown. Shutdown will not occur if power is restored while the timer is counting down. This value only applies when Shutdown mode is set to UPS goes on battery.": "UPS가 종료하기 전에 기다릴 시간(초)입니다. 이 시간동안 전원이 복원되면 종료하지 않습니다. 이 값은 종료 모드UPS 배터리로 전환일 경우에만 적용됩니다.", + "Enter a value to use for the sysctl variable.": "사용할 sysctl 변수를 입력합니다.", "Enter accounts that have administrative access. See upsd.users(5) for examples.": "관리를 위해 접근을 허용할 계정을 입력합니다. 예시는 upsd.users(5)을(를) 참고하십시오.", + "Enter additional smb.conf options. See the Samba Guide for more information on these settings.
To log more details when a client attempts to authenticate to the share, add log level = 1, auth_audit:5.": "추가 smb.conf 선택사항을 입력합니다. 이 설정에 대한 자세한 내용은 Samba 안내서를 참고하십시오.
클라이언트가 공유로 인증을 시도할 때 더 상세한 기록을 남기려면 log level = 1, auth_audit:5을(를) 추가합니다.", "Enter an IPv4 address. This overrides the default gateway provided by DHCP.": "IPv4 주소를 입력합니다. DHCP가 부여한 기본 게이트웨이를 대체합니다.", "Enter an IPv6 address. This overrides the default gateway provided by DHCP.": "IPv6 주소를 입력합니다. DHCP가 부여한 기본 게이트웨이를 대체합니다.", "Enter an alphanumeric encryption key. Only available when Passphrase is the chosen key format.": "암호화 키를 영문자와 숫자로 입력합니다. 키 형식을 비밀구절로 선택했을 때만 사용됩니다.", @@ -1835,6 +1808,7 @@ "Error counting eligible snapshots.": "적격한 스냅샷을 계산하는 데 오류가 발생했습니다.", "Error creating device": "장치 만들기 오류", "Error deleting dataset {datasetName}.": "데이터셋 {datasetName}을(를) 삭제하는 데 오류가 발생했습니다.", + "Error details for ": "오류 상세: ", "Error detected reading App": "앱을 불러오는 데 오류 감지", "Error exporting the Private Key": "개인 키 내보내기 오류", "Error exporting the certificate": "자격증명 내보내기 오류", @@ -2021,6 +1995,7 @@ "From Name": "보낸 사람 이름", "From a key file": "키 파일에서", "From {task_begin} to {task_end}": "{task_begin}부터 {task_end}까지", + "Front": "앞", "Full Admin": "전체 관리자", "Full Control": "전체 제어", "Full Filesystem Replication": "전체 파일시스템 복제", @@ -2189,6 +2164,8 @@ "Hosts": "호스트", "Hosts Allow": "허용한 호스트", "Hosts Deny": "거부한 호스트", + "Hot Spare": "대기중인 여분", + "Hottest": "최고온도", "Hour and minute the system must stop creating snapshots. Snapshots already in progress will continue until complete.": "시스템이 스냅샷 생성을 중지할 시간과 분입니다. 이미 진행중인 스냅샷 작업은 완료할 때까지 계속됩니다.", "Hour and minute when the system can begin taking snapshots.": "시스템이 스냅샷 생성을 시작할 시간과 분입니다.", "Hour(s)": "시간", @@ -2552,6 +2529,7 @@ "Link aggregation interface": "링크 애그리게이션 인터페이스", "Linked Service": "연결된 서비스", "Linux": "리눅스", + "Linux Only": "리눅스 전용", "List any existing dataset properties to remove from the replicated files.": "복제된 파일에서 제거할 기존 데이터셋의 속성 목록입니다.", "List of chat IDs": "채팅 ID 목록", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "백업에서 제외할 파일과 디렉터리의 목록입니다.
Enter키를 눌러 항목을 구분합니다. --exclude 옵션의 자세한 설명은 레스틱 제외 패턴을 참고하십시오.", @@ -2615,6 +2593,7 @@ "Logout": "로그아웃", "Logs": "기록", "Logs Details": "기록 상세", + "Long": "Long", "Long time ago": "오래 전", "Looking for help?": "도움말을 찾아보시겠습니까?", "Losing the ability to unlock the pool can result in losing all data on the disks with no chance of recovery. Always back up the encryption key file or passphrase for an encrypted pool! The key file for an encrypted pool is secured in the system database and can be exported at any time from the pool options": "풀 잠금 해제 기능을 잃으면 복구 가능성 없이 디스크의 모든 데이터를 잃을 수 있습니다. 암호화된 풀의 암호화 키 파일이나 비밀구절을 항상 백업하십시오! 암호화된 풀의 키 파일은 시스템 데이터베이스에 보관되어 있으며 언제든지 풀 선택사항에서 내보낼 수 있습니다.", @@ -2838,6 +2817,7 @@ "Name of this SSH connection. SSH connection names must be unique.": "이 SSH 연결의 이름입니다. SSH 연결 이름은 고유해야 합니다.", "Name of this replication configuration.": "이 복제 구성의 이름입니다.", "Name or Naming Schema must be provided.": "이름 또는 이름짓기 방식을 제공해야 합니다.", + "Name ~ \"admin\"": "Name ~ \"admin\"", "Nameserver": "네임서버", "Nameserver (DHCP)": "네임서버 (DHCP)", "Nameserver 1": "네임서버 1", @@ -2886,6 +2866,7 @@ "Network interfaces do not match between storage controllers.": "스토리지 컨트롤러 간의 네트워크 인터페이스가 일치하지 않습니다.", "Network interfaces to include in the bridge.": "브리지에 포함할 네트워크 인터페이스입니다.", "Network size of each docker network which will be cut off from base subnet.": "기본 서브넷에서 분리할 각 도커 네트워크의 네트워크 크기입니다.", + "Networking": "네트워크", "Networks": "네트워크", "Never": "하지 않음", "Never Delete": "삭제하지 않음", @@ -3104,6 +3085,8 @@ "Open Files": "파일 열기", "Open TrueCommand User Interface": "TrueCommand 사용자 인터페이스 열기", "Open ticket": "티켓 발행", + "OpenStack Swift": "OpenStack Swift", + "Opened at": "개시 시각", "Openstack API key or password. This is the OS_PASSWORD from an OpenStack credentials file.": "Openstack API 키 또는 비밀번호입니다. OpenStack 자격증명 파일의 OS_PASSWORD 입니다.", "Openstack user name for login. This is the OS_USERNAME from an OpenStack credentials file.": "Openstack 로그인 사용자 이름입니다. OpenStack 자격증명 파일의 OS_USERNAME 입니다.", "Operating System": "운영체제", @@ -3126,6 +3109,7 @@ "Organizational Unit": "조직 단위(OU)", "Organizational unit of the entity.": "인증서의 조직 구성 단위입니다.", "Other": "Other", + "Other Execute": "기타 실행", "Other Options": "그 외 선택사항", "Other Read": "그 외 읽기", "Other Settings": "그 외 설정", @@ -3155,6 +3139,8 @@ "PCI device does not have a reset mechanism defined and you may experience inconsistent/degraded behavior when starting/stopping the VM.": "PCI 장치에는 재설정 메커니즘이 정의되어 있지 않으므로, 가상머신을 시작/중지할 때 일관되지 않거나 저하된 동작이 발생할 수 있습니다.", "POSIX": "POSIX", "POSIX Permissions": "POSIX 권한", + "PULL": "PULL", + "PUSH": "PUSH", "PagerDuty client name.": "PagerDuty 클라이언트 이름입니다.", "Pair this certificate's public key with the Certificate Authority private key used to sign this certificate.": "이 인증서의 공개키를 이 인증서에 서명하는 데 사용한 인증기관의 개인 키와 묶습니다.", "Parent": "상위", @@ -3229,6 +3215,7 @@ "Phone": "전화", "Phone Number": "전화번호", "Photo Library API client secret generated from the Google API Console": "Google API 콘솔에서 생성한 사진 라이브러리 API 클라이언트 시크릿", + "Pin vcpus": "vCPU 핀", "Plain (No Encryption)": "평문 (암호화 없음)", "Platform": "플랫폼", "Please accept the terms of service for the given ACME Server.": "해당 ACME 서버의 서비스 약관에 동의해 주십시오.", @@ -3290,6 +3277,7 @@ "Power Mode": "전원 모드", "Power Off": "전원 종료", "Power Off UPS": "UPS 끄기", + "Power On Hours Ago": "검사 후 전원 인가 시간", "Power Outage": "정전", "Power Supply": "전원공급장치", "Pre Init": "초기화 이전", @@ -3335,6 +3323,7 @@ "Properties Exclude": "제외할 속성", "Properties Override": "덮어쓸 속성", "Protocol Options": "프로토콜 선택사항", + "Prototyping": "시제품", "Provide helpful notations related to the share, e.g. ‘Shared to everybody’. Maximum length is 120 characters.": "공유에대한 유용한 설명을 제공합니다(예: '모두에게 공유됨'). 최대 길이는 120자입니다.", "Provide keys/passphrases manually": "키/비밀구절을 수동으로 제공", "Provider": "공급자", @@ -3349,7 +3338,10 @@ "Pruning Deduplication Table": "중복제거 테이블 정리중", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "공개 IP 주소 또는 호스트 이름입니다. FTP 클라이언트가 NAT 장치를 통해 연결할 수 없으면 설정합니다. ", "Public Key": "공개 키", + "Pull": "Pull", "Purpose": "목적", + "Push": "Push", + "Quick": "빠르게", "Quota": "할당량", "Quota (in GiB)": "할당량 (GiB)", "Quota Fill Critical": "할당량 채움 심각", @@ -3391,6 +3383,8 @@ "Read Only": "읽기전용", "Read-only": "읽기전용", "Readonly Admin": "읽기전용 관리자", + "Realm": "영역", + "Rear": "뒤", "Reason": "사유", "Reboot": "재시작", "Reboot Local": "로컬 재시작", @@ -4106,6 +4100,7 @@ "Sharing iSCSI Write": "iSCSI 공유 쓰기", "Shell": "셸", "Shell Commands": "셸 명령어", + "Short": "Short", "Short Description": "짧은 설명", "Should only be used for highly accurate NTP servers such as those with time monitoring hardware.": "시간 감시 하드웨어를 갖춘 정밀한 NTP서버에만 사용해야 합니다.", "Show": "보기", @@ -4567,6 +4562,7 @@ "These services must be restarted to export the pool:": "플을 내보내려면 서비스 재시작 필요:", "These services must be stopped to export the pool:": "풀을 내보내려면 서비스 종료 필요:", "These unknown processes are using the pool:": "알 수 없는 프로세스가 풀 사용 중:", + "Thick": "Thick", "Third DNS server.": "셋째 DNS 서버입니다.", "Third-party Cloud service providers. Choose a provider to configure connection credentials.": "서드 파티 클라우드 서비스 공급자입니다. 연결 자격증명을 구성할 공급자를 선택하십시오.", "This Certificate Authority is being used to sign one or more certificates. It can be deleted only after deleting these certificates.": "이 인증기관은 하나 이상의 인증서를 서명하는 데 사용되었습니다. 해당 인증서를 삭제한 후에 삭제할 수 있습니다.", @@ -4761,6 +4757,7 @@ "Unix Permissions Editor": "유닉스 권한 편집기", "Unix Primary Group": "유닉스 기본 그룹", "Unix Socket": "유닉스 소켓", + "Unkeep": "유지하지 않음", "Unknown": "알 수 없음", "Unknown CPU": "알 수 없는 CPU", "Unknown PID": "알 수 없는 PID", @@ -4784,6 +4781,7 @@ "Unshare": "공유 해제", "Unshare {name}": "{name} 공유 해제", "Unsupported Hardware": "지원하지 않는 하드웨어", + "Until": "만료일", "Unused Disks": "사용하지 않은 디스크", "Up to date": "최신", "Update": "업데이트", @@ -5010,6 +5008,7 @@ "Virtual Ports": "가상 포트", "Virtual machine created": "가상머신 생성함", "Virtualization": "가상화", + "Virtualization (Old)": "가상화 (예전)", "Virtualization Global Read": "가상화 전역 읽기", "Virtualization Global Write": "가상화 전역 쓰기", "Virtualization Image Read": "가상화 이미지 읽기", @@ -5017,6 +5016,7 @@ "Virtualization Instance Delete": "가상화 인스턴스 삭제", "Virtualization Instance Read": "가상화 인스턴스 읽기", "Virtualization Instance Write": "가상화 인스턴스 쓰기", + "Virtualization Method": "가상화 방식", "Virtualization is not supported": "가상화를 지원하지 않음", "Virtualization settings updated": "가상화 설정 갱신함", "Visible": "보임", @@ -5318,4 +5318,4 @@ "{used} of {total} ({used_pct})": "{total} 중 {used} ({used_pct})", "{version} is available!": "{version}이 준비되었습니다!", "{view} on {enclosure}": "{enclousure}의 {view}" -} +} \ No newline at end of file diff --git a/src/assets/i18n/zh-hant.json b/src/assets/i18n/zh-hant.json index 406aaaa9584..1f50f2a1cc2 100644 --- a/src/assets/i18n/zh-hant.json +++ b/src/assets/i18n/zh-hant.json @@ -1,23 +1,15 @@ { "": "", - "\n It looks like your session has been inactive for more than {lifetime} seconds.
\n For security reasons we will log you out at {time}.\n ": "\n 您的連線已閒置超過 {lifetime} 秒.
\n 為了安全,我們將在 {time} 秒登出您.\n ", - " bytes.": "位元組", - "\"Power On Hours\" are how many hours have passed while the disk has been powered on. \"Power On Hours Ago\" is how many power on hours have passed since each test.": "\"Power On Hours\" 表示磁碟通電運行的總時數. \"Power On Hours Ago\" 是指自每次測試以來經過的通電時數.", - "...": "...", - "... Make sure the TrueNAS system is powered on and connected to the network.": "...請確保 TrueNAS 系統已開機並連接到網路", - "AWS resources in a geographic area. Leave empty to automatically detect the correct public region for the bucket. Entering a private region name allows interacting with Amazon buckets created in that region. For example, enter us-gov-east0 to discover buckets created in the eastern AWS GovCloud region.": "", + "AWS resources in a geographic area. Leave empty to automatically detect the correct public region for the bucket. Entering a private region name allows interacting with Amazon buckets created in that region. For example, enter us-gov-east-1 to discover buckets created in the eastern AWS GovCloud region.": "", "pCloud Access Token. These tokens can expire and require extension.": "", "Authentication protocol used to authenticate messages sent on behalf of the specified Username.": "", "Encryption protocol used to encrypt messages sent on behalf of the specified Username.": "", "Extended attributes are preserved, but must be supported by both systems.": "", " TrueNAS Forums - Find answers from other users in the forums.": "", - "Transport Protocol for the remote system log server connection. Choosing Transport Layer Security (TLS) also requires selecting a preconfigured system Certificate.": "", - "Backblaze B2 Application Key. To generate a new application key, log in to the Backblaze account, go to the App Keys page, and add a new application key. Copy the applicationKey string to this field.": "", + "Transport Protocol for the remote system log server connection. Choosing Transport Layer Security (TLS) also requires selecting a preconfigured system Certificate.": "", + "Backblaze B2 Application Key. To generate a new application key, log in to the Backblaze account, go to the App Keys page, and add a new application key. Copy the applicationKey string to this field.": "", " TrueNAS Licensing - Learn more about enterprise-grade support.": "", " TrueNAS Documentation Hub - Read and contribute to the open-source documentation.": "", - "COPY: Files from the source are copied to the destination. If files with the same names are present on the destination, they are overwritten.": "複製: 檔案會從來源 複製 到目的地. 如果目的地已存在同名檔案, 將會被 o覆蓋", - "Copy & Paste
\n Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+C and Command+V. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.

\n Kill Process
\n Kill process shortcut is Ctrl+C.": "複製與貼上(Copy & Paste)
\n Shell(終端) 中禁用了右鍵選單的複製和貼上的操作. Mac 的複製和貼上快捷鍵是 Command+CCommand+V. 對大多數的操作系統, 可以用 Ctrl+Insert 來複製和 Shift+Insert 來貼上.

\n 終止程序 (Kill Process)
\n 終止程序的快捷鍵是 Ctrl+C.", - "MOVE: After files are copied from the source to the destination, they are deleted from the source. Files with the same names on the destination are overwritten.": "移動 (MOVE): 檔案會先從來源 複製 到目的地, 然後再從來源 刪除 目的地中同名檔案將會被 覆蓋.", "SET will changes all destination datasets to readonly=on after finishing the replication.
REQUIRE stops replication unless all existing destination datasets to have the property readonly=on.
IGNORE disables checking the readonly property during replication.": "", "SYNC: Files on the destination are changed to match those on the source. If a file does not exist on the source, it is also deleted from the destination.": "", "WARNING: Rolling the dataset back destroys data on the dataset and can destroy additional snapshots that are related to the dataset. This can result in permanent data loss! Do not roll back until all desired data and snapshots are backed up.": "", @@ -3675,10 +3667,13 @@ "{used} of {total} ({used_pct})": "", "{version} is available!": "", "{view} on {enclosure}": "", + "\n It looks like your session has been inactive for more than {lifetime} seconds.
\n For security reasons we will log you out at {time}.\n ": "\n 您的連線已閒置超過 {lifetime} 秒.
\n 為了安全,我們將在 {time} 秒登出您.\n ", " Est. Usable Raw Capacity": "預估可用原始容量", " When the UPS Mode is set to slave. Enter the open network port number of the UPS Master system. The default port is 3493.": "當 UPS 模式設定為從屬時,請輸入 UPS 主控系統的開放網路埠號。預設埠號為 3493。", " as of {dateTime}": "截至 {dateTime}", + " bytes.": "位元組", " seconds.": " 秒。", + "\"Power On Hours\" are how many hours have passed while the disk has been powered on. \"Power On Hours Ago\" is how many power on hours have passed since each test.": "\"Power On Hours\" 表示磁碟通電運行的總時數. \"Power On Hours Ago\" 是指自每次測試以來經過的通電時數.", "% of all cores": "% 於所有核心", "'Hosts Allow' or 'Hosts Deny' has been set": "'Hosts Allow' 或 'Hosts Deny' 已設定", "'Hosts Allow' or 'Hosts Deny' has been updated": "'Hosts Allow' 或 'Hosts Deny' 已更新", @@ -3692,6 +3687,8 @@ "(TrueNAS Controller 2)": "(TrueNAS 控制器 2)", "({n, plural, =1 {# widget} other {# widgets}})": "({n, plural, =1 {# 小工具} other {# 小工具}})", "+ Add a backup credential": "+ 新增備份憑證", + "...": "...", + "... Make sure the TrueNAS system is powered on and connected to the network.": "...請確保 TrueNAS 系統已開機並連接到網路", "0=Disabled, blank=inherit": "0=停用,blank=繼承", "1 day": "1 天", "1 hour": "1 小時", @@ -3720,6 +3717,9 @@ "MEGA account username.": "MEGA 帳號使用者名稱。", "(rclone documentation).": "(rclone documentation).", "Email encryption type. Choices are Plain (No Encryption), SSL (Implicit TLS), or TLS (STARTTLS).": "郵件加密 類型。選擇 Plain (未加密)SSL (隱式 TLS)TLS (STARTTLS).", + "COPY: Files from the source are copied to the destination. If files with the same names are present on the destination, they are overwritten.": "複製: 檔案會從來源 複製 到目的地. 如果目的地已存在同名檔案, 將會被 o覆蓋", + "Copy & Paste
\n Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+C and Command+V. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.

\n Kill Process
\n Kill process shortcut is Ctrl+C.": "複製與貼上(Copy & Paste)
\n Shell(終端) 中禁用了右鍵選單的複製和貼上的操作. Mac 的複製和貼上快捷鍵是 Command+CCommand+V. 對大多數的操作系統, 可以用 Ctrl+Insert 來複製和 Shift+Insert 來貼上.

\n 終止程序 (Kill Process)
\n 終止程序的快捷鍵是 Ctrl+C.", + "MOVE: After files are copied from the source to the destination, they are deleted from the source. Files with the same names on the destination are overwritten.": "移動 (MOVE): 檔案會先從來源 複製 到目的地, 然後再從來源 刪除 目的地中同名檔案將會被 覆蓋.", "A User Access Token for Box. An access token enables Box to verify a request belongs to an authorized session. Example token: T9cE5asGnuyYCCqIZFoWjFHvNbvVqHjl.": "A User Access Token for Box. An access token enables Box to verify a request belongs to an authorized session. Example token: T9cE5asGnuyYCCqIZFoWjFHvNbvVqHjl.", "A single bandwidth limit or bandwidth limit schedule in rclone format. Separate entries by pressing Enter. Example: 08:00,512 12:00,10MB 13:00,512 18:00,30MB 23:00,off. Units can be specified with a suffix of b, k (default), M, or G. See rclone --bwlimit.": "A single bandwidth limit or bandwidth limit schedule in rclone format. Separate entries by pressing Enter. Example: 08:00,512 12:00,10MB 13:00,512 18:00,30MB 23:00,off. Units can be specified with a suffix of b, k (default), M, or G. See rclone --bwlimit.", "ACL Editor": "ACL 編輯器", @@ -5318,4 +5318,4 @@ "zstd-5 (slow)": "zstd-5 (較慢)", "zstd-7 (very slow)": "zstd-7 (非常慢)", "zstd-fast (default level, 1)": "zstd-fast (預設等級, 1)" -} +} \ No newline at end of file From 49f6b8d3bc4ae5543960bcefe38776d3d2616100 Mon Sep 17 00:00:00 2001 From: Zackary Welch Date: Tue, 7 Jan 2025 12:36:27 -0500 Subject: [PATCH 26/32] NAS-133446: Update fr.json (#11301) --- src/assets/i18n/fr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index 1bb36fb8012..2bd7d1174c7 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -2145,7 +2145,7 @@ "Domain Account Name": "Nom de compte de domaine", "Domain Account Password": "Mot de passe du compte de domaine", "Domain Name": "Nom de domaine", - "Domains": "Doamines", + "Domains": "Domaines", "Don't Allow": "Ne pas autoriser", "Done": "Terminé", "Download": "Télécharger", @@ -5318,4 +5318,4 @@ "{used} of {total} ({used_pct})": "{used} de {total} ({used_pct})", "{version} is available!": "{version} est disponible !", "{view} on {enclosure}": "{view} sur {enclosure}" -} \ No newline at end of file +} From e1835e6b48ca0d212a64e9efed5f663d2ec3cf58 Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Tue, 7 Jan 2025 19:44:02 -0300 Subject: [PATCH 27/32] Update src/assets/i18n/es-ar.json (#11302) Signed-off-by: Franco Castillo --- src/assets/i18n/es-ar.json | 144 ++++++++++++++++++------------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/src/assets/i18n/es-ar.json b/src/assets/i18n/es-ar.json index a790998d5bf..8b7051009e2 100644 --- a/src/assets/i18n/es-ar.json +++ b/src/assets/i18n/es-ar.json @@ -13,7 +13,7 @@ "LUN ID": "", "LUN RPM": "", "Lan": "", - "Linux Only": "", + "Linux Only": "Solo Linux", "Locks": "", "MOTD": "", "Machine Time: {machineTime} \n Browser Time: {browserTime}": "", @@ -29,14 +29,14 @@ "Post Init": "", "Post Script": "", "Post-script": "", - "Power On Hours Ago": "", + "Power On Hours Ago": "Prendido hace horas", "Pre Init": "", "Pre Script": "", "Pre-script": "", "Pull": "", "Replication Task Write Pull": "", - "Reporting Exporter": "", - "Reporting Exporters": "", + "Reporting Exporter": "Informando exportador", + "Reporting Exporters": "Informando exportadores", "Root TCP Socket": "", "SAN": "", "SMB - Operation Close": "", @@ -52,15 +52,15 @@ "SMB - Vers Minor": "", "SMB Lock": "", "SMB Locks": "", - "SMB Open File": "", - "SSSD Compat": "", + "SMB Open File": "Archivo abierto SMB", + "SSSD Compat": "Compatibilidad con SSSD", "Script": "", - "Scrub Boot Pool": "", - "Search UI": "", + "Scrub Boot Pool": "Limpiar pool de arranque", + "Search UI": "UI de búsqueda", "Serial Shell": "", "Service = \"SMB\" AND Event = \"CLOSE\"": "", - "Set to boot a debug kernel after the next system restart.": "", - "Set to restrict SSH access in certain circumstances to only members of BUILTIN\\Administrators": "", + "Set to boot a debug kernel after the next system restart.": "Establecé para iniciar la depuración del núcleo después del próximo reinicio del sistema.", + "Set to restrict SSH access in certain circumstances to only members of BUILTIN\\Administrators": "Establecé para restringir el acceso SSH en determinadas circunstancias solo a los miembros de BUILTIN\\Administrators", "Sharing iSCSI Auth Read": "", "Sharing iSCSI Auth Write": "", "Sharing iSCSI Extent Read": "", @@ -84,7 +84,7 @@ "Strip ACL": "", "Stripe": "", "Table Actions of Expandable Table": "", - "The following { n, plural, one {boot environment} other {# boot environments} } will be deleted. Are you sure you want to proceed?": "", + "The following { n, plural, one {boot environment} other {# boot environments} } will be deleted. Are you sure you want to proceed?": "{ n, plural, one {El siguiente entorno de arranque} other {Los siguientes # entornos de arranque} } { n, plural, one {se va a eliminar} other {se van a eliminar} }. ¿Estás seguro que deseás continuar?", "USB Passthrough Device": "", "Unlock Child Encrypted Roots": "", "Virtualization (Old)": "", @@ -135,7 +135,7 @@ "5 months ago": "Hace 5 meses", "6 months": "5 meses", "6 months ago": "Hace 6 meses", - "S3 API endpoint URL. When using AWS, the endpoint field can be empty to use the default endpoint for the region, and available buckets are automatically fetched. Refer to the AWS Documentation for a list of Simple Storage Service Website Endpoints.": "URL del punto final de la API S3. Cuando se usa AWS, el campo de punto final puede estar vacío para usar el punto final predeterminado para la región, y los depósitos disponibles se recuperan automáticamente. Consulte la documentación de AWS para obtener una lista de Puntos finales del sitio web del servicio de almacenamiento simple.", + "S3 API endpoint URL. When using AWS, the endpoint field can be empty to use the default endpoint for the region, and available buckets are automatically fetched. Refer to the AWS Documentation for a list of Simple Storage Service Website Endpoints.": "URL del punto final de la API S3. Cuando se usa AWS, el campo de punto final puede estar vacío para usar el punto final predeterminado para la región, y los depósitos disponibles se va a recuperar automáticamente. Consultá la documentación de AWS para obtener una lista de Puntos finales del sitio web del servicio de almacenamiento simple.", "AWS resources in a geographic area. Leave empty to automatically detect the correct public region for the bucket. Entering a private region name allows interacting with Amazon buckets created in that region. For example, enter us-gov-east-1 to discover buckets created in the eastern AWS GovCloud region.": "Recursos de AWS en un área geográfica. Dejá en blanco para detectar automáticamente la región pública correcta para el depósito. Introducir un nombre de región privada permite interactuar con los buckets de Amazon creados en esa región. Por ejemplo, ingresá us-gov-east-1 para descubrir depósitos creados en el este Región de AWS GovCloud.", "Microsoft Azure account name.": "Nombre de cuenta de Microsoft Azure.", "pCloud Access Token. These tokens can expire and require extension.": "Token de acceso de pCloud. Estos tokens se pueden vencer y requieren una extensión.", @@ -250,7 +250,7 @@ "Activate the Basic Constraints extension to identify whether the certificate's subject is a CA and the maximum depth of valid certification paths that include this certificate.": "Activá la extensión Restricciones Básicas para identificar si el sujeto del certificado es una CA y la profundidad máxima de rutas de certificación válidas que incluyen este certificado.", "Activate this Boot Environment?": "¿Activar este entorno de arranque?", "Activate this certificate extension. The key usage extension defines the purpose (e.g., encipherment, signature, certificate signing) of the key contained in the certificate. The usage restriction might be employed when a key that could be used for more than one operation is to be restricted. For example, when an RSA key should be used only to verify signatures on objects other than public key certificates and CRLs, the Digital Signature bits would be asserted. Likewise, when an RSA key should be used only for key management, the Key Encipherment bit would be asserted.
See RFC 3280, section 4.2.1.3 for more information.": "Activá esta extensión de certificado. La extensión de uso de clave define el propósito (por ejemplo, cifrado, firma, firma de certificado) de la clave contenida en el certificado. La restricción de uso se puede emplear cuando se debe restringir una clave que se puede utilizar para más de una operación. Por ejemplo, cuando una clave RSA se debe utilizar solo para verificar firmas en objetos que no sean certificados de clave pública y listas de revocación de certificados (CRL), se activarán los bits de Firma digital. Del mismo modo, cuando una clave RSA se debe utilizar solo para la gestión de claves, se activará el bit de Cifrado de clave.
Consultá la RFC 3280, sección 4.2.1.3 para obtener más información.", - "Activate this certificate extension.The Extended Key Usage extension identifies and limits valid uses for this certificate, such as client authentication or server authentication.See RFC 3280, section 4.2.1.13 for more details.": "Activá esta extensión de certificado. La extensión de uso de clave extendida identifica y limita los usos válidos para este certificado, como la autenticación de cliente o la autenticación de servidor. Consulte RFC 3280, sección 4.2.1.13 para obtener más detalles.", + "Activate this certificate extension.The Extended Key Usage extension identifies and limits valid uses for this certificate, such as client authentication or server authentication.See RFC 3280, section 4.2.1.13 for more details.": "Activá esta extensión de certificado. La extensión de uso de clave extendida identifica y limita los usos válidos para este certificado, como la autenticación de cliente o la autenticación de servidor. Consultá RFC 3280, sección 4.2.1.13 para obtener más detalles.", "Activate this extension. The authority key identifier extension provides a means of identifying the public key corresponding to the private key used to sign a certificate. This extension is used where an issuer has multiple signing keys (either due to multiple concurrent key pairs or due to changeover). The identification MAY be based on either the key identifier (the subject key identifier in the issuer's certificate) or on the issuer name and serial number.
See RFC 3280, section 4.2.1.1 for more information.": "Activar esta extensión. La extensión de identificador de clave de autoridad proporciona un medio para identificar la clave pública correspondiente a la clave privada utilizada para firmar un certificado. Esta extensión se utiliza cuando un emisor tiene varias claves de firma (ya sea debido a múltiples pares de claves concurrentes o debido a un cambio). La identificación PUEDE basarse en el identificador de clave (el identificador de clave del sujeto en el certificado del emisor) o en el nombre y número de serie del emisor.
Consultá RFC 3280, sección 4.2.1.1 para obtener más información.", "Activates a tuning script which attempts to optimize the system depending on the installed hardware. Warning: Autotuning is only used as a temporary measure and is not a permanent fix for system hardware issues.": "Activa un script de ajuste que intenta optimizar el sistema según el hardware instalado. Advertencia: El ajuste automático solo se usa como una medida temporal y no es una solución permanente para los problemas de hardware del sistema.", "Activates the configuration. Unset to disable the configuration without deleting it.": "Activa la configuración. Desconéctelo para deshabilitar la configuración sin eliminarla.", @@ -644,7 +644,7 @@ "Authentication URL": "URL de autenticación", "Authentication URL for the server. This is the OS_AUTH_URL from an OpenStack credentials file.": "URL de autenticación para el servidor. Este es el OS_AUTH_URL de un Archivo de credenciales OpenStack.", "Authenticator": "Autenticador", - "Authenticator to validate the Domain. Choose a previously configured ACME DNS authenticator.": "Autenticador para validar el dominio. Elija un autenticador DNS ACME previamente configurado.", + "Authenticator to validate the Domain. Choose a previously configured ACME DNS authenticator.": "Autenticador para validar el dominio. Elegí un autenticador DNS ACME previamente configurado.", "Authority Cert Issuer": "Emisor del Certificado de Autoridad", "Authority Key Config": "Configuración de clave de autoridad", "Authority Key Identifier": "Identificador de clave de autoridad", @@ -733,7 +733,7 @@ "Bot API Token": "Token de API de bot", "Both": "Ambos", "Box": "Caja", - "Brainpool curves can be more secure, while secp curves can be faster. See Elliptic Curve performance: NIST vs Brainpool for more information.": "Las curvas de Brainpool pueden ser más seguras, mientras que las curvas segp pueden ser más rápidas. Consulte Rendimiento de la curva elíptica: NIST vs Brainpool para más información.", + "Brainpool curves can be more secure, while secp curves can be faster. See Elliptic Curve performance: NIST vs Brainpool for more information.": "Las curvas de Brainpool pueden ser más seguras, mientras que las curvas segp pueden ser más rápidas. Consultá Rendimiento de la curva elíptica: NIST vs Brainpool para más información.", "Bridge": "Puente", "Bridge Members": "Miembros del puente", "Bridge Settings": "Configuración del puente", @@ -863,7 +863,7 @@ "Channel": "Canal", "Channel {n}": "Canal {n}", "Check": "Verificar", - "Check Alerts for more details.": "Consulte Alertas para obtener más detalles.", + "Check Alerts for more details.": "Consultá Alertas para obtener más detalles.", "Check App Details": "Ver detalles de la app", "Check Available Apps": "Ver apps disponibles", "Check Interval": "Comprobar intervalo", @@ -886,7 +886,7 @@ "Choices are None, Auto, CHAP, or Mutual CHAP.": "Las opciones son Ninguno, Automático, CHAP, o CHAP mutuo.", "Choose": "Elegir", "Choose AES-256 or None.": "Eligí AES-256 o Ninguno.", - "Choose Master if the UPS is plugged directly into the system serial port. The UPS will remain the last item to shut down. Choose Slave to have this system shut down before Master. See the Network UPS Tools Overview.": "Seleccioná Maestro si el SAI está conectado directamente al puerto serial del sistema. El SAI será el último elemento en apagarse. Seleccioná Esclavo para que este sistema se apague antes que el Maestro. Consulte la descripción general de las herramientas del SAI en red.", + "Choose Master if the UPS is plugged directly into the system serial port. The UPS will remain the last item to shut down. Choose Slave to have this system shut down before Master. See the Network UPS Tools Overview.": "Seleccioná Maestro si el SAI está conectado directamente al puerto serial del sistema. El SAI será el último elemento en apagarse. Seleccioná Esclavo para que este sistema se apague antes que el Maestro. Consultá la descripción general de las herramientas del SAI en red.", "Choose ON to update the access time for files when they are read. Choose Off to prevent producing log traffic when reading files. This can result in significant performance gains.": "Eligí Activado para actualizar el tiempo de acceso para los archivos cuando se leen. Eligí Desactivado para evitar la producción de tráfico de registro al leer archivos. Esto puede resultar en ganancias significativas de rendimiento.", "Choose File": "Elegir archivo", "Choose File for {label}": "Seleccionar archivo para {label}", @@ -911,13 +911,13 @@ "Choose an alert service to display options for that service.": "Elegí un servicio de alerta para mostrar las opciones para ese servicio.", "Choose an authentication method.": "Elige un método de autenticación.", "Choose an encryption mode to use with LDAP.": "Elegí un modo de cifrado para usar con LDAP.", - "Choose between Internal CA, Intermediate CA, and Import CA. An Internal CA functions like a publicly trusted CA to sign certificates for an internal network. They are not trusted outside the private network. An Intermediate CA lives between the root and end entity certificates and its main purpose is to define and authorize the types of certificates that can be requested from the root CA. Import CA allows an existing CA to be imported onto the system.
For more information see What are Subordinate CAs and Why Would You Want Your Own?": "Elegí entre CA interna, CA intermedia e Importar CA. Una CA interna funciona como una CA de confianza pública para firmar certificados para una red interna. No se confía fuera de la red privada. Una CA intermedia vive entre los certificados de entidad raíz y final y su objetivo principal es definir y autorizar los tipos de certificados que se pueden solicitar a la CA raíz. Importar CA permite importar una CA existente al sistema.
Para obtener más información, consulte ¿Qué son las CA subordinadas y por qué querría la suya?", + "Choose between Internal CA, Intermediate CA, and Import CA. An Internal CA functions like a publicly trusted CA to sign certificates for an internal network. They are not trusted outside the private network. An Intermediate CA lives between the root and end entity certificates and its main purpose is to define and authorize the types of certificates that can be requested from the root CA. Import CA allows an existing CA to be imported onto the system.
For more information see What are Subordinate CAs and Why Would You Want Your Own?": "Elegí entre CA interna, CA intermedia e Importar CA. Una CA interna funciona como una CA de confianza pública para firmar certificados para una red interna. No se confía fuera de la red privada. Una CA intermedia vive entre los certificados de entidad raíz y final y su objetivo principal es definir y autorizar los tipos de certificados que se pueden solicitar a la CA raíz. Importar CA permite importar una CA existente al sistema.
Para obtener más información, consultá ¿Qué son las CA subordinadas y por qué querría la suya?", "Choose between a Hex (base 16 numeral) or Passphrase (alphanumeric) style encryption key.": "Elegí entre una clave de cifrado de estilo Hex (número de base 16) o Frase de contraseña (alfanumérica).", "Choose container": "Elegir contenedor", "Choose how many log entries to create. Choices range from the least log entries (Emergency) to the most (Debug).": "Elegí cuántas entradas de registro crear. Las opciones van desde la menor cantidad de entradas de registro (Emergencia) hasta la mayoría (Depuración).", "Choose if the .zfs snapshot directory is Visible or Invisible on this dataset.": "Elegí si el directorio de instantáneas .zfs es Visible o Invisible en este conjunto de datos.", "Choose log": "Eligir registro", - "Choose one of the presets or choose Custom to use the advanced scheduler.": "Elegí uno de los ajustes preestablecidos o elija Personalizado para usar el programador avanzado.", + "Choose one of the presets or choose Custom to use the advanced scheduler.": "Elegí uno de los ajustes preestablecidos o elegí Personalizado para usar el programador avanzado.", "Choose one of the presets or select Custom to open the advanced scheduler.": "Elegí uno de los ajustes preestablecidos o seleccioná Personalizado para abrir el programador avanzado.", "Choose pod": "Elegir pod", "Choose the VM operating system type.": "Elegí el tipo de sistema operativo de la VM.", @@ -926,9 +926,9 @@ "Choose the hour and minute when resilver tasks can be started.": "Elegí la hora y los minutos en que se pueden iniciar las tareas de recuperación.", "Choose the platform that will use this share. The associated options are applied to this share.": "Elegí la plataforma que usará este recurso compartido. Las opciones asociadas se aplican a este recurso compartido.", "Choose the schema to use when querying AD for user/group info. rfc2307 uses the schema support included in Windows 2003 R2, sfu is for Service For Unix 3.0 or 3.5, and sfu20 is for Service For Unix 2.0.": "Elegí el esquema que se utilizará al consultar AD para información de usuario/grupo. rfc2307 usa el soporte de esquema incluido en Windows 2003 R2, sfu es para Service For Unix 3.0 o 3.5, y sfu20 es para Service For Unix 2.0 .", - "Choose the schema to use with LDAP authentication for SMB shares. The LDAP server must be configured with Samba attributes to use a Samba Schema. Options include RFC2307 (included in Windows 2003 R2) and Service for Unix (SFU). For SFU 3.0 or 3.5, choose \"SFU\". For SFU 2.0, choose \"SFU20\".": "Elegí el esquema para usar con la autenticación LDAP para recursos compartidos SMB. El servidor LDAP debe configurarse con atributos Samba para usar un esquema Samba. Las opciones incluyen RFC2307 (incluido en Windows 2003 R2) y Servicio para Unix (SFU). Para SFU 3.0 o 3.5, elija \"SFU\". Para SFU 2.0, elija \"SFU20\".", + "Choose the schema to use with LDAP authentication for SMB shares. The LDAP server must be configured with Samba attributes to use a Samba Schema. Options include RFC2307 (included in Windows 2003 R2) and Service for Unix (SFU). For SFU 3.0 or 3.5, choose \"SFU\". For SFU 2.0, choose \"SFU20\".": "Elegí el esquema para usar con la autenticación LDAP para recursos compartidos SMB. El servidor LDAP debe configurarse con atributos Samba para usar un esquema Samba. Las opciones incluyen RFC2307 (incluido en Windows 2003 R2) y Servicio para Unix (SFU). Para SFU 3.0 o 3.5, elegí \"SFU\". Para SFU 2.0, elegí \"SFU20\".", "Choose the speed in bps used by the serial port.": "Elegí la velocidad en bps utilizada por el puerto serie.", - "Choose the test type. See smartctl(8) for descriptions of each type. Some types will degrade performance or take disks offline. Avoid scheduling S.M.A.R.T. tests simultaneously with scrub or resilver operations.": "Elige el tipo de prueba. Consulte smartctl(8) para obtener descripciones de cada tipo. Algunos tipos degradarán el rendimiento o desconectarán los discos. Evite programar S.M.A.R.T. prueba simultáneamente con operaciones de fregado o recuperación.", + "Choose the test type. See smartctl(8) for descriptions of each type. Some types will degrade performance or take disks offline. Avoid scheduling S.M.A.R.T. tests simultaneously with scrub or resilver operations.": "Elige el tipo de prueba. Consultá smartctl(8) para obtener descripciones de cada tipo. Algunos tipos degradarán el rendimiento o desconectarán los discos. Evite programar S.M.A.R.T. prueba simultáneamente con operaciones de fregado o recuperación.", "Choose the type of interface. Bridge creates a logical link between multiple networks. Link Aggregation combines multiple network connections into a single interface. A Virtual LAN (VLAN) partitions and isolates a segment of the connection. Read-only when editing an interface.": "Eligí el tipo de interfaz. Puente crea un enlace lógico entre múltiples redes. Agregación de enlaces combina múltiples conexiones de red en una sola interfaz. Una LAN virtual (VLAN) particiona y aísla un segmento de la conexión. Solo lectura al editar una interfaz.", "Choose the type of permissions. Basic shows general permissions. Advanced shows each specific type of permission for finer control.": "Elegí el tipo de permisos. Básico muestra permisos generales. Avanzado muestra cada tipo específico de permiso para un control más preciso.", "Choose the type that matches the type of client accessing the pool/dataset.": "Eligí el tipo que coincida con el tipo de cliente que accede al pool/conjunto de datos.", @@ -937,7 +937,7 @@ "Choose when the UPS initiates shutdown.": "Elegí cuándo el UPS inicia el apagado.", "Choosing an entry loads a preset ACL that is configured to match general permissions situations.": "Elegir una entrada carga una ACL preestablecida que está configurada para coincidir con situaciones de permisos generales.", "City": "Ciudad", - "Classification for each S3 object. Choose a class based on the specific use case or performance requirements. See Amazon S3 Storage Classes for more information.": "Clasificación para cada objeto S3. Elegí una clase basada en el caso de uso específico o los requisitos de rendimiento. Consulte Clases de almacenamiento de Amazon S3 para obtener más información.", + "Classification for each S3 object. Choose a class based on the specific use case or performance requirements. See Amazon S3 Storage Classes for more information.": "Clasificación para cada objeto S3. Elegí una clase basada en el caso de uso específico o los requisitos de rendimiento. Consultá Clases de almacenamiento de Amazon S3 para obtener más información.", "Clear": "Limpiar", "Clear SED Password": "Borrar contraseña de SED", "Clear Sync Keys": "Borrar claves de sincronización", @@ -1762,7 +1762,7 @@ "Endpoint": "Punto final", "Endpoint Type": "Tipo de punto final", "Endpoint URL": "URL de punto final", - "Endpoint type to choose from the service catalogue. Public is recommended, see the rclone documentation.": "Tipo de punto final para elegir del catálogo de servicios. Se recomienda Público, consulte la documentación de rclone.", + "Endpoint type to choose from the service catalogue. Public is recommended, see the rclone documentation.": "Tipo de punto final para elegir del catálogo de servicios. Se recomienda Público, consultá la documentación de rclone.", "Enforce the use of FIPS 140-2 compliant algorithms": "Imponer el uso de algoritmos compatibles con FIPS 140-2", "Ensure Display Device": "Asegurar dispositivo de visualización", "Ensure that ACL permissions are validated for all users and groups. Disabling this may allow configurations that do not provide the intended access. It is recommended to keep this option enabled.": "Asegurate de que los permisos de ACL estén validados para todos los usuarios y grupos. Deshabilitar esta opción puede permitir configuraciones que no proporcionen el acceso deseado. Se recomienda mantener esta opción habilitada.", @@ -1910,7 +1910,7 @@ "Error: ": "Error: ", "Errors": "Errores", "Est. Usable Raw Capacity": "Capacidad bruta utilizable estimada", - "Establishing a connection requires that one of the connection systems has open TCP ports. Choose which system (LOCAL or REMOTE) will open ports. Consult your IT department to determine which systems are allowed to open ports.": "Establecer una conexión requiere que uno de los sistemas de conexión tenga puertos TCP abiertos. Elegí qué sistema (LOCAL o REMOTO) abrirá los puertos. Consulte a su departamento de TI para determinar qué sistemas pueden abrir puertos.", + "Establishing a connection requires that one of the connection systems has open TCP ports. Choose which system (LOCAL or REMOTE) will open ports. Consult your IT department to determine which systems are allowed to open ports.": "Establecer una conexión requiere que uno de los sistemas de conexión tenga puertos TCP abiertos. Elegí qué sistema (LOCAL o REMOTO) abrirá los puertos. Consultá a su departamento de TI para determinar qué sistemas pueden abrir puertos.", "Estimated data capacity available after extension.": "Capacidad de datos estimada disponible después de la extensión.", "Estimated total raw data capacity": "Capacidad total estimada de datos brutos", "Eula": "Eula", @@ -2257,10 +2257,10 @@ "Hours/Days": "Horas/Días", "How long a snapshot remains on the destination system. Enter a number and choose a measure of time from the drop-down.": "Cuánto tiempo permanece una instantánea en el sistema de destino. Ingresá un número y elegí una medida de tiempo del menú desplegable.", "How many non-self-issued intermediate certificates that can follow this certificate in a valid certification path. Entering 0 allows a single additional certificate to follow in the certificate path. Cannot be less than 0.": "Cuántos certificados intermedios no autoemitidos pueden seguir este certificado en una ruta de certificación válida. Ingresar 0 permite que se siga un solo certificado adicional en la ruta del certificado. No puede ser inferior a 0.", - "How often to run the scrub task. Choose one of the presets or choose Custom to use the advanced scheduler.": "Con qué frecuencia ejecutar la tarea de limpieza. Elija uno de los ajustes preestablecidos o elegí Personalizado para usar el programador avanzado.", + "How often to run the scrub task. Choose one of the presets or choose Custom to use the advanced scheduler.": "Con qué frecuencia ejecutar la tarea de limpieza. Elegí uno de los ajustes preestablecidos o elegí Personalizado para usar el programador avanzado.", "How permissions are applied to the share. Allowed denies all permissions by default except those that are manually defined. Denied allows all permissions by default except those that are manually defined.": "Cómo se aplican los permisos al recurso compartido. Permitido niega todos los permisos de forma predeterminada, excepto los que se definen manualmente. Denegado permite todos los permisos de forma predeterminada, excepto los que se definen manualmente.", - "How the Permissions are applied to the chosen Who. Choose Allow to grant the specified permissions and Deny to restrict the specified permissions.": "Cómo se aplican los Permisos al Who elegido. Elija Permitir para otorgar los permisos especificados y Denegar para restringir los permisos especificados.", - "How the dataset is secured. Choose between securing with an encryption Key or a user-defined Passphrase. Creating a new key file invalidates any previously downloaded key file for this dataset. Delete any previous key file backups and back up the new key file.": "Cómo se asegura el conjunto de datos. Elija entre proteger con una Clave de cifrado o una Frase de contraseña definida por el usuario. La creación de un nuevo archivo de clave invalida cualquier archivo de clave descargado previamente para este conjunto de datos. Elimine cualquier copia de seguridad del archivo de clave anterior y hacé una copia de seguridad del nuevo archivo de clave.", + "How the Permissions are applied to the chosen Who. Choose Allow to grant the specified permissions and Deny to restrict the specified permissions.": "Cómo se aplican los Permisos al Who elegido. Elegí Permitir para otorgar los permisos especificados y Denegar para restringir los permisos especificados.", + "How the dataset is secured. Choose between securing with an encryption Key or a user-defined Passphrase. Creating a new key file invalidates any previously downloaded key file for this dataset. Delete any previous key file backups and back up the new key file.": "Cómo se asegura el conjunto de datos. Elegí entre proteger con una Clave de cifrado o una Frase de contraseña definida por el usuario. La creación de un nuevo archivo de clave invalida cualquier archivo de clave descargado previamente para este conjunto de datos. Eliminá cualquier copia de seguridad del archivo de clave anterior y hacé una copia de seguridad del nuevo archivo de clave.", "How this ACE is applied to newly created directories and files within the dataset. Basic flags enable or disable ACE inheritance. Advanced flags allow further control of how the ACE is applied to files and directories in the dataset.": "Cómo se aplica esta ACE a los directorios y archivos recién creados dentro del conjunto de datos. Las banderas básicas habilitan o deshabilitan la herencia ACE. Las banderas avanzadas permiten un mayor control de cómo se aplica el ACE a los archivos y directorios en el conjunto de datos.", "How to configure the connection:

Manual requires configuring authentication on the remote system. This can include copying SSH keys and modifying the root user account on that system.

Semi-automatic only works when configuring an SSH connection with a remote TrueNAS system. This method uses the URL and login credentials of the remote system to connect and exchange SSH keys.": "Cómo configurar la conexión:

Manual requiere configurar la autenticación en el sistema remoto. Esto puede incluir copiar claves SSH y modificar la cuenta de usuario root en ese sistema.

Semiautomática solo funciona cuando se configura una conexión SSH con un sistema TrueNAS remoto. Este método utiliza la URL y las credenciales de inicio de sesión del sistema remoto para conectarse e intercambiar claves SSH.", "Hubic": "Hubic", @@ -2309,7 +2309,7 @@ "Identify light is now off.": "La luz de identificación ahora está apagada.", "Identify light is off.": "La luz de identificación está apagada.", "Identify light is on.": "La luz de identificación está encendida.", - "Identify the purpose for this public key. Typically used for end entity certificates. Multiple usages can be selected. Do not mark this extension critical when the Usage is ANY_EXTENDED_KEY_USAGE.

Using both Extended Key Usage and Key Usage extensions requires that the purpose of the certificate is consistent with both extensions. See RFC 3280, section 4.2.1.13 for more details.": "Identifique el propósito de esta clave pública. Normalmente se usa para certificados de entidad final. Se pueden seleccionar varios usos. No marque esta extensión crítica cuando el Usage es ANY_EXTENDED_KEY_USAGE.

Usar Uso de claves extendido y Uso de clave extensiones requiere que el propósito del certificado sea coherente con ambas extensiones. Para obtener más información, consulte RFC 3280, sección 4.2.1.13.", + "Identify the purpose for this public key. Typically used for end entity certificates. Multiple usages can be selected. Do not mark this extension critical when the Usage is ANY_EXTENDED_KEY_USAGE.

Using both Extended Key Usage and Key Usage extensions requires that the purpose of the certificate is consistent with both extensions. See RFC 3280, section 4.2.1.13 for more details.": "Identifique el propósito de esta clave pública. Normalmente se usa para certificados de entidad final. Se pueden seleccionar varios usos. No marque esta extensión crítica cuando el Usage es ANY_EXTENDED_KEY_USAGE.

Usar Uso de claves extendido y Uso de clave extensiones requiere que el propósito del certificado sea coherente con ambas extensiones. Para obtener más información, consultá RFC 3280, sección 4.2.1.13.", "Identify this certificate as a Certificate Authority (CA).": "Identifique este certificado como entidad de certificación (CA).", "Identify this extension as critical for the certificate. Critical extensions must be recognized by the certificate-using system or this certificate will be rejected. Extensions identified as not critical can be ignored by the certificate-using system and the certificate still approved.": "Identifique esta extensión como crítica para el certificado. Las extensiones críticas deben ser reconocidas por el sistema de uso de certificados o este certificado será rechazado. El sistema que usa el certificado y el certificado todavía aprobado pueden omitir las extensiones identificadas como no críticas.", "Idle": "Inactivo", @@ -2401,7 +2401,7 @@ "Initiators Groups": "Grupos de iniciadores", "Initiators allowed access to this system. Enter an iSCSI Qualified Name (IQN) and click + to add it to the list. Example: iqn.1994-09.org.freebsd:freenas.local": "Los iniciadores permitieron el acceso a este sistema. Ingresá un nombre calificado iSCSI (IQN) y hacé clic en + para agregarlo a la lista. Ejemplo: iqn.1994-09.org.freebsd: freenas.local", "Initiators currently connected to the system. Shown in IQN format with an IP address. Set initiators and click an -> (arrow) to add the initiators to either the Allowed Initiators or Authorized Networks lists. Clicking Refresh updates the Connected Initiators list.": "Iniciadores actualmente conectados al sistema. Se muestra en formato IQN con una dirección IP. Configurá los iniciadores y hacé clic en una -> (flecha) para agregar los iniciadores a las listas Iniciadores permitidos o Redes autorizadas. Al hacer clic en Actualizar, se actualiza la lista de Iniciadores conectados.", - "Input the pre-defined container to use.": "ingresá el contenedor predefinido para usar.", + "Input the pre-defined container to use.": "Ingresá el contenedor predefinido para usar.", "Inquiry": "Consulta", "Insensitive": "Insensible", "Inspect VDEVs": "Inspeccionar VDEVs", @@ -2428,7 +2428,7 @@ "Instance stopped": "Instancia detenida", "Instance updated": "Instancia actualizada", "Instances": "Instancias", - "Instances you create will automatically appear here.": "Las instancias que crees aparecerán acá automáticamente.", + "Instances you create will automatically appear here.": "Las instancias que crees van a aparecer acá automáticamente.", "Integrate Snapshots with VMware": "Integrar instantáneas con VMware", "Interface": "Interfaz", "Interface Settings": "Configuraciones de interfaz", @@ -2605,7 +2605,7 @@ "List any existing dataset properties to remove from the replicated files.": "Enumere las propiedades del conjunto de datos existentes para eliminar de los archivos replicados.", "List of chat IDs": "Lista de ID de chat", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "Lista de archivos y directorios que se van a de la copia de seguridad.
Separá las entradas presionando Enter. Consultá patrones de exclusión de restic para obtener más detalles sobre la opción --exclude.", - "List of files and directories to exclude from sync.
Separate entries by pressing Enter. See rclone filtering for more details about the --exclude option.": "Lista de archivos y directorios para excluir de la sincronización.
Separe las entradas presionando Enter. Consulte filtrado de rclone para obtener más detalles sobre la opción --exclude.", + "List of files and directories to exclude from sync.
Separate entries by pressing Enter. See rclone filtering for more details about the --exclude option.": "Lista de archivos y directorios para excluir de la sincronización.
Separe las entradas presionando Enter. Consultá filtrado de rclone para obtener más detalles sobre la opción --exclude.", "List of groups for which to generate audit messages. Keep this list empty to Watch All.": "Lista de grupos para los que se generarán mensajes de auditoría. Dejá esta lista vacía para ver todos.", "List of groups to ignore when auditing. If conflict arises between Watch List and Ignore List (based on user group membership), then Watch List will take precedence and ops will be audited.": "Lista de grupos que se deben ignorar durante la auditoría. Si surge un conflicto entre la lista de seguimiento y la lista de ignorados (según la membresía del grupo de usuarios), la lista de seguimiento tendrá prioridad y se auditarán las operaciones.", "Listen": "Escucha", @@ -2741,7 +2741,7 @@ "Matching naming schema": "Esquema de nombres coincidente", "Matching regular expression": "Expresión regular coincidente", "Matching the fixed size of data, as in a database, may result in better performance.": "Hacer coincidir el tamaño fijo de los datos, como en una base de datos, puede resultar en un mejor rendimiento.", - "Mathematical instruction sets that determine how plaintext is converted into ciphertext. See Advanced Encryption Standard (AES) for more details.": "Conjuntos de instrucciones matemáticas que determinan cómo se convierte el texto sin formato en texto cifrado. Consulte Estándar de cifrado avanzado (AES) para obtener más detalles.", + "Mathematical instruction sets that determine how plaintext is converted into ciphertext. See Advanced Encryption Standard (AES) for more details.": "Conjuntos de instrucciones matemáticas que determinan cómo se convierte el texto sin formato en texto cifrado. Consultá Estándar de cifrado avanzado (AES) para obtener más detalles.", "Mattermost username.": "Nombre de usuario más importante.", "Max Concurrent Calls": "Máx. de llamadas simultáneas", "Max Poll": "Máx Poll", @@ -2920,7 +2920,7 @@ "Network addresses allowed to use this initiator. Leave blank to allow all networks or list network addresses with a CIDR mask. Separate entries by pressing Enter.": "Las direcciones de red pueden usar este iniciador. Déjelo en blanco para permitir todas las redes o enumere las direcciones de red con una máscara CIDR. Separe las entradas presionando Enter.", "Network addresses allowed use this initiator. Each address can include an optional CIDR netmask. Click + to add the network address to the list. Example: 192.168.2.0/24.": "Las direcciones de red permitidas usan este iniciador. Cada dirección puede incluir una CIDR netmask opcional. Hacé clic en + para agregar la dirección de red a la lista. Ejemplo: 192.168.2.0/24.", "Network changes applied successfully.": "Cambios en la red aplicados con éxito.", - "Network community string. The community string acts like a user ID or password. A user with the correct community string has access to network information. The default is public. For more information, see What is an SNMP Community String?.": "Cadena de comunidad de red. La cadena de comunidad actúa como un ID de usuario o contraseña. Un usuario con la cadena de comunidad correcta tiene acceso a la información de la red. El valor predeterminado es público. Para obtener más información, consulte ¿Qué es una cadena comunitaria SNMP?.", + "Network community string. The community string acts like a user ID or password. A user with the correct community string has access to network information. The default is public. For more information, see What is an SNMP Community String?.": "Cadena de comunidad de red. La cadena de comunidad actúa como un ID de usuario o contraseña. Un usuario con la cadena de comunidad correcta tiene acceso a la información de la red. El valor predeterminado es público. Para obtener más información, consultá ¿Qué es una cadena comunitaria SNMP?.", "Network control (highest)": "Control de red (más alto)", "Network interface changes have been made permanent.": "Los cambios en la interfaz de red se han hecho permanentes.", "Network interface changes have been temporarily applied for testing. Keep changes permanently? Changes are automatically reverted after the testing delay if they are not permanently applied.": "Los cambios en la interfaz de red se han aplicado temporalmente para las pruebas. ¿Mantener cambios permanentemente? Los cambios se revierten automáticamente después del retraso de la prueba si no se aplican de forma permanente.", @@ -3087,12 +3087,12 @@ "Number of days to retain local audit messages.": "Número de días para conservar los mensajes de auditoría local.", "Number of objects that can be owned by each of the selected groups. Entering 0 (zero) allows unlimited objects.": "Número de objetos que pueden ser propiedad de cada uno de los grupos seleccionados. Al ingresar 0 (cero) se permiten objetos ilimitados.", "Number of objects that can be owned by each of the selected users. Entering 0 (zero) allows unlimited objects.": "Número de objetos que pueden ser propiedad de cada uno de los usuarios seleccionados. Al ingresar 0 (cero) se permiten objetos ilimitados.", - "Number of password-based key derivation function 2 (PBKDF2) iterations to use for reducing vulnerability to brute-force attacks. Entering a number larger than 100000 is required. See PBKDF2 for more details.": "Número de iteraciones de la función de derivación de clave basada en contraseña 2 (PBKDF2) para reducir la vulnerabilidad a los ataques de fuerza bruta. Se requiere ingresar un número mayor que 100000. Consulte PBKDF2 para obtener más detalles.", + "Number of password-based key derivation function 2 (PBKDF2) iterations to use for reducing vulnerability to brute-force attacks. Entering a number larger than 100000 is required. See PBKDF2 for more details.": "Número de iteraciones de la función de derivación de clave basada en contraseña 2 (PBKDF2) para reducir la vulnerabilidad a los ataques de fuerza bruta. Se requiere ingresar un número mayor que 100000. Consultá PBKDF2 para obtener más detalles.", "Number of retries for failed replications": "Número de reintentos para réplicas fallidas", "Number of seconds before a timeout. Increase this value if AD DNS queries time out.": "Número de segundos antes de un tiempo de espera. Aumente este valor si las consultas de AD DNS expiran.", "Number of seconds before timeout. To view the AD connection status, open the interface Task Manager.": "Número de segundos antes del tiempo de espera. Para ver el estado de la conexión AD, abra la interfaz Administrador de tareas.", "Number of seconds to wait after a network failure before triggering a failover. 0 means a failover occurs immediately, or after two seconds when the system is using a link aggregation.": "Número de segundos para esperar después de una falla de red antes de desencadenar una conmutación por error. 0 significa que se produce una conmutación por error inmediatamente o después de dos segundos cuando el sistema está utilizando una agregación de enlaces.", - "Number of simultaneous file transfers. Enter a number based on the available bandwidth and destination system performance. See rclone --transfers.": "Número de transferencias simultáneas de archivos. Ingresá un número basado en el ancho de banda disponible y el rendimiento del sistema de destino. Consulte rclone --transfers .", + "Number of simultaneous file transfers. Enter a number based on the available bandwidth and destination system performance. See rclone --transfers.": "Número de transferencias simultáneas de archivos. Ingresá un número basado en el ancho de banda disponible y el rendimiento del sistema de destino. Consultá rclone --transfers .", "Number of times the replication is attempted before stopping and marking the task as failed.": "Número de veces que se intenta la replicación antes de detener y marcar la tarea como fallida.", "Number of virtual CPUs to allocate to the virtual machine. The VM operating system might have operational or licensing restrictions on the number of CPUs.": "Número de CPU virtuales para asignar a la máquina virtual. El sistema operativo de la máquina virtual puede tener restricciones operativas o de licencia sobre la cantidad de CPU.", "OAuth Authentication": "Autenticación OAuth", @@ -3144,7 +3144,7 @@ "Only numeric ids are allowed.": "Sólo se permiten identificadores numéricos.", "Only one can be active at a time.": "Sólo uno puede estar activo a la vez.", "Only override the default if the initiator requires a different block size.": "Solo anule el valor predeterminado si el iniciador requiere un tamaño de bloque diferente.", - "Only replicate snapshots that match a defined creation time. To specify which snapshots will be replicated, set this checkbox and define the snapshot creation times that will be replicated. For example, setting this time frame to Hourly will only replicate snapshots that were created at the beginning of each hour.": "Solo replica las instantáneas que coincidan con un tiempo de creación definido. Para especificar qué instantáneas se replicarán, establezca esta casilla de verificación y defina los tiempos de creación de instantáneas que se replicarán. Por ejemplo, establecer este período de tiempo en Cada hora solo replicará las instantáneas que se crearon al comienzo de cada hora.", + "Only replicate snapshots that match a defined creation time. To specify which snapshots will be replicated, set this checkbox and define the snapshot creation times that will be replicated. For example, setting this time frame to Hourly will only replicate snapshots that were created at the beginning of each hour.": "Solo replica las instantáneas que coincidan con un tiempo de creación definido. Para especificar qué instantáneas se van a replicar, establecé esta casilla de verificación y definí los tiempos de creación de instantáneas que se va a replicar. Por ejemplo, establecer este período de tiempo en Cada hora solo va a replicar las instantáneas que se crearon al comienzo de cada hora.", "Open": "Abrir", "Open Files": "Abrir archivos", "Open TrueCommand User Interface": "Abra la interfaz de usuario de TrueCommand", @@ -3163,7 +3163,7 @@ "Optional. Enter a server description.": "Opcional. Ingresá una descripción del servidor.", "Optional. Only needed for private images.": "Opcional. Solo es necesario para imágenes privadas.", "Optional: CPU Set (Examples: 0-3,8-11)": "Opcional: Conjunto de CPU (ejemplos: 0-3,8-11)", - "Optional: Choose installation media image": "Opcional: elija la imagen del medio de instalación", + "Optional: Choose installation media image": "Opcional: elegí la imagen del medio de instalación", "Optional: NUMA nodeset (Example: 0-1)": "Opcional: conjunto de nodos NUMA (Ejemplo: 0-1)", "Options": "Opciones", "Options cannot be loaded": "No se pueden cargar las opciones", @@ -3390,7 +3390,7 @@ "Prune By": "Podar por", "Prune Deduplication Table": "Podar la tabla de deduplicación", "Pruning Deduplication Table": "Podando la tabla de deduplicación", - "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "Dirección IP pública o nombre de host. Establezca si los clientes FTP no pueden conectarse a través de un dispositivo NAT.", + "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "Dirección IP pública o nombre de host. Establecé si los clientes FTP no pueden conectarse a través de un dispositivo NAT.", "Public Key": "Clave pública", "Pull Image": "Extraer imagen", "Pulling...": "Obteniendo...", @@ -3505,7 +3505,7 @@ "Remove iXVolumes": "Eliminar iXVolumes", "Remove preset": "Eliminar preajuste", "Remove the ACL and permissions from child datasets of the current dataset": "Eliminar la ACL y los permisos de los conjuntos de datos secundarios del conjunto de datos actual", - "Remove the existing API key and generate a new random key. A dialog shows the new key and has an option to copy the key. Back up and secure the API key! The key string is displayed only one time, at creation.": "Elimine la clave API existente y genere una nueva clave aleatoria. Un cuadro de diálogo muestra la nueva clave y tiene una opción para copiar la clave. ¡Hacé una copia de seguridad y asegure la clave API! La cadena de clave se muestra solo una vez, en la creación.", + "Remove the existing API key and generate a new random key. A dialog shows the new key and has an option to copy the key. Back up and secure the API key! The key string is displayed only one time, at creation.": "Eliminar la clave de API existente y genere una nueva clave aleatoria. Un cuadro de diálogo muestra la nueva clave y tiene una opción para copiar la clave. ¡Hacé una copia de seguridad y asegure la clave API! La cadena de clave se muestra solo una vez, en la creación.", "Remove this error to try again": "Eliminar este error para volver a intentarlo", "Remove {label} item": "Eliminar elemento {label}", "Remove {value} from recent searches": "Eliminar {value} de las búsquedas recientes", @@ -3832,9 +3832,9 @@ "Secure data within this dataset. Data is unusable until unlocked with an encryption key or passphrase. If parent dataset has encryption enabled, it is not possible to disable this option.": "Datos seguros dentro de este conjunto de datos. Los datos no se pueden utilizar hasta que se desbloqueen con una clave de cifrado o una frase de contraseña. Si el conjunto de datos principal tiene el cifrado habilitado, no es posible deshabilitar esta opción.", "Secure data within this dataset. Data is unusable until unlocked with an encryption key or passphrase. If parent dataset has encryption enabled, it is not possible to disable this option.": "Datos seguros dentro de este conjunto de datos. Los datos no se pueden utilizar hasta que se desbloqueen con una clave de cifrado o una frase de contraseña. Si el conjunto de datos principal tiene el cifrado habilitado, no es posible deshabilitar esta opción.", "Security": "Seguridad", - "See Why is elliptic curve cryptography not widely used, compared to RSA? for more information about key types.": "Consulte ¿Por qué? La criptografía de curva elíptica no se usa ampliamente, en comparación con RSA? para obtener más información sobre los tipos de clave.", + "See Why is elliptic curve cryptography not widely used, compared to RSA? for more information about key types.": "Consultá ¿Por qué? La criptografía de curva elíptica no se usa ampliamente, en comparación con RSA? para obtener más información sobre los tipos de clave.", "See Public key authentication in SSH/Authentication.": "Consultá autenticación de clave pública en SSH/Autenticación.", - "See the Network UPS Tools compatibility list for a list of supported UPS devices.": "Consulte la Lista de compatibilidad de herramientas UPS de red para obtener una lista de los dispositivos UPS compatibles.", + "See the Network UPS Tools compatibility list for a list of supported UPS devices.": "Consultá la lista de compatibilidad de herramientas SAI de red para obtener una lista de los dispositivos SAI compatibles.", "Select": "Seleccionar", "Select Bug when reporting an issue or Suggestion when requesting new functionality.": "Seleccioná Error cuando informe un problema o Sugerencia cuando solicites una nueva funcionalidad.", "Select Command for an executable or Script for an executable script.": "Seleccioná Comando para un ejecutable o Script para un script ejecutable.", @@ -3865,10 +3865,10 @@ "Select a preset schedule or choose Custom to use the advanced scheduler.": "Seleccioná un horario preestablecido o elegí Personalizado para usar el programador avanzado.", "Select a preset schedule or choose Custom to use the advanced scheduler.": "Seleccioná un horario preestablecido o elegí Personalizado para usar el programador avanzado.", "Select a previously imported or created CA.": "Seleccioná una CA previamente importado o creado.", - "Select a saved remote system SSH connection or choose Create New to create a new SSH connection.": "Seleccioná una conexión SSH del sistema remoto guardada o elija Crear nueva para crear una nueva conexión SSH.", + "Select a saved remote system SSH connection or choose Create New to create a new SSH connection.": "Seleccioná una conexión SSH del sistema remoto guardada o elegí Crear nueva para crear una nueva conexión SSH.", "Select a schedule preset or choose Custom to open the advanced scheduler.": "Seleccioná un programa preestablecido o eligí Personalizado para abrir el programador avanzado.", - "Select a schedule preset or choose Custom to open the advanced scheduler. Note that an in-progress cron task postpones any later scheduled instance of the same task until the running task is complete.": "Seleccioná un programa preestablecido o elija Personalizado para abrir el programador avanzado. Tenga en cuenta que una tarea cron en progreso pospone cualquier instancia programada posterior de la misma tarea hasta que se complete la tarea en ejecución.", - "Select a schedule preset or choose Custom to open the advanced scheduler.": "Seleccioná un programa preestablecido o elija Personalizado para abrir el programador avanzado.", + "Select a schedule preset or choose Custom to open the advanced scheduler. Note that an in-progress cron task postpones any later scheduled instance of the same task until the running task is complete.": "Seleccioná un programa preestablecido o elegí Personalizado para abrir el programador avanzado. Tenga en cuenta que una tarea cron en progreso pospone cualquier instancia programada posterior de la misma tarea hasta que se complete la tarea en ejecución.", + "Select a schedule preset or choose Custom to open the advanced scheduler.": "Seleccioná un programa preestablecido o elegí Personalizado para abrir el programador avanzado.", "Select a schedule preset or choose Custom to setup custom schedule.": "Seleccioná un horario preestablecido o eligí Personalizado para configurar un horario personalizado.", "Select a schema when LDAP NSS schema is set.": "Seleccioná un esquema cuando se configure el esquema LDAP NSS.", "Select a screen resolution to use for SPICE sessions.": "Seleccioná una resolución de pantalla para usar en las sesiones SPICE.", @@ -3880,10 +3880,10 @@ "Select an IP address to use for SPICE sessions.": "Seleccioná una dirección IP para utilizar en las sesiones SPICE.", "Select an IP address to use for remote SPICE sessions. Note: this setting only applies if you are using a SPICE client other than the TrueNAS WebUI.": "Seleccioná una dirección IP para usar en sesiones SPICE remotas. Nota: esta configuración solo se aplica si está usando un cliente SPICE que no sea la interfaz web de TrueNAS.", "Select an existing CSR.": "Seleccionar un CSR existente.", - "Select an existing SSH connection to a remote system or choose Create New to create a new SSH connection.": "Seleccioná una conexión SSH existente a un sistema remoto o elija Crear nueva para crear una nueva conexión SSH.", + "Select an existing SSH connection to a remote system or choose Create New to create a new SSH connection.": "Seleccioná una conexión SSH existente a un sistema remoto o elegí Crear nueva para crear una nueva conexión SSH.", "Select an existing SSH connection to a remote system or choose Create New to create a new SSH connection.": "Seleccionar una conexión SSH existente a un sistema remoto o elegí crear nuevo para crear una nueva conexión SSH.", "Select an existing extent.": "Seleccioná una extensión existente.", - "Select an existing portal or choose Create New to configure a new portal.": "Seleccioná un portal existente o elija Crear nuevo para configurar un nuevo portal.", + "Select an existing portal or choose Create New to configure a new portal.": "Seleccioná un portal existente o elegí Crear nuevo para configurar un nuevo portal.", "Select an existing realm that was added in Directory Services > Kerberos Realms.": "Seleccioná un reino existente que se agregó en Servicios de directorio > Reinos Kerberos.", "Select an existing target.": "Seleccioná un objetivo existente.", "Select an unused disk to add to this vdev.
WARNING: any data stored on the unused disk will be erased!": "Seleccioná un disco no utilizado para agregar a este vdev.
ADVERTENCIA: ¡todos los datos almacenados en el disco no utilizado se van a borrar!", @@ -4003,34 +4003,34 @@ "Set font size": "Establecer tamaño de fuente", "Set for the LDAP server to disable authentication and allow read and write access to any client.": "Configurado para que el servidor LDAP desactive la autenticación y permita el acceso de lectura y escritura a cualquier cliente.", "Set for the UPS to power off after shutting down the system.": "Configure el UPS para que se apague después de apagar el sistema.", - "Set for the default configuration to listen on all interfaces using the known values of user: upsmon and password: fixmepass.": "Establezca la configuración predeterminada para escuchar en todas las interfaces utilizando los valores conocidos del usuario: upsmon y contraseña: fixmepass.", + "Set for the default configuration to listen on all interfaces using the known values of user: upsmon and password: fixmepass.": "Establecé la configuración predeterminada para escuchar en todas las interfaces utilizando los valores conocidos del usuario: upsmon y contraseña: fixmepass.", "Set if the initiator does not support physical block size values over 4K (MS SQL).": "Se establece si el iniciador no admite valores de tamaño de bloque físico sobre 4K (MS SQL).", "Set new password": "Establecer nueva contraseña", - "Set only if required by the NFS client. Set to allow serving non-root mount requests.": "Establezca solo si lo requiere el cliente NFS. Configurado para permitir el servicio de solicitudes de montaje no root.", - "Set or change the password of this SED. This password is used instead of the global SED password.": "Establezca o cambie la contraseña de este SED. Esta contraseña se utiliza en lugar de la contraseña global de SED.", + "Set only if required by the NFS client. Set to allow serving non-root mount requests.": "Establecé solo si lo requiere el cliente NFS. Configurado para permitir el servicio de solicitudes de montaje no root.", + "Set or change the password of this SED. This password is used instead of the global SED password.": "Establecé o cambiá la contraseña de este SED. Esta contraseña se utiliza en lugar de la contraseña global de SED.", "Set password for TrueNAS administrative user:": "Establecer contraseña para el usuario administrativo de TrueNAS:", "Set production status as active": "Establecer el estado de producción como activo", - "Set specific times to snapshot the Source Datasets and replicate the snapshots to the Destination Dataset. Select a preset schedule or choose Custom to use the advanced scheduler.": "Establezca tiempos específicos para tomar una instantánea de los Conjuntos de datos de origen y replicar las instantáneas en el Conjunto de datos de destino. Seleccioná un horario preestablecido o elija Personalizado para usar el programador avanzado.", + "Set specific times to snapshot the Source Datasets and replicate the snapshots to the Destination Dataset. Select a preset schedule or choose Custom to use the advanced scheduler.": "Establecé tiempos específicos para tomar una instantánea de los Conjuntos de datos de origen y replicar las instantáneas en el Conjunto de datos de destino. Seleccioná un horario preestablecido o elegí Personalizado para usar el programador avanzado.", "Set the maximum number of connections per IP address. 0 means unlimited.": "Establecé el número máximo de conexiones por dirección IP. 0 significa ilimitado.", - "Set the number of data copies on this dataset.": "Establezca el número de copias de datos en este conjunto de datos.", + "Set the number of data copies on this dataset.": "Establecé el número de copias de datos en este conjunto de datos.", "Set the port the FTP service listens on.": "Establecé el puerto en el que escucha el servicio FTP.", - "Set the read, write, and execute permissions for the dataset.": "Establezca los permisos de lectura, escritura y ejecución para el conjunto de datos.", - "Set the root directory for anonymous FTP connections.": "Establezca el directorio raíz para conexiones FTP anónimas.", - "Set this replication on a schedule or just once.": "Establezca esta replicación en un horario o solo una vez.", + "Set the read, write, and execute permissions for the dataset.": "Establecé los permisos de lectura, escritura y ejecución para el conjunto de datos.", + "Set the root directory for anonymous FTP connections.": "Establecé el directorio raíz para conexiones FTP anónimas.", + "Set this replication on a schedule or just once.": "Establecé esta replicación en un horario o solo una vez.", "Set to allow FTP clients to resume interrupted transfers.": "Configurado para permitir que los clientes FTP reanuden las transferencias interrumpidas.", "Set to allow an initiator to bypass normal access control and access any scannable target. This allows xcopy operations which are otherwise blocked by access control.": "Configurado para permitir que un iniciador omita el control de acceso normal y acceda a cualquier objetivo escaneable. Esto permite xcopy operaciones que de otro modo están bloqueadas por el control de acceso.", - "Set to allow the client to mount any subdirectory within the Path.": "Establezca para permitir que el cliente monte cualquier subdirectorio dentro de la Ruta .", + "Set to allow the client to mount any subdirectory within the Path.": "Establecé para permitir que el cliente monte cualquier subdirectorio dentro de la Ruta .", "Set to allow user to authenticate to Samba shares.": "Configurado para permitir que el usuario se autentique en los recursos compartidos de Samba.", "Set to allow users to bypass firewall restrictions using the SSH port forwarding feature.": "Configurado para permitir a los usuarios eludir las restricciones de firewall utilizando el puerto SSH función de reenvío .", "Set to also replicate all snapshots contained within the selected source dataset snapshots. Unset to only replicate the selected dataset snapshots.": "Configure también para replicar todas las instantáneas contenidas en las instantáneas del conjunto de datos de origen seleccionado. Desarmar para replicar solo las instantáneas seleccionadas del conjunto de datos.", "Set to attempt to reduce latency over slow networks.": "Configurado para intentar reducir la latencia en redes lentas.", "Set to automatically configure the IPv6. Only one interface can be configured this way.": "Configurar automáticamente IPv6. Solo se puede configurar una interfaz de esta manera.", "Set to automatically create the defined Remote Path if it does not exist.": "Configure para crear automáticamente la Ruta remota definida si no existe.", - "Set to create a new primary group with the same name as the user. Unset to select an existing group for the user.": "Establezca para crear un nuevo grupo primario con el mismo nombre que el usuario. Desarmar para seleccionar un grupo existente para el usuario.", - "Set to determine if the system participates in a browser election. Leave unset when the network contains an AD or LDAP server, or when Vista or Windows 7 machines are present.": "Establezca para determinar si el sistema participa en una elección de navegador. Dejá sin configurar cuando la red contiene un servidor AD o LDAP, o cuando halla máquinas con Vista o Windows 7.", + "Set to create a new primary group with the same name as the user. Unset to select an existing group for the user.": "Establecé para crear un nuevo grupo primario con el mismo nombre que el usuario. Desarmar para seleccionar un grupo existente para el usuario.", + "Set to determine if the system participates in a browser election. Leave unset when the network contains an AD or LDAP server, or when Vista or Windows 7 machines are present.": "Establecé para determinar si el sistema participa en una elección de navegador. Dejá sin configurar cuando la red contiene un servidor AD o LDAP, o cuando halla máquinas con Vista o Windows 7.", "Set to display image upload options.": "Configurar para mostrar las opciones de carga de imágenes.", "Set to either start this replication task immediately after the linked periodic snapshot task completes or continue to create a separate Schedule for this replication.": "Configure esta opción para iniciar esta tarea de replicación inmediatamente después de que la tarea de instantánea periódica vinculada se complete o continúe creando una Programación separada para esta replicación.", - "Set to enable DHCP. Leave unset to create a static IPv4 or IPv6 configuration. Only one interface can be configured for DHCP.": "Establezca para habilitar DHCP. Dejá sin configurar para crear una configuración estática de IPv4 o IPv6. Solo se puede configurar una interfaz para DHCP.", + "Set to enable DHCP. Leave unset to create a static IPv4 or IPv6 configuration. Only one interface can be configured for DHCP.": "Establecé para habilitar DHCP. Dejá sin configurar para crear una configuración estática de IPv4 o IPv6. Solo se puede configurar una interfaz para DHCP.", "Set to enable Samba to do DNS updates when joining a domain.": "Configurar para permitir que Samba realice actualizaciones de DNS al unirse a un dominio.", "Set to enable connecting to the SPICE web interface.": "Configurar para habilitar la conexión a la interfaz web SPICE.", "Set to enable the File eXchange Protocol. This option makes the server vulnerable to FTP bounce attacks so it is not recommended.": "Configurado para habilitar el Protocolo de intercambio de archivos. Esta opción hace que el servidor sea vulnerable a los ataques de rebote FTP, por lo que no se recomienda.", @@ -4039,7 +4039,7 @@ "Set to force NFS shares to fail if the Kerberos ticket is unavailable.": "Configurado para forzar que los recursos compartidos de NFS fallen si el ticket Kerberos no está disponible.", "Set to generate and attach to the new issue a report containing an overview of the system hardware, build string, and configuration. This can take several minutes.": "Configure para generar y adjuntar al nuevo problema un informe que contiene una descripción general del hardware del sistema, la cadena de compilación y la configuración. Esto puede tardar varios minutos.", "Set to ignore mapping requests for the BUILTIN domain.": "Configurado para ignorar las solicitudes de mapeo para el dominio BUILTIN .", - "Set to ignore the Virtual Machine status during the delete operation. Unset to prevent deleting the Virtual Machine when it is still active or has an undefined state.": "Establezca para ignorar el estado de la máquina virtual durante la operación de eliminación. Desarmar para evitar eliminar la máquina virtual cuando todavía está activa o tiene un estado indefinido.", + "Set to ignore the Virtual Machine status during the delete operation. Unset to prevent deleting the Virtual Machine when it is still active or has an undefined state.": "Establecé para ignorar el estado de la máquina virtual durante la operación de eliminación. Desarmar para evitar eliminar la máquina virtual cuando todavía está activa o tiene un estado indefinido.", "Set to include all subdirectories of the specified directory. When unset, only the specified directory is included.": "Se establece para incluir todos los subdirectorios del directorio especificado. Cuando se desarma, solo se incluye el directorio especificado.", "Set to include child datasets and zvols of the chosen dataset.": "Establecé para incluir conjuntos de datos secundarios y zvols del conjunto de datos elegido.", "Set to include the Fully-Qualified Domain Name (FQDN) in logs to precisely identify systems with similar hostnames.": "Configurado para incluir el nombre de dominio completo (FQDN) en los registros para identificar con precisión los sistemas con nombres de host similares.", @@ -4053,25 +4053,25 @@ "Set to preserve modification times of files.": "Establecer para preservar los tiempos de modificación de los archivos.", "Set to preserve original file permissions. This is useful when the user is set to root.": "Establecer para preservar los permisos del archivo original. Esto es útil cuando el usuario está configurado en raíz .", "Set to prevent the dataset from being modified.": "Se establece para evitar que se modifique el conjunto de datos.", - "Set to prevent the initiator from initializing this LUN.": "Establezca para evitar que el iniciador inicialice este LUN.", + "Set to prevent the initiator from initializing this LUN.": "Establecé para evitar que el iniciador inicialice este LUN.", "Set to prevent the zvol from being modified.": "Establecé para evitar que se modifique zvol.", "Set to prohibit writing to the share.": "Establecido para prohibir la escritura en el recurso compartido.", - "Set to query the cn instead of uid attribute for the user name in LDAP.": "Establezca para consultar el cn en lugar del atributo uid para el nombre de usuario en LDAP.", + "Set to query the cn instead of uid attribute for the user name in LDAP.": "Establecé para consultar el cn en lugar del atributo uid para el nombre de usuario en LDAP.", "Set to reduce the size of data to transmit. Recommended for slow connections.": "Establecer para reducir el tamaño de los datos a transmitir. Recomendado para conexiones lentas.", "Set to remove all ACLs from the current dataset. ACLs are also recursively stripped from directories and child datasets when those options are set.": "Establecer para eliminar todas las ACL del conjunto de datos actual. Las ACL también se eliminan recursivamente de directorios y conjuntos de datos secundarios cuando se establecen esas opciones.", - "Set to remove the data associated with this Virtual Machine (which will result in data loss if the data is not backed up). Unset to leave the data intact.": "Establezca para eliminar los datos asociados con esta máquina virtual (lo que provocará la pérdida de datos si no se realiza una copia de seguridad de los datos). Desarmar para dejar los datos intactos.", + "Set to remove the data associated with this Virtual Machine (which will result in data loss if the data is not backed up). Unset to leave the data intact.": "Establecé para eliminar los datos asociados con esta máquina virtual (lo que provocará la pérdida de datos si no se realiza una copia de seguridad de los datos). Desarmar para dejar los datos intactos.", "Set to run resilver tasks between the configured times.": "Establecido para ejecutar tareas de recuperación entre los tiempos configurados.", "Set to save the temporary file from each updated file to a holding directory until the end of the transfer when all transferred files are renamed into place.": "Configure esta opción para guardar el archivo temporal de cada archivo actualizado en un directorio de retención hasta el final de la transferencia cuando todos los archivos transferidos cambien de nombre.", "Set to start this VM when the system boots.": "Configure para iniciar esta VM cuando se inicie el sistema.", "Set to store the encryption key in the TrueNAS database.": "Establecer para almacenar la clave de cifrado en la base de datos TrueNAS.", "Set to suppress informational messages from the remote server.": "Configurado para suprimir mensajes informativos del servidor remoto.", "Set to take a snapshot of the dataset before a PUSH.": "Configurado para tomar una instantánea del conjunto de datos antes de un PUSH .", - "Set to take separate snapshots of the dataset and each of its child datasets. Leave unset to take a single snapshot only of the specified dataset without child datasets.": "Establezca para tomar instantáneas separadas del conjunto de datos y cada uno de sus conjuntos de datos secundarios. Dejá sin configurar para tomar una única instantánea solo del conjunto de datos especificado sin conjuntos de datos secundarios.", - "Set to to enable support for SNMP version 3. See snmpd.conf(5) for configuration details.": "Configurado para habilitar el soporte para SNMP versión 3 . Consulte snmpd.conf (5) para obtener detalles de la configuración.", + "Set to take separate snapshots of the dataset and each of its child datasets. Leave unset to take a single snapshot only of the specified dataset without child datasets.": "Establecé para tomar instantáneas separadas del conjunto de datos y cada uno de sus conjuntos de datos secundarios. Dejá sin configurar para tomar una única instantánea solo del conjunto de datos especificado sin conjuntos de datos secundarios.", + "Set to to enable support for SNMP version 3. See snmpd.conf(5) for configuration details.": "Configurado para habilitar el soporte para SNMP versión 3 . Consultá snmpd.conf (5) para obtener detalles de la configuración.", "Set to use encryption when replicating data. Additional encryption options will appear.": "Configúrelo para usar cifrado al replicar datos. Aparecerán opciones de cifrado adicionales.", - "Set to use the Schedule in place of the Replicate Specific Snapshots time frame. The Schedule values are read over the Replicate Specific Snapshots time frame.": "Establezca para usar el Programa en lugar del Replicar instantáneas específicas. Los valores de la programación se leen durante el marco temporal Replicar instantáneas específicas.", + "Set to use the Schedule in place of the Replicate Specific Snapshots time frame. The Schedule values are read over the Replicate Specific Snapshots time frame.": "Establecé para usar el Programa en lugar del Replicar instantáneas específicas. Los valores de la programación se leen durante el marco temporal Replicar instantáneas específicas.", "Set when using Xen as the iSCSI initiator.": "Se establece cuando se usa Xen como iniciador iSCSI.", - "Set whether processes can be executed from within this dataset.": "Establezca si los procesos se pueden ejecutar desde este conjunto de datos.", + "Set whether processes can be executed from within this dataset.": "Establecé si los procesos se pueden ejecutar desde este conjunto de datos.", "Sets default Unix permissions of the user home directory. This is read-only for built-in users.": "Establece los permisos Unix predeterminados del directorio de inicio del usuario. Esto es de solo lectura para usuarios integrados.", "Sets default permissions for newly created directories.": "Establece permisos predeterminados para directorios recién creados.", "Sets default permissions for newly created files.": "Establece permisos predeterminados para archivos recién creados.", @@ -4080,7 +4080,7 @@ "Setting permissions recursively affects this directory and any others below it. This can make data inaccessible.": "Establecer permisos de forma recursiva afecta a este directorio y a cualquier otro que se encuentre debajo de él. Esto puede hacer que los datos sean inaccesibles.", "Setting permissions recursively will affect this directory and any others below it. This might make data inaccessible.": "Establecer permisos de forma recursiva afectará a este directorio y a cualquier otro que se encuentre debajo de él. Esto podría hacer que los datos sean inaccesibles.", "Setting this option changes the destination dataset to be read-only. To continue using the default or existing dataset read permissions, leave this option unset.": "Establecer esta opción cambia el conjunto de datos de destino para que sea de solo lectura. Para continuar usando los permisos de lectura del conjunto de datos predeterminado o existente, deje esta opción sin configurar.", - "Setting this option is not recommended as it breaks several security measures. Refer to mod_tls for more details.": "Configurar esta opción es no recomendado ya que rompe varias medidas de seguridad. Consulte mod_tls para obtener más detalles.", + "Setting this option is not recommended as it breaks several security measures. Refer to mod_tls for more details.": "Configurar esta opción es no recomendado ya que rompe varias medidas de seguridad. Consultá mod_tls para obtener más detalles.", "Setting this option reduces the security of the connection, so only use it if the client does not understand reused SSL sessions.": "Establecer esta opción reduce la seguridad de la conexión, por lo que solo úsela si el cliente no comprende las sesiones SSL reutilizadas.", "Setting this option will result in timeouts if identd is not running on the client.": "Establecer esta opción dará como resultado tiempos de espera si identd no se está ejecutando en el cliente.", "Settings": "Configuraciones", @@ -4195,7 +4195,7 @@ "Snapshot added successfully.": "Instantánea agregada exitosamente.", "Snapshot deleted.": "Instantánea eliminada.", "Snapshot name format string. The default is auto-%Y-%m-%d_%H-%M. Must include the strings %Y, %m, %d, %H, and %M, which are replaced with the four-digit year, month, day of month, hour, and minute as defined in strftime(3).

For example, snapshots of pool1 with a Naming Schema of customsnap-%Y%m%d.%H%M have names like pool1@customsnap-20190315.0527.": "Cadena de formato de nombre de instantánea. El valor predeterminado es auto-%Y-%m-%d_%H-%M. Debe incluir las cadenas %Y, %m, %d, %H y %M, que se reemplazan con el año de cuatro dígitos, mes, día del mes, hora y minuto como se define en strftime(3).

Por ejemplo, las instantáneas de pool1 con un esquema de nombres de customsnap-%Y%m%d.%H%M tienen nombres como pool1@customsnap-20190315.0527.", - "Snapshot schedule for this replication task. Choose from previously configured Periodic Snapshot Tasks. This replication task must have the same Recursive and Exclude Child Datasets values as the chosen periodic snapshot task. Selecting a periodic snapshot schedule removes the Schedule field.": "Programa de instantáneas para esta tarea de replicación. Elija entre Tareas periódicas de instantáneas previamente configuradas. Esta tarea de replicación debe tener los mismos valores Recursivos y Excluir conjuntos de datos secundarios que la tarea de instantánea periódica elegida. Al seleccionar una programación periódica de instantáneas, se elimina el campo Programación.", + "Snapshot schedule for this replication task. Choose from previously configured Periodic Snapshot Tasks. This replication task must have the same Recursive and Exclude Child Datasets values as the chosen periodic snapshot task. Selecting a periodic snapshot schedule removes the Schedule field.": "Programa de instantáneas para esta tarea de replicación. Elegí entre Tareas periódicas de instantáneas previamente configuradas. Esta tarea de replicación debe tener los mismos valores Recursivos y Excluir conjuntos de datos secundarios que la tarea de instantánea periódica elegida. Al seleccionar una programación periódica de instantáneas, se elimina el campo Programación.", "Snapshots": "Instantáneas", "Snapshots could not be loaded": "No se pudo cargar las instantáneas", "Snapshots must not have dependent clones": "Las instantáneas no deben tener clones dependientes", @@ -4570,7 +4570,7 @@ "These unknown processes are using the pool:": "Estos procesos desconocidos están utilizando el pool:", "Thick": "Grueso", "Third DNS server.": "Servidor DNS tercero.", - "Third-party Cloud service providers. Choose a provider to configure connection credentials.": "Terceros proveedores de servicios en la nube. Elija un proveedor para configurar las credenciales de conexión.", + "Third-party Cloud service providers. Choose a provider to configure connection credentials.": "Terceros proveedores de servicios en la nube. Elegí un proveedor para configurar las credenciales de conexión.", "This Certificate Authority is being used to sign one or more certificates. It can be deleted only after deleting these certificates.": "Esta autoridad de certificación se utiliza para firmar uno o más certificados. Solo se puede eliminar después de eliminar estos certificados.", "This Dataset": "Este conjunto de datos", "This Dataset and Child Datasets": "Este conjunto de datos y conjuntos de datos secundarios", @@ -4754,7 +4754,7 @@ "Unhealthy": "No saludable", "Unique LUN ID. The default is generated from the MAC address of the system.": "ID de LUN único. El valor predeterminado se genera a partir de la dirección MAC del sistema.", "Unique Virtual Host ID on the broadcast segment of the network. Configuring multiple Virtual IP addresses requires a separate VHID for each address.": "ID de host virtual único en el segmento de difusión de la red. La configuración de múltiples direcciones IP virtuales requiere un VHID separado para cada dirección.", - "Unique drive identifier. Log in to a Microsoft account and choose a drive from the Drives List drop-down to add a valid ID.": "Identificador único de la unidad. Inicie sesión en una cuenta de Microsoft y elija una unidad del menú desplegable Lista de unidades para agregar una ID válida.", + "Unique drive identifier. Log in to a Microsoft account and choose a drive from the Drives List drop-down to add a valid ID.": "Identificador único de la unidad. Inicie sesión en una cuenta de Microsoft y elegí una unidad del menú desplegable Lista de unidades para agregar una ID válida.", "Unique snapshot name. Cannot be used with a Naming Schema.": "Nombre único de la instantánea. No se puede usar con un Esquema de nombres .", "Unit": "Unidad", "Unix NSS Info": "Info de Unix NSS", @@ -5086,7 +5086,7 @@ "When checked, winbind will retrieve the login shell and home directory from the LDAP attributes. When not checked or when the AD LDAP entry lacks the SFU attributes the smb4.conf parameters template shell and template homedir are used.": "Cuando se marca, winbind recuperará el shell de inicio de sesión y el directorio de inicio de los atributos LDAP. Cuando no está marcada o cuando la entrada AD LDAP carece de los atributos SFU, se usan los parámetros smb4.conf template shell y template homedir.", "When not specified, guest system is given fixed amount of memory specified above.\nWhen minimum memory is specified, guest system is given memory within range between minimum and fixed as needed.": "Cuando no se especifica, al sistema invitado se le asigna una cantidad fija de memoria especificada anteriormente.\nCuando se especifica la memoria mínima, al sistema invitado se le asigna una memoria dentro del rango entre el mínimo y la fija según sea necesario.", "When number of vcpus is equal to number of cpus in CPU set vcpus can be automatically pinned into CPU set. Pinning is done by mapping each vcpu into single cpu number in following the order in CPU set. This will improve CPU cache locality and can reduce possible stutter in GPU passthrough VMs.": "Cuando la cantidad de vcpu es igual a la cantidad de CPU en el conjunto de CPU, las vcpu se pueden fijar automáticamente en el conjunto de CPU. La fijación se realiza asignando cada vcpu a un solo número de CPU siguiendo el orden en el conjunto de CPU. Esto va a mejorar la ubicación de la caché de CPU y puede reducir posibles interrupciones en la transferencia de GPU de las VM.", - "When replicated snapshots are deleted from the destination system:
Same as Source: use the configured Snapshot Lifetime value from the source dataset periodic snapshot task.
Never Delete: never delete snapshots from the destination system.
Custom: set a how long a snapshot remains on the destination system. Enter a number and choose a measure of time from the drop-down.": "Cuando las instantáneas replicadas se eliminan del sistema de destino:
Igual que la fuente: use el valor configurado Vida útil de la instantánea de la tarea de instantánea periódica del conjunto de datos de origen.
Nunca eliminar: nunca elimine instantáneas del sistema de destino.
Personalizado: establezca cuánto tiempo permanece una instantánea en el sistema de destino. Ingresá un número y elija una medida de tiempo del menú desplegable.", + "When replicated snapshots are deleted from the destination system:
Same as Source: use the configured Snapshot Lifetime value from the source dataset periodic snapshot task.
Never Delete: never delete snapshots from the destination system.
Custom: set a how long a snapshot remains on the destination system. Enter a number and choose a measure of time from the drop-down.": "Cuando las instantáneas replicadas se eliminan del sistema de destino:
Igual que la fuente: use el valor configurado Vida útil de la instantánea de la tarea de instantánea periódica del conjunto de datos de origen.
Nunca eliminar: nunca elimine instantáneas del sistema de destino.
Personalizado: establecé cuánto tiempo permanece una instantánea en el sistema de destino. Ingresá un número y elegí una medida de tiempo del menú desplegable.", "When replicated snapshots are deleted from the destination system:
  • Same as Source: use the Snapshot Lifetime from the source periodic snapshot task.
  • Custom: define a Snapshot Lifetime for the destination system.
  • None: never delete snapshots from the destination system.
  • ": "Cuando se eliminan instantáneas replicadas del sistema de destino:
    • Igual que el origen: utilizá la duración de la instantánea de la tarea de instantánea periódica de origen.
    • Personalizado: definí una duración de la instantánea para el sistema de destino.
    • Ninguno: nunca eliminar instantáneas del sistema de destino.
    • ", "When set, a local user is only allowed access to their home directory if they are a member of the wheel group.": "Cuando se establece, un usuario local solo tiene acceso a su directorio de inicio si es miembro del grupo wheel.", "When set, rsync is run recursively, preserving symlinks, permissions, modification times, group, and special files. When run as root, owner, device files, and special files are also preserved. Equivalent to passing the flags -rlptgoD to rsync.": "Cuando se establece, rsync se ejecuta de forma recursiva, conservando enlaces simbólicos, permisos, tiempos de modificación, grupos y archivos especiales. Cuando se ejecuta como root, también se conservan los archivos de propietario, dispositivo y archivos especiales. Equivalente a pasar las banderas -rlptgoD a rsync.", @@ -5318,4 +5318,4 @@ "{used} of {total} ({used_pct})": "{used} de {total} ({used_pct})", "{version} is available!": "¡{version} ya está disponible!", "{view} on {enclosure}": "{view} en {enclosure}" -} \ No newline at end of file +} From 07f824b90ec73efc1a620e534adef02f763b8420 Mon Sep 17 00:00:00 2001 From: Alex Karpov Date: Wed, 8 Jan 2025 00:49:08 +0200 Subject: [PATCH 28/32] NAS-133330: Misaligned input/placeholder (#11290) --- src/assets/styles/other/_material-overrides.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assets/styles/other/_material-overrides.scss b/src/assets/styles/other/_material-overrides.scss index 0b2ead49922..097795a197b 100644 --- a/src/assets/styles/other/_material-overrides.scss +++ b/src/assets/styles/other/_material-overrides.scss @@ -196,6 +196,7 @@ html .ix-dark { } .mat-mdc-chip-input { + min-height: 22px; padding: 0; } From 949f96abecb3cfb5e7af3699a98d976acbea8e90 Mon Sep 17 00:00:00 2001 From: Evgeny Stepanovych Date: Tue, 7 Jan 2025 18:17:50 -0500 Subject: [PATCH 29/32] NAS-133377: Add max file validation in kerberos keytabs (#11276) --- .../file-validator.service.spec.ts | 49 +++++++++++++++++++ .../file-validator/file-validator.service.ts | 37 ++++++++++++++ .../forms/ix-forms/validators/validators.ts | 43 +--------------- .../idmap-form/idmap-form.component.ts | 3 +- .../kerberos-keytabs-form.component.ts | 8 ++- 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 | 25 +++++----- 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 | 3 +- 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, 197 insertions(+), 57 deletions(-) create mode 100644 src/app/modules/forms/ix-forms/validators/file-validator/file-validator.service.spec.ts create mode 100644 src/app/modules/forms/ix-forms/validators/file-validator/file-validator.service.ts diff --git a/src/app/modules/forms/ix-forms/validators/file-validator/file-validator.service.spec.ts b/src/app/modules/forms/ix-forms/validators/file-validator/file-validator.service.spec.ts new file mode 100644 index 00000000000..8efc840432b --- /dev/null +++ b/src/app/modules/forms/ix-forms/validators/file-validator/file-validator.service.spec.ts @@ -0,0 +1,49 @@ +import { FormControl, ValidatorFn } from '@angular/forms'; +import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; +import { MiB } from 'app/constants/bytes.constant'; +import { fakeFile } from 'app/core/testing/utils/fake-file.uitls'; +import { ixManualValidateError } from 'app/modules/forms/ix-forms/components/ix-errors/ix-errors.component'; +import { FileValidatorService } from 'app/modules/forms/ix-forms/validators/file-validator/file-validator.service'; + +describe('FileValidatorService', () => { + let spectator: SpectatorService; + const maxSizeInBytes = 10 * MiB; + let validatorFn: ValidatorFn; + + const createService = createServiceFactory({ + service: FileValidatorService, + }); + beforeEach(() => { + spectator = createService(); + + validatorFn = spectator.service.maxSize(maxSizeInBytes); + }); + + it('should return null if value is null', () => { + const control = new FormControl(null as File[] | null); + expect(validatorFn(control)).toBeNull(); + }); + + it('should return null if there are no files in the array', () => { + const control = new FormControl([] as File[]); + expect(validatorFn(control)).toBeNull(); + }); + + it('should return null if all files are within size limit', () => { + const file1 = fakeFile('file1.txt', 2 * MiB); + + const control = new FormControl([file1]); + expect(validatorFn(control)).toBeNull(); + }); + + it('should return an error object if any file exceeds the size limit', () => { + const file1 = fakeFile('file1.txt', 11 * MiB); + + const control = new FormControl([file1]); + expect(validatorFn(control)).toEqual({ + [ixManualValidateError]: { + message: 'Maximum file size is limited to 10 MiB.', + }, + }); + }); +}); diff --git a/src/app/modules/forms/ix-forms/validators/file-validator/file-validator.service.ts b/src/app/modules/forms/ix-forms/validators/file-validator/file-validator.service.ts new file mode 100644 index 00000000000..121181428e9 --- /dev/null +++ b/src/app/modules/forms/ix-forms/validators/file-validator/file-validator.service.ts @@ -0,0 +1,37 @@ +import { Injectable } from '@angular/core'; +import { FormControl, ValidationErrors } from '@angular/forms'; +import { TranslateService } from '@ngx-translate/core'; +import { buildNormalizedFileSize } from 'app/helpers/file-size.utils'; +import { ixManualValidateError } from 'app/modules/forms/ix-forms/components/ix-errors/ix-errors.component'; + +@Injectable({ + providedIn: 'root', +}) +export class FileValidatorService { + constructor( + private translate: TranslateService, + ) {} + + maxSize(maxSizeInBytes: number) { + return (control: FormControl): ValidationErrors | null => { + const files = control.value; + if (!files?.length) { + return null; + } + + for (const file of files) { + if (file.size > maxSizeInBytes) { + return { + [ixManualValidateError]: { + message: this.translate.instant( + 'Maximum file size is limited to {maxSize}.', + { maxSize: buildNormalizedFileSize(maxSizeInBytes) }, + ), + }, + }; + } + } + return null; + }; + } +} diff --git a/src/app/modules/forms/ix-forms/validators/validators.ts b/src/app/modules/forms/ix-forms/validators/validators.ts index 03a464dfed5..a6c25e688a9 100644 --- a/src/app/modules/forms/ix-forms/validators/validators.ts +++ b/src/app/modules/forms/ix-forms/validators/validators.ts @@ -1,5 +1,5 @@ import { - FormControl, FormGroup, UntypedFormControl, ValidationErrors, ValidatorFn, + FormGroup, UntypedFormControl, ValidationErrors, ValidatorFn, } from '@angular/forms'; import { isEmpty, isNumber, toNumber } from 'lodash-es'; @@ -50,44 +50,3 @@ export function greaterThanFg( return null; }; } - -export function rangeValidator(min: number, max?: number): ValidatorFn { - let thisControl: FormControl; - - return function rangeValidate(control: FormControl) { - let regex; - if (min === 0) { - regex = /^(0|[1-9]\d*)$/; - } else { - regex = /^[1-9]\d*$/; - } - - if (!control.parent) { - return null; - } - - // Initializing the validator. - if (!thisControl) { - thisControl = control; - } - - if (!thisControl.value) { - return null; - } - - if (regex.test(thisControl.value)) { - const num = Number(thisControl.value); - if (num >= min) { - if (max) { - if (num <= max) { - return null; - } - } else { - return null; - } - } - } - - return { range: true, rangeValue: { min, max } }; - }; -} diff --git a/src/app/pages/directory-service/components/idmap-form/idmap-form.component.ts b/src/app/pages/directory-service/components/idmap-form/idmap-form.component.ts index 4cbbcffba12..0fdacc2bc7b 100644 --- a/src/app/pages/directory-service/components/idmap-form/idmap-form.component.ts +++ b/src/app/pages/directory-service/components/idmap-form/idmap-form.component.ts @@ -29,7 +29,8 @@ import { IxSelectComponent } from 'app/modules/forms/ix-forms/components/ix-sele import { WithManageCertificatesLinkComponent } from 'app/modules/forms/ix-forms/components/with-manage-certificates-link/with-manage-certificates-link.component'; import { FormErrorHandlerService } from 'app/modules/forms/ix-forms/services/form-error-handler.service'; import { IxValidatorsService } from 'app/modules/forms/ix-forms/services/ix-validators.service'; -import { greaterThanFg, rangeValidator } from 'app/modules/forms/ix-forms/validators/validators'; +import { rangeValidator } from 'app/modules/forms/ix-forms/validators/range-validation/range-validation'; +import { greaterThanFg } from 'app/modules/forms/ix-forms/validators/validators'; import { ModalHeaderComponent } from 'app/modules/slide-ins/components/modal-header/modal-header.component'; import { SlideInRef } from 'app/modules/slide-ins/slide-in-ref'; import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; diff --git a/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-form/kerberos-keytabs-form.component.ts b/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-form/kerberos-keytabs-form.component.ts index 51cf716a09d..fa049a4a466 100644 --- a/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-form/kerberos-keytabs-form.component.ts +++ b/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-form/kerberos-keytabs-form.component.ts @@ -7,6 +7,7 @@ import { MatCard, MatCardContent } from '@angular/material/card'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { TranslateService, TranslateModule } from '@ngx-translate/core'; import { Observable } from 'rxjs'; +import { KiB } from 'app/constants/bytes.constant'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { Role } from 'app/enums/role.enum'; import { helptextKerberosKeytabs } from 'app/helptext/directory-service/kerberos-keytabs-form-list'; @@ -16,6 +17,7 @@ import { IxFieldsetComponent } from 'app/modules/forms/ix-forms/components/ix-fi import { IxFileInputComponent } from 'app/modules/forms/ix-forms/components/ix-file-input/ix-file-input.component'; import { IxInputComponent } from 'app/modules/forms/ix-forms/components/ix-input/ix-input.component'; import { FormErrorHandlerService } from 'app/modules/forms/ix-forms/services/form-error-handler.service'; +import { FileValidatorService } from 'app/modules/forms/ix-forms/validators/file-validator/file-validator.service'; import { ModalHeaderComponent } from 'app/modules/slide-ins/components/modal-header/modal-header.component'; import { SlideInRef } from 'app/modules/slide-ins/slide-in-ref'; import { TestDirective } from 'app/modules/test-id/test.directive'; @@ -58,7 +60,10 @@ export class KerberosKeytabsFormComponent implements OnInit { form = this.formBuilder.nonNullable.group({ name: ['', Validators.required], - file: [null as File[] | null, Validators.required], + file: [null as File[] | null, Validators.compose([ + Validators.required, + this.fileValidator.maxSize(40 * KiB), + ])], }); isLoading = false; @@ -72,6 +77,7 @@ export class KerberosKeytabsFormComponent implements OnInit { private cdr: ChangeDetectorRef, private api: ApiService, public slideInRef: SlideInRef, + private fileValidator: FileValidatorService, ) { this.editingKerberosKeytab = slideInRef.getData(); } diff --git a/src/assets/i18n/af.json b/src/assets/i18n/af.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/af.json +++ b/src/assets/i18n/af.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/ar.json b/src/assets/i18n/ar.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/ar.json +++ b/src/assets/i18n/ar.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/ast.json b/src/assets/i18n/ast.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/ast.json +++ b/src/assets/i18n/ast.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/az.json b/src/assets/i18n/az.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/az.json +++ b/src/assets/i18n/az.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/be.json b/src/assets/i18n/be.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/be.json +++ b/src/assets/i18n/be.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/bg.json b/src/assets/i18n/bg.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/bg.json +++ b/src/assets/i18n/bg.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/bn.json b/src/assets/i18n/bn.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/bn.json +++ b/src/assets/i18n/bn.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/br.json b/src/assets/i18n/br.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/br.json +++ b/src/assets/i18n/br.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/bs.json b/src/assets/i18n/bs.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/bs.json +++ b/src/assets/i18n/bs.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/ca.json b/src/assets/i18n/ca.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/ca.json +++ b/src/assets/i18n/ca.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/cs.json b/src/assets/i18n/cs.json index d4a5d6dadbc..955e4dbb9e8 100644 --- a/src/assets/i18n/cs.json +++ b/src/assets/i18n/cs.json @@ -2151,6 +2151,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/cy.json b/src/assets/i18n/cy.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/cy.json +++ b/src/assets/i18n/cy.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/da.json b/src/assets/i18n/da.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/da.json +++ b/src/assets/i18n/da.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 0ad3a52fabe..62ea4e126fc 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -1927,6 +1927,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/dsb.json b/src/assets/i18n/dsb.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/dsb.json +++ b/src/assets/i18n/dsb.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/el.json b/src/assets/i18n/el.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/el.json +++ b/src/assets/i18n/el.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/en-au.json b/src/assets/i18n/en-au.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/en-au.json +++ b/src/assets/i18n/en-au.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/en-gb.json b/src/assets/i18n/en-gb.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/en-gb.json +++ b/src/assets/i18n/en-gb.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/eo.json b/src/assets/i18n/eo.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/eo.json +++ b/src/assets/i18n/eo.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/es-ar.json b/src/assets/i18n/es-ar.json index 8b7051009e2..7fc047c7d5c 100644 --- a/src/assets/i18n/es-ar.json +++ b/src/assets/i18n/es-ar.json @@ -13,11 +13,11 @@ "LUN ID": "", "LUN RPM": "", "Lan": "", - "Linux Only": "Solo Linux", "Locks": "", "MOTD": "", "Machine Time: {machineTime} \n Browser Time: {browserTime}": "", "Manage Global SED Password": "", + "Maximum file size is limited to {maxSize}.": "", "Metadata (Special) Small Block Size": "", "Method Call": "", "NVMe-oF Expansion Shelves": "", @@ -29,14 +29,11 @@ "Post Init": "", "Post Script": "", "Post-script": "", - "Power On Hours Ago": "Prendido hace horas", "Pre Init": "", "Pre Script": "", "Pre-script": "", "Pull": "", "Replication Task Write Pull": "", - "Reporting Exporter": "Informando exportador", - "Reporting Exporters": "Informando exportadores", "Root TCP Socket": "", "SAN": "", "SMB - Operation Close": "", @@ -52,15 +49,9 @@ "SMB - Vers Minor": "", "SMB Lock": "", "SMB Locks": "", - "SMB Open File": "Archivo abierto SMB", - "SSSD Compat": "Compatibilidad con SSSD", "Script": "", - "Scrub Boot Pool": "Limpiar pool de arranque", - "Search UI": "UI de búsqueda", "Serial Shell": "", "Service = \"SMB\" AND Event = \"CLOSE\"": "", - "Set to boot a debug kernel after the next system restart.": "Establecé para iniciar la depuración del núcleo después del próximo reinicio del sistema.", - "Set to restrict SSH access in certain circumstances to only members of BUILTIN\\Administrators": "Establecé para restringir el acceso SSH en determinadas circunstancias solo a los miembros de BUILTIN\\Administrators", "Sharing iSCSI Auth Read": "", "Sharing iSCSI Auth Write": "", "Sharing iSCSI Extent Read": "", @@ -84,7 +75,6 @@ "Strip ACL": "", "Stripe": "", "Table Actions of Expandable Table": "", - "The following { n, plural, one {boot environment} other {# boot environments} } will be deleted. Are you sure you want to proceed?": "{ n, plural, one {El siguiente entorno de arranque} other {Los siguientes # entornos de arranque} } { n, plural, one {se va a eliminar} other {se van a eliminar} }. ¿Estás seguro que deseás continuar?", "USB Passthrough Device": "", "Unlock Child Encrypted Roots": "", "Virtualization (Old)": "", @@ -2602,6 +2592,7 @@ "Link aggregation interface": "Interfaz de agregación de enlaces", "Linked Service": "Servicio vinculado", "Linux": "Linux", + "Linux Only": "Solo Linux", "List any existing dataset properties to remove from the replicated files.": "Enumere las propiedades del conjunto de datos existentes para eliminar de los archivos replicados.", "List of chat IDs": "Lista de ID de chat", "List of files and directories to exclude from backup.
      Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "Lista de archivos y directorios que se van a de la copia de seguridad.
      Separá las entradas presionando Enter. Consultá patrones de exclusión de restic para obtener más detalles sobre la opción --exclude.", @@ -3334,6 +3325,7 @@ "Power Mode": "Modo de energía", "Power Off": "Apagar", "Power Off UPS": "Apagar UPS", + "Power On Hours Ago": "Prendido hace horas", "Power Outage": "Corte de energía", "Power Supply": "Fuente de alimentación", "Predefined certificate extensions. Choose a profile that best matches your certificate usage scenario.": "Extensiones de certificado predefinidas. Elegí el perfil que mejor se adapte a tu escenario de uso de certificado.", @@ -3553,6 +3545,8 @@ "Report if drive temperature is at or above this temperature in Celsius. 0 disables the report.": "Informa si la temperatura de la unidad es igual o superior a esta temperatura en grados Celsius. 0 deshabilita el informe.", "Report if the temperature of a drive has changed by this many degrees Celsius since the last report. 0 disables the report.": "Informa si la temperatura de una unidad ha cambiado tantos grados Celsius desde el último informe. 0 deshabilita el informe.", "Reporting": "Informes", + "Reporting Exporter": "Informando exportador", + "Reporting Exporters": "Informando exportadores", "Reporting Read": "Informe de lectura", "Reporting Write": "Informe de escritura", "Reports": "Informes", @@ -3712,6 +3706,7 @@ "SMB Name": "Nombre SMB", "SMB Notification": "Notificación SMB", "SMB Notifications": "Notificaciones SMB", + "SMB Open File": "Archivo abierto SMB", "SMB Service": "Servicio SMB", "SMB Session": "Sesión SMB", "SMB Sessions": "Sesiones SMB", @@ -3754,6 +3749,7 @@ "SSL Certificate": "Certificado SSL", "SSL Protocols": "Protocolos SSL", "SSL Web Interface Port": "Puerto de interfaz web SSL", + "SSSD Compat": "Compatibilidad con SSSD", "SYNC": "SINCRONIZAR", "Samba": "Samba", "Samba Authentication": "Autenticación Samba", @@ -3795,6 +3791,7 @@ "Script to execute before running sync.": "Script para ejecutar antes del inicio de la sincronización.", "Scroll to top": "Desplazar hacia arriba", "Scrub": "Limpiar", + "Scrub Boot Pool": "Limpiar pool de arranque", "Scrub In Progress:": "Limpieza en proceso:", "Scrub Paused": "Limpieza en pausa", "Scrub Pool": "Limpiar pool", @@ -3809,6 +3806,7 @@ "Search Images": "Buscar imágenes", "Search Input Fields": "Buscar campos de entrada", "Search Results for «{query}»": "Resultados de búsqueda para «{query}»", + "Search UI": "UI de búsqueda", "Search or enter value": "Buscar o ingresar valor", "Secondary Contact": "Contacto secundario", "Secondary DNS server.": "Servidor DNS secundario.", @@ -4026,6 +4024,7 @@ "Set to attempt to reduce latency over slow networks.": "Configurado para intentar reducir la latencia en redes lentas.", "Set to automatically configure the IPv6. Only one interface can be configured this way.": "Configurar automáticamente IPv6. Solo se puede configurar una interfaz de esta manera.", "Set to automatically create the defined Remote Path if it does not exist.": "Configure para crear automáticamente la Ruta remota definida si no existe.", + "Set to boot a debug kernel after the next system restart.": "Establecé para iniciar la depuración del núcleo después del próximo reinicio del sistema.", "Set to create a new primary group with the same name as the user. Unset to select an existing group for the user.": "Establecé para crear un nuevo grupo primario con el mismo nombre que el usuario. Desarmar para seleccionar un grupo existente para el usuario.", "Set to determine if the system participates in a browser election. Leave unset when the network contains an AD or LDAP server, or when Vista or Windows 7 machines are present.": "Establecé para determinar si el sistema participa en una elección de navegador. Dejá sin configurar cuando la red contiene un servidor AD o LDAP, o cuando halla máquinas con Vista o Windows 7.", "Set to display image upload options.": "Configurar para mostrar las opciones de carga de imágenes.", @@ -4060,6 +4059,7 @@ "Set to reduce the size of data to transmit. Recommended for slow connections.": "Establecer para reducir el tamaño de los datos a transmitir. Recomendado para conexiones lentas.", "Set to remove all ACLs from the current dataset. ACLs are also recursively stripped from directories and child datasets when those options are set.": "Establecer para eliminar todas las ACL del conjunto de datos actual. Las ACL también se eliminan recursivamente de directorios y conjuntos de datos secundarios cuando se establecen esas opciones.", "Set to remove the data associated with this Virtual Machine (which will result in data loss if the data is not backed up). Unset to leave the data intact.": "Establecé para eliminar los datos asociados con esta máquina virtual (lo que provocará la pérdida de datos si no se realiza una copia de seguridad de los datos). Desarmar para dejar los datos intactos.", + "Set to restrict SSH access in certain circumstances to only members of BUILTIN\\Administrators": "Establecé para restringir el acceso SSH en determinadas circunstancias solo a los miembros de BUILTIN\\Administrators", "Set to run resilver tasks between the configured times.": "Establecido para ejecutar tareas de recuperación entre los tiempos configurados.", "Set to save the temporary file from each updated file to a holding directory until the end of the transfer when all transferred files are renamed into place.": "Configure esta opción para guardar el archivo temporal de cada archivo actualizado en un directorio de retención hasta el final de la transferencia cuando todos los archivos transferidos cambien de nombre.", "Set to start this VM when the system boots.": "Configure para iniciar esta VM cuando se inicie el sistema.", @@ -4494,6 +4494,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.": "Los siguientes discos tienen pools exportados en ellos.\n El uso de esos discos va a hacer que los pools existentes en ellos no se puedan importar.\n Vas a perder todos los datos en los discos seleccionados.", "The following issues were already reported.": "Ya se informaron los siguientes problemas.", "The following { n, plural, one {application} other {# applications} } will be upgraded. Are you sure you want to proceed?": "Se van a actualizar las siguientes { n, plural, one {application} other {# applications} }. ¿Estás seguro de que deseás continuar?", + "The following { n, plural, one {boot environment} other {# boot environments} } will be deleted. Are you sure you want to proceed?": "{ n, plural, one {El siguiente entorno de arranque} other {Los siguientes # entornos de arranque} } { n, plural, one {se va a eliminar} other {se van a eliminar} }. ¿Estás seguro que deseás continuar?", "The following { n, plural, one {docker image} other {# docker images} } will be deleted. Are you sure you want to proceed?": "Se van a eliminar los siguientes { n, plural, one {docker image} other {# docker images} }. ¿Estás seguro de que deseás continuar?", "The following { n, plural, one {snapshot} other {# snapshots} } will be deleted. Are you sure you want to proceed?": "Las siguientes { n, plural, one {snapshot} other {# snapshots} } se van a eliminar. ¿Está seguro de que deseás continuar?", "The friendly name to show in front of the sending email address. Example: Storage System 01<it@example.com>": "El nombre descriptivo que se muestra delante de la dirección de correo electrónico de envío. Ejemplo: Sistema de almacenamiento 01<it@example.com>", @@ -5318,4 +5319,4 @@ "{used} of {total} ({used_pct})": "{used} de {total} ({used_pct})", "{version} is available!": "¡{version} ya está disponible!", "{view} on {enclosure}": "{view} en {enclosure}" -} +} \ No newline at end of file diff --git a/src/assets/i18n/es-co.json b/src/assets/i18n/es-co.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/es-co.json +++ b/src/assets/i18n/es-co.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/es-mx.json b/src/assets/i18n/es-mx.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/es-mx.json +++ b/src/assets/i18n/es-mx.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/es-ni.json b/src/assets/i18n/es-ni.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/es-ni.json +++ b/src/assets/i18n/es-ni.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/es-ve.json b/src/assets/i18n/es-ve.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/es-ve.json +++ b/src/assets/i18n/es-ve.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index ef05d0317c5..e1841a381db 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -2411,6 +2411,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/et.json b/src/assets/i18n/et.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/et.json +++ b/src/assets/i18n/et.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/eu.json b/src/assets/i18n/eu.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/eu.json +++ b/src/assets/i18n/eu.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/fa.json b/src/assets/i18n/fa.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/fa.json +++ b/src/assets/i18n/fa.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/fi.json b/src/assets/i18n/fi.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/fi.json +++ b/src/assets/i18n/fi.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index 2bd7d1174c7..7def522c597 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -396,6 +396,7 @@ "Masquerade Address": "", "Maximize Dispersal": "", "Maximum Passive Port": "", + "Maximum file size is limited to {maxSize}.": "", "Mega": "", "Memory usage of app": "", "Message": "", @@ -5318,4 +5319,4 @@ "{used} of {total} ({used_pct})": "{used} de {total} ({used_pct})", "{version} is available!": "{version} est disponible !", "{view} on {enclosure}": "{view} sur {enclosure}" -} +} \ No newline at end of file diff --git a/src/assets/i18n/fy.json b/src/assets/i18n/fy.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/fy.json +++ b/src/assets/i18n/fy.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/ga.json b/src/assets/i18n/ga.json index bc32b31c88e..2b363159183 100644 --- a/src/assets/i18n/ga.json +++ b/src/assets/i18n/ga.json @@ -203,6 +203,7 @@ "Maintenance Window": "", "Max Concurrent Calls": "", "Max concurrent calls limit reached.\n There are more than 20 calls queued.\n See queued calls in the browser's console logs": "", + "Maximum file size is limited to {maxSize}.": "", "Memory usage of app": "", "MiB": "", "Modern OS: Extent block size 4k, TPC enabled, no Xen compat mode, SSD speed": "", diff --git a/src/assets/i18n/gd.json b/src/assets/i18n/gd.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/gd.json +++ b/src/assets/i18n/gd.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/gl.json b/src/assets/i18n/gl.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/gl.json +++ b/src/assets/i18n/gl.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/he.json b/src/assets/i18n/he.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/he.json +++ b/src/assets/i18n/he.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/hi.json b/src/assets/i18n/hi.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/hi.json +++ b/src/assets/i18n/hi.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/hr.json b/src/assets/i18n/hr.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/hr.json +++ b/src/assets/i18n/hr.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/hsb.json b/src/assets/i18n/hsb.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/hsb.json +++ b/src/assets/i18n/hsb.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/hu.json b/src/assets/i18n/hu.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/hu.json +++ b/src/assets/i18n/hu.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/ia.json b/src/assets/i18n/ia.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/ia.json +++ b/src/assets/i18n/ia.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/id.json b/src/assets/i18n/id.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/id.json +++ b/src/assets/i18n/id.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/io.json b/src/assets/i18n/io.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/io.json +++ b/src/assets/i18n/io.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/is.json b/src/assets/i18n/is.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/is.json +++ b/src/assets/i18n/is.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/it.json b/src/assets/i18n/it.json index f6d355a9b58..a4c9d8854f8 100644 --- a/src/assets/i18n/it.json +++ b/src/assets/i18n/it.json @@ -2478,6 +2478,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/ja.json b/src/assets/i18n/ja.json index 370d01804c3..9f7a1ad615e 100644 --- a/src/assets/i18n/ja.json +++ b/src/assets/i18n/ja.json @@ -2367,6 +2367,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/ka.json b/src/assets/i18n/ka.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/ka.json +++ b/src/assets/i18n/ka.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/kk.json b/src/assets/i18n/kk.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/kk.json +++ b/src/assets/i18n/kk.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/km.json b/src/assets/i18n/km.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/km.json +++ b/src/assets/i18n/km.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/kn.json b/src/assets/i18n/kn.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/kn.json +++ b/src/assets/i18n/kn.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index 46bbb24e202..0f5b8b85154 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -1,5 +1,6 @@ { "": "", + "Maximum file size is limited to {maxSize}.": "", "Prune By": "", "Pull Image": "", "Pulling...": "", diff --git a/src/assets/i18n/lb.json b/src/assets/i18n/lb.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/lb.json +++ b/src/assets/i18n/lb.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/lt.json b/src/assets/i18n/lt.json index 20c89bcde68..803ba15f603 100644 --- a/src/assets/i18n/lt.json +++ b/src/assets/i18n/lt.json @@ -2659,6 +2659,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/lv.json b/src/assets/i18n/lv.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/lv.json +++ b/src/assets/i18n/lv.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/mk.json b/src/assets/i18n/mk.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/mk.json +++ b/src/assets/i18n/mk.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/ml.json b/src/assets/i18n/ml.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/ml.json +++ b/src/assets/i18n/ml.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/mn.json b/src/assets/i18n/mn.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/mn.json +++ b/src/assets/i18n/mn.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/mr.json b/src/assets/i18n/mr.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/mr.json +++ b/src/assets/i18n/mr.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/my.json b/src/assets/i18n/my.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/my.json +++ b/src/assets/i18n/my.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/nb.json b/src/assets/i18n/nb.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/nb.json +++ b/src/assets/i18n/nb.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/ne.json b/src/assets/i18n/ne.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/ne.json +++ b/src/assets/i18n/ne.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/nl.json b/src/assets/i18n/nl.json index d23d1c2c2d9..13280614e43 100644 --- a/src/assets/i18n/nl.json +++ b/src/assets/i18n/nl.json @@ -8,6 +8,7 @@ "Do not connect to a fibre channel port": "", "Existing Ports": "", "Linux Only": "", + "Maximum file size is limited to {maxSize}.": "", "New Cloud Credential": "", "Protocol Options": "", "Use an existing port": "", diff --git a/src/assets/i18n/nn.json b/src/assets/i18n/nn.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/nn.json +++ b/src/assets/i18n/nn.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/os.json b/src/assets/i18n/os.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/os.json +++ b/src/assets/i18n/os.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/pa.json b/src/assets/i18n/pa.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/pa.json +++ b/src/assets/i18n/pa.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/pl.json b/src/assets/i18n/pl.json index dffc179f7dd..daf9e6f52f2 100644 --- a/src/assets/i18n/pl.json +++ b/src/assets/i18n/pl.json @@ -2611,6 +2611,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/pt-br.json b/src/assets/i18n/pt-br.json index f3562ad50cd..6f4f652c439 100644 --- a/src/assets/i18n/pt-br.json +++ b/src/assets/i18n/pt-br.json @@ -2606,6 +2606,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/pt.json b/src/assets/i18n/pt.json index e15aaa566c4..698f58f35d7 100644 --- a/src/assets/i18n/pt.json +++ b/src/assets/i18n/pt.json @@ -1530,6 +1530,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/ro.json b/src/assets/i18n/ro.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/ro.json +++ b/src/assets/i18n/ro.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/ru.json b/src/assets/i18n/ru.json index 74643729e91..02c5e847cb5 100644 --- a/src/assets/i18n/ru.json +++ b/src/assets/i18n/ru.json @@ -1661,6 +1661,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/sk.json b/src/assets/i18n/sk.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/sk.json +++ b/src/assets/i18n/sk.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/sl.json b/src/assets/i18n/sl.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/sl.json +++ b/src/assets/i18n/sl.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/sq.json b/src/assets/i18n/sq.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/sq.json +++ b/src/assets/i18n/sq.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/sr-latn.json b/src/assets/i18n/sr-latn.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/sr-latn.json +++ b/src/assets/i18n/sr-latn.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/sr.json b/src/assets/i18n/sr.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/sr.json +++ b/src/assets/i18n/sr.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/strings.json b/src/assets/i18n/strings.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/strings.json +++ b/src/assets/i18n/strings.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/sv.json b/src/assets/i18n/sv.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/sv.json +++ b/src/assets/i18n/sv.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/sw.json b/src/assets/i18n/sw.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/sw.json +++ b/src/assets/i18n/sw.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/ta.json b/src/assets/i18n/ta.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/ta.json +++ b/src/assets/i18n/ta.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/te.json b/src/assets/i18n/te.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/te.json +++ b/src/assets/i18n/te.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/th.json b/src/assets/i18n/th.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/th.json +++ b/src/assets/i18n/th.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/tr.json +++ b/src/assets/i18n/tr.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/tt.json b/src/assets/i18n/tt.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/tt.json +++ b/src/assets/i18n/tt.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/udm.json b/src/assets/i18n/udm.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/udm.json +++ b/src/assets/i18n/udm.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/uk.json b/src/assets/i18n/uk.json index 78a6895e17a..30fb85ac481 100644 --- a/src/assets/i18n/uk.json +++ b/src/assets/i18n/uk.json @@ -1071,6 +1071,7 @@ "Max concurrent calls limit reached.\n There are more than 20 calls queued.\n See queued calls in the browser's console logs": "", "Maximize Dispersal": "", "Maximum Passive Port": "", + "Maximum file size is limited to {maxSize}.": "", "Mega": "", "Memory Stats": "", "Memory Utilization": "", diff --git a/src/assets/i18n/vi.json b/src/assets/i18n/vi.json index f892bac8c7e..eb44599e54b 100644 --- a/src/assets/i18n/vi.json +++ b/src/assets/i18n/vi.json @@ -2665,6 +2665,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", diff --git a/src/assets/i18n/zh-hans.json b/src/assets/i18n/zh-hans.json index fcf5f78c356..0d9fee6e84d 100644 --- a/src/assets/i18n/zh-hans.json +++ b/src/assets/i18n/zh-hans.json @@ -4,6 +4,7 @@ "Any OS": "", "Both": "", "Linux Only": "", + "Maximum file size is limited to {maxSize}.": "", "Virtualization (Old)": "", "Virtualization Method": "", "{n, plural, one {Pool in Enclosure} other {Pools in Enclosure} }": "", diff --git a/src/assets/i18n/zh-hant.json b/src/assets/i18n/zh-hant.json index 1f50f2a1cc2..0e70b91cd1b 100644 --- a/src/assets/i18n/zh-hant.json +++ b/src/assets/i18n/zh-hant.json @@ -1681,6 +1681,7 @@ "Maximum Passive Port": "", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "", "Maximum Upload Parts": "", + "Maximum file size is limited to {maxSize}.": "", "Maximum number of replication tasks being executed simultaneously.": "", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "", From 6b3ddd3b1dfbeed451d0be5f05d196b92a599c50 Mon Sep 17 00:00:00 2001 From: Lee Jihaeng <75159489+SejoWuigui@users.noreply.github.com> Date: Wed, 8 Jan 2025 18:19:05 +0900 Subject: [PATCH 30/32] Update ko.json (#11306) --- src/assets/i18n/ko.json | 322 ++++++++++++++++++++-------------------- 1 file changed, 161 insertions(+), 161 deletions(-) diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index 0f5b8b85154..078abe0c99c 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -1,12 +1,12 @@ { "": "", - "Maximum file size is limited to {maxSize}.": "", - "Prune By": "", - "Pull Image": "", - "Pulling...": "", - "Quiet": "", - "Tail Lines": "", - "\n It looks like your session has been inactive for more than {lifetime} seconds.
      \n For security reasons we will log you out at {time}.\n ": "세션의 비활성화 시간이 {lifetime}초를 넘었습니다.
      보안을 위해 {time}에 로그아웃 되었습니다.", + "Maximum file size is limited to {maxSize}.": "최대 파일 크기는 {maxSize} 입니다.", + "Prune By": "정리:", + "Pull Image": "이미지 내려받기", + "Pulling...": "내려받는 중...", + "Quiet": "조용히", + "Tail Lines": "셸에 표시할 마지막 줄 수", + "\n It looks like your session has been inactive for more than {lifetime} seconds.
      \n For security reasons we will log you out at {time}.\n ": "세션의 비활성화 시간이 {lifetime}초를 넘었습니다.
      보안을 위해 {time}에 로그아웃 되었습니다.", " Est. Usable Raw Capacity": " 사용 가능한 원시 용량 추정", " When the UPS Mode is set to slave. Enter the open network port number of the UPS Master system. The default port is 3493.": " UPS 모드슬레이브일 때, 마스터 UPS 시스템의 네트워크 포트 번호를 입력합니다. 기본 포트는 3493입니다.", " as of {dateTime}": " ({dateTime} 기준)", @@ -24,7 +24,7 @@ "(This Controller)": "(이 컨트롤러)", "(TrueNAS Controller 1)": "(TrueNAS 컨트롤러 1)", "(TrueNAS Controller 2)": "(TrueNAS 컨트롤러 2)", - "({n, plural, =1 {# widget} other {# widgets}})": "{n}위젯", + "({n, plural, =1 {# widget} other {# widgets}})": "(위젯 {n}개)", "+ Add a backup credential": "+ 백업 자격증명 추가", "...": "...", "... Make sure the TrueNAS system is powered on and connected to the network.": "... TrueNAS 시스템이 켜져있고, 네트워크에 연결되었는지 확인하십시오.", @@ -40,7 +40,7 @@ "20 characters is the maximum length.": "최대 길이는 20자 입니다.", "2FA": "2단계 인증", "2FA Settings": "2단계 인증 설정", - "2FA has been configured for this account. Enter the OTP to continue.": "이 계정에 2단계 인증이 설정되었습니다. OTP를 입력해 계속합니다.", + "2FA has been configured for this account. Enter the OTP to continue.": "이 계정에 2단계 인증을 설정했습니다. OTP를 입력해 계속합니다.", "3 days ago": "3일 전", "3 months ago": "3개월 전", "3 weeks ago": "3주 전", @@ -50,60 +50,60 @@ "5 months ago": "4개월 전", "6 months": "6개월", "6 months ago": "6개월 전", - "S3 API endpoint URL. When using AWS, the endpoint field can be empty to use the default endpoint for the region, and available buckets are automatically fetched. Refer to the AWS Documentation for a list of Simple Storage Service Website Endpoints.": "S3 API 엔드포인트 URL입니다. AWS를 사용하는 경우 엔드포인트 값을 비워두면 해당 지역의 기본 엔드포인트를 사용하고, 사용 가능한 버킷은 자동으로 가져옵니다. AWS 문서를 통해 심플 스토리지 서비스 웹사이트 엔드포인트 목록을 참고하십시오.", - "AWS resources in a geographic area. Leave empty to automatically detect the correct public region for the bucket. Entering a private region name allows interacting with Amazon buckets created in that region. For example, enter us-gov-east-1 to discover buckets created in the eastern AWS GovCloud region.": "지리적 영역의 AWS 리소스입니다. 버킷의 올바른 공용 리전을 자동으로 감지하려면 비워두십시오. 개인 리전 이름을 입력하면 해당 리전에서 생성된 Amazon 버킷과 상호 작용할 수 있습니다. 예를 들어, 동쪽의 AWS GovCloud 리전에서 생성된 버킷을 찾으려면 us-gov-east-1을(를) 입력합니다.", - "Microsoft Azure account name.": "Microsoft Azure 계정 이름입니다.", - "pCloud Access Token. These tokens can expire and require extension.": "pCloud 접근 토큰입니다. 이러한 토큰은 만료될 수 있으며 연장이 필요할 수 있습니다.", - "Authentication protocol used to authenticate messages sent on behalf of the specified Username.": "사용자 이름을 대표하여 보낸 메시지를 인증하기 위해 사용되는 인증 프로토콜입니다.", - "Encryption protocol used to encrypt messages sent on behalf of the specified Username.": "사용자 이름을 대표하여 보낸 메시지를 암호화하기 위해 사용되는 암호화 프로토콜입니다.", - "Extended attributes are preserved, but must be supported by both systems.": "확장 속성은 보존되지만 두 시스템에서 모두 지원되어야 합니다.", - " TrueNAS Forums - Find answers from other users in the forums.": "TrueNAS Forums - 다른 사용자들이 올린 질문과 답변을 찾아보십시오.", + "S3 API endpoint URL. When using AWS, the endpoint field can be empty to use the default endpoint for the region, and available buckets are automatically fetched. Refer to the AWS Documentation for a list of Simple Storage Service Website Endpoints.": "S3 API 엔드포인트 URL입니다. AWS를 사용하는 경우 엔드포인트 값을 비워두면 해당 지역의 기본 엔드포인트를 사용하고, 사용 가능한 버킷은 자동으로 가져옵니다. AWS 문서의 심플 스토리지 서비스 웹사이트 엔드포인트 목록을 참고하십시오.", + "AWS resources in a geographic area. Leave empty to automatically detect the correct public region for the bucket. Entering a private region name allows interacting with Amazon buckets created in that region. For example, enter us-gov-east-1 to discover buckets created in the eastern AWS GovCloud region.": "지리적 영역의 AWS 리소스입니다. 버킷의 올바른 공용 리전을 자동으로 감지하려면 비워두십시오. 개인 리전 이름을 입력하면 해당 리전에서 생성된 Amazon 버킷과 상호 작용할 수 있습니다. 예를 들어, 동쪽의 AWS GovCloud 리전에서 생성된 버킷을 찾으려면 us-gov-east-1을(를) 입력합니다.", + "Microsoft Azure account name.": "Microsoft Azure 계정 이름입니다.", + "pCloud Access Token. These tokens can expire and require extension.": "pCloud 접근 토큰입니다. 이러한 토큰은 만료될 수 있으며 연장이 필요할 수 있습니다.", + "Authentication protocol used to authenticate messages sent on behalf of the specified Username.": "지정한 사용자 이름을 대신하여 보낸 메시지를 인증하기 위해 사용할 인증 프로토콜입니다.", + "Encryption protocol used to encrypt messages sent on behalf of the specified Username.": "지정한 사용자 이름을 대신하여 보낸 메시지를 암호화하기 위해 사용할 암호화 프로토콜입니다.", + "Extended attributes are preserved, but must be supported by both systems.": "확장 속성은 보존되지만 양 시스템에서 모두 지원해야 합니다.", + " TrueNAS Forums - Find answers from other users in the forums.": "TrueNAS 포럼 - 다른 사용자들이 포럼에 올린 답변을 찾아보십시오.", "MEGA account password.": "MEGA 계정 비밀번호입니다.", "MEGA account username.": "MEGA 계정 사용자 이름입니다.", - "(rclone documentation).": "(rclone documentation).", - "Transport Protocol for the remote system log server connection. Choosing Transport Layer Security (TLS) also requires selecting a preconfigured system Certificate.": "원격 시스템 로그 서버 연결을 위한 전송 프로토콜입니다. 전송 계층 보안(TLS)을 선택하면 미리 구성된 시스템 인증서를 선택해야 합니다.", - "Backblaze B2 Application Key. To generate a new application key, log in to the Backblaze account, go to the App Keys page, and add a new application key. Copy the applicationKey string to this field.": "Backblaze B2 애플리케이션 키입니다. 새로운 애플리케이션 키를 생성하려면 Backblaze 계정에 로그인한 후 App Keys 페이지로 이동하여 새로운 애플리케이션 키를 추가하십시오. 그리고 applicationKey 문자열을 이 필드에 복사해 넣으십시오.", + "(rclone documentation).": "(Rclone 문서).", + "Transport Protocol for the remote system log server connection. Choosing Transport Layer Security (TLS) also requires selecting a preconfigured system Certificate.": "원격 시스템 기록 서버 연결을 위한 전송 프로토콜입니다. 전송 계층 보안(TLS)을 선택하면 미리 구성된 시스템 인증서를 선택해야 합니다.", + "Backblaze B2 Application Key. To generate a new application key, log in to the Backblaze account, go to the App Keys page, and add a new application key. Copy the applicationKey string to this field.": "Backblaze B2 애플리케이션 키입니다. 새로운 애플리케이션 키를 생성하려면 Backblaze 계정에 로그인한 후 App Keys 페이지로 이동하여 새로운 애플리케이션 키를 추가합니다. 그리고 applicationKey 문자열을 이 필드에 복사해 넣습니다.", "Email encryption type. Choices are Plain (No Encryption), SSL (Implicit TLS), or TLS (STARTTLS).": "이메일 암호화 유형입니다. 선택할 수 있는 옵션은 평문 (암호화 없음), SSL (암묵적 TLS), 또는 TLS (STARTTLS)입니다.", - " TrueNAS Licensing - Learn more about enterprise-grade support.": "TrueNAS Licensing - 기업 수준의 지원에 대해 더 알아보십시오.", - " TrueNAS Documentation Hub - Read and contribute to the open-source documentation.": "TrueNAS Documentation Hub - 오픈소스 문서를 읽고 기여하십시오.", - "COPY: Files from the source are copied to the destination. If files with the same names are present on the destination, they are overwritten.": "COPY: 원본 파일이 대상에 복사됩니다. 대상에 이미 동일한 이름의 파일이 있는 경우, 해당 파일들이 덮어씌워집니다.", - "Copy & Paste
      \n Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+C and Command+V. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.

      \n Kill Process
      \n Kill process shortcut is Ctrl+C.": "복사 & 붙여넣기
      \n 셸에서는 컨텍스트 메뉴의 복사 및 붙여넣기 작업이 비활성화되어 있습니다. Mac의 복사 및 붙여넣기 단축키는 Command+CCommand+V입니다. 대부분의 운영체제에서는 Ctrl+Insert를 사용하여 복사하고 Shift+Insert를 사용하여 붙여넣을 수 있습니다.

      \n 프로세스 종료
      \n 프로세스 종료의 단축키는 Ctrl+C입니다.", - "MOVE: After files are copied from the source to the destination, they are deleted from the source. Files with the same names on the destination are overwritten.": "MOVE: 원본 파일이 대상으로 복사된 후, 원본에서는 해당 파일이 삭제됩니다. 대상에 이미 동일한 이름의 파일이 있는 경우, 해당 파일들이 덮어씌워집니다.", - "SET will changes all destination datasets to readonly=on after finishing the replication.
      REQUIRE stops replication unless all existing destination datasets to have the property readonly=on.
      IGNORE disables checking the readonly property during replication.": "SET은 복제 작업이 완료된 후 대상 데이터셋의 모든 속성을 readonly=on으로 변경합니다.
      REQUIRE은 대상 데이터셋의 모든 속성이 readonly=on으로 설정되어 있지 않으면 복제를 중지합니다.
      IGNORE는 복제 중에 readonly 속성을 확인하지 않도록 설정합니다.", - "SYNC: Files on the destination are changed to match those on the source. If a file does not exist on the source, it is also deleted from the destination.": "SYNC: 대상에 있는 파일들이 원본과 일치하도록 변경됩니다. 원본에 존재하지 않는 파일은 대상에서도 삭제됩니다.", - "WARNING: Rolling the dataset back destroys data on the dataset and can destroy additional snapshots that are related to the dataset. This can result in permanent data loss! Do not roll back until all desired data and snapshots are backed up.": "위험: 데이터셋을 되돌리면 포함된 데이터는 물론 관련된 스냅샷도 파기될 수 있습니다. 데이터는 영구히 손실됩니다! 필요한 데이터와 스냅샷을 백업하기 전에는 되돌리기를 수행하지 마십시오.", + " TrueNAS Licensing - Learn more about enterprise-grade support.": "TrueNAS 사용권 - 기업 수준의 지원에 대해 더 알아보십시오.", + " TrueNAS Documentation Hub - Read and contribute to the open-source documentation.": "TrueNAS 문서 허브 - 오픈소스 문서를 읽고 기여하십시오.", + "COPY: Files from the source are copied to the destination. If files with the same names are present on the destination, they are overwritten.": "복사: 원본 파일을 대상으로 복사합니다. 대상에 이미 동일한 이름의 파일이 있는 경우, 해당 파일은 덮어씌워집니다.", + "Copy & Paste
      \n Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+C and Command+V. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.

      \n Kill Process
      \n Kill process shortcut is Ctrl+C.": "복사 & 붙여넣기
      \n 셸에서는 상황에 맞는 메뉴의 복사와 붙여넣기 작업이 비활성화되어 있습니다. Mac의 복사와 붙여넣기 단축키는 Command+CCommand+V입니다. 대부분의 운영체제에서는 Ctrl+Insert를 사용하여 복사하고 Shift+Insert를 사용하여 붙여넣을 수 있습니다.

      \n 프로세스 종료
      \n 프로세스 종료의 단축키는 Ctrl+C입니다.", + "MOVE: After files are copied from the source to the destination, they are deleted from the source. Files with the same names on the destination are overwritten.": "이동: 원본 파일을 대상으로 복사한 후, 원본에서는 해당 파일을 삭제합니다. 대상에 이미 동일한 이름의 파일이 있는 경우, 해당 파일은 덮어씌워집니다.", + "SET will changes all destination datasets to readonly=on after finishing the replication.
      REQUIRE stops replication unless all existing destination datasets to have the property readonly=on.
      IGNORE disables checking the readonly property during replication.": "설정은 복제 작업을 완료한 후 모든 도착지 데이터셋을 readonly=on으로 변경합니다.
      필수는 모든 기존 도착지 데이터셋에 readonly=on 속성이 없으면 복제를 중단합니다.
      무시는 복제 중에 readonly 속성을 확인하지 않습니다.", + "SYNC: Files on the destination are changed to match those on the source. If a file does not exist on the source, it is also deleted from the destination.": "동기화: 도착지에 있는 파일들을 원본과 일치하도록 변경합니다. 원본에 존재하지 않는 파일은 도착지에서도 삭제합니다.", + "WARNING: Rolling the dataset back destroys data on the dataset and can destroy additional snapshots that are related to the dataset. This can result in permanent data loss! Do not roll back until all desired data and snapshots are backed up.": "위험: 데이터셋을 되돌리면 포함된 데이터는 물론, 관련된 스냅샷도 파기될 수 있습니다. 데이터는 영구히 손실됩니다! 필요한 데이터와 스냅샷을 백업하기 전에는 되돌리기를 수행하지 마십시오.", "WARNING: The configuration file contains sensitive data like system passwords. However, SSH keys that are stored in /root/.ssh are NOT backed up by this operation. Additional sensitive information can be included in the configuration file.
      ": "위험: 구성 파일에는 시스템 비밀번호와 같은 민감한 데이터가 포함되어 있습니다. 그러나 /root/.ssh에 저장된 SSH 키는 이 작업에 의해 백업되지 않습니다. 구성 파일에 추가적인 민감한 정보가 포함될 수 있습니다.
      ", "Warning: The WireGuard service must be active on the client system to access the TrueCommand UI.": "위험: 클라이언트 시스템에서 WireGuard 서비스를 활성화해야 TrueCommand UI에 접속할 수 있습니다.", - "0 disables quotas. Specify a maximum allowed space for this dataset.": "0은 할당량을 비활성화합니다. 이 데이터셋에 대한 최대 허용 공간을 지정하십시오.", - "0 is unlimited. A specified value applies to both this dataset and any child datasets.": "0은 무제한입니다. 지정된 값은 이 데이터셋과 해당 데이터셋의 자식 데이터셋에 모두 적용됩니다.", - "0 is unlimited. Reserve additional space for datasets containing logs which could take up all available free space.": "0은 무제한입니다. 로그를 포함한 데이터셋에 추가 공간을 예약하여 모든 가능한 여유 공간을 차지할 수 있습니다.", - "AHCI emulates an AHCI hard disk for best software compatibility. VirtIO uses paravirtualized drivers and can provide better performance, but requires the operating system installed in the VM to support VirtIO disk devices.": "AHCI는 소프트웨어 호환성을 위해 AHCI 하드 디스크를 에뮬레이트합니다. VirtIO는 가상화된 드라이버를 사용하며 더 나은 성능을 제공할 수 있지만, 가상머신에 설치된 운영체제가 VirtIO 디스크 장치를 지원해야 합니다.", - "AHCI emulates an AHCI hard disk for better software compatibility. VirtIO uses paravirtualized drivers and can provide better performance, but requires the operating system installed in the VM to support VirtIO disk devices.": "AHCI는 소프트웨어 호환성을 위해 AHCI 하드 디스크를 에뮬레이트합니다. VirtIO는 가상화된 드라이버를 사용하며 더 나은 성능을 제공할 수 있지만, 가상머신에 설치된 운영체제가 VirtIO 디스크 장치를 지원해야 합니다.", - "Certificate Signing Requests control when an external CA will issue (sign) the certificate. Typically used with ACME or other CAs that most popular browsers trust by default Import Certificate Signing Request lets you import an existing CSR onto the system. Typically used with ACME or internal CAs.": "인증서 서명 요청(Certificate Signing Requests)은 외부 인증기관이 인증서를 발급(서명)할 때 제어합니다. 보통 ACME 또는 다른 대부분의 인기 있는 브라우저가 기본적으로 신뢰하는 기타 인증기관과 함께 사용됩니다. 인증서 서명 요청 가져오기(Import Certificate Signing Request)를 사용하면 기존 CSR을 시스템에 가져올 수 있습니다. 보통 ACME 또는 내부 인증기관과 함께 사용됩니다.", - "Device provides virtual storage access to zvols, zvol snapshots, or physical devices. File provides virtual storage access to a single file.": "장치(Device)는 zvol, zvol 스냅샷 또는 물리적 장치에 대한 가상 저장소 액세스를 제공합니다. 파일(File)은 단일 파일에 대한 가상 저장소 액세스를 제공합니다.", - "Intel e82545 (e1000) emulates the same Intel Ethernet card. This provides compatibility with most operating systems. VirtIO provides better performance when the operating system installed in the VM supports VirtIO paravirtualized network drivers.": "Intel e82545 (e1000)은 동일한 인텔 이더넷 카드를 에뮬레이트합니다. 이는 대부분의 운영체제와 호환됩니다. VirtIO는 가상머신에 설치된 운영체제가 VirtIO paravirtualized 네트워크 드라이버를 지원할 경우 더 나은 성능을 제공합니다.", - "Internal Certificates use system-managed CAs for certificate issuance. Import Certificate lets you import an existing certificate onto the system.": "내부 인증서는 시스템 관리 CA를 사용하여 인증서 발급을 처리합니다. 인증서 불러오기는 기존 인증서를 시스템에 가져올 수 있게 합니다.", - "PUSH sends data to cloud storage. PULL receives data from cloud storage. Changing the direction resets the Transfer Mode to COPY.": "PUSH는 데이터를 클라우드 저장소로 보냅니다. PULL은 클라우드 저장소에서 데이터를 받습니다. 방향을 변경하면 전송 모드가 COPY로 재설정됩니다.", - "PUSH sends snapshots to a destination system.

      PULL connects to a remote system and retrieves snapshots matching a Naming Schema.": "PUSH는 스냅샷을 대상 시스템으로 보냅니다.

      PULL은 원격 시스템에 연결하고 이름 규칙과 일치하는 스냅샷을 찾습니다.", - "Quick erases only the partitioning information on a disk without clearing other old data. Full with zeros overwrites the entire disk with zeros. Full with random data overwrites the entire disk with random binary data.": "Quick는 디스크의 파티션 정보만 삭제하고 다른 이전 데이터는 지우지 않습니다. Full with zeros는 디스크 전체를 0으로 덮어씁니다. Full with random data는 디스크 전체를 무작위 이진 데이터로 덮어씁니다.", + "0 disables quotas. Specify a maximum allowed space for this dataset.": "0은 할당량을 설정하지 않습니다. 이 데이터셋에 대한 최대 허용 공간을 지정하십시오.", + "0 is unlimited. A specified value applies to both this dataset and any child datasets.": "0은 무제한입니다. 지정한 값은 이 데이터셋과 모든 하위 데이터셋에 모두 적용됩니다.", + "0 is unlimited. Reserve additional space for datasets containing logs which could take up all available free space.": "0은 무제한입니다. 기록을 포함한 데이터셋에 추가 공간을 예약하여 모든 가능한 여유 공간을 차지할 수 있습니다.", + "AHCI emulates an AHCI hard disk for best software compatibility. VirtIO uses paravirtualized drivers and can provide better performance, but requires the operating system installed in the VM to support VirtIO disk devices.": "AHCI는 최고의 소프트웨어 호환성을 위해 AHCI 하드 디스크를 모방합니다. VirtIO는 반 가상화 드라이버를 사용해 더 나은 성능을 제공할 수 있지만, 가상머신에 설치한 운영체제가 VirtIO 디스크 장치를 지원해야 합니다.", + "AHCI emulates an AHCI hard disk for better software compatibility. VirtIO uses paravirtualized drivers and can provide better performance, but requires the operating system installed in the VM to support VirtIO disk devices.": "AHCI는 더 나은 소프트웨어 호환성을 위해 AHCI 하드 디스크를 모방합니다. VirtIO는 반 가상화 드라이버를 사용해 더 나은 성능을 제공할 수 있지만, 가상머신에 설치된 운영체제가 VirtIO 디스크 장치를 지원해야 합니다.", + "Certificate Signing Requests control when an external CA will issue (sign) the certificate. Typically used with ACME or other CAs that most popular browsers trust by default Import Certificate Signing Request lets you import an existing CSR onto the system. Typically used with ACME or internal CAs.": "인증서 서명 요청(CSR)은 외부 인증기관이 인증서를 발급(서명)할 때 제어합니다. 보통 ACME 또는 다른 대부분의 인기 있는 브라우저가 기본적으로 신뢰하는 기타 인증기관과 함께 사용됩니다. 인증서 서명 요청 불러오기를 사용하면 기존 CSR을 시스템에 가져올 수 있습니다. 보통 ACME 또는 내부 인증기관과 함께 사용됩니다.", + "Device provides virtual storage access to zvols, zvol snapshots, or physical devices. File provides virtual storage access to a single file.": "장치는 ZVOL 또는 ZVOL 스냅샷, 물리적 장치에 대한 가상 저장소 접근을 제공합니다. 파일은 단일 파일에 대한 가상 저장소 접근을 제공합니다.", + "Intel e82545 (e1000) emulates the same Intel Ethernet card. This provides compatibility with most operating systems. VirtIO provides better performance when the operating system installed in the VM supports VirtIO paravirtualized network drivers.": "Intel e82545 (e1000)은 동일한 인텔 이더넷 카드를 모방합니다. 이는 대부분의 운영체제와 호환됩니다. VirtIO는 가상머신에 설치된 운영체제가 VirtIO 반 가상화 네트워크 드라이버를 지원할 경우 더 나은 성능을 제공합니다.", + "Internal Certificates use system-managed CAs for certificate issuance. Import Certificate lets you import an existing certificate onto the system.": "내부 인증서는 시스템 관리 인증기관을 사용해 인증서를 발급합니다. 인증서 불러오기는 기존 인증서를 시스템으로 가져옵니다.", + "PUSH sends data to cloud storage. PULL receives data from cloud storage. Changing the direction resets the Transfer Mode to COPY.": "올리기는 데이터를 클라우드 저장소로 보냅니다. 내려받기는 클라우드 저장소에서 데이터를 받습니다. 방향을 변경하면 전송 모드가 복사로 재설정됩니다.", + "PUSH sends snapshots to a destination system.

      PULL connects to a remote system and retrieves snapshots matching a Naming Schema.": "올리기는 스냅샷을 대상 시스템으로 보냅니다.

      내려받기는 원격 시스템에서 이름짓기 방식과 일치하는 스냅샷을 찾습니다.", + "Quick erases only the partitioning information on a disk without clearing other old data. Full with zeros overwrites the entire disk with zeros. Full with random data overwrites the entire disk with random binary data.": "빠르게는 디스크의 파티션 정보만 삭제하고 다른 이전 데이터는 지우지 않습니다. 0으로 채우기는 디스크 전체를 0으로 덮어씁니다. 임의의 데이터로 채우기는 디스크 전체를 무작위 이진 데이터로 덮어씁니다.", "Sensitive assumes filenames are case sensitive. Insensitive assumes filenames are not case sensitive.": "꼼꼼하게는 파일 이름의 대소문자를 구분합니다. 느슨하게는 파일 이름의 대소문자를 구분하지 않습니다.", - "Standard uses the sync settings that have been requested by the client software, Always waits for data writes to complete, and Disabled never waits for writes to complete.": "표준은 클라이언트 소프트웨어에서 요청한 동기화 설정을 사용합니다. 항상은 데이터 쓰기가 완료될 때까지 기다립니다. 비활성화 됨은 데이터 쓰기가 완료될 때까지 기다리지 않습니다.", - "This option is experimental in rclone and we recommend you do not use it. It may not work correctly with long filenames.

      Encrypt (PUSH) or decrypt (PULL) file names with the rclone \"Standard\" file name encryption mode. The original directory structure is preserved. A filename with the same name always has the same encrypted filename.

      PULL tasks that have Filename Encryption enabled and an incorrect Encryption Password or Encryption Salt will not transfer any files but still report that the task was successful. To verify that files were transferred successfully, click the finished task status to see a list of transferred files.": "이 선택사항은 Rclone의 실험적 기능으로, 사용을 권장하지 않습니다. 긴 파일 이름에는 작동하지 않을 수 있습니다.

      파일 이름을 Rclone \"표준\" 파일 이름 암호화 모드로 암호화(PUSH) 또는 복호화(PULL)합니다. 고유 디렉터리 구조는 유지됩니다. 동일한 파일 이름은 암호화 결과도 동일합니다.

      PULL 작업을 파일 이름 암호화를 켜고 잘못된 암호화 비밀번호암호화 솔트(SALT)를 사용한 경우, 아무 파일도 전송되지 않았음에도 작업이 성공했다고 보고할 수 있습니다. 파일이 성공적으로 전송되었음을 검증하기 위해, 완료된 작업 상태를 눌러 전송된 파일의 목록을 확인하십시오.", - "Yes: Disables the Password fields. The account cannot use password-based logins for services. For example, disabling the password prevents using account credentials to log in to an SMB share or open an SSH session on the system. The Lock User and Permit Sudo options are also removed.

      No: Requires adding a Password to the account. The account can use the saved Password to authenticate with password-based services.": "예: 비밀번호를 비활성화 합니다. 계정은 비밀번호 기반의 서비스 로그인을 사용할 수 없습니다. 예를 들어, 비밀번호를 비활성화 하면 SMB 공유에 로그인하거나 SSH 세션을 여는 등의 계정 자격증명을 사용할 수 없습니다. 사용자 잠금Sudo 권한 선택사항도 제거됩니다.

      아니오: 계정에 비밀번호를 추가합니다. 계정은 저장된 비밀번호를 통해 비밀번호 기반 서비스에 인증할 수 있습니다.", + "Standard uses the sync settings that have been requested by the client software, Always waits for data writes to complete, and Disabled never waits for writes to complete.": "표준은 클라이언트 소프트웨어에서 요청한 동기화 설정을 사용합니다. 항상은 데이터 쓰기가 완료될 때까지 기다립니다. 비활성화는 데이터 쓰기가 완료될 때까지 기다리지 않습니다.", + "This option is experimental in rclone and we recommend you do not use it. It may not work correctly with long filenames.

      Encrypt (PUSH) or decrypt (PULL) file names with the rclone \"Standard\" file name encryption mode. The original directory structure is preserved. A filename with the same name always has the same encrypted filename.

      PULL tasks that have Filename Encryption enabled and an incorrect Encryption Password or Encryption Salt will not transfer any files but still report that the task was successful. To verify that files were transferred successfully, click the finished task status to see a list of transferred files.": "이 선택사항은 Rclone의 실험적 기능으로, 사용을 권장하지 않습니다. 긴 파일 이름에는 작동하지 않을 수 있습니다.

      파일 이름을 Rclone \"표준\" 파일 이름 암호화 모드로 암호화(올리기) 또는 복호화(내려받기)합니다. 고유 디렉터리 구조는 유지됩니다. 동일한 파일 이름은 암호화 결과도 동일합니다.

      내려받기 작업을 파일 이름 암호화를 켜고 잘못된 암호화 비밀번호 또는 암호화 솔트(Salt)를 사용한 경우, 아무 파일도 전송되지 않았음에도 작업이 성공했다고 보고할 수 있습니다. 파일이 성공적으로 전송되었음을 검증하기 위해, 완료된 작업 상태를 눌러 전송된 파일의 목록을 확인하십시오.", + "Yes: Disables the Password fields. The account cannot use password-based logins for services. For example, disabling the password prevents using account credentials to log in to an SMB share or open an SSH session on the system. The Lock User and Permit Sudo options are also removed.

      No: Requires adding a Password to the account. The account can use the saved Password to authenticate with password-based services.": "예: 비밀번호를 사용하지 않습니다. 계정은 비밀번호 기반의 서비스에 로그인할 수 없습니다. 예를 들어, 비밀번호를 비활성화 하면 SMB 공유에 로그인하거나 SSH 세션을 여는 등의 계정 자격증명을 사용할 수 없습니다. 사용자 잠금Sudo 권한 선택사항도 사용할 수 없습니다.

      아니오: 계정에 비밀번호를 사용합니다. 계정은 저장된 비밀번호를 통해 비밀번호 기반 서비스에 인증할 수 있습니다.", "global is a reserved name that cannot be used as a share name. Please enter a different share name.": "global은(는) 예약된 이름으로, 공유 이름으로 사용할 수 없습니다. 다른 공유 이름을 입력하십시오.", "

      Currently following GPU(s) have been isolated:

        {gpus}

      ": "

      현재 다음 GPU가 격리되어 있습니다:

        {gpus}

      ", - "

      Including the Password Secret Seed allows using this configuration file with a new boot device. This also decrypts all system passwords for reuse when the configuration file is uploaded.


      Keep the configuration file safe and protect it from unauthorized access!": "

      비밀번호 시크릿 시드를 포함하면 이 구성 파일을 새로운 부트 장치와 함께 사용할 수 있습니다. 이는 구성 파일이 업로드될 때 시스템의 모든 비밀번호를 복호화하여 재사용할 수 있게 합니다.


      구성 파일을 안전하게 보관하고 무단 접근으로부터 보호하십시오!", - "

      The system will restart to perform this operation!

      All passwords are reset when the uploaded configuration database file was saved without the Password Secret Seed.

      ": "

      이 작업을 수행하기 위해 시스템을 재시작합니다!

      업로드한 구성 데이터베이스 파일이 비밀번호 Secret Seed 없이 저장되었을 경우 모든 비밀번호는 재설정됩니다.

      ", + "

      Including the Password Secret Seed allows using this configuration file with a new boot device. This also decrypts all system passwords for reuse when the configuration file is uploaded.


      Keep the configuration file safe and protect it from unauthorized access!": "

      비밀번호 시크릿 시드를 포함하면 이 구성 파일을 새로운 부트 장치와 함께 사용할 수 있습니다. 이는 시스템의 모든 비밀번호를 복호화하여 구성 파일을 업로드할 때 재사용할 수 있게 합니다.


      구성 파일을 안전하게 보관하고 무단 접근으로부터 보호하십시오!", + "

      The system will restart to perform this operation!

      All passwords are reset when the uploaded configuration database file was saved without the Password Secret Seed.

      ": "

      이 작업을 수행하기 위해 시스템을 재시작합니다!

      업로드한 구성 데이터베이스 파일이 비밀번호 시크릿 시드 없이 저장되었을 경우 모든 비밀번호는 재설정됩니다.

      ", "Dataset: ": "데이터셋: ", - "A User Access Token for Box. An access token enables Box to verify a request belongs to an authorized session. Example token: T9cE5asGnuyYCCqIZFoWjFHvNbvVqHjl.": "A User Access Token for Box. An access token enables Box to verify a request belongs to an authorized session. Example token: T9cE5asGnuyYCCqIZFoWjFHvNbvVqHjl.", - "A message with verification instructions has been sent to the new email address. Please verify the email address before continuing.": "새 이메일 주소로 확인 지침이 전송되었습니다. 계속하기 전에 이메일 주소를 확인해 주십시오.", - "A single bandwidth limit or bandwidth limit schedule in rclone format. Separate entries by pressing Enter. Example: 08:00,512 12:00,10MB 13:00,512 18:00,30MB 23:00,off. Units can be specified with a suffix of b, k (default), M, or G. See rclone --bwlimit.": "A single bandwidth limit or bandwidth limit schedule in rclone format. Separate entries by pressing Enter. Example: 08:00,512 12:00,10MB 13:00,512 18:00,30MB 23:00,off. Units can be specified with a suffix of b, k (default), M, or G. See rclone --bwlimit.", - "A single bandwidth limit or bandwidth limit schedule in rclone format. Separate entries by pressing Enter. Example: 08:00,512 12:00,10MB 13:00,512 18:00,30MB 23:00,off. Units can be specified with a suffix of b (default), k, M, or G. See rclone --bwlimit.": "Rclone 유형에 단일 대역폭 제한이나 대역폭 제한 일정을 수립합니다. Enter키를 눌러 항목을 구분합니다. 예시: 08:00,512 12:00,10MB 13:00,512 18:00,30MB 23:00,off. 단위는 b (기본) 또는 k, M, G의 접미사로 지정할 수 있습니다. Rclone --bwlimit 참고.", - "A smaller block size can reduce sequential I/O performance and space efficiency.": "작은 블록 크기는 순차 I/O 성능과 공간 효율성을 감소시킬 수 있습니다.", - "A stripe log VDEV may result in data loss if it fails combined with a power outage.": "스트라이프 기록 VDEV은(는) 정전시 데이터의 손실이 발생할 수 있습니다.", - "A stripe {vdevType} VDEV is highly discouraged and will result in data loss if it fails": "스트라이프 {vdevType} VDEV은(는) 오작동시 데이터 손실의 우려가 있으므로 매우 권장하지 않습니다.", + "A User Access Token for Box. An access token enables Box to verify a request belongs to an authorized session. Example token: T9cE5asGnuyYCCqIZFoWjFHvNbvVqHjl.": "Box의 사용자 접근 토큰입니다. 접근 토큰을 통해 Box는 요청이 승인된 세션에 속하는지 검증합니다. 토큰 예시: T9cE5asGnuyYCCqIZFoWjFHvNbvVqHjl", + "A message with verification instructions has been sent to the new email address. Please verify the email address before continuing.": "새 이메일 주소로 검증 방법을 전송했습니다. 계속하기 전에 이메일 주소를 검증해 주십시오.", + "A single bandwidth limit or bandwidth limit schedule in rclone format. Separate entries by pressing Enter. Example: 08:00,512 12:00,10MB 13:00,512 18:00,30MB 23:00,off. Units can be specified with a suffix of b, k (default), M, or G. See rclone --bwlimit.": "Rclone 형식의 단일 대역폭 제한 또는 대역폭 제한 일정입니다. Enter키를 눌러 항목을 구분합니다. 예시: 08:00,512 12:00,10MB 13:00,512 18:00,30MB 23:00,off. 단위는 b 또는 k (기본), M, G의 접미사로 지정할 수 있습니다. rclone --bwlimit을(를) 참고하십시오.", + "A single bandwidth limit or bandwidth limit schedule in rclone format. Separate entries by pressing Enter. Example: 08:00,512 12:00,10MB 13:00,512 18:00,30MB 23:00,off. Units can be specified with a suffix of b (default), k, M, or G. See rclone --bwlimit.": "Rclone 유형에 단일 대역폭 제한이나 대역폭 제한 일정을 수립합니다. Enter키를 눌러 항목을 구분합니다. 예시: 08:00,512 12:00,10MB 13:00,512 18:00,30MB 23:00,off. 단위는 b (기본) 또는 k, M, G의 접미사로 지정할 수 있습니다. Rclone --bwlimit을(를) 참고하십시오.", + "A smaller block size can reduce sequential I/O performance and space efficiency.": "작은 블록 크기는 순차 I/O 성능과 공간 효율성을 떨어뜨릴 수 있습니다.", + "A stripe log VDEV may result in data loss if it fails combined with a power outage.": "스트라이프 기록 VDEV는 정전시 데이터의 손실이 발생할 수 있습니다.", + "A stripe {vdevType} VDEV is highly discouraged and will result in data loss if it fails": "스트라이프 {vdevType} VDEV는 오작동시 데이터 손실의 우려가 있으므로 매우 권장하지 않습니다.", "A system update is in progress. It might have been launched in another window or by an external source like TrueCommand.": "시스템 업데이트가 진행 중입니다. 다른 창 또는 TrueCommand와 같은 외부 소스에서 시작되었을 수 있습니다.", - "A unique name to identify this keypair. Automatically generated keypairs are named after the object that generated the keypair with \" Key\" appended to the name.": "이 키쌍을 식별하는 고유한 이름입니다. 자동으로 생성된 키쌍은 키를 생성한 개체의 이름에 \" Key\"가 추가된 이름으로 지정됩니다.", + "A unique name to identify this keypair. Automatically generated keypairs are named after the object that generated the keypair with \" Key\" appended to the name.": "이 키쌍을 식별하는 고유한 이름입니다. 자동으로 생성된 키쌍은 키를 생성한 개체의 이름에 \" Key\"가 추가된 이름을 가집니다.", "A username on the FTP Host system. This user must already exist on the FTP Host.": "FTP 호스트 시스템의 사용자 이름입니다. 이 사용자는 이미 FTP 호스트에 존재해야 합니다.", "ACL": "ACL", "ACL Editor": "ACL 편집기", @@ -117,7 +117,7 @@ "ACME DNS-Authenticators": "ACME DNS-인증기", "ACME Server Directory URI": "ACME 서버 디렉터리 URI", "AD Timeout": "AD 시간 제한", - "AD users and groups by default will have a domain name prefix (`DOMAIN\\`). In some edge cases this may cause erratic behavior from some clients and applications that are poorly designed and cannot handle the prefix. Set only if required for a specific application or client. Note that using this setting is not recommended as it may cause collisions with local user account names.": "AD 사용자와 그룹은 기본적으로 도메인 네임 접두사(`DOMAIN\\`)를 가집니다. 이때문에 접두사를 다룰 수 없는 몇몇 클라이언트와 애플리케이션에서 비정상적인 작동이 보고되었습니다. 이 설정은 권장하지 않으며 로컬 사용자 계정 이름과 충돌할 수 있음을 참고하시기 바랍니다.", + "AD users and groups by default will have a domain name prefix (`DOMAIN\\`). In some edge cases this may cause erratic behavior from some clients and applications that are poorly designed and cannot handle the prefix. Set only if required for a specific application or client. Note that using this setting is not recommended as it may cause collisions with local user account names.": "AD 사용자와 그룹은 기본적으로 도메인 네임 접두사(`DOMAIN\\`)를 가집니다. 일부 극단적인 사례에서는 접두사를 다룰 수 있도록 설계되지 않은 일부 클라이언트 및 애플리케이션에서 불규칙한 동작이 발생할 수 있습니다. 이 설정은 권장하지 않으며 로컬 사용자 계정 이름과 충돌할 수 있음을 참고하십시오.", "ALERT": "경고", "ALL Initiators Allowed": "허용한 모든 이니시에이터", "API Docs": "API 문서", @@ -136,47 +136,47 @@ "Accept": "수락", "Access": "접근", "Access Based Share Enumeration": "권한 기반 공유 목록화", - "Access Control Entry": "접근 제어 항목", - "Access Control Entry (ACE) user or group. Select a specific User or Group for this entry, owner@ to apply this entry to the user that owns the dataset, group@ to apply this entry to the group that owns the dataset, or everyone@ to apply this entry to all users and groups. See nfs4_setfacl(1) NFSv4 ACL ENTRIES.": "접근 제어 항목(ACE)에 포함될 사용자 또는 그룹입니다. 사용자 또는 그룹을 지정하거나, owner@(으)로 데이터셋의 소유자를 지정, group@(으)로 데이터셋을 소유할 그룹을 지정, everyone@(으)로 모든 사용자와 그룹을 지정할 수 있습니다. nfs4_setfacl(1) NFSv4 ACL 항목 참고.", - "Access Control List": "접근 제어 목록", + "Access Control Entry": "접근 제어 항목(ACE)", + "Access Control Entry (ACE) user or group. Select a specific User or Group for this entry, owner@ to apply this entry to the user that owns the dataset, group@ to apply this entry to the group that owns the dataset, or everyone@ to apply this entry to all users and groups. See nfs4_setfacl(1) NFSv4 ACL ENTRIES.": "접근 제어 항목(ACE)에 포함될 사용자 또는 그룹입니다. 지정할 사용자 또는 그룹을 선택하거나, owner@(으)로 데이터셋의 소유자를 지정, group@(으)로 데이터셋의 소유 그룹을 지정, everyone@(으)로 모든 사용자와 그룹을 지정할 수 있습니다. nfs4_setfacl(1) NFSv4 ACL 항목을 참고하십시오.", + "Access Control List": "접근 제어 목록(ACL)", "Access Key ID": "접근 키 ID", "Access Key ID for the linked AWS account.": "연결된 AWS 계정의 접근 키 ID", "Access Mode": "접근 모드", "Access Settings": "접근 설정", "Access Token": "접근 토큰", - "Access Token generated by a Hubic account.": "Hubic 계정에서 생성된 접근 토큰입니다.", + "Access Token generated by a Hubic account.": "Hubic 계정에서 생성한 접근 토큰입니다.", "Access Token for a Dropbox account. A token must be generated by the Dropbox account before adding it here.": "Dropbox 계정용 접근 토큰입니다. 토큰을 추가하기 전에 반드시 Dropbox 계정으로 생성해야 합니다.", - "Access checks should use bucket-level IAM policies.": "접근 확인은 버킷 레벨 IAM 정책을 사용해야 합니다.", - "Access denied to {method}": "{method} 접근 거부됨", - "Access from your IP is restricted": "해당 IP의 접근이 제한됨", - "Access restricted": "접근 제한됨", + "Access checks should use bucket-level IAM policies.": "접근 확인은 버킷 수준의 IAM 정책을 사용해야 합니다.", + "Access denied to {method}": "{method} 접근 거부함", + "Access from your IP is restricted": "해당 IP의 접근을 제한함", + "Access restricted": "접근 제한함", "Account Key": "계정 키", "Account Name": "계정 이름", "Account Read": "계정 읽기", "Account Write": "계정 쓰기", - "Account to be used for guest access. Default is nobody. The chosen account is required to have permissions to the shared pool or dataset. To adjust permissions, edit the dataset Access Control List (ACL), add a new entry for the chosen guest account, and configure the permissions in that entry. If the selected Guest Account is deleted the field resets to nobody.": "게스트 접근에 사용될 계정입니다. 기본값은 nobody입니다. 선택한 계정은 공유 풀 또는 데이터셋에 대한 권한이 있어야 합니다. 권한을 조정하려면 데이터셋 접근 제어 목록 (ACL)을 편집하여 선택한 게스트 계정을 위한 새 항목을 추가하고 해당 항목에서 권한을 구성하십시오. 선택한 게스트 계정이 삭제되면 이 필드는 nobody로 재설정됩니다.", + "Account to be used for guest access. Default is nobody. The chosen account is required to have permissions to the shared pool or dataset. To adjust permissions, edit the dataset Access Control List (ACL), add a new entry for the chosen guest account, and configure the permissions in that entry. If the selected Guest Account is deleted the field resets to nobody.": "방문자 접근에 사용할 계정입니다. 기본값은 nobody입니다. 선택한 계정은 공유 풀 또는 데이터셋에 대한 권한이 있어야 합니다. 권한을 조정하려면 데이터셋 접근 제어 목록(ACL)을 수정하여 선택한 방문자 계정을 위한 새로운 항목을 추가하고 해당 항목에서 권한을 구성합니다. 선택한 방문자 계정을 삭제하면 이 값은 nobody로 재설정됩니다.", "Account: {account}": "계정: {account}", "Ace has errors.": "ACE에 오류가 있습니다.", "Action Not Possible": "동작 불가", "Actions": "동작", "Actions for {device}": "{device} 동작", "Activate": "활성화", - "Activate KMIP configuration and begin syncing keys with the KMIP server.": "활성화 KMIP 구성 및 KMIP 서버와 키 동기화 시작.", - "Activate the Basic Constraints extension to identify whether the certificate's subject is a CA and the maximum depth of valid certification paths that include this certificate.": "이 인증서의 주체가 CA인지와 이 인증서를 포함하는 유효한 인증 경로의 최대 깊이를 식별하기 위해 기본 제약 조건 확장을 활성화하시겠습니까?", - "Activate this Boot Environment?": "이 부트 환경을 활성화하시겠습니까?", + "Activate KMIP configuration and begin syncing keys with the KMIP server.": "KMIP 구성을 활성화하고 KMIP 서버와 키를 동기화합니다.", + "Activate the Basic Constraints extension to identify whether the certificate's subject is a CA and the maximum depth of valid certification paths that include this certificate.": "기본 제약 조건 확장을 활성화하여 인증서의 주체가 CA인지 여부와 이 인증서를 포함하는 유효한 인증 경로의 최대 깊이를 식별합니다.", + "Activate this Boot Environment?": "이 시작 환경을 활성화하시겠습니까?", "Activate this certificate extension. The key usage extension defines the purpose (e.g., encipherment, signature, certificate signing) of the key contained in the certificate. The usage restriction might be employed when a key that could be used for more than one operation is to be restricted. For example, when an RSA key should be used only to verify signatures on objects other than public key certificates and CRLs, the Digital Signature bits would be asserted. Likewise, when an RSA key should be used only for key management, the Key Encipherment bit would be asserted.
      See RFC 3280, section 4.2.1.3 for more information.": "이 인증서 확장을 활성화합니다. 키 용도 확장은 인증서에 포함된 키의 목적(예: 암호화, 서명, 인증서 서명)을 정의합니다. 용도 제한은 둘 이상의 작업에 사용될 수 있는 키를 제한하려는 경우에 사용될 수 있습니다. 예를 들어, RSA 키가 공개 키 인증서 및 CRL 외의 개체에서 서명을 확인하는 데만 사용되어야 하는 경우 디지털 서명 비트가 설정됩니다. 마찬가지로 RSA 키가 키 관리에만 사용되어야 하는 경우 키 암호화 비트가 설정됩니다. 더 많은 정보는 RFC 3280, 섹션 4.2.1.3을 참고하십시오.", "Activate this certificate extension.The Extended Key Usage extension identifies and limits valid uses for this certificate, such as client authentication or server authentication.See RFC 3280, section 4.2.1.13 for more details.": "이 인증서 확장을 활성화합니다. 확장된 키 용도 확장은 이 인증서에 대한 유효한 사용 목적(예: 클라이언트 인증 또는 서버 인증)을 식별하고 제한합니다. 자세한 내용은 RFC 3280, 섹션 4.2.1.13을 참고하십시오.", - "Activate this extension. The authority key identifier extension provides a means of identifying the public key corresponding to the private key used to sign a certificate. This extension is used where an issuer has multiple signing keys (either due to multiple concurrent key pairs or due to changeover). The identification MAY be based on either the key identifier (the subject key identifier in the issuer's certificate) or on the issuer name and serial number.
      See RFC 3280, section 4.2.1.1 for more information.": "이 확장을 활성화하십시오. 기관 키 식별자 확장은 인증서에 서명에 사용된 개인 키에 해당하는 공개 키를 식별하는 방법을 제공합니다. 이 확장은 발급자가 여러 서명 키(동시 다중 키 쌍 또는 교체로 인한)를 가지고 있는 경우에 사용됩니다. 식별은 키 식별자(발급자의 인증서의 주체 키 식별자) 또는 발급자 이름 및 일련 번호를 기반으로 할 수 있습니다. 더 많은 정보는 RFC 3280, 섹션 4.2.1.1을 참고하십시오.", - "Activates a tuning script which attempts to optimize the system depending on the installed hardware. Warning: Autotuning is only used as a temporary measure and is not a permanent fix for system hardware issues.": "설치된 하드웨어에 따라 시스템을 최적화하려는 튜닝 스크립트를 활성화합니다. 경고: 오토튜닝은 시스템 하드웨어 문제를 영구적으로 해결하는 것이 아닌 일시적인 조치로만 사용되어야 합니다.", - "Activates the configuration. Unset to disable the configuration without deleting it.": "구성을 활성화합니다. 구성을 비활성화하려면 해제하고 삭제하지 않고 비활성화하십시오.", + "Activate this extension. The authority key identifier extension provides a means of identifying the public key corresponding to the private key used to sign a certificate. This extension is used where an issuer has multiple signing keys (either due to multiple concurrent key pairs or due to changeover). The identification MAY be based on either the key identifier (the subject key identifier in the issuer's certificate) or on the issuer name and serial number.
      See RFC 3280, section 4.2.1.1 for more information.": "이 확장을 활성화합니다. 기관 키 식별자 확장은 인증서에 서명에 사용된 개인 키에 해당하는 공개 키를 식별하는 방법을 제공합니다. 이 확장은 발급자가 여러 서명 키(동시 다중 키쌍 또는 교체로 인한)를 가지고 있는 경우에 사용합니다. 식별은 키 식별자(발급자의 인증서의 주체 키 식별자) 또는 발급자 이름과 일련 번호를 기반으로 할 수 있습니다. 더 많은 정보는 RFC 3280, 섹션 4.2.1.1을 참고하십시오.", + "Activates a tuning script which attempts to optimize the system depending on the installed hardware. Warning: Autotuning is only used as a temporary measure and is not a permanent fix for system hardware issues.": "설치된 하드웨어에 따라 시스템을 최적화하려는 조율 스크립트를 활성화합니다. 위험: 자동조율은 시스템 하드웨어 문제에 대한 일시적인 조치이지 영구적인 해결이 아닙니다.", + "Activates the configuration. Unset to disable the configuration without deleting it.": "구성을 활성화합니다. 설정하지 않으면 삭제하지 않고 비활성화합니다.", "Activates the replication schedule.": "복제 일정을 활성화합니다.", "Active": "활성", - "Active Controller": "활성화 컨트롤러", + "Active Controller": "활성 컨트롤러", "Active Directory": "액티브 디렉터리", - "Active Directory - Primary Domain": "Active Directory - 기본 도메인", - "Active Directory and LDAP are disabled.": "Active Directory 및 LDAP이 비활성화되었습니다.", - "Active Directory is disabled.": "액티브 디렉터리가 비활성화 되었습니다.", - "Active Directory must be enabled before adding new domains.": "새 도메인을 추가하기 전에 Active Directory를 활성화해야 합니다.", + "Active Directory - Primary Domain": "액티브 디렉터리 - 기본 도메인", + "Active Directory and LDAP are disabled.": "액티브 디렉터리 및 LDAP을(를) 비활성화했습니다.", + "Active Directory is disabled.": "액티브 디렉터리를 비활성했습니다.", + "Active Directory must be enabled before adding new domains.": "새 도메인을 추가하기 전에 액티브 디렉터리를 활성화해야 합니다.", "Active Sessions": "활성 세션", "Active: TrueNAS Controller {id}": "활성: TrueNAS 컨트롤러 {id}", "Adapter Type": "어댑터 유형", @@ -185,7 +185,7 @@ "Add API Key": "API 키 추가", "Add Alert": "경고 추가", "Add Alert Service": "경고 서비스 추가", - "Add Allowed Initiators (IQN)": "허용하는 이니시에이터 추가 (IQN)", + "Add Allowed Initiators (IQN)": "허용한 이니시에이터 추가(IQN)", "Add Authorized Access": "인증된 접근 추가", "Add Backup Credential": "백업 자격증명 추가", "Add CSR": "CSR 추가", @@ -206,7 +206,7 @@ "Add Disk": "디스크 추가", "Add Disk Test": "디스크 검사 추가", "Add Disks": "디스크 추가", - "Add Disks To:": "여기에 디스크 추가:", + "Add Disks To:": "디스크 추가 대상:", "Add Expansion Shelf": "확장 선반 추가", "Add Exporter": "내보내기 추가", "Add Extent": "익스텐트 추가", @@ -215,14 +215,14 @@ "Add Group": "그룹 추가", "Add Group Quotas": "그룹 할당량 추가", "Add ISCSI Target": "iSCSI 대상 추가", - "Add Idmap": "Idmap 추가", + "Add Idmap": "IDMAP 추가", "Add Image": "이미지 추가", "Add Init/Shutdown Script": "초기화/종료 스크립트 추가", "Add Initiator": "이니시에이터 추가", "Add Interface": "인터페이스 추가", "Add Item": "항목 추가", - "Add Kerberos Keytab": "Kerberos Keytab 추가", - "Add Kerberos Realm": "Kerberos Realm 추가", + "Add Kerberos Keytab": "Kerberos 키탭 추가", + "Add Kerberos Realm": "Kerberos 영역 추가", "Add Kerberos SPN Entry": "Kerberos SPN 항목 추가", "Add Kernel Parameters": "커널 매개변수 추가", "Add Key": "키 추가", @@ -261,49 +261,49 @@ "Add User": "사용자 추가", "Add User Quotas": "사용자 할당량 추가", "Add VDEV": "VDEV 추가", - "Add VM": "VM 추가", - "Add VM Snapshot": "VM 스냅샷 추가", + "Add VM": "가상머신 추가", + "Add VM Snapshot": "가상머신 스냅샷 추가", "Add Vdevs to Pool": "VDEV를 풀에 추가", "Add Virtual Machine": "가상머신 추가", "Add Volume": "볼륨 추가", "Add Widget": "위젯 추가", "Add Zvol": "ZVOL 추가", "Add a new bucket to your Storj account.": "Storj 계정에 새로운 버킷을 추가합니다.", - "Add any more sshd_config(5) options not covered in this screen. Enter one option per line. These options are case-sensitive. Misspellings can prevent the SSH service from starting.": "이 화면에서 다루지 않은 sshd_config(5) 옵션을 추가하십시오. 한 줄에 하나의 옵션을 입력합니다. 이 옵션들은 대소문자를 구분합니다. 오타가 있으면 SSH 서비스가 시작되지 않을 수 있습니다.", + "Add any more sshd_config(5) options not covered in this screen. Enter one option per line. These options are case-sensitive. Misspellings can prevent the SSH service from starting.": "이 화면에서 다루지 않은 sshd_config(5) 선택사항을 추가합니다. 한 줄에 하나의 선택사항을 입력합니다. 이 선택사항들은 대소문자를 구분합니다. 잘못 입력하면 SSH 서비스가 시작되지 않을 수 있습니다.", "Add any notes about this zvol.": "이 ZVOL에 대한 비고를 입력합니다.", "Add bucket": "버킷 추가", "Add catalog to system even if some trains are unhealthy.": "일부 구성요소에 문제가 있더라도 카탈로그를 시스템에 추가합니다.", "Add entry": "항목 추가", "Add groups": "그룹 추가", "Add iSCSI": "iSCSI 추가", - "Add listen": "듣기 추가", + "Add listen": "수신 추가", "Add new": "새로 추가", "Add the required no. of disks to get a vdev size estimate": "VDEV 크기 추정값을 얻기 위해 필요한 디스크 수 추가", "Add this user to additional groups.": "이 사용자를 추가 그룹에 추가합니다.", "Add to trusted store": "신뢰하는 상점에 추가", "Add user linked API Key": "사용자 연계 API 키 추가", "Add {item}": "{item} 추가", - "Added disks are erased, then the pool is extended onto the new disks with the chosen topology. Existing data on the pool is kept intact.": "추가된 디스크는 지워지고 선택한 토폴로지로 새로운 디스크로 풀이 확장됩니다. 풀에 있는 기존 데이터는 그대로 유지됩니다.", + "Added disks are erased, then the pool is extended onto the new disks with the chosen topology. Existing data on the pool is kept intact.": "추가한 디스크는 지워지고 선택한 토폴로지로 구성된 새로운 디스크로 풀이 확장됩니다. 풀에 있는 기존 데이터는 그대로 유지됩니다.", "Adding data VDEVs of different types is not supported.": "서로 다른 유형의 데이터 VDEV 추가는 지원되지 않습니다.", - "Adding, removing, or changing hardware components.": "하드웨어 구성요소를 더하거나, 빼거나, 바꿉니다.", - "Additional rsync(1) options to include. Separate entries by pressing Enter.
      Note: The \"*\" character must be escaped with a backslash (\\*.txt) or used inside single quotes ('*.txt').": "불러들일 추가적인 rsync(1) 옵션입니다. Enter키를 눌러 여러 값을 입력할 수 있습니다.
      참고: \"*\" 문자는 반드시 백슬래시(\\*.txt)를 붙이거나 작은 따옴표('*.txt')로 감싸야 합니다.", - "Additional smartctl(8) options.": "추가적인 smartctl(8) 옵션입니다.", + "Adding, removing, or changing hardware components.": "하드웨어 구성요소를 추가하거나, 제거하거나, 변경합니다.", + "Additional rsync(1) options to include. Separate entries by pressing Enter.
      Note: The \"*\" character must be escaped with a backslash (\\*.txt) or used inside single quotes ('*.txt').": "불러들일 추가적인 rsync(1) 선택사항입니다. Enter키를 눌러 항목을 구분합니다.
      참고: \"*\" 문자는 반드시 백슬래시를 붙이거나(\\*.txt) 작은 따옴표로 감싸야('*.txt') 합니다.", + "Additional smartctl(8) options.": "추가적인 smartctl(8) 선택사항입니다.", "Additional Domains": "추가 도메인", "Additional Domains:": "추가 도메인", "Additional Hardware": "추가 하드웨어", - "Additional Kerberos application settings. See the \"appdefaults\" section of [krb.conf(5)]. for available settings and usage syntax.": "추가 Kerberos 애플리케이션 설정. 사용 가능한 설정 및 사용 구문은 [krb.conf(5)]를 참고하십시오.", - "Additional Kerberos library settings. See the \"libdefaults\" section of [krb.conf(5)]. for available settings and usage syntax.": "추가 Kerberos 라이브러리 설정. 사용 가능한 설정 및 사용 구문은 [krb.conf(5)]를 참고하십시오.", + "Additional Kerberos application settings. See the \"appdefaults\" section of [krb.conf(5)]. for available settings and usage syntax.": "추가적인 Kerberos 애플리케이션 설정입니다. 사용할 수 있는 설정 및 사용 구문은 [krb.conf(5)]의 \"appdefaults\" 부분을 참고하십시오.", + "Additional Kerberos library settings. See the \"libdefaults\" section of [krb.conf(5)]. for available settings and usage syntax.": "추가적인 Kerberos 라이브러리 설정입니다. 사용할 수 있는 설정 및 사용 구문은 [krb.conf(5)]의 \"libdefaults\" 부분을 참고하십시오.", "Additional Parameters String": "추가 매개변수 문자열", - "Additional domains to search. Separate entries by pressing Enter. Adding search domains can cause slow DNS lookups.": "검색할 추가 도메인입니다. Enter 키를 눌러 구분합니다. 검색 도메인을 추가하면 DNS 조회가 느려질 수 있습니다.", - "Additional hosts to be appended to /etc/hosts. Separate entries by pressing Enter. Hosts defined here are still accessible by name even when DNS is not available. See hosts(5) for additional information.": "/etc/hosts에 추가될 호스트입니다. Enter 키를 눌러 구분합니다. 여기에 정의된 호스트는 DNS가 사용 불가능한 경우에도 이름으로 접근할 수 있습니다. 추가 정보는 hosts(5)를 참고하십시오.", - "Additional options for nslcd.conf.": "nslcd.conf를 위한 추가 옵션입니다.", + "Additional domains to search. Separate entries by pressing Enter. Adding search domains can cause slow DNS lookups.": "검색할 추가 도메인입니다. Enter키를 눌러 항목을 구분합니다. 검색 도메인을 추가하면 DNS 조회가 느려질 수 있습니다.", + "Additional hosts to be appended to /etc/hosts. Separate entries by pressing Enter. Hosts defined here are still accessible by name even when DNS is not available. See hosts(5) for additional information.": "/etc/hosts에 추가할 호스트입니다. Enter키를 눌러 항목을 구분합니다. 여기에 정의한 호스트는 DNS를 사용할 수 없는 경우에도 이름으로 접근할 수 있습니다. 추가 정보는 hosts(5)를 참고하십시오.", + "Additional options for nslcd.conf.": "nslcd.conf의 추가 선택사항입니다.", "Address": "주소", "Address Pool": "풀 지정", "Address Pools": "풀 지정", "Adjust Resilver Priority": "리실버 우선순위 조정", - "Adjust Scrub Priority": "스크럽/리실버 우선순위 조정", + "Adjust Scrub Priority": "스크럽 우선순위 조정", "Adjust Scrub/Resilver Priority": "스크럽/리실버 우선순위 조정", - "Adjust how often alert notifications are sent, use the Frequency drop-down. Setting the Frequency to NEVER prevents that alert from being added to alert notifications, but the alert can still show in the web interface if it is triggered.": "경고 알림이 얼마나 자주 전송되는지를 조정하려면 빈도를 선택합니다. 빈도를 '하지 않음'으로 설정하면 해당 경고가 경고 알림에 추가되지 않지만, 웹 인터페이스에서는 해당 경고가 트리거될 경우 표시될 수 있습니다.", + "Adjust how often alert notifications are sent, use the Frequency drop-down. Setting the Frequency to NEVER prevents that alert from being added to alert notifications, but the alert can still show in the web interface if it is triggered.": "경고 알림을 얼마나 자주 전송할지를 조정하려면 빈도를 선택합니다. 빈도를 '하지 않음'으로 설정하면 해당 경고가 경고 알림에 추가되지 않지만, 해당 경고가 발생할 경우 웹 인터페이스에는 표시됩니다.", "Admin Password": "관리자 비밀번호", "Admin Server": "관리자 서버", "Admin Servers": "관리자 서버", @@ -321,7 +321,7 @@ "Advanced Replication Creation": "고급 복제 생성", "Advanced Settings": "고급 설정", "Advanced Settings → Access": "고급 설정 → 접근", - "After entering the Hostname, Username, and Password, click Fetch Datastores and select the datastore to be synchronized.": "호스트 이름, 사용자 이름, 및 비밀번호를 입력한 후 데이터스토어 가져오기를 클릭하여 동기화할 데이터 저장소를 선택합니다.", + "After entering the Hostname, Username, and Password, click Fetch Datastores and select the datastore to be synchronized.": "호스트 이름사용자 이름, 비밀번호를 입력한 후 데이터스토어 가져오기를 눌러 동기화할 데이터스토어를 선택합니다.", "Age": "나이", "Age (in days)": "나이(일)", "Agree": "동의", @@ -346,9 +346,9 @@ "All disks healthy.": "모든 디스크가 건강합니다.", "All pools are online.": "모든 풀이 연결되었습니다.", "All selected directories must be at the same level i.e., must have the same parent directory.": "선택한 모든 디렉터리는 동일한 수준에 있어야 합니다. 즉, 동일한 상위 디렉터리를 가져야 합니다.", - "Allocate RAM for the VM. Minimum value is 256 MiB.": "가상머신을 위해 RAM을 할당하십시오. 최소값은 256 MiB입니다.", + "Allocate RAM for the VM. Minimum value is 256 MiB.": "가상머신을 위해 RAM을 할당합니다. 최소값은 256 MiB입니다.", "Allocate at least 256 MiB.": "최소 256 MiB를 할당하십시오.", - "Allocate space for the new zvol.": "새 zvol을 위해 공간을 할당하십시오.", + "Allocate space for the new zvol.": "새 ZVOL을 위해 공간을 할당합니다.", "Allow": "허용", "Allow All": "모두 허용", "Allow All Initiators": "모든 이니시에이터 허용", @@ -357,9 +357,9 @@ "Allow Blocks Larger than 128KB": "128KB보다 큰 블록 허용", "Allow Compressed WRITE Records": "압축된 WRITE 레코드 허용", "Allow DNS Updates": "DNS 갱신 허용", - "Allow Directory Service users to access WebUI": "디렉터리 서비스 사용자 WebUI 접근 허용", + "Allow Directory Service users to access WebUI": "디렉터리 서비스 사용자의 WebUI 접근 허용", "Allow Directory Service users to access WebUI?": "디렉터리 서비스 사용자의 WebUI 접근을 허용하시겠습니까?", - "Allow Guest Access": "손님 접근 허용", + "Allow Guest Access": "방문자 접근 허용", "Allow Kerberos Authentication": "Kerberos 인증 허용", "Allow Local User Login": "로컬 사용자 로그인 허용", "Allow Password Authentication": "비밀번호 인증 허용", @@ -372,20 +372,20 @@ "Allow all initiators": "모든 이니시에이터 허용", "Allow all sudo commands": "모든 sudo 명령어 허용", "Allow all sudo commands with no password": "비밀번호 없이 모든 sudo 명령어 허용", - "Allow anonymous FTP logins with access to the directory specified in Path.": "익명으로 FTP에 로그인하여 경로에 지정된 디렉터리에 접근 허용", - "Allow any local user to log in. By default, only members of the ftp group are allowed to log in.": "모든 로컬 사용자 로그인 허용. 기본적으로 ftp 그룹의 구성원만 로그인이 허용됩니다.", + "Allow anonymous FTP logins with access to the directory specified in Path.": "FTP에 익명으로 로그인하여 경로에 지정된 디렉터리로의 접근을 허용합니다.", + "Allow any local user to log in. By default, only members of the ftp group are allowed to log in.": "모든 로컬 사용자의 로그인을 허용합니다. 기본적으로 ftp 그룹의 구성원만 로그인을 허용합니다.", "Allow clients to access the TrueNAS server if they are members of domains that have a trust relationship with the domain to which TrueNAS is joined. This requires valid idmap backend configuration for all trusted domains.": "TrueNAS가 속한 도메인과 신뢰 관계에 있는 도메인에 속한 사용자의 접근을 허용합니다. 모든 신뢰하는 도메인에 대해 유효한 IDMAP 백엔드 구성이 필요합니다.", "Allow configuring a non-standard port to access the GUI over HTTP. Changing this setting might require changing a Firefox configuration setting.": "HTTPS GUI에 접근하기 위한 비표준 포트 구성을 허용합니다. 이 설정 변경은 Firefox 구성 설정 변경이 필요할 수 있습니다.", "Allow configuring a non-standard port to access the GUI over HTTPS.": "HTTPS GUI에 접근하기 위한 비표준 포트 구성을 허용합니다.", - "Allow different groups to be configured with different authentication profiles. Example: all users with a group ID of 1 will inherit the authentication profile associated with Group 1.": "다양한 그룹이 다양한 인증 프로필로 구성될 수 있도록 허용. 예: 그룹 ID가 1인 모든 사용자는 그룹 1과 관련된 인증 프로필을 상속받습니다.", - "Allow encrypted connections. Requires a certificate created or imported with the System > Certificates menu.": "암호화된 연결 허용. System > Certificates 메뉴에서 생성 또는 가져온 인증서가 필요합니다.", - "Allow files which return cannotDownloadAbusiveFile to be downloaded.": "cannotDownloadAbusiveFile을 반환하는 파일 다운로드를 허용합니다.", - "Allow group members to use sudo. Group members are prompted for their password when using sudo.": "그룹 구성원에게 sudo 사용 허용. 그룹 구성원은 sudo를 사용할 때 비밀번호를 입력해야 합니다.", - "Allow more ciphers for sshd(8) in addition to the defaults in sshd_config(5). None allows unencrypted SSH connections and AES128-CBC allows the 128-bit Advanced Encryption Standard.

      WARNING: these ciphers are considered security vulnerabilities and should only be allowed in a secure network environment.": "sshd_config(5)에 명시된 기본 알고리듬(cipher)에 sshd(8)를 위한 추가 알고리듬을 허용합니다. 없음은 암호화되지 않은 SSH 연결을 허용하고, AES128-CBC은(는) 128비트 고급 암호화 표준입니다.

      위험: 이 암호화 알고리듬은 보안 취약점이 되므로 안전한 네트워크 환경에서만 허용해야 합니다.", + "Allow different groups to be configured with different authentication profiles. Example: all users with a group ID of 1 will inherit the authentication profile associated with Group 1.": "다양한 그룹이 서로 다른 인증 프로필로 구성될 수 있도록 합니다. 예시: 그룹 ID가 1인 모든 사용자에게 그룹 1과 연결된 인증 프로필을 상속합니다.", + "Allow encrypted connections. Requires a certificate created or imported with the System > Certificates menu.": "암호화된 연결을 허용합니다. 시스템 > 자격증명 메뉴에서 생성하거나 불러들인 인증서가 필요합니다.", + "Allow files which return cannotDownloadAbusiveFile to be downloaded.": "'cannotDownloadAbusiveFile'을 반환하는 파일 다운로드를 허용합니다.", + "Allow group members to use sudo. Group members are prompted for their password when using sudo.": "그룹 구성원에게 sudo 사용을 허용합니다. 그룹 구성원은 sudo를 사용할 때 자신의 비밀번호를 입력해야 합니다.", + "Allow more ciphers for sshd(8) in addition to the defaults in sshd_config(5). None allows unencrypted SSH connections and AES128-CBC allows the 128-bit Advanced Encryption Standard.

      WARNING: these ciphers are considered security vulnerabilities and should only be allowed in a secure network environment.": "sshd_config(5)에 명시된 기본 알고리듬(cipher)에 sshd(8)를 위한 추가 알고리듬을 허용합니다. 없음은 암호화되지 않은 SSH 연결을 허용하고, AES128-CBC은(는) 128비트 고급 암호화 표준입니다.

      위험: 이 암호화 알고리듬은 보안 취약점이 되므로 안전한 네트워크 환경에서만 허용해야 합니다.", "Allow non-root mount": "최상위가 아니어도 마운트 허용", - "Allow non-unique serialed disks (not recommended)": "고유하지 않은 직렬 디스크 허용 (권장하지 않음)", - "Allow this replication to send large data blocks. The destination system must also support large blocks. This setting cannot be changed after it has been enabled and the replication task is created. For more details, see zfs(8).": "이 복제에서 대용량 데이터 블록을 보낼 수 있도록 허용합니다. 대상 시스템도 대용량 블록을 지원해야 합니다. 이 설정은 활성화된 후 복제 작업이 생성되면 변경할 수 없습니다. 자세한 내용은 zfs(8)를 참고하십시오.", - "Allow using open file handles that can withstand short disconnections. Support for POSIX byte-range locks in Samba is also disabled. This option is not recommended when configuring multi-protocol or local access to files.": "단기적인 연결 끊김을 견딜 수 있는 열린 파일 핸들 사용을 허용합니다. Samba에서 POSIX 바이트 범위 잠금을 지원하지 않습니다. 이 옵션은 다중 프로토콜 또는 로컬 파일 액세스를 구성할 때 권장되지 않습니다.", + "Allow non-unique serialed disks (not recommended)": "디스크 일련번호 중복 허용 (권장하지 않음)", + "Allow this replication to send large data blocks. The destination system must also support large blocks. This setting cannot be changed after it has been enabled and the replication task is created. For more details, see zfs(8).": "이 복제에서 대용량 데이터 블록을 보낼 수 있도록 허용합니다. 도착지 시스템도 대용량 블록을 지원해야 합니다. 이 설정은 활성화된 후 복제 작업이 생성되면 변경할 수 없습니다. 자세한 내용은 zfs(8)를 참고하십시오.", + "Allow using open file handles that can withstand short disconnections. Support for POSIX byte-range locks in Samba is also disabled. This option is not recommended when configuring multi-protocol or local access to files.": "짧은 연결 끊김을 견딜 수 있도록 열린 파일 핸들 사용을 허용합니다. Samba에서 POSIX 바이트 범위 잠금이 비활성화됩니다. 이 선택사항은 다중 프로토콜 또는 파일에 대한 로컬 접근을 구성할 때에는 권장하지 않습니다.", "Allow {activities}": "{activities} 허용", "Allowed Address": "허용한 주소", "Allowed IP Addressed": "허용한 IP 주소", @@ -401,25 +401,25 @@ "Allowed network in network/mask CIDR notation (example 1.2.3.4/24). One entry per field. Leave empty to allow everybody.": "네트워크/마스크 CIDR 작성법을 따라 허용하는 네트워크를 입력합니다(예시: 1.2.3.4/24). 각 칸에 하나의 항목만 작성합니다. 비워두면 모두에게 허용합니다.", "Allowed sudo commands": "허용하는 sudo 명령어", "Allowed sudo commands with no password": "비밀번호 없이 허용하는 sudo 명령어", - "Allows multiple NTFS data streams. Disabling this option causes MacOS to write streams to files on the filesystem.": "NTFS 데이터 스트림을 여러 개 허용합니다. 이 옵션을 비활성화하면 MacOS가 파일 시스템에 스트림을 기록합니다. 여기를 참고하십시오.", - "Allows sudo commands": "Sudo 명령어 허용", - "Alphanumeric Backblaze B2 Application Key ID. To generate a new application key, log in to the Backblaze account, go to the App Keys page, and add a new application key. Copy the application keyID string to this field.": "영문자와 숫자로 이루어진 Backblaze B2 응용 프로그램 키 ID입니다. 새 응용 프로그램 키를 생성하려면 Backblaze 계정에 로그인하여 App Keys 페이지로 이동한 다음 새 응용 프로그램 키를 추가하십시오. 이 필드에 응용 프로그램 keyID 문자열을 복사합니다.", + "Allows multiple NTFS data streams. Disabling this option causes MacOS to write streams to files on the filesystem.": "다중 NTFS 데이터 스트림을 허용합니다. 이 선택사항을 비활성화하면 MacOS가 파일 시스템의 파일에 스트림을 기록합니다.", + "Allows sudo commands": "sudo 명령어 허용", + "Alphanumeric Backblaze B2 Application Key ID. To generate a new application key, log in to the Backblaze account, go to the App Keys page, and add a new application key. Copy the application keyID string to this field.": "영문자와 숫자로 이루어진 Backblaze B2 애플리케이션 키 ID입니다. 새로운 애플리케이션 키를 생성하려면 Backblaze 계정에 로그인하여 App Keys 페이지로 이동한 다음 새 응용 프로그램 키를 추가하십시오. 이 칸에 애플리케이션 keyID 문자열을 복사합니다.", "Also Include Naming Schema": "이름짓기 방식도 포함", - "Also include snapshots with the name": "이름이 포함된 스냅샷도 포함합니다.", - "Also unlock any separate encryption roots that are children of this dataset. Child datasets that inherit encryption from this encryption root will be unlocked in either case.": "또한 이 데이터셋에 포함된 개별 암호화 루트의 잠금을 해제합니다. 각 암호화 루트에서 암호화를 상속받는 하위 데이터셋의 잠금도 해제됩니다.", - "Alternative names that SMB clients can use when connecting to this NAS. Can be no greater than 15 characters.": "SMB 클라이언트가 이 NAS에 연결할 때 사용할 수 있는 대체 이름입니다. 15자 이상이 될 수 없습니다.", - "Alternatively, you can start by configuring VDEVs in the wizard first and then opening Manual selection to make adjustments.": "대신 마법사를 통해 먼저 VDEV 구성을 하고 수동 선택을 통해 조정할 수 있습니다.", + "Also include snapshots with the name": "이름을 포함한 스냅샷도 포함합니다.", + "Also unlock any separate encryption roots that are children of this dataset. Child datasets that inherit encryption from this encryption root will be unlocked in either case.": "또한 이 데이터셋에 포함된 개별 암호화 루트의 잠금을 해제합니다. 각 암호화 루트에서 암호화를 상속받은 하위 데이터셋의 잠금도 해제됩니다.", + "Alternative names that SMB clients can use when connecting to this NAS. Can be no greater than 15 characters.": "SMB 클라이언트가 이 NAS에 연결할 때 사용할 수 있는 대체 이름입니다. 15자 이상으로 정할 수 없습니다.", + "Alternatively, you can start by configuring VDEVs in the wizard first and then opening Manual selection to make adjustments.": "또는, 마법사를 통해 먼저 VDEV를 구성하고 수동 선택을 통해 조절할 수 있습니다.", "Always": "항상", "Always Chroot": "항상 루트", "Always On": "항상 켜짐", "Amazon S3": "Amazon S3", - "Amazon Web Services Key ID. This is found on Amazon AWS by going through My account -> Security Credentials -> Access Keys (Access Key ID and Secret Access Key). Must be alphanumeric and between 5 and 20 characters.": "Amazon Web Services 키 ID. 이는 Amazon AWS에서 내 계정 -> 보안 자격 증명 -> 액세스 키 (액세스 키 ID 및 비밀 액세스 키)를 통해 찾을 수 있습니다. 영숫자 조합으로 520자여야 합니다.", - "Amazon Web Services password. If the Secret Access Key cannot be found or remembered, go to My Account -> Security Credentials -> Access Keys and create a new key pair. Must be alphanumeric and between 8 and 40 characters.": "Amazon Web Services 비밀번호. 비밀 액세스 키를 찾을 수 없거나 기억할 수 없는 경우, 내 계정 -> 보안 자격 증명 -> 액세스 키로 이동하여 새 키 쌍을 만들어야 합니다. 영숫자 조합으로 840자여야 합니다.", - "Amount of disk space that can be used by the selected groups. Entering 0 (zero) allows all disk space.": "선택한 그룹에서 사용 가능한 디스크 공간의 양입니다. 0 (제로)을 입력하면 모든 디스크 공간을 사용할 수 있습니다.", - "Amount of disk space that can be used by the selected users. Entering 0 (zero) allows all disk space to be used.": "선택한 사용자에서 사용 가능한 디스크 공간의 양입니다. 0 (제로)을 입력하면 모든 디스크 공간을 사용할 수 있습니다.", - "An ACL is detected on the selected path but Enable ACL is not selected for this share. ACLs must be stripped from the dataset prior to creating an SMB share.": "선택한 경로에 ACL이 감지되었지만 이 공유에 대해 ACL 사용이 선택되지 않았습니다. SMB 공유를 생성하기 전에 데이터 세트에서 ACL을 제거해야 합니다.", + "Amazon Web Services Key ID. This is found on Amazon AWS by going through My account -> Security Credentials -> Access Keys (Access Key ID and Secret Access Key). Must be alphanumeric and between 5 and 20 characters.": "Amazon Web Services 키 ID입니다. 이는 Amazon AWS에서 내 계정 -> 보안 자격 증명 -> 액세스 키 (액세스 키 ID와 비밀 액세스 키)를 통해 찾을 수 있습니다. 영문자와 숫자의 조합으로 5에서 20자여야 합니다.", + "Amazon Web Services password. If the Secret Access Key cannot be found or remembered, go to My Account -> Security Credentials -> Access Keys and create a new key pair. Must be alphanumeric and between 8 and 40 characters.": "Amazon Web Services 비밀번호입니다. 비밀 액세스 키를 찾을 수 없거나 기억할 수 없는 경우, 내 계정 -> 보안 자격 증명 -> 액세스 키로 이동하여 새 키쌍을 만들어야 합니다. 영문자와 숫자의 조합으로 8에서 40자여야 합니다.", + "Amount of disk space that can be used by the selected groups. Entering 0 (zero) allows all disk space.": "선택한 그룹에서 사용 가능한 디스크 공간의 양입니다. 0(영)을 입력하면 모든 디스크 공간을 사용할 수 있습니다.", + "Amount of disk space that can be used by the selected users. Entering 0 (zero) allows all disk space to be used.": "선택한 사용자에서 사용 가능한 디스크 공간의 양입니다. 0(영)을 입력하면 모든 디스크 공간을 사용할 수 있습니다.", + "An ACL is detected on the selected path but Enable ACL is not selected for this share. ACLs must be stripped from the dataset prior to creating an SMB share.": "선택한 경로의 ACL을 감지했으나 이 공유에 대해 ACL 사용을 선택하지 않았습니다. SMB 공유를 생성하기 전에 데이터셋에서 ACL을 제거해야 합니다.", "An enclosure must be selected when 'Limit Pool to a Single Enclosure' is enabled.": "'단일 인클로저로 풀 제한'이 활성화 된 경우 인클로저를 반드시 선택해야 합니다.", - "An error occurred while sending the review. Please try again later.": "검토내역을 보내는 동안 오류가 발생했습니다. 나중에 다시 시도해주십시오.", + "An error occurred while sending the review. Please try again later.": "검토 내역을 보내는 동안 오류가 발생했습니다. 나중에 다시 시도해주십시오.", "An instance of this app already installed. Click the badge to see installed apps.": "이 앱의 인스턴스가 이미 설치되었습니다. 배지를 눌러 설치된 앱을 봅니다.", "An update is already applied. Please restart the system.": "업데이트가 이미 적용되었습니다. 시스템을 재시작해 주십시오.", "Anonymous User Download Bandwidth": "익명 사용자 다운로드 대역폭", @@ -433,12 +433,12 @@ "App Name": "앱 이름", "App Network": "앱 네트워크", "App Version": "앱 버전", - "App is restarted": "앱 실행됨", - "App is restarting": "앱 실행중", + "App is restarted": "앱 재실행함", + "App is restarting": "앱 재실행 중", "Appdefaults Auxiliary Parameters": "Appdefaults 보조 매개변수", - "Append @realm to cn in LDAP queries for both groups and users when User CN is set).": "사용자 CN을 설정한 경우 그룹 및 사용자의 LDAP 쿼리 중 cn@realm을 덧붙입니다.", + "Append @realm to cn in LDAP queries for both groups and users when User CN is set).": "사용자 CN을 설정한 경우, 그룹 및 사용자의 LDAP 쿼리 중 cn@realm을 덧붙입니다.", "Append Data": "데이터 덧붙임", - "Appends a suffix to the share connection path. This is used to provide unique shares on a per-user, per-computer, or per-IP address basis. Suffixes can contain a macro. See the smb.conf manual page for a list of supported macros. The connectpath **must** be preset before a client connects.": "공유 연결 경로에 접미사를 덧붙입니다. 이를 사용하여 사용자, 컴퓨터 또는 IP 주소별로 고유한 공유를 제공합니다. 접미사는 매크로를 포함할 수 있습니다. 지원되는 매크로 목록은 smb.conf 매뉴얼 페이지를 참고하십시오. 연결 경로는 클라이언트가 연결되기 전에 **반드시** 미리 설정되어야 합니다.", + "Appends a suffix to the share connection path. This is used to provide unique shares on a per-user, per-computer, or per-IP address basis. Suffixes can contain a macro. See the smb.conf manual page for a list of supported macros. The connectpath **must** be preset before a client connects.": "공유 연결 경로에 접미사를 덧붙입니다. 이를 사용하여 사용자 또는 컴퓨터, IP 주소별로 고유한 공유를 제공합니다. 접미사는 매크로를 포함할 수 있습니다. 지원하는 매크로 목록은 smb.conf 설명서 페이지를 참고하십시오. 연결 경로는 클라이언트가 연결되기 전에 **반드시** 미리 설정해야 합니다.", "Application": "애플리케이션", "Application CPU Usage": "애플리케이션 CPU 사용량", "Application Info": "애플리케이션 정보", @@ -448,10 +448,10 @@ "Application Metadata": "애플리케이션 메타데이터", "Application Name": "애플리케이션 이름", "Application Network": "애플리케이션 네트워크", - "Application name must have the following: 1) Lowercase alphanumeric characters can be specified 2) Name must start with an alphabetic character and can end with alphanumeric character 3) Hyphen '-' is allowed but not as the first or last character e.g abc123, abc, abcd-1232": "애플리케이션 이름은 다음을 따라야 합니다: 1) 소문자 영문자 및 숫자 사용 2) 반드시 영문자로 시작하고 영문자 또는 숫자로 마침 3) 하이픈(-)도 쓸 수 있으나 처음이나 끝에 올 수 없음 (예: abc123, abc, abcd-1232)", + "Application name must have the following: 1) Lowercase alphanumeric characters can be specified 2) Name must start with an alphabetic character and can end with alphanumeric character 3) Hyphen '-' is allowed but not as the first or last character e.g abc123, abc, abcd-1232": "애플리케이션 이름은 다음을 따라야 합니다: 1) 영문자 소문자 및 숫자 사용 2) 반드시 영문자로 시작하고 영문자 또는 숫자로 마침 3) 하이픈(-)도 쓸 수 있으나 처음이나 끝에 올 수 없음 (예시: abc123, abc, abcd-1232)", "Applications": "애플리케이션", - "Applications are not running": "애플리케이션이 실행되지 않음", - "Applications not configured": "애플리케이션이 구성되지 않음", + "Applications are not running": "애플리케이션을 실행하지 않음", + "Applications not configured": "애플리케이션을 구성하지 않음", "Applications you install will automatically appear here. Click below and browse available apps to get started.": "설치한 애플리케이션이 표시됩니다. 아래를 눌러 사용 가능한 앱을 찾습니다.", "Applications you install will automatically appear here. Click below and browse the TrueNAS catalog to get started.": "설치한 애플리케이션이 표시됩니다. 아래를 눌러 사용 가능한 TrueNAS 카탈로그를 찾습니다.", "Applied Dataset Quota": "적용된 데이터셋 할당량", @@ -472,11 +472,11 @@ "Apply permissions to child datasets": "하위 데이터셋에 권한 적용", "Apply the same quota critical alert settings as the parent dataset.": "상위 데이터셋과 같은 할당량 심각 경고 설정을 적용합니다.", "Apply the same quota warning alert settings as the parent dataset.": "상위 데이터셋과 같은 할당량 위험 경고 설정을 적용합니다.", - "Apply updates and restart system after downloading.": "업데이트를 적용하고 다운로드를 마친 후 시스템을 재시작합니다.", - "Applying important system or security updates.": "시스템에 중요 업데이트 혹은 보안 업데이트를 적용합니다.", + "Apply updates and restart system after downloading.": "다운로드를 마치면 업데이트를 적용하고 시스템을 재시작합니다.", + "Applying important system or security updates.": "시스템에 중요 업데이트 또는 보안 업데이트를 적용합니다.", "Apps": "앱", "Apps Read": "앱 읽기", - "Apps Service Not Configured": "앱 서비스 구성되지 않음", + "Apps Service Not Configured": "앱 서비스 구성하지 않음", "Apps Service Pending": "앱 서비스 일시중지", "Apps Service Running": "앱 서비스 실행중", "Apps Service Stopped": "앱 서비스 멈춤", @@ -512,7 +512,7 @@ "Are you sure you want to deregister TrueCommand Cloud Service?": "정말 TrueCommand 클라우드 서비스를 해지하시겠습니까?", "Are you sure you want to remove the extent association with {extent}?": "정말 {extent}와(과) 연결된 익스텐트를 제거하시겠습니까?", "Are you sure you want to restore the default set of widgets?": "정말 기본 위젯으로 되돌리시겠습니까?", - "Are you sure you want to start over?": "정말 처음으로 돌아가시겠습니까?", + "Are you sure you want to start over?": "정말 처음부터 다시 시작하시겠습니까?", "Are you sure you want to stop connecting to the TrueCommand Cloud Service?": "정말 TrueCommand 클라우드 서비스와의 연결을 끊으시겠습니까?", "Are you sure you want to sync from peer?": "정말 피어에서 동기화 하시겠습니까?", "Are you sure you want to sync to peer?": "정말 피어로 동기화 하시겠습니까?", @@ -732,7 +732,7 @@ "Capabilities": "기능", "Capacity": "용량", "Capacity Settings": "용량 설정", - "Capture and attach screenshot to the review": "검토내역에 스크린샷을 찍어 첨부함", + "Capture and attach screenshot to the review": "검토 내역에 스크린샷을 찍어 첨부함", "Case Sensitivity": "대소문자 구분", "Catalog": "카탈로그", "Catalog Read": "카탈로그 읽기", @@ -1192,7 +1192,7 @@ "Dataset Space Management": "데이터셋 공간 관리", "Dataset Write": "데이터셋 쓰기", "Dataset ZFS Encryption": "데이터셋 ZFS 암호화", - "Dataset for use by an application. If you plan to deploy container applications, the system automatically creates the ix-apps dataset but this is not used for application data storage.": "애플리케이션이 사용할 데이터셋입니다. 컨테이너 애플리케이션을 배포할 계획이라면, 시스템이 자동으로 ix-apps 데이터셋을 만들겠지만 애플레케이션 데이터 저장소로 사용되진 않습니다.", + "Dataset for use by an application. If you plan to deploy container applications, the system automatically creates the ix-apps dataset but this is not used for application data storage.": "애플리케이션이 사용할 데이터셋입니다. 컨테이너 애플리케이션을 배포할 계획이라면, 시스템이 자동으로 ix-apps 데이터셋을 만들겠지만 애플리케이션 데이터 저장소로 사용되진 않습니다.", "Dataset has no mountpoint": "데이터셋 탑재 지점 없음", "Dataset is locked": "데이터셋 잠김", "Dataset is shared via NFS": "NFS(으)로 공유한 데이터셋", @@ -1698,7 +1698,7 @@ "Enter a list of allowed hostnames or IP addresses. Separate entries by pressing Enter. A more detailed description with examples can be found here.

      If neither *Hosts Allow* or *Hosts Deny* contains an entry, then SMB share access is allowed for any host.

      If there is a *Hosts Allow* list but no *Hosts Deny* list, then only allow hosts on the *Hosts Allow* list.

      If there is a *Hosts Deny* list but no *Hosts Allow* list, then allow all hosts that are not on the *Hosts Deny* list.

      If there is both a *Hosts Allow* and *Hosts Deny* list, then allow all hosts that are on the *Hosts Allow* list.

      If there is a host not on the *Hosts Allow* and not on the *Hosts Deny* list, then allow it.": "허용한 호스트 이름이나 IP 주소의 목록을 입력합니다. Enter키를 눌러 항목을 구분합니다. 예시를 포함한 상세한 설명은 이곳을 참고하십시오.

      *허용한 호스트* 또는 *거부한 호스트*에 항목이 없으면 SMB 공유는 모든 호스트의 접근을 허용합니다.

      만약 *허용한 호스트* 목록은 있고 *거부한 호스트* 목록은 없으면, *허용한 호스트* 목록에 있는 호스트만 허용합니다.

      만약 *거부한 호스트* 목록은 있고 *허용한 호스트* 목록은 없으면, *거부한 호스트* 목록에 있는 호스트를 제외한 모든 호스트를 허용합니다.

      *허용한 호스트*과 *거부한 호스트*목록이 모두 있으면, *허용한 호스트* 목록에 있는 호스트만 허용합니다.

      *허용한 호스트* 및 *거부한 호스트* 목록에 없는 호스트는 허용합니다.", "Enter a list of chat IDs separated by space, comma or semicolon. To find your chat ID send a message to the bot, group or channel and visit https://api.telegram.org/bot(BOT_TOKEN)/getUpdates.": "공백 또는 쉼표, 쌍반점으로 구분한 채팅 ID의 목록을 입력합니다. 채팅 ID를 찾으려면 봇이나 그룹, 채널에 메시지를 보내고 https://api.telegram.org/bot(BOT_TOKEN)/getUpdates(으)로 방문합니다.", "Enter a list of denied hostnames or IP addresses. Separate entries by pressing Enter. If neither *Hosts Allow* or *Hosts Deny* contains an entry, then SMB share access is allowed for any host.

      If there is a *Hosts Allow* list but no *Hosts Deny* list, then only allow hosts on the *Hosts Allow* list.

      If there is a *Hosts Deny* list but no *Hosts Allow* list, then allow all hosts that are not on the *Hosts Deny* list.

      If there is both a *Hosts Allow* and *Hosts Deny* list, then allow all hosts that are on the *Hosts Allow* list.

      If there is a host not on the *Hosts Allow* and not on the *Hosts Deny* list, then allow it.": "거부한 호스트 이름 또는 IP 주소의 목록을 입력합니다. Enter키를 눌러 항목을 구분합니다. *허용한 호스트* 또는 *거부한 호스트*에 항목이 없으면 SMB 공유는 모든 호스트의 접근을 허용합니다.

      만약 *허용한 호스트* 목록은 있고 *거부한 호스트* 목록은 없으면, *허용한 호스트* 목록에 있는 호스트만 허용합니다.

      만약 *거부한 호스트* 목록은 있고 *허용한 호스트* 목록은 없으면, *거부한 호스트* 목록에 있는 호스트를 제외한 모든 호스트를 허용합니다.

      *허용한 호스트*과 *거부한 호스트*목록이 모두 있으면, *허용한 호스트* 목록에 있는 호스트만 허용합니다.

      *허용한 호스트* 및 *거부한 호스트* 목록에 없는 호스트는 허용합니다.", - "Enter a long string of random characters for use as salt for the encryption password. Warning: Always securely back up the encryption salt value! Losing the salt value will result in data loss.": "암호화 비밀번호의 솔트(salt)로 사용할 긴 무작위 문자열을 입력합니다. 위험: 암호화 솔트 값은 안전하게 보관하십시오! 솔트 값을 잃으면 데이터도 잃습니다.", + "Enter a long string of random characters for use as salt for the encryption password. Warning: Always securely back up the encryption salt value! Losing the salt value will result in data loss.": "암호화 비밀번호의 솔트(Salt)로 사용할 긴 무작위 문자열을 입력합니다. 위험: 암호화 솔트 값은 안전하게 보관하십시오! 솔트 값을 잃으면 데이터도 잃습니다.", "Enter a name for the interface. Use the format bondX, vlanX, or brX where X is a number representing a non-parent interface. Read-only when editing an interface.": "인터페이스의 이름을 입력합니다. bondX 또는 vlanX, brX 형식을 사용합니다. X는 상위 인터페이스가 아님을 나타내는 숫자입니다. 인터페이스를 수정하는 중에는 읽기전용으로 바뀝니다.", "Enter a name for the new credential.": "새로운 자격증명의 이름을 입력합니다.", "Enter a name for the share.": "공유할 이름을 입력합니다.", @@ -1721,7 +1721,7 @@ "Enter a user to associate with this service. Keeping the default is recommended.": "이 서비스와 연결할 사용자를 입력합니다. 기본값을 유지하길 권장합니다.", "Enter a username to register with this service.": "이 서비스에 등록할 사용자 이름을 입력합니다.", "Enter a valid IPv4 address.": "유효한 IPv4 주소를 입력합니다.", - "Enter a value in seconds for the the UPS to wait before initiating shutdown. Shutdown will not occur if power is restored while the timer is counting down. This value only applies when Shutdown mode is set to UPS goes on battery.": "UPS가 종료하기 전에 기다릴 시간(초)입니다. 이 시간동안 전원이 복원되면 종료하지 않습니다. 이 값은 종료 모드UPS 배터리로 전환일 경우에만 적용됩니다.", + "Enter a value in seconds for the the UPS to wait before initiating shutdown. Shutdown will not occur if power is restored while the timer is counting down. This value only applies when Shutdown mode is set to UPS goes on battery.": "UPS가 종료하기 전에 기다릴 시간(초)입니다. 이 시간동안 전원이 복원되면 종료하지 않습니다. 이 값은 종료 모드UPS goes on battery(UPS 배터리로 전환)일 경우에만 적용됩니다.", "Enter a value to use for the sysctl variable.": "사용할 sysctl 변수를 입력합니다.", "Enter accounts that have administrative access. See upsd.users(5) for examples.": "관리를 위해 접근을 허용할 계정을 입력합니다. 예시는 upsd.users(5)을(를) 참고하십시오.", "Enter additional smb.conf options. See the Samba Guide for more information on these settings.
      To log more details when a client attempts to authenticate to the share, add log level = 1, auth_audit:5.": "추가 smb.conf 선택사항을 입력합니다. 이 설정에 대한 자세한 내용은 Samba 안내서를 참고하십시오.
      클라이언트가 공유로 인증을 시도할 때 더 상세한 기록을 남기려면 log level = 1, auth_audit:5을(를) 추가합니다.", @@ -1918,7 +1918,7 @@ "Feb": "2월", "Feedback Type": "피드백 유형", "Fenced is not running.": "Fenced를 실행하고 있지 않습니다.", - "Fetch DataStores": "데이터 저장소 가져오기", + "Fetch DataStores": "데이터스토어 가져오기", "Fetching Encryption Summary": "암호화 개요 가져오는 중", "Fetching Encryption Summary for {dataset}": "{dataset}의 암호화 개요 가져오는 중", "Fibre Channel": "광 채널", @@ -2083,8 +2083,8 @@ "Groups": "그룹", "Groups could not be loaded": "그룹 불러올 수 없음", "Groups that can log in using password": "비밀번호로 로그인할 그룹", - "Guest Account": "손님 계정", - "Guest Operating System": "게스트 운영체제", + "Guest Account": "방문자 계정", + "Guest Operating System": "방문자 운영체제", "Guide": "안내서", "HA Disabled": "HA 비활성화 됨", "HA Enabled": "HA 활성화 됨", @@ -2246,7 +2246,7 @@ "If the IPMI out-of-band management interface is on a different VLAN from the management network, enter the IPMI VLAN.": "IPMI 대역 밖 관리 인터페이스가 관리 네트워크의 다른 VLAN에 연결된 경우, IPMI VLAN을 입력합니다.", "If the destination system has snapshots but they do not have any data in common with the source snapshots, destroy all destination snapshots and do a full replication. Warning: enabling this option can cause data loss or excessive data transfer if the replication is misconfigured.": "도착지 시스템에 스냅샷이 있지만 원본 스냅샷과 공통된 데이터가 없는 경우, 모든 도착지 스냅샷을 파기하고 전체 복제를 실행합니다. 위험: 이 선택사항을 활성화하면 복제 작업을 잘못 구성한 경우 데이터를 잃거나 과도한 데이터 전송이 발생할 수 있습니다.", "If you can't use QR code, use this text code instead": "QR코드를 사용할 수 없는 경우, 이 문자 코드를 사용합니다.", - "If {vmName} is still running, the Guest OS did not respond as expected. It is possible to use Power Off or the Force Stop After Timeout option to stop the VM.": "만약 {vmName}이(가) 실행중이라면, 손님 운영체제가 올바로 응답하지 않습니다. 전원 종료 또는 시간 초과시 강제 정지를 선택해 가상머신을 멈출 수 있습니다.", + "If {vmName} is still running, the Guest OS did not respond as expected. It is possible to use Power Off or the Force Stop After Timeout option to stop the VM.": "만약 {vmName}이(가) 실행중이라면, 방문자 운영체제가 올바로 응답하지 않습니다. 전원 종료 또는 시간 초과시 강제 정지를 선택해 가상머신을 멈출 수 있습니다.", "Ignore Builtin": "내장 무시", "Ignore List": "목록 무시", "Image": "이미지", @@ -2306,7 +2306,7 @@ "Init/Shutdown Script updated": "초기화/종료 스크립트 갱신함", "Init/Shutdown Scripts": "초기화/종료 스크립트", "Initial Deployment/Setup": "초기 배포/설정", - "Initial secret authentication key. When an authentication key is not set, no Authentication Protocol is used. If an authentication key is set and an Authentication Protocol is not specified, MD5 is used as the default.
      Must be at least 8 and at most 32 octets long.": "초기 시크릿 인증 키입니다. 인증 키를 설정하지 않았따면 인증 프로토콜을 사용하지 않습니ㅏㄷ. 인증 키는 있으나 인증 프로토콜을 설정하지 않았다면, 기본으로 MD5를 사용합니다.
      최소 8옥텟에서 최대 32옥텟까지 입력할 수 있습니다.", + "Initial secret authentication key. When an authentication key is not set, no Authentication Protocol is used. If an authentication key is set and an Authentication Protocol is not specified, MD5 is used as the default.
      Must be at least 8 and at most 32 octets long.": "초기 시크릿 인증 키입니다. 인증 키를 설정하지 않았따면 인증 프로토콜을 사용하지 않습니다. 인증 키는 있으나 인증 프로토콜을 설정하지 않았다면, 기본으로 MD5를 사용합니다.
      최소 8옥텟에서 최대 32옥텟까지 입력할 수 있습니다.", "Initial secret encryption key. If an encryption key is not set, no Encryption Protocol is used. If an encryption key is set and an Encryption Protocol is not specified, DES is used as the default.
      Must be at least 8 and at most 32 octets long.": "초기 시크릿 암호화 키입니다. 암호화 키를 설정하지 않았다면 암호화 프로토콜을 사용하지 않습니다. 암호화 키는 있으나 암호화 프로토콜을 지정하지 않았다면, 기본으로 DES를 사용합니다.
      최소 8옥텟에서 최대 32옥텟까지 입력할 수 있습니다.", "Initialized": "초기화 됨", "Initializing Apps Service": "앱 서비스 초기화 중", @@ -2410,7 +2410,7 @@ "KMIP Read": "KMIP 읽기", "KMIP Server": "KMIP 서버", "KMIP Write": "KMIP 쓰기", - "KVM implements Hyper-V Enlightenments for Windows guests. These features make Windows think they're running on top of a Hyper-V compatible hypervisor and use Hyper-V specific features. In some cases enabling these Enlightenments might improve usability and performance on the guest.": "KVM이 Windows 손님을 위해 Hyper-V Enlightments를 구현합니다. 이 기능은 Windows가 Hyper-V 호환 하이퍼바이저 위에서 실행 중이라고 생각하고 Hyper-V 특정 기능을 사용하도록 만듭니다. 어떤 경우에는 이러한 Enlightenments를 활성화하면 손님의 사용성과 성능을 향상시킬 수 있습니다.", + "KVM implements Hyper-V Enlightenments for Windows guests. These features make Windows think they're running on top of a Hyper-V compatible hypervisor and use Hyper-V specific features. In some cases enabling these Enlightenments might improve usability and performance on the guest.": "KVM이 Windows 방문자를 위해 Hyper-V Enlightments를 구현합니다. 이 기능은 Windows가 Hyper-V 호환 하이퍼바이저 위에서 실행 중이라고 생각하고 Hyper-V 특정 기능을 사용하도록 만듭니다. 어떤 경우에는 이러한 Enlightenments를 활성화하면 방문자의 사용성과 성능을 향상시킬 수 있습니다.", "Keep": "유지", "Keep Last": "최종 유지", "Keep for": "유지", @@ -2506,7 +2506,7 @@ "Legacy NetBIOS name server. Advertises the SMB service NetBIOS Name. Can be required for legacy SMB1 clients to discover the server. When advertised, the server appears in Network Neighborhood).": "예전 NetBIOS 네임 서버입니다. SMB 서비스를 NetBIOS 이름으로 알립니다. 이전 SMB1 클라이언트가 서버를 찾기 위해 필요합니다. 알림이 시작되면 서버가 네트워크 환경에 나타납니다.", "Legacy OS: Extent block size 512b, TPC enabled, no Xen compat mode, SSD speed": "예전 OS: 익스텐트 블록 크기 512b, TPC 활성화, Xen 비호환 모드, SSD 속도", "Legacy feature.

      Allows the share to host user home directories. Each user is given a personal home directory when connecting to the share which is not accessible by other users. This allows for a personal, dynamic share. Only one share can be used as the home share.": "예전 기능입니다.

      공유가 사용자 홈 디렉터리를 제공하도록 허용합니다. 각 사용자는 공유에 연결할 때 다른 사용자가 접근할 수 없는 개인 홈 디렉터리를 제공받습니다. 이를 통해 개인적이고 동적 공유가 가능합니다. 홈 공유로 사용할 수 있는 공유는 하나뿐입니다.", - "Legacy feature.

      Privileges are the same as the guest account. Guest access is disabled by default in Windows 10 version 1709 and Windows Server version 1903. Additional client-side configuration is required to provide guest access to these clients.

      MacOS clients: Attempting to connect as a user that does not exist in TrueNAS does not automatically connect as the guest account. The Connect As: Guest option must be specifically chosen in MacOS to log in as the guest account. See the Apple documentation for more details.": "예전 기능입니다.

      손님 계정과 같은 권한입니다. 손님 접근은 Windows 10 버전 1709와 Windows Server 버전 1903에서 기본적으로 비활성화 되어 있습니다. 이런 클라이언트에서는 손님 접근을 제공하기 위해 추가적인 클라이언트측 구성이 필요합니다.

      MacOS 클라이언트: TrueNAS에 존재하지 않는 사용자로 연결을 시도할 경우 자동으로 손님 계정으로 연결되지 않습니다. MacOS에서는 손님 계정으로 로그인하려면 다음으로 연결: 방문자 옵션을 특별히 선택해야 합니다. 자세한 내용은 Apple 문서를 참고하십시오.", + "Legacy feature.

      Privileges are the same as the guest account. Guest access is disabled by default in Windows 10 version 1709 and Windows Server version 1903. Additional client-side configuration is required to provide guest access to these clients.

      MacOS clients: Attempting to connect as a user that does not exist in TrueNAS does not automatically connect as the guest account. The Connect As: Guest option must be specifically chosen in MacOS to log in as the guest account. See the Apple documentation for more details.": "예전 기능입니다.

      방문자 계정과 같은 권한입니다. 방문자 접근은 Windows 10 버전 1709와 Windows Server 버전 1903에서 기본적으로 비활성화 되어 있습니다. 이런 클라이언트에서는 방문자 접근을 제공하기 위해 추가적인 클라이언트측 구성이 필요합니다.

      MacOS 클라이언트: TrueNAS에 존재하지 않는 사용자로 연결을 시도할 경우 자동으로 방문자 계정으로 연결되지 않습니다. MacOS에서는 방문자 계정으로 로그인하려면 다음으로 연결: 방문자 옵션을 특별히 선택해야 합니다. 자세한 내용은 Apple 문서를 참고하십시오.", "Level": "수준", "Level 1 - Minimum power usage with Standby (spindown)": "레벨 1 - 최소 전력, 대기모드 (디스크 대기)", "Level 127 - Maximum power usage with Standby": "레벨 127 - 최대 전력, 대기모드", @@ -3140,8 +3140,8 @@ "PCI device does not have a reset mechanism defined and you may experience inconsistent/degraded behavior when starting/stopping the VM.": "PCI 장치에는 재설정 메커니즘이 정의되어 있지 않으므로, 가상머신을 시작/중지할 때 일관되지 않거나 저하된 동작이 발생할 수 있습니다.", "POSIX": "POSIX", "POSIX Permissions": "POSIX 권한", - "PULL": "PULL", - "PUSH": "PUSH", + "PULL": "내리기", + "PUSH": "올리기", "PagerDuty client name.": "PagerDuty 클라이언트 이름입니다.", "Pair this certificate's public key with the Certificate Authority private key used to sign this certificate.": "이 인증서의 공개키를 이 인증서에 서명하는 데 사용한 인증기관의 개인 키와 묶습니다.", "Parent": "상위", @@ -3229,7 +3229,7 @@ "Please specify a valid git repository uri.": "올바른 git 보관소 uri를 지정해 주십시오.", "Please specify branch of git repository to use for the catalog.": "카탈로그로 사용할 git 보관소의 브랜치를 지정해 주십시오.", "Please specify name to be used to lookup catalog.": "카탈로그를 조회하는 데 사용할 이름을 지정해 주십시오.", - "Please specify the name of the image to pull. Format for the name is \"registry/repo/image\"": "가져올 이미지의 이름을 지정해 주십시오. 이름의 형식은 \"registry/repo/image\"입니다.", + "Please specify the name of the image to pull. Format for the name is \"registry/repo/image\"": "내려받을 이미지의 이름을 지정해 주십시오. 이름의 형식은 \"registry/repo/image\"입니다.", "Please specify trains from which UI should retrieve available applications for the catalog.": "UI가 카탈로그에 사용 가능한 애플리케이션을 검색할 버전 구분을 지정해 주십시오.", "Please specify whether to install NVIDIA driver or not.": "NVIDIA 드라이버 설치 여부를 지정해 주십시오.", "Please wait": "기다려 주십시오", @@ -3339,9 +3339,9 @@ "Pruning Deduplication Table": "중복제거 테이블 정리중", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "공개 IP 주소 또는 호스트 이름입니다. FTP 클라이언트가 NAT 장치를 통해 연결할 수 없으면 설정합니다. ", "Public Key": "공개 키", - "Pull": "Pull", + "Pull": "내려받기", "Purpose": "목적", - "Push": "Push", + "Push": "올리기", "Quick": "빠르게", "Quota": "할당량", "Quota (in GiB)": "할당량 (GiB)", @@ -3487,7 +3487,7 @@ "Replication Task Read": "복제작업 읽기", "Replication Task Wizard": "복제작업 마법사", "Replication Task Write": "복제작업 쓰기", - "Replication Task Write Pull": "복제 작업 쓰기 Pull", + "Replication Task Write Pull": "복제 작업 쓰기 내려받기", "Replication Tasks": "복제작업", "Replication Tasks Limit": "복제작업 제한", "Replication from scratch": "기초부터 복제", @@ -3859,7 +3859,7 @@ "Select disks you want to use": "사용할 디스크 선택", "Select files and directories to exclude from the backup.": "백업에서 제외할 파일과 디렉터리를 선택합니다.", "Select files and directories to include from the backup. Leave empty to include everything.": "백업에 포함할 파일과 디렉터리를 선택합니다. 비워두면 전부 포함합니다.", - "Select images you want attach to review": "검토내역에 첨부할 이미지 선택", + "Select images you want attach to review": "검토 내역에 첨부할 이미지 선택", "Select interfaces for SSH to listen on. Leave all options unselected for SSH to listen on all interfaces.": "SSH가 수신할 인터페이스를 선택합니다. 모든 선택사항을 선택하지 않으면 SSH는 모든 인터페이스를 통해 수신합니다.", "Select one or more screenshots that illustrate the problem.": "문제를 보여주는 하나 이상의 스크린샷을 선택합니다.", "Select paths to exclude": "제외할 경로 선택", @@ -3880,7 +3880,7 @@ "Select the country of the organization.": "조직의 국가를 선택합니다.", "Select the days to run resilver tasks.": "리실버 작업을 실행할 요일을 선택합니다.", "Select the device to attach.": "탑재할 장치를 선택합니다.", - "Select the directories or files to be sent to the cloud for Push syncs, or the destination to be written for Pull syncs. Be cautious about the destination of Pull jobs to avoid overwriting existing files.": "Push 동기화를 위해 클라우드로 전송할 디렉터리 혹은 파일을 선택하거나, Pull 동기화를 위해 작성할 도착지를 선택합니다. Pull 작업이 기존 파일을 덮어쓰지 않도록 도착지를 신중하게 선택하십시오.", + "Select the directories or files to be sent to the cloud for Push syncs, or the destination to be written for Pull syncs. Be cautious about the destination of Pull jobs to avoid overwriting existing files.": "올리기 동기화를 위해 클라우드로 전송할 디렉터리 혹은 파일을 선택하거나, 내려받기 동기화를 위해 작성할 도착지를 선택합니다. 내려받기 작업이 기존 파일을 덮어쓰지 않도록 도착지를 신중하게 선택하십시오.", "Select the directories or files to be sent to the cloud for backup.": "클라우드에 백업할 디렉터리나 파일을 선택합니다.", "Select the disks to monitor.": "감시할 디스크를 선택합니다.", "Select the folder to store the backup data.": "백업 데이터를 저장할 폴더를 선택합니다.", @@ -4037,7 +4037,7 @@ "Set to start this VM when the system boots.": "이 가상머신을 시스템을 시작할 때 실행합니다.", "Set to store the encryption key in the TrueNAS database.": "압호화 키를 TrueNAS 데이터베이스에 보관합니다.", "Set to suppress informational messages from the remote server.": "원격 서버로부터의 정보성 메시지를 제한합니다.", - "Set to take a snapshot of the dataset before a PUSH.": "PUSH 하기 전에 데이터셋의 스냅샷을 저장합니다.", + "Set to take a snapshot of the dataset before a PUSH.": "올리기 전에 데이터셋의 스냅샷을 저장합니다.", "Set to take separate snapshots of the dataset and each of its child datasets. Leave unset to take a single snapshot only of the specified dataset without child datasets.": "데이터셋과 하위 데이터셋 각각의 스냅샷을 저장합니다. 설정하지 않으면 하위 데이터셋을 제외하고 지정한 데이터셋의 스냅샷만 저장합니다.", "Set to to enable support for SNMP version 3. See snmpd.conf(5) for configuration details.": "SNMP 버전 3에 대한 지원을 활성화합니다. 자세한 구성방법은 snmpd.conf(5)을(를) 참고하십시오.", "Set to use encryption when replicating data. Additional encryption options will appear.": "데이터를 복제할 때 암호화를 사용합니다. 추가 암호화 선택사항이 나타납니다.", @@ -4467,7 +4467,7 @@ "The TrueNAS controllers do not have the same quantity of disks.": "TrueNAS 컨트롤러에 같은 수의 디스크가 없습니다.", "The URI used to provision an OTP. The URI (which contains the secret) is encoded in a QR Code. To set up an OTP app like Google Authenticator, use the app to scan the QR code or enter the secret manually into the app. The URI is produced by the system when Two-Factor Authentication is first activated.": "OTP를 제공하는 URI입니다. 시크릿을 포함한 URI는 QR코드로 부호화되어 있습니다. Google Authenticator와 같은 OTP 앱에서 설정하려면, 해당 앱으로 QR코드를 스캔하거나 앱에 시크릿 코드를 직접 입력해야 합니다. URI는 2단계 인증이 시스템에서 처음 활성화될 때 생성됩니다.", "The VM could not start because the current configuration could potentially require more RAM than is available on the system. Memory overcommitment allows multiple VMs to be launched when there is not enough free memory for configured RAM of all VMs. Use with caution. Would you like to overcommit memory?": "현재 가상머신 구성이 시스템에서 사용할 수 있는 RAM보다 더 많은 RAM을 요구할 수 있어 가상머신을 실행할 수 없습니다. 메모리 과잉 할당을 통해 실행하고자 하는 가상머신에 구성된 RAM보다 여유 메모리가 적을 때에도 여러 가상머신을 실행할 수 있습니다. 주의해서 사용하십시오. 메모리 과잉 할당을 수행하시겠습니까?", - "The base name is automatically prepended if the target name does not start with iqn. Lowercase alphanumeric characters plus dot (.), dash (-), and colon (:) are allowed. See the Constructing iSCSI names using the iqn.format section of RFC3721.": "기초 이름은 대상 이름이 iqn으로 시작하지 않는 경우 자동으로 붙는 접두어입니다. 소문자 영문자와 숫자, 마침표(.), 대시(-), 쌍점(:)을 사용할 수 있습니다. RFC3721iqn. 형식을 사용해 iSCSI 이름 구성하기 부분을 참고하십시오.", + "The base name is automatically prepended if the target name does not start with iqn. Lowercase alphanumeric characters plus dot (.), dash (-), and colon (:) are allowed. See the Constructing iSCSI names using the iqn.format section of RFC3721.": "기초 이름은 대상 이름이 iqn으로 시작하지 않는 경우 자동으로 붙는 접두사입니다. 소문자 영문자와 숫자, 마침표(.), 대시(-), 쌍점(:)을 사용할 수 있습니다. RFC3721iqn. 형식을 사용해 iSCSI 이름 구성하기 부분을 참고하십시오.", "The cache has been cleared.": "캐시를 비웠습니다.", "The cache is being rebuilt.": "캐시를 재구성하는 중입니다.", "The certificate's public key is used to encipher user data only during key agreement operations. Requires that Key Agreement is also set.": "인증서의 공개 키는 키 계약 작업 중에만 사용자 데이터를 암호화하는 데 사용됩니다. 키 계약 또한 설정되어 있어야 합니다.", @@ -4696,11 +4696,11 @@ "TrueNAS Help": "TrueNAS 도움말", "TrueNAS URL": "TrueNAS 주소", "TrueNAS is Free and Open Source software, which is provided as-is with no warranty.": "TrueNAS는 무료 공개형 소프트웨어로, 어떠한 보증 없이 있는 그대로 제공됩니다.", - "TrueNAS maintains a cache of users and groups for API consumers (including the WebUI). This is a convenience feature that may be disabled if the domain contains large numbers of users and groups or if the caching generates excessive load on the domain controller.": "TrueNAS는 API 사용자(WebUI 포함)를 위해 사용자 및 그룹 캐시를 유지합니다. 이는 편의 기능으로, 도메인에 많은 수의 사용자 및 그룹이 포함되어 있거나 캐시 작업으로 인해 도메인 컨트롤러에 과도한 부하가 발생하는 경우 비활성화할 수 있습니다.", + "TrueNAS maintains a cache of users and groups for API consumers (including the WebUI). This is a convenience feature that may be disabled if the domain contains large numbers of users and groups or if the caching generates excessive load on the domain controller.": "TrueNAS는 API 사용자(WebUI 포함)를 위해 사용자와 그룹 캐시를 유지합니다. 이는 편의 기능으로, 도메인에 많은 수의 사용자와 그룹이 포함되어 있거나 캐시 작업으로 인해 도메인 컨트롤러에 과도한 부하가 발생하는 경우 비활성화할 수 있습니다.", "TrueNAS recommends that the sync setting always be left to the default of \"Standard\" or increased to \"Always\". The \"Disabled\" setting should not be used in production and only where data roll back by few seconds in case of crash or power loss is not a concern.": "TrueNAS는 항상 동기화 설정을 기본값인 \"표준\"으로 두거나 \"항상\"까지만 올릴 것을 권장합니다. \"비활성화\" 설정은 실제 운영 환경에서 사용하면 안 되며, 충돌이나 정전 시 데이터를 몇 초 전으로 되돌리는 것이 문제가 되지 않을 경우에만 사용해야 합니다.", "TrueNAS server must be joined to Active Directory or have at least one local SMB user before creating an SMB share": "TrueNAS 서버는 SMB 공유를 생성하기 전에 반드시 액티브 디렉터리에 연결하거나 하나 이상의 로컬 SMB 사용자를 만들어야 합니다.", "TrueNAS software versions do not match between storage controllers.": "TrueNAS 소프트웨어 버전이 저장소 컨트롤러와 일치하지 않습니다.", - "Trust Guest Filters": "신뢰하는 손님 필터", + "Trust Guest Filters": "신뢰하는 방문자 필터", "Tue": "화", "Tuesday": "화요일", "Tunable": "튜너블", @@ -4846,7 +4846,7 @@ "Usage Collection": "사용정보 수집", "Usage collection": "사용정보 수집", "Usages": "사용량", - "Use rclone crypt to manage data encryption during PUSH or PULL transfers:

      PUSH: Encrypt files before transfer and store the encrypted files on the remote system. Files are encrypted using the Encryption Password and Encryption Salt values.

      PULL: Decrypt files that are being stored on the remote system before the transfer. Transferring the encrypted files requires entering the same Encryption Password and Encryption Salt that was used to encrypt the files.

      Additional details about the encryption algorithm and key derivation are available in the rclone crypt File formats documentation.": "Rclone Crypt을(를) 사용해 PUSH 혹은 PULL 전송시 데이터를 암호화합니다:

      PUSH: 파일 전송 이전에 암호화하여 암호화된 파일을 원격 시스템에 저장합니다. 파일은 암호화 비밀번호암호화 솔트(salt)로 암호화됩니다.

      PULL: 원격 시스템에 저장된 암호화된 파일을 전송하기 전에 복호화합니다. 암호화된 파일을 전송하기 위해선 암호화할 떄와 동일한 암호화 비밀번호암호화 솔트(salt)가 필요합니다.

      암호화 알고리듬과 키 파생에 대한 추가 정보는 Rclone Crypt 파일 형식 문서를 참고하십시오.", + "Use rclone crypt to manage data encryption during PUSH or PULL transfers:

      PUSH: Encrypt files before transfer and store the encrypted files on the remote system. Files are encrypted using the Encryption Password and Encryption Salt values.

      PULL: Decrypt files that are being stored on the remote system before the transfer. Transferring the encrypted files requires entering the same Encryption Password and Encryption Salt that was used to encrypt the files.

      Additional details about the encryption algorithm and key derivation are available in the rclone crypt File formats documentation.": "Rclone Crypt을(를) 사용해 올리기 혹은 내려받기 전송시 데이터를 암호화합니다:

      올리기: 파일 전송 이전에 암호화하여 암호화된 파일을 원격 시스템에 저장합니다. 파일은 암호화 비밀번호암호화 솔트(Salt)로 암호화됩니다.

      내려받기: 원격 시스템에 저장된 암호화된 파일을 전송하기 전에 복호화합니다. 암호화된 파일을 전송하기 위해선 암호화할 떄와 동일한 암호화 비밀번호암호화 솔트(Salt)가 필요합니다.

      암호화 알고리듬과 키 파생에 대한 추가 정보는 Rclone Crypt 파일 형식 문서를 참고하십시오.", "Use --fast-list": "--fast-list 사용", "Use Absolute Paths": "절대경로 사용", "Use Apple-style Character Encoding": "Apple 방식의 문자열 인코딩 사용", @@ -5080,10 +5080,10 @@ "When a user is selected, the root user is limited to the permissions of that user.": "사용자를 선택하면, root 사용자의 권한을 해당 사용자의 권한으로 제한합니다.", "When battery power is low or the shutdown timer ends, enter the custom command to overrule the default shutdown command.": "배터리 전원이 부족하거나 종료 타이머가 끝날때 기본 종료 명령어를 대체할 사용자 정의 명령어를 입력합니다.", "When both days of month and days of week have restrictions, these restrictions work as an OR condition.": "월별 날짜와 요일 모두에 제한이 있는 경우, 이러한 제한은 OR 조건으로 작동합니다.", - "When checked it will ensure that the guest always has access to a video device. For headless installations like ubuntu server this is required for the guest to operate properly. However for cases where consumer would like to use GPU passthrough and does not want a display device added should uncheck this.": "선택하면 손님 계정이 항상 영상 장치에 접근할 수 있습니다. 우분투 서버와 같이 헤드리스 설치의 경우 손님 계정이 올바로 작업하기 위해 이것이 필요합니다. 하지만 고객이 GPU 패스스루를 사용하고 영상 출력 장치를 추가하지 않을 경우에는 이 선택을 해제해야 합니다.", + "When checked it will ensure that the guest always has access to a video device. For headless installations like ubuntu server this is required for the guest to operate properly. However for cases where consumer would like to use GPU passthrough and does not want a display device added should uncheck this.": "선택하면 방문자 계정이 항상 영상 장치에 접근할 수 있습니다. 우분투 서버와 같이 헤드리스 설치의 경우 방문자 계정이 올바로 작업하기 위해 이것이 필요합니다. 하지만 고객이 GPU 패스스루를 사용하고 영상 출력 장치를 추가하지 않을 경우에는 이 선택을 해제해야 합니다.", "When checked, the primary group membership is fetched from the LDAP attributes (gidNumber). When not checked, the primary group membership is calculated via the \"primaryGroupID\" LDAP attribute.": "선택하면 기본 그룹 구성원을 LDAP 속성(gidNumber)에서 가져옵니다. 선택하지 않으면 기본 그룹 구성원을 \"primaryGroupID\" LDAP 속성으로 계산합니다.", "When checked, winbind will retrieve the login shell and home directory from the LDAP attributes. When not checked or when the AD LDAP entry lacks the SFU attributes the smb4.conf parameters template shell and template homedir are used.": "선택하면 winbind가 LDAP 속성에서 로그인 셸과 홈 디렉터리를 찾습니다. 선택하지 않거나 AD LDAP에 SFU 속성이 없는 경우 smb4.conf 매개변수 template shelltemplate homedir를 사용합니다.", - "When not specified, guest system is given fixed amount of memory specified above.\nWhen minimum memory is specified, guest system is given memory within range between minimum and fixed as needed.": "지정하지 않으면 손님 시스템에는 위에서 지정한 고정된 메모리를 부여합니다.\n최소 메모리가 지정된 경우, 손님 시스템의 필요에 따라 최소값과 고정값 사이에서 필요한만큼 메모리를 부여합니다.", + "When not specified, guest system is given fixed amount of memory specified above.\nWhen minimum memory is specified, guest system is given memory within range between minimum and fixed as needed.": "지정하지 않으면 방문자 시스템에는 위에서 지정한 고정된 메모리를 부여합니다.\n최소 메모리가 지정된 경우, 방문자 시스템의 필요에 따라 최소값과 고정값 사이에서 필요한만큼 메모리를 부여합니다.", "When number of vcpus is equal to number of cpus in CPU set vcpus can be automatically pinned into CPU set. Pinning is done by mapping each vcpu into single cpu number in following the order in CPU set. This will improve CPU cache locality and can reduce possible stutter in GPU passthrough VMs.": "vCPU의 수가 CPU 세트의 CPU 수와 같으면 CPU 세트로 자동 고정될 수 있습니다. 고정은 CPU 세트의 순서에 따라 각 vCPU를 단일 CPU 번호로 맵핑하여 완료합니다. 이를 통해 CPU 캐시 지역성을 향상하고 GPU 패스스루 VM에서 발생할 수 있는 끊김 현상을 줄일 수 있습니다.", "When replicated snapshots are deleted from the destination system:
      Same as Source: use the configured Snapshot Lifetime value from the source dataset periodic snapshot task.
      Never Delete: never delete snapshots from the destination system.
      Custom: set a how long a snapshot remains on the destination system. Enter a number and choose a measure of time from the drop-down.": "복제한 스냅샷이 도착지 시스템에서 삭제되는 경우:
      원본과 같음: 원본 데이터셋의 주기적인 스냅샵 작업에서 구성한 스냅샷 수명을 사용합니다.
      삭제하지 않음: 도착지 시스템에서 스냅샷을 삭제하지 않습니다.
      사용자 정의: 도착지 시스템에 스냅샷을 얼마나 오래 남겨둘지 설정합니다. 숫자를 입력하고 시간 척도를 선택하십시오.", "When replicated snapshots are deleted from the destination system:
      • Same as Source: use the Snapshot Lifetime from the source periodic snapshot task.
      • Custom: define a Snapshot Lifetime for the destination system.
      • None: never delete snapshots from the destination system.
      • ": "복제한 스냅샷이 도착지 시스템에서 삭제되는 경우:
        • 원본과 같음: 원본 데이터셋의 주기적인 스냅샵 작업에서 구성한 스냅샷 수명을 사용합니다.
        • 사용자 정의: 도착지 시스템에 스냅샷 수명을 지정합니다.
        • 없음: 도착지 시스템에서 스냅샷을 삭제하지 않습니다.
        • ", @@ -5217,7 +5217,7 @@ "mountd(8) bind port": "mountd(8) 바인드 포트", "never ran": "실행하지 않음", "of": "/", - "on this enclosure.": "이(가) 이 인클로져에 있습니다.", + "on this enclosure.": "이(가) 이 인클로저에 있습니다.", "or": "또는", "owner@": "owner@", "pCloud": "pCloud", @@ -5319,4 +5319,4 @@ "{used} of {total} ({used_pct})": "{total} 중 {used} ({used_pct})", "{version} is available!": "{version}이 준비되었습니다!", "{view} on {enclosure}": "{enclousure}의 {view}" -} \ No newline at end of file +} From 30be38a41869cce11bad151be23bf5744f0187d6 Mon Sep 17 00:00:00 2001 From: bugclerk <40872210+bugclerk@users.noreply.github.com> Date: Wed, 8 Jan 2025 10:29:48 -0500 Subject: [PATCH 31/32] NAS-133128 / 25.04 / Simplify CPU widget logic (by undsoft) (#11310) --- .../cpu-core-bar.component.spec.ts | 20 ++---------- .../cpu-core-bar/cpu-core-bar.component.ts | 31 +++++++------------ .../widget-interface.component.ts | 1 + src/assets/i18n/ko.json | 16 +++++----- 4 files changed, 24 insertions(+), 44 deletions(-) diff --git a/src/app/pages/dashboard/widgets/cpu/common/cpu-core-bar/cpu-core-bar.component.spec.ts b/src/app/pages/dashboard/widgets/cpu/common/cpu-core-bar/cpu-core-bar.component.spec.ts index beaedb70d31..0b38712ae72 100644 --- a/src/app/pages/dashboard/widgets/cpu/common/cpu-core-bar/cpu-core-bar.component.spec.ts +++ b/src/app/pages/dashboard/widgets/cpu/common/cpu-core-bar/cpu-core-bar.component.spec.ts @@ -1,5 +1,4 @@ import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; -import { provideMockStore } from '@ngrx/store/testing'; import { ChartData } from 'chart.js'; import { MockDirective } from 'ng-mocks'; import { BaseChartDirective } from 'ng2-charts'; @@ -8,7 +7,6 @@ import { of } from 'rxjs'; import { ThemeService } from 'app/modules/theme/theme.service'; import { WidgetResourcesService } from 'app/pages/dashboard/services/widget-resources.service'; import { CpuCoreBarComponent } from 'app/pages/dashboard/widgets/cpu/common/cpu-core-bar/cpu-core-bar.component'; -import { selectSystemInfo } from 'app/store/system-info/system-info.selectors'; describe('CpuCoreBarComponent', () => { let spectator: Spectator; @@ -41,18 +39,6 @@ describe('CpuCoreBarComponent', () => { mockProvider(ThemeService, { getRgbBackgroundColorByIndex: () => [0, 0, 0], }), - provideMockStore({ - selectors: [ - { - selector: selectSystemInfo, - value: { - model: 'Intel(R) Xeon(R) Silver 4210R CPU', - cores: 4, - physical_cores: 2, - }, - }, - ], - }), ], }); @@ -67,10 +53,10 @@ describe('CpuCoreBarComponent', () => { const data = chart.data as ChartData<'bar'>; expect(data).toMatchObject({ - labels: ['1', '2'], + labels: ['1', '2', '3', '4'], datasets: [ - { data: [36, 79] }, - { data: [31, 83] }, + { data: [6, 30, 70, 9] }, + { data: [31, 83, 0, 0] }, ], }); }); diff --git a/src/app/pages/dashboard/widgets/cpu/common/cpu-core-bar/cpu-core-bar.component.ts b/src/app/pages/dashboard/widgets/cpu/common/cpu-core-bar/cpu-core-bar.component.ts index d09fbc7d315..ec4914000f1 100644 --- a/src/app/pages/dashboard/widgets/cpu/common/cpu-core-bar/cpu-core-bar.component.ts +++ b/src/app/pages/dashboard/widgets/cpu/common/cpu-core-bar/cpu-core-bar.component.ts @@ -5,7 +5,6 @@ import { } from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; import { TinyColor } from '@ctrl/tinycolor'; -import { Store } from '@ngrx/store'; import { ChartData, ChartOptions } from 'chart.js'; import { BaseChartDirective } from 'ng2-charts'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @@ -14,8 +13,6 @@ import { AllCpusUpdate } from 'app/interfaces/reporting.interface'; import { GaugeData } from 'app/modules/charts/view-chart-gauge/view-chart-gauge.component'; import { ThemeService } from 'app/modules/theme/theme.service'; import { WidgetResourcesService } from 'app/pages/dashboard/services/widget-resources.service'; -import { AppState } from 'app/store'; -import { waitForSystemInfo } from 'app/store/system-info/system-info.selectors'; @Component({ selector: 'ix-cpu-core-bar', @@ -28,15 +25,18 @@ export class CpuCoreBarComponent { hideTemperature = input(false); hideUsage = input(false); - protected sysInfo = toSignal(this.store$.pipe(waitForSystemInfo)); - protected cpuData = toSignal(this.resources.realtimeUpdates$.pipe( map((update) => update.fields.cpu), )); - protected isLoading = computed(() => !this.cpuData() || !this.sysInfo()); - protected coreCount = computed(() => this.sysInfo().physical_cores); - protected hyperthread = computed(() => this.sysInfo().cores !== this.sysInfo().physical_cores); + protected isLoading = computed(() => !this.cpuData()); + protected coreCount = computed(() => { + const cpus = Object.keys(this.cpuData()) + .map(Number) + .filter((key) => !Number.isNaN(key)); + + return Math.max(...cpus) + 1; + }); stats = computed(() => { const data = this.parseCpuData(this.cpuData()); @@ -109,7 +109,6 @@ export class CpuCoreBarComponent { }); constructor( - private store$: Store, private resources: WidgetResourcesService, private theme: ThemeService, ) {} @@ -119,17 +118,11 @@ export class CpuCoreBarComponent { const temperatureColumn: GaugeData = ['Temperature']; for (let i = 0; i < this.coreCount(); i++) { - const usageIndex = this.hyperthread() ? i * 2 : i; - - const usageCore = this.hyperthread() - ? (cpuData[usageIndex].usage + cpuData[usageIndex + 1].usage).toFixed(1) - : cpuData[usageIndex].usage.toFixed(1); - - usageColumn.push(parseInt(usageCore)); + const usage = parseInt(cpuData[i]?.usage?.toFixed(1) || '0'); + const temperature = parseInt(cpuData.temperature_celsius?.[i]?.toFixed(0) || '0'); - if (cpuData.temperature_celsius) { - temperatureColumn.push(parseInt(cpuData.temperature_celsius[i].toFixed(0))); - } + usageColumn.push(usage); + temperatureColumn.push(temperature); } return [ diff --git a/src/app/pages/dashboard/widgets/network/widget-interface/widget-interface.component.ts b/src/app/pages/dashboard/widgets/network/widget-interface/widget-interface.component.ts index 039db393e8d..253c8a6ecec 100644 --- a/src/app/pages/dashboard/widgets/network/widget-interface/widget-interface.component.ts +++ b/src/app/pages/dashboard/widgets/network/widget-interface/widget-interface.component.ts @@ -86,6 +86,7 @@ export class WidgetInterfaceComponent implements WidgetComponent update.fields.interfaces[interfaceId]), )), + filter(Boolean), tap((realtimeUpdate) => { this.cachedNetworkStats.update((cachedStats) => { return [ diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index 078abe0c99c..f985ff6d249 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -1,11 +1,6 @@ { "": "", - "Maximum file size is limited to {maxSize}.": "최대 파일 크기는 {maxSize} 입니다.", - "Prune By": "정리:", - "Pull Image": "이미지 내려받기", - "Pulling...": "내려받는 중...", - "Quiet": "조용히", - "Tail Lines": "셸에 표시할 마지막 줄 수", + "A single bandwidth limit or bandwidth limit schedule in rclone format. Separate entries by pressing Enter. Example: 08:00,512 12:00,10MB 13:00,512 18:00,30MB 23:00,off. Units can be specified with a suffix of b (default), k, M, or G. See rclone --bwlimit.": "", "\n It looks like your session has been inactive for more than {lifetime} seconds.
          \n For security reasons we will log you out at {time}.\n ": "세션의 비활성화 시간이 {lifetime}초를 넘었습니다.
          보안을 위해 {time}에 로그아웃 되었습니다.", " Est. Usable Raw Capacity": " 사용 가능한 원시 용량 추정", " When the UPS Mode is set to slave. Enter the open network port number of the UPS Master system. The default port is 3493.": " UPS 모드슬레이브일 때, 마스터 UPS 시스템의 네트워크 포트 번호를 입력합니다. 기본 포트는 3493입니다.", @@ -98,7 +93,6 @@ "A User Access Token for Box. An access token enables Box to verify a request belongs to an authorized session. Example token: T9cE5asGnuyYCCqIZFoWjFHvNbvVqHjl.": "Box의 사용자 접근 토큰입니다. 접근 토큰을 통해 Box는 요청이 승인된 세션에 속하는지 검증합니다. 토큰 예시: T9cE5asGnuyYCCqIZFoWjFHvNbvVqHjl", "A message with verification instructions has been sent to the new email address. Please verify the email address before continuing.": "새 이메일 주소로 검증 방법을 전송했습니다. 계속하기 전에 이메일 주소를 검증해 주십시오.", "A single bandwidth limit or bandwidth limit schedule in rclone format. Separate entries by pressing Enter. Example: 08:00,512 12:00,10MB 13:00,512 18:00,30MB 23:00,off. Units can be specified with a suffix of b, k (default), M, or G. See rclone --bwlimit.": "Rclone 형식의 단일 대역폭 제한 또는 대역폭 제한 일정입니다. Enter키를 눌러 항목을 구분합니다. 예시: 08:00,512 12:00,10MB 13:00,512 18:00,30MB 23:00,off. 단위는 b 또는 k (기본), M, G의 접미사로 지정할 수 있습니다. rclone --bwlimit을(를) 참고하십시오.", - "A single bandwidth limit or bandwidth limit schedule in rclone format. Separate entries by pressing Enter. Example: 08:00,512 12:00,10MB 13:00,512 18:00,30MB 23:00,off. Units can be specified with a suffix of b (default), k, M, or G. See rclone --bwlimit.": "Rclone 유형에 단일 대역폭 제한이나 대역폭 제한 일정을 수립합니다. Enter키를 눌러 항목을 구분합니다. 예시: 08:00,512 12:00,10MB 13:00,512 18:00,30MB 23:00,off. 단위는 b (기본) 또는 k, M, G의 접미사로 지정할 수 있습니다. Rclone --bwlimit을(를) 참고하십시오.", "A smaller block size can reduce sequential I/O performance and space efficiency.": "작은 블록 크기는 순차 I/O 성능과 공간 효율성을 떨어뜨릴 수 있습니다.", "A stripe log VDEV may result in data loss if it fails combined with a power outage.": "스트라이프 기록 VDEV는 정전시 데이터의 손실이 발생할 수 있습니다.", "A stripe {vdevType} VDEV is highly discouraged and will result in data loss if it fails": "스트라이프 {vdevType} VDEV는 오작동시 데이터 손실의 우려가 있으므로 매우 권장하지 않습니다.", @@ -2685,6 +2679,7 @@ "Maximum Passive Port": "최대 패시브 포트", "Maximum Transmission Unit, the largest protocol data unit that can be communicated. The largest workable MTU size varies with network interfaces and equipment. 1500 and 9000 are standard Ethernet MTU sizes. Leaving blank restores the field to the default value of 1500.": "최대 전송 단위(MTU)는 통신할 수 있는 가장 큰 프로토콜 데이터 단위입니다. 작동하는 최대 MTU 크기는 네트워크 인터페이스와 장비에 따라 다릅니다. 15009000이 표준 이더넷 MTU 크기입니다. 비워두면 기본값인 1500으로 되돌립니다.", "Maximum Upload Parts": "최대 업로드 부분", + "Maximum file size is limited to {maxSize}.": "최대 파일 크기는 {maxSize} 입니다.", "Maximum number of replication tasks being executed simultaneously.": "동시에 실행할 수 있는 복제 작업의 최대 수입니다.", "Maximum number of seconds a client is allowed to spend connected, after\nauthentication, without issuing a command which results in creating an active or passive data connection\n(i.e. sending/receiving a file, or receiving a directory listing).": "클라이언트 인증 후 활성 또는 수동 데이터 연결(예: 파일 송수신 또는 디렉터리 목록 수신)을 생성하는 명령어를 실행하지 않고도 연결 상태를 유지할 최대 시간(초)입니다.", "Maximum number of seconds that proftpd will allow clients to stay connected without receiving\nany data on either the control or data connection.": "proftpd이(가) 클라이언트가 제어 또는 데이터 연결에서 데이터를 수신하지 않고도 연결 상태를 유지할 최대 시간(초)입니다.", @@ -3335,14 +3330,18 @@ "Proxy": "프록시", "Proxy saved": "프록시 저장함", "Prune": "정리", + "Prune By": "정리:", "Prune Deduplication Table": "중복제거 테이블 정리", "Pruning Deduplication Table": "중복제거 테이블 정리중", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "공개 IP 주소 또는 호스트 이름입니다. FTP 클라이언트가 NAT 장치를 통해 연결할 수 없으면 설정합니다. ", "Public Key": "공개 키", "Pull": "내려받기", + "Pull Image": "이미지 내려받기", + "Pulling...": "내려받는 중...", "Purpose": "목적", "Push": "올리기", "Quick": "빠르게", + "Quiet": "조용히", "Quota": "할당량", "Quota (in GiB)": "할당량 (GiB)", "Quota Fill Critical": "할당량 채움 심각", @@ -4403,6 +4402,7 @@ "Table Actions of Expandable Table": "확장 가능한 테이블의 테이블 동작", "Tag": "태그", "Tags": "태그", + "Tail Lines": "셸에 표시할 마지막 줄 수", "Take Snapshot": "스냅샷 수행", "Take screenshot of the current page": "이 페이지의 스크린샷을 찍기", "Target": "대상", @@ -5319,4 +5319,4 @@ "{used} of {total} ({used_pct})": "{total} 중 {used} ({used_pct})", "{version} is available!": "{version}이 준비되었습니다!", "{view} on {enclosure}": "{enclousure}의 {view}" -} +} \ No newline at end of file From 5b85ac27c2bdb3c7b58cef638badd2232803f958 Mon Sep 17 00:00:00 2001 From: bugclerk <40872210+bugclerk@users.noreply.github.com> Date: Wed, 8 Jan 2025 12:17:30 -0500 Subject: [PATCH 32/32] NAS-133299 / 25.04 / Extend window not showing up for spares (by undsoft) (#11311) --- .../disk-details-panel/disk-details-panel.component.ts | 2 +- .../raidz-extend-dialog/raidz-extend-dialog.component.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/app/pages/storage/modules/devices/components/disk-details-panel/disk-details-panel.component.ts b/src/app/pages/storage/modules/devices/components/disk-details-panel/disk-details-panel.component.ts index 1420e0373c7..6489d10873c 100644 --- a/src/app/pages/storage/modules/devices/components/disk-details-panel/disk-details-panel.component.ts +++ b/src/app/pages/storage/modules/devices/components/disk-details-panel/disk-details-panel.component.ts @@ -66,7 +66,7 @@ export class DiskDetailsPanelComponent { }); protected hasSmartTestSupport = computed(() => { - return this.disksWithSmartTestSupport().includes(this.disk().devname); + return this.disk && this.disksWithSmartTestSupport().includes(this.disk().devname); }); onCloseMobileDetails(): void { diff --git a/src/app/pages/storage/modules/devices/components/zfs-info-card/raidz-extend-dialog/raidz-extend-dialog.component.ts b/src/app/pages/storage/modules/devices/components/zfs-info-card/raidz-extend-dialog/raidz-extend-dialog.component.ts index 4e600d84024..d5950408211 100644 --- a/src/app/pages/storage/modules/devices/components/zfs-info-card/raidz-extend-dialog/raidz-extend-dialog.component.ts +++ b/src/app/pages/storage/modules/devices/components/zfs-info-card/raidz-extend-dialog/raidz-extend-dialog.component.ts @@ -106,6 +106,9 @@ export class RaidzExtendDialogComponent { const minimumSize = this.data.vdev.children.reduce((acc, topologyDisk) => { const disk = diskDictionary[topologyDisk.disk]; + if (!disk) { + return acc; + } return disk.size < acc ? disk.size : acc; }, Number.MAX_SAFE_INTEGER);