import { getFuLocaleMessage } from '@/lang/fu';

const message = {
    commons: {
        true: 'True',
        false: 'False',
        colon: ': ',
        example: 'e.g., ',
        fit2cloud: 'FIT2CLOUD',
        lingxia: 'LXware',
        button: {
            run: 'Run',
            prev: 'Previous',
            next: 'Next',
            create: 'Create',
            add: 'Add',
            select: 'Select',
            save: 'Save',
            set: 'Settings',
            sync: 'Sync',
            delete: 'Delete',
            edit: 'Edit',
            enable: 'Enable',
            disable: 'Disable',
            confirm: 'Confirm',
            cancel: 'Cancel',
            reset: 'Reset',
            setDefault: 'Restore defaults',
            restart: 'Restart',
            conn: 'Connect',
            disConn: 'Disconnect',
            clean: 'Clear',
            cleanAll: 'Clear all',
            selectAll: 'Select all',
            login: 'Sign in',
            close: 'Close',
            stop: 'Stop',
            start: 'Start',
            view: 'View',
            watch: 'Follow',
            handle: 'Run',
            clone: 'Clone',
            expand: 'Expand',
            collapse: 'Collapse',
            log: 'Logs',
            back: 'Back',
            backup: 'Back up',
            recover: 'Restore',
            retry: 'Try again',
            upload: 'Upload',
            download: 'Download',
            init: 'Initialize',
            verify: 'Verify',
            saveAndEnable: 'Save and enable',
            import: 'Import',
            importAll: 'Import all',
            export: 'Export',
            power: 'Submit',
            search: 'Search',
            refresh: 'Refresh',
            reconnect: 'Reconnect',
            get: 'Get',
            upgrade: 'Upgrade',
            update: 'Update',
            ignore: 'Ignore update',
            copy: 'Copy',
            random: 'Generate',
            install: 'Install',
            uninstall: 'Uninstall',
            fullscreen: 'Enter full screen',
            quitFullscreen: 'Exit full screen',
            showAll: 'Show All',
            hideSome: 'Hide Some',
            agree: 'Agree',
            notAgree: 'Disagree',
            preview: 'Preview',
            open: 'Open',
            notSave: "Don't Save",
            createNewFolder: 'Create new folder',
            createNewFile: 'Create new file',
            helpDoc: 'Documentation',
            bind: 'Bind',
            unbind: 'Unbind',
            cover: 'Overwrite',
            skip: 'Skip',
            fix: 'Fix',
            down: 'Stop',
            up: 'Start',
            sure: 'Confirm',
            show: 'Show',
            hide: 'Hide',
            visit: 'Open',
            migrate: 'Migrate',
            tip: 'Tip',
        },
        operate: {
            start: 'Start',
            stop: 'Stop',
            restart: 'Restart',
            reload: 'Reload',
            rebuild: 'Rebuild',
            sync: 'Sync',
            up: 'Up',
            down: 'Down',
            delete: 'Delete',
        },
        search: {
            timeStart: 'Start time',
            timeEnd: 'End time',
            timeRange: 'To',
            dateStart: 'Start date',
            dateEnd: 'End date',
            date: 'Date',
        },
        table: {
            all: 'All',
            total: 'Total {0}',
            name: 'Name',
            type: 'Type',
            card: 'Card',
            table: 'Table',
            status: 'Status',
            statusSuccess: 'Success',
            statusFailed: 'Failed',
            statusWaiting: 'Waiting...',
            records: 'Records',
            group: 'Group',
            default: 'Default',
            createdAt: 'Created',
            creator: 'Creator',
            publishedAt: 'Published',
            date: 'Date',
            updatedAt: 'Updated',
            updater: 'Updater',
            operate: 'Actions',
            message: 'Message',
            description: 'Description',
            interval: 'Interval',
            user: 'Owner',
            title: 'Title',
            port: 'Port',
            forward: 'Forward',
            protocol: 'Protocol',
            tableSetting: 'Table settings',
            refreshRate: 'Refresh interval',
            noRefresh: 'No refresh',
            selectColumn: 'Select column',
            local: 'Local',
            serialNumber: 'No.',
            manageGroup: 'Manage Groups',
            backToList: 'Back to List',
            keepEdit: 'Continue Editing',
            pin: 'Pin to top',
            unpin: 'Unpin',
        },
        loadingText: {
            Upgrading: 'Upgrading system, please wait...',
            Restarting: 'Restarting system, please wait...',
            Recovering: 'Recovering from snapshot, please wait...',
            Rollbacking: 'Rolling back snapshot, please wait...',
        },
        msg: {
            noneData: 'No data available',
            delete: 'This action cannot be undone. Continue?',
            clean: 'This cleanup cannot be undone. Continue?',
            closeDrawerHelper: 'Unsaved changes may be lost. Continue?',
            deleteSuccess: 'Deleted successfully',
            loginSuccess: 'Logged in successfully',
            operationSuccess: 'Completed successfully',
            operationFailed: 'Operation failed',
            copySuccess: 'Copied successfully',
            notSupportOperation: 'This operation is not supported',
            requestTimeout: 'Request timed out, try again later',
            infoTitle: 'Notice',
            notRecords: 'No run records for this task',
            sureLogOut: 'Are you sure you want to log out?',
            createSuccess: 'Created successfully',
            updateSuccess: 'Updated successfully',
            uploadSuccess: 'Uploaded successfully',
            operateConfirm: 'To confirm, type: ',
            inputOrSelect: 'Select or enter',
            selectOne: 'Please select one {0}',
            copyFailed: 'Failed to copy',
            operatorHelper: 'Run "{1}" on "{0}". This cannot be undone. Continue?',
            notFound: 'Sorry, the page you requested does not exist.',
            unSupportType: 'Current file type is not supported.',
            unSupportSize: 'Uploaded file exceeds {0}M. Confirm.',
            fileExist: 'The file already exists in the current folder. Repeat uploading is not supported.',
            fileNameErr: 'Filename must be 1-256 chars and only include letters, numbers, dots, dashes, or underscores',
            confirmNoNull: 'Make sure the value {0} is not empty.',
            errPort: 'Invalid port, please check',
            remove: 'Remove',
            backupHelper: 'The current operation will back up {0}. Proceed?',
            recoverHelper: 'Restore from {0}. This is irreversible. Continue?',
            backupSuccess: 'Backup successful',
            restoreSuccess: 'Restore successful',
            refreshSuccess: 'Refreshed successfully',
            rootInfoErr: "It's already the root directory",
            resetSuccess: 'Reset successful',
            creatingInfo: 'Creating, no need for this operation',
            installSuccess: 'Installed successfully',
            uninstallSuccess: 'Uninstalled successfully',
            offlineTips: 'Offline edition does not support this action',
            errImportFormat: 'Import data or format is abnormal, check and try again!',
            importHelper: 'If conflicts exist, imported data overwrites existing records.',
            errImport: 'File content is abnormal:',
        },
        login: {
            username: 'Username',
            password: 'Password',
            passkey: 'Passkey Login',
            otherLoginMethods: 'Other sign-in methods',
            welcome: 'Welcome back. Sign in with your username and password.',
            errorAuthInfo: 'Incorrect username or password, try again.',
            errorMfaInfo: 'Invalid authentication info, try again.',
            captchaHelper: 'Captcha',
            errorCaptcha: 'Invalid captcha code',
            codeInput: 'Enter the 6-digit MFA code',
            mfaTitle: 'MFA Verification',
            mfaCode: 'MFA verification code',
            title: 'Linux Server Management Panel',
            licenseHelper: '<Community License Agreement>',
            errorAgree: 'Please accept the Community License Agreement',
            logout: 'Logout',
            agreeTitle: 'Agreement',
            agreeContent:
                'In order to better protect your legitimate rights and interests, please read and agree to the following agreement &laquo; <a href = "https://www.fit2cloud.com/legal/licenses.html" target = "_blank" > Community License Agreement </a> &raquo;',
            passkeyFailed: 'Passkey sign-in failed, please try again',
            passkeyNotSupported:
                'Current browser or environment does not support passkeys, confirm you have bound a domain name and are accessing through HTTPS',
            passkeyToPassword: 'Passkey not working? Use password instead',
        },
        rule: {
            username: 'Enter a username',
            password: 'Enter a password',
            rePassword: 'Confirm password is inconsistent with the password.',
            requiredInput: 'This field is required.',
            requiredSelect: 'Select an item in the list',
            illegalChar: 'Injection of characters & ; $ \' ` ( ) " > < ｜ is currently not supported',
            illegalInput: "This field mustn't contains illegal characters.",
            duplicate: 'This value must be unique.',
            commonName:
                'This field must start with non-special characters and must consist of English, Chinese, numbers, ".", "-", and "_" characters with a length of 1-128.',
            userName: 'This field must consist of English, Chinese, numbers and "_" characters with a length of 3-30.',
            simpleName:
                'This field mustn\'t start with underscore character and must consist of English, numbers, and "_" characters with a length of 3-30.',
            simplePassword:
                'This field mustn\'t start with underscore character and must consist of English, numbers, and "_" characters with a length of 1-30.',
            dbName: 'This field mustn\'t start with underscore character and must consist of English, numbers, and "_" characters with a length of 1-64.',
            imageName:
                'This field must consist of English, numbers, ":", "@", "/", ".", "-", and "_" characters with a length of 1-256.',
            volumeName:
                'This field must consist of English, numbers, ".", "-", and "_" characters with a length of 2-30.',
            supervisorName:
                'This field must start with non-special characters and must consist of English, numbers, "-", and "_" characters with a length of 1-128.',
            composeName:
                'Supports non-special characters at the beginning, lowercase letters, numbers, - and _, length 1-256',
            complexityPassword:
                'Supports password combinations with a length of 8-30 that contain at least two of letters, numbers, and special characters.',
            commonPassword: 'This field length must be more than 6.',
            linuxName:
                'This field length must be between 1 and 128. The field mustn\'t contain these special characters: "{0}".',
            email: 'This field must be a valid email address.',
            number: 'This field must be a number.',
            integer: 'This field must be a positive integer.',
            ip: 'This field must be a valid IP address.',
            host: 'This field must be a valid IP address or domain name.',
            hostHelper: 'Support input of IP address or domain name',
            port: 'This field must be a valid port number.',
            selectHelper: 'Select the correct {0} file',
            domain: 'This field must be like: example.com or example.com:8080.',
            databaseName: 'This field must consist of English, numbers, and "_" characters with a length of 1-30.',
            ipErr: 'This field must be a valid IP address.',
            numberRange: 'This field must be a number between {0} and {1}.',
            paramName:
                'This field must consist of English, numbers, ".", "-", and "_" characters with a length of 2-30.',
            paramComplexity:
                'This field mustn\'t start and end with special characters and must consist of English, numbers, "{0}" characters with a length of 6-128.',
            paramUrlAndPort: 'This field must be in the format of "http(s)://(domain name/ip):(port)".',
            nginxDoc: 'This field must consist of English, numbers and "." characters.',
            appName:
                'This field musnt\'t start and end with "-" and "_" characters and must consist of English, numbers, "-", and "_" characters with a length of 2-30.',
            containerName: 'Supports letters, numbers, -, _ and .; cannot start with - _ or .; length: 2-128',
            mirror: 'The mirror acceleration address should start with http(s)://, support English letters (both uppercase and lowercase), numbers, . / and -, and should not contain blank lines.',
            disableFunction: 'Only support letters ,underscores,and,',
            leechExts: 'Only support letters, numbers and,',
            paramSimple: 'Support lowercase letters and numbers, length 1-128',
            filePermission: 'File Permission Error',
            formatErr: 'Format error, please check and retry',
            phpExtension: 'Only supports , _ lowercase English and numbers',
            paramHttp: 'Must start with http:// or https://',
            phone: 'The format of the phone number is incorrect',
            authBasicPassword: 'Supports letters, numbers, and common special characters, length 1-72',
            length128Err: 'Length cannot exceed 128 characters',
            maxLength: 'Length cannot exceed {0} characters',
            alias: 'Supports English, numbers, - and _, length 1-128, and cannot start or end with -_.',
            vmName: 'Supports English letters, numbers, ".", "-", and "_"; length: 1-64; must start with a letter or number.',
            vmNetwork:
                'Supports English letters, numbers, ".", ":", "-", and "_"; length: 1-64; must start with a letter or number.',
        },
        res: {
            paramError: 'Request failed. Try again later.',
            forbidden: 'Current user has no permission',
            serverError: 'Service error',
            notFound: 'Resource does not exist',
            commonError: 'Request failed',
        },
        service: {
            serviceNotStarted: 'The {0} service is not started.',
        },
        status: {
            running: 'Running',
            done: 'Done',
            scanFailed: 'Incomplete',
            success: 'Success',
            waiting: 'Waiting',
            waitForUpgrade: 'Wait for Upgrade',
            failed: 'Failed',
            stopped: 'Stopped',
            error: 'Error',
            created: 'Created',
            restarting: 'Restarting',
            uploading: 'Uploading',
            unhealthy: 'Unhealthy',
            removing: 'Removing',
            paused: 'Paused',
            exited: 'Exited',
            partial: 'Partial',
            dead: 'Dead',
            installing: 'Installing',
            enabled: 'Enabled',
            disabled: 'Disabled',
            normal: 'Normal',
            building: 'Building',
            upgrading: 'Upgrading',
            pending: 'Pending Edit',
            rebuilding: 'Rebuilding',
            deny: 'Denied',
            accept: 'Accepted',
            used: 'Used',
            unused: 'Unused',
            starting: 'Starting',
            recreating: 'Recreating',
            creating: 'Creating',
            init: 'Waiting for application',
            ready: 'Ready',
            applying: 'Applying',
            uninstalling: 'Uninstalling',
            lost: 'Lost Contact',
            bound: 'Bound',
            unbind: 'Unbound',
            exceptional: 'Exceptional',
            free: 'Free',
            enable: 'Enabled',
            disable: 'Disabled',
            deleted: 'Deleted',
            notfound: 'Not found',
            inactive: 'Inactive',
            degraded: 'Degraded',
            inaccessible: 'Inaccessible',
            unknown: 'Unknown',
            downloading: 'Downloading',
            packing: 'Packing',
            sending: 'Sending',
            healthy: 'Normal',
            executing: 'Executing',
            installerr: 'Installation failed',
            applyerror: 'Apply failed',
            systemrestart: 'Interrupted',
            starterr: 'Startup failed',
            uperr: 'Startup failed',
            new: 'New',
            conflict: 'Conflict',
            duplicate: 'Duplicate',
            unexecuted: 'Unexecuted',
            canceled: 'Canceled',
        },
        units: {
            second: ' second | second | seconds',
            minute: 'minute | minute | minutes',
            hour: 'hour | hour | hours',
            day: 'day | day | days',
            week: 'week | week | weeks',
            month: 'month | month | months',
            year: 'year | year | years',
            time: 'rqm',
            core: 'core | core | cores',
            millisecond: 'millisecond | milliseconds',
            secondUnit: 's',
            minuteUnit: 'min',
            hourUnit: 'h',
            dayUnit: 'd',
            semicolon: ';',
        },
        log: {
            noLog: 'No logs available',
        },
    },
    menu: {
        home: 'Overview',
        apps: 'App Store',
        website: 'Website | WebSites',
        project: 'Project | Projects',
        config: 'Configuration | Configurations',
        ssh: 'SSH Settings',
        firewall: 'Firewall',
        filter: 'Filter',
        ssl: 'Certificate | Certificates',
        database: 'Database | Databases',
        aiTools: 'AI',
        mcp: 'MCP',
        container: 'Container | Containers',
        cronjob: 'Cron Job | Cron Jobs',
        system: 'System',
        security: 'Security',
        files: 'File Browser',
        monitor: 'Monitoring',
        terminal: 'Terminal | Terminals',
        settings: 'Settings',
        toolbox: 'Toolbox',
        logs: 'Log | Logs',
        runtime: 'Runtime | Runtimes',
        processManage: 'Process | Processes',
        process: 'Process | Processes',
        network: 'Network | Networks',
        supervisor: 'Supervisor',
        tamper: 'Tamper-proof',
        app: 'Application',
        msgCenter: 'Tasks',
        disk: 'Disk',
        template: 'Template',
    },
    home: {
        recommend: 'Recommended',
        dir: 'Directory',
        alias: 'Alias',
        quickDir: 'Quick Access',
        minQuickJump: 'Add at least one quick access entry',
        maxQuickJump: 'You can add up to four quick access entries',
        database: 'Database - All',
        restart_1panel: 'Restart panel',
        restart_system: 'Restart server',
        operationSuccess: 'Completed successfully. Rebooting now, refresh the browser later.',
        entranceHelper:
            'Security entrance is not enabled. You can enable it in "Settings -> Security" to improve system security.',
        appInstalled: 'Applications',
        systemInfo: 'System information',
        hostname: 'Hostname',
        platformVersion: 'Operating system',
        kernelVersion: 'Kernel',
        kernelArch: 'Architecture',
        network: 'Network',
        io: 'Disk I/O',
        ip: 'Local IP',
        proxy: 'System proxy',
        baseInfo: 'Basic info',
        totalSend: 'Total sent',
        totalRecv: 'Total received',
        rwPerSecond: 'I/O operations',
        ioDelay: 'I/O latency',
        uptime: 'Uptime',
        runningTime: 'Up since',
        mem: 'System memory',
        swapMem: 'Swap',
        runSmoothly: 'Low load',
        runNormal: 'Moderate load',
        runSlowly: 'High load',
        runJam: 'Heavy load',
        core: 'Physical cores',
        logicCore: 'Logical cores',
        corePercent: 'Core Usage',
        cpuFrequency: 'CPU Frequency',
        cpuDetailedPercent: 'CPU usage details',
        cpuUser: 'User',
        cpuSystem: 'System',
        cpuIdle: 'Idle',
        cpuIrq: 'IRQ',
        cpuSoftirq: 'Soft IRQ',
        cpuSteal: 'Steal',
        cpuTop: 'Top 5 Processes by CPU Usage',
        memTop: 'Top 5 Processes by Memory Usage',
        loadAverage: 'Load average over the last {0} minutes',
        load: 'Load',
        mount: 'Mount point',
        fileSystem: 'File system',
        total: 'Total',
        used: 'Used',
        cache: 'Cache',
        free: 'Free',
        shard: 'Sharded',
        available: 'Available',
        percent: 'Utilization',
        goInstall: 'Go install',
        networkCard: 'NIC',
        disk: 'Disk',
        memo: 'Memo',
        memoPlaceholder: 'Click the edit button to enable editing.',
        carouselSetting: 'Carousel settings',
        tooltipSensitiveInfo: 'Show/Hide sensitive info',
    },
    tabs: {
        more: 'More',
        hide: 'Hide',
        closeLeft: 'Close left',
        closeRight: 'Close right',
        closeCurrent: 'Close current',
        closeOther: 'Close other',
        closeAll: 'Close All',
    },
    header: {
        logout: 'Logout',
    },
    database: {
        manage: 'Manage Database',
        deleteBackupHelper: 'Delete database backups simultaneously',
        delete: 'Delete action cannot be undone, please input "',
        deleteHelper: '" to delete this database',
        deleteUserHelper: '" to delete this user',
        userBoundDatabases: 'has access to the following databases:',
        noMysql: 'Database service (MySQL or MariaDB)',
        noPostgresql: 'Database service PostgreSQL',
        goUpgrade: 'Go to upgrade',
        goInstall: 'Go to install',
        isDelete: 'Deleted',
        permission: 'Change permissions',
        format: 'Charset',
        collation: 'Collation',
        collationHelper: 'If empty, use the default collation of the {0} character set',
        permissionForIP: 'IP',
        permissionAll: 'All (%)',
        localhostHelper:
            'Configuring database permissions as "localhost" for container deployment will prevent external access to the container. Please choose carefully!',
        databaseConnInfo: 'Connection',
        rootPassword: 'Root password',
        serviceName: 'Service name',
        serviceNameHelper: 'Access between containers in the same network.',
        backupList: 'Backup',
        loadBackup: 'Import',
        localUpload: 'Local upload',
        hostSelect: 'Server selection',
        selectHelper: 'Are you sure you want to import backup file {0}?',
        remoteAccess: 'Remote access',
        remoteHelper: 'Use commas to separate multiple IPs, e.g. 172.16.10.111,172.16.10.112',
        remoteConnHelper: 'Remote MySQL root login is risky. Proceed with caution.',
        changePassword: 'Change password',
        changeConnHelper: 'This will modify database {0}. Continue?',
        changePasswordHelper:
            'The database has been associated with an application. Changing the password will change the database password of the application at the same time. The change takes effect after the application restarts.',
        recoverTimeoutHelper: '-1 means no timeout',
        confChange: 'Configuration',
        confNotFound:
            'The configuration file could not be found. Please upgrade the application to the latest version in the app store and try again!',
        portHelper:
            'This port is the exposed port of the container. You need to save the modification separately and restart the container!',
        loadFromRemote: 'Sync from server',
        userBind: 'Bind user',
        userAuthorization: 'User authorization',
        noUserAuthorization: 'Do not authorize',
        authorizedDatabaseCount: '{0} authorized database(s)',
        authorizationManagement: 'Authorization management',
        authorizedUsers: 'Authorized users',
        authorizedUserCount: '{0} user(s)',
        addUserAuthorization: 'Add user authorization',
        revokeAuthorization: 'Revoke authorization',
        revokeAuthorizationHelper: "Revoke user {0}'s access to database {1}?",
        supplementPassword: 'Add password',
        supplementPasswordHelper: 'This only saves the existing password to 1Panel and does not change it in MySQL.',
        noUserBind: 'No binding',
        pgBindHelper:
            'This operation is used to create a new user and bind it to the target database. Currently, selecting users already existing in the database is not supported.',
        pgSuperUser: 'Superuser',
        loadFromRemoteHelper: 'Sync databases, users, and authorizations from the server to 1Panel. Continue?',
        passwordHelper: 'Not available, click to update',
        remote: 'Remote',
        remoteDB: 'Remote server | Remote servers',
        createRemoteDB: 'Bind @.lower:database.remoteDB',
        unBindRemoteDB: 'Unbind @.lower:database.remoteDB',
        unBindForce: 'Force unbind',
        unBindForceHelper: 'Ignore all errors during the unbinding process to ensure the final operation is successful',
        unBindRemoteHelper:
            'Unbinding the remote database will only remove the binding relationship and will not directly delete the remote database',
        editRemoteDB: 'Edit remote server',
        localDB: 'Local database',
        address: 'Database address',
        version: 'Database version',
        userHelper: 'Use root or a user with root privileges to access the remote database.',
        mongodbPermissionDbOwner: 'Database owner',
        mongodbPermissionRead: 'Read data',
        mongodbPermissionReadWrite: 'Read and write data',
        mongodbPermissionUserAdmin: 'User administrator',
        pgUserHelper: 'Use a database superuser account.',
        ssl: 'Use SSL',
        clientKey: 'Client private key',
        clientCert: 'Client certificate',
        caCert: 'CA certificate',
        hasCA: 'Has CA certificate',
        skipVerify: 'Skip certificate validation',
        initialDB: 'Initial Database',
        formatHelper:
            'The current database character set is {0}, the character set inconsistency may cause recovery failure',
        dropHelper: 'You can drag and drop the uploaded file here or',
        clickHelper: 'click to upload',
        supportUpType:
            'Only supports sql, sql.gz, tar.gz, .zip file formats. The imported compressed file must contain only one .sql file or include test.sql',
        currentStatus: 'Current status',
        baseParam: 'Basic parameter',
        performanceParam: 'Performance parameter',
        runTime: 'Start time',
        connections: 'Total connections',
        bytesSent: 'Send bytes',
        bytesReceived: 'Received bytes',
        queryPerSecond: 'Query per second',
        txPerSecond: 'Tx per second',
        connInfo: 'Active/peak connections',
        connInfoHelper: 'If the value is too large, increase "max_connections".',
        threadCacheHit: 'Thread cache hit',
        threadCacheHitHelper: 'If it is too low, increase "thread_cache_size".',
        indexHit: 'Index hit',
        indexHitHelper: 'If it is too low, increase "key_buffer_size".',
        innodbIndexHit: 'Innodb index hit rate',
        innodbIndexHitHelper: 'If it is too low, increase "innodb_buffer_pool_size".',
        cacheHit: 'Query cache hit rate',
        cacheHitHelper: 'If it is too low, increase "query_cache_size".',
        tmpTableToDB: 'Temporary table to disk',
        tmpTableToDBHelper: 'If it is too large, try increasing "tmp_table_size".',
        openTables: 'Open tables',
        openTablesHelper: 'The configuration value of "table_open_cache" must be greater than or equal to this value.',
        selectFullJoin: 'Select full join',
        selectFullJoinHelper: 'If this value is not 0, check table indexes.',
        selectRangeCheck: 'The number of joins with no index',
        selectRangeCheckHelper: 'If this value is not 0, check table indexes.',
        sortMergePasses: 'Number of sorted merges',
        sortMergePassesHelper: 'If the value is too large, increase "sort_buffer_size".',
        tableLocksWaited: 'Lock table number',
        tableLocksWaitedHelper: 'If the value is too large, consider increasing your database performance.',
        performanceTuning: 'Performance tuning',
        optimizationScheme: 'Optimization scheme',
        keyBufferSizeHelper: 'Buffer size for index',
        queryCacheSizeHelper: 'Query cache. If this function is disabled, set this parameter to 0.',
        tmpTableSizeHelper: 'Temporary table cache size',
        innodbBufferPoolSizeHelper: 'Innodb buffer size',
        innodbLogBufferSizeHelper: 'Innodb log buffer size',
        sortBufferSizeHelper: '* connections, buffer size per thread sort',
        readBufferSizeHelper: '* connections, read buffer size',
        readRndBufferSizeHelper: '* connections, random read buffer size',
        joinBufferSizeHelper: '* connections, association table cache size',
        threadStackelper: '* connections, stack size per thread',
        binlogCacheSizeHelper: '* onnections, binary log cache size (multiples of 4096)',
        threadCacheSizeHelper: 'Thread pool size',
        tableOpenCacheHelper: 'Table cache',
        maxConnectionsHelper: 'Max connections',
        restart: 'Restart',
        slowLog: 'Slow logs',
        noData: 'No slow logs yet.',
        isOn: 'On',
        longQueryTime: 'threshold(s)',
        thresholdRangeHelper: 'Enter the correct threshold (1 - 600).',
        timeout: 'Timeout(s)',
        timeoutHelper: 'Idle connection timeout period. 0 indicates that the connection is on continuously.',
        maxclients: 'Max clients',
        requirepassHelper:
            'Leave this blank to indicate that no password has been set. Changes need to be saved separately and the container restarted!',
        databases: 'Number of databases',
        maxmemory: 'Maximum memory usage',
        maxmemoryHelper: '0 indicates no restriction.',
        tcpPort: 'Current listening port.',
        uptimeInDays: 'Days in operation.',
        connectedClients: 'Number of connected clients.',
        usedMemory: 'Current memory usage of Redis.',
        usedMemoryRss: 'Memory size requested from the operating system.',
        usedMemoryPeak: 'Peak memory consumption of Redis.',
        memFragmentationRatio: 'Memory fragmentation ratio.',
        totalConnectionsReceived: 'Total number of clients connected since run.',
        totalCommandsProcessed: 'The total number of commands executed since the run.',
        instantaneousOpsPerSec: 'Number of commands executed by the server per second.',
        keyspaceHits: 'The number of times a database key was successfully found.',
        keyspaceMisses: 'Number of failed attempts to find the database key.',
        hit: 'Find the database key hit ratio.',
        latestForkUsec: 'The number of microseconds spent on the last fork() operation.',
        redisCliHelper: '"redis-cli" not detected. Enable the service first.',
        redisQuickCmd: 'Redis quick commands',
        recoverHelper: 'This will overwrite data with [{0}]. Continue?',
        mongodbRecoverDropAllCollections: 'Clear current database before restore',
        mongodbRecoverDropAllCollectionsHelper:
            'By default, only existing collections are overwritten and newly added collections are kept. When enabled, the current database is cleared and then restored from the backup.',
        submitIt: 'Overwrite the data',
        baseConf: 'Basic',
        allConf: 'All',
        restartNow: 'Restart now',
        restartNowHelper1:
            'You need to restart the system after the configuration changes take effect. If your data needs to be persisted, perform the save operation first.',
        restartNowHelper: 'This will take effect only after the system restarts.',
        persistence: 'Persistence',
        rdbHelper1: 'second(s), insert',
        rdbHelper2: 'pieces of data',
        rdbHelper3: 'Meeting any of the conditions will trigger RDB persistence.',
        rdbInfo: 'Ensure that the value in the rule list ranges from 1 to 100000',
        containerConn: 'Container connection',
        copyConnURL: 'Copy connection URL',
        connAddress: 'Address',
        containerConnHelper:
            'This connection address is used by applications running on the PHP execution environment/container installation.',
        remoteConn: 'External connection',
        remoteConnHelper2:
            'This connnection address can be used by applications running on non-container or external applications.',
        remoteConnHelper3:
            'The default access address is the host IP. To modify it, go to the "Default Access Address" configuration item in the panel settings page.',
        localIP: 'Local IP',
    },
    aiTools: {
        agents: {
            agent: 'Agent',
            account: 'Model Account',
            batchOperation: 'Batch Operation',
            operationType: 'Operation Type',
            batchAction: 'Batch {0}',
            installSkillAction: 'Distribute Skill',
            batchAgentTask: 'Batch {0} agent',
            dispatchAgentTask: 'Dispatch agent {0} tasks',
            dispatchTask: 'Dispatch {0} tasks',
            taskSubmitted: '{0} task has been submitted',
            allNodes: 'All Nodes',
            targetVersion: 'Target Version',
            skillSource: 'Skill Source',
            skillKeyword: 'Skill Keyword',
            clawHubSkillPlaceholder: 'Search and select a Skill first',
            noAccountHint: 'Choose an existing model account or add a new one.',
            accountCount: '{0} model accounts',
            syncAgents: 'Sync related agents',
            syncAgentsHelper: 'Update openclaw.json for agents using this model account',
            appVersion: 'App Version',
            webuiPort: 'WebUI Port',
            tokenOrAuth: 'Token/Auth',
            allowedOrigins: 'Access Addresses',
            allowedOriginsRequired: 'Enter at least one access address',
            allowedOriginsInvalid: 'Use the format http(s)://host-or-ip[:port]',
            provider: 'Provider',
            accountModelsHelper:
                'Choose which models this account makes available to OpenClaw for selection and configuration',
            accountModelsRequired: 'Select at least one model',
            verifyModel: 'Verification Model',
            verifyModelHelper:
                'Select a model this account can access. It is used to send a minimal request when saving to verify connectivity.',
            verifyModelRequired: 'Select a verification model',
            discoverModels: 'Get Models',
            automaticModelDiscovery: 'Auto fetch',
            manualModelConfiguration: 'Manual setup',
            discoverModelsHelper: 'Get models from the provider /v1/models API and add all of them to the model pool',
            discoverModelsFailedFallback: 'Failed to get models. Configure a model manually.',
            discoverModelsFailedUseDefaults: 'Failed to get models. Default models are being used.',
            accountModelsDuplicate: 'Duplicate models were found in the catalog',
            modelPool: 'Model Pool',
            fallbackModels: 'Fallback Models',
            addFallbackModel: 'Add Fallback Model',
            fallbackModelsEmpty: 'No fallback models configured',
            modelInputTypes: 'Input Types',
            reasoning: 'Reasoning Model',
            verified: 'Verified',
            verifySkipped: 'No verification',
            skillsTab: 'Skills',
            pluginsTab: 'Plugins',
            pluginsInstalled: 'Installed',
            pluginsMarket: 'Plugin Market',
            pluginsMarketHint: 'Enter a keyword to search for plugins',
            pluginSearchPlaceholder: 'Search plugins...',
            pluginOrigin: 'Source',
            pluginOriginAll: 'All Sources',
            pluginOriginBundled: 'Bundled',
            pluginOriginExternal: 'External',
            pluginStatusAll: 'All Statuses',
            pluginEnabled: 'Enabled',
            pluginDisabled: 'Disabled',
            pluginCategory: 'Category',
            pluginVerification: 'Verification',
            pluginOfficial: 'Official',
            pluginCommunity: 'Community',
            pluginDownloads: 'Downloads',
            pluginEnable: 'Enable',
            pluginDisable: 'Disable',
            pluginListEmpty: 'No plugins',
            pluginSearchEmpty: 'No matching plugins found',
            pluginInstallConfirm: 'Install plugin {0}?',
            pluginDisableConfirm: 'Disable plugin {0}?',
            pluginUninstallConfirm: 'Uninstall plugin {0}?',
            securityTab: 'Security',
            otherTab: 'Other',
            timeZone: 'Time Zone',
            browserEnabled: 'Browser Enabled',
            npmRegistry: 'NPM Registry',
            npmRegistryHelper:
                'Used for OpenClaw plugin installation. You can choose a preset registry or enter a custom one.',
            npmRegistryInvalid: 'Enter a valid NPM registry URL starting with http:// or https://',
            pluginInstallNPMRegistryHelper:
                'Go to Settings -> Other to configure the NPM registry and speed up plugin installation',
            skillsSearchPlaceholder: 'Search skills...',
            skillsEmpty: 'No skills',
            skillsMarket: 'Skill Market',
            skillsMarketHint: 'Select a source and search for skills',
            skillsMarketEmpty: 'No matching skills found',
            skillsMarketSourceClawhubGlobal: 'ClawHub (Global)',
            skillsMarketSourceClawhubChina: 'ClawHub (China)',
            skillsMarketSourceSkillhub: 'SkillHub (Tencent)',
            skillsMarketSourceLocalHub: 'Local Skill Store',
            skillsScore: 'Score',
            skillsMarketSourceOfficial: 'Official',
            versionUnsupportedTitle: 'This feature is not supported in the current version',
            versionUnsupportedHelper: 'Please upgrade OpenClaw to version {0} or later.',
            skillsGroupBuiltIn: 'Built-in',
            skillsGroupExternal: 'External',
            skillsGroupWorkspace: 'Workspace',
            switchModelSuccess: 'Model switched successfully',
            channelsTab: 'Channels',
            agentRoleTab: 'Agents',
            agentRoleUnsupported: 'Role management is currently supported only for OpenClaw.',
            workspace: 'Workspace Directory',
            agentDir: 'Agent Directory',
            roleMarkdownDescriptions: {
                'AGENTS.md': [
                    'Operating instructions for the agent and how it should use memory.',
                    'Loaded at the start of every session.',
                    'Good place for rules, priorities, and "how to behave" details.',
                ],
                'SOUL.md': ['Persona, tone, and boundaries.', 'Loaded every session.'],
                'USER.md': ['Who the user is and how to address them.', 'Loaded every session.'],
                'IDENTITY.md': [
                    "The agent's name, vibe, and emoji.",
                    'Created or updated during the bootstrap ritual.',
                ],
                'TOOLS.md': [
                    'Notes about your local tools and conventions.',
                    'Does not control tool availability; it is only guidance.',
                ],
                'HEARTBEAT.md': ['Optional tiny checklist for heartbeat runs.', 'Keep it short to avoid token burn.'],
                'BOOT.md': [
                    'Optional startup checklist executed on gateway restart when internal hooks are enabled.',
                    'Keep it short; use the message tool for outbound sends.',
                ],
                'BOOTSTRAP.md': [
                    'One-time first-run ritual.',
                    'Only created for a brand-new workspace.',
                    'Delete it after the ritual is complete.',
                ],
            },
            duplicateBinding: 'The channel and account ID combination must be unique',
            accountIdOptional: 'Account ID (Optional)',
            saveAllMd: 'Save All',
            roleMarkdownRestartHelper:
                'Saving all current markdown files requires a container restart to take effect. Choose whether to restart now or later.',
            configFileRestartHelper:
                'Saving the config file requires immediately restarting the container to take effect.',
            overviewSnapshot: 'Snapshot',
            primaryModel: 'Primary Model',
            defaultModel: 'Default Model',
            channelCount: 'Configured Channels',
            skillCount: 'Skills',
            jobCount: 'Scheduled Jobs',
            sessionCount: 'Sessions',
            hermesChatAction: 'Chat',
            hermesChatTitle: 'Hermes Chat',
            hermesChatDialogTitle: 'Hermes Chat - {0}',
            hermesChatNewChat: 'New Chat',
            hermesChatNoSessions: 'No sessions',
            hermesChatMessageCount: '{0} msgs',
            hermesChatEmptyHint: 'Select a session or click New Chat',
            hermesChatTitlePlaceholder: 'Enter session title',
            hermesChatRenameSuccess: 'Session title updated',
            hermesChatDeleteConfirm: 'Delete session {0}?',
            hermesChatDeleteSuccess: 'Session deleted',
            weixin: 'Weixin',
            wecom: 'WeCom',
            dingtalk: 'DingTalk',
            feishu: 'Feishu',
            pluginNotInstalled: 'Plugin is not installed. Please install it first.',
            dmPolicy: 'DM Policy',
            threadSession: 'Thread Session',
            replyMode: 'Reply Mode',
            requireMention: 'Require Mention',
            requireMentionTrue: "Require {'@'}",
            requireMentionFalse: "No {'@'} required",
            requireMentionOpen: 'By group config',
            groupPolicy: 'Group Policy',
            policyAllowlist: 'Allowlist',
            policyOpen: 'Open',
            policyDisabled: 'Disabled',
            bots: 'Bots',
            addBot: 'Add Bot',
            accountId: 'Account ID',
            accountIdPlaceholder: 'A unique ID used to distinguish bots and for later config and routing.',
            setDefaultBot: 'Set as Default',
            botDuplicateField: '{field} already exists',
            botRequired: 'Add at least one bot',
            botId: 'Bot ID',
            allowFrom: 'DM Allowlist',
            allowFromPlaceholder: 'One sender ID per line',
            allowlistPolicyHelper: '{0}. Used only when {1} is Allowlist.',
            systemPrompt: 'System Prompt',
            groupAllowFrom: 'Group Allowlist',
            groupAllowFromPlaceholder: 'One group ID per line',
            separateSessionByConversation: 'Separate Session By Conversation',
            groupSessionScope: 'Group Session Scope',
            groupSessionScopeGroup: 'Shared By Group',
            groupSessionScopeGroupSender: 'Per Sender',
            sharedMemoryAcrossConversations: 'Share Memory Across Conversations',
            asyncMode: 'Async Mode',
            ackText: 'Ack Text',
            ackTextDefault: 'Task received, processing...',
            streaming: 'Streaming',
            streamingOff: 'Off',
            streamingPartial: 'Partial',
            streamingBlock: 'Blocking',
            streamingProgress: 'Progress',
            allowFromRequired: 'Enter at least one allowlist entry',
            pairingCode: 'Pairing Code',
            pairingCodePlaceholder: 'Enter pairing code',
            approvePairing: 'Approve Pairing',
            saveSuccess: 'Saved successfully',
            successAndRestart: '{0}. The container is restarting automatically.',
            pairingApproveSuccess: 'Pairing approved successfully',
            scanConnect: 'Scan to Connect',
            scanConnectHelper:
                'Click to start the QR login task. The QR code will appear in the task log, and the container will restart automatically after the scan succeeds.',
            channelAutoRestartHelper: 'Saving will automatically restart the container so the changes take effect.',
            dashboardAuthAutoRebuildHelper:
                'Saving the username or password will automatically rebuild the container so the changes take effect.',
            dashboardAuthImmediateHelper:
                'Saving updates the QwenPaw login credentials immediately without restarting the container.',
            channelDeleteConfirm: 'Delete the {0} channel configuration?',
            apiTypeBaseURLHelper: 'This type sends requests to {0}. Recommended Base URL: {1}',
            customImageURLHelper:
                'Enter the complete image generation endpoint for Custom accounts. The path is not appended automatically. Example: {0}',
            apiTypeBaseURLMismatch:
                'The current Base URL looks like a {0} path, but {1} is selected. Recommended URL: {2}',
            validateAvailability: 'Validate account availability',
            validateAvailabilityHelper: 'Send a minimal message before saving to validate the API',
            validateImageAvailabilityHelper: 'Generates one minimal image before saving and may incur charges',
        },
        model: {
            model: 'Models',
            localModel: 'Local Models',
            create_helper: 'Pull "{0}"',
            ollama_doc: 'You can visit the Ollama official website to search and find more models.',
            container_conn_helper: 'Use this address for inter-container access or connection',
            ollama_sync: 'Syncing Ollama model found the following models do not exist, do you want to delete them?',
            from_remote: 'This model was not downloaded via 1Panel, no related pull logs.',
            no_logs: 'The pull logs for this model have been deleted and cannot be viewed.',
            vllmVersionHelper: 'For FusionXpark GB 10 servers, please select the -cu130 version.',
            vllmCommandPortHelper:
                'The startup command must use port {0}; otherwise, the service will be inaccessible.',
            syncModelAccount: 'Sync to model account',
            modelAccountAddressHelper:
                'Container address is for agent containers; 127.0.0.1, system IP, or custom address is for AI Gateway or external services.',
            containerAddress: 'Container address',
            customAddress: 'Custom address',
            downloader: 'Downloader',
            modelDir: 'Model directory',
            manualDownload: 'Manual Download',
            modelSource: 'Model source',
            repoID: 'Repository ID',
            endpointLabel: '{0} endpoint',
            acceleratedEndpointLabel: '{0} acceleration endpoint',
            tokenOptionalLabel: '{0} Token (optional)',
            searchSource: 'Search {0}',
            hfEndpointHelper:
                'Configure an acceleration endpoint when HuggingFace access is unstable. Search, details, and downloads will use it.',
            sortTrending: 'Trending',
            sortLikes: 'Most liked',
            sortDownloads: 'Most downloaded',
            sortUpdated: 'Recently updated',
            sortCreated: 'Newest',
            downloadsCount: 'Downloads',
            likes: 'Likes',
            taskQueue: 'Download Queue',
            progress: 'Progress',
            localDownloaded: 'Downloaded',
            modelInfo: 'Model Details',
            downloading: 'Downloading',
            canceled: 'Canceled',
            downloadQueued: 'Added to the download queue',
            cancelTaskConfirm: 'Cancel this download task?',
            deleteLocalModelConfirm: 'Delete local model {0}?',
        },
        proxy: {
            proxy: 'AI Gateway Enhancement',
            proxyHelper1: 'Bind domain and enable HTTPS for enhanced transmission security',
            proxyHelper2: 'Limit IP access to prevent exposure on the public internet',
            proxyHelper3: 'Enable streaming',
            proxyHelper4: 'Once created, you can view and manage it in the website list',
            proxyHelper5:
                'After enabling, you can disable external access to the port in the App Store - Installed - Ollama - Parameters to improve security.',
            proxyHelper6: 'To disable proxy configuration, you can delete it from the website list.',
            whiteListHelper: 'Restrict access to only IPs in the whitelist',
        },
        aiProxy: {
            title: 'AI Gateway',
            apiReference: 'API Reference',
            notInstalled: 'Not installed',
            usage: 'Usage',
            accountPool: 'Account Pool',
            importModelAccount: 'Import Model Account',
            editModelAccount: 'Edit Model Account',
            selectModelAccount: 'Select an existing model account',
            upstreamApiAddress: 'Upstream API Address',
            priority: 'Priority',
            healthStatus: 'Health',
            failureCount: 'Failures',
            lastError: 'Last Error',
            modelMap: 'Model Mapping',
            qpsLimit: 'QPS Limit',
            tokenLimit: 'Token Limit',
            tokenUsed: 'Used Tokens',
            tokenRemaining: 'Remaining Tokens',
            resetToken: 'Reset Tokens',
            resetTokenConfirm: 'Reset token usage for {0}?',
            unlimited: 'Unlimited',
            unlimitedWithAuto: 'Unlimited, includes auto',
            apiKeyCount: 'API Keys',
            lastUsedAt: 'Last Used',
            validityPeriod: 'Validity Period',
            keepCurrentValidity: 'Keep current validity',
            neverExpires: 'Never expires',
            validForDays: 'Valid for {0} days',
            customDays: 'Custom days',
            enterValidityDays: 'Enter the validity period in days',
            currentExpiresAt: 'Current expiration: {0}',
            currentNeverExpires: 'Currently never expires',
            expiresAt: 'Expiration Time',
            expired: 'Expired',
            reactivate: 'Reactivate',
            settingTitle: 'AI Gateway Settings',
            basicSetting: 'Basic Settings',
            performanceSetting: 'Performance Settings',
            logSetting: 'Log Settings',
            lbPolicy: 'Load Balancing Policy',
            protocolConversion: 'Protocol Conversion',
            protocolConversionDesc:
                'Allow supported direct conversion between Chat Completions, Responses, and Anthropic Messages. Native protocols always take priority.',
            protocolConversionRisk:
                'Protocol conversion is not lossless. Protocol-specific fields, tool calls, reasoning, or multimodal content may be degraded or lost. Use it after weighing the trade-offs.',
            visionEnhancement: 'Vision Enhancement',
            visionEnhancementRisk: 'Vision enhancement may send images to a separate vision model provider.',
            visionModelGroup: 'Vision Model Group',
            visionModelGroupDesc:
                'Select an image-capable model from this text generation group. All images in one request use the same model.',
            visionTargetModelGroup: 'Target Model Group',
            visionTargetModelGroupDesc:
                'Enable enhancement only for request models in this text generation group without changing the final request model.',
            visionEnhancementDesc:
                'Images are converted to text evidence and may lose detail, adding latency and model cost. The gateway does not detect native image support on target models. Saving restarts the gateway; use it after weighing the trade-offs.',
            visionPreprocess: 'Vision Preprocessing',
            cacheHit: 'Cache Hit',
            apiType: 'API Type',
            lbPolicyRoundRobin: 'Round Robin',
            lbPolicyRoundRobinDesc:
                'Select available model accounts in order. Use this when backends have similar capacity.',
            lbPolicyWeightedRoundRobin: 'Weighted Round Robin',
            lbPolicyWeightedRoundRobinDesc:
                'Distribute requests by model account weight. Higher weight receives more traffic; use this when backend capacity differs.',
            lbPolicyFailover: 'Failover',
            lbPolicyFailoverDesc:
                'Use the highest-priority model account first, then switch to the next available account after failure or cooldown.',
            maxConcurrency: 'Max Concurrency',
            queueSize: 'Queue Size',
            queueTimeoutSeconds: 'Queue Wait Timeout (s)',
            requestTimeoutSeconds: 'Non-stream Request Timeout (s)',
            streamIdleTimeoutSeconds: 'Stream Idle Timeout (s)',
            maxBodyMb: 'Max Body Size (MB)',
            runtimeRefreshSeconds: 'Runtime Refresh Interval (s)',
            logRetentionDays: 'AI Gateway Log Retention (days)',
            clearLogs: 'Clear Logs',
            clearLogsConfirm:
                'This will clear AI Gateway usage statistics, content compliance audits, smart routing decisions, request body logs, and service logs. Continue?',
            usageRetentionDays: 'Usage Statistics Retention (days)',
            contentAuditRetentionDays: 'Content Compliance Audit Retention (days)',
            logCleanupIntervalHours: 'Log Cleanup Interval (hours)',
            requestBodyLog: 'Request Body Log',
            requestBodyLogDesc:
                'Writes AI Gateway request and response bodies to Elasticsearch for search, audit, and troubleshooting.',
            requestBodyLogIndexPrefix: 'Index Prefix',
            requestBodyLogRetentionDays: 'Request Body Log Retention (days)',
            requestBodyLogMaxBodyKb: 'Max Request Body Size (KB)',
            requestBody: 'Request Body',
            requestBodySize: 'Request Body Size',
            requestBodyTruncated: 'Truncated',
            responseBody: 'Response Body',
            responseBodySize: 'Response Body Size',
            responseBodyTruncated: 'Response Body Truncated',
            readableContent: 'Readable Content',
            rawResponse: 'Raw Response',
            replyContent: 'Reply Content',
            reasoningContent: 'Reasoning Content',
            statusTitle: 'AI Gateway Status',
            serviceEnabled: 'Service Auto-start',
            proxyEnabled: 'Gateway Enabled',
            statusMessage: 'Status Message',
            esLogDropped: 'Dropped ES Logs',
            esLogLastSuccessAt: 'Last ES Write',
            esLogCircuitOpen: 'Circuit Open',
            esLogCircuitUntil: 'ES Circuit Until',
            serviceOperateConfirm: 'Confirm to {0} the AI Gateway service?',
            deleteTargetConfirm: 'Delete {0} {1}?',
            deleteBackendTitle: 'Delete Model Account',
            userFallback: 'Deleted user (ID: {0})',
            requestModel: 'Request Model',
            upstreamModel: 'Upstream Model',
            upstreamDuration: 'Upstream Time',
            requestModelPlaceholder: 'e.g. qwen2.5-coder',
            upstreamModelPlaceholder: 'e.g. Qwen/Qwen2.5-Coder-32B-Instruct',
            addMapping: 'Add Mapping',
            overview: 'Overview',
            distribution: 'Distribution',
            usageTrend: 'Usage Trend',
            distributionBy: '{0} Distribution',
            unmatched: 'Unmatched',
            modelAccount: 'Model Account',
            serviceProvider: 'Provider',
            tokenUsage: 'Token Usage',
            percent: 'Percent',
            ranking: 'Ranking',
            rank: 'Rank',
            promptToken: 'Prompt Tokens',
            completionToken: 'Completion Tokens',
            totalToken: 'Total Tokens',
            cachedToken: 'Cached Tokens',
            cacheHitRate: 'Cache Hit Rate',
            activeUsers: 'Active Users',
            activeModels: 'Active Models',
            failedRequests: 'Failed Requests',
            averageTokenPerRequest: 'Avg Tokens/Request',
            callLogs: 'Call Logs',
            usageKeywordPlaceholder: 'Search Request ID / model / upstream model / error message',
            attemptChain: 'Attempt Chain',
            attemptIndex: 'Call Order',
            clientProtocol: 'Client API',
            upstreamProtocol: 'Upstream API',
            conversionPath: 'Conversion Path',
            noAttemptDetails: 'No attempt chain records',
            input: 'Input',
            output: 'Output',
            total: 'Total',
            healthHealthy: 'Healthy',
            healthCooldown: 'Cooldown',
            healthUnhealthy: 'Unhealthy',
            healthDeleted: 'Deleted',
            healthUnknown: 'Unknown',
            validationModelMapEmpty: 'Model mapping names cannot be empty',
            validationModelMapDuplicate: 'Request model {0} is duplicated',
            modelGroup: 'Model Group',
            modelCapability: 'Model Capability',
            textGeneration: 'Text Generation',
            imageGeneration: 'Image Generation',
            textModels: 'Text Models',
            textToImageModels: 'Text-to-Image Models',
            unauthorized: 'Unauthorized',
            imageCount: 'Image Count',
            availableModels: 'Available Models',
            modelGroupModels: 'Request Models',
            modelGroupModelsPlaceholder: 'Select or enter request model names',
            modelGroupModelsHelper:
                'Enter the request model names used by clients to call the AI Gateway; smart routing tries models in order and does not load balance between models.',
            modelGroupGuide:
                'Model groups contain request model names exposed by the AI Gateway. Configure upstream models in the account pool model mapping. auto is a virtual model name and does not belong in a model group.',
            modelGroupModelCount: '{0} models',
            contentCompliance: 'Content Compliance',
            contentAction: 'Action',
            actionBlock: 'Block',
            actionAuditOnly: 'Audit only',
            actionDropHistory: 'Drop history',
            severity: 'Severity',
            severityHigh: 'High',
            severityMedium: 'Medium',
            severityLow: 'Low',
            sensitiveWord: 'Sensitive word',
            sensitiveGroup: 'Sensitive word group',
            sensitiveWordCount: 'Words',
            normalizedWord: 'Normalized word',
            matchedWords: 'Matched words',
            matchedGroups: 'Matched groups',
            importResult: 'Imported {0}, duplicated {1}, invalid {2}',
            auditLogs: 'Audit Logs',
            smartRoute: 'Smart Route',
            smartRouteGuideTitle: 'Use model=auto on the client to enter smart routing',
            smartRouteGuideReady:
                'model=auto chooses from the simple or complex model group by request complexity. Any other model is forwarded normally.',
            smartRouteGuideNotReady:
                'Enable smart routing and configure simple/complex model groups first. Then use model=auto on the client.',
            copyAutoModel: 'Copy auto',
            goSmartRouteSetting: 'Go to Settings',
            smartRoutePolicy: 'Route Policy',
            routeConfig: 'Route Config',
            embeddingConfig: 'Embedding Settings',
            embeddingConfigDesc:
                'Used for Smart Route and content compliance semantic sample matching. Recommended: llama.cpp + Qwen3-Embedding-0.6B. Configure it before rebuilding sample vectors.',
            decisionConfig: 'Decision Params',
            simpleModelGroup: 'Simple Model Group',
            complexModelGroup: 'Complex Model Group',
            embeddingEndpoint: 'Endpoint',
            embeddingModel: 'Model',
            embeddingApiKey: 'API Key',
            routeThreshold: 'Route Threshold',
            routeThresholdHelper:
                'For Smart Route: use sample matching only when request similarity reaches this value.',
            auditThreshold: 'Audit Threshold',
            auditThresholdHelper:
                'For Content Compliance: treat audit samples as matched only when similarity reaches this value.',
            topK: 'TopK',
            topKHelper: 'Number of most similar samples to compare each time.',
            members: 'Members',
            samples: 'Samples',
            routeSamplesGuide:
                'Samples are simple/complex request examples for Embedding similarity matching. Use real user requests, then create or rebuild vectors.',
            rebuildVectors: 'Rebuild Vectors',
            rebuildVectorsConfirm:
                'Rebuilding vectors will request the Embedding service to process Smart Route and content compliance samples again. Continue?',
            createVectorOnImport: 'Create vectors after import',
            createVectorOnImportHelper:
                'Enabled by default. If Embedding is configured, a background task creates vectors; otherwise only samples are created.',
            route: 'Route',
            audit: 'Audit',
            auditSamples: 'Audit Samples',
            sampleText: 'Text',
            sampleLabel: 'Label',
            vectorModel: 'Vector Model',
            vectorDim: 'Dimension',
            threshold: 'Threshold',
            preview: 'Preview',
            previewGuide:
                'Preview tests whether a request is simple or complex without calling the upstream model. The source is sample matching or rule fallback.',
            previewPlaceholder: 'Input request text',
            confidence: 'Confidence',
            bestSampleSimilarity: 'Best sample similarity',
            source: 'Source',
            sourceHeuristic: 'Rule-based',
            sourceEmbedding: 'Sample Match',
            sourceContext: 'Context Inheritance',
            latency: 'Latency',
            decisionLogs: 'Decision Logs',
            requestID: 'Request ID',
            simple: 'Simple',
            complex: 'Complex',
            sampleLabelSafe: 'Safe',
            sampleLabelReview: 'Review',
            sampleLabelBlock: 'Block',
            latencyMs: 'Latency(ms)',
            smartRouteSettingGuide:
                'After enabled, only requests with model=auto trigger smart routing. The simple group is for low-cost tasks; the complex group is for code analysis, architecture design, troubleshooting, and similar work.',
            sampleLabelPlaceholder: 'simple / complex / high',
            sampleImportPlaceholder: 'One sample per line',
        },
        skillsHub: {
            title: 'Skills Hub',
            upload: 'Upload Skill',
            importSkill: 'Import Skill',
            repositoryAddress: 'Repository Address',
            repositoryGithubOnly: 'Only GitHub repository addresses are supported',
            repositoryRef: 'Branch or Tag',
            repositoryRefPlaceholder: 'Defaults to main, then tries master if it fails',
            repositoryDownloadPreview: 'Target download URL:',
            packageURL: 'Package URL',
            packageURLPlaceholder: 'Enter .zip package address',
            importSuccess: 'Skill imported successfully and is now pending review.',
            source: 'Source',
            applicableAgent: 'Applicable Agent',
            overview: 'Overview',
            versionHistory: 'Version History',
            publishedAt: 'Published At',
            versionMarker: 'Marker',
            currentVersion: 'Current',
            latestVersion: 'Latest Version',
            latestPublished: 'Latest Published',
            riskLevel: 'Risk Level',
            riskReferenceHint:
                'The risk level is generated automatically from the Skill package content and is for review reference only.\nLow: no obvious risk found\nMedium: scripts, dependencies, external URLs, or environment variables\nHigh: remote execution, sensitive information, or dangerous commands',
            riskCheckResult: 'Security Check Result',
            noRiskFound: 'No obvious risk found.',
            riskFilePath: 'File Path',
            riskKeyword: 'Matched Keyword or Rule',
            riskDescription: 'Risk Description',
            publishHighRiskConfirm:
                'This Skill has high-risk items and may contain script execution, external downloads, or sensitive information access. Publish anyway?',
            approve: 'Approve',
            reject: 'Reject',
            publish: 'Publish',
            disable: 'Unpublish',
            customTarget: 'Custom Agent',
            addCustomTarget: 'Add Agent',
            installToTarget: 'Install to Custom Agent',
            hostSkillDir: 'Skill Directory',
            hostSkillDirHelper: 'Enter the Skill directory path on the node.',
            installMethod: 'Install Method',
            copy: 'Copy',
            extract: 'Extract',
            postInstallCommand: 'Post-install Command',
            localSource: 'Local Upload',
            uploadDragTitle: 'Drop a Skill package here, or click to upload',
            uploadFormatLabel: 'Formats:',
            uploadFormatValue: '.zip, .7z, .tar, .tar.gz',
            uploadSizeLabel: 'File size:',
            uploadSizeValue: 'No more than 5 MB per file',
            uploadRequirementLabel: 'Package requirement:',
            uploadRequirementPrefix: 'The Skill package must contain',
            onlySupportedArchive: 'Only .zip, .7z, .tar, and .tar.gz Skill packages can be uploaded',
            uploadSizeExceeded: 'A single skill package must not exceed 5 MB',
            uploadSuccess: 'Skill uploaded successfully and is now pending review.',
            versionAutoFillPlaceholder: 'Auto-detected from filename when possible. Confirm or enter manually',
            metadataOverwriteConfirm:
                'The version in the Skill package differs from the current input. Use the current input instead?',
            metadataOverwriteConfirmWithVersions:
                'The version in the Skill package differs from the current input. Package version: {packageVersion}; input version: {inputVersion}. Use the current input instead?',
            offlineNotice: 'Current environment is offline. Only skills from the local Skill Store can be installed.',
            publishConfirm: 'Publish this skill? Published skills can be installed from the local Skill Store.',
            disableConfirm: 'Unpublish this skill? Skills already installed in agents will not be affected.',
            deleteConfirm:
                'Delete this skill? This cannot be undone. Skills already installed in agents will not be affected.',
            rejectConfirm: 'Reject this skill review? It will move to the rejected status.',
            downloadPublishedOnly: 'Only published skill packages can be downloaded.',
            deleteTargetConfirm: 'Delete this custom agent? Users will no longer be able to select it.',
            noInstallTarget: 'No custom agent is available. Configure an install target first.',
            postInstallConfirm:
                'This target has a post-install command. Confirm the command is trusted before running.',
            status: {
                pending: 'Pending',
                approved: 'Approved',
                published: 'Published',
                disabled: 'Unpublished',
                rejected: 'Rejected',
                deleted: 'Deleted',
            },
            agent: {
                common: 'Common',
            },
            risk: {
                low: 'Low',
                medium: 'Medium',
                high: 'High',
            },
            riskType: {
                script_file: 'Script File',
                dependency_manifest: 'Dependency Manifest',
                external_url: 'External URL',
                environment_variable: 'Environment Variable',
                dockerfile: 'Dockerfile',
                command_execution: 'Command Execution',
                remote_script_execution: 'Remote Script Execution',
                eval_execution: 'Dynamic Execution',
                base64_execution: 'Base64 Decode Execution',
                privileged_command: 'Privileged Command',
                dangerous_delete: 'Dangerous Delete',
                world_writable_permission: 'High-risk Permission',
                credential: 'Suspected Credential',
                sensitive_path: 'Sensitive Path',
                suspicious_download_execute: 'Suspicious Download Execution',
                binary_content: 'Binary Content',
                scan_truncated: 'Scan Truncated',
            },
            riskDescriptionText: {
                script_file: 'Contains script files that may execute local commands.',
                dependency_manifest:
                    'Contains dependency manifests that may fetch external dependencies during install.',
                external_url: 'Contains external URLs. Verify that the outbound addresses are trusted.',
                environment_variable: 'Declares environment variables. Verify their purpose and default values.',
                dockerfile: 'Contains a Dockerfile that may define image build or runtime logic.',
                command_execution:
                    'Contains command execution related calls. Verify that the execution logic is trusted.',
                remote_script_execution: 'Contains logic that downloads and directly runs a remote script.',
                eval_execution: 'Contains dynamic execution through eval.',
                base64_execution: 'Contains logic that executes content after Base64 decoding.',
                privileged_command: 'Contains sudo privilege escalation commands.',
                dangerous_delete: 'Contains dangerous delete commands.',
                world_writable_permission: 'Contains chmod 777 permission changes.',
                credential: 'Contains suspected API Key, Token, Secret, or Password.',
                sensitive_path: 'Contains access to sensitive directories or files.',
                suspicious_download_execute: 'Contains suspicious outbound download or download-and-execute logic.',
                binary_content: 'The file contains NUL bytes and may hide executable or binary content.',
                scan_truncated: 'The file exceeds the scan limit. Unscanned content still requires manual review.',
            },
        },
        benchmark: {
            title: 'Benchmark',
            launchCommand: 'Launch Command',
            retest: 'Retest',
            statusRunning: 'Running',
            statusWaiting: 'Waiting',
            base: 'Basic Information',
            backend: 'Backend',
            baseUrl: 'Base URL',
            endpoint: 'Endpoint',
            tokenizer: 'Tokenizer',
            tokenizerPlaceholder:
                'Select or enter a local tokenizer directory, e.g. /opt/1panel/tokenizers/DeepSeek-V3',
            runConfig: 'Run Config',
            rawResult: 'Raw Result',
            resultMetrics: 'Result Metrics',
            contextTokens: 'Context Length',
            contextTokensHelper: 'Input token limit plus output token limit for this benchmark.',
            outputThroughput: 'Output Throughput',
            outputThroughputHelper: 'Generated output tokens per second. Higher means faster generation.',
            totalThroughput: 'Total Throughput',
            totalThroughputHelper: 'Input and output tokens processed per second. Used to measure overall capacity.',
            firstTokenLatency: 'First Token Latency',
            firstTokenLatencyHelper:
                'Time from sending the request to receiving the first token. Lower means faster response.',
            tokenValueHelper: 'Enter a positive integer or k value, e.g. 512, 1k, 32k',
            numPrompts: 'Prompts',
            concurrency: 'Concurrency',
            requestRate: 'Request Rate',
            requestRateUnlimited: 'Unlimited (max throughput)',
            requestRateCustom: 'Custom QPS',
            requestRateCustomPlaceholder: 'Requests per second, e.g. 2.5',
            successfulRequests: 'Successful Requests',
            requestThroughput: 'Request Throughput',
            mean: 'Mean',
            median: 'Median',
            timeout: 'Timeout (seconds)',
            image: 'vLLM Image',
            ignoreEos: 'Ignore EOS',
            extraHeaders: 'Extra Headers',
        },
        gpu: {
            gpu: 'GPU Monitoring',
            gpuHelper: 'The system did not detect NVIDIA-SMI or XPU-SMI commands. Please check and try again!',
            process: 'Process Information',
            processCount: 'Process Count',
            type: 'Type',
            typeG: 'Graphics',
            typeC: 'Compute',
            typeCG: 'Compute+Graphics',
            processName: 'Process Name',
            shr: 'Shared Memory',
            temperatureHelper: 'High GPU temperature may cause GPU frequency reduction',
            gpuUtil: 'GPU Utilization',
            temperature: 'Temperature',
            performanceState: 'Performance State',
            powerUsage: 'Power Consumption',
            memoryUsage: 'Memory Utilization',
            fanSpeed: 'Fan Speed',
            power: 'Power',
            powerCurrent: 'Current Power',
            powerLimit: 'Power Limit',
            memory: 'Memory',
            memoryUsed: 'Memory Used',
            memoryTotal: 'Total Memory',
            percent: 'Utilization',
            base: 'Basic Information',
            driverVersion: 'Driver Version',
            cudaVersion: 'CUDA Version',
            processMemoryUsage: 'Memory Usage',
            performanceStateHelper: 'From P0 (maximum performance) to P12 (minimum performance)',
            busID: 'Bus Address',
            persistenceMode: 'Persistence Mode',
            enabled: 'Enabled',
            disabled: 'Disabled',
            persistenceModeHelper:
                'Persistence mode responds to tasks more quickly, but standby power consumption will increase accordingly',
            displayActive: 'GPU Initialization',
            displayActiveT: 'Yes',
            displayActiveF: 'No',
            ecc: 'Error Checking and Correcting Technology',
            computeMode: 'Compute Mode',
            default: 'Default',
            exclusiveProcess: 'Exclusive Process',
            exclusiveThread: 'Exclusive Thread',
            prohibited: 'Prohibited',
            defaultHelper: 'Default: Processes can execute concurrently',
            exclusiveProcessHelper:
                'Exclusive Process: Only one CUDA context can use the GPU, but it can be shared by multiple threads',
            exclusiveThreadHelper: 'Exclusive Thread: Only one thread in a CUDA context can use the GPU',
            prohibitedHelper: 'Prohibited: Concurrent process execution is not allowed',
            migModeHelper: 'Used to create MIG instances, implementing physical GPU isolation at the user layer.',
            migModeNA: 'Not Supported',
            current: 'Real-time Monitoring',
            history: 'Historical Records',
            notSupport: 'The current version or driver does not support displaying this parameter.',
        },
        mcp: {
            server: 'MCP Server',
            baseUrl: 'External Access Path',
            baseUrlHelper: 'For example: http://192.168.1.2:8000',
            ssePath: 'SSE Path',
            ssePathHelper: 'For example: /sse, note not to duplicate with other servers',
            environment: 'Environment Variables',
            envKey: 'Variable Name',
            envValue: 'Variable Value',
            externalUrl: 'External Connection Address',
            operatorHelper: 'Will perform {1} operation on {0}, continue?',
            domain: 'Default Access Address',
            domainHelper: 'For example: 192.168.1.1 or example.com',
            bindDomain: 'Bind Website',
            commandPlaceHolder: 'Currently only supports npx and binary startup commands',
            importMcpJson: 'Import MCP Server Configuration',
            importMcpJsonError: 'mcpServers structure is incorrect',
            bindDomainHelper:
                'After binding the website, it will modify the access address of all installed MCP Servers and close external access to the ports',
            outputTransport: 'Output Type',
            streamableHttpPath: 'Streaming Path',
            streamableHttpPathHelper: 'For example: /mcp, note that it should not overlap with other Servers',
            npxHelper: 'Suitable for mcp started with npx or binary',
            uvxHelper: 'Suitable for mcp started with uvx',
            protocolVersion: 'Protocol Version',
            protocolVersionHelper:
                'Only used by stateless Streamable HTTP to auto-initialize the downstream stdio MCP Server',
            gatewayArgsHelper:
                'Arguments are appended to the supergateway command. Transport, port, path, and protocol arguments managed by 1Panel cannot be changed',
            testConnection: 'Test Connection',
            connectionSuccess: 'Connection succeeded',
            connectionFailed: 'Connection failed',
        },
        tensorRT: {
            llm: 'TensorRT LLM',
            modelDir: 'Model Directory',
            commandHelper:
                'If external access is needed, set the port in the command to be the same as the application port',
            imageAlert:
                'Due to the large image size, it is recommended to manually download the image to the server before installation',
            modelSpeedup: 'Enable model acceleration',
            modelType: 'Model type',
        },
    },
    container: {
        createByCommand: 'Create by command',
        importContainerBackupTip: 'Import container backup file, only .tar.gz is supported',
        importComposeBackupTip: 'Import compose backup file, only .tar.gz is supported',
        stopContainerBeforeBackup: 'Stop container before backup',
        stopComposeBeforeBackup: 'Stop compose before backup',
        stopBeforeBackupHelper:
            'When enabled, the container or compose service is stopped before backup and automatically restored after completion to ensure data consistency.',
        commandInput: 'Command input',
        commandRule: 'Enter the correct docker run container creation command!',
        commandHelper: 'This command will run on the server to create the container. Continue?',
        updateHelper1: 'Detected that this container comes from the app store. Please note the following two points:',
        updateHelper2:
            '1. The current modifications will not be synchronized to the installed applications in the app store.',
        updateHelper3:
            '2. If you modify the application on the installed page, the currently edited content will become invalid.',
        updateHelper4: 'Editing the container requires rebuilding, and any non-persistent data will be lost. Continue?',
        containerList: 'Container list',
        operatorHelper: 'Run {0} on the following container. Continue?',
        operatorAppHelper: 'Run "{0}" on the following container(s). Running services may be affected. Continue?',
        containerDeleteHelper:
            "Detected that the container is from the App Store. Deleting the container will not completely remove it from 1Panel. To delete it completely, go to the App Store -> 'Installed' or 'Runtime Environment' menus. Continue?",
        start: 'Start',
        stop: 'Stop',
        restart: 'Restart',
        kill: 'Kill',
        pause: 'Pause',
        unpause: 'Resume',
        rename: 'Rename',
        remove: 'Remove',
        removeAll: 'Remove all',
        containerPrune: 'Prune',
        containerPruneHelper1: 'This will delete all containers that are in stopped state.',
        containerPruneHelper2:
            'If the containers are from the app store, you need to go to "App Store -> Installed" and click the "Rebuild" button to reinstall them after performing the cleanup.',
        containerPruneHelper3: 'This operation cannot be undone. Continue?',
        imagePrune: 'Prune',
        imagePruneSome: 'Clean unlabeled',
        imagePruneSomeEmpty: 'No images with the "none" tag can be cleaned.',
        imagePruneSomeHelper: 'Clean the images with the tag "none" that are not used by any containers.',
        imagePruneAll: 'Clean unused',
        imagePruneAllEmpty: 'No unused images can be cleaned.',
        imagePruneAllHelper: 'Clean the images that are not used by any containers.',
        networkPrune: 'Prune',
        networkPruneHelper: 'This will remove all unused networks. Continue?',
        volumePrune: 'Prune',
        volumePruneHelper: 'This will remove all unused local volumes. Continue?',
        cleanSuccess: 'Completed successfully, the number of this cleanup: {0}!',
        cleanSuccessWithSpace:
            'Completed successfully. The number of disks cleaned this time is {0}. The disk space freed is {1}!',
        unExposedPort: 'The current port mapping address is 127.0.0.1, which cannot enable external access.',
        upTime: 'Uptime',
        fetch: 'Fetch',
        lines: 'Lines',
        linesHelper: 'Enter the correct number of logs to retrieve!',
        downloadLinesHelper: 'Select or enter the number of log lines to download.',
        lastDay: 'Last day',
        last4Hour: 'Last 4 hours',
        lastHour: 'Last hour',
        last10Min: 'Last 10 minutes',
        cleanLog: 'Clean log',
        cleanLogscope: 'Cleanup Type',
        downLogHelper1: 'This will download all logs from container {0}. Continue?',
        downLogHelper2: 'This will download the latest {1} logs from container {0}. Continue?',
        cleanLogHelper: 'This will require restarting the container and cannot be undone. Continue?',
        newName: 'New name',
        workingDir: 'Working Dir',
        composeFileMissing: 'Compose file not detected',
        source: 'Resource usage',
        cpuUsage: 'CPU usage',
        cpuTotal: 'CPU total',
        core: 'Core',
        memUsage: 'Memory usage',
        memTotal: 'Memory limit',
        memCache: 'Memory cache',
        loadSize: 'Get Container Size',
        ip: 'IP address',
        cpuShare: 'CPU shares',
        cpuShareHelper:
            'Container engine uses a base value of 1024 for CPU shares. You can increase it to give the container more CPU time.',
        inputIpv4: 'Example: 192.168.1.1',
        inputIpv6: 'Example: 2001:0db8:85a3:0000:0000:8a2e:0370:7334',
        diskUsage: 'Disk Usage',
        localVolume: 'Local Storage Volume',
        buildCache: 'Build Cache',
        usage: 'Used: {0}, Releasable: {1}',
        clean: 'Release',
        imageClean: 'Clean up images will delete all unused images. This operation cannot be rolled back. Continue?',
        containerClean:
            'Clean up containers will delete all stopped containers (including stopped apps from App Store). This operation cannot be rolled back. Continue?',
        sizeRw: 'Layer Size',
        sizeRwHelper: 'Size of the writable layer unique to the container',
        sizeRootFs: 'Virtual Size',
        sizeRootFsHelper: 'Total size of all image layers the container depends on + container layer',
        containerFromAppHelper:
            'Detected that this container originates from the app store. App operations may cause current edits to be invalidated.',
        containerFromAppHelper1:
            'Click the [Param] button in the installed applications list to enter the editing page and modify the container name.',
        command: 'Command',
        console: 'Container interaction',
        tty: 'Allocate a pseudo-TTY (-t)',
        openStdin: 'Keep STDIN open even if not attached (-i)',
        custom: 'Custom',
        emptyUser: 'When empty, you will log in as  default',
        privileged: 'Privileged',
        privilegedHelper:
            'Allow the container to perform certain privileged operations on the host, which may increase container risks. Use with caution!',
        upgradeHelper: 'Repository Name/Image Name: Image Version',
        upgradeWarning2:
            'The upgrade operation requires rebuilding the container, any unpersisted data will be lost. Continue?',
        oldImage: 'Current image',
        sameImageContainer: 'Same-image containers',
        sameImageHelper: 'Containers using the same image can be batch upgraded after selection',
        targetImage: 'Target image',
        imageLoadErr: 'No image name detected for the container',
        imageUpdateTagEmpty: 'No updatable image tags detected',
        appHelper: 'The container comes from the app store, and upgrading may make the service unavailable.',
        resource: 'Resource',
        input: 'Manually input',
        forcePull: 'Always pull image ',
        forcePullHelper: 'This will ignore existing images on the server and pull the latest image from the registry.',
        imageUpdateHelper: 'Check the same tag in registry, and pull to update local image only if changed.',
        server: 'Host',
        serverExample: '80, 80-88, ip:80 or ip:80-88',
        containerExample: '80 or 80-88',
        exposePort: 'Expose port',
        exposeAll: 'Expose all',
        cmdHelper: 'Example: nginx -g "daemon off;"',
        entrypointHelper: 'Example: docker-entrypoint.sh',
        autoRemove: 'Auto remove',
        cpuQuota: 'Number of CPU cores',
        memoryLimit: 'Memory',
        limitHelper: 'If set to 0, it means that there is no limitation. The maximum value is {0}',
        macAddr: 'MAC Address',
        mount: 'Mount',
        volumeOption: 'Volume',
        hostOption: 'Host',
        serverPath: 'Server path',
        containerDir: 'Container path',
        volumeHelper: 'Ensure that the content of the storage volume is correct',
        networkEmptyHelper: 'Please confirm the container network selection is correct',
        modeRW: 'RW',
        modeR: 'R',
        sharedLabel: 'Propagation Mode',
        private: 'Private',
        privateHelper: 'Mount changes in the container and host do not affect each other',
        rprivate: 'Recursive Private',
        rprivateHelper: 'All mounts in the container are completely isolated from the host',
        shared: 'Shared',
        sharedHelper: 'Mount changes in the host and container are visible to each other',
        rshared: 'Recursive Shared',
        rsharedHelper: 'All mount changes in the host and container are visible to each other',
        slave: 'Slave',
        slaveHelper: 'The container can see host mount changes, but its own changes do not affect the host',
        rslave: 'Recursive Slave',
        rslaveHelper: 'All mounts in the container can see host changes, but do not affect the host',
        mode: 'Mode',
        env: 'Environments',
        restartPolicy: 'Restart policy',
        always: 'always',
        unlessStopped: 'unless-stopped',
        onFailure: 'on-failure (five times by default)',
        no: 'never',
        refreshTime: 'Refresh interval',
        cache: 'Cache',
        image: 'Image | Images',
        imagePull: 'Pull',
        imagePullHelper:
            'Supports selecting multiple images to pull, press Enter after entering each image to continue',
        imagePush: 'Push',
        imagePushHelper:
            'Detected that this image has multiple tags. Please confirm that the image name used for pushing is: {0}',
        imageDelete: 'Image delete',
        repoName: 'Container registry',
        imageName: 'Image name',
        pull: 'Pull',
        path: 'Path',
        importImage: 'Import',
        buildArgs: 'Build Arguments',
        imageBuild: 'Build',
        pathSelect: 'Path',
        label: 'Label',
        imageTag: 'Image tag',
        imageTagHelper: 'Supports setting multiple image tags, press Enter after entering each tag to continue',
        push: 'Push',
        fileName: 'Filename',
        export: 'Export',
        exportImage: 'Image export',
        size: 'Size',
        tag: 'Tags',
        tagHelper: 'One per line. For example,\nkey1=value1\nkey2=value2',
        imageNameHelper: 'Image name and Tag, for example: nginx:latest',
        cleanBuildCache: 'Clean build cache',
        delBuildCacheHelper:
            'This will delete all cached artifacts that are generated during builds and cannot be undone. Continue?',
        urlWarning: 'The URL prefix does not need to include http:// or https://. Please modify.',
        network: 'Network | Networks',
        networkHelper: 'This may cause some applications and runtime environments to not work properly. Continue?',
        networkName: 'Name',
        driver: 'Driver',
        option: 'Option',
        attachable: 'Attachable',
        parentNetworkCard: 'Parent Network Card',
        subnet: 'Subnet',
        scope: 'IP scope',
        gateway: 'Gateway',
        auxAddress: 'Exclude IP',
        volume: 'Volume | Volumes',
        volumeDir: 'Volume directory',
        nfsEnable: 'Enable NFS storage',
        nfsAddress: 'Address',
        mountpoint: 'Mountpoint',
        mountpointNFSHelper: 'e.g. /nfs, /nfs-share',
        options: 'Options',
        repo: 'Repository | Repositories',
        httpRepoHelper: 'Operating an HTTP-type repository requires restarting the Docker service.',
        httpRepo: 'Choosing HTTP protocol requires restarting the Docker service to add it into insecure registries.',
        delInsecure: 'Deletion of credit',
        delInsecureHelper: 'This will restart Docker service to remove it from insecure registries. Continue?',
        downloadUrl: 'Server',
        imageRepo: 'Image repo',
        repoHelper: 'Does it include a mirror repository/organization/project?',
        auth: 'Require authentication',
        mirrorHelper:
            'If there are multiple mirrors, newlines must be displayed, for example:\nhttp://xxxxxx.m.daocloud.io \nhttps://xxxxxx.mirror.aliyuncs.com',
        registrieHelper:
            'If multiple private repositories exist, newlines must be displayed, for example:\n172.16.10.111:8081 \n172.16.10.112:8081',
        compose: 'Compose | Composes',
        composeFile: 'Compose File',
        fromChangeHelper: 'Switching the source will clean the current edited content. Continue?',
        composePathHelper:
            'Compose file save path: {0}; if a project name is specified in Docker Compose, it takes precedence; otherwise, {1} is used.',
        composeNamePriorityHelper:
            'Project name priority: name specified in Docker Compose config > file parent directory > name entered here.',
        composeHelper:
            'The composition created through 1Panel editor or template will be saved in the {0}/docker/compose directory.',
        deleteFile: 'Delete file',
        deleteComposeHelper:
            'Delete all files related to container compose, including configuration files and persistent files. Please proceed with caution!',
        deleteCompose: '" Delete this composition.',
        composeDirectory: 'Compose directory',
        template: 'Template',
        composeTemplate: 'Compose template | Compose templates',
        content: 'Content',
        contentEmpty: 'Compose content cannot be empty, enter and try again!',
        containerNumber: 'Container number',
        containerStatus: 'Container status',
        exited: 'Exited',
        running: 'Running ( {0} / {1} )',
        composeDetailHelper:
            'The compose is created external to 1Panel. The start and stop operations are not supported.',
        composeOperatorHelper: '{1} operation will be performed on {0}. Continue?',
        composeDownHelper: 'This will stop and remove all containers and networks under the {0} compose. Continue?',
        composeEnvHelper2:
            'This orchestration was created by the 1Panel App Store. Please modify environment variables in the installed applications.',
        composeContentPlaceholder: 'Write or paste the content of your docker-compose file here',

        setting: 'Setting | Settings',
        goSetting: 'Go to Settings',
        restartHelper: 'Configuration changes require restarting the Docker service to take effect',
        operatorStatusHelper: 'This will "{0}" the Docker service. Continue?',
        dockerStatus: 'Docker Service',
        daemonJsonPathHelper: 'Ensure that the configuration path is the same as that specified in docker.service.',
        mirrors: 'Registry mirrors',
        mirrorsHelper:
            'Use registry mirror URLs first for image operations. Leave this empty to disable registry mirrors.',
        mirrorsHelper2: 'For details, see the official documentation.',
        registries: 'Insecure registries',
        ipv6Helper:
            'When enabling IPv6, you need to add an IPv6 container network. Refer to the official documentation for specific configuration steps.',
        ipv6CidrHelper: 'IPv6 address pool range for containers',
        ipv6TablesHelper: 'Automatic configuration of Docker IPv6 for iptables rules.',
        experimentalHelper:
            'Enabling ip6tables requires this configuration to be turned on; otherwise, ip6tables will be ignored',
        cutLog: 'Log option',
        cutLogHelper1: 'The current configuration will only affect newly created containers.',
        cutLogHelper2: 'Existing containers need to be recreated for the configuration to take effect.',
        cutLogHelper3:
            'Please note that recreating containers may result in data loss. If your containers contain important data, make sure to backup before performing the rebuilding operation.',
        maxSize: 'Max size',
        maxFile: 'Max file',
        liveHelper:
            'By default, when the Docker daemon terminates, it shuts down running containers. You can configure the daemon so that containers remain running if the daemon becomes unavailable. This functionality is called live restore. The live restore option helps reduce container downtime due to daemon crashes, planned outages, or upgrades.',
        liveWithSwarmHelper: 'live-restore daemon configuration is incompatible with swarm mode.',
        iptablesDisable: 'Close iptables',
        iptablesHelper1: 'Automatic configuration of iptables rules for Docker.',
        iptablesHelper2:
            'Disabling iptables will result in the containers being unable to communicate with external networks.',
        daemonJsonPath: 'Conf Path',
        serviceUnavailable: 'Docker service is not started at present.',
        startIn: ' to start',
        sockPath: 'Unix domain socket',
        sockPathHelper: 'Communication channel between Docker daemon and the client.',
        sockPathHelper1: 'Default path: /var/run/docker-x.sock',
        sockPathMsg: 'Saving Socket Path may make Docker unavailable. Continue?',
        sockPathErr: 'Select or enter the correct Docker sock file path',
        related: 'Related',
        includeAppstore: 'Show containers from the app store',
        excludeAppstore: 'Hide App Store Container',
        cleanDockerDiskZone: 'Clean up disk space used by Docker',
        cleanImagesHelper: '( Clean up all images that are not used by any containers )',
        cleanContainersHelper: '( Clean up all stopped containers )',
        cleanVolumesHelper: '( Clean up all unused local volumes )',
        makeImage: 'Create image',
        newImageName: 'New image name',
        commitMessage: 'Commit message',
        author: 'Author',
        ifPause: 'Pause Container During Creation',
        ifMakeImageWithContainer: 'Create New Image from This Container?',
        finishTime: 'Last stop time',
        exportHelper: 'Export selected images to one tar file.',
    },
    cronjob: {
        importHelper:
            'Duplicate scheduled tasks will be automatically skipped during import. Tasks will be set to [Disabled] status by default, and set to [Pending Edit] status when data association is abnormal.',
        changeStatus: 'Change status',
        disableMsg: 'This will stop the scheduled task from automatically executing. Continue?',
        enableMsg: 'This will allow the scheduled task to automatically execute. Continue?',
        taskType: 'Type',
        nextTime: 'Next 5 executions',
        record: 'Records',
        viewRecords: 'View records',
        shell: 'Shell',
        stop: 'Manual Stop',
        stopHelper: 'This operation will force stop the current task execution. Continue?',
        log: 'Backup logs',
        logHelper: 'Backup system log',
        logHelper1: '1. 1Panel system log',
        logHelper2: '2. SSH login log of the server ',
        logHelper3: '3. All site logs ',
        containerCheckBox: 'In container (no need to enter the container command)',
        containerName: 'Container name',
        ntp: 'Time synchronization',
        ntp_helper: 'You can configure the NTP server on the Quick Setup page of the Toolbox.',
        app: 'Backup app',
        website: 'Backup website',
        rulesHelper:
            'When there are multiple compression exclusion rules, they need to be displayed with line breaks. For example,\n*.log \n*.sql',
        lastRecordTime: 'Last execution time',
        all: 'All',
        failedRecord: 'Failure records',
        successRecord: 'Successful records',
        database: 'Backup database',
        backupArgs: 'Backup Arguments',
        backupArgsHelper:
            'Unlisted backup arguments can be manually entered and selected. For example: Enter --no-data and select the first option from the dropdown list.',
        singleTransaction: 'Backup InnoDB tables using a single transaction, suitable for large-volume data backups',
        quick: 'Read data row by row instead of loading the entire table into memory, suitable for large-volume data and low-memory machine backups',
        skipLockTables: 'Backup without locking all tables, suitable for highly concurrent databases',
        setGtidPurgedOff:
            'Do not export GTID information, suitable for database recovery in Group Replication environments',
        missBackupAccount: 'The backup account could not be found',
        syncDate: 'Synchronization time ',
        clean: 'Cache clean',
        curl: 'Access URL',
        taskName: 'Name',
        cronSpec: 'Trigger cycle',
        cronSpecDoc:
            'Custom execution cycles only support the [minute hour day month week] format, e.g., 0 0 * * *. For details, see the official documentation.',
        cronSpecHelper: 'Enter the correct execution period',
        cleanHelper: 'This action records all job runs, backup files, and log files. Continue?',
        backupContent: 'Backup content',
        directory: 'Backup directory',
        sourceDir: 'Backup directory',
        snapshot: 'System snapshot',
        allOptionHelper:
            'The current task plan is to back up all [{0}]. Direct download is not supported at the moment. You can check the backup list of [{0}] menu.',
        exclusionRules: 'Exclusive rule',
        exclusionRulesHelper:
            'Select or enter exclusion rules, press Enter after each set to continue. Exclusion rules will apply to all compression operations in this backup',
        default_download_path: 'Default download link',
        saveLocal: 'Retain local backups (the same as the number of cloud storage copies)',
        url: 'URL Address',
        urlHelper: 'Enter a valid URL address',
        targetHelper: 'Backup accounts are maintained in panel settings.',
        withImageHelper: 'Backup app store images, but this will increase the snapshot file size.',
        ignoreApp: 'Exclude apps',
        withImage: 'Backup Application Image',
        retainCopies: 'Retain records',
        retryTimes: 'Retry Attempts',
        timeout: 'Timeout',
        ignoreErr: 'Ignore errors',
        ignoreErrHelper: 'Ignore errors during backup to ensure all backup tasks complete',
        retryTimesHelper: '0 means no retry after failure',
        retainCopiesHelper: 'Number of copies to retain for execution records and logs',
        retainCopiesHelper1: 'Number of copies to retain for backup files',
        retainCopiesUnit: ' copies (View)',
        cronSpecRule: 'The execution period format in line {0} is incorrect. Please check and try again!',
        cronSpecRule2: 'Execution period format is incorrect, check and try again!',
        perMonthHelper: 'Execute on the {0} day of every month at {1}:{2}',
        perWeekHelper: 'Execute every week on {0} at {1}:{2}',
        perDayHelper: 'Execute every day at {0}:{1}',
        perHourHelper: 'Execute every hour at {0} minutes',
        perNDayHelper: 'Execute every {0} days at {1}:{2}',
        perNHourHelper: 'Execute every {0} hours at {1}',
        perNMinuteHelper: 'Execute every {0} minutes',
        perNSecondHelper: 'Execute every {0} seconds',
        perMonth: 'Every month',
        perWeek: 'Every week',
        perHour: 'Every hour',
        perNDay: 'Every N day(s)',
        perDay: 'Every day',
        perNHour: 'Every N hour(s)',
        perNMinute: 'Every N minute(s)',
        perNSecond: 'Every N second(s)',
        day: 'day(s)',
        monday: 'Monday',
        tuesday: 'Tuesday',
        wednesday: 'Wednesday',
        thursday: 'Thursday',
        friday: 'Friday',
        saturday: 'Saturday',
        sunday: 'Sunday',
        shellContent: 'Script',
        executor: 'Executor',
        errRecord: 'Incorrect logging',
        errHandle: 'Cronjob execution failure',
        noRecord: 'Trigger the Cron Job, and you will see the records here.',
        cleanData: 'Clean data',
        cleanRemoteData: 'Delete remote data',
        cleanDataHelper: 'Delete the backup file generated during this task.',
        noLogs: 'No task output yet...',
        errPath: 'Backup path [{0}] error, cannot download!',
        cutWebsiteLog: 'Website log rotation',
        cutWebsiteLogHelper: 'The rotated log files will be backed up to the backup directory of 1Panel.',
        syncIpGroup: 'Sync WAF IP groups',
        syncIpGroupHelper: 'Sync remote IP groups used in WAF allowlists and blocklists',
        requestExpirationTime: 'Upload request expiration time(Hours)',
        unitHours: 'Unit: Hours',
        alertTitle: 'Planned Task - {0} 「{1}」 Task Failure Alert',
        library: {
            script: 'Script',
            syncNow: 'Sync Now',
            turnOnSync: 'Enable Auto Sync',
            turnOnSyncHelper:
                'Enabling auto sync will perform automatic synchronization during early morning hours daily',
            turnOffSync: 'Disable Auto Sync',
            turnOffSyncHelper: 'Disabling auto sync may cause script synchronization delays, confirm?',
            isInteractive: 'Interactive',
            interactive: 'Interactive script',
            interactiveHelper: 'Requires user input during execution and cannot be used in scheduled tasks.',
            library: 'Script Library',
            remoteLibrary: 'Remote Script Library',
            create: 'Add Script',
            edit: 'Edit Script',
            groupHelper:
                'Set different groups based on script characteristics, which allows for faster script filtering operations.',
            handleHelper: 'Execute script {1} on {0}, continue?',
            noSuchApp: 'The {0} service was not detected. Please install it quickly using the script library first!',
            syncHelper: 'About to sync system script library. This operation only affects system scripts. Continue?',
        },
        cleanLog: 'Auto clean logs',
        cleanLogscope: 'Log retention',
    },
    monitor: {
        globalFilter: 'Global Filter',
        enableMonitor: 'Monitoring Status',
        storeDays: 'Retention Days',
        defaultNetwork: 'Default Network Card',
        defaultNetworkHelper: 'Default network card option displayed in monitoring and overview interfaces',
        defaultIO: 'Default Disk',
        defaultIOHelper: 'Default disk option displayed in monitoring and overview interfaces',
        cleanMonitor: 'Clear Monitoring Records',
        cleanHelper: 'This operation will clear all monitoring records including GPU. Continue?',
        avgLoad: 'Load average',
        loadDetail: 'Load detail',
        resourceUsage: 'Utilization',
        networkCard: 'Network interface',
        read: 'Read',
        write: 'Write',
        readWriteCount: 'I/O operations',
        readWriteTime: 'I/O latency',
        today: 'Today',
        yesterday: 'Yesterday',
        lastNDay: 'Last {0} days',
        lastNMonth: 'Last {0} months',
        lastHalfYear: 'Last half year',
        memory: 'Memory',
        percent: 'Percentage',
        cache: 'Cache',
        disk: 'Disk',
        network: 'Network',
        up: 'Up',
        down: 'Down',
        interval: 'Collection Interval',
        intervalHelper: 'Enter an appropriate monitoring collection interval (10 seconds - 12 hours)',
        runtimeDiagnostics: 'Runtime Diagnostics',
        runtimeRSS: 'Process Memory (RSS)',
        runtimeHeapAlloc: 'Heap Memory',
        runtimeHeapObjects: 'Heap Objects',
        runtimeGoroutines: 'Goroutines',
        goroutineSnapshot: 'Goroutine Snapshot',
        goroutineSummary: '{0} goroutines grouped into {1} call stacks',
        goroutineTruncated: 'The snapshot is too large. Only part of the call stacks are shown.',
        captureSnapshot: 'Refresh Snapshot',
        count: 'Count',
        topFunction: 'Top Function',
        manualCapture: 'Manual Capture',
        startCapture: 'Start Capture',
        capturing: 'Capturing',
        captureSuccess: 'Diagnostic file generated; download started',
        profileCPU: 'CPU',
        profileHeap: 'Heap',
        profileGoroutine: 'Goroutine',
        profileMutex: 'Mutex',
        profileBlock: 'Block',
        runtimeRSSDesc:
            'Physical memory currently occupied by the process, including the Go heap, thread stacks, and native memory.',
        runtimeHeapAllocDesc:
            'Memory allocated on the Go heap that has not been released. Sustained growth may indicate retained objects.',
        runtimeHeapObjectsDesc:
            'Number of live objects on the Go heap. Sustained growth may indicate retained objects.',
        runtimeGoroutineDesc:
            'Current lightweight concurrent tasks. Sustained growth usually warrants checking for goroutine leaks.',
        profileCPUDesc:
            'Samples CPU call stacks for the selected duration to locate functions that actually consume CPU.',
        profileHeapDesc:
            'Records Go heap objects still in use and their allocation stacks to investigate sustained memory growth.',
        profileGoroutineDesc: 'Saves the state and call stack of every goroutine and groups identical call paths.',
        profileMutexDesc: 'Measures wait time caused by mutex contention to locate lock contention hotspots.',
        profileBlockDesc: 'Measures blocking on channels, select statements, and synchronization primitives.',
    },
    terminal: {
        local: 'Local',
        defaultConn: 'Default Connection',
        defaultConnHelper:
            'This operation will automatically connect to the node terminal after opening the terminal for 【{0}】. Continue?',
        withReset: 'Reset Connection Information',
        localConnJump:
            'Default connection information is maintained in [Terminal - Settings]. If connection fails, please edit there!',
        nodeAdminLocalOnly: 'Node administrators only support local terminals.',
        localHelper: 'The `local` name is used only for system local identification',
        connLocalErr: 'Unable to automatically authenticate, fill in the local server login information.',
        testConn: 'Test connection',
        saveAndConn: 'Save and connect',
        connTestOk: 'Connection information available',
        connTestFailed: 'Connection unavailable, please check connection information.',
        host: 'Host | Hosts',
        createConn: 'New connection',
        noHost: 'No host',
        groupChange: 'Change group',
        expand: 'Expand all',
        fold: 'All contract',
        batchInput: 'Batch processing',
        quickCommand: 'Quick command | Quick commands',
        noSuchCommand: 'No quick command data found in the imported CSV file, check and try again!',
        quickCommandHelper: 'You can use the quick commands at the bottom of the "Terminals -> Terminals".',
        quickCommandBatchHelper:
            'One quick command per line, using the Name---Command format, for example: Check disk---df -h',
        groupDeleteHelper:
            'After the group is removed, all connections in the group will be migrated to the default group. Continue?',
        command: 'Command',
        quickCmd: 'Quick command',
        addHost: 'Add',
        localhost: 'Localhost',
        ip: 'Address',
        authMode: 'Authentication',
        passwordMode: 'Password',
        rememberPassword: 'Remember authentication information',
        keyMode: 'PrivateKey',
        key: 'Private key',
        keyPassword: 'Private key password',
        emptyTerminal: 'No terminal is currently connected.',
        lineHeight: 'Line Height',
        letterSpacing: 'Letter Spacing',
        fontSize: 'Font Size',
        fontFamily: 'Font Set',
        fontFamilySupportHelper:
            'Select or input fonts. Actual rendering depends on fonts installed on the client OS/browser. If empty, the default font is used.',
        backgroundColor: 'Background Color',
        foregroundColor: 'Foreground Color',
        cursorBlink: 'Cursor Blink',
        cursorStyle: 'Cursor Style',
        cursorUnderline: 'Underline',
        cursorBlock: 'Block',
        cursorBar: 'Bar',
        scrollback: 'Scrollback',
        scrollSensitivity: 'Scroll Sensitivity',
        aiAssistant: 'AI Assistant',
        aiAccountHelper:
            'Use the selected model account to generate and fill commands. For local models like Ollama and vLLM, use a custom model account.',
        aiPrefix: 'Trigger Prefix',
        aiPrefixHelper:
            'Enter "prefix + space" and press Enter to trigger AI command generation, for example: {0} help me check disk usage.',
        aiRiskCommands: 'Risk Command Interception',
        aiRiskCommandsHelper:
            'Configure risky commands to intercept, one per line. When matched, generation will be blocked and filled back as comments.',
        aiSummary: 'When a line starts with the {0} prefix and you press Enter, AI command generation is triggered.',
        aiPrefixAsciiVisible:
            'Only ASCII visible characters are supported. Spaces, CJK characters, and full-width symbols are not allowed.',
        saveHelper: 'Are you sure you want to save the current terminal configuration?',
    },
    toolbox: {
        common: {
            toolboxHelper: 'For some installation and usage issues, see',
        },
        swap: {
            swap: 'Swap Partition',
            swapHelper1:
                'The size of the swap should be 1 to 2 times the physical memory, adjustable based on specific requirements;',
            swapHelper2:
                'Before creating a swap file, ensure that the system disk has sufficient available space, as the swap file size will occupy the corresponding disk space;',
            swapHelper3:
                'Swap can help alleviate memory pressure, but it is only an alternative. Excessive reliance on swap may lead to a decrease in system performance. It is recommended to prioritize increasing memory or optimizing application memory usage;',
            swapHelper4: 'It is advisable to regularly monitor the usage of swap to ensure normal system operation.',
            swapDeleteHelper:
                'This operation will remove the Swap partition {0}. For system security reasons, the corresponding file will not be automatically deleted. If deletion is required, please proceed manually!',
            saveHelper: 'Please save the current settings first!',
            saveSwap: 'Saving the current configuration will adjust the Swap partition {0} size to {1}. Continue?',
            swapMin: 'The minimum partition size is 40 KB. Please modify and try again!',
            swapMax: 'The maximum value for partition size is {0}. Please modify and try again!',
            swapOff: 'The minimum partition size is 40 KB. Setting it to 0 will disable the Swap partition.',
        },
        device: {
            dnsHelper: 'DNS server',
            dnsAlert:
                'Attention! Modifying the configuration of /etc/resolv.conf file will restore the file to its default values after system restart.',
            dnsHelper1:
                'When there are multiple DNS entries, they should be displayed on new lines. e.g.\n114.114.114.114\n8.8.8.8',
            hostsHelper: 'Hostname resolution',
            hosts: 'Domain',
            hostAlert: 'Hidden commented records, click the All configuration button to view or set',
            toolbox: 'Quick settings',
            hostname: 'Hostname',
            passwd: 'System password',
            passwdHelper: 'Input characters cannot include $ and &',
            timeZone: 'System time zone',
            localTime: 'Server time',
            timeZoneChangeHelper: 'Modifying the system time zone requires restarting the service. Continue?',
            timeZoneHelper:
                'If you don\'t install "timedatectl" command, you may not change the time zone. Because system uses that command to change time zone.',
            timeZoneCN: 'Beijing',
            timeZoneAM: 'Los Angeles',
            timeZoneNY: 'New York',
            ntpALi: 'Alibaba',
            ntpGoogle: 'Google',
            syncSite: 'NTP server',
            hostnameHelper:
                'Hostname modification depends on the "hostnamectl" command. If the command is not installed, the modification may fail.',
            userHelper:
                'The username depends on the "whoami" command for retrieval. If the command is not installed, retrieval may fail.',
            passwordHelper:
                'Password modification depends on the "chpasswd" command. If the command is not installed, the modification may fail.',
            hostHelper:
                'There is an empty value in the provided content. Please check and try again after modification!',
            dnsCheck: 'Test Availability',
            dnsOK: 'DNS configuration information is available!',
            dnsTestFailed: 'DNS configuration information is not available.',
            syncSiteHelper: 'Sync system time with {0}. Continue?',
        },
        fail2ban: {
            sshPort: 'Listen to SSH port',
            sshPortHelper: 'Current Fail2ban listens to the SSH connection port of the host',
            unActive: 'The Fail2ban service is not enabled at present.',
            operation: 'You will perform operation "{0}" on Fail2ban service. Continue?',
            fail2banChange: 'Fail2ban Configuration Modification',
            ignoreHelper: 'The IP list in the allowlist will be ignored for blocking. Continue?',
            bannedHelper: 'The IP list in the blocklist will be blocked by the server. Continue?',
            maxRetry: 'Maximum retry attempts',
            banTime: 'Ban time',
            banTimeHelper: 'Default ban time is 10 minutes, -1 indicates permanent ban',
            banTimeRule: 'Enter a valid ban time or -1',
            banAllTime: 'Permanent ban',
            findTime: 'Discovery period',
            banAction: 'Ban action',
            banActionOption: 'Ban specified IP addresses using {0}',
            allPorts: ' (All Ports)',
            ignoreIP: 'IP allowlist',
            bannedIP: 'IP blocklist',
            logPath: 'Log path',
            logPathHelper: 'Default is /var/log/secure or /var/log/auth.log',
        },
        ftp: {
            ftp: 'FTP account | FTP accounts',
            notStart: 'FTP service is currently not running, start it first!',
            initHelper: 'The FTP user identity is not initialized. Click Initialize in the top status bar first.',
            operation: 'This will perform "{0}" operation on FTP service. Continue?',
            noPasswdMsg: 'Cannot get the current FTP account password. Set the password and try again.',
            enableHelper: 'Enabling the selected FTP account will restore its access permissions. Continue?',
            disableHelper: 'Disabling the selected FTP account will revoke its access permissions. Continue?',
            syncHelper: 'Sync FTP account data between server and database. Continue?',
            dirSystem:
                'This directory is system-reserved. Modification may cause system crash, please modify and try again!',
            dirHelper: 'Enabling FTP requires directory permission changes - please choose carefully',
            dirMsg: 'Enabling FTP will modify permissions for the entire {0} directory. Continue?',
        },
        clam: {
            clam: 'Virus scan',
            cron: 'Scheduled scan',
            cronHelper: 'Commercial Edition supports scheduled scans',
            specErr: 'Execution schedule format error, please check and retry!',
            disableMsg:
                'Stopping scheduled execution will prevent this scan task from running automatically. Continue?',
            enableMsg:
                'Enabling scheduled execution will allow this scan task to run automatically at regular intervals. Continue?',
            showFresh: 'Show signature updater service',
            hideFresh: 'Hide signature updater service',
            clamHelper:
                'The minimum recommended configuration for ClamAV is: 3 GiB of RAM or more, single-core CPU with 2.0 GHz or higher, and at least 5 GiB of available hard disk space.',
            notStart: 'ClamAV service is currently not running, start it first!',
            removeRecord: 'Delete peport files',
            noRecords: 'Click the "Trigger" button to start the scan and you will see records here.',
            removeInfected: 'Delete virus files',
            removeInfectedHelper:
                'Delete virus files detected during the task to ensure server security and normal operation.',
            clamCreate: 'Create scan rule',
            infectedStrategy: 'Infected strategy',
            removeHelper: 'Delete virus files, choose carefully!',
            move: 'Move',
            moveHelper: 'Move virus files to specified directory',
            copyHelper: 'Copy virus files to specified directory',
            none: 'Do nothing',
            noneHelper: 'Take no action on virus files',
            scanDir: 'Scan directory',
            infectedDir: 'Infected directory',
            scanDate: 'Scan Date',
            scanResult: 'Scan logs tail',
            tail: 'Lines',
            infectedFiles: 'Infected files',
            log: 'Details',
            clamConf: 'Clam AV daemon',
            clamLog: '@:toolbox.clam.clamConf logs',
            freshClam: 'FreshClam',
            freshClamLog: '@:toolbox.clam.freshClam logs',
            alertHelper: 'Commercial Edition supports scheduled scans and SMS alerts',
            alertTitle: 'Virus scan task 「{0}」 detected infected file alert',
        },
    },
    logs: {
        core: 'Panel Service',
        agent: 'Node Monitoring',
        panelLog: 'Panel logs',
        operation: 'Operation logs',
        login: 'Login logs',
        loginIP: 'Login IP',
        loginAddress: 'Login address',
        loginAgent: 'Login agent',
        loginStatus: 'Status',
        system: 'System logs',
        hostSystem: 'Host logs',
        previousPage: 'Previous page',
        nextPage: 'Next page',
        filter: 'Message filter',
        service: 'Service',
        priority: 'Priority',
        priorityEmergency: 'Emergency',
        priorityAlert: 'Alert',
        priorityCritical: 'Critical',
        priorityError: 'Error',
        priorityWarning: 'Warning',
        priorityNotice: 'Notice',
        priorityInfo: 'Info',
        priorityDebug: 'Debug',
        message: 'Message',
        deleteLogs: 'Clean logs',
        resource: 'Resource',
        detail: {
            dashboard: 'Overview',
            ai: 'AI',
            skills_hub: 'Skills Hub',
            ai_proxy: 'AI Proxy',
            ai_benchmark: 'Benchmark',
            groups: 'Group',
            hosts: 'Host',
            apps: 'App',
            openresty: 'OpenResty',
            websites: 'Website',
            monitor: 'Website Monitor',
            containers: 'Container',
            files: 'File',
            runtimes: 'Runtime',
            process: 'Process',
            toolbox: 'Toolbox',
            backups: 'Backup / Restore',
            tampers: 'Tamper',
            xsetting: 'Interface Settings',
            logs: 'Log',
            settings: 'Setting',
            cronjobs: 'Cronjob',
            databases: 'Database',
            waf: 'WAF',
            licenses: 'License',
            nodes: 'Node',
            commands: 'Quick Commands',
            opsReport: 'Ops Report',
            ops_report: 'Ops Report',
            users: 'User Management',
            roles: 'Role',
            auth: 'Login Authentication',
            auth_sources: 'Authentication Settings',
            alert: 'Alert Notifications',
            sync: 'Resource Sync',
            exchange: 'Resource Sync',
            xapp: 'App',
            vms: 'Virtual Machines',
        },
        websiteLog: 'Website logs',
        runLog: 'Run logs',
        errLog: 'Error logs',
        task: 'Task Log',
        taskName: 'Task Name',
        taskRunning: 'Running',
    },
    file: {
        fileDirNum: '{0} directories, {1} files,',
        currentDir: 'Directory',
        dir: 'Folder',
        fileName: 'File name',
        search: 'Search',
        aiSearch: 'AI search',
        aiSearchTitle: 'AI search',
        aiSearchHint:
            'Search inside file contents line-by-line. Use the buttons on the search row and Advanced options below. When file AI is enabled and saved, a model can also return a Markdown summary.',
        aiSearchAccountTitle: 'AI account',
        aiSearchAccountIntro: 'Pick an agent account for the optional summary and click save after changes.',
        aiSearchAccountEnable: 'Enable file AI search',
        aiSearchSaveAccount: 'Save account',
        aiSearchSectionQuery: 'Search',
        aiSearchSectionConditions: 'Search criteria',
        aiSearchResultsSection: 'Results',
        aiSearchContentLabel: 'Search',
        aiSearchDirLabel: 'Directory',
        aiSearchExtLabel: 'Extensions',
        aiSearchModifiedPreset: 'Modified',
        aiSearchSizePresetLabel: 'File size',
        aiSearchTimeAny: 'Any time',
        aiSearchTime3h: 'Last 3 hours',
        aiSearchTime1d: 'Last 1 day',
        aiSearchTime7d: 'Last 7 days',
        aiSearchTime30d: 'Last 30 days',
        aiSearchTimeCustom: 'Custom range',
        aiSearchSizeAny: 'Any size',
        aiSearchSize0_10mb: '0 ~ 10 MB',
        aiSearchSize10_100mb: '10 MB ~ 100 MB',
        aiSearchSize100_1gb: '100 MB ~ 1 GB',
        aiSearchSizeGte1gb: '≥ 1 GB',
        aiSearchSizeCustom: 'Custom (bytes)',
        aiSearchPlaceholder: 'Keywords or a short question, e.g. files related to logs',
        aiSearchContainSub: 'Recursive',
        aiSearchMaxItems: 'Cap on paths/files included in search (directory listing, 1–2000)',
        aiSearchRun: 'Analyze',
        aiSearchTruncated: 'Too many entries; only part of the listing was sent. Results may be incomplete.',
        aiSearchPreFiltered: 'Paths were pre-filtered by keyword to reduce the set sent to the model.',
        aiSearchMeta: 'Items analyzed: {0} | Duration {1} | Tokens {2}',
        aiSearchQueryRequired: 'Enter keywords or a short description',
        aiSearchContentHits: 'Content matches',
        aiSearchContentScanMeta: 'Content scan: {0} file(s) read (per your search options; limits apply).',
        aiSearchNoLineHits:
            'No lines matched your search in scanned text files. The summary above may still reflect path names and metadata.',
        aiSearchHitsTruncated: 'Some files were not scanned or the hit list was truncated by limits.',
        aiSearchHitFiles: 'Files with matches',
        aiSearchHitLines: 'Matching lines',
        aiSearchOpenFile: 'Open in editor',
        aiSearchOpenAtLine: 'Open at this line',
        aiSearchGrepOnlyHint:
            'File AI is off: only deterministic content search runs—no model. Enable an AI account above for summaries. The search row and options below still apply.',
        aiSearchMatchCase: 'Case sensitive',
        aiSearchWholeWord: 'Whole word (ASCII word boundaries)',
        aiSearchUseRegex: 'Regular expression (RE2 syntax)',
        aiSearchExtensions: 'File extensions (comma-separated, e.g. go,ts,md)',
        aiSearchMinSize: 'Min file size (bytes, 0 = no limit)',
        aiSearchMaxSize: 'Max file size (bytes, 0 = no limit)',
        aiSearchSectionAdvanced: 'Advanced options',
        aiSearchLimitMaxItems: 'Total files to search (cap)',
        aiSearchLimitMaxScan: 'Files to scan',
        aiSearchLimitMaxBytes: 'Per-file read cap (content scan)',
        aiSearchLimitHitsPerFile: 'Hits per file',
        aiSearchLimitTotalHits: 'Total hits cap',
        aiSearchLimitUnitEntries: 'entries',
        aiSearchLimitUnitFiles: 'files',
        aiSearchLimitUnitBytes: 'B',
        aiSearchLimitUnitLines: 'lines',
        aiSearchMaxScanFiles: 'Max files to scan for content',
        aiSearchMaxFileBytes:
            'Max bytes read from each file during content scanning. Unlike the size filter above (on-disk size decides listing), this caps how much is read for matching.',
        aiSearchMaxHitsPerFile: 'Max hits per file',
        aiSearchMaxTotalHits: 'Max total hits',
        aiSearchGrepMetaContent:
            'Content scan: {0} total entries listed, {1} text file(s) read (current filters; size/count limits apply). Duration {2}',
        aiSearchAdvancedResetDefaults: 'Reset to defaults',
        mode: 'Permissions',
        editPermissions: 'Edit permissions',
        owner: 'Owner',
        file: 'File',
        remoteFile: 'Download from remote',
        share: 'Share',
        sync: 'Data Synchronization',
        size: 'Size',
        updateTime: 'Modified',
        rename: 'Rename',
        role: 'Permissions',
        info: 'View attributes',
        linkFile: 'Soft link',
        shareList: 'Share list',
        fileTools: 'File tools',
        zip: 'Compressed',
        group: 'Group',
        path: 'Path',
        public: 'Others',
        setRole: 'Set permissions',
        link: 'File link',
        rRole: 'Read',
        wRole: 'Write',
        xRole: 'Executable',
        name: 'Name',
        compress: 'Compress',
        deCompress: 'Decompress',
        compressType: 'Compress format',
        compressDst: 'Compress path',
        replace: 'Overwrite existing files',
        compressSuccess: 'Compressed successfully',
        deCompressSuccess: 'Decompress succeeded',
        deCompressDst: 'Decompress path',
        linkType: 'Link type',
        softLink: 'Soft link',
        hardLink: 'Hard link',
        linkPath: 'Link path',
        selectFile: 'Select file',
        downloadUrl: 'Remote URL',
        downloadStart: 'Download started',
        wgetUrlInvalid: 'Please enter a valid http(s) download URL',
        moveSuccess: 'Successfully moved',
        copySuccess: 'Successfully copied',
        pasteMsg: 'Click the [Paste] button at the top right of the target directory',
        move: 'Move',
        calculate: 'Calculate',
        remark: 'Remark',
        setRemark: 'Set remark',
        remarkPrompt: 'Enter a remark',
        remarkPlaceholder: 'Remark',
        remarkToggle: 'Remarks',
        remarkToggleTip: 'Load file remarks',
        canNotDeCompress: 'Cannot decompress this file',
        uploadSuccess: 'Successfully upload',
        downloadProcess: 'Download progress',
        downloading: 'Downloading...',
        stopWgetConfirm: 'Are you sure you want to stop this download task?',
        infoDetail: 'File properties',
        root: 'Root directory',
        list: 'File list',
        sub: 'Recursive',
        downloadSuccess: 'Successfully downloaded',
        theme: 'Theme',
        language: 'Language',
        eol: 'End of line',
        history: 'Version history',
        historyTitle: 'Version history',
        historyHint:
            'This records the version before each file change, lets you review the content change history, and roll back content revisions.',
        historySettingTitle: 'Version settings',
        historyEnable: 'Enable version records',
        historyMaxPerPath: 'Keep per file',
        historyDiskQuota: 'Global disk quota (MB)',
        historyCurrentScope: 'Current file',
        historyAllScope: 'All files',
        historyDeleteConfirm: 'Are you sure you want to delete the selected history records?',
        historyNeedFile: 'Open a file first',
        historyRestore: 'Restore this version',
        historyOperationOnlyHint: 'The selected item is a file operation and does not support version restores.',
        historyCurrentFile: 'Current file',
        historyLatestVersion:
            'Left shows history version content, right shows the selected file’s latest version content',
        historyCompareTarget: 'Compare target',
        historyCompareTargetPath: 'Compare path',
        historyRestoreConfirm: 'Restore this version to the current file?',
        historyRestoreDirtyConfirm: 'The current file has unsaved changes. Restoring will overwrite them. Continue?',
        historyRestoreSuccess: 'Version restored successfully',
        historyDirtyHint: 'The current editor has unsaved changes. Restoring a version will overwrite them.',
        historyDiffHintCurrent:
            'The left side shows the history version and the right side shows the current file content',
        historyDiffHintAll:
            'The left side shows the history version and the right side shows the selected file’s latest version',
        copyDir: 'Copy',
        shareFile: 'Share file',
        shareExpire: 'Expires in',
        shareExpire1h: '1 hour',
        shareExpire6h: '6 hours',
        shareExpire24h: '24 hours',
        shareExpire3d: '3 days',
        shareExpire7d: '7 days',
        sharePassword: 'Password',
        sharePasswordPlaceholder: 'Leave empty for no password',
        shareMaxDownloads: 'Max downloads',
        shareMaxDownloadsHint: '0 means unlimited',
        shareGenerate: 'Create link',
        shareRegenerate: 'Share again',
        shareClose: 'Close',
        shareCancel: 'Cancel share',
        shareCancelConfirm: 'Are you sure you want to cancel this file share?',
        shareDetail: 'Details',
        shareCopyLink: 'Copy link',
        shareLinkLabel: 'Share link',
        shareQrCode: 'QR code',
        shareQrDialogTitle: 'Share link QR code',
        shareQrDialogHelper: 'Scan this QR code with your mobile device',
        shareSaveImage: 'Save image',
        shareOpenImage: 'Open image',
        shareExtractFile: 'Extract file',
        shareDownloadingHint: 'Preparing your file, download will begin shortly.',
        shareInvalid: 'Invalid or expired share link',
        shareDownloadFailed: 'Download failed, please try again later',
        sharePasswordRequired: 'Password',
        sharePasswordRequiredInput: 'Please enter the share password',
        sharePasswordLengthHint: 'Share password length must be 4-256 characters',
        shareDownloadPasswordTip: 'This link is password-protected. Enter the password before downloading.',
        shareRiskAlert:
            'Shared links may carry security risks. Only share with trusted people and avoid exposing sensitive information.',
        sharePasswordSeparate:
            'A password is set. Share it securely. Recipients must add &password=... to the URL or use a client that can pass the password query parameter.',
        shareExpiresAt: 'Expires at',
        paste: 'Paste',
        changeOwner: 'Modify user and user group',
        containSub: 'Apply the permission change recursively',
        ownerHelper:
            'The default user of the PHP operating environment: the user group is 1000:1000, it is normal that the users inside and outside the container show inconsistencies',
        searchHelper: 'Support wildcards such as *',
        uploadFailed: '[{0}] File upload failed',
        fileUploadStart: 'Uploading [{0}]...',
        uploadOverallProgress: 'Overall progress',
        uploadCurrentFileProgress: 'Current file',
        currentSelect: 'Current selection: ',
        unsupportedType: 'Unsupported file type',
        deleteHelper:
            'Are you sure you want to delete the following files? By default, it will enter the recycle bin after deletion',
        fileHelper: "Note:\n1. Search results can't be sorted.\n2. Folders can't be sorted by size.",
        forceDeleteHelper: 'Permanently delete the file (without entering the recycle bin, delete it directly)',
        recycleBin: 'Recycle bin',
        sourcePath: 'Original path',
        deleteTime: 'Delete time',
        confirmReduce: 'Are you sure you want to restore the following files?',
        reduceSuccess: 'Restore successful',
        reduce: 'Reduction',
        reduceHelper:
            'If a file or directory with the same name exists in the original path, it will be overwritten. Continue?',
        clearRecycleBin: 'Clean',
        clearRecycleBinHelper: 'clean the recycle bin?',
        favorite: 'Favorites',
        removeFavorite: 'Remove from favorites?',
        addFavorite: 'Add/Remove to Favorites',
        addFavoriteAction: 'Add to Favorites',
        removeFavoriteAction: 'Remove from Favorites',
        clearList: 'Clean list',
        deleteRecycleHelper: 'Are you sure you want to permanently delete the following files?',
        typeErrOrEmpty: '[{0}] file type is wrong or empty folder',
        dropHelper: 'Drag the files you want to upload here',
        fileRecycleBin: 'Enable recycle bin',
        fileRecycleBinMsg: '{0} recycle bin',
        wordWrap: 'Automatically wrap',
        deleteHelper2:
            'Are you sure you want to delete the selected file? The deletion operation cannot be rolled back',
        ignoreCertificate: 'Allow insecure server connections',
        ignoreCertificateHelper:
            'Allowing inscure server connections may lead to data leak or tampering. Use this option only when trusting the download source.',
        useProxy: 'Use proxy for download',
        useProxyHelper: 'Use the proxy server configured in panel settings to access the remote download URL',
        uploadOverLimit: 'The number of files exceeds 1000! Please compress and upload',
        clashDidNotSupport: 'File names are prohibited from containing .1panel_clash',
        clashDeleteAlert: 'The "Recycle Bin" folder can\'t be deleted',
        clashOpenAlert: 'Click the "Recycle Bin" button to open the recycle bin directory',
        right: 'Forward',
        back: 'Back',
        top: 'Go Back',
        up: 'Go back',
        openWithVscode: 'Open with VS Code',
        vscodeHelper:
            'Confirm the authentication mode, host, port, and username. Key authentication requires SSH configuration on the computer running VS Code before use.',
        vscodeCopyConfig: 'Copy setup script',
        vscodeKeyHelper:
            'The private key download name is derived from the configured path. Save the file to that path; the setup script will verify it and apply permissions.',
        vscodeKeyPath: 'SSH private key path',
        vscodeKeyPathPlaceholder: 'For example: ~/.ssh/id_ed25519',
        vscodeSelectKey: 'SSH private key',
        vscodeScriptPreview: 'SSH setup script',
        vscodePasswordHelper:
            'Password authentication does not write to the local SSH config. Enter the password in VS Code when connecting to the remote host.',
        vscodePasswordHint:
            'Password authentication connects with the configured host, port, and username. No setup script or private key file is required.',
        vscodeScriptPreviewHint:
            'Run the setup script on the computer running VS Code to register the SSH alias for remote connections. Rerun it after changing the host, port, username, private key, or key path.',
        vscodePasswordModeTitle: 'Password authentication',
        vscodePasswordModeHint:
            'Password authentication connects with the configured host, port, and username. No setup script or private key file is required.',
        vscodePasswordStep1: 'Confirm the host, port, and username.',
        vscodePasswordStep2: 'Open VS Code and enter the password when prompted.',
        vscodePasswordStep3: 'No private key download is required for this mode.',
        saveContentAndClose: 'The file has been modified, do you want to save and close it?',
        saveAndOpenNewFile: 'The file has been modified, do you want to save and open the new file?',
        noEdit: 'The file has not been modified, no need to do this!',
        noNameFolder: 'Untitled folder',
        noNameFile: 'Untitled file',
        minimap: 'Code mini map',
        fileCanNotRead: 'File cannot read',
        previewTruncated: 'File is too large, only showing the last part',
        previewEmpty: 'File is empty or not a text file',
        previewLargeFile: 'Preview',
        panelInstallDir: "1Panel installation directory can't be deleted",
        wgetTask: 'Download Task',
        existFileTitle: 'Same name file prompt',
        existFileHelper: 'The uploaded file contains a file with the same name, do you want to overwrite it?',
        existFileSize: 'File size (new -> old)',
        existFileDirHelper: 'The selected file/folder has a duplicate name. Please proceed with caution! \n',
        coverDirHelper: 'The selected folders to be replaced will be copied to the destination path!',
        noSuchFile: 'The file or directory was not found. Please check and try again.',
        setting: 'Setting',
        showHide: 'Show hidden files',
        noShowHide: 'Don’t show hidden files',
        cancelUpload: 'Cancel Upload',
        cancelUploadHelper: 'Whether to cancel the upload, after cancellation the upload list will be cleared.',
        keepOneTab: 'Keep at least one tab',
        notCanTab: 'Cannot add more tabs',
        convert: 'Convert Format',
        converting: 'Convert To',
        fileCanNotConvert: 'This file does not support format conversion',
        formatType: 'Format Type',
        sourceFormat: 'Source Format',
        sourceFile: 'Source File',
        saveDir: 'Save Directory',
        deleteSourceFile: 'Delete Source File',
        convertHelper: 'Convert the selected files to another format',
        convertHelper1: 'Select the files to be converted',
        execConvert: 'Start conversion. You can view the conversion logs in the Tasks',
        convertLogs: 'Conversion Logs',
        formatConvert: 'Format Conversion',
    },
    ssh: {
        autoStart: 'Auto start',
        enable: 'Enable Autostart',
        disable: 'Disable Autostart',
        sshAlert:
            'The list data is sorted based on login date. Changing time zone or performing other operations may cause deviations in the date of login logs.',
        sshAlert2:
            'You can use "Fail2ban" in the "Toolbox" to block IP addresses that attempt brute force attacks, and this will enhance the security of the host.',
        sshOperate: 'Operation "{0}" on the SSH service will be performed. Continue?',
        sshChange: 'SSH Setting',
        sshChangeHelper: 'This action changed "{0}" to "{1}". Continue?',
        sshFileChangeHelper:
            'Modifying the configuration file may cause service availability. Exercise caution when performing this operation. Continue?',
        port: 'Port',
        portHelper: 'Specific the port that SSH service listens on.',
        listenAddress: 'Listen address',
        allV4V6: '0.0.0.0:{0}(IPv4) and :::{0}(IPv6)',
        listenHelper:
            'Leaving both of IPv4 and IPv6 settings blank will listen on "0.0.0.0:{0}(IPv4)" and ":::{0}(IPv6)".',
        addressHelper: 'Specify the address that SSH service listens on.',
        permitRootLogin: 'Permit root',
        rootSettingHelper: 'The default login method for root user is "Allow SSH login".',
        rootHelper1: 'Allow SSH login',
        rootHelper2: 'Disable SSH login',
        rootHelper3: 'Only key login is allowed',
        rootHelper4: 'Only predefined commands can be executed. No other operations can be performed.',
        passwordAuthentication: 'Password auth',
        pwdAuthHelper: 'Whether to enable password authentication. This parameter is enabled by default.',
        pubkeyAuthentication: 'Key auth',
        privateKey: 'Private Key',
        publicKey: 'Public Key',
        password: 'Password',
        createMode: 'Creation Method',
        generate: 'Auto-generate',
        unSyncPass: 'Key password cannot be synchronized',
        syncHelper: 'The sync operation will clean invalid keys and sync new complete key pairs. Continue?',
        input: 'Manual Input',
        import: 'File Upload',
        authKeys: 'Authorization Keys',
        authKeysHelper: 'Save current public key information?',
        pubkey: 'Key info',
        pubKeyHelper: 'The current key information only takes effect for user {0}',
        encryptionMode: 'Encryption mode',
        passwordHelper: 'Can contain 6 to 10 digits and English cases',
        reGenerate: 'Regenerate key',
        keyAuthHelper: 'Whether to enable key authentication.',
        useDNS: 'useDNS',
        dnsHelper:
            'Control whether the DNS resolution function is enabled on the SSH server to verify the identity of the connection.',
        confFileOrderHelper:
            'Use the dropdown to switch config files and edit/save directly; settings apply by load order, and earlier loaded values win.',
        confFileOrderLabel: '{0} (Load order #{1})',
        analysis: 'Statistical information',
        denyHelper:
            "Performing a 'deny' operation on the following addresses. After setting, the IP will be prohibited from accessing the server. Continue?",
        acceptHelper:
            "Performing an 'accept' operation on the following addresses. After setting, the IP will regain normal access. Continue?",
        noAddrWarning: 'No [{0}] addresses are currently selected. Please check and try again!',
        loginLogs: 'SSH logs',
        loginMode: 'Mode',
        authenticating: 'Key',
        publickey: 'Key',
        belong: 'Belong',
        local: 'Local',
        session: 'Session | Sessions',
        loginTime: 'Login time',
        loginIP: 'Login IP',
        stopSSHWarn: 'Whether to disconnect this SSH connection',
        remote: 'Remote SSH',
    },
    setting: {
        panel: 'Panel',
        user: 'Panel user',
        userChange: 'Change panel user',
        userChangeHelper: 'Changing the panel user will log you out. Continue?',
        passwd: 'Panel password',
        emailHelper: 'For password retrieval',
        watermark: 'Watermark Settings',
        watermarkContent: 'Watermark Content',
        contentHelper:
            '{0} represents node name, {1} represents node address. You can use variables or fill in custom names.',
        watermarkColor: 'Watermark Color',
        watermarkFont: 'Watermark Font Size',
        watermarkHeight: 'Watermark Height',
        watermarkWidth: 'Watermark Width',
        watermarkRotate: 'Rotation Angle',
        watermarkGap: 'Spacing',
        watermarkCloseHelper: 'Are you sure you want to turn off the system watermark settings?',
        watermarkOpenHelper: 'Are you sure you want to save the current system watermark settings?',
        title: 'Panel alias',
        panelPort: 'Panel port',
        titleHelper:
            'Supports a length of 3 to 30 characters, including English letters, Chinese characters, numbers, spaces, and common special characters',
        portHelper:
            'The recommended port range is 8888 to 65535. Note: If the server has a security group, permit the new port from the security group in advance',
        portChange: 'Port change',
        portChangeHelper: 'Modify the service port and restart the service. Continue?',
        theme: 'Theme',
        menuTabs: 'Menu tabs',
        menuAccordion: 'Multiple menu expansion',
        menuAccordionHelper: 'After enabling, multiple sidebar menu groups can stay expanded at the same time.',
        componentSize: 'Component Size',
        dark: 'Dark',
        darkGold: 'Dark Gold',
        light: 'Light',
        auto: 'Follow System',
        language: 'Language',
        runtimeEnv: 'Runtime environment',
        docSource: 'Documentation Source',
        withByRegion: 'Match Region Setting (Default)',
        withByLang: 'Match System Language',
        region: 'Region',
        cn: 'Mainland China',
        intl: 'Global',
        regionHelper: 'Changing the region will switch the following resource sources:',
        regionHelper1: 'System installation packages',
        regionHelper2: 'App Store and script library',
        regionHelper3: 'User manual and related documents',
        regionHelper4: 'This may affect future downloads and access. Proceed with caution.',
        regionTip: 'Region affects the system update source and package download address.',
        docSourceTip: 'Documentation source determines the language used for documentation and release note links.',
        languageHelper:
            'By default, it follows the browser language. This parameter takes effect only on the current browser',
        sessionTimeout: 'Session timeout',
        sessionTimeoutError: 'The minimum session timeout is 300 seconds',
        sessionTimeoutHelper:
            'The panel will automatically be logged out if there is no operation for more than {0} second(s).',
        systemIP: 'System address',
        systemIPHelper:
            'The address will be used for application redirection, container access, and other functions. Each node can be configured with a different address.',
        proxy: 'Server proxy',
        proxyHelper: 'It will be effective in the following scenarios after you set up the proxy server:',
        proxyHelper1: 'Installation package downloads and App Store sync (Commercial Edition only)',
        proxyHelper2: 'System updates and update checks (Commercial Edition only)',
        proxyHelper3: 'System license verification and synchronization',
        proxyHelper4:
            'Network requests such as Docker image pulls go through the proxy server (Commercial Edition only)',
        proxyHelper5: 'Unified download and sync for system script libraries (Commercial Edition)',
        proxyHelper6: 'Certificate requests (Commercial Edition)',
        proxyType: 'Proxy type',
        proxyUrl: 'Proxy Address',
        proxyPort: 'Proxy Port',
        proxyPasswdKeep: 'Remember Password',
        proxyDocker: 'Docker Proxy',
        proxyDockerHelper:
            'Synchronize proxy server configuration to Docker, support offline server image pulling and other operations',
        syncToNode: 'Sync to Node',
        syncToNodeHelper: 'Sync settings to other nodes',
        nodes: 'Node',
        selectNode: 'Select Node',
        selectNodeError: 'Select a node',
        apiInterface: 'Enable API',
        apiInterfaceClose: 'Once closed, API interfaces cannot be accessed. Continue?',
        apiInterfaceHelper: 'Allow third-party applications to access the API.',
        apiInterfaceAlert1: "Don't enable it in production environments because it may increase server security risks.",
        apiInterfaceAlert2: "Don't use third-party applications to call the API to prevent potential security threats.",
        apiInterfaceAlert3: 'API Documentation',
        apiInterfaceAlert4: 'Usage Guide',
        apiKey: 'API key',
        apiKeyHelper: 'API key is used for third-party applications to access the API.',
        ipWhiteList: 'IP allowlist',
        ipWhiteListEgs: 'One per line. For example,\n172.161.10.111\n172.161.10.0/24',
        ipWhiteListHelper: 'IPs within the allowlist can access the API,0.0.0.0/0 (all IPv4), ::/0 (all IPv6)',
        apiTrustedProxies: 'API trusted proxies',
        apiTrustedProxiesEgs: 'One proxy server IP or CIDR per line. For example,\n172.16.10.111\n172.16.10.0/24',
        apiTrustedProxiesHelper:
            'When using a reverse proxy, enter the IP address or network of the proxy server to correctly obtain the client IP. Otherwise, leave this blank. 0.0.0.0/0 and ::/0 are not supported.',
        apiKeyValidityTime: 'Validity period of interface key',
        apiKeyValidityTimeEgs: 'Validity period of interface key (in minutes)',
        apiKeyValidityTimeHelper:
            'The interface timestamp is valid if its difference from the current timestamp (in minutes) is within the allowed range. A value of 0 disables verification.',
        apiKeyReset: 'Interface key reset',
        apiKeyResetHelper: 'the associated key service will become invalid. Please add a new key to the service',
        confDockerProxy: 'Configure docker proxy',
        restartNowHelper: 'Configuring Docker proxy requires restarting the Docker service.',
        restartNow: 'Restart immediately',
        restartLater: 'Restart manually later',
        systemIPWarning: 'The server address is not currently set. Set it in the control panel first.',
        systemIPWarning1: 'The current server address is set to {0}, and quick redirection is not possible!',
        syncTime: 'Server Time',
        timeZone: 'Time Zone',
        timeZoneChangeHelper: 'Changing the time zone requires restarting the service. Continue?',
        timeZoneHelper:
            'Timezone modification depends on the system timedatectl service. take effect after restart the 1Panel service.',
        timeZoneCN: 'Bei Jing',
        timeZoneAM: 'Los Angeles',
        timeZoneNY: 'New York',
        ntpALi: 'Alibaba',
        ntpGoogle: 'Google',
        syncSite: 'Ntp Server',
        syncSiteHelper: 'This operation will use {0} as the source for system time synchronization. Continue?',
        changePassword: 'Change Password',
        oldPassword: 'Original password',
        newPassword: 'New password',
        retryPassword: 'Confirm password',
        passwordEmptyTip: 'Leave it empty to keep the current password unchanged',
        noSpace: 'Input information cannot include space characters',
        duplicatePassword: 'The new password cannot be the same as the original password, enter again!',
        diskClean: 'Cache clean',
        developerMode: 'Preview Program',
        developerModeHelper:
            "You will get to expirence new features and fixes before they're released broadly and give early feedback.",
        thirdParty: 'Third-party accounts',
        scope: 'Scope',
        public: 'Public',
        publicHelper:
            'Public type backup accounts will be synchronized to each sub-node, and sub-nodes can use them together',
        private: 'Private',
        privateHelper:
            'Private type backup accounts are only created on the current node and are for the use of the current node only',
        noTypeForCreate: 'No backup type is currently created',
        LOCAL: 'Server disk',
        OSS: 'Ali OSS',
        S3: 'Amazon S3',
        mode: 'Mode',
        MINIO: 'MinIO',
        SFTP: 'SFTP',
        WebDAV: 'WebDAV',
        WebDAVAlist: 'WebDAV connect Alist can refer to the official documentation',
        UPYUN: 'UPYUN',
        ALIYUN: 'Aliyun Drive',
        ALIYUNHelper:
            'The current maximum limit for non-client downloads on Aliyun Drive is 100 MB. Exceeding this limit requires downloading through the client.',
        ALIYUNRecover:
            'The current maximum limit for non-client downloads on Aliyun Drive is 100 MB. Exceeding this limit requires downloading through the client to the local device, then synchronizing the snapshot for recovery.',
        GoogleDrive: 'Google Drive',
        analysis: 'Analysis',
        analysisHelper:
            'Paste the entire token content to automatically parse the required parts. For specific operations, see the official documentation.',
        serviceName: 'Service name',
        operator: 'Operator',
        OneDrive: 'Microsoft OneDrive',
        isCN: 'Century Internet',
        isNotCN: 'International Version',
        client_id: 'Client ID',
        client_secret: 'Client secret',
        redirect_uri: 'Redirect URL',
        onedrive_helper: 'Custom configuration can be referred to in the official documentation',
        clickToRefresh: 'Click to refresh',
        refreshTime: 'Token Refresh Time',
        refreshStatus: 'Token Refresh Status',
        backupDir: 'Backup directory',
        codeWarning: 'The current authorization code format is incorrect, confirm again!',
        code: 'Auth code',
        codeHelper:
            'Click on the "Acquire" button, then login to {0} and copy the content after "code" in the redirected link. Paste it into this input box. For specific instructions, see the official documentation.',
        googleHelper:
            'Please first create a Google application and obtain client information, fill in the form and click the get button. For specific operations, see the official documentation.',
        loadCode: 'Acquire',
        COS: 'Tencent COS',
        ap_beijing_1: 'Beijing Zone 1',
        ap_beijing: 'Beijing',
        ap_nanjing: 'Nanjing',
        ap_shanghai: 'Shanghai',
        ap_guangzhou: 'Guangzhou',
        ap_chengdu: 'Chengdu',
        ap_chongqing: 'Chongqing',
        ap_shenzhen_fsi: 'Shenzhen Financial',
        ap_shanghai_fsi: 'Shanghai Financial',
        ap_beijing_fsi: 'Beijing Financial',
        ap_hongkong: 'Hong Kong, China',
        ap_singapore: 'Singapore',
        ap_mumbai: 'Mumbai',
        ap_jakarta: 'Jakarta',
        ap_seoul: 'Seoul',
        ap_bangkok: 'Bangkok',
        ap_tokyo: 'Tokyo',
        na_siliconvalley: 'Silicon Valley (US West)',
        na_ashburn: 'Ashburn (US East)',
        na_toronto: 'Toronto',
        sa_saopaulo: 'Sao Paulo',
        eu_frankfurt: 'Frankfurt',
        KODO: 'Qiniu Kodo',
        scType: ' Storage type',
        typeStandard: 'Standard',
        typeStandard_IA: 'Standard_IA',
        typeArchive: 'Archive',
        typeDeep_Archive: 'Deep_Archive',
        scLighthouse: 'Default, Lightweight object storage only supports this storage type',
        scStandard:
            'Standard storage, suitable for business scenarios with large amounts of frequently accessed hot files and frequent data interactions.',
        scStandard_IA:
            'Infrequent access storage, suitable for business scenarios with lower access frequency (e.g., average monthly access frequency of 1-2 times), minimum storage duration of 30 days.',
        scArchive: 'Archival storage is suitable for business scenarios with extremely low access frequency.',
        scDeep_Archive: 'Durable cold storage is suitable for business scenarios with extremely low access frequency.',
        archiveHelper:
            'Archival storage files cannot be downloaded directly and must first be restored through the corresponding cloud service provider`s website. Please use with caution!',
        backupAlert:
            'If a cloud provider is compatible with the S3 protocol, you can directly use Amazon S3 for backup. ',
        domain: 'Accelerate domain',
        backupAccount: 'Backup account | Backup accounts',
        loadBucket: 'Get bucket',
        accountName: 'Account name',
        accountKey: 'Account key',
        address: 'Address',
        path: 'Path',
        safe: 'Security',
        passkey: 'Passkey',
        passkeyManage: 'Manage',
        passkeyKeyManagement: 'Key Management',
        passkeyHelper: 'For quick login, up to 5 passkeys can be bound',
        passkeyRequireSSL: 'Passkeys require a bound domain name and HTTPS access',
        passkeyTrustedProxies: 'Trusted proxies',
        passkeyTrustedProxiesHelper:
            'Only requests from these IP/CIDR sources will trust Forwarded and X-Forwarded-Proto when determining HTTPS',
        passkeyNotSupported: 'Current browser or environment does not support passkeys',
        passkeyPrereqTitle: 'The following prerequisites are required for Passkey',
        passkeyPrereqBindDomain: '1Panel domain binding configured',
        passkeyPrereqHttps: 'Accessed securely via HTTPS',
        passkeyPrereqBrowser: 'Environment supports Passkey (WebAuthn + platform authenticator)',
        passkeyPrereqBrowserDetailWebAuthnUnavailable:
            'Use a system browser and make sure the panel is opened over HTTPS with a bound domain.',
        passkeyPrereqBrowserDetailPlatformCapabilityUnavailable:
            'This environment cannot use device authentication. Try a system browser on a newer OS version.',
        passkeyPrereqBrowserDetailNoPlatformAuthenticator:
            'Enable screen lock / fingerprint / face unlock / Windows Hello, then try again.',
        passkeyPrereqBrowserDetailDetectFailed: 'Detection failed. Refresh and retry, or switch to a system browser.',
        passkeyPrereqGoSetup: 'Configure',
        passkeyCount: 'Bound {0}/{1}',
        passkeyName: 'Name',
        passkeyNameHelper: 'Enter a name to distinguish devices',
        passkeyAdd: 'Add Passkey',
        passkeyCreatedAt: 'Created At',
        passkeyLastUsedAt: 'Last Used',
        passkeyDeleteConfirm: 'After deletion, this passkey cannot be used to log in. Continue?',
        passkeyLimit: 'Up to 5 passkeys can be bound',
        passkeyFailed: 'Passkey registration failed, confirm that the panel SSL certificate is a trusted certificate',
        bindInfo: 'Bind info',
        bindAll: 'Listen All',
        bindInfoHelper:
            'Changing the service listening address or protocol may result in service unavailability. Continue?',
        ipv6: 'Listen IPv6',
        bindAddress: 'Listen address',
        entrance: 'Entrance',
        showEntrance: 'Show disabled alert in "Overview" page',
        entranceHelper:
            'Enabling security entrance will only allow logging in to the panel through specified security entrance.',
        entranceError: 'Enter a secure login entry point of 5-116 characters, only numbers or letters are supported.',
        entranceInputHelper: 'Leave it blank to disable the security entrance.',
        randomGenerate: 'Random',
        expirationTime: 'Expiration Date',
        unSetting: 'Not set',
        noneSetting:
            'Set the expiration time for the panel password. After the expiration, you need to reset the password',
        expirationHelper: 'If the password expiration time is 0 days, the password expiration function is disabled',
        days: 'Password expiration days',
        expiredHelper: 'The current password has expired. Please change the password again.',
        timeoutHelper: 'The panel password will expire in {0} days. After it expires, you need to reset the password',
        complexity: 'Complexity validation',
        complexityHelper:
            'After it is enabled, the password must be 8-30 characters long and contain at least two of letters, numbers, and special characters.',
        bindDomain: 'Bind domain',
        unBindDomain: 'Unbind domain',
        panelSSL: 'Panel SSL',
        unBindDomainHelper: 'The action of unbinding a domain name may cause system insecurity. Continue?',
        bindDomainHelper: 'After you bind the domain, only that domain can access 1Panel service.',
        bindDomainHelper1: 'Leave it blank to disable the domain name binding.',
        bindDomainWarning:
            'After domain binding, you will be logged out and can only access 1Panel service through the domain name specified in the settings. Continue?',
        allowIPs: 'Authorized IP',
        unAllowIPs: 'Unauthorized IP',
        unAllowIPsWarning:
            'Authorizing an empty IP will allow all IPs to access the system, which may cause system insecurity. Continue?',
        allowIPsHelper:
            'After you set the authorized IP address list, only the IP address in the list can access the panel service.',
        allowIPsWarning:
            'After you set the authorized IP address list, only the IP address in the list can access the panel service. Continue?',
        allowIPsHelper1: 'Leave it blank to disable the IP address restriction.',
        allowIPEgs: 'One per line. For example,\n172.16.10.111\n172.16.10.0/24',
        mfa: 'Two-Factor Auth',
        mfaClose: 'Disabling MFA will reduce the security of the service. Continue?',
        secret: 'Secret',
        mfaInterval: 'Refresh interval(s)',
        mfaTitleHelper:
            'The title is used to distinguish different 1Panel hosts. Scan again or manually add the secret key after you modify the title.',
        mfaIntervalHelper:
            'Scan again or manually add the secret key after changing the refresh interval.\nSome authenticators only support a 30-second interval (for example, Google/Microsoft Authenticator).',
        mfaAlert:
            'One-time token is dynamically generated 6-digit number and based on the current time. Make sure that the server time is synchronized.',
        mfaHelper: 'After you enabled it, the one-time token needs to be verified.',
        mfaHelper1: 'Download an authenticator app, for example,',
        mfaHelper2:
            'To obtain the one-time token, scan the following QR code using your authenticator app or copy the secret key into your authentication app.',
        mfaHelper3: 'Enter six digits from the app',
        mfaCode: 'One-time token',
        sslChangeHelper: 'Modify the https setting and restart the service. Continue?',
        sslDisable: 'Disable',
        sslDisableHelper:
            'If the https service is disabled, you need to restart the panel for it to take effect. Continue?',
        noAuthSetting: 'Unauthorized setting',
        noAuthSettingHelper:
            "When users don't log in with specified security entrance, or don't access the panel from specified IP or domain name, this response can hid panel characteristic.",
        responseSetting: 'Response setting',
        help200: 'Help Page',
        error400: 'Bad Request',
        error401: 'Unauthorized',
        error403: 'Forbidden',
        error404: 'Not Found',
        error408: 'Request Timeout',
        error416: 'Range Not Satisfiable',
        error444: 'Connection Closed',
        error500: 'Internal Server Error',
        https: 'Setting HTTPS for the panel improves access security',
        strictHelper: 'Non-HTTPS traffic cannot connect to the panel',
        muxHelper:
            "The panel will listen on both HTTP and HTTPS protocols and redirect HTTP traffic to HTTPS, but this may reduce the panel's security",
        certType: 'Certificate type',
        selfSigned: 'Self signed',
        selfSignedHelper: 'Browsers may not trust self-signed certificates and may display security warnings.',
        select: 'Select',
        domainOrIP: 'Domain or IP:',
        timeOut: 'Timeout',
        rootCrtDownload: 'Root certificate download',
        primaryKey: 'Primary key',
        certificate: 'Certificate',
        backupJump:
            'Backup files not in the current backup list, please try downloading from the file directory and importing for backup.',
        snapshot: 'Snapshot | Snaphshots',
        noAppData: 'No system applications available for selection',
        noBackupData: 'No backup data available for selection',
        stepBaseData: 'Base Data',
        stepAppData: 'System Application',
        stepPanelData: 'System Data',
        stepBackupData: 'Backup Data',
        stepOtherData: 'Other Data',
        operationLog: 'Retain Operation Log',
        loginLog: 'Retain Access Log',
        systemLog: 'Retain System Log',
        taskLog: 'Retain Task Log',
        monitorData: 'Retain Monitoring Data',
        dockerConf: 'Retain Docker Configuration',
        selectAllImage: 'Backup All Application Images',
        logLabel: 'Log',
        agentLabel: 'Node Configuration',
        appDataLabel: 'Application Data',
        appImage: 'Application Image',
        appBackup: 'Application Backup',
        backupLabel: 'Backup Directory',
        confLabel: 'Configuration File',
        dockerLabel: 'Container',
        taskLabel: 'Scheduled Task',
        resourceLabel: 'Application Resource Directory',
        runtimeLabel: 'Runtime Environment',
        appLabel: 'Application',
        databaseLabel: 'Database',
        snapshotLabel: 'Snapshot File',
        websiteLabel: 'Website',
        directoryLabel: 'Directory',
        appStoreLabel: 'Application Store',
        shellLabel: 'Script',
        tmpLabel: 'Temporary Directory',
        sslLabel: 'Certificate Directory',
        reCreate: 'Failed to create snapshot',
        reRollback: 'Rollback snapshot failed',
        deleteHelper: 'All snapshot files including those in the third-party backup account will be deleted. Continue?',
        status: 'Snapshot status',
        ignoreRule: 'Ignore rule',
        editIgnoreRule: '@:commons.button.edit @.lower:setting.ignoreRule',
        ignoreHelper:
            'This rule will be used to compress and backup the 1Panel data directory during creating snapshot. By default, socket files are ignored.',
        ignoreHelper1: 'One per line. For example,\n*.log\n/opt/1panel/cache',
        panelInfo: 'Write 1Panel basic information',
        panelBin: 'Backup 1Panel system files',
        daemonJson: 'Backup Docker configuration file',
        appData: 'Backup installed apps from 1Panel',
        panelData: 'Backup 1Panel data directory',
        backupData: 'Backup local backup directory for 1Panel',
        compress: 'Create Snapshot file',
        upload: 'Upload snapshot file',
        recoverDetail: 'Recover detail',
        recoverFailed: 'Snapshot recovery failed',
        importHelper: 'Snapshot directory: ',
        lastRecoverAt: 'Last recovery time',
        lastRollbackAt: 'Last rollback time',
        reDownload: 'Download the backup file again',
        recoverErrArch: 'Snapshot recovery between different server architectures is not supported!',
        recoverErrSize: 'Detected insufficient disk space, please check or clean up and try again!',
        recoverHelper: 'Starting recovery from snapshot {0}, confirm the following information before proceeding:',
        recoverHelper1: 'Recovery requires restarting Docker and 1Panel services',
        recoverHelper2:
            'Please ensure there is sufficient disk space on the server (Snapshot file size: {0}, Available space: {1})',
        recoverHelper3:
            'Please ensure the server architecture matches the architecture of the server where the snapshot was created (Current server architecture: {0})',
        recoverHelper4:
            'This operation only rolls back the primary node. If any upgraded secondary nodes exist, roll them back first before continuing.',
        rollback: 'Rollback',
        rollbackHelper:
            'Rolling back this recovery will replace all files from this recovery, and may require restarting Docker and 1Panel services. Continue?',
        upgradeRecord: 'Upgrade record',
        upgrading: 'Upgrading, please wait...',
        upgradeHelper: 'The upgrade requires restarting the 1Panel service. Continue?',
        noUpgrade: 'It is currently the latest version',
        versionHelper:
            'Name rules: [major version].[functional version].[Bug fix version], as shown in the following example:',
        rollbackLocalHelper:
            'The primary node does not support direct rollback. Please manually execute the [1pctl restore] command to rollback!',
        upgradeCheck: 'Check for updates',
        upgradeNotes: 'Release note',
        upgradeNow: 'Upgrade now',
        source: 'Download source',
        versionNotSame: 'Node version mismatch with the main node. Please upgrade in Node Management before retrying.',
        versionCompare:
            'Detected that node {0} is already at the latest upgradable version. Please check the primary node version and try again!',
        about: 'About',
        versionItem: 'Current Version',
        backupCopies: 'Backup Copies',
        backupCopiesHelper: 'Set the number of upgrade backup copies to keep for version rollback. 0 means keep all.',
        backupCopiesRule: 'Please keep at least 3 upgrade backup records',
        release: 'Release Notes',
        releaseHelper:
            'Failed to fetch release notes for the current environment. You can manually check the official documentation.',
        project: 'GitHub',
        issue: 'Feedback',
        doc: 'Official Documentation',
        star: 'Star',
        description: 'Linux Server Panel',
        forum: 'Discussions',
        doc2: 'Documentation',
        currentVersion: 'Version',
        license: 'License',
        bindNode: 'Bind Node',
        menuSetting: 'Menu Settings',
        menuHide: 'Menu hiding',
        menuSettingHelper: 'When only 1 submenu exists, the menu bar will display only that submenu',
        showAll: 'Show All',
        hideALL: 'Hide All',
        ifShow: 'Whether to Show',
        menu: 'Menu',
        confirmMessage: 'The page will be refreshed to update the advanced menu list. Continue?',
        recoverMessage: 'The page will be refreshed and restore the menu list to its initial state. Continue?',
        compressPassword: 'Compression password',
        backupRecoverMessage: 'Enter the compression or decompression password (leave blank to not set)',
    },
    license: {
        offLine: 'Offline',
        community: 'OSS',
        oss: 'Open Source Software',
        ee: 'Enterprise Edition',
        pro: 'Pro',
        trial: 'Trial',
        add: 'Add Community Edition',
        licenseBindHelper: 'Free node quotas can only be used when the license is bound to a node',
        licenseAlert:
            'Community Edition nodes can only be added when the license is properly bound to a node. Only nodes properly bound to the license support switching.',
        licenseUnbindHelper: 'Community Edition nodes detected for this license. Please unbind and try again!',
        subscription: 'Subscription',
        perpetual: 'Perpetual',
        product: 'Product',
        versionConstraint: '{0} Version Buyout',
        forceUnbind: 'Force Unbind',
        forceUnbindHelper:
            'Forcing unbind will ignore any errors that occur during the unbinding process and ultimately release the license binding.',
        updateForce: 'Force update (ignore all errors during unbinding to ensure final operation succeeds)',
        trialInfo: 'Version',
        authorizationId: 'Subscription ID',
        authorizedUser: 'Authorized user',
        lostHelper:
            'The license has reached the retry limit. Click Sync manually to make sure Commercial Edition features continue to work.',
        exceptionalHelper:
            'License sync verification failed. Click Sync manually to make sure Commercial Edition features work properly. Detail: ',
        quickUpdate: 'Quick update',
        import: 'Import',
        power: 'Authorize',
        unbindHelper: 'All Commercial Edition related settings will be cleaned after unbinding. Continue? ',
        importLicense: 'Import license',
        securityWarningTitle: 'Do not use cracked licenses or licenses from unknown sources.',
        securityWarningContent:
            '1Panel runs with system administration privileges. Unofficial licenses or tampered builds may cause server takeover, data leaks, and other serious security risks. Obtain licenses and installers only from official FIT2CLOUD channels.',
        importHelper: 'Click or drag the license file here',
        licenseRequiredTip:
            'The license has not been imported yet. Copy the device ID, obtain the license, and import it before logging in.',
        licenseRequiredShortTip:
            'Please copy the device ID first to obtain a license. You can log in after importing the license.',
        licenseRequiredUserTip:
            'The Enterprise Edition license is not bound. Contact a super administrator to import the license.',
        restoreCommunity: 'Restore Community Edition',
        restoreCommunityOnline: 'Online restore',
        restoreCommunityOffline: 'Offline restore',
        restoreCommunityPackageFound:
            'A usable offline Community Edition package was detected. Offline restore is available.',
        restoreCommunityPackageMissing:
            'No usable offline Community Edition package was detected. Offline restore is currently unavailable.',
        restoreCommunityOnlineHelper:
            'The Community Edition package for the current version will be downloaded automatically, and Enterprise-only data will be cleaned up.',
        restoreCommunityOfflineHelper:
            'Place an official package no older than the current Enterprise version in {path}. Switching is enabled after a usable package is detected.',
        restoreCommunityConfirm:
            'After switching versions, you can sign in to Community Edition with the current Enterprise super administrator account. Enterprise-only data will be removed during the switch. Proceed with caution.',
        restoreCommunityStarting: 'Preparing Community Edition. The panel will restart automatically when ready.',
        levelUpPro: 'Upgrade to Commercial Edition',
        licenseSync: 'License Sync',
        knowMorePro: 'Learn More',
        closeAlert: 'The current page can be closed in the panel settings',
        introduce: 'Feature Introduction',
        deviceID: 'Device ID',
        corporation: 'License company',
        expired: 'Expiration time',
        edition: 'Edition',
        standard: 'Standard',
        enterprise: 'Enterprise',
        count: 'License count',
        serialNo: 'Serial number',
        remark: 'Remark',
        waf: 'Upgrade to Commercial Edition to unlock interception maps, logs, block records, geo-blocking, custom rules, custom block pages, and more.',
        tamper: 'Upgrade to Commercial Edition to protect websites from unauthorized changes or tampering.',
        tamperHelper: 'Operation failed, the file or folder has tamper protection enabled. Please check and try again!',
        setting: 'Upgrade to Commercial Edition to customize the panel logo, welcome message, and more.',
        monitor:
            'Upgrade to Commercial Edition to view real-time website status, visitor trends, traffic sources, request logs, and more.',
        alert: 'Upgrade to Commercial Edition to receive SMS alerts, review alert logs, and stay on top of key events.',
        node: 'Upgrade to Commercial Edition to manage multiple Linux servers in 1Panel.',
        nodeApp: 'Upgrade to Commercial Edition to upgrade multi-node app versions without switching nodes manually.',
        nodeDashboard:
            'Upgrade to Commercial Edition for centralized management of multi-node apps, websites, databases, and scheduled tasks.',
        fileExchange: 'Upgrade to Commercial Edition to transfer files quickly between servers.',
        app: 'Upgrade to Commercial Edition to view service details, anomaly monitoring, and more in the mobile app.',
        cluster: 'Upgrade to Commercial Edition to manage MySQL/Postgres/Redis primary-replica clusters.',
        vllm: 'Upgrade to Commercial Edition to manage vLLM services in 1Panel with centralized deployment, configuration, lifecycle operations, and task tracking.',
        'model-downloader':
            'Upgrade to Commercial Edition to search, download, and manage local model files from HuggingFace, ModelScope, or compatible mirrors with centralized model directories and download tasks.',
    },
    clean: {
        scan: 'Start scanning',
        scanHelper: 'Easily clean up junk files produced during 1Panel runtime',
        clean: 'Clean now',
        reScan: 'Rescan',
        cleanHelper: 'Selected files and directories cannot be rolled back after cleanup. Continue?',
        statusSuggest: '(Recommended Cleaning)',
        statusClean: '(Very clean)',
        statusEmpty: 'Very clean, no cleaning needed!',
        statusWarning: '(Proceed with Caution)',
        lastCleanTime: 'Last Cleaned: {0}',
        lastCleanHelper: 'Files and directories cleaned: {0}, total cleaned: {1}',
        cleanSuccessful: 'Successfully cleaned',
        currentCleanHelper: 'Files and directories cleaned in this session: {0}, Total cleaned: {1}',
        suggest: '(Recommended)',
        totalScan: 'Total junk files to be cleaned: ',
        selectScan: 'Total selected junk files: ',
        system: 'System Junk Files',
        systemHelper: 'Temporary files generated during snapshot, upgrade, and other processes',
        panelOriginal: 'Backup files before system snapshot restore',
        upgrade: 'System upgrade backup files',
        agentPackages: 'Historical version child node upgrade/installation packages',
        upgradeHelper: '(Recommend keeping the latest upgrade backup for system rollback)',
        snapshot: 'System snapshot temporary files',
        rollback: 'Backup files before recover',
        backup: 'System Backup',
        backupHelper: 'Backup files not associated with local backup accounts',
        unknownBackup: 'System Backup',
        tmpBackup: 'Temporary Backup',
        unknownApp: 'Unassociated App Backup',
        unknownDatabase: 'Unassociated Database Backup',
        unknownWebsite: 'Unassociated Website Backup',
        unknownSnapshot: 'Unassociated Snapshot Backup',
        upload: 'Temporary Upload Files',
        uploadHelper: 'Temporary files uploaded from the system backup list',
        download: 'Temporary Download Files',
        downloadHelper: 'Temporary files downloaded from third-party backup accounts by the system',
        directory: 'Directory',
        systemLog: 'Log file',
        systemLogHelper: 'System logs, task logs, website log files',
        dockerLog: 'Container operation log files',
        taskLog: 'Scheduled task execution log files',
        shell: 'Shell script scheduled tasks',
        containerShell: 'Shell script scheduled tasks executed inside containers',
        curl: 'CURL scheduled tasks',
        docker: 'Container garbage',
        dockerHelper: 'Files such as containers, images, volumes, build cache, etc.',
        volumes: 'Volumes',
        buildCache: 'Container Build Cache',
        appTmpDownload: 'App temporary download file',
        unknownWebsiteLog: 'Unlinked website log backup file',
    },
    app: {
        app: 'Application | Applications',
        installName: 'Name',
        installed: 'Installed',
        all: 'All',
        version: 'Version',
        detail: 'Details',
        params: 'Parameters',
        author: 'Author',
        source: 'Source',
        appName: 'Application Name',
        deleteWarn:
            'The delete operation will delete all data and backups together. This operation cannot be rolled back. Continue? ',
        syncSuccess: 'Synchronized successfully',
        canUpgrade: 'Updates',
        backupName: 'File Name',
        backupPath: 'File Path',
        backupdate: 'Backup time',
        versionSelect: 'Select a version',
        operatorHelper: 'Operation {0} will be performed on the selected application. Continue?',
        startOperatorHelper: 'The application will be started. Continue?',
        stopOperatorHelper: 'The application will be stopped. Continue?',
        restartOperatorHelper: 'The application will be restarted. Continue?',
        reloadOperatorHelper: 'The application will be reloaded. Continue?',
        checkInstalledWarn: '"{0}" is not detected. Go to "App Store" to install.',
        limitHelper: 'The application has already been installed.',
        deleteHelper: '"{0}" has been associated with the following resource(s) and can\'t be deleted',
        checkTitle: 'Hint',
        defaultConfig: 'Default configuration',
        defaultConfigHelper: 'It has been restored to the default configuration, it will take effect after saving',
        forceDelete: 'Force delete',
        forceDeleteHelper:
            'Force deletion will ignore errors during the deletion process and eventually delete metadata.',
        deleteBackup: 'Delete backup',
        deleteBackupHelper: 'Also delete the application backup',
        deleteDB: 'Delete database',
        deleteDBHelper: 'Also delete the database',
        noService: 'No {0}',
        toInstall: 'Go to install',
        param: 'Parameters',
        alreadyRun: 'Installed',
        syncAppList: 'Sync',
        less1Minute: 'Less than 1 minute',
        appOfficeWebsite: 'Official Website',
        github: 'GitHub',
        document: 'Documentation',
        updatePrompt: 'No updates available',
        installPrompt: 'No apps installed yet',
        updateHelper: 'Editing parameters may cause the application to fail to start. Please proceed with caution.',
        updateWarn: 'Update parameters need to rebuild the application, Continue? ',
        busPort: 'Port',
        syncStart: 'Start syncing! Please refresh the app store later',
        advanced: 'Advanced settings',
        cpuCore: 'core(s)',
        containerName: 'Container name',
        containerNameHelper: 'The container name will be automatically generated when not set',
        allowPort: 'External access',
        allowPortHelper: 'Allowing external port access will release the firewall port',
        appInstallWarn:
            'This application does not expose an external port by default. Click "Advanced Settings" to expose one.',
        upgradeStart: 'Start upgrading! Please refresh the page later',
        toFolder: 'Open the installation directory',
        editCompose: 'Edit compose file',
        editComposeHelper: 'Editing the compose file may cause the software installation to fail',
        composeNullErr: 'compose cannot be empty',
        takeDown: 'Retired',
        allReadyInstalled: 'Installed',
        installHelper: 'If you have image pull issues, configure image acceleration.',
        sortMode: 'Sort',
        installWarn:
            'The external access is not checked, and it will make the application unable to access through external network. Continue?',
        showIgnore: 'View ignored applications',
        cancelIgnore: 'Cancel ignore',
        ignoreList: 'Ignored applications',
        appHelper: 'Go to application details page to learn installation instruction for some special applications.',
        backupApp: 'Backup application before upgrade',
        backupAppHelper:
            'If the upgrade fails, the backup will be automatically rolled back. Please check the failure reason in the log audit-system log',
        openrestyDeleteHelper: 'Forced delete of OpenResty will delete all websites. Continue?',
        downloadLogHelper1: 'All logs of {0} application are about to be downloaded. Continue? ',
        downloadLogHelper2: 'The latest {1} logs of {0} application are about to be downloaded. Continue? ',
        syncAllAppHelper: 'All applications will be synchronized. Continue? ',
        hostModeHelper:
            'The current application network mode is host mode. If you need to open the port, please open it manually on the firewall page.',
        showLocal: 'Show local applications',
        reload: 'Reload',
        upgradeWarn:
            'Upgrading the application will replace the docker-compose.yml file. If there are any changes, you can click to view the file comparison',
        openclawHttpsUpgradeNoticeTitle:
            'Note: The following instructions apply only when upgrading OpenClaw from versions 2026.3.13 through 2026.3.22 to 2026.3.23 or later:',
        openclawHttpsUpgradeNoticeItem1:
            'After upgrading, agent access reverts to HTTP. Go to Configuration -> Settings -> Security and verify the access address.',
        openclawHttpsUpgradeNoticeItem2:
            'If you previously used a reverse proxy site, change the proxy target to http://IP:Port.',
        newVersion: 'New version',
        oldVersion: 'Current version',
        composeDiff: 'File comparison',
        showDiff: 'View comparison',
        useNew: 'Use custom version',
        useDefault: 'Use default version',
        useCustom: 'Customize docker-compose.yml',
        useCustomHelper:
            "Using a custom docker-compose.yml file may cause the application upgrade to fail. If it is not necessary, don't check it.",
        diffHelper:
            'The left side is the old version, the right side is the new version. After editing, click to save the custom version',
        pullImage: 'Pull Image',
        pullImageHelper: 'Execute docker pull to pull the image before the application starts',
        deleteImage: 'Delete Image',
        deleteImageHelper: 'Delete the image related to the application. The task will not stop if deletion fails',
        requireMemory: 'Memory',
        supportedArchitectures: 'Architectures',
        link: 'Link',
        showCurrentArch: 'Architecture',
        syncLocalApp: 'Sync Local App',
        memoryRequiredHelper: 'Current application memory requirement {0}',
        gpuConfig: 'Enable GPU Support',
        gpuConfigHelper:
            'Please ensure the machine has an NVIDIA GPU and that NVIDIA drivers and the NVIDIA Docker Container Toolkit are installed',
        webUI: 'Web Access Address',
        webUIPlaceholder: 'For example: example.com:8080/login',
        defaultWebDomain: 'Default Access Address',
        defaultWebDomainHepler:
            'If the application port is 8080, the redirect address will be http(s)://default access address:8080',
        webUIConfig:
            'The current node has no default access address configured. Please set it in application parameters or go to panel settings to configure!',
        toLink: 'Open',
        customAppHelper:
            'Before installing a custom app store package, please ensure that there are no installed apps.',
        forceUninstall: 'Force Uninstall',
        syncCustomApp: 'Sync Custom App',
        ignoreAll: 'Ignore all subsequent versions',
        ignoreVersion: 'Ignore specified version',
        specifyIP: 'Bind Host IP',
        specifyIPHelper:
            'Set the host address/network interface to bind the port (if you are not sure about this, please do not fill it in)',
        uninstallDeleteBackup: 'Uninstall App - Delete Backup',
        uninstallDeleteImage: 'Uninstall App - Delete Image',
        upgradeBackup: 'Backup App Before Upgrade',
        upgradeDeleteImage: 'Upgrade App - Delete Old Image',
        installAllowPort: 'Open external port access by default when installing apps',
        noAppHelper: 'No application detected, go to the task center to view the app store sync log',
        isEdirWarn: 'Changes to docker-compose.yml were detected. Please review the diff.',
    },
    website: {
        primaryDomain: 'Primary domain',
        otherDomains: 'Other domains',
        static: 'Static',
        deployment: 'Deployment',
        supportUpType: 'Only .tar.gz file format is supported, and the compressed package must contain {0}.json file',
        proxy: 'Reverse proxy',
        alias: 'Alias',
        ftpUser: 'FTP account',
        ftpPassword: 'FTP password',
        ftpHelper:
            'After creating a website, a corresponding FTP account will be created and the FTP directory will link to the website directory.',
        remark: 'Remark',
        groupSetting: 'Group Management',
        createGroup: 'Create group',
        appNew: 'New Application',
        appInstalled: 'Installed application',
        delete: 'Delete Website',
        deleteApp: 'Delete Application',
        deleteBackup: 'Delete Backup',
        domain: 'Domain',
        domainHelper: 'One domain per line.\nSupport wildcard "*" and IP address.\nSupport adding port.',
        addDomain: 'Add',
        domainConfig: 'Domains',
        defaultDoc: 'Default Document',
        perserver: 'Concurrency',
        perserverHelper: 'Limit the maximum concurrency of the current site',
        perip: 'Single IP',
        peripHelper: 'Limit the maximum number of concurrent access to a single IP',
        rate: 'Traffic limits',
        rateLimit: 'Per-request rate limit',
        rateHelper: 'Limit the flow of each request (unit: KB)',
        rateLimitHelper: 'Limit per-request transfer rate (unit: KB/s)',
        limitHelper: 'Enable flow control',
        other: 'Other',
        currentSSL: 'Current Certificate',
        dnsAccount: 'DNS account',
        applySSL: 'Certificate Application',
        SSLList: 'Certificate List',
        createDnsAccount: 'DNS account',
        aliyun: 'Aliyun DNS',
        aliEsa: 'Aliyun ESA',
        awsRoute53: 'Amazon Route 53',
        manual: 'Manual parsing',
        key: 'Key',
        check: 'View',
        acmeAccountManage: 'Manage ACME accounts',
        email: 'Email',
        acmeAccount: 'ACME account',
        provider: 'Verification method',
        dnsManual: 'Manual Resolution',
        expireDate: 'Expiration date',
        brand: 'Organization',
        deploySSL: 'Deployment',
        deploySSLHelper: 'Are you sure to deploy the certificate? ',
        ssl: 'Certificate | Certificates',
        dnsAccountManage: 'Manage DNS providers',
        renewSSL: 'Renew',
        renewHelper: 'Are you sure to renew the certificate? ',
        renewSuccess: 'Renew certificate',
        enableHTTPS: 'Enable',
        aliasHelper: 'Alias is the directory name of the website',
        lastBackupAt: 'last backup time',
        null: 'none',
        nginxConfig: 'Nginx configuration',
        websiteConfig: 'Website settings',
        proxySettings: 'Proxy Settings',
        advancedSettings: 'Advanced Settings',
        cacheSettings: 'Cache Settings',
        sniSettings: 'SNI Settings',
        basic: 'Basic',
        source: 'Configuration',
        security: 'Security',
        nginxPer: 'Performance tuning',
        neverExpire: 'Never',
        setDefault: 'Set as default',
        deleteHelper: 'Related application status is abnormal, please check',
        toApp: 'Go to the installed list',
        cycle: 'Cycle',
        frequency: 'Frequency',
        ccHelper:
            'Accumulatively request the same URL more than {1} times within {0} seconds, trigger CC defense, block this IP',
        mustSave: 'The modification needs to be saved to take effect',
        fileExt: 'file extension',
        fileExtBlock: 'file extension blocklist',
        value: 'value',
        enable: 'Enable',
        proxyAddress: 'Proxy Address',
        proxyHelper: 'Example: 127.0.0.1:8080',
        forceDelete: 'Force Delete',
        forceDeleteHelper:
            'Force deletion will ignore errors during the deletion process and eventually delete metadata.',
        deleteAppHelper: 'Delete associated applications and application backups at the same time',
        deleteBackupHelper: 'Also delete website backups.',
        deleteDatabaseHelper: 'Also delete the database associated with the website',
        deleteConfirmHelper:
            'The delete operation cannot be undone. Enter <span style="color:red"> "{0}" </span> to confirm deletion.',
        staticPath: 'The corresponding main directory is ',
        limit: 'Scheme',
        blog: 'Forum/Blog',
        imageSite: 'Picture Site',
        downloadSite: 'Download Site',
        shopSite: 'Mall',
        doorSite: 'Portal',
        qiteSite: 'Enterprise',
        videoSite: 'Video',
        errLog: 'Error log',
        stopHelper:
            'After stopping the site, it will not be able to access normally, and the user will display the stop page of the current site when visiting. Continue? ',
        startHelper: 'After enabling the site, users can access the content of the site normally, continue? ',
        sitePath: 'Directory',
        siteAlias: 'Site alias',
        primaryPath: 'Root directory',
        folderTitle: 'The website mainly contains the following folders',
        wafFolder: 'Firewall rules',
        indexFolder: 'Website root directory',
        sslFolder: 'Website Certificate',
        enableOrNot: 'Enable',
        oldSSL: 'Existing certificate',
        manualSSL: 'Import certificate',
        select: 'Select',
        selectSSL: 'Select Certificate',
        privateKey: 'Key (KEY)',
        certificate: 'Certificate (PEM format)',
        HTTPConfig: 'HTTP Options',
        HTTPSOnly: 'Block HTTP requests',
        HTTPToHTTPS: 'Redirect to HTTPS',
        HTTPAlso: 'Allow direct HTTP requests',
        sslConfig: 'SSL options',
        disableHTTPS: 'Disable HTTPS',
        disableHTTPSHelper: 'Disabling HTTPS will delete the certificate related configuration, Continue?',
        SSLHelper:
            "Note: Do not use SSL certificates for illegal websites.\nIf HTTPS access can't be used after opening, check whether the security group has correctly released port 443.",
        SSLConfig: 'Certificate settings',
        SSLProConfig: 'Protocol settings',
        supportProtocol: 'Protocol version',
        encryptionAlgorithm: 'Encryption algorithm',
        notSecurity: '(not safe)',
        encryptHelper:
            "Let's Encrypt has a frequency limit for issuing certificates, but it is sufficient to meet normal needs. Too frequent operations will cause issuance failure. For specific restrictions, please see <a target='_blank' href='https://letsencrypt.org/zh-cn/docs /rate-limits/'>official documentation</a> ",
        ipValue: 'Value',
        wafValueHelper: 'Value',
        ext: 'file extension',
        wafInputHelper: 'Input data by line, one line',
        data: 'data',
        ever: 'permanent',
        nextYear: 'One year later',
        noLog: 'No logs found',
        defaultServer: 'Set default site',
        noDefaultServer: 'Not set',
        defaultServerHelper:
            'After setting the default site, all unbinded domain names and IPs will be redirected to the default site\nThis can effectively prevent malicious resolution\nHowever, it will also cause the WAF unauthorized domain name interception to fail',
        restoreHelper: 'Are you sure to restore using this backup?',
        websiteDeploymentHelper: 'Use an installed application or create a new application to create a website.',
        websiteStatictHelper: 'Create a website directory on the host.',
        websiteProxyHelper:
            'Use reverse proxy to proxy existing service. For example, if a service is installed and running on port 8080, the proxy address will be "http://127.0.0.1:8080".',
        runtimeProxyHelper: 'Use a website runtime to create a website.',
        runtime: 'Runtime',
        deleteRuntimeHelper:
            'The Runtime application needs to be deleted together with the website, please handle it with caution',
        proxyType: 'Network Type',
        unix: 'Unix Network',
        tcp: 'TCP/IP Network',
        phpFPM: 'FPM Config',
        phpConfig: 'PHP Config',
        updateConfig: 'Update Config',
        isOn: 'On',
        isOff: 'Off',
        rewrite: 'Pseudo-static',
        rewriteMode: 'Scheme',
        current: 'Current',
        rewriteHelper:
            'If setting pseudo-static causes the website to become inaccessible, try to revert to the default settings.',
        runDir: 'Run Directory',
        runUserHelper:
            'For websites deployed through the PHP container runtime environment, you need to set the owner and user group of all files and folders under index and subdirectories to 1000. For the local PHP environment, refer to the local PHP-FPM user and user group settings',
        userGroup: 'User/Group',
        uGroup: 'Group',
        proxyPath: 'Proxy path',
        proxyPass: 'Target URL',
        cache: 'Cache',
        cacheTime: 'Cache duration',
        enableCache: 'Cache',
        proxyHost: 'Proxy host',
        disabled: 'Stopped',
        startProxy: 'This will start reverse proxy. Continue?',
        stopProxy: 'This will stop the reverse proxy. Continue?',
        sourceFile: 'View source',
        proxyHelper1: 'When accessing this directory, the content of the target URL will be returned and displayed.',
        proxyPassHelper: 'The target URL must be valid and accessible.',
        proxyHostHelper: 'Pass the domain name in the request header to the proxy server.',
        modifier: 'Matching rules',
        modifierHelper:
            'Example: "=" is exact match, "~" is regular match, "^~" matches the beginning of the path, etc.',
        replace: 'Text replacements',
        replaceHelper:
            'The nginx text replacement feature allows for string substitution in the response content during reverse proxying. It is commonly used to modify links, API addresses, etc., in HTML, CSS, JavaScript, and other files returned by the backend. It supports regular expression matching for complex content replacement needs.',
        addReplace: 'Add',
        replaced: 'Search String (cannot be empty)',
        replaceText: 'Replace with string',
        replacedErr: 'The Search String cannot be empty',
        replacedErr2: 'The Search String cannot be repeated',
        replacedListEmpty: 'No text replacement rules',
        proxySslName: 'Proxy SNI Name',
        basicAuth: 'Basic authentication',
        editBasicAuthHelper:
            'The password is asymmetrically encrypted and cannot be echoed. Editing needs to reset the password',
        antiLeech: 'Anti-leech',
        extends: 'Extension',
        browserCache: 'Browser Cache',
        noModify: 'No Modify',
        serverCache: 'Server Cache',
        leechLog: 'Record anti-leech log',
        accessDomain: 'Allowed domains',
        leechReturn: 'Response resource',
        noneRef: 'Allow empty referrer',
        disable: 'not enabled',
        disableLeechHelper: 'Whether to disable the anti-leech',
        disableLeech: 'Disable anti-leech',
        ipv6: 'Listen IPv6',
        leechReturnError: 'Fill in the HTTP status code',
        blockedRef: 'Allow non-standard Referer',
        accessControl: 'Anti-leech control',
        leechcacheControl: 'Cache control',
        logEnableControl: 'Log static asset requests',
        leechSpecialValidHelper:
            "When 'Allow empty Referer' is enabled, requests without a Referer (direct access, etc.) are not blocked; enabling 'Allow non-standard Referer' allows any Referer that does not start with http/https (client requests, etc.).",
        leechInvalidReturnHelper: 'HTTP status code returned after blocking hotlinking requests',
        leechlogControlHelper:
            'Logs static asset requests; usually disabled in production to avoid excessive, noisy logs',
        selectAcme: 'Select Acme account',
        imported: 'Created manually',
        importType: 'Import type',
        pasteSSL: 'Paste code',
        localSSL: 'Select server file',
        privateKeyPath: 'Private key file',
        certificatePath: 'Certificate file',
        ipWhiteListHelper: 'The role of IP allowlist: all rules are invalid for IP allowlist',
        redirect: 'Redirect',
        sourceDomain: 'Source domain',
        targetURL: 'Target URL address',
        keepPath: 'URI params',
        path: 'path',
        redirectType: 'redirection type',
        redirectWay: 'Way',
        keep: 'keep',
        notKeep: 'Do not keep',
        redirectRoot: 'Redirect to the homepage',
        redirectHelper: '301 permanent redirection, 302 temporary redirection',
        changePHPVersionWarn: 'This operation cannot be rolled back, continue?',
        changeVersion: 'Switch version',
        retainConfig: 'Whether to keep php-fpm.conf and php.ini files',
        runDirHelper2: 'Please ensure that the secondary running directory is under the index directory',
        openrestyHelper:
            'OpenResty default HTTP port: {0} HTTPS port: {1}, which may affect website domain name access and HTTPS forced redirect',
        primaryDomainHelper: 'Exmaple: example.com or example.com:8080',
        acmeAccountType: 'Account type',
        keyType: 'Key algorithm',
        tencentCloud: 'Tencent Cloud',
        containWarn: 'The domain name contains the main domain, enter again',
        rewriteHelper2:
            'Applications like WordPress installed from the app store typically come with pseudo-static configuration preset. Reconfiguring them may lead to errors.',
        websiteBackupWarn:
            'Only supports importing local backups, importing backups from other machines may cause recovery failure',
        ipWebsiteWarn: 'Websites with IP as domain names need to be set as default site to be accessed normally.',
        hstsHelper: 'Enabling HSTS can increase website security',
        includeSubDomains: 'SubDomains',
        hstsIncludeSubDomainsHelper:
            'Once enabled, the HSTS policy will apply to all subdomains of the current domain.',
        defaultHtml: 'Set default page',
        website404: 'Website 404 error page',
        domain404: 'Website page does not exist',
        indexHtml: 'Static website default page',
        stopHtml: 'Website stop page',
        indexPHP: 'PHP website default page',
        sslExpireDate: 'SSL Expiration Date',
        website404Helper: 'Website 404 error page only supports PHP runtime environment websites and static websites',
        sni: 'Origin SNI',
        sniHelper:
            "When the reverse proxy backend is HTTPS, you might need to set the origin SNI. See the CDN service provider's documentation for details.",
        proxySslVerify: 'Verify Backend SSL Certificate',
        proxySslVerifyHelper:
            'When enabled, the proxy will strictly verify the upstream SSL certificate (disabled by default).',
        huaweicloud: 'Huawei Cloud',
        createDb: 'Create Database',
        enableSSLHelper: 'Failure to enable will not affect the creation of the website',
        batchAdd: 'Batch Add Domains',
        batchInput: 'Batch Input',
        domainNotFQDN: 'This domain may not be accessible on the public network',
        domainInvalid: 'Invalid domain format',
        domainBatchHelper: 'One domain per line, format: domain:port@ssl\nExample: example.com:443@ssl or example.com',
        generateDomain: 'Generate',
        global: 'Global',
        subsite: 'Subsite',
        subsiteHelper: 'A subsite can select an existing PHP or static website directory as the main directory.',
        parentWbeiste: 'Parent Website',
        deleteSubsite: 'To delete the current website, you must first delete the subsite(s) {0}',
        loadBalance: 'Load Balancing',
        server: 'Server',
        algorithm: 'Algorithm',
        ipHash: 'IP Hash',
        ipHashHelper:
            'Distributes requests to a specific server based on the client IP address, ensuring that a particular client is always routed to the same server.',
        leastConn: 'Least Connections',
        leastConnHelper: 'Sends requests to the server with the fewest active connections.',
        leastTime: 'Least Time',
        leastTimeHelper: 'Sends requests to the server with the shortest active connection time.',
        defaultHelper:
            'Default method, requests are evenly distributed to each server. If servers have weights configured, requests are distributed based on the specified weights, with higher-weighted servers receiving more requests.',
        weight: 'Weight',
        maxFails: 'Max Fails',
        maxConns: 'Max Connections',
        strategy: 'Strategy',
        strategyDown: 'Down',
        strategyBackup: 'Backup',
        ipHashBackupErr: 'IP hash does not support backup nodes',
        failTimeout: 'Failure timeout',
        failTimeoutHelper:
            'The time window length for server health checks. When the cumulative number of failures reaches the threshold within this period, the server will be temporarily removed and retried after the same duration. Default 10 seconds',
        staticChangePHPHelper: 'Currently a static website, you can switch to a PHP website',
        proxyCache: 'Reverse Proxy Cache',
        cacheLimit: 'Cache Space Limit',
        shareCache: 'Cache Count Memory Size',
        cacheExpire: 'Cache Expiration Time',
        shareCacheHelper: 'Approximately 8000 cache objects can be stored per 1M of memory',
        cacheLimitHelper: 'Old cache will be automatically deleted when the limit is exceeded',
        cacheExpireJHelper: 'Cache will be deleted if it misses after the expiration time',
        realIP: 'Real IP',
        ipFrom: 'IP Source',
        ipFromHelper:
            "By configuring trusted IP sources, OpenResty will analyze IP information in HTTP headers, accurately identify and record visitors' real IP addresses, including in access logs",
        ipFromExample1: "If the frontend is a tool like Frp, you can enter Frp's IP address, such as 127.0.0.1",
        ipFromExample2: "If the frontend is a CDN, you can enter the CDN's IP address range",
        ipFromExample3:
            'If unsure, you can enter 0.0.0.0/0 (ipv4) ::/0 (ipv6) [Note: Allowing any source IP is not secure]',
        http3Helper:
            'HTTP/3 is an upgrade to HTTP/2, offering faster connection speeds and better performance, but not all browsers support HTTP/3. Enabling it may cause some browsers to be unable to access the site.',
        cors: 'CORS',
        enableCors: 'Enable CORS',
        allowOrigins: 'Allowed domains',
        allowMethods: 'Allowed request methods',
        allowHeaders: 'Allowed request headers',
        allowCredentials: 'Allow cookies to be sent',
        preflight: 'Preflight request fast response',
        preflightHleper:
            'When enabled, when the browser sends a cross-origin preflight request (OPTIONS request), the system will automatically return a 204 status code and set the necessary cross-origin response headers',
        changeDatabase: 'Change Database',
        changeDatabaseHelper1: 'Database association is used for backing up and restoring the website.',
        changeDatabaseHelper2: 'Switching to another database will cause previous backups to be unrecoverable.',
        saveCustom: 'Save as Template',
        rainyun: 'Rain Yun',
        volcengine: 'Volcengine',
        runtimePortHelper: 'The current runtime environment has multiple ports. Select a proxy port.',
        runtimePortWarn: 'The current runtime environment has no ports, unable to proxy',
        cacheWarn: 'Please turn off the cache switch in the reverse proxy first',
        loadBalanceHelper:
            'After creating the load balancing, go to "Reverse Proxy", add a proxy and set the backend address to: http://<load balancing name>',
        useProxy: 'Use Proxy',
        useProxyHelper: 'Use the proxy server address in the panel settings',
        westCN: 'West Digital',
        openBaseDir: 'Prevent Cross-Site Attacks',
        openBaseDirHelper:
            'open_basedir is used to restrict the PHP file access path, which helps prevent cross-site access and enhance security',
        serverCacheTime: 'Server Cache Time',
        serverCacheTimeHelper:
            'The time a request is cached on the server. During this period, identical requests will return the cached result directly without requesting the origin server.',
        browserCacheTime: 'Browser Cache Time',
        browserCacheTimeHelper:
            'The time static resources are cached locally in the browser, reducing redundant requests. Users will use the local cache directly before it expires when refreshing the page.',
        donotLinkeDB: 'Do Not Link Database',
        toWebsiteDir: 'Enter Website Directory',
        execParameters: 'Execution Parameters',
        extCommand: 'Supplementary Command',
        mirror: 'Mirror Source',
        execUser: 'Executing User',
        execDir: 'Execution Directory',
        packagist: 'China Full Mirror',
        batchOperate: 'Batch Operation',
        batchOperateHelper: 'Batch {0} websites, continue operation?',
        stream: 'TCP/UDP Proxy',
        streamPorts: 'Listening Ports',
        streamPortsHelper:
            'Set the external listening port number, clients will access the service through this port, separated by commas, e.g., 5222,5223',
        streamHelper: 'TCP/UDP Port Forwarding and Load Balancing',
        udp: 'Enable UDP',
        syncHtmlHelper: 'Sync to PHP and static websites',
    },
    php: {
        short_open_tag: 'Short tag support',
        max_execution_time: 'Maximum script execution time',
        max_input_time: 'Maximum input time',
        memory_limit: 'Script memory limit',
        post_max_size: 'POST data maximum size',
        file_uploads: 'Whether to allow uploading files',
        upload_max_filesize: 'The maximum size allowed to upload files',
        max_file_uploads: 'The maximum number of files allowed to be uploaded at the same time',
        default_socket_timeout: 'Socket timeout',
        error_reporting: 'Error level',
        display_errors: 'Whether to output detailed error information',
        cgi_fix_pathinfo: 'Whether to open pathinfo',
        date_timezone: 'Time zone',
        disableFunction: 'Disable function',
        disableFunctionHelper: 'Enter the function to be disabled, such as exec, please use multiple, split',
        uploadMaxSize: 'Upload limit',
        indexHelper:
            'In order to ensure the normal operation of the PHP website, please place the code in the index directory and avoid renaming',
        extensions: 'Extension Templates',
        extension: 'Extension',
        extensionsHelper: 'For multiple extensions, separate with commas',
        extensionHelper: 'Please use multiple extensions, split',
        toExtensionsList: 'View extension list',
        containerConfig: 'Container Configuration',
        containerConfigHelper:
            'Environment variables and other information can be modified in Configuration - Container Configuration after creation',
        dateTimezoneHelper: 'Example: TZ=Asia/Shanghai (Please add as needed)',
    },
    nginx: {
        serverNamesHashBucketSizeHelper: 'The hash table size of the server name',
        clientHeaderBufferSizeHelper: 'The header buffer size requested by the client',
        clientMaxBodySizeHelper: 'Maximum Upload File',
        keepaliveTimeoutHelper: 'Connection Timeout',
        gzipMinLengthHelper: 'Minimum Compressed File',
        gzipCompLevelHelper: 'Compression Rate',
        gzipHelper: 'Enable compression for transmission',
        connections: 'Active connections',
        accepts: 'Accepts',
        handled: 'Handled',
        requests: 'Requests',
        reading: 'Reading',
        writing: 'Writing',
        waiting: 'Waiting',
        status: 'Current Status',
        configResource: 'Configuration',
        saveAndReload: 'Save and reload',
        clearProxyCache: 'Clean reverse proxy cache',
        clearProxyCacheWarn: 'This action will delete all files in the cache directory. Continue?',
        create: 'Add a new module',
        update: 'Edit a module',
        params: 'Parameters',
        packages: 'Packages',
        script: 'Scripts',
        module: 'Modules',
        build: 'Build',
        buildWarn:
            'Local module builds use CPU and memory. Static modules also rebuild and restart OpenResty. Continue?',
        buildPurposeHint:
            'Dynamic modules take effect via hot reload after building (no container restart); including static modules triggers a full image rebuild and container recreation',
        buildMode: 'Build mode',
        buildModeDynamic: 'Dynamic',
        buildModeStatic: 'Static',
        buildStatus: 'Build status',
        loadOrder: 'Load order',
        modulesToBuild: 'Dynamic modules (hot-reload after build, no container restart)',
        staticModules: 'Static modules',
        staticModulesHelper: 'Building will rebuild all modules and restart OpenResty',
        forceBuild: 'Rebuild without cache',
        buildFailed: 'Last build failed',
        pending: 'Pending',
        ready: 'Ready',
        failed: 'Failed',
        dynamicUnsupported: 'Dynamic build is not supported on the current OpenResty version',
        moduleDynamicUnsupported: 'The parameters of this module do not support dynamic build',
        mirrorUrl: 'Software Source',
        paramsHelper: 'For example: --add-module=/tmp/ngx_brotli; dynamic mode converts it automatically',
        packagesHelper: 'For example: git, curl (separated by commas)',
        scriptHelper:
            'Scripts to execute before compilation, usually for downloading module source code, installing dependencies, etc.',
        buildHelper:
            'Dynamic modules are loaded from configuration after building; static modules still rebuild OpenResty.',
        defaultHttps: 'HTTPS Anti-tampering',
        defaultHttpsHelper1: 'Enabling this can resolve HTTPS tampering issues.',
        sslRejectHandshake: 'Reject default SSL handshake',
        sslRejectHandshakeHelper:
            'Enabling this can avoid certificate leakage, setting a default website will invalidate this setting',
    },
    ssl: {
        create: 'Request',
        provider: 'Type',
        manualCreate: 'Created manually',
        acmeAccount: 'ACME account',
        resolveDomain: 'Resolve domain name',
        err: 'Error',
        value: 'record value',
        dnsResolveHelper: 'Go to the DNS resolution service provider to add the following resolution records:',
        detail: 'View details',
        msg: 'Information',
        ssl: 'Certificate',
        key: 'Private key',
        startDate: 'Effective time',
        organization: 'issuing organization',
        renewConfirm: 'This will renew a new certificate for domain name {0}. Continue?',
        autoRenew: 'Automatic renewal',
        autoRenewHelper: 'Automatically renew 30 days before expiration',
        renewSuccess: 'Renewal successful',
        renewWebsite:
            'This certificate has been associated with the following websites, and the application will be applied to these websites simultaneously',
        createAcme: 'Create Account',
        acmeHelper: 'Acme Account is used to apply for free certificates',
        upload: 'Import',
        applyType: 'Application method',
        apply: 'Renew',
        applyStart: 'Certificate application starts',
        getDnsResolve: 'Getting DNS resolution value, please wait...',
        selfSigned: 'Manage Self-signed CA',
        ca: 'Certificate authority',
        commonName: 'Common name',
        caName: 'Certificate authority name',
        company: 'Organization name',
        department: 'Organizational unit name',
        city: 'Locality name',
        province: 'State or province name',
        country: 'Country name (2 letter code)',
        commonNameHelper: 'For example, ',
        selfSign: 'Issue certificate',
        days: 'validity period',
        domainHelper: 'One domain name per line, supports * and IP address',
        pushDir: 'Push the certificate to the local directory',
        dir: 'Directory',
        pushDirHelper:
            'Certificate file "fullchain.pem" and key file "privkey.pem" will be generated in this directory.',
        organizationDetail: 'Organization details',
        fromWebsite: 'From website',
        dnsMauanlHelper:
            'In manual resolution mode, you need to click the apply button after creation to obtain the DNS resolution value',
        httpHelper:
            'Using HTTP mode requires installing OpenResty and does not support applying for wildcard domain certificates.',
        buypassHelper: 'Buypass is not accessible in mainland China',
        googleHelper: 'How to get EAB HmacKey and EAB kid',
        googleCloudHelper: 'Google Cloud API is not accessible in most parts of mainland China',
        skipDNSCheck: 'Skip DNS check',
        skipDNSCheckHelper: 'Check here only if you encounter a timeout issue during certification request.',
        cfHelper: 'Do not use Global API Key',
        deprecated: 'will be deprecated',
        deprecatedHelper:
            'Maintenance has been stopped and may be abandoned in a future version. Please use Tencent Cloud method for analysis',
        dnsPodRemoved: 'removed',
        dnsPodRemovedTip:
            'DnsPod has been removed in lego v5; this account cannot be used for new certificates or renewals. Please switch to a TencentCloud DNS account.',
        dnsPodRemovedSSLTip:
            'This certificate is bound to a DnsPod DNS account, which is no longer usable in lego v5. Auto-renewal will fail. Please switch the DNS account to TencentCloud.',
        disableCNAME: 'Disable CNAME',
        disableCNAMEHelper: 'Check here if the domain name has a CNAME record and the request fails.',
        nameserver: 'DNS server',
        nameserverHelper: 'Use a custom DNS server to verify domain names.',
        edit: 'Edit certificate',
        execShell: 'Execute the script after certification request.',
        shell: 'Script content',
        shellHelper:
            'The default execution directory of the script is the 1Panel installation directory. If a certificate is pushed into local directory, the execution directory will be the certificate push directory. The default execution timeout is 30 minutes.',
        customAcme: 'Custom ACME Service',
        customAcmeURL: 'ACME Service URL',
        baiduCloud: 'Baidu Cloud',
        pushNode: 'Sync to Other Nodes',
        pushNodeHelper: 'Push to selected nodes after application/renewal',
        fromMaster: 'Master Node Push',
        hostedZoneID: 'Hosted Zone ID',
        isIP: 'IP Certificate',
        useEAB: 'Use EAB authentication',
    },
    firewall: {
        create: 'Create rule',
        edit: 'Edit rule',
        advancedControl: 'Advanced Control',
        advancedControlNotAvailable: 'Currently using {0} firewall, advanced rules only support iptables',
        ccDeny: 'CC Protection',
        ipWhiteList: 'IP allowlist',
        ipBlockList: 'IP blocklist',
        fileExtBlockList: 'File extension blocklist',
        urlWhiteList: 'URL allowlist',
        urlBlockList: 'URL blocklist',
        argsCheck: 'GET parameter check',
        postCheck: 'POST parameter verification',
        cookieBlockList: 'Cookie blocklist',
        dockerHelper:
            'The current firewall cannot disable container port mapping. Installed applications can go to the [Installed] page to edit application parameters and configure port release rules.',
        iptablesHelper:
            'Detected that the system is using {0} firewall. To switch to iptables, please uninstall it manually first!',
        quickJump: 'Quick access',
        used: 'Used',
        unUsed: 'Unused',
        dockerRestart: 'Firewall operations require restarting the Docker service',
        firewallHelper: '{0} system firewall',
        firewallNotStart: 'The system firewall is not enabled at present. Enable it first.',
        restartFirewallHelper: 'This operation will restart the current firewall. Continue?',
        stopFirewallHelper: 'This will make the server lose security protection. Continue?',
        startFirewallHelper: 'After the firewall is enabled, the server security can be better protected. Continue?',
        noPing: 'Disable ping',
        enableBanPing: 'Block Ping',
        disableBanPing: 'Unblock Ping',
        noPingTitle: 'Disable ping',
        noPingHelper: "This will disable ping, and the server won't echo ICMP response. Continue?",
        onPingHelper: 'This will enable ping, and hackers may discover your server. Continue?',
        changeStrategy: 'Change the {0} strategy',
        changeStrategyIPHelper1:
            'Change the IP address strategy to [deny]. After the IP address is set, access to the server is prohibited. Continue?',
        changeStrategyIPHelper2:
            'Change the IP address strategy to [allow]. After the IP address is set, normal access is restored. Continue?',
        changeStrategyPortHelper1:
            'Change the port policy to [drop]. After the port policy is set, external access is denied. Continue?',
        changeStrategyPortHelper2:
            'Change the port policy to [accept]. After the port policy is set, normal port access will be restored. Continue?',
        stop: 'Stop',
        portFormatError: 'This field must be a valid port.',
        portHelper1: 'Multiple ports, e.g. 8080 and 8081',
        portHelper2: 'Range port, e.g. 8080-8089',
        changeStrategyHelper:
            'Change [{1}] {0} strategy to [{2}]. After setting, {0} will access {2} externally. Continue?',
        strategy: 'Strategy',
        accept: 'Accept',
        drop: 'Drop',
        anyWhere: 'Any',
        address: 'Specified IPs',
        addressHelper: 'Support IP address or IP segment',
        allow: 'Allow',
        deny: 'Deny',
        addressFormatError: 'This field must be a valid IP address.',
        addressHelper1: 'Support IP address or IP range. For example, "172.16.10.11" or "172.16.10.0/24".',
        addressHelper2: 'For multiple IP addresses, separate with comma. For example, "172.16.10.11, 172.16.0.0/24".',
        allIP: 'All IP',
        portRule: 'Port Rule | Port Rules',
        forwardRule: 'Port-Forward rule | Port-Forward rules',
        ipRule: 'IP rule | IP rules',
        userAgent: 'User-Agent filter',
        destination: 'Destination',
        sourcePort: 'Source port',
        targetIP: 'Destination IP',
        targetPort: 'Destination port',
        forwardHelper1: 'If you want to forward to the local port, the destination IP should be set to "127.0.0.1".',
        forwardHelper2: 'Leave the destination IP blank to forward to the local port.',
        forwardPortHelper: 'Supports port ranges, e.g. 8080-8089',
        forwardInboundInterface: 'Forward Inbound Network Interface',
        exportHelper: 'About to export {0} firewall rules. Continue?',
        importSuccess: 'Successfully imported {0} rules',
        importPartialSuccess: 'Import completed: {0} succeeded, {1} failed',
        ipv4Limit: 'The current operation only supports IPv4 addresses',
        basicStatus: 'Current chain {0} is unbound, please bind first!',
        baseIptables: 'iptables Service',
        forwardIptables: 'iptables Port Forwarding Service',
        advanceIptables: 'iptables Advanced Configuration Service',
        initMsg: 'About to initialize {0}, continue?',
        initHelper:
            'Detected that {0} is not initialized. Click the initialization button in the top status bar to configure!',
        bindHelper: 'Bind - Firewall rules will only take effect when the status is bound. Confirm?',
        unbindHelper:
            'Unbind - When unbound, all added firewall rules will become invalid. Proceed with caution. Confirm?',
        whiteList: 'Allowlist',
        portWhiteList: 'Port allowlist',
        portWhiteListAlter:
            'Ports in the allowlist are opened automatically when the firewall is initialized or started.',
        portWhiteListHelper: 'Protocol can be specified, e.g. 80/tcp or 443/udp. Defaults to tcp when omitted.',
        defaultStrategy: 'Default policy for current chain {0} is {1}',
        defaultStrategy2:
            'Default policy for current chain {0} is {1}, current status is unbound. Added firewall rules will take effect after binding!',
        filterRule: 'Filter Rule',
        filterHelper:
            'Filter rules allow you to control network traffic at the INPUT/OUTPUT level. Configure carefully to avoid locking the system.',
        chain: 'Chain',
        targetChain: 'Target Chain',
        sourceIP: 'Source IP',
        destIP: 'Destination IP',
        inboundDirection: 'Inbound Direction',
        outboundDirection: 'Outbound Direction',
        destPort: 'Destination Port',
        action: 'Action',
        reject: 'Reject',
        sourceIPHelper: 'CIDR format, e.g., 192.168.1.0/24. Leave empty for all addresses',
        destIPHelper: 'CIDR format, e.g., 10.0.0.0/8. Leave empty for all addresses',
        portHelper: '0 means any port',
        allPorts: 'All Ports',
        deleteRuleConfirm: 'Will delete {0} rules. Continue?',
    },
    runtime: {
        runtime: 'Runtime',
        default: 'Default',
        workDir: 'Working directory',
        localHelper: 'For local environment installation and offline environment usage issues, see ',
        versionHelper: 'PHP version, e.g. v8.0',
        buildHelper:
            'If more extensions are selected, the CPU usage will be higher during the image creation process. Avoid selecting all extensions.',
        openrestyWarn: 'PHP needs to be upgraded to OpenResty to version 1.21.4.1 or later to use',
        toupgrade: 'To Upgrade',
        edit: 'Edit runtime',
        extendHelper:
            'If the extensions you need are not in the list, you can manually input the extension name. For example, input "sockets", then select the first one.',
        rebuildHelper: 'After editing the extension, you need to rebuild the PHP application to take effect',
        rebuild: 'Rebuild PHP App',
        source: 'PHP extension source',
        ustc: 'University of Science and Technology of China',
        netease: 'Netease',
        aliyun: 'Alibaba Cloud',
        tsinghua: 'Tsinghua University',
        xtomhk: 'XTOM Mirror Station (Hong Kong)',
        xtom: 'XTOM Mirror Station (Global)',
        phpsourceHelper: 'Choose a proper source according to your network environment.',
        appPort: 'App port',
        externalPort: 'External port',
        packageManager: 'Package manager',
        codeDir: 'Code directory',
        appPortHelper: 'The port used by the application.',
        externalPortHelper: 'The port exposed to the outside world.',
        runScript: 'Run script',
        runScriptHelper: 'The startup command list is parsed from the package.json file in the source directory.',
        open: 'Open',
        operatorHelper: 'The {0} operation will be performed on the selected operating environment. Continue? ',
        taobao: 'Taobao',
        tencent: 'Tencent',
        imageSource: 'Image source',
        moduleManager: 'Module Management',
        module: 'Module',
        nodeOperatorHelper:
            'Is {0} {1} module? The operation may cause abnormality in the operating environment, confirm before proceeding',
        customScript: 'Custom startup command',
        customScriptHelper:
            'Enter the complete startup command, for example: npm run start. For PM2 startup commands, please replace with pm2-runtime, otherwise it will fail to start.',
        portError: "Don't repeat the same port.",
        systemRestartHelper: 'Status description: Interruption - status acquisition failed due to system restart',
        javaScriptHelper: 'Provide a full startup command. For example, "java -jar halo.jar -Xmx1024M -Xms256M".',
        javaDirHelper: 'The directory must contain jar files, subdirectories are also acceptable',
        goHelper: 'Provide a full startup command. For example, "go run main.go" or "./main".',
        goDirHelper: 'The directory or subdirectory must contain Go or binary files.',
        extension: 'Extension',
        installExtension: 'Do you confirm to install the extension {0}',
        loadedExtension: 'Loaded Extension',
        popularExtension: 'Popular Extension',
        uninstallExtension: 'Are you sure you want to uninstall the extension {0}',
        phpConfigHelper:
            'Modifying the configuration requires restarting the operating environment, do you want to continue',
        operateMode: 'operation mode',
        dynamic: 'dynamic',
        static: 'static',
        ondemand: 'on-demand',
        dynamicHelper:
            'dynamically adjust the number of processes, high flexibility, suitable for websites with large traffic fluctuations or low memory',
        staticHelper:
            'fixed number of processes, suitable for websites with high concurrency and stable traffic, high resource consumption',
        ondemandHelper:
            'processes are started and destroyed on demand, resource utilization is optimal, but the initial response may be slow',
        max_children: 'maximum number of processes allowed to be created',
        start_servers: 'number of processes created at startup',
        min_spare_servers: 'minimum number of idle processes',
        max_spare_servers: 'maximum number of idle processes',
        envKey: 'Name',
        envValue: 'Value',
        environment: 'Environment Variable',
        pythonHelper:
            'Provide a full startup command. For example, "pip install -r requirements.txt && python manage.py runserver 0.0.0.0:5000".',
        dotnetHelper: 'Provide a full startup command. For example, "dotnet MyWebApp.dll".',
        dirHelper: 'Note: Fill in the directory path inside the container',
        concurrency: 'Concurrency Scheme',
        loadStatus: 'Load Status',
        extraHosts: 'Host mapping',
    },
    process: {
        pid: 'Process ID',
        ppid: 'Parent process ID',
        numThreads: 'Threads',
        memory: 'Memory',
        diskRead: 'Disk read',
        diskWrite: 'Disk write',
        netSent: 'uplink',
        netRecv: 'downstream',
        numConnections: 'Connections',
        startTime: 'Start time',
        running: 'Running',
        sleep: 'sleep',
        stop: 'stop',
        idle: 'idle',
        zombie: 'zombie process',
        wait: 'waiting',
        lock: 'lock',
        blocked: 'blocked',
        cmdLine: 'Start command',
        basic: 'Basic',
        mem: 'Memory',
        openFiles: 'Open files',
        env: 'Environments',
        noenv: 'None',
        net: 'Network connections',
        laddr: 'Local address/port',
        raddr: 'Remote address/port',
        stopProcess: 'End',
        viewDetails: 'View details',
        stopProcessWarn: 'Are you sure you want to end this process (PID:{0})?',
        kill: 'Kill Process',
        killNow: 'Kill Now',
        killHelper: 'Killing process {0} may cause some programs to malfunction. Continue?',
        processName: 'Process name',
    },
    tool: {
        supervisor: {
            loadStatusErr: 'Failed to retrieve process status, please check the status of the supervisor service.',
            notSupport: 'Supervisor service not detected, go to the script library page to install it manually',
            list: 'Daemon process',
            config: 'Supervisor configuration',
            primaryConfig: 'Main configuration file location',
            notSupportCtl: 'The supervisorctl is not detected, go to the script library page to install it manually',
            user: 'User',
            command: 'Command',
            dir: 'Directory',
            numprocs: 'Number of process',
            initWarn:
                'This will modify "files" value in "[include"] section in the main configuration file. The directory of other configuration file will be: "{1Panel installation directory}/1panel/tools/supervisord/supervisor.d/".',
            operatorHelper: 'Operation {1} will be performed on {0}, continue? ',
            uptime: 'Running time',
            notStartWarn: 'Supervisor is not started. Start it first.',
            serviceName: 'Service name',
            initHelper:
                'Supervisor service is detected but not initialized. Click the initialization button in the top status bar to configure it.',
            serviceNameHelper: 'Supervisor service name managed by systemctl, usually supervisor or supervisord',
            restartHelper:
                'This will restart the service after initialization, which causes all the existing daemon processes to stop.',
            RUNNING: 'Running',
            STOPPED: 'Stopped',
            STOPPING: 'Stopping',
            STARTING: 'Starting',
            FATAL: 'Failed to start',
            BACKOFF: 'Start exception',
            ERROR: 'Error',
            statusCode: 'Status code',
            manage: 'Management',
            autoRestart: 'Auto Restart',
            EXITED: 'Exited',
            autoRestartHelper: 'Whether to automatically restart the program after it crashes',
            autoStart: 'Auto Start',
            autoStartHelper: 'Whether to automatically start the service after Supervisor starts',
        },
    },
    disk: {
        management: 'Disk Management',
        partition: 'Partition',
        unmount: 'Unmount',
        unmountHelper: 'unmount the partition {0}?',
        mount: 'Mount',
        partitionAlert:
            'Disk partitioning requires formatting the disk, and existing data will be deleted. Please save or take snapshots of your data in advance.',
        mountPoint: 'Mount Directory',
        systemDisk: 'System Disk',
        unpartitionedDisk: 'Unpartitioned Disk',
        handlePartition: 'Partition Now',
        filesystem: 'Filesystem',
        unmounted: 'Unmounted',
        cannotOperate: 'Cannot Operate',
        systemDiskHelper: 'Hint: The current disk is the system disk. It cannot be operated on.',
        autoMount: 'Auto Mount',
        model: 'Device Model',
        diskType: 'Disk Type',
        serial: 'Serial Number',
        noFail: 'Mount failure does not affect system startup',
    },
    xpack: {
        ldap: {
            source: 'Source',
            directoryMissing: 'Not found in LDAP',
            localCredentialsManaged: 'Username and password are managed by LDAP and cannot be changed locally.',
            sources: {
                local: 'Local',
                ldap: 'LDAP',
            },
            importUsers: 'Import AD/LDAP users',
            searchUsersPlaceholder: 'Search username',
            readFromLDAP: 'Read from LDAP',
            selectedUsers: '{0} selected',
            queriedAt: 'Read at',
            cachedResult: 'Cached result',
            roleForNewUsers: 'Role for new users',
            selectRole: 'Select a role',
            roleOnlyForNewUsers: 'A role is required only when the import creates users.',
            roleRequiredForNewUsers: 'Select a role for new LDAP users.',
            changedFields: 'Changed fields',
            importSelected: 'Import selected',
            importAll: 'Import all',
            importPreview: 'AD/LDAP import preview',
            importCompleted: 'AD/LDAP import completed',
            incompletePreview: 'The LDAP directory read was incomplete. Read from LDAP again.',
            missingUsersWarning: 'Users missing from LDAP will be disabled by strict synchronization.',
            missingUsersWarningDetail: '{0} local LDAP user(s) will no longer be able to sign in.',
            action: 'Action',
            reason: 'Reason',
            noImportChanges: 'No import changes',
            confirmImport: 'Confirm import',
            created: 'Create',
            updated: 'Update',
            reactivated: 'Reactivate',
            unchanged: 'Unchanged',
            conflicts: 'Conflicts',
            missing: 'Missing',
            missingUsersConfirm: '{0} user(s) missing from LDAP will be disabled and signed out. Continue?',
            strictSyncConfirm: 'Confirm strict synchronization',
            status: {
                importable: 'New user',
                update_available: 'Update available',
                up_to_date: 'Up to date',
                conflict: 'Conflict',
            },
            fields: {
                name: 'Username',
                externalDN: 'Directory DN',
                externalID: 'External ID',
                authSourceStatus: 'Authentication status',
            },
            actions: {
                created: 'Create',
                updated: 'Update',
                reactivated: 'Reactivate',
                unchanged: 'Unchanged',
                skipped: 'Skipped',
                conflicts: 'Conflict',
                conflict: 'Conflict',
                missing: 'Disable',
                errors: 'Error',
                error: 'Error',
            },
        },
        expiresEnterpriseAlert:
            'Friendly reminder: Your Enterprise Edition license will expire in {0} days, and all Enterprise Edition features will no longer be accessible. Please renew promptly to ensure continued usage.',
        expiresProAlert:
            'Friendly reminder: Your Pro Edition license will expire in {0} days, and all Pro Edition features will no longer be accessible. Please renew promptly to ensure continued usage.',
        menu: 'Pro',
        upage: 'AI Website Builder',
        proAlert: 'Upgrade to Commercial Edition to use this feature',
        opsReport: {
            name: 'Ops Report',
            overview: 'Overview',
            system: 'Host Runtime',
            login: 'Login & Security',
            website: 'Website Protection',
            resource: 'Runtime Resources',
            cronjob: 'Cron Jobs',
            alert: 'Alert Notifications',
            history: 'Export History',
            setting: 'Settings',
            page: {
                enterprise: 'Enterprise',
                reportNode: 'Report Node',
                selectReportNode: 'Select report node',
                currentNode: 'Current',
                scoreMeta: '{0} points deducted · {1} risks',
                hostAddress: 'Host Address',
                panelVersion: 'Panel Version',
                cpuCores: 'Physical Cores',
                coreUnit: '{0} cores',
                memoryTotal: 'Memory Total',
                reportDate: 'Report Date',
                serverSecurityOverview: 'Server Security Operations Overview',
                securityScore: 'Security Score',
                overviewSummary:
                    'Current security level: {0}. {1} points deducted, {2} risk items found, {3} objects checked.',
                riskDistribution: 'Risk Distribution',
                totalDeducted: 'Total deducted',
                noRiskDeducted: 'No deductions',
                scoreTrend: 'Score Trend',
                scoreLevelSafe: 'Safe',
                scoreLevelAttention: 'Needs Attention',
                scoreLevelMediumRisk: 'Medium Risk',
                scoreLevelHighRisk: 'High Risk',
                scoreCategoryHost: 'Host Resources',
                scoreCategoryLogin: 'Login Security',
                scoreCategoryWebsite: 'Websites & Certificates',
                scoreCategoryCronjob: 'Cron Jobs',
                scoreCategoryResource: 'Runtime Resources',
                scoreCategoryAlert: 'Alert Notifications',
                scoreDiskHigh: 'Disk {0} usage is {1}%',
                scoreDiskMedium: 'Disk {0} usage is {1}%',
                scoreResourceHigh: '{0} current usage is {1}%',
                scoreResourceMedium: '{0} current usage is {1}%',
                scoreLoadMedium: 'Current load is {0}',
                scoreMonitorDisabled: 'Host monitoring is disabled',
                scorePanelLoginFailedHigh: 'Panel login failed {0} times',
                scorePanelLoginFailedMedium: 'Panel login failed {0} times',
                scoreSSHLoginFailedHigh: 'SSH login failed {0} times',
                scoreSSHLoginFailedMedium: 'SSH login failed {0} times',
                scoreMFADisabled: 'MFA is disabled',
                scoreAllowIPsOpen: 'Allowed IPs and bound domain are not configured or access is unrestricted',
                scorePanelHTTPSDisabled: 'Panel HTTPS is disabled',
                scoreSSHRootLogin: 'SSH root login is allowed',
                scoreSSHPasswordAuth: 'SSH password auth is enabled without key auth',
                scoreSSLExpired: '{0} certificate has expired',
                scoreSSLHigh: '{0} certificate expires in {1} days',
                scoreSSLMedium: '{0} certificate expires in {1} days',
                scoreWebsiteExpired: '{0} website has expired',
                scoreWebsiteExpire: '{0} website expires in {1} days',
                scoreWebsiteHTTP: '{0} does not use HTTPS',
                scoreWebsiteStopped: '{0} status is abnormal',
                scoreWebsiteMonitorUnavailable: 'Website monitoring detected an unavailable site',
                scoreWebsiteMonitorAvailability: 'Website monitoring request availability {0}% is below the threshold',
                scoreWebsiteMonitorStatusAbnormal: 'Website monitoring is enabled but in an abnormal state',
                scoreWafDisabled: 'WAF is disabled and websites are not protected',
                scoreWafHighRiskHit: 'WAF matched {0} risk rules in the reporting period',
                scoreCronjobFailed: '{0} cron job failure records in the last 7 days',
                scoreAppFailed: '{0} app is abnormal',
                scoreAppStopped: '{0} app has stopped',
                scoreContainerHigh: '{0} container status is abnormal',
                scoreContainerExited: '{0} container has stopped',
                scoreContainerResource: '{0} container resource usage is high',
                scoreContainerPublicPort: '{0} container has public exposed ports',
                scoreAlertNoTask: 'No alert tasks are configured',
                scoreAlertNoEnabledTask: 'All alert tasks are disabled',
                scoreAlertDisabledTask: '{0} alert tasks are disabled',
                scoreAlertNoChannel: 'No alert notification channel is enabled',
                scoreAlertFailedHigh: '{0} alert failure logs found',
                scoreAlertFailedMedium: '{0} alert failure logs found',
                scoreAlertPending: '{0} alert logs are pending sync',
                attentionItems: 'Attention Items',
                attentionAssets: 'Attention Assets',
                riskItems: 'Risk Items',
                object: 'Object',
                description: 'Description',
                itemUnit: 'items',
                recordUnit: 'records',
                certUnit: 'certs',
                containerUnit: 'containers',
                loginFailed: 'Failed Logins',
                sslExpire: 'Certificate Expiry',
                abnormalContainer: 'Abnormal Containers',
                statAttentionDesc: '{0} points deducted',
                statLoginDesc: 'Panel {0} · SSH {1}',
                statSslDesc: '{0} certificates checked',
                statContainerDesc: '{0} containers checked',
                statAlertDesc: '{0} enabled tasks · {1} channels',
                assetHostDesc: 'Max disk usage {0}%',
                assetWebsiteDesc: '{0} certificates expiring soon, {1} abnormal websites',
                assetResourceDesc: '{0} abnormal apps, {1} abnormal containers',
                assetCronjobDesc: '{0} failure records in the last 7 days, {1} disabled jobs',
                assetAlertDesc: '{0} failed logs, {1} pending sync logs',
                app: 'Apps',
                website: 'Websites',
                websiteSsl: 'Websites / Certificates',
                cronjob: 'Cron Jobs',
                container: 'Containers',
                sslCertificate: 'SSL Certificates',
                loginSecurity: 'Login Security',
                panelLogin: 'Panel Login',
                sshLogin: 'SSH Login',
                failedRecord: 'Failed Records',
                expired: 'Expired',
                expiredDays: 'Expired {0} days ago',
                remainingDays: '{0} · {1} days left',
                enabled: 'Enabled',
                disabled: 'Disabled',
                exportRecordFailed: 'Failed to save export record',
                hostInfo: 'Host Info',
                hostname: 'Hostname',
                osVersion: 'OS Version',
                kernelVersion: 'Kernel Version',
                arch: 'Architecture',
                uptime: 'Uptime',
                diskUsage: 'Disk Usage',
                mountPoint: 'Mount Point',
                device: 'Device',
                capacity: 'Capacity',
                used: 'Used',
                usageRate: 'Usage',
                memory: 'Memory',
                load: 'Load',
                maxDiskUsage: 'Max Disk Usage',
                panelLoginSecurity: 'Panel Login Security',
                sshSecurity: 'Linux Server SSH Security',
                panelFailedRecords: 'Panel Failed Login Records',
                sshFailedRecords: 'SSH Failed Login Records',
                location: 'Location',
                configItem: 'Config Item',
                currentValue: 'Current Value',
                securityEntrance: 'Security Entrance',
                configured: 'Configured',
                notConfigured: 'Not Configured',
                normal: 'Normal',
                needAttention: 'Needs Attention',
                allowIPs: 'Allowed IPs',
                restricted: 'Restricted',
                unrestricted: 'Unrestricted',
                bindDomain: 'Bound Domain',
                accessRestriction: 'Access Restriction',
                panelHTTPS: 'Panel HTTPS',
                passwordComplexity: 'Password Complexity',
                sshService: 'SSH Service',
                running: 'Running',
                notRunning: 'Not Running',
                listenPort: 'Listen Port',
                read: 'Read',
                rootLogin: 'Root Login',
                passwordAuth: 'Password Auth',
                keyAuth: 'Key Auth',
                panelLoginFailed: 'Panel Failed Logins',
                sshLoginFailed: 'SSH Failed Logins',
                panelSecurityItems: 'Panel Security Items',
                sshSecurityItems: 'SSH Security Items',
                loginSecurityHealthStatus: 'Login Security Health',
                adjustSSHSecurity: 'Adjust SSH Security',
                viewLoginLogs: 'View Login Logs',
                riskLevel: 'Risk Level',
                goConfig: 'Configure',
                viewMore: 'View More',
                involvedIPs: '{0} IPs involved',
                sessionTimeout: 'Session Timeout',
                countUnit: 'times',
                recent24Hours: 'Last 24 hours',
                currentService: 'Current service',
                riskItemsExist: '{0} risk items',
                loginHealthRiskDesc:
                    '{0} risky configurations detected. Harden login security to reduce intrusion risk.',
                loginHealthNormalDesc: 'Current login and SSH security configurations are normal',
                loginHealthNormalReason: 'Login security is normal',
                securityEntranceConfiguredDesc: 'Security entrance is configured to reduce default entry exposure',
                securityEntranceRiskDesc: 'Security entrance is disabled. Hide the default login entry',
                allowIPsRestrictedDesc: 'Allowed IPs are restricted for Panel access',
                allowIPsRiskDesc: 'Access IPs are unrestricted. Configure allowed IPs for public environments',
                bindDomainRestrictedDesc: 'Access domain is bound',
                bindDomainRiskDesc: 'Access domain is not bound. Restrict access to a fixed domain',
                accessRestrictionValue: 'Allowed IPs: {0} / Bound Domain: {1}',
                accessRestrictionNormalDesc:
                    'Allowed IPs or bound domain is configured to restrict Panel access sources',
                accessRestrictionRiskDesc:
                    'Allowed IPs and bound domain are not configured or access is unrestricted. Configure at least one',
                panelHTTPSNormalDesc: 'Panel HTTPS is enabled',
                panelHTTPSRiskDesc: 'Panel HTTPS is disabled. Login traffic may be exposed',
                passwordComplexityNormalDesc: 'Password complexity verification is enabled',
                passwordComplexityRiskDesc:
                    'Password complexity verification is disabled, increasing weak password risk',
                mfa: 'MFA',
                mfaNormalDesc: 'MFA is enabled, improving login security',
                mfaRiskDesc: 'MFA is disabled. Enable multi-factor authentication',
                sessionTimeoutNormalDesc: 'Session timeout is within a safer range',
                sessionTimeoutRiskDesc: 'Session timeout is long. Limit idle session lifetime',
                sshServiceNormalDesc: 'SSH service is running normally',
                sshServiceRiskDesc: 'SSH service is not running or is abnormal',
                sshPortNormalDesc: 'SSH port is changed from the default port',
                sshPortRiskDesc: 'SSH still uses default port 22. Change it when appropriate',
                rootLoginNormalDesc: 'Root user cannot log in directly',
                rootLoginRiskDesc: 'Root user can log in directly. Disable it',
                passwordAuthNormalDesc: 'SSH password login is disabled',
                passwordAuthRiskDesc: 'Password login is allowed, increasing brute-force risk',
                keyAuthNormalDesc: 'SSH key authentication is enabled',
                keyAuthRiskDesc: 'Key authentication is disabled. Use key-based login',
                websiteOverview: 'Website Overview',
                primaryDomain: 'Primary Domain',
                expireTime: 'Expiry Time',
                domain: 'Domain',
                issuer: 'Issuer',
                autoRenew: 'Auto Renew',
                websiteCount: 'Websites',
                httpsWebsite: 'HTTPS Websites',
                certCount: 'Certificates',
                websiteExpire: 'Website Expiry',
                database: 'Databases',
                remoteDatabase: 'Remote Databases',
                address: 'Address',
                containerResourceUsage: 'Container Resource Usage',
                spaceUsage: 'Space Usage',
                reclaimable: 'Reclaimable',
                containerReclaimable: 'Container Reclaimable',
                image: 'Images',
                volume: 'Volumes',
                buildCache: 'Build Cache',
                alert: 'Alert',
                alertConfigured: 'Alerts Configured',
                alertOperations: 'Alert Notifications',
                alertTaskCount: 'Alert Tasks',
                enabledAlertTask: 'Enabled Tasks',
                disabledAlertTask: 'Disabled Tasks',
                alertChannels: 'Notification Channels',
                alertLogCount: 'Alert Logs',
                alertSuccessRate: 'Alert Success Rate',
                alertFailedLogs: 'Failed Alert Logs',
                alertPendingLogs: 'Pending Sync Logs',
                alertPending: 'Pending Sync',
                alertTaskStats: 'Alert Task Statistics',
                alertTaskType: 'Alert Type',
                alertLogStatusStats: 'Alert Execution Status',
                alertHealthNormal: 'Normal',
                alertHealthAttention: 'Needs Attention',
                alertHealthRisk: 'High Risk',
                alertHealthSummary: 'Alert Health',
                alertHealthNormalReason: 'Alert tasks, notification channels, and execution logs are healthy',
                alertNoChannelReason: 'No notification channel is enabled',
                alertFailedLogReason: '{0} failed alert logs found',
                alertPendingReason: '{0} alert logs are pending sync',
                alertDisabledTaskReason: '{0} alert tasks are disabled',
                alertNoTaskReason: 'No alert tasks are configured',
                goAlertConfig: 'Alert Config',
                goAlertLogs: 'Alert Logs',
                configureAlertChannel: 'Configure Channels',
                createAlertTask: 'Create Alert Task',
                viewAlertTasks: 'View Alert Tasks',
                viewFailedAlertLogs: 'View Failed Logs',
                viewAlertLogs: 'View Alert Logs',
                alertChannelSummary: '{0} / {1} channels enabled',
                alertTaskEnabledDesc: '{0} tasks enabled',
                alertTaskSummary: '{0} enabled, {1} disabled',
                alertLogSummary: '{0} successful, {1} failed',
                alertPendingDesc: '{0} logs pending sync',
                alertLogSuccessDesc: 'Notification completed',
                alertLogFailedDesc: 'Check channel configuration or delivery path',
                alertLogPendingDesc: 'Offline or sync path pending',
                failedAlertLogs: 'Failed Alert Logs',
                disabledAlertTasks: 'Disabled Alert Tasks',
                alertTableDisplayDesc: 'Showing {0} of {1}',
                noAlertTask: 'No alert tasks',
                noFailedAlertLog: 'No failed alert logs',
                noDisabledAlertTask: 'No disabled alert tasks',
                alertMsg: 'Alert Message',
                alertMethod: 'Alert Method',
                alertRule: 'Alert Rule',
                alertCronjobType: 'Cron Job: {0}',
                alertAllTargets: 'All Targets',
                alertAllDisks: 'All Disks',
                alertAllCertificates: 'All Certificates',
                alertAllWebsites: 'All Websites',
                alertDiskRuleShort: '{0} exceeds {1}{2}, {3} times per day',
                alertAverageRuleShort: '{0} min average exceeds {1}%, {2} times per day',
                alertTimeRuleShort: 'Trigger within {0} days, send {1} times',
                alertSendCountRuleShort: 'Send {0} times per day',
                failedExecutionRecords: 'Failed Execution Records',
                taskID: 'Task ID',
                executeTime: 'Execution Time',
                backupTasks: 'Backup Tasks',
                systemMetrics: 'Runtime Metrics',
                cpu: 'CPU',
                thresholdPercent: 'Threshold {0}%',
                recent24HourPeakPercent: 'Last 24h peak {0}',
                loadAverage: '1 / 5 / 15 minute load: {0} / {1} / {2}',
                sourceMount: 'Mount point {0}',
                storageUsage: 'Storage Usage',
                localDisk: 'Local Disk',
                highUsagePeriods: 'High Usage Periods',
                timeRange: 'Time Range',
                threshold: 'Threshold',
                duration: 'Duration',
                peak: 'Peak',
                scoring: 'Scoring',
                counted: 'Counted',
                notCounted: 'Not Counted',
                dataSource: 'Data Source',
                noHighUsagePeriod: 'No high usage periods',
                monitorDisabledOrNoData: 'Host monitoring is disabled or no monitor data is available',
                systemHealthStatus: 'Last 24h Host Runtime Risk',
                mainReasons: 'Main Reasons',
                viewHostMonitor: 'View Host Monitor',
                systemHealthAttentionDesc:
                    '{0} risk items detected in the last 24 hours. Prioritize resource peaks and disk usage.',
                systemHealthNormalDesc: 'Host runtime metrics were normal in the last 24 hours',
                monitorEnabled: 'Monitoring Enabled',
                cpuCoreUsage: '{0} / {1} cores',
                load1Minute: '1-min load',
                diskSpaceUsage: 'Disk Space Usage',
                usedCapacity: 'Used / Total',
                fileSystem: 'File System',
                resourceTrendSummary: 'Resource Trend Summary',
                last24Hours: 'Last 24 Hours',
                granularityHour: 'Granularity: 1 hour',
                current: 'Current',
                average: 'Average',
                totalItems: '{0} items',
                to: 'to',
                hoursShort: '{0} h',
                minutesShort: '{0} min',
                websiteStatus: 'Website Status',
                websiteHealthStatus: 'Website Protection Health',
                websiteHealthNormalReason: 'Websites, certificates, WAF, and website monitoring are healthy',
                websiteHealthAttentionDesc:
                    '{0} risk items detected. Handle them soon to protect website security and availability.',
                websiteHealthNormalDesc: 'Current website protection metrics are normal',
                handleSslRisk: 'Handle Certificate Risks',
                viewWaf: 'View WAF',
                priority: 'Priority',
                riskDescription: 'Risk Description',
                deductScore: 'Deducted Score',
                remaining: 'Remaining',
                wafSourceIpTop: 'WAF Source IP TOP5',
                wafAffectedSiteTop: 'Affected Sites TOP5',
                sslRisk: 'Certificate Risks',
                sslExpiring: 'Expiring Certificates',
                includedInReport: 'Included in report',
                needRenewal: 'Renewal recommended',
                fromExpireInfo: 'From expiry information',
                runningWebsite: 'Running Websites',
                fromWebsiteStatus: 'From website list status',
                stoppedWebsite: 'Stopped Websites',
                confirmStoppedWebsite: 'Confirm whether this is expected',
                expiringWebsite: 'Expiring Websites',
                expiringSoon: 'Expiring Soon',
                none: 'None',
                noSslRisk: 'No certificates need handling',
                websiteProtection: 'WAF and Website Monitoring',
                websiteMonitor: 'Website Monitoring',
                waf: 'WAF',
                siteAvailability: 'Request Availability',
                monitoredSites: 'Monitored Sites',
                requestCount: 'Requests',
                abnormalSites: 'Abnormal Sites',
                count5xxSource: 'Counted by 5xx requests',
                wafIntercept: 'WAF Blocks',
                websiteMonitorDisabledOrNoData: 'Website monitoring is disabled or no monitor data is available',
                wafDisabledOrNoData: 'WAF is disabled or no block data is available',
                serviceEnabledButAbnormal: 'Enabled, but in an abnormal state',
                noWafData: 'No WAF block data',
                sourceIP: 'Source IP',
                hitCount: 'Hits',
                level: 'Level',
                attackType: 'Attack Type',
                requestRatio: 'Request Ratio',
                installed: 'Installed',
                normalRunning: 'Running Normally',
                failedStart: 'Startup Failed',
                manualStopped: 'Manually Stopped',
                failed: 'Failed',
                success: 'Success',
                canUpdate: 'Upgradable',
                listSeparator: ', ',
                containerCount: 'Containers',
                stopped: 'Stopped',
                abnormal: 'Abnormal',
                abnormalContainers: 'Abnormal Containers',
                resourceUsage: 'Resource Usage',
                exposedContainerPorts: 'Exposed Ports',
                portMapping: 'Port Mapping',
                risk: 'Risk',
                noAbnormalContainer: 'No abnormal containers',
                noExposedContainer: 'No exposed ports detected',
                publicExpose: 'Public Exposure',
                privateExpose: 'Private Mapping',
                resourceHealth: 'Runtime Resource Health',
                checkTime: 'Check Time',
                resourceHealthNormalDesc: 'Applications, databases, and containers are currently healthy',
                resourceHealthAttentionDesc:
                    '{0} attention items detected. Prioritize stopped resources and public exposed ports.',
                resourceHealthRiskDesc:
                    '{0} high-risk items detected. Prioritize abnormal containers or failed applications.',
                resourceThresholdContainers: 'CPU / Memory Threshold Containers',
                noThresholdExceededContainer: 'No containers exceeded the threshold',
                triggerMetric: 'Triggered Metric',
                resourceReasonAppFailed: '{0} applications failed to start',
                resourceReasonAppStopped: '{0} applications stopped',
                resourceReasonContainerAbnormal: '{0} containers are abnormal',
                resourceReasonContainerStopped: '{0} containers stopped',
                resourceReasonPublicPorts: '{0} public exposed ports',
                resourceReasonNormal: 'Applications, databases, and containers are healthy',
                viewAbnormalContainers: 'View Abnormal Containers',
                viewExposedPorts: 'View Exposed Ports',
                viewAppResources: 'View App Resources',
                viewRuntimeResources: 'View Runtime Resources',
                viewContainerResources: 'View Container Resources',
                configuredServices: 'Configured Services',
                publicPrivatePorts: '{0} public / {1} private mappings',
                currentDisplayTotal: 'Showing {0} of {1}',
                reclaimableSpace: 'Reclaimable Space',
                estimatedReclaimable: 'Estimated Reclaimable',
                unusedImageSpace: 'Unused image space',
                stoppedContainerSpace: 'Stopped container space',
                unusedVolumeSpace: 'Unused volume space',
                buildCacheSpace: 'Docker build cache space',
                executionRecords: 'Execution Records',
                successRate: 'Success Rate',
                failedJobs: 'Failed Jobs',
                recentRecoveryPoint: 'Latest Recovery Point',
                disabledCronjobTasks: 'Disabled Cron Jobs',
                remoteCoverage: 'Remote Coverage',
                recent7Days: 'Last 7 days',
                taskTypeStats: 'Task Type Statistics',
                total: 'Total',
                taskTypeDesc: '{0} enabled, {1} disabled',
                failedOrAttentionTasks: 'Failed or Attention Tasks',
                execution: 'Execution',
                latestExecution: 'Latest Execution',
                remoteBackup: 'Remote Backup',
                localOnly: 'Local Only',
                covered: 'Covered',
                noAttentionCronjob: 'No failed or attention cron jobs',
                cronjobHealth: 'Cron Job Health',
                cronjobHealthNormalDesc: 'Cron job execution and backup coverage are healthy',
                cronjobHealthAttentionDesc:
                    '{0} attention items detected. Prioritize disabled tasks and failed records.',
                cronjobHealthRiskDesc: '{0} risk items detected. Prioritize failed and disabled tasks.',
                cronjobReasonFailed: '{0} failed records',
                cronjobReasonDisabled: '{0} tasks disabled',
                cronjobReasonLocalOnlyBackup: '{0} local-only backup tasks',
                cronjobReasonNormal: 'Cron job execution and backup coverage are normal',
                riskLow: 'Low Risk',
                viewFailedRecords: 'View Failed Tasks',
                viewCronjobTasks: 'View Cron Jobs',
                checkBackupTasks: 'Check Backup Tasks',
                generationRule: 'Generation Rules',
                scheduleDaily: 'Daily',
                scheduleDailyDesc: 'Generate a report for the last 24 hours at 09:00 every day',
                scheduleWeekly: 'Weekly',
                scheduleWeeklyDesc: 'Generate a report for the last 7 days at 09:00 every Monday',
                scheduleMonthly: 'Monthly',
                scheduleMonthlyDesc: 'Generate a report for the previous month at 09:00 on the 1st',
                scheduleCurrentDaily: 'Every day at 09:00, generate the last 24 hours report · Next {0}',
                scheduleCurrentWeekly: 'Every Monday at 09:00, generate the last 7 days report · Next {0}',
                scheduleCurrentMonthly: 'On the 1st at 09:00, generate the previous month report · Next {0}',
                notificationMethod: 'Notification Methods',
                channel: 'Channel',
                receiver: 'Receiver',
                systemThreshold: 'System Threshold',
                metric: 'Metric',
                currentRule: 'Current Rule',
                hostMonitor: 'Host Monitor',
                monitorInterval: 'Monitor Interval',
                exportSettings: 'Export Settings',
                lastExportReport: 'Recent Generated Result',
                noLastExportReport: 'No exported report records',
                lastExportStatus: 'Last Export Status',
                exportFile: 'Export File',
                generateTime: 'Generated At',
                fileSize: 'File Size',
                viewExportHistory: 'View Export History',
                defaultFormat: 'Default Format',
                savePath: 'Save Directory',
                savePathRequired: 'Set the report save directory',
                autoExport: 'Enable Auto Export',
                autoExportDesc: 'Generate an Ops Report automatically every day at 09:00 when enabled',
                autoExportEnabled: 'Auto export enabled',
                autoExportDisabled: 'Auto export disabled',
                readOnlyPermissionTip:
                    'The current account can only view Ops Report settings. Contact an administrator to make changes.',
                refreshing: 'Refreshing',
                exporting: 'Exporting',
                exportFailed: 'Failed to export report',
                generating: 'Generating',
                saved: 'Saved',
                saveFailed: 'Failed to save settings',
                generateNow: 'Generate Now',
                generateSuccess: 'Report file generated: {0}',
                generateFailed: 'Failed to generate report',
                enabledStatus: 'Enabled',
                disabledStatus: 'Disabled',
                alertConfigInvalid: 'Invalid Config',
                thresholdRule: 'Threshold {0}, trigger after {1} consecutive times',
                hours: '{0} hours',
                minutes: '{0} minutes',
                seconds: '{0} seconds',
                totalExports: 'Total Exports',
                successExports: 'Successful Exports',
                failedExports: 'Failed Exports',
                reportName: 'Report Name',
                exportFormat: 'Export Format',
                operator: 'Operator',
                triggerType: 'Trigger',
                filePath: 'File Path',
                manualExport: 'Manual',
                scheduledExport: 'Scheduled',
                exportResult: 'Export Result',
                exportDetail: 'Export Detail',
            },
        },
        user: {
            user: 'User',
            userInfo: 'User Info',
            userManage: 'User Management',
            superAdmin: 'Super Admin',
            superAdminDesc: 'Has full system management permissions and can manage all resources and configurations.',
            nodeAdmin: 'Node Admin',
            nodeAdminDesc:
                'Has management permissions for specified nodes and can manage resources and configurations within those nodes.',
            readOnly: 'Read Only',
            readOnlyDesc:
                'Has read-only access to all system permissions and can view all resources and configurations.',
            bindNode: 'Bind Node',
            boundUsers: 'Bound Users',
            role: 'Role',
            roleName: 'Name',
            permission: 'Permissions',
            permissionDuplicate: 'Only one role can be assigned to each node',
            nodeAdminMasterConfirm:
                'Node Admin permissions on the master node are elevated. Assign them carefully based on actual management needs.',
            permissionLinkageTip:
                'Related permissions are selected automatically when dependencies exist; after manual removal, some features may show "Current user has no permission".',
            allViewPermissionHelper: 'Grants all view permissions for AI Gateway.',
            apiKeyViewPermissionHelper: 'Only allows viewing AI Gateway API Keys.',
            masterOnlyPermission: 'Master Node Permission',
            masterOnlyPermissionHelper: 'This permission only takes effect on the master node.',
            view: 'View',
            manage: 'Manage',
            authManage: 'Authentication',
            auth: {
                providerNavigation: 'Authentication providers',
                defaultNode: 'Default node',
                defaultNodePlaceholder: 'Select a node',
                defaultNodeHelper: 'Only for new users.',
                defaultNodeRequired: 'Select a valid default node.',
                nodesLoadFailed: 'Failed to load nodes. Retry before selecting the default node.',
                nodeHandling: 'Node handling',
                assignDefaultNode: 'Assign default node: {node}',
                keepExistingNode: 'Keep the existing node permissions',
                providers: {
                    ldap: 'AD/LDAP',
                    passkey: 'Passkey',
                    radius: 'Radius',
                    oidc: 'OIDC',
                    saml2: 'SAML2',
                    cas: 'CAS',
                    oauth2: 'OAuth2',
                    dingtalk: 'DingTalk',
                    feishu: 'Feishu',
                    wecom: 'WeCom',
                },
                providerDescriptions: {
                    ldap: 'Compatible with Active Directory, OpenLDAP, and other LDAP services',
                    passkey: 'Use device credentials for passwordless sign-in',
                    radius: 'Authenticate network access through a Radius service',
                    oidc: 'Connect enterprise single sign-on with OpenID Connect',
                    saml2: 'Use SAML2 for enterprise identity federation',
                    cas: 'Connect a centralized authentication service for single sign-on',
                    oauth2: 'Connect a compatible OAuth2 identity service',
                    dingtalk: 'Use DingTalk organization identity and QR sign-in',
                    feishu: 'Use Feishu organization identity and account synchronization',
                    wecom: 'Authenticate with WeCom member identity',
                },
                planned: 'Planned',
                plannedTitle: '{0} authentication settings',
                plannedDesc: 'This authentication provider is planned and is not available yet.',
                oidc: {
                    accessMode: 'Connection mode',
                    accessModeDesc: 'Use standard Discovery whenever the identity provider supports it.',
                    actionCreate: 'Create user',
                    actionKeepName: 'Keep the current name',
                    actionPending: 'Waiting for result',
                    actionReject: 'Reject login',
                    actionUpdate: 'Update identity information',
                    advanced: 'Advanced settings',
                    advancedDesc: 'Keep the secure defaults unless the provider requires a compatibility option.',
                    assignDefaultRole: 'Assign default role: {role}',
                    authorizationEndpoint: 'Authorization Endpoint',
                    authorizationEndpointInvalid: 'Enter a valid Authorization Endpoint.',
                    authorizationFlow: 'Authorization flow',
                    automatic: 'Automatic',
                    automaticPolicy: 'Automatic handling policy',
                    automaticPolicyDesc: 'These rules are enforced by the backend and are not administrator switches.',
                    basic: 'Basic settings',
                    basicDesc: 'Select the provider mode, then configure the client and callback.',
                    browserTest: 'Browser test login',
                    browserTestConflict: 'Identity verified, but the name conflicts',
                    browserTestConflictHelper: 'The mapped name belongs to another identity and will not be claimed.',
                    browserTestExpired: 'Browser test expired',
                    browserTestExpiredHelper: 'Start a new browser test and complete authorization before it expires.',
                    browserTestFailed: 'Browser test failed',
                    browserTestFailedHelper:
                        'The identity preview could not be completed. Review the localized backend error.',
                    browserTestIsolation:
                        'This performs a real authorization round trip but does not create or update users, assign roles, or create an authenticated panel session.',
                    browserTestPopupBlocked: 'Allow pop-ups for this site, then start the browser test again.',
                    browserTestPopupClosed: 'The authorization window was closed before the test completed.',
                    browserTestSuccess: 'Provider verification succeeded',
                    browserTestSuccessHelper: 'Identity mapping was previewed without changing users or sessions.',
                    browserTestTitle: 'OIDC browser test login',
                    browserTestWaiting: 'Waiting for Provider authorization',
                    browserTestWaitingHelper:
                        'Complete sign-in in the new browser window. This page will update automatically.',
                    callbackCopied: 'OIDC callback URL copied.',
                    callbackURL: 'Callback URL',
                    callbackURLHelper: "Add this URL to the client's allowed callback URLs in the identity provider.",
                    cancelClearSecret: 'Cancel clearing',
                    clearSecret: 'Clear secret',
                    clearSecretConfirm: 'The Client Secret will be removed only after you save. Continue?',
                    clientAuthMethod: 'Client authentication method',
                    clientAuthMethodHelper:
                        'Select the authentication method configured for this client in the identity provider.',
                    clientAuthMethodRequired: 'Select a client authentication method.',
                    clientID: 'Client ID',
                    clientIDRequired: 'Enter the Client ID.',
                    clientSecret: 'Client Secret',
                    clockSkew: 'Token time tolerance',
                    clockSkewHelper:
                        'Allows a small time difference between the identity provider and 1Panel. Keep the default 60 seconds.',
                    clockSkewRequired: 'Enter the token time tolerance.',
                    compatibilityMode: 'Compatibility mode',
                    compatibilityModeHelper:
                        'Use only for incomplete Discovery or rewritten endpoints. Core OIDC validation remains enabled.',
                    configurationFailedHelper: 'The test failed. The page only displays the localized backend error.',
                    configurationFailedTag: 'Test failed',
                    configurationHighRiskPassed:
                        'The configuration passed, but contains high-risk compatibility options.',
                    configurationHighRiskTag: 'High-risk configuration passed',
                    configurationNotTested: 'The current configuration has not been tested.',
                    configurationNotTestedTag: 'Not tested',
                    configurationPassed: 'The current configuration passed the security and capability checks.',
                    configurationPassedTag: 'Test passed',
                    configurationStaleHelper: 'Configuration changed. Test it again before saving.',
                    configurationStaleTag: 'Result expired',
                    configurationTestMeta:
                        'Tested at {time}; completed in {duration} ms. Raw Provider responses are not stored.',
                    configurationTestResult: 'Configuration test result',
                    configurationTestResultDesc:
                        'This checks Discovery and capabilities only; it does not exchange an authorization code or prove the Client Secret. Use browser test login for end-to-end verification.',
                    configurationTestSuccess: 'OIDC configuration test succeeded.',
                    configurationTesting: 'Testing the current OIDC configuration…',
                    configurationTestingTag: 'Testing',
                    configureSecret: 'Configure secret',
                    conflictExistingRename: 'A bound subject returns a new name that is occupied',
                    conflictExistingRenameResult: 'Keep the existing User.Name and allow the bound user to sign in',
                    conflictLDAP: 'LDAP user',
                    conflictLocal: 'Local user',
                    conflictNewAvailable: 'New subject and the mapped name are available',
                    conflictNewAvailableResult: 'Create an enterprise user and assign the default role',
                    conflictNone: 'No conflict',
                    conflictOIDC: 'Another OIDC identity',
                    conflictOccupied: 'The mapped name belongs to a local, LDAP, or another OIDC identity',
                    conflictOccupiedResult: 'Reject the new identity; never bind or merge automatically',
                    conflictType: 'Conflict type',
                    connectionSecurity: 'Connection security',
                    connectionSecurityDesc:
                        'Certificates are verified by default; private IdP addresses are detected automatically.',
                    connectionTest: 'Connection and configuration test',
                    connectionTestCompatibilityDesc: 'Validate custom endpoints and the protocol security policy.',
                    connectionTestStandardDesc:
                        'Endpoints and capabilities are discovered automatically from the Issuer.',
                    connectionTestTab: 'Connection test',
                    customCA: 'Custom CA',
                    customCAHelper: 'Applies only to this authentication source and is never written to logs.',
                    customCARequired: 'Provide the custom CA certificate.',
                    defaultRole: 'Default role',
                    defaultRoleHelper:
                        'Assigned only when the user is first created; later sign-ins do not change the role.',
                    defaultRolePlaceholder: 'Select a role',
                    defaultRoleRequired: 'Select a valid default role.',
                    disableAfterSave: 'OIDC will be disabled after saving.',
                    disableConfirm: 'Disabling OIDC immediately invalidates access for users of this source. Continue?',
                    disableDiscardConfirm:
                        'Disabling OIDC is an emergency action: it only closes the login entry and immediately invalidates access for users of this source. Other unsaved changes on this page, including Client Secret changes, will be discarded. Continue?',
                    disableTitle: 'Disable OIDC',
                    disabled: 'Disabled',
                    discoveryAllowlist: 'Discovery ∩ security allowlist',
                    enable: 'Enable',
                    enableAfterSave: 'OIDC will be enabled after a successful save.',
                    enabled: 'Enabled',
                    endSessionEndpoint: 'End Session Endpoint',
                    endSessionEndpointHelper:
                        'Saved for future use; Provider-initiated logout is not included in this release.',
                    endSessionEndpointInvalid: 'Enter a valid End Session Endpoint.',
                    endpointDiscoveryPlaceholder: 'Shown after connection test',
                    firstLogin: 'First login',
                    firstLoginPolicy: 'Create a local enterprise user and assign the configured default role.',
                    fixedAuthorizationCode: 'Authorization Code Flow',
                    fixedNoTokenPersistence: 'Tokens, Claims, and the verifier are never persisted',
                    fixedSecurityPolicy: 'Always enforced; no configuration required',
                    fixedStateNonce: 'One-time state and nonce',
                    fixedTokenValidation: 'ID Token signature and Claims validation',
                    highRiskSaveConfirm:
                        'This enabled configuration contains high-risk compatibility options. Confirm that the isolated environment requires them.',
                    highRiskTitle: 'High-risk OIDC configuration',
                    hs256Compatibility: 'HS256 (compatibility)',
                    hs256KeyHelper:
                        'HS256 always uses this source’s Client Secret and does not accept a separate signing key.',
                    hs256Warning:
                        'HS256 uses a shared symmetric secret for ID Token signatures. Use it only when the Provider cannot use an asymmetric algorithm.',
                    identityBindingPolicy:
                        'Identity is fixed to AuthSourceID + issuer + subject. A matching user name never claims another account.',
                    identityMissing: 'Identity inactive',
                    issuer: 'Issuer URL',
                    issuerHelper: 'The ID Token iss value and Discovery issuer must match this value exactly.',
                    issuerInvalid: 'Enter a valid HTTP or HTTPS Issuer URL without query or fragment.',
                    issuerRequired: 'Enter the Issuer URL.',
                    jwksRotation: 'Automatic JWKS rotation',
                    jwksURI: 'JWKS URI',
                    jwksURIHelper: 'Required for asymmetric signing when the key source is JWKS.',
                    jwksURIInvalid: 'Enter a valid JWKS URI for the selected signing key source.',
                    keepExistingRole: 'Keep existing roles and local permissions',
                    localSecurityData: 'Local security data',
                    localSecurityDataPolicy: 'Never overwrite roles, MFA, API Keys, Passkeys, or local permissions.',
                    localCredentialsManaged:
                        'The user name and local password are managed by OIDC and cannot be edited here. Roles, permissions, MFA, API Keys, and Passkeys remain local.',
                    localUserFields: 'Local user fields',
                    localUserFieldsDesc:
                        'The first release maps only User.Name and does not use a JSON mapping expression.',
                    loginWith: 'Sign in with {provider}',
                    manualEndpoints: 'Custom endpoints',
                    manualEndpointsDesc:
                        'Use only when Discovery is incomplete or an upstream gateway rewrites endpoints.',
                    mappingResult: 'Mapping result',
                    mode: 'Connection mode',
                    modeRequired: 'Select a connection mode.',
                    nameClaim: 'Username Claim',
                    nameClaimHelper: 'Enter the field containing the username, such as preferred_username.',
                    nameClaimRequired: 'Enter the Username Claim.',
                    nameConflict: 'Name conflict policy',
                    panelURL: '1Panel public URL',
                    panelURLHTTPWarning:
                        'HTTP does not protect the authorization response. Use it only in an isolated private environment accepted by the Provider.',
                    panelURLHelper:
                        'Enter the address users use to access 1Panel. It is used to generate the callback URL.',
                    panelURLInvalid: 'Enter an origin containing only scheme, host, and optional port.',
                    panelURLRequired: 'Enter the 1Panel public URL.',
                    pkceDisabled: 'Disabled (compatibility only)',
                    pkceDisabledWarning: 'Disabling PKCE reduces protection against authorization-code interception.',
                    pkceHelper: 'Prefer S256. The plain challenge method is never offered.',
                    pkceS256: 'S256 (recommended)',
                    plannedHandling: 'Planned handling',
                    privateNetworkIdP: 'Private-network IdP',
                    privateNetworkIdPHelper:
                        'Explicitly permits private addresses; metadata, loopback, link-local, redirects, and DNS rebinding remain blocked.',
                    privateNetworkWarning: 'Private-network access is enabled for this authentication source.',
                    protocolCompatibility: 'Protocol compatibility',
                    protocolCompatibilityDesc: 'ID Token signature validation can never be disabled.',
                    providerAndClient: 'Provider and client',
                    providerAndClientDesc:
                        'The Client Secret can only be replaced or cleared and is never returned by the page.',
                    providerCapabilities: 'Provider capabilities',
                    recentTestSuccess: 'Last test succeeded: {0}',
                    recommended: 'Recommended',
                    rejectPlain: 'plain rejected',
                    replaceSecret: 'Replace secret',
                    requestAndClaims: 'Requests and attributes',
                    requestAndClaimsDesc: 'Configure authorization scopes, UserInfo fallback, and request parameters.',
                    requestTimeout: 'Request timeout',
                    requestTimeoutRequired: 'Enter the request timeout.',
                    restore: 'Restore',
                    restored: 'The last saved OIDC settings were restored.',
                    result: 'Result',
                    rolesLoadFailed: 'Roles could not be loaded. Retry before selecting the default role.',
                    roleHandling: 'Role handling',
                    scenario: 'Scenario',
                    scopes: 'Authorization scopes',
                    scopesHelper: 'Must include openid. Separate multiple scopes with spaces.',
                    scopesRequired: 'Scopes must include openid.',
                    seconds: 'seconds',
                    secretClearHelper:
                        'After clearing, a new Client Secret is required before OIDC can be enabled again.',
                    secretConfigured: 'Configured',
                    secretNotConfigured: 'Not configured',
                    secretPlaceholder: 'Enter a new Client Secret',
                    secretReplaceHelper:
                        'The new secret replaces the saved value when you save. Update the Client Secret in the OIDC Provider as well.',
                    secretRequiredHelper: 'Configure a Client Secret before enabling OIDC.',
                    secretRequiredToEnable: 'Configure a Client Secret before enabling OIDC.',
                    secretSavedHelper: 'Stored encrypted. Leave blank to keep the current client secret.',
                    secretWaiting: 'Waiting for input',
                    secretWillClear: 'Will be cleared',
                    secretWillReplace: 'Will be replaced',
                    signingAlgorithm: 'ID Token signing algorithm',
                    signingAlgorithmHelper: 'Only algorithms in the backend security allowlist are available.',
                    signingKey: 'Signing key',
                    signingKeyClientSecret: 'Client Secret (HS256 only)',
                    signingKeyJWKS: 'JWKS URI with automatic rotation',
                    signingKeySource: 'Signing key source',
                    signingKeySourceHelper: 'Prefer JWKS. A static public key cannot rotate automatically.',
                    signingKeyStatic: 'Static JWK or PEM public key',
                    standardDiscovery: 'Standard OIDC Discovery',
                    standardDiscoveryDesc:
                        '1Panel discovers endpoints and capabilities and does not store the raw document.',
                    standardMode: 'Standard mode',
                    standardModeHelper: 'Discover endpoints, signing capabilities, and PKCE support from the Issuer.',
                    standardProtocolPolicy: 'Standard protocol policy',
                    standardProtocolPolicyDesc:
                        'Signing capabilities are negotiated automatically; no signing key is entered here.',
                    staticSigningKey: 'Static signing public key',
                    staticSigningKeyHelper:
                        'Only public-key material is accepted. Rotate it manually when the Provider key changes.',
                    staticSigningKeyPlaceholder: 'Paste a JWK, JWKS JSON, or PEM public key',
                    staticSigningKeyRequired: 'Provide the static signing public key.',
                    staticSigningKeyWarning:
                        'A static signing key cannot rotate automatically; update it before the Provider rotates keys.',
                    settingLoadFailed: 'OIDC settings could not be loaded',
                    settingLoadFailedHelper:
                        'The form is locked to avoid saving an empty default configuration over the current settings. Retry after the connection recovers.',
                    subsequentLogin: 'Subsequent login',
                    subsequentLoginPolicy:
                        'Find the binding by subject and update only User.Name when the new name is available.',
                    testBeforeBrowserTest: 'Test the current configuration before starting a browser login test.',
                    testBeforeEnable: 'Test the current configuration before saving configuration changes.',
                    testConfiguration: 'Test configuration',
                    testDiscovery: 'Test Discovery',
                    tlsCustomCA: 'HTTPS · Custom CA certificate',
                    tlsPrivateHTTP: 'HTTP · Private network only (dangerous)',
                    tlsPrivateHTTPWarning:
                        'HTTP provides no transport encryption and is restricted to explicitly allowed private targets.',
                    tlsSkipVerify: 'Ignore SSL certificate verification',
                    tlsSystem: 'HTTPS · System certificate verification (recommended)',
                    tokenEndpoint: 'Token Endpoint',
                    tokenEndpointInvalid: 'Enter a valid Token Endpoint.',
                    transportSecurity: 'Transport security',
                    transportSecurityHelper:
                        'Prefer HTTPS. Private HTTP also requires explicit private-network access.',
                    unsavedChanges: 'There are unsaved OIDC setting changes.',
                    usedClaim: 'Claim used',
                    userInfoEndpoint: 'UserInfo Endpoint',
                    userInfoEndpointHelper:
                        'When the username field is missing, the system retrieves it from this endpoint. Leave blank to skip fallback.',
                    userInfoEndpointInvalid: 'Enter a valid UserInfo Endpoint.',
                    userMapping: 'User settings',
                    userMappingDesc:
                        'Configure OIDC username mapping and the default node and role used to create a user on first sign-in.',
                },
                saml2: {
                    actionCreate: 'Create user',
                    actionPending: 'Waiting for result',
                    actionReject: 'Reject sign-in',
                    actionReuse: 'Use bound user',
                    assignDefaultRole: 'Assign default role: {role}',
                    basic: 'Basic settings',
                    basicDesc: 'Configure the common options required by most standard SAML2 identity providers.',
                    browserTest: 'Test sign-in',
                    browserTestConflict: 'Identity verified, but the username conflicts',
                    browserTestConflictHelper:
                        'The mapped username belongs to another identity and will not be linked automatically.',
                    browserTestExpired: 'Browser test expired',
                    browserTestExpiredHelper: 'Start a new test and complete sign-in before it expires.',
                    browserTestFailed: 'Browser test failed',
                    browserTestFailedHelper:
                        'The identity preview could not be completed. Check the localized backend error.',
                    browserTestIsolation:
                        'Performs a real SAML2 round trip without creating users, assigning roles, or creating a session.',
                    browserTestPopupBlocked: 'Allow pop-ups for this site, then run the test again.',
                    browserTestPopupClosed: 'The sign-in window was closed before the test completed.',
                    browserTestSuccess: 'SAML2 identity verified',
                    browserTestSuccessHelper:
                        'The identity mapping preview completed without modifying users or sessions.',
                    browserTestTitle: 'SAML2 test sign-in',
                    browserTestWaiting: 'Waiting for IdP sign-in',
                    browserTestWaitingHelper: 'Complete sign-in in the new window. This page updates automatically.',
                    certificateFileInvalid: 'Select a valid PEM, CRT, or CER certificate file.',
                    configured: 'Configured',
                    configurationFailedHelper: 'The test failed. Only the localized backend error is displayed.',
                    configurationNotTested: 'The current configuration has not been tested.',
                    configurationPassed: 'The current configuration passed validation.',
                    configurationStaleHelper: 'Authentication settings changed. Test the current draft again.',
                    configurationTestSuccess: 'SAML2 configuration test succeeded.',
                    configurationTesting: 'Testing the current SAML2 configuration…',
                    conflictLDAP: 'LDAP user',
                    conflictLocal: 'Local user',
                    conflictNone: 'No conflict',
                    conflictOIDC: 'OIDC identity',
                    conflictSAML2: 'Another SAML2 identity',
                    conflictType: 'Conflict type',
                    credentialFileReadFailed: 'The credential file could not be read.',
                    credentialFileTooLarge: 'Credential files must not exceed 256 KiB.',
                    credentialsRequired: 'Configure both the SP private key and certificate.',
                    defaultRole: 'New user role',
                    defaultRoleHelper:
                        'Assigned only when the user is first created. Later sign-ins keep local roles, MFA, and permissions.',
                    defaultRolePlaceholder: 'Select a role',
                    defaultRoleRequired: 'Select a valid new-user role.',
                    disableConfirm:
                        'Disabling SAML2 immediately rejects new sign-ins and invalidates its user sessions. Continue?',
                    disableDiscardConfirm:
                        'Disabling SAML2 discards other unsaved changes on this page and immediately invalidates its user sessions. Continue?',
                    disableTitle: 'Disable SAML2',
                    disabled: 'Disabled',
                    enable: 'Enable',
                    enabled: 'Enabled',
                    idpMetadata: 'IdP Metadata',
                    idpMetadataDesc: 'Enter a URL or paste XML. When both are present, the URL takes precedence.',
                    keepExistingRole: 'Keep the existing role and local permissions',
                    loginWith: 'Sign in with {provider}',
                    mappingResult: 'Mapping result',
                    metadataRequired: 'Enter an IdP Metadata URL or XML.',
                    metadataURLHelper: 'The backend downloads and validates Metadata during testing and saving.',
                    metadataURLInvalid: 'Enter a valid HTTPS Metadata URL without credentials or a fragment.',
                    metadataURLRecommended: 'Metadata URL (recommended)',
                    metadataXML: 'Metadata XML',
                    metadataXMLHelper: 'Use this when the IdP does not expose a reachable Metadata URL.',
                    metadataXMLInvalid: 'Enter valid EntityDescriptor Metadata XML.',
                    metadataXMLPlaceholder: 'Paste <EntityDescriptor>...</EntityDescriptor>',
                    nameAttribute: 'Username attribute',
                    nameAttributeHelper:
                        'Reads this Attribute from the verified SAML Assertion and maps it to the 1Panel username.',
                    nameAttributePlaceholder: 'For example: uid, username, or account',
                    nameAttributeRequired: 'Enter the username attribute.',
                    notConfigured: 'Not configured',
                    or: 'or',
                    pageDesc:
                        'Connect enterprise single sign-on through IdP Metadata with the common settings on one page.',
                    plannedHandling: 'Planned handling',
                    privateKeyFileInvalid: 'Select a valid PEM private-key file.',
                    recentTestSuccess: 'Last successful test: {0}',
                    restore: 'Restore',
                    restored: 'Restored the last saved SAML2 configuration.',
                    roleHandling: 'Role handling',
                    rolesLoadFailed: 'Failed to load roles. Retry before selecting the new-user role.',
                    selectFile: 'Select file',
                    serviceStatus: 'Service status',
                    serviceStatusDesc: 'The current configuration must pass a test before SAML2 can be enabled.',
                    settingLoadFailed: 'Failed to load SAML2 settings',
                    settingLoadFailedHelper:
                        'The form is locked to avoid overwriting saved settings with empty defaults. Retry after connectivity is restored.',
                    spCertificate: 'SP certificate',
                    spCertificateHelper: 'Published in SP Metadata so the IdP can verify sign-in and logout requests.',
                    spCredentials: 'SP private key and certificate',
                    spCredentialsDesc:
                        'Used to sign sign-in and logout messages. Signature and validation policy is fixed by the backend.',
                    spEntityID: 'SP Entity ID',
                    spEntityIDHelper:
                        'Unique SP identifier. It must match the Entity ID or audience configured in the IdP and also serves as the SP Metadata URL.',
                    acsURL: 'ACS URL',
                    sloURL: 'SLO URL',
                    spPrivateKey: 'SP private key',
                    spPrivateKeyHelper:
                        'Used to sign AuthnRequest and logout messages. It is encrypted at rest and never displayed.',
                    syncLogout: 'Synchronized logout',
                    syncLogoutHelper:
                        'Signing out of either 1Panel or the identity provider also signs out the other side.',
                    testBeforeBrowserTest: 'Test the current configuration before running a browser sign-in test.',
                    testBeforeEnable:
                        'Test the current configuration before enabling SAML2 or saving authentication-sensitive changes.',
                    testConfiguration: 'Test configuration',
                    unsavedChanges: 'The SAML2 configuration has unsaved changes.',
                    usedAttribute: 'Username mapping',
                    usersAndRoles: 'Users and roles',
                    usersAndRolesDesc:
                        'Configure panel username mapping and the default node and role used to create a user on first sign-in.',
                },
                ldap: {
                    basic: 'Basic settings',
                    loginTitle: 'LDAP sign-in',
                    loginWith: 'Sign in with LDAP',
                    backToLocalLogin: 'Back to panel sign-in',
                    enable: 'Enable',
                    enabled: 'Enabled',
                    disabled: 'Disabled',
                    connection: 'Basic connection',
                    connectionDesc: 'Configure the directory service and the bind account used to search for users.',
                    serverURL: 'Server URL',
                    serverURLHelper: 'Supports ldap:// and ldaps:// URLs.',
                    userBaseDN: 'User Base DN',
                    userBaseDNHelper: 'Starting DN for LDAP user searches; it can be an OU, CN, or domain root DN.',
                    bindDN: 'Bind DN',
                    bindPassword: 'Password',
                    passwordSaved: 'Leave blank to keep the saved password',
                    userSearch: 'User search',
                    userSearchDesc:
                        'Set the user search base and filter, then map the LDAP attribute used as the 1Panel name.',
                    userFilter: 'User filter',
                    userFilterTooltip:
                        'Replace %(user)s with the escaped username, or with * for a full directory read.',
                    userFilterHelper: 'Usernames are escaped before they are inserted into the LDAP filter.',
                    attributeMap: 'Attribute mapping',
                    attributeMapTooltip: 'JSON mapping from the 1Panel name field to an LDAP attribute.',
                    attributeMapHelper: 'Set the LDAP attribute mapped to the 1Panel name field.',
                    advanced: 'Advanced settings',
                    advancedDesc: 'Configure TLS and LDAP query paging.',
                    strictSync: 'Strict synchronization',
                    strictSyncTooltip:
                        'After a complete full import, users missing from this LDAP source have their authentication status set to Not found in LDAP, but are not deleted.',
                    strictSyncHelper:
                        "Only applies to a complete full import. Importing selected users does not change other users' authentication status.",
                    skipTLSVerify: 'Skip TLS verification',
                    skipTLSVerifyTooltip: 'Disable certificate verification for LDAPS connections.',
                    connectTimeout: 'Connection timeout (seconds)',
                    searchPageSize: 'LDAP query page size',
                    restore: 'Restore',
                    testConnection: 'Test connection',
                    testLogin: 'Test login',
                    userImport: 'Import users',
                    saveBeforeImport: 'Save the current AD/LDAP settings before importing users.',
                    format: 'Format',
                    restoreExample: 'Restore example',
                    mappingValid: 'Valid JSON; name is configured.',
                    mappingInvalid: 'Enter valid JSON.',
                    mappingObject: 'The attribute mapping must be a JSON object.',
                    mappingOnlyName: 'Only the name mapping is supported.',
                    mappingStringValues: 'Every mapped attribute must be a string.',
                    mappingNameRequired: 'name must be a non-empty string.',
                    restored: 'The last saved settings were restored.',
                    connectionTestSuccess: 'LDAP connection test succeeded.',
                    recentTestSuccess: 'Last test succeeded: {0}',
                    recentTestFailed: 'Last test failed: {0}',
                    serverURLRequired: 'Enter the LDAP server URL.',
                    serverURLInvalid: 'Use a valid ldap:// or ldaps:// URL.',
                    userBaseDNRequired: 'Enter the User Base DN.',
                    bindDNRequired: 'Enter the Bind DN.',
                    passwordRequired: 'Enter the password.',
                    userFilterRequired: 'Enter the user filter.',
                    connectTimeoutRequired: 'Enter the connection timeout.',
                    searchPageSizeRequired: 'Enter the LDAP query page size.',
                    sync: {
                        title: 'Scheduled sync',
                        description:
                            'Read the full LDAP directory on a schedule and maintain imported LDAP users in 1Panel.',
                        enable: 'Enable schedule',
                        enableHelper:
                            'When disabled, automatic execution stops; manual synchronization remains available.',
                        schedule: 'Schedule',
                        daily: 'Daily',
                        weekly: 'Weekly',
                        customCron: 'Custom Cron',
                        preview: 'Preview',
                        previewTitle: 'Next 5 runs',
                        previewEmpty: 'No execution time available',
                        cronHelper: 'Use a standard five-field Cron expression: minute, hour, day, month, weekday.',
                        autoImport: 'Import new users',
                        autoImportHelper:
                            'When disabled, only directory identifiers and status are maintained for imported LDAP users; no new users are created.',
                        defaultRole: 'New user role',
                        defaultRolePlaceholder: 'Select a role',
                        defaultRoleHelper: 'Only applies to users created by scheduled synchronization.',
                        defaultRoleRequired: 'Select a role for new LDAP users.',
                        strictSyncHelper:
                            'After a complete sync, users missing from LDAP are marked as Not found in LDAP and their sessions are cleared without deleting users, roles, or permissions.',
                        runNow: 'Sync now',
                        lastRunSuccess: 'Last sync succeeded: {0}',
                        lastRunFailed: 'Last sync failed: {0}',
                        lastRunRunning: 'Sync started: {0}',
                        sourceDisabled: 'Enable and save AD/LDAP before running synchronization.',
                        cronRequired: 'Enter a Cron expression.',
                        saveBeforeRun: 'Save the synchronization settings before running the task.',
                        runConfirmTitle: 'Run strict synchronization',
                        runConfirmDescription:
                            'LDAP users missing from a complete full query will have their authentication status set to Not found in LDAP and their active sessions cleared. Continue?',
                        runSuccess: 'LDAP synchronization completed.',
                        weekdays: {
                            0: 'Sunday',
                            1: 'Monday',
                            2: 'Tuesday',
                            3: 'Wednesday',
                            4: 'Thursday',
                            5: 'Friday',
                            6: 'Saturday',
                        },
                    },
                    syncLogs: {
                        title: 'Sync logs',
                        description: 'Review scheduled and manual LDAP synchronization results.',
                        startedAt: 'Start time',
                        trigger: 'Trigger',
                        manual: 'Manual',
                        scheduled: 'Scheduled',
                        success: 'Success',
                        failed: 'Failed',
                        running: 'Running',
                        result: 'Result',
                        resultSummary: 'Created {0}, updated {1}, missing {2}',
                        duration: 'Duration',
                        action: 'Action',
                    },
                    testLoginTitle: 'Test AD/LDAP login',
                    testLoginDesc:
                        'Bind with an AD/LDAP user credential to test authentication only. No 1Panel session is created.',
                    ldapUsername: 'LDAP username',
                    usernameRequired: 'Enter the LDAP username.',
                    startTest: 'Start test',
                    testLoginSuccess: 'Authentication succeeded.',
                    testLoginSuccessWithDN: 'Authentication succeeded. User DN: {0}',
                    import: {
                        title: 'Import AD/LDAP users',
                        source: 'Data source: AD/LDAP directory',
                        lastRead: 'Last read: {0}',
                        cacheHit: 'Cached result',
                        keywordPlaceholder: 'Search username',
                        search: 'Search',
                        refresh: 'Read from LDAP',
                        refreshTip: 'Ignore the short-term cache and read the LDAP directory again.',
                        loadFailed: 'Failed to read the LDAP directory.',
                        retry: 'Retry',
                        noData: 'No directory users found.',
                        username: 'Username',
                        status: 'Status',
                        changes: 'Changes',
                        noChanges: 'No changes',
                        importable: 'Ready to import',
                        updateAvailable: 'Update available',
                        upToDate: 'Up to date',
                        conflict: 'Name conflict',
                        selectedCount: '{0} selected',
                        totalCount: '{0} users',
                        newUserRole: 'New user role',
                        newUserRoleRequired: 'Select a role for new users.',
                        noNewUsers: 'There are no new users in this operation.',
                        roleOnlyForNewUsers: 'The selected role is applied only to newly created users.',
                        strictOff: 'Strict synchronization is disabled. A full import will not disable users.',
                        importSelected: 'Import/update selected ({0})',
                        importAll: 'Import/update all ({0})',
                        previewTitle: 'Confirm full import',
                        previewDesc:
                            'The complete LDAP directory was read. The search keyword does not limit this operation.',
                        created: 'Create',
                        updated: 'Update',
                        unchanged: 'Unchanged',
                        conflicts: 'Conflicts',
                        missing: 'Disable',
                        reactivated: 'Reactivate',
                        strictWarning:
                            'Strict synchronization is enabled. Users missing from LDAP cannot sign in, but their records, roles, and permissions are retained.',
                        missingUsers: 'Users missing from LDAP',
                        missingScope: 'Only this LDAP source is affected.',
                        willDisable: 'Will be disabled',
                        confirmAll: 'Confirm import',
                        confirmAllWithMissing: 'Confirm import and disable {0} users',
                        executeSuccess: 'LDAP users were processed successfully.',
                        queryExpired: 'The directory result expired. Read from LDAP again.',
                        planIncomplete: 'The full directory read is incomplete and cannot be executed.',
                    },
                },
            },
        },
        app: {
            app: 'APP',
            title: 'Panel Alias',
            titleHelper: 'The panel alias is used for display in the APP (default panel alias)',
            qrCode: 'QR Code',
            apiStatusHelper: 'The Panel APP needs to enable the API interface feature',
            apiInterfaceHelper:
                'Supports panel API interface access (this feature needs to be enabled for the panel app)',
            apiInterfaceHelper1:
                "Panel app access requires adding the visitor to the whitelist; for non-fixed IPs, it's recommended to add 0.0.0.0/0 (all IPv4), ::/0 (all IPv6)",
            qrCodeExpired: 'Refresh time',
            apiLeakageHelper: 'Do not disclose the QR code. Ensure it is used only in trusted environments.',
        },
        logExport: {
            title: 'Export Logs',
            records: 'Export Records',
            retentionDays: 'Export Record Retention',
            timeRange: 'Time Range',
            timeRequired: 'Select an export time range',
            websiteRequired: 'Select a website',
            blackStatus: 'Blacklist Status',
            black: 'Blacklisted',
            notBlack: 'Not Blacklisted',
            fuzzy: 'Fuzzy Match',
            regex: 'Regular Expression',
            invalidRegex: 'Enter a valid RE2 regular expression with at most 256 characters',
            created: 'Export task created',
            fileName: 'File Name',
            fileSize: 'File Size',
            expiresAt: 'Expires At',
            cancelConfirm: 'Cancel this export task?',
            deleteConfirm: 'Delete this export record and file?',
        },
        waf: {
            WAF: 'WAF',
            name: 'WAF',
            blackWhite: 'Black and White List',
            globalSetting: 'Global Settings',
            websiteSetting: 'Website Settings',
            blockRecords: 'Blocked Records',
            world: 'World',
            china: 'China',
            intercept: 'Interception',
            request: 'Requests',
            count4xx: '4xx Quantity',
            count5xx: '5xx Quantity',
            todayStatus: "Today's Status",
            reqMap: 'Attack Map (Last 30 days)',
            resource: 'Source',
            count: 'Quantity',
            hight: 'High',
            low: 'Low',
            reqCount: 'Requests',
            interceptCount: 'Interception Number',
            requestTrends: 'Request Trends (Last 7 Days)',
            interceptTrends: 'Interception Trends (Last 7 Days)',
            whiteList: 'Whitelist',
            blackList: 'Blacklist',
            ipBlackListHelper: 'IP addresses in the blacklist are blocked from accessing the website',
            ipWhiteListHelper: 'IP addresses in the whitelist bypass all restrictions',
            uaBlackListHelper: 'Requests with User-Agent values in the blacklist will be blocked',
            uaWhiteListHelper: 'Requests with User-Agent values in the whitelist bypass all restrictions',
            urlBlackListHelper: 'Requests to URLs in the blacklist will be blocked',
            urlWhiteListHelper: 'Requests to URLs in the whitelist bypass all restrictions',
            ccHelper:
                'If a website receives more than {1} requests from the same IP within {0} seconds, the IP will be blocked for {2}',
            blockTime: 'Blocking Duration',
            attackHelper: 'If cumulative interceptions exceed {1} within {0} seconds, the IP will be blocked for {2}',
            notFoundHelper:
                'If cumulative requests return 404 errors more than {1} times within {0} seconds, the IP will be blocked for {2}',
            frequencyLimit: 'Frequency Limit',
            regionLimit: 'Region Limit',
            defaultRule: 'Default Rules',
            accessFrequencyLimit: 'Access Frequency Limit',
            attackLimit: 'Attack Frequency Limit',
            notFoundLimit: '404 Frequency Limit',
            urlLimit: 'URL Frequency Limit',
            urlLimitHelper: 'Set access frequency for a single URL',
            sqliDefense: 'SQL Injection Protection',
            sqliHelper: 'Detect SQL injection in requests and block them',
            xssHelper: 'Detect XSS in requests and block them',
            xssDefense: 'XSS Protection',
            uaDefense: 'Malicious User-Agent Rules',
            uaHelper: 'Includes rules to identify common malicious bots',
            argsDefense: 'Malicious Parameter Rules',
            argsHelper: 'Blocks requests containing malicious parameters',
            cookieDefense: 'Malicious Cookie Rules',
            cookieHelper: 'Prohibit malicious cookies from being carried in requests',
            headerDefense: 'Malicious Header Rules',
            headerHelper: 'Prohibit requests from containing malicious headers',
            httpRule: 'HTTP Request Method Rules',
            httpHelper:
                'Set the method types that are allowed to access. If you want to restrict certain types of access, please turn off this type of button. For example: only GET type access is allowed, then you need to turn off other types of buttons except GET',
            geoRule: 'Regional Access Restrictions',
            geoHelper:
                'Combine region and province policies under one switch. Region rules run first, then province rules can further restrict Chinese provincial regions',
            regionPolicy: 'Region policy',
            provincePolicy: 'Province policy',
            provinceRuleLabel: 'Province',
            openRestyFeatureVersionAlert: 'OpenResty must be newer than 1.31.1.1-0 for {0} to take effect.',
            ipLocation: 'IP Location',
            ipLocationSearchHelper: 'Enter an IP location, fuzzy search supported',
            action: 'Action',
            ruleType: 'Attack Type',
            ipHelper: 'Enter the IP address',
            attackLog: 'Attack Log',
            rule: 'Rule',
            ipArr: 'IPV4 Range',
            ipStart: 'Start IP',
            ipEnd: 'End IP',
            ipv4: 'IPv4',
            ipv6: 'IPv6',
            urlDefense: 'URL Rules',
            urlHelper: 'Forbidden URL',
            dirFilter: 'Directory Filter',
            sqlInject: 'SQL Injection',
            xss: 'XSS',
            webshell: 'WebShell',
            phpExec: 'PHP Script Execution',
            oneWordTrojan: 'One word Trojan',
            appFilter: 'Dangerous Directory Filtering',
            webShell: 'Webshell',
            args: 'Malicious Parameters',
            protocolFilter: 'Protocol Filter',
            javaFilter: 'Java Dangerous File Filtering',
            scannerFilter: 'Scanner Filter',
            escapeFilter: 'Escape Filter',
            customRule: 'Custom Rules',
            httpMethod: 'HTTP Method Filter',
            fileExt: 'File Upload Limit',
            fileExtHelper: 'Prohibited file extensions for upload',
            deny: 'Forbidden',
            allow: 'Allow',
            allowOnly: 'Allow only',
            field: 'Object',
            pattern: 'Condition',
            ruleContent: 'Content',
            contain: 'include',
            equal: 'equal',
            regex: 'regular expression',
            notEqual: 'Not equal to',
            customRuleHelper: 'Take actions based on specified conditions',
            actionAllow: 'Allow',
            blockIP: 'Block IP',
            code: 'Return Status Code',
            noRes: 'Disconnect (444)',
            badReq: 'Invalid Parameters (400)',
            forbidden: 'Access Forbidden (403)',
            serverErr: 'Server Error (500)',
            resHtml: 'Response Page',
            allowHelper: 'Allowing access will skip subsequent WAF rules, please use with caution',
            captcha: 'human-machine verification',
            fiveSeconds: '5-Seconds verification',
            location: 'Region',
            redisConfig: 'Redis Configuration',
            redisHelper: 'Enable Redis to persist temporarily blocked IPs',
            wafHelper: 'All websites will lose protection after closing',
            websiteWafHelper: 'This website will lose protection after closing',
            attackIP: 'Attacking IP',
            attackParam: 'Attack Details',
            execRule: 'Hit Rule',
            acl: 'ACL',
            sql: 'SQL Injection',
            cc: 'Access Frequency Limit',
            isBlocking: 'Blocked',
            isFree: 'Unblocked',
            unLock: 'Unlock',
            unLockHelper: 'unblock IP: {0}?',
            saveDefault: 'Save Default',
            saveToWebsite: 'Apply to Website',
            saveToWebsiteHelper: 'Apply current settings to all websites? ',
            websiteHelper:
                'Here are the default settings for creating a website. Modifications need to be applied to the website to take effect',
            websiteHelper2:
                'Here are the default settings for creating a website. Please modify the specific configuration at the website',
            ipGroup: 'IP Group',
            ipGroupHelper:
                'One IP or IP segment per line, supports IPv4 and IPv6, for example: 192.168.1.1 or 192.168.1.0/24',
            ipBlack: 'IP blacklist',
            openRestyAlert: 'OpenResty version needs to be higher than {0}',
            initAlert:
                'Initialization is required for first-time use, the website configuration file will be modified, and the original WAF configuration will be lost. Please be sure to back up OpenResty in advance',
            initHelper:
                'The initialization operation will clear the existing WAF configuration. Are you sure you want to initialize? ',
            mainSwitch: 'Main Switch',
            websiteSwitch: 'Switch',
            websiteAlert: 'Please create a website first',
            defaultUrlBlack: 'URL Rules',
            htmlRes: 'Intercept Page',
            urlSearchHelper: 'Enter the URL to support fuzzy search',
            hostSearchHelper: 'Enter the Host to support fuzzy search',
            toCreate: 'Create',
            closeWaf: 'Close WAF',
            closeWafHelper: 'Closing WAF will cause the website to lose protection, do you want to continue',
            addblack: 'Black',
            addwhite: 'Add white',
            addblackHelper: 'Add IP:{0} to the default blacklist?',
            addwhiteHelper: 'Add IP:{0} to the default whitelist?',
            defaultUaBlack: 'User-Agent rule',
            defaultIpBlack: 'Malicious IP Group',
            cookie: 'Cookie Rules',
            urlBlack: 'URL Blacklist',
            uaBlack: 'User-Agent blacklist',
            attackCount: 'Attack frequency limit',
            fileExtCheck: 'File upload limit',
            geoRestrict: 'Regional access restriction',
            originProtect: 'CDN origin protection',
            attacklog: 'Interception Record',
            unknownWebsite: 'Unauthorized domain name access',
            geoRuleEmpty: 'Select at least one region or province',
            unknown: 'Website Not Exist',
            geo: 'Region Restriction',
            revertHtml: 'restore {0} as the default page?',
            five_seconds: '5-Second verification',
            header: 'Header rules',
            methodWhite: 'HTTP rules',
            expiryDate: 'Expiration date',
            expiryDateHelper:
                'After passing the verification, it will no longer be verified within the validity period',
            defaultIpBlackHelper: 'Some malicious IPs collected from the Internet to prevent access',
            notFoundCount: '404 Frequency Limit',
            matchValue: 'Match value',
            headerName: 'Supports non-special characters starting with English, numbers, -, length 3-30',
            cdnHelper: 'Websites using CDN can open here to obtain the correct source IP',
            clearLogWarn: 'Clearing the log will not be possible, continue?',
            commonRuleHelper: 'Rule is fuzzy matching',
            blockIPHelper:
                'Blocked IPs are temporarily stored in OpenResty and will be unblocked when you restart OpenResty. They can be permanently blocked through the blocking function',
            addWhiteUrlHelper: 'Add URL {0} to the whitelist?',
            dashHelper: 'The community version can also use the functions in global settings and website settings',
            wafStatusHelper: 'The firewall is not enabled. Website security protection is paused. Enable it soon.',
            enableProtection: 'Enable Protection',
            ccMode: 'Mode',
            global: 'Global Mode',
            uriMode: 'URL Mode',
            globalHelper:
                'Global Mode: Triggered when the total number of requests to any URL within a unit of time exceeds the threshold',
            uriModeHelper:
                'URL Mode: Triggered when the number of requests to a single URL within a unit of time exceeds the threshold',
            ip: 'IP BlackList',
            globalSettingHelper:
                'Settings with the [Website] tag need to be enabled in [Website Settings], and global settings are only the default settings for newly created websites',
            globalSettingHelper2:
                'Settings need to be enabled in both [Global Settings] and [Website Settings] at the same time',
            urlCCHelper: 'More than {1} requests to this URL within {0} seconds, blocking this IP {2}',
            urlCCHelper2: 'URL cannot contain parameters',
            notContain: 'Not contain',
            urlcc: 'URL frequency limit',
            method: 'Request type',
            addIpsToBlock: 'Batch block IP',
            addIpSegmentToBlock: 'Block IP segment',
            addIpSegmentsToBlock: 'Batch block IP segments',
            addUrlsToWhite: 'Batch add URL to white list',
            noBlackIp: 'IP is already blocked, no need to block again',
            noWhiteUrl: 'URL is already in the white list, no need to add again',
            spiderIpHelper:
                'When enabled, only selected spiders are allowed. When disabled, all spider access is blocked.',
            spiderIp: 'Spider IP Pool',
            spider: 'Spider',
            spiderAllowlist: 'Allowed spiders',
            spiderAllowlistEmpty: 'No spiders selected. Saving will block all spider access.',
            geoIp: 'IP Address Library',
            geoIpHelper: 'Used to confirm the geolocation of the IP',
            stat: 'Attack Report',
            statTitle: 'Report',
            attackIp: 'IP',
            attackCountNum: 'Counts',
            percent: 'Percentage',
            addblackUrlHelper: 'Whether to add URL: {0} to the default blacklist?',
            rce: 'Remote Code Execution',
            software: 'Software',
            cveHelper: 'Contains vulnerabilities of common software and frameworks',
            vulnCheck: 'Supplementary Rules',
            ssrf: 'SSRF Vulnerability',
            afr: 'Arbitrary File Read',
            ua: 'Unauthorized Access',
            id: 'Information Disclosure',
            aa: 'Authentication Bypass',
            dr: 'Directory Traversal',
            xxe: 'XXE Vulnerability',
            suid: 'Serialization Vulnerability',
            dos: 'Denial of Service Vulnerability',
            afd: 'Arbitrary File Download',
            sqlInjection: 'SQL Injection',
            afw: 'Arbitrary File Write',
            il: 'Information Leak',
            clearAllLog: 'Clear all logs',
            exportLog: 'Export logs',
            appRule: 'Application Rules',
            appRuleHelper:
                'Common application rules, enabling can reduce false positives, one website can only use one rule',
            logExternal: 'Exclude Record Types',
            ipWhite: 'IP White List',
            urlWhite: 'URL White List',
            uaWhite: 'User-Agent White List',
            logExternalHelper:
                'Excluded record types will not be recorded in logs, blacklist/whitelist, regional access restrictions, and custom rules will generate a lot of logs, it is recommended to exclude',
            ssti: 'SSTI Attack',
            crlf: 'CRLF Injection',
            strict: 'Strict Mode',
            strictHelper: 'Use stricter rules to validate requests',
            executionStrategy: 'Execution strategy',
            detectionStrength: 'Detection strength',
            protectionMode: 'Protection mode',
            observationMode: 'Observation mode',
            standardMode: 'Standard mode',
            observationModeHelper: 'Detects and logs requests without blocking them',
            observationModeConfirm:
                'In observation mode, all WAF matches are logged without blocking requests. Continue?',
            globalStrictRequired: 'Enable strict mode in global settings first',
            websiteSearchHelper: 'Enter a website domain, alias, or remark',
            configReadFailed: 'Failed to load configuration',
            detailSetting: 'Detailed settings',
            observe: 'Observe',
            saveLog: 'Save Log',
            remoteURLHelper: 'The remote URL needs to ensure one IP per line and no other characters',
            notFound: 'Not Found (404)',
            serviceUnavailable: 'Service Unavailable (503)',
            gatewayTimeout: 'Gateway Timeout (504)',
            belongToIpGroup: 'Belongs to IP Group',
            notBelongToIpGroup: 'Does not belong to IP Group',
            unknownWebsiteKey: 'Unknown Domain',
            special: 'Special',
            fileToLarge: 'File exceeds 1MB and cannot be uploaded',
            uploadOverLimit: 'Uploaded file exceeds the quantity limit, maximum 1 file',
            importRuleHelper: 'One rule per line',
        },
        monitor: {
            '360': '360 Search',
            name: 'Website Monitoring',
            pv: 'Page Views',
            uv: 'Unique Visitors',
            flow: 'Traffic Flow',
            ip: 'IP',
            spider: 'Spider',
            visitors: 'Visitor Trends',
            today: 'Today',
            last7days: 'Last 7 Days',
            last30days: 'Last 30 Days',
            uvMap: 'Visitor Map (30th)',
            qps: 'Real-time Requests (per minute)',
            flowSec: 'Real-time Traffic (per minute)',
            excludeCode: 'Exclude Status Codes',
            excludeUrl: 'Exclude URLs',
            excludeExt: 'Exclude Extensions',
            cdnHelper: 'Obtain the real IP from the CDN-provided Header',
            reqRank: 'Visit Ranking',
            refererDomain: 'Referrer Domain',
            os: 'System',
            browser: 'Browser/Client',
            device: 'Device',
            showMore: 'More',
            unknown: 'Other',
            pc: 'Computer',
            mobile: 'Mobile Device',
            wechat: 'WeChat',
            machine: 'machine',
            tencent: 'Tencent Browser',
            ucweb: 'UC Browser',
            '2345explorer': '2345 browser',
            huaweibrowser: 'Huawei Browser',
            log: 'Request Logs',
            statusCode: 'Status Code',
            requestTime: 'Response Time',
            flowRes: 'Response Traffic',
            method: 'Request Method',
            statusCodeHelper: 'Enter the status code above',
            statusCodeError: 'Invalid status code type',
            methodHelper: 'Enter the request method above',
            all: 'All',
            baidu: 'Baidu',
            google: 'Google',
            bing: 'Bing',
            bytes: 'Today headlines',
            sogou: 'Sogou',
            failed: 'Error',
            ipCount: 'IP Count',
            spiderCount: 'Spider Requests',
            averageReqTime: 'Average Response Time',
            totalFlow: 'Total Flow',
            logSize: 'Log File Size',
            realIPType: 'Real IP acquisition method',
            realIPRecognition: 'Real IP detection',
            fromHeader: 'Get from HTTP Header',
            fromHeaders: 'Get from Header list',
            header: 'HTTP Header',
            cdnConfig: 'CDN Configuration',
            xff1: 'First-level Proxy from X-Forwarded-For',
            xff2: 'Second-level Proxy from X-Forwarded-For',
            xff3: 'Third-level Proxy from X-Forwarded-For',
            xffHelper:
                'For example: X-Forwarded-For: <client>,<proxy1>,<proxy2>,<proxy3> The upper level proxy will take the last IP <proxy3>',
            headersHelper:
                'Obtain the real IP from commonly used CDN HTTP headers, selecting the first available value',
            monitorCDNHelper:
                'Modifying the CDN configuration for website monitoring will also update the WAF CDN settings',
            wafCDNHelper: 'Modifying the WAF CDN configuration will also update the website monitoring CDN settings',
            originProtection: 'Origin protection',
            originProtectionHelper:
                'Only CDN nodes in the selected IP groups may connect to the origin. Visitor real-IP detection uses a separate switch.',
            originProtectionIPGroups: 'CDN origin IP groups',
            originProtectionIPGroupsPlaceholder: 'Select trusted CDN origin IP groups',
            originProtectionWarning:
                'An incorrect configuration may make the website unavailable. Confirm that every CDN origin address is included.',
            originProtectionEnableConfirm:
                'Connections outside the selected IP groups will be treated as direct origin access and blocked. Continue?',
            statusErr: 'Invalid status code format',
            shenma: 'Shenma Search',
            duckduckgo: 'DuckDuckGo',
            yandex: 'Yandex',
            gptbot: 'GPTBot',
            excludeUri: 'Exclude URIs',
            top100Helper: 'Show the top 100 data',
            logSaveDay: 'Log Retention Period (days)',
            cros: 'Chrome OS',
            theworld: 'TheWorld Browser',
            edge: 'Microsoft Edge',
            maxthon: 'Maxthon Browser',
            monitorStatusHelper: 'Website monitoring is currently disabled. Enable it now',
            excludeIp: 'Exclude IP Addresses',
            excludeUa: 'Exclude User-Agent',
            remotePort: 'Remote Port',
            unknown_browser: 'Unknown',
            unknown_os: 'Unknown',
            unknown_device: 'Unknown',
            logSaveSize: 'Maximum Log Save Size',
            logSaveSizeHelper: 'This is the log save size for a single website',
            '360se': '360 Security Browser',
            websites: 'Website List',
            trend: 'Trend Statistics',
            reqCount: 'Request Count',
            uriHelper: 'You can use /test/* or /*/index.php to exclude Uri',
        },
        tamper: {
            tamper: 'Website Tamper Protection',
            tamperCreateHint:
                'The current directory may be affected by tamper protection or file attributes, causing creation to fail.',
            ignoreTemplate: 'Exclusion Template',
            protectTemplate: 'Protection Template',
            ignoreTemplateHelper:
                'Enter exclusion rules separated by Enter or spaces. (Specific directory ./log or directory name tmp. To exclude a file, enter the specific file path, such as ./data/test.html)',
            protectTemplateHelper:
                'Enter protection rules separated by Enter or spaces. (Specific file ./index.html, file extension .html, file type js. To protect a directory, enter the specific directory path, such as ./log)',
            templateContent: 'Template Content',
            template: 'Template',
            saveTemplate: 'Save as Template',
            tamperHelper1:
                'For one-click deployed websites, it is recommended to enable tamper protection for the application directory. If the website cannot be used normally or backup or restore fails, disable tamper protection first.',
            tamperHelper2:
                'This will restrict read, write, deletion, permission, and owner modification operations on protected files in non-excluded directories.',
            tamperPath: 'Protection Directory',
            tamperPathEdit: 'Modify Path',
            log: 'Interception Log',
            totalProtect: 'Total Protection',
            todayProtect: 'Today Protection',
            templateRule: 'Length must be 1-512, and the name cannot contain symbols such as {0}.',
            ignore: 'Exclude',
            ignoreHelper:
                'Select or enter exclusion rules separated by Enter or spaces. (Specific directory ./log or directory name tmp. To exclude a file, enter or select the specific file path, such as ./data/test.html)',
            protect: 'Protect',
            protectHelper:
                'Select or enter protection rules separated by Enter or spaces. (Specific file ./index.html, file extension .html, file type js. To protect a directory, enter or select the specific directory path, such as ./log)',
            tamperHelper00: 'Exclusion and protection only support relative paths.',
            tamperHelper01:
                'After tamper protection is enabled, the system will restrict creation, editing, and deletion operations on protected files in non-excluded directories.',
            tamperHelper02: 'Priority: Specific path protection > Specific path exclusion > Protection > Exclusion',
            tamperHelper03:
                'Monitoring operations only target non-excluded directories, monitoring the creation of non-protected files in these directories.',
            disableHelper: 'About to disable tamper protection for the following websites, continue?',
            appendOnly: 'Append Only',
            appendOnlyHelper:
                'Restrict deletion operations for files in this directory, only allowing addition of excluded directories or non-protected files',
            immutable: 'Immutable',
            immutableHelper: 'Restrict editing, deletion, permission, and owner modification operations for this file',
            onWatch: 'Watch',
            onWatchHelper:
                'Monitor and intercept creation of protected files or non-excluded directories in this directory',
            forceStop: 'Force Close',
            forceStopHelper: 'About to force disable the anti-tamper function for this website directory. Continue?',
        },
        setting: {
            setting: 'Panel Settings',
            title: 'Panel Description',
            titleHelper:
                'Will be displayed on the user login page (e.g. Linux server operation and maintenance management panel, recommended 8-15 characters)',
            logo: 'Logo (Without Text)',
            logoHelper:
                'Will be displayed in the upper left corner of the management page when the menu is collapsed (recommended image size: 82px*82px)',
            logoWithText: 'Logo (With Text)',
            logoWithTextHelper:
                'Will be displayed in the upper left corner of the management page when the menu is expanded (recommended image size: 185px*55px)',
            favicon: 'Website Icon',
            faviconHelper: 'Website icon (recommended image size: 16px*16px)',
            setDefault: 'Restore Default',
            setHelper: 'The current settings will be saved. Continue?',
            setDefaultHelper: 'All panel settings will be restored to default. Continue?',
            logoGroup: 'Logo',
            imageGroup: 'Image',
            loginImage: 'Image',
            loginImageHelper: 'Displayed on the login page (recommended image size: 500*416px)',
            loginBgType: 'Background Type',
            loginBgImage: 'Background Image',
            loginBgImageHelper: 'Displayed as background image on the login page (recommended image size: 1920*1080px)',
            loginBgColor: 'Background Color',
            loginBgColorHelper: 'Displayed as background color on the login page',
            image: 'Image',
            bgColor: 'Background Color',
            loginGroup: 'Login Page',
            loginBtnLinkColor: 'Button/Link Color',
            loginBtnLinkColorHelper: 'Will be displayed as the button/link color on the login page',
        },
        helper: {
            wafTitle1: 'Interception Map',
            wafContent1: 'Displays the geographical distribution of interceptions over the past 30 days',
            wafTitle2: 'Regional Access Restrictions',
            wafContent2: 'Restrict website access sources according to geographical locations',
            wafTitle3: 'Custom interception page',
            wafContent3: 'Create a custom page to display after a request is intercepted',
            wafTitle4: 'Custom Rules (ACL)',
            wafContent4: 'Intercept requests according to custom rules',
            tamperTitle1: 'File Integrity Monitoring',
            tamperContent1:
                'Monitor the integrity of website files, including core files, script files, and configuration files.',
            tamperTitle2: 'Real-time Scanning and Detection',
            tamperContent2: 'Detect abnormal or tampered files by real-time scanning the website file system.',
            tamperTitle3: 'Security Permission Settings',
            tamperContent3:
                'Restrict access to website files through proper permission settings and access control policies, reducing potential attack surface.',
            tamperTitle4: 'Logging and Analysis',
            tamperContent4:
                'Record file access and operation logs for subsequent auditing and analysis by administrators, as well as to identify potential security threats.',
            settingTitle1: 'Custom Welcome Message',
            settingContent1: 'Set a custom welcome message on the 1Panel login page.',
            settingTitle2: 'Custom Logo',
            settingContent2: 'Allow uploading logo images containing brand names or other text.',
            settingTitle3: 'Custom Website Icon',
            settingContent3:
                'Allow uploading custom icons to replace the default browser icon, improving user experience.',
            monitorTitle1: 'Visitor Trend',
            monitorContent1: 'Statistics and displays website visitor trends',
            monitorTitle2: 'Visitor Map',
            monitorContent2: 'Statistics and displays the geographical distribution of visitors to the website',
            monitorTitle3: 'Access Statistics',
            monitorContent3:
                'Statistics on website request information, including spiders, access devices, request status, etc.',
            monitorTitle4: 'Real-time monitoring',
            monitorContent4:
                'Real-time monitoring of website request information, including number of requests, traffic, etc.',
            alertTitle1: 'SMS Alerts',
            alertContent1:
                'When abnormal server resource usage, website and certificate expiration, new version update, password expiration, etc. occur, users will be notified via SMS alarm to ensure timely processing.',
            alertTitle2: 'Alert log',
            alertContent2:
                'Provide users with the function of viewing alarm logs to facilitate tracking and analysis of historical alarm events.',
            alertTitle3: 'Alert Settings',
            alertContent3:
                'Provide users with custom phone numbers, daily push frequency, and daily push time configurations, making it easier for users to set up more reasonable push alerts.',
            nodeDashTitle1: 'Application Management',
            nodeDashContent1:
                'Unified management of multi-node applications, supports status monitoring, quick start/stop, terminal connection, and backup',
            nodeDashTitle2: 'Website Management',
            nodeDashContent2:
                'Unified management of multi-node websites, real-time status monitoring, supports batch start/stop and quick backup',
            nodeDashTitle3: 'Database Management',
            nodeDashContent3:
                'Unified management of multi-node databases, key status at a glance, supports one-click backup',
            nodeDashTitle4: 'Scheduled Task Management',
            nodeDashContent4:
                'Unified management of multi-node scheduled tasks, supports status monitoring, quick start/stop, and manual trigger execution',
            nodeTitle1: 'One-Click Node Addition',
            nodeContent1: 'Quickly integrate multiple server nodes',
            nodeTitle2: 'Batch Upgrade',
            nodeContent2: 'Synchronize and upgrade all nodes with one operation',
            nodeTitle3: 'Node Status Monitoring',
            nodeContent3: "Real-time monitoring of each node's operational status",
            nodeTitle4: 'Quick Remote Connection',
            nodeContent4: 'One-click direct connection to node remote terminals',
            fileExchangeTitle1: 'Key Authentication Transmission',
            fileExchangeContent1: 'Authenticate via SSH keys to ensure transmission security.',
            fileExchangeTitle2: 'Efficient File Synchronization',
            fileExchangeContent2:
                'Only synchronize changed content to significantly improve transmission speed and stability.',
            fileExchangeTitle3: 'Support Multi-Node Intercommunication',
            fileExchangeContent3:
                'Easily transfer project files between different nodes, flexible management of multiple servers.',
            nodeAppTitle1: 'Application Upgrade Management',
            nodeAppContent1: 'Unified monitoring of multi-node application updates, supports one-click upgrade',
            appTitle1: 'Flexible Panel Management',
            appContent1: 'Easily manage your 1Panel server anytime, anywhere.',
            appTitle2: 'Comprehensive Service Information',
            appContent2:
                'Manage basic applications, websites, Docker, databases, etc., and quickly create applications and websites via the mobile app.',
            appTitle3: 'Real-Time Abnormal Monitoring',
            appContent3:
                'View real-time server status, WAF security monitoring, website traffic statistics, and process health status on the mobile app.',
            clusterTitle1: 'Master-Slave Deployment',
            clusterContent1:
                'Supports creating MySQL/Postgres/Redis master-slave instances on different nodes, automatically completing master-slave association and initialization',
            clusterTitle2: 'Master-Slave Management',
            clusterContent2:
                'Unified page to centrally manage multiple master-slave nodes, view their roles, running status, etc.',
            clusterTitle3: 'Replication Status',
            clusterContent3:
                'Displays master-slave replication status and delay information, assisting in troubleshooting synchronization issues',
            vllmTitle1: 'Centralized Management',
            vllmContent1:
                'Bring scattered vLLM services into 1Panel for unified visibility of instances, versions, status, and runtime paths.',
            vllmTitle2: 'Fast Deployment',
            vllmContent2:
                'Use a visual form to configure version selection, model mounts, and startup parameters with less manual orchestration.',
            vllmTitle3: 'Operational Efficiency',
            vllmContent3:
                'Handle create, edit, start, stop, restart, delete, and task tracking from one page to simplify local model operations.',
            vllmTitle4: 'Controlled Configuration',
            vllmContent4:
                'Standardize ports, containers, startup commands, and Compose settings through advanced options for easier delivery and later adjustments.',
            modelDownloaderTitle1: 'Model Discovery',
            modelDownloaderContent1:
                'Search HuggingFace model repositories directly and view downloads, likes, model details, and file lists.',
            modelDownloaderTitle2: 'Accelerated Downloads',
            modelDownloaderContent2:
                'Configure a HuggingFace acceleration endpoint and HF Token for the official site, mirrors, and private models.',
            modelDownloaderTitle3: 'Task Tracking',
            modelDownloaderContent3:
                'Review download queues, task status, progress, and errors, with support for canceling, retrying, and clearing records.',
            modelDownloaderTitle4: 'Local Management',
            modelDownloaderContent4:
                'Manage local model directories in one place, including paths, sizes, timestamps, and deleting unused model files.',
        },
        node: {
            master: 'Main Node',
            masterBackup: 'Master Node Backup',
            backupNode: 'Backup Node',
            backupFrequency: 'Backup Frequency (hours)',
            backupCopies: 'Backup Copies',
            noBackupNode: 'The backup node is currently empty. Select a backup node to save and try again!',
            masterBackupAlert:
                'Master node backup is not currently configured. To ensure data security, please set up a backup node as soon as possible to facilitate manual switching to a new master node in case of failure.',
            node: 'Node',
            addr: 'Address',
            nodeUpgrade: 'Update Settings',
            nodeUpgradeHelper:
                'Selected nodes will automatically start upgrading after the master node upgrade is completed, no manual operation required.',
            nodeUpgradePackageManage: 'Installation Package Management',
            nodeUpgradePackageClean: 'Clean',
            nodeUpgradePackageFormatHelper:
                'Only `1panel-agent_v*_*` or `1panel-v*-linux-*` installation packages are supported',
            nodeUpgradePackageHostConfirm: 'The server file {0} will be selected. Continue?',
            nodeUpgradePackageCleanHelper: 'All lower-version update packages will be cleaned. Continue?',
            nodeUpgradeOfflinePackageHelper:
                'In offline environments, nodes with different architectures must upload the matching update package before updating.',
            healthCheck: 'Health Check',
            healthCheckFrequency: 'Automatic Check Frequency',
            healthCheckFrequencyHelper:
                'Automatically checks node health at the configured frequency. Enter 0 to disable automatic checks.',
            healthCheckFrequencyLimit: 'The check frequency cannot exceed one day and must be a non-negative integer.',
            autoCheckFailedNodes: 'Automatically check failed nodes',
            autoCheckFailedNodesHelper:
                'During automatic checks, also check nodes with a failed or unhealthy status. This only applies when the check frequency is not 0.',
            loadFailedNodeResources: 'Refresh failed node resources',
            loadFailedNodeResourcesHelper:
                'When refreshing the node list, also query resource information for nodes with a failed or unhealthy status.',
            nodeUnhealthy: 'Node status abnormal',
            deletedNode: 'Deleted node {0} does not currently support upgrade operations!',
            nodeUnhealthyHelper: 'Abnormal node status detected. Please check in [Node Management] and try again!',
            nodeUnbind: 'Node not bound to license',
            nodeUnbindHelper:
                'Detected that this node is not bound to a license. Please bind it in [Panel Settings - License] menu and try again!',
            memTotal: 'Total Memory',
            nodeManagement: 'Multi-Machine Management',
            multiOverview: 'Multi-Machine',
            commonNodes: 'Frequently Used Nodes',
            searchNodePlaceholder: 'Search node name, group, or address',
            nodeItem: 'Node Management',
            panelItem: 'Panel Management',
            addPanel: 'Add Panel',
            addPanelHelper:
                'After successfully adding the panel, you can quickly access the target panel in [Overview - Panels].',
            panel: '1Panel Panel',
            others: 'Other Panels',
            addNode: 'Add Node',
            connInfo: 'Connection Information',
            nodeInfo: 'Node Information',
            withProxy: 'Enable Proxy Access',
            withoutProxy: 'Disable Proxy Access',
            withProxyHelper:
                'Will use the system proxy {0} maintained in panel settings to access child nodes. Continue?',
            withoutProxyHelper:
                'Will stop using the system proxy maintained in panel settings to access child nodes. Continue?',
            syncInfo: 'Sync',
            syncHelper: 'When master node data changes, it synchronizes to this child node in real-time',
            syncBackupAccount: 'Backup account settings',
            syncWithMaster:
                'After upgrading to Pro, all data will be synced by default. Sync policies can be manually adjusted in node management.',
            syncProxy: 'System proxy settings',
            syncProxyHelper: 'Syncing system proxy settings requires Docker restart',
            syncProxyHelper1: 'Restarting Docker may affect currently running container services.',
            syncProxyHelper2: 'You can manually restart in the Containers - Configuration page.',
            syncProxyHelper3:
                'Syncing system proxy settings requires Docker restart, which may affect currently running container services',
            syncProxyHelper4:
                'Syncing system proxy settings requires Docker restart. You can manually restart later in the Containers - Configuration page.',
            syncCustomApp: 'Sync Custom App Repository',
            syncAlertSetting: 'System alert settings',
            syncNodeInfo: 'Node basic data,',
            nodeSyncHelper: 'Node information synchronization will sync the following information:',
            nodeSyncHelper1: '1. Public backup account information',
            nodeSyncHelper2: '2. Connection information between the main node and sub-nodes',
            nodeCheck: 'Availability check',
            checkSSH: 'Check node SSH connection',
            checkUserPermission: 'Check node user permissions',
            isNotRoot: 'Detected that password-less sudo is not supported on this node and current user is non-root',
            checkLicense: 'Check node license status',
            checkService: 'Check existing service information on node',
            checkPort: 'Check node port reachability',
            panelExist:
                'Detected that this node is running 1Panel V1 service. Please upgrade to V2 using the migration script before adding.',
            coreExist:
                'The current node is already enabled as a master node and cannot be directly added as a slave node. Please downgrade it to a slave node first before adding, refer to the documentation for details.',
            agentExist:
                'Detected that 1panel-agent is already installed on this node. Continuing will retain existing data and only replace the 1panel-agent service.',
            agentNotExist:
                'It is detected that 1panel-agent is not installed on this node, so the node information cannot be edited directly. Please delete it and add it again.',
            oldDataExist:
                'Detected historical 1Panel V2 data on this node. The following information will be used to overwrite current settings:',
            errLicense: 'The license bound to this node is unavailable. Please check and try again!',
            errNodePort:
                'Node port [ {0} ] is detected as inaccessible. Please check if the firewall or security group has allowed this port.',
            reinstallHelper: 'Reinstall node {0}, continue?',
            unhealthyCheck: 'Abnormal Check',
            fixOperation: 'Fix Operation',
            checkName: 'Check Item',
            checkSSHConn: 'Check SSH Connection Availability',
            fixSSHConn: 'Manually edit the node to confirm connection information',
            checkConnInfo: 'Check Agent Connection Information',
            checkStatus: 'Check Node Service Availability',
            fixStatus: 'Run "systemctl status 1panel-agent.service" to check if the service is running.',
            checkAPI: 'Check Node API Availability',
            fixAPI: 'Check the node logs and verify if the firewall ports are properly opened.',
            forceDelete: 'Force Delete',
            operateHelper: 'The following nodes will undergo {0} operation, continue?',
            operatePanelHelper: 'The following panels will undergo {0} operation, continue?',
            forceDeleteHelper: 'Force delete will ignore node deletion errors and delete database metadata',
            uninstall: 'Delete node data',
            uninstallHelper: 'This will delete all 1Panel related data of the node. Proceed with caution!',
            baseDir: 'Installation Directory',
            baseDirHelper:
                'When the installation directory is empty, it will be installed in the /opt directory by default',
            nodePort: 'Node Port',
            offline: 'Offline mode',
            freeCount: 'Free quota [{0}]',
            offlineHelper: 'Used when the node is in an offline environment',
            appUpgrade: 'App Upgrade',
            appUpgradeHelper: 'There are {0} apps that need to be upgraded',
            dashboardSetting: 'Overview Settings',
            keepOneDashboardComponent: 'Keep at least one overview section',
        },
        customApp: {
            name: 'Custom App Repository',
            appStoreType: 'App Store Package Source',
            appStoreUrl: 'Repository URL',
            local: 'Local Path',
            remote: 'Remote Link',
            imagePrefix: 'Image Prefix',
            imagePrefixHelper:
                'Function: Customize the image prefix and modify the image field in the compose file. For example, when the image prefix is set to 1panel/custom, the image field for MaxKB will change to 1panel/custom/maxkb:v1.10.0',
            closeHelper: 'Cancel using custom app repository',
            appStoreUrlHelper: 'Only .tar.gz format is supported',
            postNode: 'Sync to sub-node',
            postNodeHelper:
                'Sync the custom store package to tmp/customApp/apps.tar.gz in the installation directory of the sub-node',
            nodes: 'Nodes',
            selectNode: 'Select Node',
            selectNodeError: 'Select a node',
            licenseHelper: 'The Pro version supports the custom application repository feature',
            databaseHelper: 'Application associated database, select target node database',
            nodeHelper: 'Cannot select current node',
            migrateHelper:
                'Currently only supports migrating monolithic applications and applications associated only with MySQL, MariaDB, PostgreSQL databases',
            opensslHelper:
                'If using encrypted backup, the OpenSSL versions between the two nodes must be consistent, otherwise migration may fail.',
            installApp: 'Batch install',
            installAppHelper: 'Batch install apps to selected nodes',
        },
        alert: {
            isAlert: 'Alert',
            alertCount: 'Alert Count',
            clamHelper: 'Trigger alert when scanning infected files',
            cronJobHelper: 'Trigger alert when task execution fails',
            licenseHelper: 'Commercial Edition supports additional alert channels',
            alertCountHelper: 'Maximum daily alarm frequency',
            alert: 'SMS Alert',
            logs: 'Alert Logs',
            list: 'Alert List',
            addTask: 'Create Alert',
            editTask: 'Edit Alert',
            alertMethod: 'Method',
            alertMsg: 'Alert Message',
            alertRule: 'Alert Rules',
            titleSearchHelper: 'Enter alert title for fuzzy search',
            taskType: 'Type',
            ssl: 'Certificate Expiry',
            siteEndTime: 'Website Expiry',
            panelPwdEndTime: 'Panel Password Expiry',
            panelUpdate: 'New Panel Version Available',
            cpu: 'Server CPU Alert',
            memory: 'Server Memory Alert',
            load: 'Server Load Alert',
            disk: 'Server Disk Alert',
            website: 'Website',
            certificate: 'SSL Certificate',
            remainingDays: 'Remaining Days',
            sendCount: 'Send Count',
            sms: 'SMS',
            wechat: 'WeChat',
            dingTalk: 'DingTalk',
            feiShu: 'FeiShu',
            mail: 'Email',
            email: 'Email',
            weCom: 'WeCom',
            bark: 'Bark',
            sendCountRulesHelper: 'Total alerts sent before expiry (once daily)',
            panelUpdateRulesHelper: 'Total alerts sent for new panel version (once daily)',
            oneDaySendCountRulesHelper: 'Maximum alerts sent per day',
            siteEndTimeRulesHelper: 'Websites that never expire will not trigger alerts',
            autoRenewRulesHelper:
                'Certificates with auto-renew enabled and remaining days less than 31 will not trigger alerts',
            panelPwdEndTimeRulesHelper: 'Panel password expiry alerts are unavailable if no expiration is set',
            sslRulesHelper: 'All SSL Certificates',
            diskInfo: 'Disk',
            monitoringType: 'Monitoring Type',
            autoRenew: 'Auto-Renew',
            useDisk: 'Disk Usage',
            usePercentage: 'Usage Percentage',
            changeStatus: 'Change Status',
            disableMsg: 'Stopping the alert task will prevent this task from sending alert messages. Continue?',
            enableMsg: 'Enabling the alert task will allow this task to send alert messages. Continue?',
            useExceed: 'Usage Exceeds',
            useExceedRulesHelper: 'Trigger alert when usage exceeds the set value',
            cpuUseExceedAvg: 'The average cpu usage exceeds the specified value',
            memoryUseExceedAvg: 'The average memory usage exceeds the specified value',
            loadUseExceedAvg: 'The average load usage exceeds the specified value',
            cpuUseExceedAvgHelper: 'The average cpu usage within the specified time exceeds the specified value',
            memoryUseExceedAvgHelper: 'The average memory usage within the specified time exceeds the specified value',
            loadUseExceedAvgHelper: 'The average load usage within the specified time exceeds the specified value',
            resourceAlertRulesHelper: 'Note: Continuous alerts within 30 minutes will send only one',
            specifiedTime: 'Specified Time',
            deleteTitle: 'Delete Alert',
            deleteMsg: 'Are you sure you want to delete the alert task?',
            allSslTitle: 'All Website SSL Certificate Expiry Alerts',
            sslTitle: 'SSL Certificate Expiry Alert for Website {0}',
            allSiteEndTimeTitle: 'All Website Expiry Alerts',
            siteEndTimeTitle: 'Website {0} Expiry Alert',
            panelPwdEndTimeTitle: 'Panel Password Expiry Alert',
            panelUpdateTitle: 'New Panel Version Notification',
            cpuTitle: 'High CPU Usage Alert',
            memoryTitle: 'High Memory Usage Alert',
            loadTitle: 'High Load Alert',
            diskTitle: 'High Disk Usage Alert for Mount Directory {0}',
            allDiskTitle: 'High Disk Usage Alert',
            timeRule: 'Remaining time less than {0} days (if not handled, will resend the next day)',
            panelUpdateRule:
                'Send an alert once when a new panel version is detected (if not handled, will resend the next day)',
            avgRule: 'Average {1} usage exceeds {2}% within {0} minutes, triggers alert, sends {3} times per day',
            diskRule: 'Disk usage for mount directory {0} exceeds {1}{2}, triggers alert, sends {3} times per day',
            allDiskRule: 'Disk usage exceeds {0}{1}, triggers alert, sends {2} times per day',
            cpuName: ' CPU ',
            memoryName: 'Memory',
            loadName: 'Load',
            diskName: 'Disk',
            syncAlertInfo: 'Manual Push',
            syncAlertInfoMsg: 'manually push the alert task?',
            pushError: 'Push Failed',
            pushSuccess: 'Push Successful',
            syncError: 'Sync Failed',
            success: 'Alert Successful',
            pushing: 'Pushing...',
            error: 'Alert Failed',
            cleanLog: 'Clean Logs',
            cleanAlertLogs: 'Clean Alert Logs',
            daily: 'Daily Alert Count: {0}',
            cumulative: 'Cumulative Alert Count: {0}',
            clams: 'Virus scan alert',
            taskName: 'Task Name',
            cronJobType: 'Task Type',
            clamPath: 'Scan Directory',
            cronjob: 'Cronjob execution {0} failed',
            app: 'Backup App',
            web: 'Backup Website',
            database: 'Backup Database',
            directory: 'Backup Directory',
            log: 'Backup Logs',
            snapshot: 'System Snapshot',
            clamsRulesHelper: 'Virus scanning tasks that require alerts',
            cronJobRulesHelper: 'This type of scheduled task needs to be configured',
            clamsTitle: 'Virus scan task 「 {0} 」 detected infected file alert',
            cronJobAppTitle: 'Cronjob - Backup App 「 {0} 」 Task Failure Alert',
            cronJobWebsiteTitle: 'Cronjob - Backup Website「 {0} 」Task Failure Alert',
            cronJobDatabaseTitle: 'Cronjob - Backup Database「 {0} 」Task Failure Alert',
            cronJobDirectoryTitle: 'Cronjob - Backup Directory「 {0} 」Task Failure Alert',
            cronJobLogTitle: 'Cronjob - Backup Logs「 {0} 」Task Failure Alert',
            cronJobSnapshotTitle: 'Cronjob - Backup Snapshot「 {0} 」Task Failure Alert',
            cronJobShellTitle: 'Cronjob - Shell script 「 {0} 」Task Failure Alert',
            cronJobCurlTitle: 'Cronjob - URL access「 {0} 」Task Failure Alert',
            cronJobCutWebsiteLogTitle: 'Cronjob - Cut website log「 {0} 」Task Failure Alert',
            cronJobCleanTitle: 'Cronjob - Cache cleaning「 {0} 」Task Failure Alert',
            cronJobNtpTitle: 'Cronjob - Synchronization server time「 {0} 」Task Failure Alert',
            clamsRule: 'Virus scan detected infected file alert，sent {0} times per day',
            cronJobAppRule: 'Backup app task failed alert，sent {0} times per day',
            cronJobWebsiteRule: 'Backup website task failed alert，sent {0} times per day',
            cronJobDatabaseRule: 'Backup database task failed alert，sent {0} times per day',
            cronJobDirectoryRule: 'Backup directory task failed alert，sent {0} times per day',
            cronJobLogRule: 'Backup logs task failed alert，sent {0} times per day',
            cronJobSnapshotRule: 'Backup snapshot task failed alert，sent {0} times per day',
            cronJobShellRule: 'Shell script task failed alert，sent {0} times per day',
            cronJobCurlRule: 'URL access task failed alert，sent {0} times per day',
            cronJobCutWebsiteLogRule: 'Cut website log task failed alert，sent {0} times per day',
            cronJobCleanRule: 'Cache cleaning task failed alert，sent {0} times per day',
            cronJobNtpRule: 'Synchronization server time task failed alert，sent {0} times per day',
            alertSmsHelper: 'SMS limit: total of {0} messages, {1} already used',
            goBuy: 'Purchase More',
            phone: 'Phone',
            phoneHelper: 'Provide real phone number for alert messages',
            dailyAlertNum: 'Daily Alert Limit',
            dailyAlertNumHelper: 'Maximum number of alerts per day (up to 100)',
            timeRange: 'Time Range',
            sendTimeRange: 'Send time range',
            sendTimeRangeHelper: 'Can push {0} time range',
            to: 'to',
            startTime: 'Start Time',
            endTime: 'End Time',
            defaultPhone: 'Default to license-bound account phone number',
            noticeAlert: 'Notice Alert',
            resourceAlert: 'Resource Alert',
            agentOfflineAlertHelper:
                'When offline alert is enabled for the node, the main node will scan every 30 minutes to execute alert tasks.',
            offline: 'Offline Alert',
            offlineHelper:
                'When set to offline alert, the main node will scan every 30 minutes to execute alert tasks.',
            offlineOff: 'Enable Offline Alert',
            offlineOffHelper:
                'Enabling offline alert will make the main node scan every 30 minutes to execute alert tasks.',
            offlineClose: 'Disable Offline Alert',
            offlineCloseHelper:
                'Disabling offline alert requires sub-nodes to handle alerts independently. Please ensure network connectivity to avoid alert failure.',
            alertNotice: 'Alert Notification',
            methodConfig: 'Notification Method Configuration',
            createMethod: 'Create Notification Method',
            methodInvalid: 'Invalid configuration {0}',
            commonConfig: 'Global Configuration',
            smsConfig: 'SMS',
            smsConfigHelper: 'Configure phone numbers for SMS notifications',
            emailConfig: 'Email',
            emailConfigHelper: 'Configure SMTP email sending service',
            deleteConfigTitle: 'Delete Alert Configuration',
            deleteConfigMsg: 'Are you sure you want to delete the alert configuration?',
            test: 'Test',
            alertTestOk: 'Test notification succeeded',
            alertTestFailed: 'Test notification failed',
            displayName: 'Display Name',
            sender: 'Sender',
            password: 'Password',
            host: 'SMTP Server',
            port: 'Port',
            encryption: 'Encryption',
            recipient: 'Recipient',
            licenseTime: 'License Expiration Reminder',
            licenseTimeTitle: 'License Expiration Reminder',
            displayNameHelper: 'Sender display name for emails',
            senderHelper: 'Email address used to send messages',
            passwordHelper: 'Authorization code for the email service',
            hostHelper: 'SMTP server address, e.g., smtp.qq.com',
            portHelper: 'SSL usually uses 465, TLS usually uses 587',
            sslHelper: 'If the SMTP port is 465, SSL is usually required',
            tlsHelper: 'If the SMTP port is 587, TLS is usually required',
            triggerCondition: 'Trigger Condition',
            loginFail: ' login failures within',
            nodeException: 'Node Exception Alert',
            licenseException: 'License Exception Alert',
            panelLogin: 'Panel Login Exception Alert',
            sshLogin: 'SSH Login Exception Alert',
            panelIpLogin: 'Panel Login IP Exception Alert',
            sshIpLogin: 'SSH Login IP Exception Alert',
            ipWhiteListHelper:
                'IPs in the whitelist are not restricted by rules, and there will be no alert upon successful login',
            nodeExceptionRule: 'Node exception alert, sent {0} times per day',
            licenseExceptionRule: 'License exception alert, sent {0} times per day',
            panelLoginRule: 'Panel login alert, sent {0} times per day',
            sshLoginRule: 'SSH login alert, sent {0} times per day',
            userNameHelper: 'Username is empty, the sender address will be used by default',
            alertConfigHelper: 'Configure alert notification channels to receive panel message push',
            weComConfigHelper: 'WeCom alert notification configuration',
            barkConfigHelper: 'Bark alert notification configuration',
            wechatConfigHelper: 'WeChat Official Account alert notification configuration',
            dingTalkConfigHelper: 'DingTalk alert notification configuration',
            feiShuConfigHelper: 'Feishu alert notification configuration',
            webhookName: 'Bot name',
            webhookUrl: 'Webhook URL',
            alertConfigProHelper: 'Commercial Edition also supports WeCom, DingTalk, Feishu, and SMS alerts.',
            recipientPlaceholder: 'Please enter recipient email address',
            addRecipient: 'Add Recipient',
            webhookItem: 'Webhook',
            addWebhook: 'Add Webhook',
            selectAlertType: 'Select Alert Type',
            configDetail: 'Config Details',
            webhookCount: ' Webhook(s)',
        },
        theme: {
            lingXiaGold: 'LXware Gold',
            classicBlue: 'Classic Blue',
            freshGreen: 'Fresh Green',
            customColor: 'Custom Color',
            setDefault: 'Default',
            setDefaultHelper: 'The theme color scheme is about to be restored to its initial state. Continue?',
            setHelper: 'The currently selected theme color scheme is about to be saved. Continue?',
        },
        sync: {
            menu: 'Resource Sync',
            file: 'File Exchange',
            fileSyncConfirm: 'Do you want to transfer file/folder {1} from node {0} to directory {3} on node {2}?',
            image: 'Image Exchange',
            imageBatchDesc: 'Select a source node and image first, then batch-transfer to multiple target nodes.',
            imageBatchConfirmPrefix: 'About to transfer {0} images to {1} nodes, for a total of {2} tasks.',

            ssl: 'Certificate Sync',
            sslBatchDesc:
                'After selecting a source node, sync the specified certificate into the current panel environment.',
            sslBatchConfirmPrefix: 'About to sync {0} certificates to {1} nodes, for a total of {2} tasks.',

            app: 'Application Transfer',
            appBatchDesc:
                'Select the source node, application, and target nodes, then confirm resource dependencies and start the application transfer task.',
            appSelectedApp: 'Selected Application:',
            appPreviewTitle: 'Transfer Preview',
            appPreviewDesc: 'Confirm target nodes and dependent resources before starting the application transfer.',
            appDatabaseDependency: 'Database dependency',
            appResourceRequired: 'Select all required linked resources first.',
            appUnsupportedMultipleResources: 'Only apps with at most one linked resource can be migrated.',
            appUnsupportedResourceType:
                'Only apps with no resource dependency or a single MySQL, MariaDB, or PostgreSQL dependency can be migrated.',

            targetTitle: 'Target nodes',
            targetDesc: 'The source node is excluded automatically. Choose one or more target nodes.',
            targetSearchPlaceholder: 'Search node name or address',
            noTargetNodes: 'No target nodes available',
            noSourceNode: 'Please select a source node first',
            reviewTargets: 'Target nodes',
            reviewEmpty: 'Please select resources and target nodes first',
            selectSourceFirst: 'Please select a source node first.',
            selectResourceFirst: 'Please select resources to sync first.',
            selectTargetFirst: 'Please select at least one target node.',
            submitSuccess: 'Sync task submitted.',
        },
        vm: {
            vm: 'VM',
            title: 'Virtual Machines',
            healthCheck: 'Health Check',
            healthCheckResult: {
                pass: 'Pass',
                info: 'Info',
                warn: 'Warning',
                fail: 'Fail',
                normal: 'Normal',
                fixCommand: 'Fix command',
                technicalDetail: 'Technical details',
                check: {
                    vmName: 'VM name',
                    libvirtConnection: 'Libvirt connection',
                    vmDefinition: 'VM definition',
                    domainXML: 'VM XML',
                    architecture: 'Architecture',
                    virtualizationType: 'Virtualization type',
                    machineType: 'Machine type',
                    efiCapability: 'EFI capability',
                    qemuEmulator: 'QEMU emulator',
                    bootOrder: 'Boot order',
                    arm64Firmware: 'ARM64 firmware',
                    arm64Features: 'ARM64 features',
                    arm64Video: 'ARM64 display',
                    arm64FirmwareFile: 'ARM64 firmware file',
                    arm64CDROM: 'ARM64 CD-ROM',
                    blockDevice: 'Block device',
                    isoArchitecture: 'ISO architecture',
                    network: 'Network',
                    qemuLog: 'QEMU log',
                    arm64RuntimeFirmware: 'ARM64 runtime firmware',
                },
                reason: {
                    invalidName: 'The VM name is invalid.',
                    connectionFailed: 'Unable to connect to {uri}.',
                    vmNotFound: 'VM {name} was not found.',
                    xmlReadFailed: 'Failed to read the VM XML.',
                    liveXMLFallback: 'The persistent configuration could not be read; the live configuration is used.',
                    xmlParseFailed: 'Failed to parse the VM XML.',
                    stateReadFailed: 'The VM state could not be determined. The runtime firmware check was skipped.',
                    guestArchMissing: 'The guest architecture is missing from the XML.',
                    archMismatch:
                        'The host architecture is {hostArch}, while the guest architecture is {guestArch}. Cross-architecture execution is unsupported.',
                    nonKVMType: 'The virtualization type is {type}, not the default KVM type.',
                    archOrMachineMissing: 'The architecture or machine type is missing from the XML.',
                    machineUnsupported: 'The host does not support {arch}/{machine}.',
                    emulatorNotSpecified: 'No emulator is specified in the XML; Libvirt will select one.',
                    fileNotFound: 'File not found: {path}',
                    fileNotExecutable: 'File is not executable: {path}',
                    bootDeviceMissing: 'No boot device is defined in the XML.',
                    diskNotFirst: 'The disk is not the first boot device. Current order: {order}',
                    cdromNotInBootOrder: 'A CD-ROM is attached but is not included in the boot order.',
                    firmwareNotConfigured:
                        'EFI or a loader is not configured, so the guest may fail to display or boot.',
                    acpiCustom: 'ACPI is configured. Confirm that the guest explicitly requires this customization.',
                    acpiRequiresUEFI: 'ACPI is configured without UEFI, which causes “ACPI requires UEFI”.',
                    apicUnsupported: 'x86 APIC is configured, but it is not valid for ARM64.',
                    gicNotDeclared: 'GIC is absent from the persistent XML; Libvirt may add it at runtime.',
                    videoNotConfigured: 'No display device is configured in the XML.',
                    videoNotVirtio: 'The display device type is {type}; Virtio is recommended.',
                    firmwareFileMissing: 'The firmware file does not exist or is not a regular file: {path}',
                    firmwareNotAvailable: 'Libvirt reports no EFI capability, and no ARM64 UEFI firmware was found.',
                    cdromBusNotSCSI: 'The CD-ROM uses the {bus} bus; ARM64 requires SCSI.',
                    cdromNotOnVirtioSCSI: 'The CD-ROM is not attached to a Virtio SCSI controller.',
                    diskSourceMissing: 'No source file is configured for {device} {target}.',
                    sourceNotFound: 'The source file for {device} {target} does not exist: {path}',
                    sourceIsDirectory: 'The source path for {device} {target} is a directory: {path}',
                    systemDiskNotFound: 'No system disk was detected.',
                    isoArchMismatch:
                        'The {guestArch} guest has an image that appears to be for {imageArch} attached: {path}',
                    networkReadFailed: 'Unable to read network {name}.',
                    networkStateReadFailed: 'Unable to read the state of network {name}.',
                    networkInactive: 'Network {name} exists but is inactive.',
                    logUnavailable: 'No startup log is available for analysis.',
                    logErrorsFound: 'Common errors were found in the latest startup record.',
                    vmNotRunning: 'The VM is not running, so the QEMU runtime argument check was skipped.',
                    runtimeFirmwareMissing: 'No pflash, AAVMF, or QEMU_EFI entry was found in the QEMU log.',
                },
            },
            overview: 'Overview',
            dependencies: 'Dependencies',
            dependencyPurpose: 'Purpose',
            dependencyPurposeMap: {
                libvirt: 'Provides VM management services for lifecycle control and resource scheduling.',
                storage: 'Provides the default storage directory or pool for VM disk files.',
            },
            dependencyNotReady: 'VM dependency checks failed. Fix the dependencies before using virtual machines.',
            helperUnavailable:
                'VM capability initialization failed. Check core logs or upgrade again before using VMs.',
            kvmUnavailable: 'No available KVM hardware virtualization capability was detected.',
            kvmCheckCpu: 'Confirm that the host CPU supports Intel VT-x or AMD-V virtualization.',
            kvmCheckBios: 'Enable virtualization options in BIOS/UEFI.',
            kvmCheckModule: 'Confirm that the kvm, kvm_intel, or kvm_amd kernel module is loaded correctly.',
            kvmCheckDevice:
                'Confirm that /dev/kvm exists and the current environment is not a container or cloud host without KVM support.',
            cpu: 'CPU',
            memory: 'Memory',
            disk: 'Disk',
            abnormal: 'Abnormal',
            resourceOverview: 'Resource Overview',
            cpuAllocated: 'CPU Allocated',
            memoryAllocated: 'Memory Allocated',
            storageUsed: 'Storage Used',
            riskReminder: 'Risk Reminders',
            noRisk: 'No risks',
            runtimeHealth: 'Runtime Health',
            runtimeAbnormal: 'VM runtime is abnormal',
            noDependency: 'No dependency check data',
            storageOverview: 'Storage Overview',
            totalAllocated: 'Calculated by total VM configuration',
            runningAllocated: 'Running allocation: {0}',
            storageAvailable: 'Available: {0}',
            inProgress: 'In progress',
            needAttention: 'Needs attention',
            normal: 'Normal',
            environmentRisk: 'The VM runtime is not ready. Fix dependencies or virtualization services.',
            storageRisk: 'Storage pool {0} usage has reached {1}%.',
            abnormalRisk: '{0} VMs are in an abnormal state.',
            pausedRisk: '{0} VMs are paused.',
            memoryRisk: 'VM memory allocation has reached {0}%.',
            cpuLimitHelper: 'Currently available CPU: {0} cores',
            cpuLimitExceeded: 'CPU exceeds the limit. Current maximum available: {0} cores.',
            memoryLimitHelper: 'Currently allocatable memory: {0} (the host must reserve {1} memory)',
            memoryLimitExceeded: 'Memory exceeds the limit. Current maximum allocatable: {0}.',
            storageLimitHelper: 'Current free space in the target storage pool: {0}',
            storageLimitExceeded: 'Disk capacity exceeds the limit. Current maximum available: {0}.',
            iso: 'ISO',
            createFromTemplate: 'Create from template',
            template: 'Template',
            templateName: 'Template Name',
            convertToTemplate: 'Convert to Template',
            sourceVM: 'Source VM',
            templateSize: 'Template Size',
            deleteTemplateConfirm: 'Delete template {0}. This operation cannot be rolled back. Continue?',
            orphanClean: 'Orphaned Data Cleanup',
            orphanScan: 'Rescan',
            orphanCleanHelper:
                'Only candidate files not referenced by virtual machines, snapshots, or registered templates are shown. Confirm that a file is no longer in use before cleaning; cleanup cannot be undone.',
            orphanSelected: '{0} files selected, {1} in total',
            orphanSize: 'Size',
            orphanCleanConfirm: 'Clean the selected {0} files ({1})? This operation cannot be undone.',
            orphanCleanSuccess: 'Cleaned {0} files and released {1}.',
            orphanType: {
                orphan_domain_disk: 'Orphaned Disk',
                orphan_snapshot: 'Orphaned Snapshot',
                partial_file: 'Incomplete File',
            },
            diskSize: 'Disk Size',
            diskPath: 'Disk Path',
            isoPath: 'ISO Path',
            storagePool: 'Storage Pool',
            network: 'Network',
            bridgeName: 'Bridge Name',
            natNetworkHelper:
                'VMs can access the network through the host, but external devices usually cannot access them directly.',
            bridgeNetworkHelper:
                'Connect VMs to an existing host bridge (such as br0). If the host has an unused additional NIC, create a bridge for it and use it.',
            bridgeNameHelper:
                'Select an existing Linux bridge on the host, such as br0. Physical NICs are not bridges, and docker/libvirt managed bridges cannot be selected here.',
            natCIDRHelper: 'CIDR, gateway, and DHCP range are used by the new NAT virtual network.',
            networkCIDR: 'Network CIDR',
            gateway: 'Gateway',
            dhcpStart: 'DHCP Start',
            dhcpEnd: 'DHCP End',
            bootOrder: 'Boot Order',
            bootDiskFirst: 'Disk first (HD → CD-ROM)',
            bootIsoFirst: 'ISO first (CD-ROM → HD)',
            bootOrderConfirm:
                'Change the boot order to {0}? The VM will try currently mounted, bootable devices in this order the next time it starts.',
            startAfterCreate: 'Start after creation',
            autoStart: 'Autostart',
            resourceAutoStart: 'Autostart',
            capacity: 'Capacity',
            available: 'Available',
            vmCount: 'Linked VMs',
            usedIPs: 'Used IPs',
            monitor: 'Monitor',
            monitorNotReady: 'The virtual machine is not running. Monitoring data is unavailable.',
            monitorLoadFailed: 'Failed to get VM monitoring data.',
            monitorLoadFailedWithReason: 'Failed to get VM monitoring data: {0}',
            rename: 'Rename',
            newName: 'New name',
            renameHelper: 'Enter a new VM name. The VM must be shut down before renaming.',
            renameConfirm: 'Rename virtual machine [{0}] to [{1}]?',
            renameRunningHelper: 'Shut down the virtual machine before renaming it.',
            cpuUsage: 'CPU Usage',
            memoryUsage: 'Memory Usage',
            diskIO: 'Disk IO',
            networkIO: 'Network IO',
            diskReadWrite: 'Disk Read / Write',
            networkRxTx: 'Network RX / TX',
            rx: 'RX',
            tx: 'TX',
            console: 'Console',
            consoleNotReady: 'The VNC console is unavailable. Start the VM and check its VNC graphics configuration.',
            consoleDisconnected: 'The VNC console has been disconnected.',
            consoleConnectFailed: 'Failed to connect to the VNC console. Check the console proxy service.',
            consoleCredentialsRequired: 'The VNC console requires credentials. Check the backend proxy configuration.',
            snapshot: 'Snapshot',
            createSnapshot: 'Create Snapshot',
            recoverSnapshot: 'Recover Snapshot',
            snapshotSize: 'Usage',
            currentSnapshot: 'Current',
            snapshotEmpty: 'No snapshots',
            snapshotHelper:
                'A snapshot saves the current VM state as a restore point. Subsequent data changes are recorded in a delta file without changing the original disk. Restoring a snapshot returns the VM to that point in time.',
            snapshotOperationHelper:
                'The current snapshot cannot be deleted. Snapshots can be recovered only when the virtual machine is shut off.',
            snapshotRecoverConfirm:
                'Recover virtual machine [{1}] to snapshot [{0}]? The VM disk will be restored to the snapshot state.',
            interface: 'Network Interface',
            device: 'Device',
            path: 'Path',
            start: 'Start',
            shutdown: 'Shutdown',
            reboot: 'Reboot',
            destroy: 'Force Stop',
            suspend: 'Suspend',
            resume: 'Resume',
            operateConfirm: 'Confirm {0} virtual machine [{1}]?',
            forceDelete: 'Force delete',
            forceDeleteHelper:
                'Force delete will ignore VM deletion errors, delete panel metadata, and release resource usage.',
            deleteNameHelper: '" to delete this virtual machine',
            isoSource: 'ISO Source',
            downloadFromServer: 'Remote Download',
            isoTargetDir: 'ISO Target Path',
            isoTargetDirHelper: 'ISO files uploaded locally or downloaded from the server are saved to this directory.',
            addingIsoRecord: 'Adding ISO record',
            transferInProgress: 'The ISO transfer is in progress. Do not close this drawer or page.',
            isoSize: 'ISO Size',
            deleteIsoConfirm: 'This delete operation cannot be rolled back. Continue?',
            deleteSourceFile: 'Delete source file',
            deleteSourceFileHelper:
                'When checked, the source file referenced by this ISO record will also be deleted and cannot be recovered.',
            dir: 'Local Directory',
        },
        cluster: {
            cluster: 'Application High Availability',
            name: 'Cluster Name',
            addCluster: 'Add Cluster',
            installNode: 'Install Node',
            master: 'Master Node',
            slave: 'Slave Node',
            replicaStatus: 'Master-Slave Status',
            unhealthyDeleteError: 'The installation node status is abnormal, please check the node list and try again!',
            replicaStatusError: 'Status acquisition is abnormal, please check the master node.',
            masterHostError: 'The master node IP cannot be 127.0.0.1',
        },
    },
    template: {
        create: 'Create Template',
        edit: 'Edit Template',
        name: 'Template Name',
        type: 'Template Type',
        single: 'Single File',
        multi: 'Multi File (zip)',
        content: 'Template Content',
        variables: 'Variables',
        remark: 'Remark',
        filePath: 'File Path',
        upload: 'Upload Zip',
        preview: 'Preview',
        previewEmpty: 'Select a template to preview in real time',
        generate: 'Generate Output',
        outputName: 'Output Name',
        outputList: 'Output List',
        outputCreate: 'Generate Output',
        confirmDelete: 'Are you sure you want to delete this template? Associated outputs will also be deleted.',
        confirmDeleteOutput: 'Are you sure you want to delete this output?',
        variableKey: 'Variable Key',
        variableLabel: 'Label',
        variableType: 'Type',
        variableDefault: 'Default',
        variableOptions: 'Options (comma separated)',
        variableRequired: 'Required',
        varTypeText: 'Text',
        varTypeTextHelper: 'Single-line text input',
        varTypeTextarea: 'Textarea',
        varTypeTextareaHelper: 'For paragraphs and long text',
        varTypeNumber: 'Number',
        varTypeNumberHelper: 'Numeric input only',
        varTypeSelect: 'Select',
        varTypeSelectHelper: 'Choose from preset options, options required',
        varTypeColor: 'Color',
        varTypeColorHelper: 'Color picker',
        autoDetectHelper: 'Variables wrapped in double curly braces are auto-detected and added to the table',
        selectTemplate: 'Select Template',
        fillVariables: 'Fill Variables',
        noVariables: 'No variables defined in this template',
        outputSuccess: 'Output generated successfully',
        importButton: 'Import from Template',
    },
};

export default {
    ...getFuLocaleMessage('en'),
    ...message,
};
