# base errors
ErrInvalidParams: "Invalid request parameters: {{ .detail }}"
ErrTokenParse: "Token generation error: {{ .detail }}"
ErrInitialPassword: "Incorrect initial password"
ErrInternalServer: "Internal server error: {{ .detail }}"
ErrInternalServerKey: "Internal server error:"
ErrRecordExist: "Record already exists"
ErrRecordNotFound: "Record not found"
ErrStructTransform: "Type conversion failed: {{ .detail }}"
ErrNotSupportType: "Unsupported type: {{ .name }}"
ErrDemoEnvironment: "Demo server, this operation is prohibited!"
ErrCmdTimeout: "Command execution timeout!"
ErrPortInUsed: "The {{ .name }} port is already in use!"
ErrFileNotFound: "{{ .name }} file does not exist"
ErrReqFailed: "{{.name}} request failed: {{ .err }}"

# request and entrance
ErrNoSuchHost: "Host resolution failed: {{ .err }}"
ErrHttpReqNotFound: "Requested resource not found: {{ .err }}"
ErrHttpReqFailed: "Request failed {{ .err }}"
ErrHttpReqTimeOut: "Request timed out {{ .err }}"
ErrCreateHttpClient: "Failed to create request {{ .err }}"
ErrProxy: "Request failed; check this node status: {{ .detail }}"
ErrProxySetting: "Proxy server information unavailable {{ .err }}, check and try again!"
ErrEntrance: "Security entrance information error, check and try again!"
ErrEntranceFormat: "Security entry {{ .name }} is not supported. Check and try again."

# login and security
ErrNotLogin: "User not logged in: {{ .detail }}"
ErrSessionDataNotFound: "Session expired"
ErrSessionDataFormat: "Invalid session data format"
ErrPasswordExpired: "Password expired: {{ .detail }}"
ErrLoginLocked: "Too many failed attempts. Login is temporarily locked for 5 minutes."
ErrApiConfigStatusInvalid: "API access disabled: {{ .detail }}"
ErrApiConfigKeyInvalid: "Invalid API key: {{ .detail }}"
ErrApiConfigIPInvalid: "The API request IP is not on the whitelist: {{ .detail }}"
ErrApiConfigDisable: "This interface prohibits API calls: {{ .detail }}"
ErrApiConfigKeyTimeInvalid: "Invalid API timestamp: {{ .detail }}"
ErrPasskeyDisabled: "Passkey requires HTTPS to be enabled"
ErrPasskeyNotConfigured: "No passkey configured"
ErrPasskeyLimit: "Passkey limit reached (max 5)"
ErrPasskeySession: "Passkey session expired or invalid"
ErrPasskeyDuplicate: "Passkey already exists"
ErrPasskeyVerify: "Passkey verification failed"
ErrOIDCNotEnabled: "OIDC authentication is not enabled"
ErrOIDCConfigInvalid: "OIDC configuration is invalid"
ErrOIDCConfigChanged: "OIDC configuration changed; start authentication again"
ErrOIDCDiscoveryFailed: "Failed to discover the OIDC provider configuration"
ErrOIDCIssuerMismatch: "The OIDC issuer does not match the configured issuer"
ErrOIDCUnsupportedPKCE: "The OIDC provider does not support the required PKCE method"
ErrOIDCUnsupportedSigningAlgorithm: "The OIDC signing algorithm is not supported"
ErrOIDCInvalidState: "The OIDC login state is invalid or has already been used"
ErrOIDCLoginExpired: "The OIDC login request has expired; try again"
ErrOIDCTokenExchange: "Failed to exchange the OIDC authorization code"
ErrOIDCTokenValidation: "Failed to validate the OIDC token"
ErrOIDCUserInfoValidation: "Failed to validate OIDC user information"
ErrOIDCNameClaimMissing: "The configured OIDC user name claim is missing or invalid"
ErrOIDCNameConflictLocal: "The OIDC user name conflicts with a local user"
ErrOIDCNameConflictLDAP: "The OIDC user name conflicts with an LDAP user"
ErrOIDCNameConflictOIDC: "The OIDC user name conflicts with another OIDC identity"
ErrOIDCDefaultRoleInvalid: "The default role configured for OIDC is unavailable"
ErrOIDCPrivateAddressDenied: "The OIDC endpoint address is not allowed by the network security policy"
ErrOIDCTLSValidation: "OIDC TLS certificate validation failed"
ErrOIDCTestExpired: "The OIDC browser test has expired; run the test again"
ErrOIDCLocalCredentialsReadonly: "OIDC user names and passwords are managed by the identity provider and cannot be changed locally."
ErrOIDCPasswordExpirationUnsupported: "OIDC users do not use the local password expiration policy."
ErrOIDCInternal: "OIDC authentication encountered an internal error. Please try again later."

# user and permission
ErrNoSuchUser: "User information not found, check and try again!"
ErrToMaster: "This user does not have permission to perform this operation on the master node. Check and try again!"
ErrToNode: "This user does not have permission to perform this operation on this node. Check and try again!"
ErrRBAC: "Insufficient user permissions. This operation cannot be performed. Check and try again!"
ErrNoneNode: "This user has no node permissions. Contact an administrator or check and try again!"
ErrOnlySuperAdmin: "Only super admins can use this feature!"
ErrRolePresetCannotDelete: "System preset roles cannot be deleted"
ErrRolePresetCannotUpdate: "System preset roles cannot be updated"
ErrRoleBoundToUser: "This role is already bound to users and cannot be deleted"
ErrRolePresetCannotBind: "System preset roles cannot be assigned to users"
ErrNodeAdminMasterForbidden: "Node Admin permissions cannot be added to the master node"
ErrSuperAdminCannotDelete: "Super admin users cannot be deleted"
ErrGroupIsDefault: "Default group, unable to delete"
ErrGroupIsInUse: "The group is in use and cannot be deleted."

# license
LicenseCheck: 'Check if the license is available'
ErrLicenseInUsed: 'The license is already bound. Check and try again!'
ErrLicenseExpired: 'The license has expired. Check and try again!'
ErrLicense: "License format error, check and retry!"
ErrLicenseCheck: "License validation failed, check and retry!"
ErrXpackVersion: "License validation failed, this license is version-limited, cannot import, check and retry!"
ErrLicenseSave: "Failed to save license information, error {{ .err }}, retry!"
ErrLicenseSync: "License synchronization failed, no license info detected in database!"
ErrLicenseExist: "This license record already exists. You can directly go to the license page for node binding."
ErrXpackNotFound: "This section requires Business Edition. Import a license in Panel Settings > License."
ErrXpackExceptional: "This section requires Business Edition. Sync the license status in Panel Settings > License."
ErrXpackLost: "The license retry limit has been reached. Go to Panel Settings > License and run a manual sync."
ErrEnterpriseLicenseRequired: "Enterprise Edition license is not imported. Import a license first."
ErrDeviceLost: "Required files for license verification are missing, check and try again!"
ErrDeviceErr: "Current environment does not match the license import environment. Edit the license and re-import."
ErrXpackTimeout: "Request timeout, network connection might be unstable, try again later!"
ErrUnbindMaster: "Nodes exist in node management. Remove nodes first, then unbind the current license."
ErrFreeNodeLimit: "The number of nodes that can be added has reached the limit. Purchase and try again."
ErrNodeBound: "This license is bound to another node, check and retry!"
ErrNodeBoundDelete: "This license is bound and does not support delete operations. Check and try again!"
ErrNodeBoundLimit: "The current free node has reached its limit, check and try again!"
ErrLicenseFree: "Free nodes are available only when the license is correctly bound to a node. Verify and retry."
ErrLicenseUnbind: "Community Edition nodes are still linked to this license. Unbind them in Panel Settings > License and try again."
ErrLicenseBindCount: "The new license free node count is less than the currently linked Community Edition node count. Check and try again."
ErrNoSuchNode: "Node information not found, check and retry!"
ErrNodeUnbind: "This node is not within the license binding range, check and retry!"
ErrNodeBind: "This node is already bound to a license, check and retry!"
ErrNodeLocalRollback: "The primary node does not support direct rollback. Run '1pctl restore' manually to roll back."
ErrIntlLicense: "The current version does not support importing international licenses yet. Stay tuned!"
InvalidRequestBodyType: "Invalid request body format. Ensure content matches the required format and retry."
InvalidLicenseCodeType: "Invalid license code format provided, check and try again!"
LicenseNotFoundType: "License not found, no matching record exists in the system for the provided license. Check and try again!"
LicenseRevokedType: "The requested license has been revoked and is no longer usable. Check and try again!"
LicenseExpiredType: "License expired. Renew it or re-import it in Panel Settings - License before retrying."
LicenseProductMismatchType: "The license does not match the requested product or service!"
InvalidAssigneeType: "Invalid target user or device information for license assignment. Check and try again!"
LicenseUsageNotFoundType: "No usage records found. This license has not been activated or used yet. Check and try again!"
LicenseUsageLimitExceededType: "This license is already bound to another node. Check and try again!"

# node and cluster
MasterNode: "Master Node"
Node: "Node"
ErrLocalDelete: "Cannot delete the local node!"
ErrMasterDelete: "Unable to delete the master node. Delete slave nodes first."
ClusterNameIsExist: "Cluster name already exists."
AppStatusUnHealthy: "Failed to fetch application status. Check installation node status in the node list."
MasterNodePortNotAvailable: "Node {{ .name }} port {{ .port }} connectivity check failed. Check firewall/security group settings and master node status."
ClusterMasterNotExist: "Cluster master node is disconnected. Delete child nodes."

# virtual machine
ErrVMNotFound: "Virtual machine does not exist"
ErrVMAlreadyExists: "Virtual machine already exists"
ErrVMImageAlreadyExists: "Virtual machine image already exists: {{ .detail }}"
ErrVMStoragePathInUse: "Storage pool path is already used by [{{ .name }}]"
ErrVMHelperNotFound: "1panel-kvm not found"
ErrVMBridgeManaged: "Bridge name is already managed by libvirt or Docker"
ErrVMNetworkInUse: "Network is in use and cannot be deleted"
ErrVMStorageInUse: "Storage pool is in use and cannot be deleted"
ErrVMStorageNameCannotChange: "Storage pool name cannot be changed"
ErrVMStoragePathCannotChange: "Storage pool path cannot be changed"
ErrVMRunning: "Virtual machine is running"
ErrVMLibvirtConnect: "Failed to connect to libvirt: {{ .detail }}"
ErrVMPermission: "No permission to operate virtual machine: {{ .detail }}"
ErrVMNetworkNotFound: "Virtual machine network does not exist: {{ .detail }}"
ErrVMInvalidPath: "Invalid virtual machine path: {{ .detail }}"
ErrVMInvalidInput: "Invalid virtual machine parameter: {{ .detail }}"
ErrVMCommandFailed: "Virtual machine command failed: {{ .err }}"
VMCreateTask: "Create virtual machine [{{ .name }}]"
VMCreateFromTemplateTask: "Create virtual machine [{{ .name }}] from template"
VMUpdateTask: "Update virtual machine [{{ .name }}]"
VMRenameTask: "Rename virtual machine [{{ .name }}] to [{{ .newName }}]"
VMDeleteTask: "Delete virtual machine [{{ .name }}]"
VMTemplateCreateTask: "Save virtual machine [{{ .name }}] as template [{{ .template }}]"
VMTemplateDeleteTask: "Delete virtual machine template [{{ .name }}]"
VMForceDeleteMetadataOnly: "1panel-kvm not found, force deleting virtual machine [{{ .name }}] metadata only"
VMForceDeleteMetadataAfterLibvirtFailed: "Failed to delete virtual machine [{{ .name }}] from libvirt, force deleting metadata: {{ .err }}"
VMForceDeleteDiskFailed: "Force delete virtual machine disk file [{{ .path }}] failed: {{ .err }}"
VMForceDeleteDiskSuccess: "Force deleted virtual machine disk file [{{ .path }}]"
VMSnapshotCreateTask: "Create snapshot [{{ .snapshot }}] for virtual machine [{{ .vm }}]"
VMSnapshotCreateStep: "Create virtual machine snapshot [{{ .snapshot }}]"
VMSnapshotRecoverTask: "Recover snapshot [{{ .snapshot }}] for virtual machine [{{ .vm }}]"
VMSnapshotRecoverStep: "Recover virtual machine snapshot [{{ .snapshot }}]"
VMSnapshotDeleteTask: "Delete snapshot [{{ .snapshot }}] for virtual machine [{{ .vm }}]"
VMSnapshotDeleteStep: "Delete virtual machine snapshot [{{ .snapshot }}]"

# app
CustomAppStoreFileValid: "Application store package requires .tar.gz format"
AppBackup: 'Application backup'
AppBackupPush: 'Transfer application backup file {{.file}} to node {{ .name }}'
ErrSourceTargetSame: 'Source node and target node cannot be the same!'
AppInstall: 'Install application {{ .name }} on node {{ .targetNode }}'
AppInstallCheck: 'Check application installation environment'

# backup
ErrBackupInUsed: "This backup account is used in scheduled tasks and cannot be deleted"
ErrBackupCheck: "Backup account connection test failed {{ .err }}"
ErrBackupLocal: "Local server backup account does not support this operation!"
ErrBackupPublic: "Detected that this backup account is not public, check and try again!"
ErrOSSConn: "Unable to get the latest version. Check server internet connectivity."
MvBackup: "Move data to backup directory"

# alert
ErrAlertSync: "Alert information sync error, check and retry!"

# AI gateway
ErrAIProxyUserGroupIsDefault: "Default user group cannot be deleted."
ErrAIProxyUserGroupInUse: "The user group is in use and cannot be deleted."
ErrAIProxyUserGroupExists: "The user group name already exists."
ErrAIProxyBackendAccountExists: "This model account has already been imported into the AI Gateway account pool."
ErrAIProxyModelGroupInUse: "The model group is in use and cannot be deleted."
ErrAIProxyModelGroupExists: "The model group name already exists."
ErrAIProxySensitiveGroupInUse: "The sensitive word group is in use and cannot be deleted."
ErrAIProxySensitiveGroupExists: "The sensitive word group name already exists."
AIProxyContentPolicyViolation: "Sorry, I cannot process this request because the content may not meet the content policy. Please revise it and try again."
AIBenchmarkRun: "Run AI benchmark"

# task
TaskStart: "{{ .name }} task started [START]"
TaskEnd: "{{ .name }} task ended [COMPLETED]"
TaskFailed: "{{ .name }} task failed"
TaskTimeout: "{{ .name }} timed out"
TaskSuccess: "{{ .name }} task succeeded"
TaskRetry: "Retry {{ .name }}"
SubTaskSuccess: "{{ .name }} succeeded"
SubTaskFailed: "{{ .name }} failed: {{ .err }}"
TaskInstall: "Install"
TaskUpgrade: "Upgrade"
TaskSync: 'Sync'
TaskSyncForNode: "Sync node data"
TaskBackup: "Backup"
TaskPush: "Push"
TaskRsync: "Sync"
SuccessStatus: "{{ .name }} succeeded"
FailedStatus: "{{ .name }} failed {{ .err }}"
Start: "Start"
SubTask: "Subtask"
Skip: "Ignore errors and continue"
Success: "Success"

# AI gateway smart routing tasks
AIProxySmartRouteCreateTask: "Create AI gateway smart routing samples"
AIProxySmartRouteCreateSubTask: "Create samples and generate vectors"
AIProxySmartRouteCreateStart: "Starting sample creation, {{ .total }} in total"
AIProxySmartRouteCreateFailed: "[{{ .current }}/{{ .total }}] Creation failed: type={{ .type }} label={{ .label }} error={{ .err }}"
AIProxySmartRouteCreateSuccess: "[{{ .current }}/{{ .total }}] Created: sampleID={{ .id }} type={{ .type }} label={{ .label }}"
AIProxySmartRouteCreateComplete: "Creation completed: {{ .success }} succeeded, {{ .failed }} failed"
AIProxySmartRouteCreateError: "Sample creation failed: {{ .failed }} failed, last error"
AIProxySmartRouteRebuildTask: "Rebuild AI gateway smart routing sample vectors"
AIProxySmartRouteRebuildSubTask: "Rebuild sample vectors"
AIProxySmartRouteEmbeddingRequired: "Embedding endpoint and model are required"
AIProxySmartRouteRebuildStart: "Starting sample vector rebuild, {{ .total }} in total"
AIProxySmartRouteRebuildFailed: "[{{ .current }}/{{ .total }}] Rebuild failed: sampleID={{ .id }} type={{ .type }} label={{ .label }} error={{ .err }}"
AIProxySmartRouteRebuildSuccess: "[{{ .current }}/{{ .total }}] Rebuilt: sampleID={{ .id }} type={{ .type }} label={{ .label }}"
AIProxySmartRouteRebuildComplete: "Rebuild completed: {{ .success }} succeeded, {{ .failed }} failed"
AIProxySmartRouteRebuildError: "Sample vector rebuild failed: {{ .failed }} failed, last error"

# agent batch task
BatchInstallAgent: "Batch install agent"
DispatchAgentInstallTasks: "Dispatch agent install tasks"
BatchUpgradeAgent: "Batch upgrade agent"
DispatchAgentUpgradeTasks: "Dispatch agent upgrade tasks"
BatchAgentInstallDispatchFailed: "Node {{ .node }} failed to dispatch {{ .agentType }} install task Message: {{ .err }}"
BatchAgentInstallSubmitted: "Node {{ .node }} dispatched {{ .agentType }} install task successfully!"
BatchAgentUpgradeDispatchFailed: "Node {{ .node }} failed to dispatch {{ .agentType }} upgrade task Message: {{ .err }}"
BatchAgentUpgradeAlreadyLatest: "Node {{ .node }} {{ .agent }} is already at the target version, skipped"
BatchAgentUpgradeSubmitted: "Node {{ .node }} dispatched {{ .agent }} upgrade task successfully!"
BatchAgentUpgradeFailed: "Node {{ .node }} failed to dispatch {{ .agent }} upgrade task Message: {{ .err }}"
BatchInstallAgentSkill: "Batch distribute Skill"
DispatchAgentSkillInstallTasks: "Dispatch Skill install tasks"
BatchAgentSkillDispatchFailed: "Node {{ .node }} failed to dispatch {{ .skill }} to {{ .target }} Message: {{ .err }}"
BatchAgentNoAgentsFound: "Node {{ .node }} found no {{ .agentType }} agents, skipped"
BatchAgentSkillSkipped: "Node {{ .node }} {{ .agent }} skipped Message: {{ .msg }}"
BatchAgentSkillInstallSubmitted: "Node {{ .node }} dispatched {{ .skill }} install task to {{ .agent }} successfully!"
BatchAgentSkillInstallFailed: "Node {{ .node }} failed to dispatch {{ .skill }} install task to {{ .agent }} Message: {{ .err }}"
BatchAgentOperateDispatchFailed: "Node {{ .node }} failed to dispatch {{ .agentType }} {{ .operate }} task Message: {{ .err }}"
BatchAgentOperateSkipped: "Node {{ .node }} {{ .agent }} skipped Message: {{ .msg }}"
BatchAgentOperateSubmitted: "Node {{ .node }} dispatched {{ .agent }} {{ .operate }} task successfully!"
BatchAgentOperateFailed: "Node {{ .node }} failed to dispatch {{ .agent }} {{ .operate }} task Message: {{ .err }}"
BatchStartAgent: "Batch start agent"
DispatchAgentStartTasks: "Dispatch agent start tasks"
BatchStopAgent: "Batch stop agent"
DispatchAgentStopTasks: "Dispatch agent stop tasks"
BatchRestartAgent: "Batch restart agent"
DispatchAgentRestartTasks: "Dispatch agent restart tasks"
BatchDeleteAgent: "Batch delete agent"
DispatchAgentDeleteTasks: "Dispatch agent delete tasks"
AgentOperateStart: "Start"
AgentOperateStop: "Stop"
AgentOperateRestart: "Restart"
AgentOperateDelete: "Delete"

# app and skill task
PushAppInstallTaskToNode: "Push app installation task to node [{{ .name }}]"
AppInstallTask: "App installation task"
PushAppFailed: "Failed to push app installation task"
SkillHubInstallTask: "Install skill [{{ .name }}]"
SkillHubInstallToTarget: "Install skill [{{ .name }}] to target [{{ .target }}]"

# script library
ScriptLibrary: "Script Library"
RemoteScriptLibrary: "Remote Script Library"
ScriptSyncSkip: "Script library is already up to date"
DownloadData: "Downloading script library file data.yaml"
DownloadPackage: "Downloading script library package"
AnalyticCompletion: "Analysis completed, now syncing to database..."

# node sync
SyncNode: "Sync data to node {{ .name }}"
LocalName: "'local' name is only used for system local identification"
SyncPackageData: "Package sync data"
SyncPackageEncrypt: "Data package encryption"
SyncRequest: "Request node sync API"
SyncFailedRetry: "Node data sync timeout (attempt {{ .index }}), retrying..."
SyncFailed: "Sync failed, manually sync in the node list!"
SyncSystemProxy: "System Proxy Settings"
SyncScripts: "Script Library"
SyncBackupAccounts: "Backup Accounts"
SyncAlertSetting: "Alert Settings"
SyncCustomApp: "Custom App"
SyncLanguage: "System Language"
SyncEdition: "Region"

# node upgrade
NodeUpgrade: "Upgrade node {{ .name }}"
UpgradeCheck: "Check for node updates"
UpgradeCheckLocal: "Local nodes do not support batch upgrades, skipping..."
UpgradeCheckLatest: "The node is already the latest version, skipping..."
NewSSHClient: "Initializing SSH connection"
BackupBeforeUpgrade: "Backup data before upgrade"
UploadUpgradeFile: "Distribute upgrade files"
RestartAfterUpgrade: "Start service after upgrade"
LoadAutoUpgradeNodesFailed: "Load auto upgrade nodes failed, err: {{ .err }}"
AutoUpgradeNodes: "Auto upgrade nodes: {{ .nodes }}"
UpdateAutoUpgradeNodesStatusFailed: "Update status of auto upgrade nodes failed, err: {{ .err }}"

# node add
MasterData: "Master Node Data"
LoadSftpClient: "Load SFTP Client"
PackageMasterData: "Generate master node backup package"
UploadBackup: "Upload backup data"
TaskAddNode: "Add node"
LoadNodeArch: "Get node architecture info"
LoadNodeArchDetail: "Detected master node architecture: {{ .local }}, child node architecture: {{ .node }}"
LoadNodeUpgradeDetail: "Using the v1 version historical installation directory: {{ .baseDir }}, service listening port: {{ .port }}"
SyncAgentBaseInfo: "Sync basic node info"
GenerateSSLInfo: "Generate node SSL info"
ConnInfoNotMatch: "Connection info mismatch"
MakeAgentPackage: "Generate node installation package"
SendAgent: "Distribute node installation package"
StartService: "Start service"
NoBackupNode: "Backup node is empty. Select one and save first"

# node file and image sync
LocalNodeIpFailed: "Failed to get master node IP. Edit the master node and add IP address and SSH authentication information."
HandlePrivateKey: "Handle node private key"
HandlePublicKey: "Handle node public key"
ExchangeFile: "Start syncing {{ .sourcePath }} from node {{ .source }} to node {{ .dest }}:{{ .destPath }}"
NodeFile: "Node file"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "Save image {{ .image }}"
ImageSyncSaveTags: "Save image tags {{ .tags }}"
ImageSyncToNode: "Sync image {{ .image }} to node {{ .node }}"
ImageSyncLoad: "Load image {{ .image }} on node {{ .node }}"
ImageSyncClean: "Clean temporary files for image {{ .image }}"
ImageSyncNoTag: "Image {{ .image }} has no tag and will be saved by image ID"
ImageSyncFrontendTagsIgnored: "No tags were found for image {{ .image }} on the source node. Frontend tags were ignored."
ImageSyncHandlePrivateKey: "Handle image sync node private key"
ImageSyncHandlePublicKey: "Handle image sync node public key"
ImageSyncTransfer: "Start transferring image temporary file: {{ .source }}:{{ .sourcePath }} -> {{ .dest }}:{{ .destPath }}"

# command line
SudoHelper: "Use {{ .cmd }} or switch to root user"
UsernameNeed: "Enterprise edition must specify --username"
DBConnErr: "Error: Failed to initialize database connection, {{ .err }}"
SystemVersion: "version: "
SystemMode: "mode: "

# command line - app
AppVersion: "App version"
AppCommands: "App related commands"
AppInit: "Initialize app"
AppKeyVal: "App key (only supports English)"
AppCreateFileErr: "File {{ .name }} creation failed {{ .err }}"
AppCreateDirErr: "Folder {{ .name }} creation failed {{ .err }}"
AppMissKey: "App key missing, use -k to specify"
AppMissVersion: "App version missing, use -v to specify"
AppVersionExist: "Version already exists!"
AppCreateSuccessful: "Creation successful!"
AppWriteErr: "File {{ .name }} write failed {{ .err }}"

# command line - listen IP
ListenIPCommands: "Switch listening ip"
ListenIPv4: "Listen on IPv4"
ListenIPv6: "Listen on IPv6"
ListenChangeSuccessful: "Switch successful! Now listening on {{ .value }}"

# command line - reset
ResetCommands: "Reset system info"
ResetMFA: "Cancel 1Panel two-factor authentication"
ResetHttps: "Cancel 1Panel https login"
ResetEntrance: "Cancel 1Panel secure entrance"
ResetIPs: "Cancel 1Panel authorized ip restrictions"
ResetDomain: "Cancel 1Panel domain binding"
ResetPasskey: "Clear 1Panel passkeys"

# command line - user
UserList: "Get 1Panel user list"
UserTableName: "Name"
UserTableMFAStatus: "MFA Status"
UserTableSuperAdmin: "Super Admin"
UserTableCreatedAt: "Created At"
UserEmptyList: "No users found"
UserInfo: "Get panel information"
UserInfoAddr: "Panel address: "
UserInfoPassHelp: "Tip: To change the password, you can execute the command: "

# command line - restore
RestoreCommands: "Roll back 1Panel service and data"
RestoreNoSuchFile: "No rollback files found"
RestoreStep1: "(1/5) Starting rollback of 1Panel service and data from {{ .name }} directory..."
RestoreStep2: "(2/5) 1Panel binary rollback completed"
RestoreStep3: "(3/5) 1Panel script rollback completed"
RestoreStep4: "(4/5) 1Panel service rollback completed"
RestoreStep5: "(5/5) 1Panel data rollback completed"
RestoreSuccessful: "Rollback completed. Reverted to {{ .version }}. Restarting service..."

# command line - update
UpdateCommands: "Update panel info"
UpdateUser: "Update user information"
UpdatePassword: "Update user password"
UpdatePort: "Update panel port"
UpdateUserNull: "Error: user is empty!"
UpdateUserBlank: "Error: user contains spaces!"
UpdateUserFormat: "Error: Invalid user format! Only supports English, Chinese, numbers, and _, length 3-30"
UpdateUserErr: "Error: Failed to update user, {{ .err }}"
UpdateSuccessful: "Update successful!"
UpdateUserResult: "User: {{ .name }}"
UpdatePasswordRead: "Error: Failed to read user password information, {{ .err }}"
UpdatePasswordNull: "Error: User password is empty!"
UpdateUPasswordBlank: "Error: User password contains spaces!"
UpdatePasswordFormat: "Error: User password supports only letters, numbers, and special characters (!@#$%*_,.?) with a length of 8-30."
UpdatePasswordLen: "Error: Enter a password longer than 6 characters"
UpdatePasswordRe: "Confirm password:"
UpdatePasswordErr: "Error: Failed to update user password, {{ .err }}"
UpdatePasswordSame: "Error: The two passwords do not match, check and try again!"
UpdatePasswordResult: "User password: {{ .name }}"
UpdatePortFormat: "Error: The input port number must be between 1 and 65535!"
UpdatePortUsed: "Error: The port number is already in use, check and try again!"
UpdatePortErr: "Error: Failed to update panel port, {{ .err }}"
UpdatePortResult: "Panel Port: {{ .name }}"
UpdatePortFirewallAdd: "Failed to add firewall port rule, {{ .err }}, manually add the {{ .name }} port to the firewall rules."
UpdatePortFirewallDel: "Error: Failed to delete firewall port, {{ .err }}"
UpdatePortFirewallReload: "Failed to reload the firewall, {{ .err }}, manually reload the firewall."

# mobile app
ErrVerifyToken: 'Token verification failed. Reset and scan again.'
ErrInvalidToken: 'Invalid token. Reset and scan again.'
ErrExpiredToken: 'Token expired. Reset and scan again.'

# command export
Name: "Name"
Command: "Command"

# LDAP
ErrLDAPConnectionTest: "LDAP connection test failed. Check the server address, bind account, and network settings."
ErrLDAPLoginTest: "LDAP login test failed. Check the username and password."
LDAPConnectionTestSuccess: "LDAP connection test succeeded."
ErrLDAPDirectorySearch: "Failed to read LDAP users. Check the connection and search settings."
ErrLDAPConfigLoad: "Failed to load the LDAP configuration."
ErrLDAPConfigSave: "Failed to save the LDAP configuration."
ErrLDAPURLInvalid: "The LDAP server address must use ldap:// or ldaps:// and include a valid host."
ErrLDAPBindDNRequired: "The bind DN is required."
ErrLDAPBindPasswordRequired: "The bind password is required."
ErrLDAPUserOURequired: "The user OU is required."
ErrLDAPConnectTimeoutRange: "The connection timeout must be between 1 and 120 seconds."
ErrLDAPSearchPageSizeRange: "The LDAP query page size must be between 1 and 10000."
ErrLDAPResultPageSizeRange: "The result page size cannot exceed 200."
ErrLDAPAttributeMapOnlyName: "The attribute mapping supports only the name field."
ErrLDAPNameAttributeRequired: "The LDAP attribute mapped to name is required."
ErrLDAPAttributeNameInvalid: "The attribute mapping contains an invalid LDAP attribute name."
ErrLDAPUserFilterRequired: "The user filter is required."
ErrLDAPUserFilterInvalid: "The user filter is not a valid LDAP filter."
ErrLDAPAttributeMapObject: "The attribute mapping must be a valid JSON object."
ErrLDAPImportModeInvalid: "The import mode must be selected users or all users."
ErrLDAPImportSelectionRequired: "Select at least one LDAP user to import."
ErrLDAPImportSelectionInvalid: "The selected LDAP users are invalid or no longer exist. Read the directory again."
ErrLDAPConfigChanged: "The LDAP configuration has changed. Read the directory and preview the import again."
ErrLDAPRoleRequired: "Select a role for new LDAP users."
ErrLDAPImportPlanIncomplete: "An incomplete LDAP import plan cannot be executed."
ErrLDAPQueryTokenInvalid: "The LDAP query result has expired. Read the directory again."
ErrLDAPPlanTokenInvalid: "The LDAP import preview has expired. Preview the import again."
ErrLDAPOperationFailed: "The LDAP operation failed. Try again."
ErrLDAPEntryIdentityMissing: "The LDAP entry is missing a stable ID or username."
ErrLDAPDuplicateExternalID: "LDAP returned duplicate user IDs."
ErrLDAPUsernameConflict: "The username is already used by another user."
ErrLDAPUsernameSourceConflict: "The username is already used by a local user or another authentication source."
ErrLDAPUsernameConcurrentConflict: "The username was claimed by another user during import."
ErrLDAPLocalCredentialsReadonly: "LDAP usernames and passwords are managed by LDAP and cannot be changed locally."
ErrLDAPPasswordExpirationUnsupported: "LDAP users do not use the local password expiration policy."
ErrLDAPSyncSourceDisabled: "Enable AD/LDAP before enabling or running synchronization."
ErrLDAPSyncConfigSave: "Failed to save the LDAP synchronization settings."
ErrLDAPSyncSchedule: "Failed to update the LDAP synchronization schedule."
ErrLDAPSyncCronInvalid: "Enter a valid five-field Cron expression."
ErrLDAPSyncWeekdayInvalid: "Select a valid weekday."
ErrLDAPSyncCronRequired: "Enter a Cron expression."
ErrLDAPSyncScheduleTypeInvalid: "Select a valid synchronization schedule type."
ErrLDAPSyncTimeInvalid: "Enter a valid execution time."
ErrLDAPSyncRunning: "An LDAP synchronization task is already running."
ErrLDAPSyncDirectoryIncomplete: "LDAP returned an incomplete full query result. No user status was changed."
ErrLDAPSyncFailed: "LDAP user synchronization failed."
LDAPSyncSuccess: "LDAP user synchronization completed successfully."
ErrSAML2NotEnabled: "SAML2 authentication is not enabled."
ErrSAML2ConfigInvalid: "The SAML2 configuration is invalid."
ErrSAML2ConfigChanged: "The SAML2 configuration has changed. Start authentication again."
ErrSAML2PanelOriginMissing: "Enter a valid 1Panel public URL containing only scheme, host, and optional port."
ErrSAML2MetadataInvalid: "The IdP Metadata is missing or invalid."
ErrSAML2MetadataURLInvalid: "The IdP Metadata URL or an endpoint in the Metadata is not allowed."
ErrSAML2MetadataFetch: "Failed to load the IdP Metadata."
ErrSAML2MetadataCertificate: "The IdP Metadata does not contain a usable signing certificate."
ErrSAML2KeyPairInvalid: "The SP private key and certificate are invalid or do not match."
ErrSAML2NameAttributeMissing: "The configured SAML2 username attribute is missing or invalid."
ErrSAML2DefaultRoleInvalid: "The default role configured for SAML2 is unavailable."
ErrSAML2SLOUnavailable: "The IdP does not provide a supported Single Logout service."
ErrSAML2TestExpired: "The SAML2 test has expired. Run it again."
ErrSAML2LoginExpired: "The SAML2 login request has expired. Try again."
ErrSAML2InvalidState: "The SAML2 login state is invalid or has already been used."
ErrSAML2RequestBuild: "Failed to build the SAML2 request."
ErrSAML2ResponseInvalid: "The SAML2 response is invalid."
ErrSAML2SignatureInvalid: "The SAML2 signature is invalid."
ErrSAML2Replay: "The SAML2 message has already been used."
ErrSAML2NameIDMissing: "The SAML2 NameID is missing or invalid."
ErrSAML2SessionIndexMissing: "The SAML2 SessionIndex is missing or invalid."
ErrSAML2NameConflictLocal: "The SAML2 username conflicts with a local user."
ErrSAML2NameConflictLDAP: "The SAML2 username conflicts with an LDAP user."
ErrSAML2NameConflictOIDC: "The SAML2 username conflicts with an OIDC user."
ErrSAML2NameConflictSAML2: "The SAML2 username conflicts with another SAML2 identity."
ErrSAML2Internal: "An internal error occurred during SAML2 authentication. Try again later."
ErrSAML2LogoutExpired: "The SAML2 logout request has expired."
ErrSAML2LogoutInvalid: "The SAML2 logout message is invalid."
ErrSAML2LocalCredentialsReadonly: "SAML2 usernames and passwords are managed by the identity provider and cannot be changed locally."
ErrSAML2PasswordExpirationUnsupported: "SAML2 users do not use the local password expiration policy."
