export default {
    // Common
    common: {
        confirm: 'Confirm',
        cancel: 'Cancel',
        save: 'Save',
        saving: 'Saving...',
        send: 'Send',
        sending: 'Sending...',
        syncing: 'Syncing...',
        processing: 'Processing...',
        submitting: 'Submitting...',
        delete: 'Delete',
        noIncudalHint: 'Please do not use in names or descriptions',
        edit: 'Edit',
        create: 'Create',
        creating: 'Creating...',
        deleting: 'Deleting...',
        deleteSuccess: 'Deleted successfully',
        search: 'Search',
        loading: 'Loading...',
        noData: 'No data',
        noSearchResults: 'No results found',
        success: 'Success',
        error: 'Error',
        warning: 'Warning',
        info: 'Info',
        yes: 'Yes',
        no: 'No',
        back: 'Back',
        next: 'Next',
        previous: 'Previous',
        close: 'Close',
        reset: 'Reset',
        refresh: 'Refresh',
        copy: 'Copy',
        copied: 'Copied',
        copyFailed: 'Copy failed',
        show: 'Show',
        hide: 'Hide',
        done: 'Done',
        actions: 'Actions',
        details: 'Details',
        status: 'Status',
        name: 'Name',
        description: 'Description',
        createdAt: 'Created At',
        updatedAt: 'Updated At',
        none: 'None',
        notSet: 'Not Set',
        turnstileFailed: 'Verification failed, please try again',
        filter: 'Filter',
        total: 'Total',
        items: 'items',
        searchPlaceholder: 'Search...',
        developing: 'In Development',
        developingHint: 'This feature is under development, stay tuned...',
        gotIt: 'Got it',
        expand: 'Expand',
        collapse: 'Collapse',
        page: 'page',
        pageInfo: 'Page {current}/{total}, {count} total',
        prevPage: 'Previous',
        nextPage: 'Next',
        loadFailed: 'Failed to load',
        all: 'All',
        perPage: 'Per page',
        totalCount: 'Total {count}',
        day: 'Day',
        days: 'days',
        seconds: 'seconds',
        month: 'Month',
        totalRecords: '{count} records in total',
        deleted: 'Deleted',
        // Country names
        countries: {
            // Asia
            cn: 'China',
            hk: 'Hong Kong',
            mo: 'Macau',
            tw: 'Taiwan',
            jp: 'Japan',
            kr: 'South Korea',
            sg: 'Singapore',
            my: 'Malaysia',
            th: 'Thailand',
            vn: 'Vietnam',
            ph: 'Philippines',
            id: 'Indonesia',
            in: 'India',
            pk: 'Pakistan',
            bd: 'Bangladesh',
            kz: 'Kazakhstan',
            uz: 'Uzbekistan',
            ae: 'UAE',
            sa: 'Saudi Arabia',
            il: 'Israel',
            tr: 'Turkey',
            // Europe
            gb: 'United Kingdom',
            de: 'Germany',
            fr: 'France',
            nl: 'Netherlands',
            be: 'Belgium',
            lu: 'Luxembourg',
            ch: 'Switzerland',
            at: 'Austria',
            it: 'Italy',
            es: 'Spain',
            pt: 'Portugal',
            ie: 'Ireland',
            se: 'Sweden',
            no: 'Norway',
            dk: 'Denmark',
            fi: 'Finland',
            pl: 'Poland',
            cz: 'Czech Republic',
            hu: 'Hungary',
            ro: 'Romania',
            bg: 'Bulgaria',
            gr: 'Greece',
            ua: 'Ukraine',
            ru: 'Russia',
            // North America
            us: 'United States',
            ca: 'Canada',
            mx: 'Mexico',
            // South America
            br: 'Brazil',
            ar: 'Argentina',
            cl: 'Chile',
            co: 'Colombia',
            pe: 'Peru',
            // Oceania
            au: 'Australia',
            nz: 'New Zealand',
            // Africa
            za: 'South Africa',
            eg: 'Egypt',
            ng: 'Nigeria',
            ke: 'Kenya',
        },
        // Network modes (unified definition)
        networkMode: {
            nat: 'IPv4 NAT',
            nat_ipv6: 'IPv4 NAT & IPv6',
            nat_ipv6_nat: 'IPv4 NAT & IPv6 NAT',
            ipv6_only: 'IPv6 Only',
            ipv6_nat: 'IPv6 NAT',
        },
        // Instance types
        instanceType: {
            container: 'LXC',
            vm: 'KVM',
        },
        // Enabled/Disabled states
        enabled: 'Enabled',
        disabled: 'Disabled',
        active: 'Active',
        inactive: 'Inactive',
        unlimited: 'Unlimited',
    },

    validation: {
        fields: {
            name: 'Name',
            identifier: 'Identifier',
            content: 'Content',
            serverAddress: 'Server address',
            ipAddress: 'IP address',
            ipOrDomain: 'IP address or domain',
        },
        required: '{field} cannot be empty',
        minLength: '{field} must be at least {min} characters',
        maxLength: '{field} cannot exceed {max} characters',
        illegalChars: '{field} contains invalid characters',
        safeNameChars: '{field} may only contain Chinese characters, letters, numbers, hyphens, underscores, spaces, commas, and parentheses',
        identifierChars: '{field} may only contain letters, numbers, hyphens, and underscores, and must start with a letter',
        invalidFormat: '{field} format is invalid',
        urlProtocol: '{field} must start with http:// or https://',
        hostAddressInvalid: '{field} format is invalid. Enter a valid IPv4 address, IPv6 address, or domain name',
        ipAddressInvalid: '{field} format is invalid. Enter a valid IPv4 or IPv6 address',
        ipv4Invalid: '{field} format is invalid. Enter a valid IPv4 address',
    },

    // Navigation
    nav: {
        main: 'Main',
        dashboard: 'Dashboard',
        instances: 'Instances',
        transfers: 'Transfers',
        friends: 'Friends',
        tickets: 'Tickets',
        resources: 'Resources',
        myHosts: 'My Hosts',
        myPackages: 'My Packages',
        myImages: 'My Images',
        logs: 'Logs',
        inbox: 'Notifications',
        settings: 'Settings',
        wallet: 'Wallet',
        invites: 'Invites',
        help: 'Help',
        admin: 'Admin',
        expand: 'Expand',
        system: 'System',
        users: 'Users',
        statistics: 'Statistics',
        hosts: 'Hosts',
        images: 'Images',
        packages: 'Packages',
        helpManage: 'Help',
        oauth: 'OAuth',
        broadcast: 'Broadcast',
        paymentProviders: 'Payment Providers',
        billing: 'Billing',
        withdrawals: 'Withdrawals',
        aff: 'Referral',
        openMenu: 'Open menu',
        collapseSidebar: 'Collapse sidebar',
        toggleTheme: 'Toggle theme',
        toggleLanguage: 'Toggle language',
        terminal: 'Terminal',
        extensions: 'Extensions',
        scripts: 'Scripts',
        operations: 'Operations',
        createInstance: 'Create Instance',
        create: 'Create',
        entertainment: 'Benefits',
        hosting: 'Hosting',
        hostingWallet: 'Hosting Wallet',
        earnings: 'Earnings',
        mail: 'Mail',
        instanceDetail: 'Instance Details',
        mailDomain: 'Mail Domain',
        myHostCreate: 'Create Host',
        myHostDetail: 'Host Details',
        myPackageCreate: 'Create Package',
        myPackageEdit: 'Edit Package',
        telegramSettings: 'Telegram Settings',
        adminCreateInstance: 'Admin Create Instance',
    },

    // Theme
    theme: {
        dark: 'Dark Mode',
        light: 'Light Mode',
        system: 'System',
    },

    freeSite: {
        billingCycleLabel: {
            monthly: 'Monthly? The moon paid it',
            quarterly: 'Quarterly? All seasons comped',
            semiAnnual: 'Half-year joy pass',
            annual: 'Yearly? Wallet is asleep',
            custom: '{months} months, paid in air',
            free: 'Free-roam permit',
        },
        billingCycleShort: {
            monthly: '/mo, no panic',
            quarterly: '/quarter, comped',
            semiAnnual: '/half-year joy',
            annual: '/year, gifted',
            custom: '/{months} months joy',
        },
        copy: {
            finalPrice: 'Ceremonial total',
            renewPrice: 'Renewal? Stamp the tiny form',
            billingCycle: 'Joy tier',
            needPay: 'Symbolic due',
            originalPrice: 'Museum price tag',
            oldDailyPrice: 'Old daily price, for archaeology',
            newDailyPrice: 'New daily price, decorative',
            remainingValue: 'Remaining value: priceless joy',
            newPlanCost: 'New plan cost: air coins',
            currentBalance: 'Balance mascot',
            balanceAfterRenew: 'Balance after renew: suspiciously unchanged',
            walletBalanceTab: 'Joy Balance',
            walletLogsTab: 'Comped Ledger',
            walletCurrentBalance: 'Current joy meter',
            walletDescription: 'Freebie site mode is on. Recharge went out for tea; balance is guarding the lobby.',
            walletLogsDescription: 'Balance wiggles are recorded here. Relax, the main quest is still free play.',
            walletTotalRecharge: 'Total comps',
            walletTotalConsume: 'Joy vaporized',
            walletDestroyedValue: 'Destroyed souvenir value',
            dashboardNewInstance: 'Joy Instance',
            dashboardCreateInstance: 'Summon joy machine',
            dashboardCreateFirst: 'Summon the first one',
            dashboardUserBalance: 'Joy balance',
            dashboardBalanceValue: 'Free is priceless',
            dashboardNewContainer: 'Wallet, stay seated. We launch.',
            instanceCreate: 'Joy Instance',
            instanceCreateFirst: 'Summon the first one',
            instanceBatchRenewTitle: 'Batch refresh the joy',
            instanceBatchRenewDescription: 'In freebie site mode, renewal is just a stamp. The machines keep grinning.',
            instanceBatchTotalAmount: 'Air total',
            instanceBatchBalanceAfter: 'Mood after renewal',
            instanceBatchCurrentBalance: 'Current mascot balance',
            instanceBatchRenewAction: 'Confirm joy refill',
            moneyJustForShow: 'Number parade',
            marketPriceFree: 'Comped takeoff',
            marketPlanCount: '{count} joy tiers',
            marketCreateNow: 'Claim the chaos',
            marketLoginToOrder: 'Sign in to claim chaos',
            marketSelectedPlanTitle: 'Joy tier',
            marketCycleMonthly: 'Monthly? The moon paid it',
            marketMonthlyPrice: 'Monthly average? Joy does not average',
            createOrderSummary: 'Comped Summary',
            createPromoCode: 'Secret phrase',
            createPromoPlaceholder: 'Optional. The free train already left the station.',
            createPromoHostedDisabled: 'Hosted plans ignore secret phrases. Hop aboard.',
            createPromoValid: 'Secret phrase accepted. Joy boost {rate}',
            createPromoUsing: 'Secret lamp is lit',
            createPromoBenefit: 'Discounts and commissions are performing nearby. Emotional value is clapping.',
            createCommissionEstimate: 'Imaginary commission snack for the sharer: ¥{amount}',
            createPlanFee: 'Price exhibit',
            createMonthlyEquivalent: 'Proration? Joy refuses to be prorated',
            mailPrice: 'Mail is comped too',
            mailCheckoutTitle: 'Confirm Comped Mail',
            mailBillingCycle: 'Joy cycle',
            mailCheckoutAmount: 'Symbolic checkout',
            mailCheckoutConfirm: 'Claim mail',
            mailBalanceRequired: 'Balance is beside the point. Freebie site mode says use first.',
        },
    },

    publicSite: {
        brandTagline: 'Incus-powered NAT VPS platform',
        nav: {
            home: 'Home',
            overview: 'Overview',
            products: 'Browse',
            help: 'Help',
        },
        actions: {
            signIn: 'Sign in',
            console: 'Open console',
            consoleCompact: 'Console',
            browseProducts: 'Browse all products',
            browseOfficial: 'Browse official',
            browseMarket: 'Browse marketplace',
            viewCatalog: 'View catalog',
        },
        footer: {
            description: 'Curated global LXC and KVM plans across multiple locations, with broad configurations and tiers for high-value NAT VPS choices.',
            explore: 'Explore',
            account: 'Account',
            purchaseHint: 'When an unauthenticated visitor opens a purchase link, they land on the public catalog first; signed-in users still continue with the existing create flow.',
        },
        seo: {
            keywords: 'Incus,NAT VPS,LXC,KVM,VPS panel,cloud server',
            homeTitle: 'Incus-powered NAT VPS portal and control plane',
            homeDescription: 'Curated global LXC and KVM plans across multiple locations, with broad configurations and tiers for high-value NAT VPS choices.',
            marketTitle: 'Browse Products',
            marketDescription: 'Browse every public product and filter NAT VPS offers by source, region, resource profile, and billing plan.',
            marketPackageTitle: '{name} - Browse Products',
            marketPackageDescription: 'Review the {type} profile, traffic, and product details for {name} on the public catalog.',
        },
        portal: {
            badge: 'Incus Driven NAT Platform',
            title: 'An Incus-powered NAT VPS portal and control plane',
            description: 'Curated global LXC and KVM plans across official and hosted supply, with broader tiers and strong value NAT VPS choices.',
            authPanelDescription: 'Stable supply, wider region coverage, and broader price bands are brought into one place so choosing a package feels more direct.',
            authPanelFlowLabel: 'ORDER FLOW',
            authPanelFlowTitle: 'Browse products first, sign in when ready',
            authPanelFlowDescription: 'Signed-out visitors can inspect public products first. Shared purchase links keep the product context, and signing in resumes the existing checkout flow.',
            authPanelTagValue: 'High value',
            previewLabel: 'CONTROL PLANE',
            previewTitle: 'Platform overview',
            previewDescription: 'The public portal and signed-in console are aligned around product selection, provisioning, operations, and conversion.',
            controlPoint1: '$ incus launch ubuntu:24.04 edge-vm',
            controlPoint2: '# Unified entry for LXC and KVM NAT instances',
            controlPoint3: '# Official inventory and hosted marketplace share the same browse-to-provision path',
            packageFallback: 'Public package ready for browsing and purchase routing.',
            stats: {
                packages: 'Packages',
                regions: 'Regions',
                official: 'Official',
                market: 'Marketplace',
            },
            officialTitle: 'Official direct',
            officialDescription: 'Standardized supply with steadier expectations for users who care about baseline stability, cleaner operations, and predictable availability.',
            officialPoint1: 'Official nodes fit workloads that want consistent supply and a more uniform operating experience.',
            officialPoint2: 'The public-facing browse and order path is suitable for promotions, landing pages, and continuous product exposure.',
            officialPoint3: 'After sign-in, provisioning still follows the existing instance creation flow.',
            marketTitle: 'Hosted marketplace',
            marketDescription: 'A wider spread of price points and regions for users chasing flexibility, more locations, and better cost efficiency.',
            marketPoint1: 'Hosted supply is useful when you want colder regions, sharper pricing, or more diverse resource sources.',
            marketPoint2: 'Public browsing, regional filtering, and plan inspection are aligned into the same experience.',
            marketPoint3: 'Shared purchase links still land gracefully for signed-out visitors and preserve the existing flow for signed-in users.',
            experienceNoLoginTitle: 'Global node coverage',
            experienceNoLoginDescription: 'Official and hosted products are listed side by side so popular regions and broader node choices are easier to inspect from one entry point.',
            experienceRoutingTitle: 'Broader LXC / KVM lineup',
            experienceRoutingDescription: 'From lightweight containers to full virtual machines, resource tiers and plan coverage are wider and easier to compare.',
            experienceThemeTitle: 'More price bands, better value',
            experienceThemeDescription: 'The catalog keeps adding NAT VPS options across different budgets and positions so you can compare before you commit.',
            catalogLabel: 'ECOSYSTEM',
            catalogTitle: 'Official inventory and hosted supply in parallel',
            catalogDescription: 'Official and hosted products are offered side by side, whether you prioritize steadier supply or want broader region and price coverage.',
            emptyPackages: 'No public packages are available right now.',
            browseLabel: 'CATALOG',
            browseTitle: 'Filter the right plans by region and configuration',
            browseDescription: 'Browse products by region, configuration, and price so new visitors can compare quickly and existing users can top up faster.',
        },
        market: {
            badge: 'Public Catalog',
            title: 'Browse all public products',
            description: 'Filter public products by source, region, package profile, and billing plan.',
            publicNotice: 'This page aggregates every public product and lets you filter by source, region, and resource profile.',
            buyLinkNotice: 'You opened a purchase link while signed out. The matching product is shown here first, and after sign-in the flow still continues to the existing create page.',
            searchPlaceholder: 'Search by package name, description, or virtualization type',
            allRegions: 'All regions',
            official: 'Official',
            market: 'Marketplace',
            noPackages: 'No public products are available right now.',
            noResults: 'No products match the current filters.',
            soldOut: 'Sold out',
            inStock: 'Available',
            free: 'Free',
            fromMonthly: 'From ¥{price}/mo',
            planCount: '{count} plan(s)',
            featuresTitle: 'Package details',
            plansTitle: 'Available plans',
            planCycle: '{months} month(s)',
            selectedPlanTitle: 'Selected plan',
            customConfigTitle: 'Custom configuration',
            customConfigDescription: 'This product does not expose fixed plans right now. After sign-in, the create page will let you choose resources within the package limits.',
            createNow: 'Provision now',
            loginToOrder: 'Sign in to provision',
            loginHint: 'After sign-in, the current product still continues into instance creation.',
            choosePackage: 'Choose a package on the left to inspect the details.',
            summary: {
                total: 'Public products',
                available: 'Available',
                regions: 'Regions',
                source: 'Current source',
            },
            labels: {
                startingPrice: 'Starting price',
                traffic: 'Monthly traffic',
                plans: 'Plans',
                cpu: 'CPU',
                memory: 'Memory',
                disk: 'Disk',
                network: 'Network mode',
                hosts: 'Hosts',
                nesting: 'Nesting',
            },
        },
    },

    // Wallet
    wallet: {
        title: 'Wallet',
        description: 'Manage your account balance and recharge',
        tabs: {
            balance: 'Balance',
            logs: 'Balance Logs',
            records: 'Recharge Records',
        },
        currentBalance: 'Current Balance',
        recharge: 'Recharge',
        totalRecharge: 'Total Recharged',
        totalConsume: 'Total Consumed',
        totalDestroyedValue: 'Destroyed Value',
        noLogs: 'No balance logs',
        noRecords: 'No recharge records',
        type: 'Type',
        amount: 'Amount',
        actualAmount: 'Credited',
        estimatedAmount: 'Estimated Credit',
        balanceAfter: 'Balance',
        instanceOrRemark: 'Instance/Remark',
        time: 'Time',
        orderNo: 'Order No.',
        completedAt: 'Completed',
        statusLabel: 'Status',
        paymentMethod: 'Payment Method',
        paymentMethodType: 'Select Payment Method',
        heleketSelectionHint: 'You will choose the specific cryptocurrency and network on the Heleket payment page. This page does not restrict the final payment currency.',
        paymentChannel: 'Payment Channel',
        paymentUuid: 'UUID:',
        paymentTxid: 'TxID:',
        paymentMethods: {
          alipay: 'Alipay',
          wxpay: 'WeChat Pay',
          qqpay: 'QQ Wallet',
          bank: 'Bank Card',
          jdpay: 'JD Pay',
        },
        noProviders: 'No payment providers available',
        amountLabel: 'Recharge Amount',
        amountRange: 'Amount Range',
        feeNote: 'Fee',
        payableAmount: 'Amount Due',
        pay: 'Pay Now',
        void: 'Void',
        logTypes: {
            recharge: 'Recharge',
            consume: 'Consume',
            refund: 'Refund',
            adminAdjust: 'Admin Adjustment',
            gift: 'Gift',
            transferFee: 'Transfer Fee',
            transferRefund: 'Fee Refund',
            hostingWithdraw: 'Hosting Withdrawal',
            hostingDeduction: 'Hosting Deduction',
        },
        status: {
            pending: 'Pending',
            paid: 'Paid',
            completed: 'Completed',
            failed: 'Failed',
            cancelled: 'Cancelled',
            refunded: 'Refunded',
        },
        loadLogsFailed: 'Failed to load balance logs',
        showLotteryGift: 'Lottery Gift',
        showingLotteryGift: 'Lottery Gift',
        loadProvidersFailed: 'Failed to load payment providers',
        loadRecordsFailed: 'Failed to load recharge records',
        selectProvider: 'Please select a payment method',
        invalidAmount: 'Invalid amount',
        orderCreated: 'Order created',
        redirecting: 'Redirecting to payment page...',
        createOrderFailed: 'Failed to create order',
        noPayUrl: 'Failed to get payment URL',
        repayFailed: 'Failed to repay order',
        orderCancelled: 'Order cancelled',
        noRefundNotice: 'All recharges cannot be refunded to the original payment method.',
        rechargeNotice: 'I understand that unusable instances can be destroyed and returned to panel balance, transferable instance PUSH is free, and the email can be changed by myself.',
        cancelFailed: 'Failed to cancel order',
        orderExpired: 'Order expired',
        rechargeSuccess: 'Recharge successful! Balance has been credited',
        verifyingPayment: 'Verifying payment status...',
        paymentProcessing: 'Payment processing, please refresh later',
        verifyFailed: 'Failed to verify payment status',
        amountMismatch: 'Payment amount does not match order amount, please contact support',
        natDisclaimer: 'I understand all instances are NAT-based, IP connectivity to mainland China is not guaranteed, and all recharges are non-refundable.',
    },

    // Referral Program
    aff: {
        title: 'Referral Program',
        description: 'Invite friends to use your promo code and earn commission',
        notActivated: 'Referral program available',
        activateHint: 'You can create promo codes and share them with friends. When they use your promo code to purchase plans you have bought, you will earn commission.',
        goRecharge: 'Go to Recharge',
        affBalance: 'AFF Balance',
        totalEarnings: 'Total Earnings',
        balanceHint: 'AFF balance can only be converted to account balance for in-panel consumption and cannot be withdrawn directly.',
        convert: 'Request Conversion',
        myCodes: 'My Promo Codes',
        createCode: 'Create Promo Code',
        noCodes: 'No promo codes yet. Create one to start promoting!',
        code: 'Promo Code',
        plan: 'Plan',
        discount: 'Discount',
        commission: 'Commission',
        usedCount: 'Usage Count',
        earnings: 'Earnings',
        status: 'Status',
        enabled: 'Enabled',
        disabled: 'Disabled',
        toggle: 'Toggle',
        selectPlan: 'Select Plan',
        selectPlanHint: 'Choose global promo code or plan-specific code',
        alreadyCreated: 'Already Created',
        globalCode: 'Global Promo Code',
        globalCodeBadge: 'Site-wide',
        globalCodeHint: 'Can be used for all paid packages and plans site-wide',
        orSelectPlan: 'or select a plan-specific code',
        discountCommission: 'Discount/Commission Rate',
        discountCommissionHint: 'Buyer gets {discount} discount, you get {commission} commission',
        fixedRate: 'Discount & Commission Rate',
        fixedRateHint: 'Fixed discount and commission rate at 5%',
        createSuccess: 'Promo code created successfully',
        createFailed: 'Failed to create',
        deleteCodeConfirm: 'Are you sure to delete promo code {code}?',
        deleteCodeSuccess: 'Promo code deleted',
        deleteCodeFailed: 'Failed to delete',
        toggleSuccess: 'Status toggled',
        toggleFailed: 'Failed to toggle',
        earningsLog: 'Earnings Details',
        noLogs: 'No earnings records yet',
        logType: {
            new_purchase: 'New Purchase Commission',
            renew: 'Renewal Commission',
            convert: 'Balance Conversion',
        },
        convertModal: {
            title: 'Request Conversion',
            currentBalance: 'Current AFF Balance',
            amount: 'Conversion Amount',
            minAmount: 'Minimum conversion: 0.10',
            hint: 'After submission, it will be automatically transferred to your account balance.',
            submit: 'Confirm Conversion',
            success: 'Conversion successful, transferred to account balance',
            failed: 'Submission failed',
            invalidAmount: 'Please enter a valid conversion amount',
        },
        withdrawals: 'Conversion History',
        noWithdrawals: 'No conversion history',
        withdrawalStatus: {
            pending: 'Pending Review',
            approved: 'Approved',
            rejected: 'Rejected',
        },
        leaderboard: {
            title: 'AFF Leaderboard',
            loadFailed: 'Failed to load leaderboard',
            empty: 'No leaderboard data yet',
            you: 'You',
        },
        // Instance creation page promo code input
        promoCode: 'Promo Code',
        promoCodeOptional: 'Promo Code (Optional)',
        promoCodePlaceholder: 'Enter promo code (optional)',
        promoCodeInputPlaceholder: 'Enter discount code',
        promoCodeHostedDisabled: 'Promo codes not available for hosted nodes',
        promoCodeValid: 'Promo code valid, {rate} discount applied',
        promoCodeInvalid: 'Invalid promo code',
        verifying: 'Verifying...',
        originalPrice: 'Original Price',
        discountAmount: 'Discount',
        promoDiscount: 'Promo Discount',
        finalPrice: 'Final Price',
        usingPromoCode: 'You are using a promo code',
        promoCodeBenefit: 'You enjoy {discount} discount, while providing about {commission}% commission to the sharer',
        commissionEstimate: 'Estimated ¥{amount} commission for the sharer',
        // Admin review
        adminTitle: 'AFF Conversion Review',
        adminDescription: 'Review user AFF balance conversion requests',
        user: 'User',
        userBalance: 'User AFF Balance',
        requestAmount: 'Request Amount',
        requestTime: 'Request Time',
        approve: 'Approve',
        reject: 'Reject',
        rejectReason: 'Rejection Reason',
        rejectReasonPlaceholder: 'Enter rejection reason',
        approveSuccess: 'Approved, transferred to user balance',
        approveFailed: 'Review failed',
        rejectSuccess: 'Rejected',
        rejectFailed: 'Rejection failed',
        noRequests: 'No pending conversion requests',
        filterStatus: 'Status Filter',
        all: 'All',
    },

    popupAnnouncement: {
        title: 'Site Notice',
        subtitle: 'Please review this latest notice',
        promoLabel: 'New server promo',
        buyNow: 'Buy {name} now',
        viewImage: 'View full image',
        promoPlans: 'Available plans',
        soldOut: 'Sold out',
        dismissToday: 'Hide today',
        dismissForever: 'Never show again',
    },

    // Language
    language: {
        zh: '中文',
        en: 'English',
    },

    // Auth
    auth: {
        login: 'Login',
        loginTo: 'Login',
        logout: 'Logout',
        register: 'Register',
        registerTo: 'Register',
        username: 'Username',
        usernamePlaceholder: 'Enter username',
        usernameOrEmail: 'Username or Email',
        usernameOrEmailPlaceholder: 'Enter username or email',
        password: 'Password',
        passwordPlaceholder: 'Enter password',
        confirmPassword: 'Confirm Password',
        confirmPasswordPlaceholder: 'Enter password again',
        email: 'Email',
        emailPlaceholder: 'Enter email',
        rememberMe: 'Remember me',
        forgotPasswordLink: 'Forgot password',
        contactEmail: 'Contact email',
        noAccount: "Don't have an account?",
        hasAccount: 'Already have an account?',
        loginSuccess: 'Login successful',
        logoutSuccess: 'Logged out',
        registerSuccess: 'Registration successful',
        invalidCredentials: 'Invalid username or password',
        sessionExpired: 'Session expired, please login again',
        continue: 'Continue',
        loggingIn: 'Logging in...',
        registering: 'Registering...',
        orUse: 'or use',
        oauthBindHint: 'You need to bind your account in settings first to use quick login',
        enterUsernamePassword: 'Please enter username and password',
        enterUsernameOrEmailPassword: 'Please enter your account and password',
        twoFactorCode: 'Two-Factor Code',
        twoFactorCodePlaceholder: 'Enter 6-digit code',
        twoFactorHint: 'Enter the code from your authenticator app',
        twoFactorOptional: 'optional',
        twoFactorOptionalHint: 'Enter the code if you have enabled two-factor authentication',
        recoveryCode: 'Recovery Code',
        recoveryCodePlaceholder: 'Enter recovery code',
        recoveryCodeHint: 'Enter the recovery code saved when setting up 2FA (one-time use)',
        useRecoveryCode: "Can't access authenticator? Use recovery code",
        useTotpCode: 'Use authenticator code',
        enterRecoveryCode: 'Please enter recovery code',
        enterTotpCode: 'Please enter verification code',
        rememberPassword: 'Remember your password?',
        verificationCode: 'Verification Code',
        verificationCodePlaceholder: 'Enter 6-digit code',
        invalidCode: 'Please enter a 6-digit code',
        forgotPassword: {
          title: 'Forgot Password',
          subtitle: 'Reset your password via email verification code',
          sendCode: 'Send Verification Code',
          codeSent: 'Verification code sent, please check your email',
          codeHint: 'Please enter the 6-digit code sent to your email',
          resetPassword: 'Reset Password',
          resetSuccess: 'Password reset successful! New password has been sent to your email, please check.',
          twoFactorDisabled: 'Your two-factor authentication (2FA) has been automatically disabled. We recommend re-enabling it for account security.'
        },
        oauthNotBound: 'Please bind your {provider} account in settings first to use quick login',
        oauthUserNotFound: 'User not found',
        oauthAccountBanned: 'Account has been disabled',
        oauthProviderDisabled: 'This login method has been disabled',
        oauthTokenError: 'Failed to get authorization, please try again',
        oauthError: 'OAuth login failed, please try again',
        loginFailed: 'Login failed',
        createAccount: 'Register',
        creatingAccount: 'Creating...',
        backToLogin: 'Back to Login',
        registerSuccessRedirect: 'Registration successful, redirecting...',
        inviteCode: 'Invite Code',
        inviteCodePlaceholder: 'Enter invite code',
        usernameHint: 'Start with a letter, 3-32 characters',
        passwordHint: 'At least 8 characters with uppercase, lowercase and number',
        fillAllRequired: 'Please fill in all required fields',
        invalidEmail: 'Please enter a valid email address',
        emailContainsIllegal: 'Email contains illegal characters',
        passwordMismatch: 'Passwords do not match',
        passwordTooShort: 'Password must be at least 8 characters',
        passwordNeedsUppercase: 'Password must contain at least one uppercase letter',
        passwordNeedsLowercase: 'Password must contain at least one lowercase letter',
        passwordNeedsNumber: 'Password must contain at least one number',
        turnstileRequired: 'Please complete the verification',
        turnstileFailed: 'Verification failed, please try again',
        // Email verification
        emailCode: 'Email Verification Code',
        emailCodePlaceholder: 'Enter 6-digit code',
        emailCodeRequired: 'Please enter email verification code',
        registrationClosedTitle: 'Registration is currently closed',
        registrationClosedMessage: 'Sorry, registration is temporarily unavailable. Please contact the administrator if you need an account.',
        registrationClosedShort: 'Registration is currently closed',
        sendCode: 'Send Code',
        sendingCode: 'Sending...',
        codeSentHint: 'Verification code sent to your email, valid for 10 minutes',
        invalidEmailCode: 'Invalid or expired verification code',
        allowedEmailDomains: 'Only these email domains are allowed',
        emailUsernamePlaceholder: 'username',
        confirmEmail: 'Confirm Email Address',
        confirmEmailMessage: 'Verification code will be sent to the following email. Please confirm the address is correct:',
        confirmAndSend: 'Confirm & Send',
        // Terms of Service
        tos: {
            title: 'Terms of Service',
            agreePrefix: 'I have read and agree to the',
            termsLink: 'Terms of Service',
            mustAgree: 'Please read and agree to the Terms of Service',
            understood: 'I Understand',
            loadFailed: 'Failed to load Terms of Service',
        },
    },

    // User Menu
    userMenu: {
        profile: 'Profile',
        myInstances: 'My Instances',
        logout: 'Logout',
    },

    // Quota
    quota: {
        hosts: 'Hosts',
        instances: 'Instances',
        friends: 'Friends',
        packages: 'Packages',
    },

    // Instance
    instance: {
        title: 'Instances',
        create: 'Create Instance',
        name: 'Instance Name',
        image: 'Image',
        package: 'Package',
        host: 'Host',
        ip: 'IP Address',
        port: 'Port',
        cpu: 'CPU',
        memory: 'Memory',
        disk: 'Disk',
        bandwidth: 'Bandwidth',
        expireAt: 'Expires At',
        expiredLabel: 'Expired',
        freeInstanceLabel: 'Free Instance',
        config: 'Config',
        user: 'User',
        details: 'Details',
        // Resource quotas (for order summary)
        ports: 'Ports',
        snapshots: 'Snapshots',
        backups: 'Backups',
        hostAnnouncement: 'Host Announcement',
        badgeModal: {
            open: 'View or change instance badge',
            kicker: 'Instance Badge',
            title: 'Instance Badge',
            subtitle: 'Inspect the current badge and quickly switch badges for {name}',
            detailsTab: 'Badge Details',
            ownedTab: 'My Badges',
            noBadgeSeries: 'No Badge Applied',
            noBadgeTitle: 'No badge is applied to this instance',
            noBadgeSummary: 'This instance is currently using the default icon.',
            noBadgeDescription: 'Switch to "My Badges" to quickly apply one of your owned badges to this instance.',
            statusLabel: 'Current Status',
            statusApplied: 'Applied to this instance',
            statusNotApplied: 'No instance badge applied',
            ownedCountLabel: 'Owned Copies',
            openOwnedTab: 'Choose From My Badges',
            manageUnavailable: 'This instance is not in your manageable instance list. You can only view badge details here.',
            emptyOwnedTitle: 'No badges available for this instance yet',
            emptyOwnedHint: 'Get badges from Entertainment first, then you can switch this instance badge here.',
            applyCurrent: 'Apply to Current Instance',
            replaceCurrent: 'Replace Current Badge',
            moveCurrent: 'Move to Current Instance',
            moveFromAvatar: 'Move From Avatar to Instance',
            appliedHere: 'On Current Instance',
            currentHint: 'This badge is already applied to the current instance.',
            replaceHint: 'Applying this will replace the badge currently used by this instance.',
            moveFromAvatarHint: 'Applying this will remove it from your current avatar first.',
            moveFromInstanceHint: 'Applying this will remove it from instance "{name}" first.',
            removeCurrent: 'Remove Current Instance Badge',
            updateSuccess: 'Instance badge updated',
            removeSuccess: 'Current instance badge removed',
        },
        errorBanner: {
            title: 'Instance Error',
            description: 'This instance is in an error state. You can destroy it directly (paid instance refunds will not incur any fees)',
            destroyNow: 'Destroy Now',
            confirmDestroy: 'Are you sure you want to destroy this abnormal instance? Remaining value of paid instances will be refunded to your wallet (no fees charged).',
        },
        actions: {
            start: 'Start',
            stop: 'Stop',
            restart: 'Restart',
            delete: 'Delete',
            console: 'Console',
            snapshot: 'Snapshot',
            backup: 'Backup',
            rename: 'Rename',
            clone: 'Clone',
            suspend: 'Suspend',
            unsuspend: 'Unsuspend',
        },
        renameModal: {
            title: 'Rename Instance',
            name: 'Instance Name',
            namePlaceholder: 'Enter new instance name',
            cancel: 'Cancel',
            confirm: 'Confirm',
            renaming: 'Renaming...',
            success: 'Instance renamed',
            failed: 'Rename failed',
        },
        statusLabel: 'Status',
        modeLabel: 'Mode',
        quotaLabel: 'Quota',
        trafficLabel: 'Traffic',
        status: {
            running: 'Running',
            stopped: 'Stopped',
            suspended: 'Suspended',
            starting: 'Starting',
            stopping: 'Stopping',
            restarting: 'Restarting',
            creating: 'Creating',
            error: 'Error',
            deleted: 'Deleted',
        },
        statusFilter: {
            all: 'All Status',
        },
        createdAt: 'Created At',
        manageDesc: 'Manage your container instances',
        userInstances: 'Instances of user "{name}"',
        clearFilter: 'Clear filter',
        searchPlaceholder: 'Search instance name, IP...',
        totalCount: '{count} instances',
        noInstances: 'No instances',
        noMatchingInstances: 'No matching instances found',
        tryOtherKeywords: 'Try other keywords',
        createFirstInstance: 'Create your first container instance to get started',
        listLayout: 'List',
        cardLayout: 'Cards',
        order: {
            label: 'Adjust order',
            top: 'Move to top',
            up: 'Move up',
            down: 'Move down',
            bottom: 'Move to bottom',
            updateSuccess: 'Instance order updated',
            updateFailed: 'Failed to save instance order',
        },
        confirmDelete: 'Are you sure to delete instance "{name}"? This action cannot be undone.',
        createPage: {
            title: 'Create Instance',
            description: 'Select a package and configure your container instance',
            instanceName: 'Instance Name',
            instanceNamePlaceholder: 'my-instance',
            selectPackage: 'Please select a package',
            selectSshKey: 'Please select an SSH key',
            creating: 'Creating...',
            createSuccess: 'Instance is being created. Please check the instance list later',
            loadFailed: 'Failed to load data',
            loadHostsFailed: 'Failed to load available hosts',
            loadImagesFailed: 'Failed to load available images',
            missingSshKey: 'Missing SSH Key',
            missingSshKeyDesc: 'An SSH key is required to create an instance. Please go to',
            profileSettings: 'Profile Settings',
            addSshKey: 'to add an SSH public key.',
            quotaInsufficient: 'Quota Insufficient',
            quotaCpu: 'CPU: Used {used}%/{limit}%, need {need}%',
            quotaMemory: 'Memory: Used {used}/{limit} MB, need {need} MB',
            quotaDisk: 'Disk: Used {used}/{limit} MB, need {need} MB',
            quotaInstance: 'Instances: Reached limit {used}/{limit}',
            packageNoHosts: 'Package has no bound hosts, please contact administrator',
            sharedPackageNotFound: 'Shared package not found or expired, selected another available package for you',
            quotaInfo: {
                prefix: 'This package',
                you: 'You',
                maxInstances: '',
                count: 'Count',
                instances: ' instances',
                unlimited: 'Unlimited',
                cpu: 'CPU',
                memory: 'Memory',
                remaining: 'Package Remaining Quota',
            },
            resourceLimit: {
                title: 'Insufficient resource quota, cannot create instance',
                noInstances: 'No remaining instances (0), cannot create new instance',
                insufficientMemory: 'Insufficient remaining memory (<128MB), cannot create instance',
                insufficientCpu: 'Insufficient remaining CPU (<15%), cannot create instance',
            },
            ownPaidPackageWarning: 'This is your own paid package, you cannot create instances for yourself',
            destroyTrafficNotice: 'Destroy limit: this instance can only be destroyed while its current-month traffic usage is below 5 GB.',
            firstPaidInstanceNotice: 'Destroy limit: this instance can only be destroyed while its current-month traffic usage is below 5 GB.',
            // Order Summary
            orderSummary: 'Order Summary',
            packageName: 'Package',
            planName: 'Plan',
            billingCycle: 'Billing Cycle',
            months: 'months',
            month: 'mo',
            resourceConfig: 'Resource Configuration',
            planFee: 'Plan Fee',
            // Package Source
            source: {
                official: 'Official',
                market: 'Marketplace',
                friends: 'Friends',
            },
            fun: {
                selectRegion: 'Select Region',
                packageCount: '{count} packages',
                selectPackage: 'Select Package',
                selectPlan: 'Select Plan',
                planDesc: 'Choose a paid plan that suits your needs',
                customPlanHint: 'Can\'t find a suitable plan? Submit a ticket to request custom configuration',
                noPlans: 'No plans available for this package',
                planSoldOut: 'Sold Out',
                noPackages: 'No packages available',
                selectHost: 'Select Host',
                hostAutoSelected: 'The first available host is selected by default',
                selectSystem: 'Select System',
                noImages: 'No images available',
                selectSshKey: 'Select SSH Key',
            },
            // Hosted Disclaimer
            hostedDisclaimer: {
                title: 'Hosted Node Notice',
                content: 'This is a user-hosted node. Support is handled by the host owner (UID:{uid}). only provides platform services with no quality guarantees. If the host owner becomes unavailable, their hosting balance will be refunded to the affected users\' panel balance.',
            },
            zoneNotice: {
                badge: 'Zone',
                content: 'This is a zone owned by UID:{uid}. After-sales support is handled by {username}.',
            },
        },
        startingInstance: '{name} is starting',
        stoppedInstance: '{name} has been stopped',
        restartingInstance: '{name} is restarting',
        deletedInstance: '{name} has been deleted',
        actionFailed: 'Action failed',
        verificationRequiredHint: 'This operation requires verification, please go to instance detail page',
        totalRecords: '{count} records',
        prevPage: 'Previous',
        nextPage: 'Next',
        batch: {
            selectedCount: '{count} selected',
            currentPageOnly: 'Batch actions apply to selected instances on the current page only',
            clear: 'Clear Selection',
            start: 'Batch Start',
            stop: 'Batch Stop',
            restart: 'Batch Restart',
            sync: 'Batch Sync',
            renew: 'Batch Renew',
            autoRenewOn: 'Enable Auto Renew',
            autoRenewOff: 'Disable Auto Renew',
            destroy: 'Batch Destroy',
            noEligibleAction: 'None of the selected instances can perform this action',
            partialResult: 'Completed {success}, failed {failed}, skipped {skipped}',
            successResult: 'Successfully processed {count} instance(s)',
            actionFailed: 'Batch action failed',
            previewFailed: 'Failed to load batch preview',
            renewTitle: 'Batch Renew',
            renewDescription: 'Renew selected paid instances together. Only instances supporting the chosen period will be processed.',
            selectedMonths: 'Renewal Period',
            eligibleCount: 'Eligible Items',
            totalAmount: 'Total Amount',
            renewEmpty: 'No renewable items in the current selection',
            eligibleList: 'Eligible Instances ({count})',
            skippedList: 'Skipped Instances ({count})',
            hosted: 'Hosted Instance',
            unsupportedPeriod: 'The selected period is not available for this instance',
            unknownReason: 'Unavailable right now',
            destroyTitle: 'Batch Destroy',
            destroyDescription: 'Destroy the selected instances together. Only eligible instances will be processed.',
            destroyEmpty: 'No destroyable items in the current selection',
            refundTotal: 'Estimated Refund',
            feeTotal: 'Estimated Fee',
            feeWaived: 'Fee Waived',
            confirmHint: 'Type DESTROY to confirm batch destruction',
            confirmPlaceholder: 'Enter DESTROY to confirm',
        },
        batchReason: {
            notFoundOrForbidden: 'Instance does not exist or you do not have permission',
            freeNoRenew: 'Free instances do not require renewal',
            billingUnavailable: 'Billing information is unavailable for this instance',
            noRenewOptions: 'No renewal options are currently available',
            renewWindow: 'This instance can only be renewed within {days} days before expiration',
            renewFailed: 'Renewal failed',
            freeNoAutoRenew: 'Free instances do not support auto-renew',
            autoRenewAlreadyOn: 'Auto-renew is already enabled',
            autoRenewAlreadyOff: 'Auto-renew is already disabled',
            autoRenewFailed: 'Failed to update auto-renew setting',
            deleted: 'Instance has already been deleted',
            creating: 'Instance is still being created and cannot be destroyed',
            suspended: 'Instance is suspended and cannot be destroyed until it is unsuspended',
            destroyTrafficLimit: 'This instance cannot be destroyed because current monthly traffic usage has reached or exceeded 5G',
            destroyFailed: 'Failed to destroy instance',
        },
        // Mobile card
        mobileCard: {
            ipAddress: 'IP Address',
            config: 'Config',
            disk: 'Disk',
            traffic: 'Traffic',
            host: 'Host',
            user: 'User',
            unlimited: 'Unlimited',
            cpuCore: '% core',
            quota: 'Quota',
            ports: 'Ports',
            snapshots: 'Snaps',
            backups: 'Backups',
            sites: 'Sites',
        },
        // Instance create components
        selector: {
            // Region selection
            selectRegion: 'Select Region',
            allRegions: 'All',
            noRegions: 'No regions available',
            packageCount: '{count} packages',
            // Package selection
            selectPackage: 'Select Package',
            selectPlan: 'Select Plan',
            planDesc: 'Choose a paid plan that suits your needs',
            customPlanHint: 'Can\'t find a suitable plan? Submit a ticket to request custom configuration',
            noPlans: 'No plans available for this package',
            planSoldOut: 'Sold Out',
            noPackages: 'No packages available',
            cpu: 'CPU',
            memory: 'Memory',
            disk: 'Disk',
            cores: 'cores',
            networkMode: {
                nat: 'NAT',
                natDesc: 'Access via port mapping',
                nat_ipv6: 'NAT + IPv6',
                nat_ipv6Desc: 'NAT + Public IPv6',
            },
            docker: 'Nestable',
            privileged: 'Privileged',
            configureResources: 'Configure Resources',
            adjustBasedOnPackage: 'Adjust freely based on package limits',
            cpuAllowance: 'allowance',
            accountQuota: 'Account quota',
            packageLimit: 'Package limit',
            selectHost: 'Select Host',
            hostOptional: 'Optional, system will auto-assign if not selected',
            hostAutoSelected: 'The first available host is selected by default',
            hostTraffic: 'Monthly traffic on this host',
            autoAssign: 'Auto Assign',
            autoAssignDesc: 'System selects optimal node based on load',
            available: 'Available',
            selectSystem: 'Select System',
            showSyncedImages: 'Showing images allowed on the selected host',
            noImages: 'No images available',
            noImagesOnHost: 'No images available on selected host',
            contactAdmin: 'Please contact the host owner or administrator to adjust the image policy',
            selectSshKey: 'Select SSH Key',
            noSshKeys: 'No SSH keys',
            addSshKeyHint: 'Please add an SSH public key in settings first',
            hostInsufficient: 'Host resources insufficient',
            hostInsufficientDesc: 'Current configuration requires {cpu}% CPU and {memory}GB memory, but no host in this package can meet the requirements.',
            hostInsufficientSuggest: 'Try reducing instance configuration or wait for resources to be released.',
            viewProbe: 'View Probe Monitor',
            prevPage: 'Previous',
            nextPage: 'Next',
            pageInfo: 'Page {current}/{total}, {count} total',
            // Plan resource quotas
            ports: 'Ports',
            snapshots: 'Snapshots',
            backups: 'Backups',
            sites: 'Sites',
            bandwidth: 'Bandwidth',
        },
        // Paid subscription card
        subscription: {
            premium: 'Premium',
            expiresAt: 'Expires At',
            expiresIn: 'Expires In',
            expired: 'Expired',
            days: 'days',
            billingCycle: 'Billing Cycle',
            renewPrice: 'Renew Price',
            month: 'mo',
            monthly: 'Monthly',
            quarterly: 'Quarterly',
            semiAnnual: 'Semi-Annual',
            annual: 'Annual',
            months: 'months',
            perMonth: '/mo',
            perQuarter: '/qtr',
            perHalfYear: '/6mo',
            perYear: '/yr',
            renew: 'Renew',
            renewSuccess: 'Renewal successful',
            applyAffShort: 'Promo Code',
            applyAffTitle: 'Bind AFF Promo Code',
            applyAffInstance: 'Instance',
            applyAffCurrentRenewPrice: 'Current renew price',
            applyAffCodeLabel: 'AFF promo code',
            applyAffCodePlaceholder: 'Enter AFF promo code',
            applyAffEffectHint: 'After binding, the discount only affects future renewal prices.',
            applyAffNoRefundHint: 'No current-cycle price difference will be refunded or changed.',
            applyAffOwnCodeHint: 'You can only bind another user\'s code, not your own code.',
            applyAffSubmit: 'Confirm Binding',
            applyAffSubmitting: 'Binding...',
            applyAffSuccess: 'Promo code bound successfully. Future renewals will use the discount.',
            // Auto renew
            autoRenew: 'Auto Renew',
            autoRenewOn: 'Auto-renew enabled',
            autoRenewOff: 'Auto-renew not enabled',
            autoRenewEnabled: 'Auto-renew enabled',
            autoRenewDisabled: 'Auto-renew disabled',
            enableAutoRenew: 'Enable Auto Renew',
            disableAutoRenew: 'Disable Auto Renew',
            autoRenewHint: 'Will automatically deduct from balance 24 hours before expiration',
            autoRenewDesc: 'Once enabled, the instance will automatically renew per {cycle} cycle, costing ￥{price} each time',
            currentStatus: 'Current Status',
        },
        // Instance destroy
        destroy: {
            button: 'Destroy',
            title: 'Destroy Instance',
            warning: 'This action will permanently delete the instance and all its data, including snapshots, backups, port mappings, etc. This cannot be undone.',
            warningFree: 'This action will permanently delete the instance and all its data. This cannot be undone.',
            rulesTitle: 'Destroy Rules',
            rulesDesc: 'Learn about the rules and limitations of the destroy feature',
            ruleFirstFree: 'First destroy is fee-free',
            ruleFirstFreeDesc: 'Your first destroy operation will be exempt from fees with full refund',
            ruleFeeRate: '{rate}% fee for subsequent destroys',
            ruleFeeRateDesc: 'Second and subsequent destroys charge {rate}% fee',
            ruleTrafficThreshold: 'Paid instances require monthly traffic cycle usage below 5G',
            ruleTrafficThresholdDesc: 'If usage in the current monthly traffic cycle reaches or exceeds 5G, this paid instance cannot be destroyed',
            ruleFreeInstance: 'Free instances can be destroyed directly',
            ruleFreeInstanceDesc: 'Free instance destroy has no refund and does not count towards destroy quota',
            // Preview info
            instanceInfo: 'Instance Info',
            instanceName: 'Instance Name',
            hostName: 'Node',
            planName: 'Current Plan',
            refundInfo: 'Refund Info',
            remainingDays: 'Remaining Days',
            remainingValue: 'Remaining Value',
            maxRefundable: 'Refund Cap',
            feeRate: 'Fee Rate',
            feeAmount: 'Fee',
            refundAmount: 'Refund Amount',
            firstTimeFree: 'First time fee-free',
            freeInstanceNoRefund: 'Free instance no refund',
            days: 'days',
            // Confirm
            confirmTitle: 'Confirm Destroy',
            confirmHint: 'Please enter the instance name {name} to confirm destroy',
            confirmPlaceholder: 'Enter instance name to confirm',
            confirmButton: 'Confirm Destroy',
            destroying: 'Destroying...',
            cancel: 'Cancel',
            // Status
            success: 'Instance destroyed',
            successWithRefund: 'Instance destroyed, refunded ¥{amount}',
            failed: 'Destroy failed',
            loadFailed: 'Failed to load destroy info',
            // Cannot destroy reasons
            cannotDestroy: 'Cannot Destroy',
        },
        // Instance detail page
        detail: {
            invalidId: 'Invalid instance ID',
            notExist: 'Instance does not exist',
            loadFailed: 'Failed to load instance',
            tabs: {
                info: 'Info',
                network: 'Network',
                traffic: 'Traffic',
                quota: 'Quota',
                snapshots: 'Snapshots',
                backups: 'Backups',
                config: 'Config',
                logs: 'Logs',
            },
            task: {
                start: 'Starting...',
                stop: 'Stopping...',
                restart: 'Restarting...',
                rebuild: 'Rebuilding...',
                recreate: 'Recreating...',
                clone: 'Cloning...',
                change_host: 'Changing host...',
            },
            actions: {
                starting: 'Instance is starting',
                stopped: 'Instance has been stopped',
                restarting: 'Instance is restarting',
                deleted: 'Instance has been deleted',
                confirmDelete: 'Are you sure to delete instance "{name}"?\n\nThis will permanently delete the instance and all data. This action cannot be undone.',
                actionFailed: 'Action failed',
                taskQueued: 'Task submitted, please wait...',
                taskInProgress: 'Instance has another task in progress, please wait',
                rebuildSuccess: 'System rebuilt successfully, new password generated',
                recreateSuccess: 'Instance recreated successfully, new password generated',
                selectImageAndKey: 'Please select an image and SSH key',
                clone: 'Clone Instance',
                cloning: 'Cloning...',
                cloneSuccess: 'Instance cloned successfully',
                cloneFailed: 'Instance clone failed',
                confirmClone: 'Are you sure you want to clone instance "{name}"?',
                cloneNotice: 'The clone operation will create a new instance copy. The new instance will inherit all configurations from the source instance, but will be assigned new port mappings. The cloning process may take a few minutes, please be patient.',
                stopRequired: 'Please stop the instance first',
                stopRequiredHint: 'This operation requires the instance to be stopped',
                suspend: 'Suspend Instance',
                unsuspend: 'Unsuspend Instance',
                suspending: 'Suspending...',
                unsuspending: 'Unsuspending...',
                suspendSuccess: 'Instance has been suspended',
                unsuspendSuccess: 'Instance has been unsuspended',
                syncStatus: 'Sync',
                help: 'Help',
                syncStatusChanged: 'Status synced: {from} → {to}',
                syncStatusNoChange: 'Status updated, network addresses synced',
                syncIpv4Changed: 'Internal IP updated: {from} → {to}',
                syncProxySitesUpdated: 'Updated {count} proxy site(s) configuration',
                confirmSuspend: 'Are you sure you want to suspend instance "{name}"?',
                confirmSuspendNotice: 'After suspension, the instance owner will not be able to perform any operations on this instance until it is manually unsuspended.',
                suspendReason: 'Suspension Reason',
                suspendReasonPlaceholder: 'Enter suspension reason, will be sent to instance owner via notification...',
                confirmUnsuspend: 'Are you sure you want to unsuspend instance "{name}"?',
            },
            rebuild: {
                title: 'Rebuild',
                noHostInfo: 'Unable to get host information',
                noImages: 'No images are currently available on this host. Please contact the host owner or administrator to adjust the image policy.',
                loadImagesFailed: 'Failed to load image list',
                loadKeysFailed: 'Failed to load SSH keys',
            },
            recreate: {
                title: 'Recreate Instance',
            },
            port: {
                fillPrivatePort: 'Please fill in the private port',
                added: 'Port mapping added',
                addedBoth: 'TCP and UDP port mappings added',
                batchAdded: '{count} port mappings added',
                stillConflict: 'Some ports still have conflicts, please re-select',
                deleted: 'Port mapping deleted',
                deleteFailed: 'Delete failed',
                confirmDelete: 'Are you sure to delete this port mapping?',
                confirmBatchDelete: 'Are you sure to delete {count} port mappings?',
                batchDeleted: '{count} port mappings deleted',
                batchDeletePartial: 'Deleted {success}, {fail} failed',
            },
            password: {
                loadFailed: 'Failed to load password',
            },
            quota: {
                saved: 'Quota updated',
                saveFailed: 'Save failed',
                portExceedUsed: 'Port quota cannot be less than current usage: {used} ports used, input {input}',
                snapshotExceedUsed: 'Snapshot quota cannot be less than current usage: {used} snapshots used, input {input}',
                backupExceedUsed: 'Backup quota cannot be less than current usage: {used} backups used, input {input}',
                portOutOfRange: 'Port quota must be between 1 and 1000',
                snapshotOutOfRange: 'Snapshot quota must be between 1 and 1000',
                backupOutOfRange: 'Backup quota must be between 1 and 1000',
            },
            copy: {
                success: 'Copied to clipboard',
                failed: 'Copy failed',
            },
            // Info tab
            info: {
                title: 'Basic Info',
                instanceId: 'Instance ID',
                image: 'Image',
                host: 'Host',
                networkMode: 'Network Mode',
                instanceMode: 'Instance Mode',
                nat: 'NAT',
                ipv6: 'IPv6',
                sshPort: 'SSH Port',
                sshHelpTitle: 'SSH Connection Guide',
                sshHelpIpv4: 'For IPv4 connection, go to the "Network" tab to add a port mapping for port 22, then connect using the public IP and the mapped port.',
                sshHelpIpv6: 'For IPv6 connection, you can directly connect using the public IPv6 address and port 22 without configuring port mapping.',
                rootPassword: 'Root Password',
                createdAt: 'Created At',
                expiresAt: 'Expires At',
                suspended: 'Instance Suspended',
                suspendedAt: 'Suspended At',
                suspendReasonLabel: 'Reason',
                suspendReasonExpired: 'Instance has expired, please renew to unsuspend',
                suspendReasonDefault: 'No reason provided',
                suspendTip: 'While suspended, the instance cannot be started, restarted, rebuilt, etc. To request unsuspension or if you have questions, please submit a ticket.',
                copy: 'Copy',
                show: 'Show',
                hide: 'Hide',
                resourceUsage: 'Resource Usage',
                cpu: 'CPU',
                memory: 'Memory',
                disk: 'Disk',
                inbound: 'Inbound',
                outbound: 'Outbound',
                ingressLimit: 'Ingress',
                egressLimit: 'Egress',
                hostUid: 'Host UID',
                hostOwnerTitle: 'Host Owner Info',
                hostOwnerEmail: 'Email',
                hostOwnerHostCount: 'Hosted Nodes',
                hostOwnerInstanceCount: 'Total Instances',
                hostOwnerRegisteredDays: 'Registered',
                includesCache: 'incl. cache',
                cannotEditConfig: 'Instance status does not allow config changes',
                redeem: 'Redeem',
                redeemTitle: 'Redeem Resources',
            },
            // Cloud-init initialization status
            cloudInit: {
                initializing: 'Initializing',
                retry: 'Retry',
                retryUnknown: 'Retry Detection',
                retryStalled: 'Keep Checking',
                short: 'Init',
                shortUnknown: 'Pending',
                shortStalled: 'Slow',
                clickToRetry: 'System initializing, click to retry',
                clickToRetryUnknown: 'Cloud-init status is currently unknown, click to retry detection',
                clickToRetryStalled: 'Initialization is taking longer than usual, click to keep checking or mark it complete manually',
                statusUnknown: 'Status Unknown',
                stalled: 'Initialization Slow',
                manualComplete: 'Mark Complete',
                manualShort: 'Done',
                manualCompleteSuccess: 'Cloud-init has been marked complete manually',
            },
            // Network tab
            network: {
                title: 'Network Addresses',
                privateIpv4: 'Private IPv4',
                publicIpv4: 'Public IPv4',
                publicIpv6: 'Public IPv6',
                portMappings: 'Port Mappings',
                publicIp: 'Public IP',
                add: 'Add',
                noQuota: 'Please allocate port quota first',
                quotaFull: 'Port quota is full',
                addPortMapping: 'Add port mapping',
                prevPage: 'Previous',
                nextPage: 'Next',
                perPage: 'Per page',
                filterBoth: 'Both',
                selectAll: 'Select all on page',
                selectedCount: '{count} selected',
                batchDelete: 'Delete selected',
                noFilterResults: 'No results match the current filter',
                noPortQuota: 'No port quota allocated',
                allocateQuotaHint: 'Please allocate port quota in the "Quota" tab first',
                noPortMappings: 'No port mappings, click "Add" to create',
                ipv6OnlyPortMappingHint: 'IPv6 Only instances do not support port mapping. Please use the instance IPv6 address directly.',
                additionalIpv6: 'Additional IPv6 Addresses',
                addIpv6: 'Add IPv6',
                noAdditionalIpv6: 'No additional IPv6 addresses',
                ipAdded: 'IPv6 address added successfully',
                ipAddFailed: 'Failed to add IPv6 address',
                ipDeleted: 'IPv6 address deleted',
                ipDeleteFailed: 'Failed to delete IPv6 address',
                confirmDeleteIp: 'Are you sure you want to delete this IPv6 address?',
                // IPv6 management additions
                primaryIpv6: 'Primary IPv6',
                extraIpv6: 'Extra IPv6',
                ipv6Subnets: 'IPv6 Subnets',
                addSubnet: 'Allocate Subnet',
                customIpv6: 'Custom IPv6',
                randomIpv6: 'Random Assign',
                setCustom: 'Set Custom',
                custom: 'Custom',
                primary: 'Primary',
                addIpv6Modal: {
                    title: 'Add IPv6 Address',
                    randomHint: 'System will randomly assign an address from the host IPv6 subnet',
                    customHint: 'Enter your own IPv6 address (must be within the host subnet range)',
                    addressLabel: 'IPv6 Address',
                    addressPlaceholder: 'e.g. 2001:db8::1',
                    invalidAddress: 'Invalid IPv6 address format',
                    adding: 'Adding...',
                },
                subnetModal: {
                    title: 'Allocate IPv6 Subnet',
                    hint: 'Select the subnet size to allocate, the system will automatically assign from the available pool',
                    prefix112: '/112 (65,536 IPs)',
                    prefix120: '/120 (256 IPs)',
                    prefix124: '/124 (16 IPs)',
                    allocating: 'Allocating...',
                    allocate: 'Allocate',
                },
                noSubnets: 'No IPv6 subnets allocated',
                subnetAllocated: 'IPv6 subnet allocated successfully',
                subnetAllocateFailed: 'Failed to allocate IPv6 subnet',
                subnetDeleted: 'IPv6 subnet deleted',
                subnetDeleteFailed: 'Failed to delete IPv6 subnet',
                confirmDeleteSubnet: 'Are you sure you want to delete this IPv6 subnet?',
                customIpv6Set: 'Custom IPv6 address set successfully',
                customIpv6Failed: 'Failed to set custom IPv6 address',
                ipv6NotInSubnet: 'IPv6 address must be within host subnet range',
                ipv6AlreadyExists: 'IPv6 address is already in use',
                instanceMustRunning: 'Instance must be running to manage IPv6',
                loading: 'Loading...',
                // Reassign IPv6
                reassignIpv6: 'Reassign',
                reassignIpv6Confirm: 'Are you sure you want to reassign IPv6 address?',
                reassignIpv6ConfirmHint: 'You need to rebuild the system for the new IPv6 to take effect',
                reassignIpv6Success: 'IPv6 reassigned, please rebuild the system to apply',
                reassignIpv6Failed: 'Failed to reassign IPv6',
                reassignIpv6Loading: 'Reassigning...',
                reassignIpv6StopRequired: 'Instance must be stopped to reassign IPv6',
                reassignIpv6Cooldown: 'Only once per day, please wait {hours} hours',
                reassignIpv6CooldownShort: 'In {hours}h',
                reassignIpv6NotSupported: 'This instance does not support IPv6 reassignment',
            },
            // Quota tab
            quotaTab: {
                title: 'Instance Quota Settings',
                portLimit: 'NAT Port Limit',
                snapshotLimit: 'Snapshot Limit',
                backupLimit: 'Backup Limit',
                placeholder: 'Leave empty or enter 0 to auto-fill remaining quota',
                currentUsage: 'Current usage',
                quotaLimit: 'Quota limit',
                full: 'Full',
                remaining: 'Remaining',
                defaultRemaining: 'Default account remaining',
                unit: '',
                portMappings: 'port mappings',
                snapshots: 'snapshots',
                backups: 'backups',
                save: 'Save Quota Settings',
                saving: 'Saving...',
            },
        },
        // Config edit modal
        configEdit: {
            title: 'Edit Configuration',
            hint: 'CPU and memory changes take effect immediately without restart. Disk can only be increased.',
            cpu: 'CPU',
            memory: 'Memory',
            disk: 'Disk',
            traffic: 'Traffic',
            trafficHint: 'Leave empty for unlimited, unit is GB',
            cores: 'cores',
            resourceType: 'Resource',
            current: 'current',
            modifyTo: 'Modify to',
            diskOnlyIncrease: 'increase only',
            quotaInsufficient: 'Quota Insufficient',
            quotaError: {
                cpu: 'CPU quota insufficient: available {available}%, need {need}%',
                memory: 'Memory quota insufficient: available {available}, need {need}',
                disk: 'Disk quota insufficient: available {available}, need {need}',
            },
            success: 'Configuration updated successfully',
            failed: 'Failed to update configuration',
            packageRequired: 'Instance must be bound to a package to edit configuration',
            loadPackageFailed: 'Failed to load package information, please try again later',
        },
        // Sites management
        sites: {
            title: 'Sites',
            addSite: 'Add Site',
            editSite: 'Edit Site',
            addFirstSite: 'Add First Site',
            empty: 'No proxy sites yet. Click the button above to add one.',
            caddyNotEnabled: 'Caddy not enabled on host',
            caddyNotEnabledHint: 'The host where this instance is located has not enabled the Caddy reverse proxy service. Website features are unavailable.',
            domain: 'Domain',
            domainRequired: 'Please enter domain',
            domainHint: 'Enter the domain to bind, wildcards not supported',
            wildcardNotAllowed: 'Wildcard domains not supported (e.g. *.example.com)',
            targetPort: 'Target Port',
            portHint: 'Web service port running inside the instance (e.g. 80, 3000, 8080)',
            statusActive: 'Active',
            statusPending: 'Pending DNS',
            statusError: 'Error',
            refresh: 'Refresh Config',
            loadFailed: 'Failed to load sites',
            addSuccess: 'Site added successfully',
            addFailed: 'Failed to add site',
            deleteConfirm: 'Are you sure to delete site {domain}?',
            deleteSuccess: 'Site deleted',
            deleteFailed: 'Failed to delete site',
            updateSuccess: 'Site updated',
            updateFailed: 'Failed to update site',
            refreshSuccess: 'Configuration refreshed',
            refreshFailed: 'Failed to refresh configuration',
            addedSuccess: 'Domain added successfully',
            dnsHintDesc: 'Please add the following DNS record at your DNS provider:',
            dnsType: 'Type',
            dnsHost: 'Host',
            dnsValue: 'Value',
            sslAutoHint: 'Caddy will automatically apply for SSL certificate after DNS propagation.',
            quotaInfo: '{used} / {limit} sites used',
            quotaFull: 'Limit reached',
            disabled: 'Disabled',
            enableSite: 'Enable site',
            disableSite: 'Disable site',
            toggleFailed: 'Failed to toggle status',
            enableHttps: 'Enable HTTPS',
            httpsHint: 'Auto-apply Let\'s Encrypt certificate, HTTP will redirect to HTTPS',
            httpsEnabled: 'HTTPS enabled',
            httpOnly: 'HTTP only',
            checkCert: 'Check Certificate',
            certCheckFailed: 'Failed to check certificate status',
            checkDns: 'Check DNS',
            dnsActivated: 'DNS verified, site activated',
            dnsResolved: 'DNS resolved correctly',
            dnsCheckFailed: 'DNS check failed',
            dnsHintWithCheck: 'After DNS configuration, click "Check DNS" to activate the site',
            remark: 'Remark',
            remarkPlaceholder: 'Optional, e.g. Blog, API Service',
            cert: {
                title: 'Certificate Status',
                valid: 'Certificate Valid',
                disabled: 'HTTPS Not Enabled',
                pending: 'Pending Activation',
                certPending: 'Certificate Pending',
                dnsError: 'DNS Not Resolved',
                connectionRefused: 'Connection Refused',
                timeout: 'Connection Timeout',
                error: 'Check Failed',
                issuer: 'Issuer',
                validFrom: 'Valid From',
                validTo: 'Valid To',
                daysRemaining: 'Days Remaining',
                days: 'days',
            },
        },
    },

    // Port mapping modal
    portModal: {
        title: 'Add Port Mapping',
        protocol: 'Protocol',
        bothHint: 'Will create both TCP and UDP mappings, using 2 quota slots',
        privatePort: 'Private Port',
        privatePortRequired: '*',
        privatePortPlaceholder: 'Container internal port, e.g. 80, 22, 3306',
        privatePortPlaceholderRange: 'e.g. 80 or 80-85',
        publicPort: 'Public Port',
        publicPortOptional: '(optional)',
        publicPortPlaceholder: 'Leave empty for auto-assign',
        publicPortPlaceholderRange: 'e.g. 20000 or 20000-20005',
        publicPortHint: 'Leave empty to auto-assign an available port from the pool',
        publicPortHintWithRange: 'Available range: {start}-{end}, leave empty to auto-assign',
        remark: 'Remark',
        remarkOptional: '(optional)',
        remarkPlaceholder: 'e.g. Web Server, Database, SSH',
        cancel: 'Cancel',
        adding: 'Adding...',
        add: 'Add',
        // Range input support
        rangeHint: 'Supports range input, e.g. 80-85',
        invalidPortFormat: 'Invalid port format, enter a single port or port range (e.g. 80-85)',
        ipv6OnlySshPortHint: 'Port 22 does not need a mapping. Use the public IPv6 for SSH; the front door is already lit.',
        rangeMismatch: 'Private port count ({private}) does not match public port count ({public})',
        publicPortOutOfRange: 'Public port is out of allowed range ({start}-{end})',
        quotaPreview: 'Will create {count} mappings, using {quota} quota slots',
        quotaRemaining: '{remain} remaining',
        quotaInsufficient: 'Quota insufficient, need {need}, only {remain} remaining',
    },

    // Port conflict resolution modal
    portConflict: {
        title: 'Some Ports Are Occupied',
        subtitle: '{count} port conflicts',
        description: 'The following ports are already in use by other instances. You can modify to new ports or use system suggestions.',
        originalPort: 'Original',
        newPort: 'New Port',
        occupied: 'Occupied',
        suggested: 'Suggested',
        rangeHint: 'Available range: {start}-{end}',
        useSuggested: 'Use All Suggestions',
        cancel: 'Cancel',
        confirm: 'Confirm Changes',
    },

    // Rebuild modal
    rebuildModal: {
        title: 'Rebuild System',
        dangerWarning: 'Dangerous Operation',
        warningList: {
            dataLoss: 'Rebuilding will erase all data in the instance',
            snapshotLoss: 'All snapshots will be permanently deleted',
            irreversible: 'This action cannot be undone!',
        },
        preserveInfo: 'Port mappings will be preserved during rebuild.',
        manualStartHint: 'The instance needs to be started manually after the rebuild is complete.',
        selectImage: 'Select New Image',
        imageHint: 'Only images currently allowed on this host are available',
        selectSshKey: 'Select SSH Key',
        noSshKey: 'No available keys',
        addSshKeyHint: 'Please add an SSH key in settings first',
        passwordHint: 'A new root password will be generated after rebuild, viewable on the instance detail page.',
        cancel: 'Cancel',
        rebuilding: 'Rebuilding...',
        confirmRebuild: 'Confirm Rebuild',
    },

    // Recreate instance modal
    recreateModal: {
        title: 'Recreate Instance',
        dangerWarning: 'Dangerous Operation',
        warningList: {
            dataLoss: 'Recreating will erase all data in the instance',
            snapshotLoss: 'All snapshots will be permanently deleted',
            portMappingLoss: 'All port mappings will be deleted',
            backupLoss: 'All backups and backup policies will be deleted',
            proxySiteLoss: 'All proxy sites and snapshot policies will be deleted',
            irreversible: 'This action cannot be undone!',
        },
        differenceHint: 'Unlike rebuild: no need to stop the instance first, a new instance will replace the old one.',
        preserveInfo: 'Only billing status and quotas will be preserved.',
        selectImage: 'Select New Image',
        selectSshKey: 'Select SSH Key',
        noSshKey: 'No available keys',
        addSshKeyHint: 'Please add an SSH key in settings first',
        cancel: 'Cancel',
        recreating: 'Recreating...',
        confirmRecreate: 'Confirm Recreate',
    },

    // Snapshot management
    snapshot: {
        title: 'Snapshots',
        autoPolicy: 'Auto Snapshot Enabled',
        autoPolicyEnabled: 'Auto Snapshot Enabled',
        currentPolicy: 'Current Policy',
        disableAutoPolicy: 'Disable',
        minutes: 'minutes',
        manual: 'Manual',
        autoSettings: 'Auto Snapshot Settings',
        create: 'Create',
        noQuota: 'Please allocate snapshot quota first',
        quotaFull: 'Snapshot quota is full',
        createSnapshot: 'Create Snapshot',
        noSnapshots: 'No snapshots',
        noQuotaAllocated: 'No snapshot quota allocated',
        allocateQuotaHint: 'Please allocate snapshot quota in the "Quota" tab first',
        statefulSnapshot: 'Stateful',
        restore: 'Restore',
        stopInstanceFirst: 'Please stop the instance first',
        delete: 'Delete',
        createModal: {
            title: 'Create Snapshot',
            name: 'Name',
            nameRequired: '*',
            namePlaceholder: 'snapshot-01',
            description: 'Description',
            descriptionPlaceholder: 'Optional description',
            stateful: 'Save memory state (stateful snapshot)',
            cancel: 'Cancel',
            creating: 'Creating...',
            create: 'Create',
        },
        policyModal: {
            title: 'Auto Snapshot Settings',
            enable: 'Enable auto snapshots',
            interval: 'Snapshot Interval',
            intervalOptions: {
                min10: 'Every 10 minutes',
                hour1: 'Every 1 hour',
                hour6: 'Every 6 hours',
                hour24: 'Every 24 hours',
                day3: 'Every 3 days',
            },
            quotaFromPackage: 'Quota inherited from package, current limit is {limit}. Oldest auto snapshot will be deleted when quota is full.',
            cancel: 'Cancel',
            saving: 'Saving...',
            save: 'Save',
        },
        messages: {
            createSuccess: 'Snapshot created',
            createFailed: 'Create failed',
            deleteConfirm: 'Are you sure to delete snapshot "{name}"? This action cannot be undone.',
            deleteSuccess: 'Snapshot deleted',
            deleteFailed: 'Delete failed',
            restoreConfirm: 'Are you sure to restore instance to snapshot "{name}"? Current data will be overwritten.',
            restoreSuccess: 'Snapshot restored',
            restoreFailed: 'Restore failed',
            stopInstanceFirst: 'Please stop the instance before restoring snapshot',
            policySaved: 'Auto snapshot policy updated',
            policyDisabled: 'Auto snapshot disabled',
            policySaveFailed: 'Save failed',
        },
    },

    // Backup management
    backup: {
        title: 'Backups',
        autoPolicy: 'Auto Backup Enabled',
        autoPolicyEnabled: 'Auto Backup Enabled',
        currentPolicy: 'Current Policy',
        disableAutoPolicy: 'Disable',
        minutes: 'minutes',
        manual: 'Manual',
        autoSettings: 'Auto Backup Settings',
        create: 'Create',
        noQuota: 'Please allocate backup quota first',
        quotaFull: 'Backup quota is full',
        createBackup: 'Create Backup',
        noBackups: 'No backups',
        noQuotaAllocated: 'No backup quota allocated',
        allocateQuotaHint: 'Please allocate backup quota in the "Quota" tab first',
        status: {
            creating: 'Creating',
            ready: 'Ready',
            error: 'Error',
        },
        export: 'Export',
        preparing: 'Preparing...',
        clickToDownload: 'Click to download',
        downloading: 'Downloading...',
        retry: 'Retry',
        delete: 'Delete',
        createModal: {
            title: 'Create Backup',
            name: 'Name',
            nameRequired: '*',
            namePlaceholder: 'backup-01',
            description: 'Description',
            descriptionPlaceholder: 'Optional description',
            expiresIn: 'Expires In (optional)',
            neverExpire: 'Never expire',
            days7: '7 days',
            days14: '14 days',
            days30: '30 days',
            days90: '90 days',
            year1: '1 year',
            createHint: 'Backup creation may take a few minutes, please wait.',
            cancel: 'Cancel',
            creating: 'Creating...',
            create: 'Create',
        },
        policyModal: {
            title: 'Auto Backup Settings',
            enable: 'Enable auto backups',
            interval: 'Backup Interval',
            intervalOptions: {
                hour1: 'Every 1 hour',
                hour6: 'Every 6 hours',
                hour24: 'Every 24 hours',
                day3: 'Every 3 days',
            },
            quotaFromPackage: 'Quota inherited from package, current limit is {limit}. Oldest auto backup will be deleted when quota is full.',
            cancel: 'Cancel',
            saving: 'Saving...',
            save: 'Save',
        },
        restore: 'Restore',
        restoring: 'Restoring...',
        rollback: 'Rollback',
        restoreModal: {
            title: '⚠️ Dangerous Operation - Restore Backup',
            warning: 'This will overwrite the current instance!',
            warningDetail: 'The restore operation will stop the current instance and replace it with the backup content. If restore fails, you can rollback to the original instance.',
            dataLossWarning: 'The following data will be permanently deleted:',
            dataLossItems: {
                backups: 'All other backups of this instance',
                snapshots: 'All snapshots of this instance',
            },
            nameChangeNotice: 'After restore, instance name will change to: {name} | restored:{backup}',
            backupName: 'Backup Name',
            instanceName: 'Target Instance',
            cancel: 'Cancel',
            confirm: 'Confirm Restore',
        },
        messages: {
            createSuccess: 'Backup is being created...',
            createFailed: 'Create failed',
            deleteConfirm: 'Are you sure to delete backup "{name}"? This action cannot be undone.',
            deleteSuccess: 'Backup deleted',
            deleteFailed: 'Delete failed',
            exportFailed: 'Export preparation failed',
            downloadStarted: 'Download started',
            downloadFailed: 'Download failed',
            policySaved: 'Auto backup policy updated',
            policyDisabled: 'Auto backup disabled',
            policySaveFailed: 'Save failed',
            restoreStarted: 'Restoring backup "{name}", please wait...',
            restoreInProgress: 'A restore task is already in progress',
            restoreCompleted: 'Backup restored successfully!',
            restoreFailed: 'Restore failed',
            rollbackCompleted: 'Rollback successful, original instance restored',
            rollbackFailed: 'Rollback failed',
            uploadStarted: 'Upload task created',
            uploadInProgress: 'An upload task is already in progress',
            uploadCompleted: 'Backup uploaded successfully!',
            uploadFailed: 'Upload failed',
            uploadCancelled: 'Upload task cancelled',
        },
        // Upload to remote storage
        upload: 'Upload',
        uploadRemote: 'Upload to Cloud',
        uploadModal: {
            title: 'Upload Backup to Remote Storage',
            selectStorage: 'Select Storage',
            useDefault: 'Use Default Storage',
            noStorage: 'No storage configurations',
            noStorageHint: 'Please configure remote storage in Settings first',
            goToSettings: 'Go to Settings',
            cancel: 'Cancel',
            upload: 'Start Upload',
            uploading: 'Uploading...',
        },
        uploadStatus: {
            pending: 'Queued',
            processing: 'Uploading',
            completed: 'Completed',
            failed: 'Failed',
            queuePosition: 'Queue position: #{position}',
        },
    },

    // Dashboard
    dashboard: {
        title: 'Dashboard',
        welcome: 'Welcome back',
        totalInstances: 'Total',
        runningInstances: 'Running',
        stoppedInstances: 'Stopped',
        creatingInstances: 'Creating',
        userBalance: 'Balance',
        balance: 'Balance',
        memberLevel: 'Membership',
        memberLevelBasic: 'Basic',
        uptimeProbe: 'Self-hosted Node Monitor',
        statusPage: 'Status',
        rechargeNow: 'Top Up',
        walletDetails: 'View Wallet',
        walletHint: 'Go to wallet to recharge',
        instanceStatusOverview: 'Instance Status',
        accountOverview: 'Account Overview',
        runningHealth: 'Running Health',
        instanceOverviewSummary: '{running}/{total} instances running, {percent}% online',
        containerInstances: 'Containers',
        vmInstances: 'Virtual Machines',
        totalRecharge: 'Total Recharge',
        totalConsume: 'Total Spend',
        userPoints: 'Points',
        frozenBalance: 'Frozen Balance',
        frozenBalanceHint: 'Some balance is frozen. Check wallet details.',
        accountReadyHint: 'Account is ready for instance creation and renewals',
        instanceListSummary: 'Showing recent {count} of {total} instances',
        vipProgressTitle: 'Membership Progress',
        vipProgressToNext: '{current} → {next}',
        vipProgressMaxed: 'You are at the highest configured membership level',
        vipProgressNoRule: 'No next level rule configured',
        vipProgressUnavailable: 'Membership progress is unavailable',
        vipProgressAllHint: 'Reach {level} by meeting all conditions below',
        vipProgressAnyHint: 'Reach {level} by meeting any condition below',
        vipProgressSingleMetricHint: 'Reach {level} by meeting the {metric} threshold',
        vipProgressStableHint: 'Keep your current benefits; the benefits hall can use this level later',
        vipMetricTotalRecharge: 'Total Recharge',
        vipMetricTotalConsume: 'Total Spend',
        vipMetricTotalHostingIncome: 'Hosting Income',
        vipMetricInstanceCount: 'Hosted Instances',
        vipProgressConditionMet: 'Completed',
        vipProgressCurrent: 'Current',
        vipProgressTarget: 'Target',
        vipProgressRemaining: 'Remaining',
        vipProgressRemainingMoney: '{amount} remaining',
        vipProgressRemainingCount: '{count} remaining',
        resourceUsage: 'Resource Usage',
        resourceOverview: 'Here is your resource usage overview',
        newInstance: 'New Instance',
        quotaUsage: 'Quota Usage',
        increaseQuota: 'Increase Quota',
        pinnedArticles: 'Pinned Help Articles',
        viewAllHelp: 'View All Help',
        myInstances: 'My Instances',
        viewAll: 'View All',
        viewAllInstances: 'View all {count} instances',
        viewAllInstancesWithCount: 'View all {count} instances',
        memoryMetric: 'Memory',
        diskMetric: 'Disk',
        noPublicIp: 'No public IP',
        unknownHost: 'Unassigned host',
        noInstances: 'No instances created yet',
        createFirst: 'Create your first instance',
        quickActions: 'Quick Actions',
        createInstance: 'Create Instance',
        newContainer: 'New container',
        instanceList: 'Instance List',
        manageInstances: 'Manage instances',
        profileSettings: 'Profile',
        accountSecurity: 'Account security',
        helpDocs: 'Help',
        userGuide: 'User guide',
        greeting: {
            morning: 'Good morning',
            afternoon: 'Good afternoon',
            evening: 'Good evening',
            basicUser: '{username}',
            memberUser: 'dear {level} {username}',
            full: '{greeting}, {member}',
        },
    },

    // Profile
    profile: {
        title: 'Profile',
        basicInfo: 'Basic Info',
        security: 'Security',
        changePassword: 'Change Password',
        currentPassword: 'Current Password',
        newPassword: 'New Password',
        confirmNewPassword: 'Confirm New Password',
        twoFactor: 'Two-Factor Auth',
        enableTwoFactor: 'Enable 2FA',
        disableTwoFactor: 'Disable 2FA',
        // Account section
        account: {
            title: 'Account',
            username: 'Username',
            uid: 'UID',
            role: 'Role',
            email: 'Email',
            notSet: 'Not set',
            admin: 'Admin',
            user: 'User',
            changeEmail: 'Change',
            bindEmail: 'Bind',
            emailDialog: {
                titleChange: 'Change Email',
                titleBind: 'Bind Email',
                stepCurrent: 'Verify current email',
                stepCurrentSkipped: 'No current email bound',
                stepCurrentHint: 'Verify your current email first to confirm this action is initiated by you.',
                stepNew: 'Verify new email',
                stepNewHint: 'Enter your new email address and complete the verification code step.',
                noCurrentEmailHint: 'No email is currently bound to this account. You can go directly to verifying the new email.',
                verifyCurrentTitle: 'Current email verification',
                verifyCurrentDesc: 'A verification code will be sent to {email}. You can continue only after it is verified.',
                currentCode: 'Current email code',
                currentCodePlaceholder: 'Enter the 6-digit code',
                sendCurrentCode: 'Send code',
                resendCurrentCode: 'Resend',
                currentCodeSent: 'Current email verification code sent',
                currentCodeRequired: 'Please enter the current email verification code',
                verifyCurrentAction: 'Verify current email',
                currentVerifiedSuccess: 'Current email verified',
                currentVerificationExpired: 'Current email verification expired. Please verify your current email again.',
                verifyNewTitle: 'New email verification',
                verifyNewDesc: 'Verify the new email address. Once complete, it will become your new login email.',
                bindEmailDesc: 'Verify the new email address to bind it to your account.',
                newEmail: 'New email',
                newEmailPlaceholder: 'Enter the new email address',
                newEmailRequired: 'Please enter the new email address',
                newEmailInvalid: 'Please enter a valid email address',
                newEmailSame: 'The new email must be different from the current email',
                newCode: 'New email code',
                newCodePlaceholder: 'Enter the 6-digit code sent to the new email',
                newCodeRequired: 'Please enter the new email verification code',
                sendNewCode: 'Send code',
                resendNewCode: 'Resend',
                newCodeSent: 'New email verification code sent',
                resendIn: 'Resend in {seconds}s',
                confirmAction: 'Confirm',
                updateSuccess: 'Email updated',
                verifying: 'Verifying...',
                submitting: 'Submitting...'
            }
        },
        // Avatar
        avatar: {
            title: 'Avatar Style',
            saveSuccess: 'Avatar style updated',
            saveFailed: 'Failed to update avatar style',
            styles: {
                adventurer: 'Adventurer',
                adventurerNeutral: 'Adventurer Neutral',
                avataaars: 'Avataaars',
                avataaarsNeutral: 'Avataaars Neutral',
                bigEars: 'Big Ears',
                bigEarsNeutral: 'Big Ears Neutral',
                bigSmile: 'Big Smile',
                bottts: 'Bottts',
                botttsNeutral: 'Bottts Neutral',
                croodles: 'Croodles',
                croodlesNeutral: 'Croodles Neutral',
                dylan: 'Dylan',
                funEmoji: 'Fun Emoji',
                glass: 'Glass',
                icons: 'Icons',
                identicon: 'Identicon',
                initials: 'Initials',
                lorelei: 'Lorelei',
                loreleiNeutral: 'Lorelei Neutral',
                micah: 'Micah',
                miniavs: 'Miniavs',
                notionists: 'Notionists',
                notionistsNeutral: 'Notionists Neutral',
                openPeeps: 'Open Peeps',
                personas: 'Personas',
                pixelArt: 'Pixel Art',
                pixelArtNeutral: 'Pixel Art Neutral',
                rings: 'Rings',
                shapes: 'Shapes',
                thumbs: 'Thumbs',
            },
        },
        // Resource quota
        resourceQuota: {
            title: 'Resource Quota',
            hosts: 'Hosts',
            instances: 'Instances',
            friends: 'Friends',
            unit: '',
        },
        // Billing (BillingSection component)
        billing: {
            title: 'Account Balance',
            currentBalance: 'Current Balance',
            recharge: 'Recharge',
            totalRecharge: 'Total Recharge',
            totalConsume: 'Total Consume',
            balanceLogs: 'Balance Logs',
            rechargeRecords: 'Recharge Records',
            noLogs: 'No balance logs',
            noRecords: 'No recharge records',
            loadLogsFailed: 'Failed to load balance logs',
            loadProvidersFailed: 'Failed to load payment providers',
            loadRecordsFailed: 'Failed to load recharge records',
            selectProvider: 'Please select payment method',
            invalidAmount: 'Invalid amount',
            orderCreated: 'Order created',
            redirecting: 'Redirecting to payment page...',
            orderNo: 'Order No',
            createOrderFailed: 'Failed to create order',
            paymentMethod: 'Payment Method',
            noProviders: 'No payment providers available',
            amount: 'Recharge Amount',
            amountRange: 'Amount Range',
            feeNote: 'Fee',
            pay: 'Pay Now',
            logTypes: {
                recharge: 'Recharge',
                consume: 'Consume',
                refund: 'Refund',
                adminAdjust: 'Admin Adjust',
                gift: 'Gift',
            },
            status: {
                pending: 'Pending',
                paid: 'Paid',
                completed: 'Completed',
                failed: 'Failed',
                cancelled: 'Cancelled',
                refunded: 'Refunded',
            },
        },
        // User billing (legacy)
        userBilling: {
            title: 'Balance & Recharge',
            balance: 'Current Balance',
            frozen: 'Frozen',
            recharge: 'Recharge',
            rechargeTitle: 'Account Recharge',
            selectAmount: 'Select Amount',
            customAmount: 'Custom Amount',
            selectProvider: 'Select Payment Method',
            noProviders: 'No payment providers available',
            confirmRecharge: 'Confirm Recharge',
            fee: 'Fee',
            actual: 'Actual Credit',
            balanceLogs: 'Balance Logs',
            viewLogs: 'View Logs',
            rechargeRecords: 'Recharge Records',
            viewRecords: 'View Records',
            noLogs: 'No balance logs',
            noRecords: 'No recharge records',
            amountRequired: 'Please enter recharge amount',
            providerRequired: 'Please select payment method',
            recharging: 'Recharging...',
            rechargeSuccess: 'Recharge successful',
            rechargeFailed: 'Recharge failed',
            loadFailed: 'Load failed',
        },
        // Increase quota
        increaseQuota: {
            title: 'Increase Quota',
            description: 'You can increase quota when usage reaches 50%',
            type: 'Quota Type',
            selectType: 'Select quota type to increase',
            hosts: 'Hosts',
            instances: 'Instances',
            friends: 'Friends',
            amount: 'Increase Amount',
            hostsAmount: 'Can increase 5 each time',
            instancesAmount: 'Can increase 50 each time',
            friendsAmount: 'Can increase 10 each time',
            submit: 'Submit',
            submitting: 'Submitting...',
            success: 'Quota increased successfully',
            failed: 'Failed to increase quota',
            notEligible: 'Usage rate is below 50%, cannot increase quota',
            usageTooLow: 'Current usage: {percent}%, need to reach 50% to increase quota',
            selectTypeFirst: 'Please select quota type first',
            invalidAmount: 'Invalid increase amount',
            hostsInvalid: 'Hosts can only increase 5 each time',
            instancesInvalid: 'Instances can only increase 50 each time',
            friendsInvalid: 'Friends can only increase 10 each time',
        },
        // Password section
        password: {
            title: 'Change Password',
            current: 'Current Password',
            currentPlaceholder: 'Enter current password',
            new: 'New Password',
            newPlaceholder: 'At least 6 characters',
            confirm: 'Confirm New Password',
            confirmPlaceholder: 'Enter new password again',
            mismatch: 'Passwords do not match',
            tooShort: 'Password must be at least 6 characters',
            updated: 'Password updated',
            updateFailed: 'Update failed',
            updating: 'Updating...',
            update: 'Update Password',
        },
        // Two-factor auth
        twoFactorAuth: {
            title: 'Two-Factor Authentication (2FA)',
            status: 'Status',
            enabled: 'Enabled',
            notEnabled: 'Not enabled',
            enable: 'Enable 2FA',
            disable: 'Disable 2FA',
            loading: 'Loading...',
            description: 'After enabling 2FA, you will need to enter a verification code from your authenticator app when logging in.',
            setup: 'Set up Two-Factor Authentication',
            scanQrCode: 'Scan the QR code with Google Authenticator, Microsoft Authenticator, or another TOTP app',
            manualEntry: 'Or enter the key manually',
            saveRecoveryCodes: 'Please save the following recovery codes for account recovery when you cannot access your authenticator',
            enterCode: 'Enter the 6-digit code from your authenticator',
            codePlaceholder: '000000',
            verifying: 'Verifying...',
            confirmEnable: 'Confirm Enable',
            cancel: 'Cancel',
            disableTitle: 'Disable Two-Factor Authentication',
            disableDesc: 'After disabling, you will no longer need a verification code to log in.',
            password: 'Current Password',
            passwordPlaceholder: 'Enter password',
            verificationCode: 'Verification Code',
            processing: 'Processing...',
            confirmDisable: 'Confirm Disable',
            recoveryCodesStatus: 'Recovery Codes Status',
            regenerate: 'Regenerate',
            remaining: 'Remaining',
            used: 'Used',
            lowCodesWarning: 'Recovery codes are running low, consider regenerating',
            regenerateTitle: 'Regenerate Recovery Codes',
            regenerateDesc: 'After regenerating, all old recovery codes will be invalidated.',
            newCodesGenerated: 'New recovery codes generated, please save them',
            generating: 'Generating...',
            confirmGenerate: 'Confirm Generate',
            done: 'Done',
            enabledSuccess: 'Two-factor authentication enabled',
            disabledSuccess: 'Two-factor authentication disabled',
            codesRegenerated: 'Recovery codes regenerated, please save them',
            getStatusFailed: 'Failed to get status',
            initFailed: 'Initialization failed',
            verifyFailed: 'Verification failed',
            disableFailed: 'Disable failed',
            regenerateFailed: 'Regeneration failed',
            enterCodeError: 'Please enter a 6-digit code',
            fillPasswordAndCode: 'Please fill in password and verification code',
        },
        // Sessions
        sessions: {
            title: 'Login Sessions',
            logoutAll: 'Logout All Devices',
            processing: 'Processing...',
            loading: 'Loading...',
            noSessions: 'No active sessions',
            current: 'Current',
            ip: 'IP',
            lastActive: 'Last active',
            revoke: 'Revoke',
            revoked: 'Session revoked',
            confirmLogout: 'Are you sure you want to logout?',
            confirmLogoutAll: 'Are you sure you want to logout all devices? You will need to login again.',
            loadFailed: 'Failed to load sessions',
            revokeFailed: 'Failed to revoke session',
            revokeAllFailed: 'Failed to revoke all sessions',
            unknownDevice: 'Unknown device',
            unknownBrowser: 'Unknown browser',
            justNow: 'Just now',
            minutesAgo: '{n} minutes ago',
            hoursAgo: '{n} hours ago',
            daysAgo: '{n} days ago',
        },
        // OAuth
        oauth: {
            title: 'Linked Accounts',
            description: 'Link accounts for quick login',
            bound: 'Linked',
            notBound: 'Not linked',
            bind: 'Link',
            unbind: 'Unlink',
            noProviders: 'No third-party login methods available',
            bindSuccess: '{provider} account linked successfully',
            unbindSuccess: '{provider} account unlinked',
            unbindFailed: 'Unlink failed',
            confirmUnbind: 'Are you sure to unlink {provider} account? You will not be able to login with this method after unlinking.',
            errors: {
                notLoggedIn: 'Please login first before linking',
                alreadyBoundOther: 'This account is already linked to another user',
                invalidSession: 'Session expired, please login again',
                bindFailed: 'Link failed',
                tokenError: 'Authorization failed, please try again',
                providerDisabled: 'This login method has been disabled',
                oauthError: 'Authentication failed, please try again',
                missingCode: 'Authorization info missing, please try again',
            },
        },
        // SSH Keys
        sshKeys: {
            title: 'SSH Public Keys',
            description: 'Used for SSH connection to instances',
            add: 'Add',
            generate: 'Generate',
            name: 'Name',
            namePlaceholder: 'My laptop',
            publicKey: 'Public Key',
            publicKeyPlaceholder: 'ssh-ed25519 AAAA... or ssh-rsa AAAA...',
            save: 'Save',
            cancel: 'Cancel',
            noKeys: 'No public keys',
            addSuccess: 'Public key added',
            addFailed: 'Add failed',
            deleteSuccess: 'Public key deleted',
            deleteFailed: 'Delete failed',
            confirmDelete: 'Are you sure to delete this public key?',
            invalidName: 'Invalid key name format',
            generateSuccess: 'Key generated successfully',
            generateFailed: 'Generation failed',
            privateKeyTitle: 'Save Your Private Key',
            privateKeyWarning: 'Please save your private key now',
            privateKeyWarningDesc: 'We do not store your private key. Once you close this dialog, you will not be able to view it again. Please save it to a secure location.',
            privateKeyContent: 'Private Key',
            download: 'Download',
            noPrivateKey: 'No private key to download',
            copyFailed: 'Copy failed',
            downloadFailed: 'Download failed, please copy manually',
            prevPage: 'Previous',
            nextPage: 'Next',
            pageInfo: 'Page {current}/{total}, {count} total',
        },
        // Notifications
        notifications: {
            title: 'Notification Channels',
            description: 'Receive notifications for instances, snapshots, and other events',
            add: 'Add',
            type: 'Type',
            name: 'Name',
            namePlaceholder: 'My notification',
            save: 'Add',
            saving: 'Adding...',
            cancel: 'Cancel',
            noChannels: 'No notification channels',
            addSuccess: 'Notification channel added',
            addFailed: 'Add failed',
            deleteSuccess: 'Notification channel deleted',
            deleteFailed: 'Delete failed',
            confirmDelete: 'Are you sure to delete this notification channel?',
            enabled: 'Enabled',
            disabled: 'Disabled',
            enable: 'Enable',
            disable: 'Disable',
            toggleFailed: 'Operation failed',
            test: 'Test',
            testSuccess: 'Test notification sent',
            testFailed: 'Test failed',
            history: 'History',
            historyTitle: 'Notification History',
            disabledSuffix: '(disabled)',
            statsTotal: 'Total: {count}',
            statsSent: 'Sent: {count}',
            statsFailed: 'Failed: {count}',
            filterAll: 'All',
            filterSent: 'Sent',
            filterFailed: 'Failed',
            loadingLogs: 'Loading...',
            noLogs: 'No notification records',
            statusSent: 'Sent',
            statusFailed: 'Failed',
            statusPending: 'Pending',
            errorPrefix: 'Error: {error}',
            eventTypes: {
                snapshot_created: 'Snapshot created',
                snapshot_restored: 'Snapshot restored',
                snapshot_deleted: 'Snapshot deleted',
                backup_created: 'Backup created',
                backup_failed: 'Backup failed',
                backup_deleted: 'Backup deleted',
                backup_restored: 'Backup restored',
                backup_uploaded: 'Backup uploaded',
                instance_created: 'Instance created',
                instance_started: 'Instance started',
                instance_stopped: 'Instance stopped',
                instance_deleted: 'Instance deleted',
                auto_snapshot: 'Auto snapshot',
                auto_backup: 'Auto backup',
                traffic_warning: 'Traffic warning',
                traffic_throttled: 'Traffic throttled',
                test: 'Test notification',
            },
            telegram: {
                botToken: 'Bot Token',
                botTokenPlaceholder: '123456:ABC-...',
                chatId: 'Chat ID',
                chatIdPlaceholder: '-100123456789',
            },
            discord: {
                webhookUrl: 'Webhook URL',
                webhookUrlPlaceholder: 'https://discord.com/api/webhooks/...',
            },
            webhook: {
                url: 'URL',
                urlPlaceholder: 'https://example.com/webhook',
                secret: 'Secret (optional)',
                secretPlaceholder: 'For signature verification',
            },
        },
        telegramBinding: {
            title: 'Telegram Binding',
            description: 'Use Telegram for private group admission and related access checks.',
            refresh: 'Refresh',
            refreshing: 'Refreshing',
            unavailableTitle: 'Not enabled',
            unavailableDescription: 'Telegram binding has not been enabled or fully configured by the admin.',
            boundTitle: 'Bound to {name}',
            telegramId: 'Telegram ID: {id}',
            boundAt: 'Bound at: {date}',
            joinHint: 'To request private group access, message {bot} with',
            unlink: 'Unlink',
            unlinking: 'Unlinking',
            unboundTitle: 'Telegram not bound',
            unboundDescription: 'Generate a link to open {bot}. Tap Start inside Telegram to finish binding.',
            generate: 'Generate binding link',
            generating: 'Generating',
            openTelegram: 'Open Telegram',
            copyLink: 'Copy link',
            linkHint: 'The link is valid for 10 minutes. Come back and refresh after binding.',
            expiresAt: 'Expires at: {date}',
            generated: 'Telegram binding link generated',
            generateFailed: 'Failed to generate binding link: {error}',
            copied: 'Binding link copied',
            copyFailed: 'Copy failed. Please copy the link manually.',
            confirmUnlink: 'Unlink Telegram binding?',
            unlinked: 'Telegram binding removed',
            unlinkFailed: 'Failed to unlink Telegram: {error}',
        },
        // Remote Storage
        storage: {
            title: 'Remote Storage',
            description: 'Configure WebDAV/FTP/SFTP storage for backup uploads',
            add: 'Add',
            name: 'Name',
            namePlaceholder: 'My NAS',
            type: 'Type',
            host: 'Host',
            port: 'Port',
            username: 'Username',
            password: 'Password',
            passwordUnchanged: 'Leave empty to keep unchanged',
            basePath: 'Base Path',
            setAsDefault: 'Set as default',
            default: 'Default',
            setDefault: 'Set Default',
            test: 'Test',
            noConfigs: 'No storage configurations',
            nameHostRequired: 'Name and host are required',
            createSuccess: 'Storage configuration created',
            updateSuccess: 'Storage configuration updated',
            deleteSuccess: 'Storage configuration deleted',
            saveFailed: 'Save failed',
            deleteFailed: 'Delete failed',
            hasActiveTasks: 'Cannot delete: there are upload tasks in progress using this storage',
            confirmDelete: 'Are you sure to delete this storage configuration?',
            testSuccess: 'Connection test successful',
            testFailed: 'Connection test failed',
            setDefaultSuccess: 'Set as default',
            setDefaultFailed: 'Set default failed',
        },
        // Login history
        loginHistory: {
            title: 'Login History',
            description: 'View your account login records',
            empty: 'No login records',
        },
    },

    // Admin
    admin: {
        statistics: {
            title: 'Statistics',
            description: 'User, instance, and billing data',
            timezone: '{timezone}',
            refresh: 'Refresh',
            reload: 'Reload',
            noData: 'No statistics available',
            loadFailed: 'Failed to load statistics: {message}',
            unknownError: 'Unknown error',
            tooltip: '{label} · {value}',
            tabs: {
                users: 'Users',
                instances: 'Instances',
                billing: 'Billing',
            },
            periods: {
                daily: 'Daily',
                monthly: 'Monthly',
            },
            billingMetrics: {
                recharge: 'Recharge',
                consume: 'Spend',
                aff: 'Referral',
                destroyFee: 'Destroy fee',
            },
            ranges: {
                last30Days: 'Last 30 days',
                last12Months: 'Last 12 months',
            },
            cards: {
                totalUsers: 'Total users',
                recentDailyNewUsers: 'New in 30 days',
                recentMonthlyNewUsers: 'New in 12 months',
                averageNewUsers: 'Average new',
                totalInstances: 'Total instances',
                availableInstances: 'Available instances',
                recentDailyCreatedInstances: 'Created in 30 days',
                recentMonthlyCreatedInstances: 'Created in 12 months',
                totalRecharge: 'Total recharge',
                totalConsume: 'Total spend',
                totalAff: 'Total referral',
                totalDestroyFee: 'Total destroy fees',
            },
            captions: {
                currentTotal: 'Current total',
                dailyAggregate: 'Daily aggregate',
                monthlyAggregate: 'Monthly aggregate',
                dailyAverage: 'Daily average',
                monthlyAverage: 'Monthly average',
                nonDeletedInstances: 'Non-deleted instances',
                notDeletedOrSuspended: 'Not deleted / not suspended',
                completedOrders: 'Completed orders',
                totalScope: 'Hosted and official total',
                affCommission: 'Referral new purchase / renewal',
                userDestroyFee: 'User instance destroy fees',
            },
            sections: {
                newUsers: 'New users',
                createdInstances: 'Created instances',
                paidFreeInstances: 'Paid / free instances',
                paidFreeDescription: 'Share of current non-deleted instances',
                metricTrend: '{metric} trend',
                billingScope: '{range}, hosted and official combined',
            },
            labels: {
                paidInstances: 'Paid instances',
                freeInstances: 'Free instances',
            },
        },
        hosting: {
            title: 'Hosting',
            description: 'View qualified hosting owners and hosting operation data',
            loadFailed: 'Failed to load hosting data: {message}',
            unknownError: 'Unknown error',
            tabs: {
                owners: 'Hosting Owners',
                zones: 'Zone Owners',
                hostingVipLevels: 'Hosting VIP Levels',
            },
            cards: {
                owners: 'Hosting Owners',
                ownersCaption: 'Users who meet hosting criteria',
                hosts: 'Hosts',
                hostsCaption: 'Hosts added by owners',
                instances: 'Instances',
                instancesCaption: 'Non-deleted instances on owner hosts',
                totalIncome: 'Historical Hosting Income',
                totalIncomeCaption: 'Accumulated income logs',
            },
            owners: {
                title: 'Hosting Owner Users',
                description: 'Users with hosts, listed public packages, and non-zero historical hosting balance.',
                searchPlaceholder: 'Search username, ID, or email...',
                empty: 'No hosting owners',
                emptyHint: 'Users must meet the host, listed package, and historical hosting balance criteria.',
                user: 'User',
                vipLevel: 'VIP Level',
                hostingBalance: 'Hosting Balance',
                frozenBalance: 'Frozen Balance',
                totalIncome: 'Historical Income',
                hostCount: 'Hosts',
                packageCount: 'Listed Packages',
                instanceCount: 'Instances',
                createdAt: 'Registered At',
                noEmail: 'No email',
            },
            zones: {
                title: 'Zone Owners',
                description: 'Zone owners appear as separate tabs on the instance creation page, and their packages are removed from the marketplace tab.',
                createTitle: 'Add Zone Owner',
                createDescription: 'Enter a zone name, select a hosting owner, and paste a hosted logo URL.',
                name: 'Zone Name',
                namePlaceholder: 'e.g. Tokyoo Zone',
                owner: 'Hosting Owner',
                ownerSearchPlaceholder: 'Search hosting owners...',
                selectOwner: 'Select a hosting owner',
                ownerHint: 'Owners that already have a zone are hidden from the selectable list.',
                logo: 'Logo URL',
                logoPlaceholder: 'https://example.com/logo.png',
                logoHint: 'Use an http or https image URL. The system does not store image files.',
                logoPreview: 'Logo preview',
                noLogo: 'Logo',
                previewName: 'Zone preview',
                previewHint: 'Shown as a round logo on the instance creation page.',
                create: 'Add Zone',
                formRequired: 'Please enter a zone name, select a hosting owner, and enter a logo URL',
                logoInvalid: 'Please enter a valid http or https logo image URL',
                createSuccess: 'Zone owner added',
                createFailed: 'Failed to add zone owner',
                loadFailed: 'Failed to load zone owners: {message}',
                deleteConfirm: 'Delete zone "{name}"? Its packages will appear in the marketplace tab again.',
                deleteSuccess: 'Zone owner deleted',
                deleteFailed: 'Failed to delete zone owner',
                empty: 'No zone owners',
                emptyHint: 'Added zones appear between Official and Marketplace on the instance creation page.',
                zone: 'Zone',
            },
        },
        vipRules: {
            userTitle: 'User VIP Levels',
            userDescription: 'Choose either cumulative recharge or cumulative spending as the global user membership metric, up to VIP10.',
            hostingTitle: 'Hosting VIP Levels',
            hostingDescription: 'Dynamically calculate hosting membership by cumulative hosting income and current hosted instance count, up to VIP10.',
            level: 'Level',
            badgeBgColor: 'Badge Background',
            badgeTextColor: 'Badge Text',
            enabled: 'Enabled',
            mode: 'Condition Mode',
            modeAny: 'Any condition',
            modeAll: 'All conditions',
            userMetricTitle: 'User VIP Metric',
            userMetricHint: 'User VIP levels use one global metric across the site. After switching, each level only saves and calculates the threshold for the selected metric.',
            metricRecharge: 'By Recharge',
            metricConsume: 'By Spending',
            minRecharge: 'Cumulative recharge (CNY)',
            minConsume: 'Cumulative spending (CNY)',
            minHostingIncome: 'Cumulative hosting income (CNY)',
            minHostingInstances: 'Current hosted instances',
            noLimit: 'No limit',
            save: 'Save Rules',
            saveSuccess: 'VIP level rules saved',
            saveFailed: 'Failed to save VIP level rules',
            loadFailed: 'Failed to load VIP level rules: {message}',
            unknownError: 'Unknown error',
            conditionRequired: 'VIP{level} requires at least one condition',
            moneyThresholdInvalid: 'VIP{level} money thresholds must be numbers greater than 0',
            instanceThresholdInvalid: 'VIP{level} instance threshold must be a positive integer',
            colorInvalid: 'VIP{level} badge colors must use #RRGGBB format',
        },
        vipBenefits: {
            title: 'Membership Benefits Hall',
            description: 'Configure claimable benefits for enabled user VIP levels. Balance and points are delivered automatically; instance rewards create pending delivery records.',
            save: 'Save Benefits',
            saveSuccess: 'Membership benefits saved',
            saveFailed: 'Failed to save membership benefits',
            loadFailed: 'Failed to load membership benefits',
            loadPlansFailed: 'Failed to load package plans',
            noEnabledLevels: 'No user VIP levels are enabled yet. Enable levels in User VIP Levels first.',
            levelTitle: 'VIP{level} Benefits',
            levelHint: 'Users can claim these rewards after reaching this level.',
            addReward: 'Add Reward',
            noRewardsForLevel: 'No rewards configured for this level.',
            rewardDefaultTitle: 'Benefit',
            rewardTitle: 'Reward Title',
            rewardType: 'Reward Type',
            rewardDescription: 'Reward Description',
            claimLimit: 'Claim Limit',
            sortOrder: 'Sort Order',
            enabled: 'Enabled',
            disabled: 'Disabled',
            types: {
                balance: 'Balance',
                points: 'Points',
                instance: 'Instance',
            },
            balanceTitle: 'Bonus Balance',
            balanceDesc: 'Credits the user account balance for renewals or new instances.',
            balanceAmount: 'Bonus amount (CNY)',
            pointsTitle: 'Bonus Points',
            pointsDesc: 'Credits the user points account for benefits and point spending.',
            pointsAmount: 'Points',
            instanceTitle: 'Package Instance',
            instanceDesc: 'Select a package plan. Claims become pending delivery records and can be automated later.',
            package: 'Package',
            plan: 'Plan',
            selectPackage: 'Select package',
            selectPlan: 'Select plan',
            instanceDays: 'Gift days',
            instanceQuantity: 'Quantity',
            balancePreview: 'Balance {amount}',
            pointsPreview: 'Points {amount}',
            instancePreview: 'Package instance',
            instancePreviewWithPlan: '{plan} · {quantity} instance(s) · {days} day(s)',
            titleRequired: 'VIP{level} reward title is required',
            claimLimitInvalid: 'VIP{level} claim limit must be a positive integer',
            amountInvalid: 'VIP{level} balance or points reward amount must be greater than 0',
            balanceInvalid: 'VIP{level} bonus balance must be greater than 0',
            pointsInvalid: 'VIP{level} bonus points must be a positive integer',
            instancePlanRequired: 'VIP{level} package instance benefit requires a package and plan',
            instanceDaysInvalid: 'VIP{level} gift days must be a positive integer',
            instanceQuantityInvalid: 'VIP{level} instance quantity must be a positive integer',
        },
        // Mail management
        mail: {
            title: 'Mail Management',
            description: 'Manage mail sources, plans and subscriptions',
            tabs: {
                sources: 'Sources',
                plans: 'Plans',
                subscriptions: 'Subscriptions',
                domains: 'Domains',
            },
            createSource: 'Add Source',
            editSource: 'Edit Source',
            sourceCreated: 'Source created',
            sourceUpdated: 'Source updated',
            sourceDeleted: 'Source deleted',
            confirmDeleteSource: 'Are you sure to delete source {name}? Make sure no plans are linked.',
            noSources: 'No sources, please add one first',
            createPlan: 'Add Plan',
            editPlan: 'Edit Plan',
            planCreated: 'Plan created',
            planUpdated: 'Plan updated',
            planDeleted: 'Plan deleted',
            confirmDeletePlan: 'Are you sure to delete plan {name}?',
            noPlans: 'No plans, please add one first',
            noSubscriptions: 'No subscriptions',
            noDomains: 'No domains',
            searchSubscriptions: 'Search by username, email or ID...',
            searchDomains: 'Search by domain, username, email or ID...',
            fillRequired: 'Please fill in required fields',
            createSourceFirst: 'Please create a source first',
            region: 'Region',
            apiEndpoint: 'API Endpoint',
            apiKey: 'API Key',
            smtpHost: 'SMTP Host',
            smtpPort: 'SMTP Port',
            webmailUrl: 'Webmail URL',
            sourcePlaceholder: 'e.g. US Datacenter',
            source: 'Source',
            domainLimit: 'Domain Limit',
            diskLimit: 'Disk Limit',
            diskLimitGb: 'Disk Limit (GB)',
            price: 'Price',
            billingCycle: 'Billing Cycle',
            planPlaceholder: 'e.g. Basic',
            user: 'User',
            plan: 'Plan',
            expiresAt: 'Expires At',
            domain: 'Domain',
            accounts: 'Accounts',
            plans: 'Plans',
            unsub: {
                button: 'Unsubscribe',
                title: 'Cancel Subscription',
                refundType: 'Refund Type',
                refundNone: 'No Refund',
                refundNoneDesc: 'Cancel subscription without any refund',
                refundFull: 'Full Refund',
                refundFullDesc: 'Refund full plan price {amount}',
                refundRemaining: 'Remaining Value Refund',
                refundRemainingDesc: 'Refund based on remaining subscription time',
                reason: 'Refund Reason',
                reasonPlaceholder: 'Enter refund reason, will be recorded in balance log...',
                reasonRequired: 'Reason is required when refunding',
                confirm: 'Confirm Cancel',
                success: 'Subscription cancelled',
                successWithRefund: 'Subscription cancelled, refunded ¥{amount}',
            },
        },
        // Admin create instance
        instanceCreate: {
            title: 'Create Instance',
            description: 'Create instance for user as a gift, no payment required',
            targetUser: 'Target User',
            usernamePlaceholder: 'Enter username',
            usernameHint: 'Instance will be created under this user account',
            userHint: 'Instance will be created under this user account',
            checkUser: 'Check',
            checking: 'Checking...',
            userFound: 'User found (ID: {id})',
            userNotFound: 'User not found',
            userNotFoundHint: 'Please check if the username is correct',
            noSshKey: 'This user has no SSH key set',
            noSshKeyHint: 'Please ask the user to add an SSH key in their profile settings first',
            orderSummary: 'Gift Summary',
            freeGift: 'Free Gift',
            freeGiftHint: 'This instance is created by admin for free, not counted in billing',
            createFor: 'Create for',
            create: 'Create Instance',
            creating: 'Creating...',
            submit: 'Create Instance',
            success: 'Instance created successfully',
            selectUser: 'Please select a target user first',
            createSuccess: 'Instance created, will appear in user {username}\'s instance list',
            createFailed: 'Failed to create instance',
            selectUserFirst: 'Please check and confirm the target user first',
            packageScope: {
                official: 'Official Packages',
                hosted: 'Hosted Packages',
            },
            // Paid instance related
            instanceType: 'Instance Type',
            freeInstance: 'Free Instance',
            paidInstance: 'Paid Instance',
            selectPlan: 'Select Plan',
            noPlanHint: 'No available plans for this package',
            chargeFirstMonth: 'Charge First Month',
            chargeFirstMonthHint: 'Deduct first month fee from user balance',
            noChargeFirstMonthHint: 'First month free, regular billing from next month',
            planPrice: 'Monthly Price',
            setupFee: 'Setup Fee',
            totalCharge: 'Total Charge',
            freeFirstMonth: 'First Month Free',
            userBalance: 'User Balance',
            insufficientBalance: 'Insufficient user balance',
            paidSummary: 'Paid Summary',
            paidInstanceHint: 'Create paid instance, billed by plan',
        },
        // Broadcast announcement
        broadcast: {
            title: 'Site-wide Announcement',
            description: 'Send notification to all active users',
            messageTitle: 'Announcement Title',
            titlePlaceholder: 'Enter announcement title',
            titleRequired: 'Please enter announcement title',
            titleTooLong: 'Title exceeds 200 characters',
            messageContent: 'Announcement Content',
            contentPlaceholder: 'Enter announcement content',
            contentRequired: 'Please enter announcement content',
            contentTooLong: 'Content exceeds 5000 characters',
            send: 'Send Announcement',
            sendSuccess: 'Successfully sent to {count} users',
            sendFailed: 'Failed to send',
            hint: 'Announcement will be sent to all users with "Active" status.',
            // History
            history: 'History',
            noHistory: 'No sending records',
            recipients: 'Sent to {count} recipients',
            sender: 'Sender',
            types: {
                system_broadcast: 'Site Broadcast',
                host_broadcast: 'Host Notification',
                admin_message: 'Admin Message',
                host_message: 'Host Owner Message',
            },
        },
        // System settings
        system: {
            title: 'System Settings',
            description: 'Configure system initial parameters and defaults',
            tabs: {
                system: 'System Settings',
                popupAnnouncement: 'Popup Notice',
                telegram: 'Telegram Settings',
            },
            sections: {
                access: {
                    title: 'Access & Registration',
                    description: 'Manage registration, invite generation, default quotas, and instance transfer rules',
                },
                hosting: {
                    title: 'Hosting & Sites',
                    description: 'Manage hosting access, hosting notices, and free-site gift rules',
                },
                brand: {
                    title: 'Brand & Appearance',
                    description: 'Manage system name, logo, avatar service, and footer contact links',
                },
                security: {
                    title: 'Security Verification',
                    description: 'Manage Turnstile verification and registration email domain allowlists',
                },
                mail: {
                    title: 'Mail Service',
                    description: 'Manage SMTP delivery settings and test emails',
                },
                tickets: {
                    title: 'Tickets & Attachments',
                    description: 'Manage ticket access and ticket image storage settings',
                },
            },
            popupAnnouncement: {
                title: 'Popup Notice',
                description: 'Configure the site-wide notice shown when users visit the website.',
                content: 'Notice content',
                placeholder: 'Enter popup notice content here. Leave it empty and save to delete the notice and stop broadcasting.',
                hint: 'Users can hide it for today or never show it again. When the notice is updated, it will be shown as a new notice.',
                promoTitle: 'Image Promo Popup',
                promoDescription: 'Configure a new server promotion popup with an image and a package purchase action.',
                promoImageUrl: 'Image URL',
                promoImagePlaceholder: 'https://example.com/promo.jpg',
                promoImageHint: 'Use a clear banner image. The popup shows it in full while preserving its aspect ratio.',
                promoPackage: 'Target Package',
                promoPackagePlaceholder: 'Select a package to promote',
                promoPackageLoading: 'Loading packages...',
                promoPackageEmpty: 'No promotable packages',
                promoPackageHint: 'The promo popup is shown only when both image URL and target package are configured.',
                promoPreview: 'Frontend preview',
                promoPreviewEmpty: 'Enter an image URL to preview it',
                promoNoPackage: 'No package selected',
                promoPackageFallback: 'Target package',
            },
            defaultQuota: 'Default User Quota',
            defaultQuotaDesc: 'New users will automatically receive the following quota limits',
            quotaHost: 'Default Host Quota',
            quotaHostDesc: 'Default number of hosts for new users',
            quotaFriend: 'Default Friend Quota',
            quotaFriendDesc: 'Default number of friends for new users (0 = not authorized)',
            quotaPackage: 'Default Package Quota',
            quotaPackageDesc: 'Default number of packages for new users (0 = not authorized)',
            registration: 'Registration',
            registrationDesc: 'Configure user registration options',
            registrationEnabled: 'Registration Access',
            registrationEnabledDesc: 'When disabled, new users cannot register, while existing users can still sign in normally',
            registrationOpen: 'Registration Open',
            registrationClosed: 'Registration Closed',
            requireInviteCode: 'Require Invite Code',
            requireInviteCodeDesc: 'When enabled, users must enter an invite code to register',
            openRegistration: 'Open',
            inviteOnly: 'Invite Only',
            hostingFeature: {
                title: 'Hosting Feature',
                description: 'Control whether host and hosting earnings entry points are shown to new users. Users who have already created a host always keep access.',
                enable: 'Show host entry points',
                enableDesc: 'When disabled, users who have never created a host will not see host and earnings entry points. Existing host owners keep access.',
                marketEntry: 'Show hosted package purchase entry',
                marketEntryDesc: 'Controls whether hosted zones and hosted package purchase entry points are shown on the create instance page. When disabled, users can only select official packages there.',
                marketEntryVisible: 'Entry visible',
                marketEntryHidden: 'Entry hidden',
                notice: 'Hosting Notice',
                noticePlaceholder: 'Enter the hosting notice here. Leave empty to hide it on the frontend.',
                noticeHint: 'Shown on the hosting earnings page. Line breaks are supported. Leave empty to hide it.',
                visibleToAll: 'Visible to all users',
                hiddenForNewUsers: 'Hidden for new users',
            },
            brand: {
                title: 'Brand Settings',
                description: 'Configure the system name, subtitle, and logo. Leave empty to use the default brand.',
                name: 'System Name',
                nameDesc: 'Shown in the sidebar, top bar, auth pages, and SEO metadata.',
                subtitle: 'Site Subtitle',
                subtitlePlaceholder: 'Incus-powered NAT VPS platform',
                subtitleDesc: 'Shown in the public header/footer, default browser title, and default SEO description.',
                logo: 'Logo URL',
                logoDesc: 'Supports http(s) image URLs or absolute site paths. Leave empty to use the default logo.',
            },
            ticket: {
                title: 'Ticket Settings',
                description: 'Control whether regular users can create support tickets.',
                enable: 'Enable Tickets',
                enableDesc: 'When disabled, the user-side ticket entry is hidden and regular users cannot create tickets through the API.',
                enabled: 'Enabled',
                disabled: 'Disabled',
            },
            freeSite: {
                title: 'Freebie Site',
                description: 'Control whether recharge and affiliate features are shown on the user wallet page.',
                enable: 'Enable Freebie Site',
                enableDesc: 'When enabled, the user wallet hides recharge buttons, recharge records, and affiliate plans. Recharge order creation and repayment are blocked by the API.',
                enabled: 'Enabled',
                disabled: 'Disabled',
                registerGift: 'Registration Gift',
                registerGiftDesc: 'When enabled, new users receive balance and points after successful registration.',
                giftEnabled: 'Giving',
                giftDisabled: 'Off',
                giftBalance: 'Gift Balance',
                giftBalanceDesc: 'Added to the account balance after registration, in yuan.',
                giftPoints: 'Gift Points',
                giftPointsDesc: 'Added to the entertainment points account after registration.',
                giftRequiresFreeSite: 'Enable Freebie Site before configuring registration gifts.'
            },
            unitCount: '',
            reset: 'Reset',
            save: 'Save Config',
            saving: 'Saving...',
            loadFailed: 'Failed to load config',
            saveSuccess: 'Config saved',
            saveFailed: 'Save failed',
            notes: 'Notes',
            note1: 'Changing default quotas only affects newly registered users, not existing users.',
            note2: 'To modify existing user quotas, go to "User Management" page.',
            note3: 'Host quota limits the number of hosts a user can create (0 = feature not authorized).',
            note4: 'Friend quota limits the number of friends a user can add (0 = feature not authorized).',
            note5: 'Package quota limits the number of packages a user can create (0 = feature not authorized).',
            // Turnstile config
            turnstile: {
                title: 'Cloudflare Turnstile',
                description: 'Configure bot protection for login, registration and sensitive operations',
                enable: 'Enable Turnstile',
                enableDesc: 'When enabled, users must complete verification for login, registration and sensitive operations',
                enabled: 'Enabled',
                disabled: 'Disabled',
                siteKey: 'Site Key',
                siteKeyPlaceholder: 'Enter Cloudflare Turnstile Site Key',
                siteKeyDesc: 'Site key used by frontend',
                secretKey: 'Secret Key',
                secretKeyPlaceholder: 'Enter Cloudflare Turnstile Secret Key',
                secretKeyDesc: 'Secret key used by backend for verification (keep it safe)',
                helpText: 'Get your keys from Cloudflare dashboard:',
            },
            avatar: {
                title: 'Avatar Service',
                description: 'Configure user avatar generation service, using DiceBear official API by default',
                apiBase: 'API Base URL',
                apiBaseDesc: 'DiceBear avatar API base URL, can self-host for better performance',
                helpText: 'Learn how to self-host DiceBear:',
            },
            // SMTP Email configuration
            smtp: {
                title: 'SMTP Email Service',
                description: 'Configure SMTP server to enable email verification. Users will need to verify their email when registering',
                enable: 'Enable Email Verification',
                enableDesc: 'When enabled, users must verify their email with a verification code during registration',
                enabled: 'Enabled',
                disabled: 'Disabled',
                host: 'SMTP Server',
                hostPlaceholder: 'smtp.example.com',
                port: 'SMTP Port',
                secure: 'Use SSL/TLS',
                secureHint: 'Usually required for port 465, not for port 587',
                username: 'Username',
                usernamePlaceholder: 'Email account or username',
                password: 'Password',
                passwordPlaceholder: 'App password or authorization code',
                fromEmail: 'From Email',
                fromEmailPlaceholder: "noreply{'@'}example.com",
                fromName: 'From Name',
                testConnection: 'Test Connection',
                testing: 'Testing...',
                testSuccess: 'SMTP connection test successful',
                testFailed: 'SMTP connection test failed',
                sendTestEmail: 'Send Test Email',
                sendTestEmailDesc: 'Send a test email to the specified address to verify email sending functionality',
                testEmailPlaceholder: 'Enter recipient email address',
                sending: 'Sending...',
                send: 'Send',
                invalidEmail: 'Please enter a valid email address',
                testEmailSent: 'Test email sent to {email}',
                testEmailFailed: 'Failed to send test email',
                helpText: 'Make sure the SMTP server address, port, username and password are correct. Most email providers require an app password instead of your login password.',
            },
            // Email domain whitelist configuration
            emailDomain: {
                title: 'Email Domain Whitelist',
                description: 'Restrict registration to specific email domains to improve user quality',
                enable: 'Enable Email Domain Whitelist',
                enableDesc: 'When enabled, only email addresses from whitelisted domains can register',
                enabled: 'Enabled',
                disabled: 'Disabled',
                allowedDomains: 'Allowed Email Domains',
                allowedDomainsPlaceholder: 'gmail.com,outlook.com,icloud.com\nOne domain per line or comma-separated\nLeave empty to use default whitelist',
                allowedDomainsDesc: 'Enter allowed email domains, comma-separated or one per line. Leave empty to use the default whitelist (includes Gmail, Outlook, iCloud, Yahoo, Proton, and other major email services).',
                helpText: 'Default whitelist includes: Gmail, Outlook/Hotmail, iCloud, Yahoo, Zoho, Proton, Fastmail, Tuta, Posteo, Disroot, Riseup, and other major email services.',
            },
            // Transfer settings
            transfer: {
                title: 'Transfer Settings',
                description: 'Configure instance transfer settings',
                feeLabel: 'Transfer Fee',
                feeUnit: 'per transfer',
                feeDesc: 'Fee charged when initiating a transfer (0 means free). Automatically refunded if the recipient rejects the transfer',
                feeRangeError: 'Transfer fee must be between 0 and {max} yuan, with up to 2 decimal places',
            },
            footerLinks: {
                title: 'Footer Contact Links',
                description: 'Configure the email button shown at the bottom of the sidebar',
                email: 'Contact Email',
                emailPlaceholder: "support{'@'}example.com or mailto:support{'@'}example.com",
                emailDesc: 'Leave empty to hide the email button. You can enter either an email address or a full mailto: link.',
                telegram: 'Telegram Group Link',
                telegramPlaceholder: 'https://t.me/your_group',
                telegramDesc: 'Leave empty to hide the Telegram button.',
            },
            ticketImages: {
                title: 'Ticket Image Storage',
                description: 'Upload ticket images to Lsky. The panel only forwards uploads and stores metadata, without writing files to local disk.',
                baseUrl: 'Lsky Base URL',
                baseUrlPlaceholder: 'https://img.example.com',
                baseUrlDesc: 'Lsky site root URL. Do not append /api/v1/upload.',
                token: 'Lsky Token',
                tokenPlaceholder: 'Enter the Lsky API token',
                tokenDesc: 'Used by backend only and never exposed to the frontend',
                apiVersion: 'API Version',
                apiVersionDesc: 'Choose the upload API version that matches your Lsky deployment',
                targetId: 'Strategy/Storage ID',
                targetIdPlaceholder: 'Use strategy_id for v1, storage_id for v2',
                targetIdDesc: 'Optional. Leave empty to use Lsky defaults.',
            },
        },
        // User management
        users: {
            title: 'User Management',
            description: 'Manage platform users and invite codes',
            create: 'Create User',
            generateInvite: 'Generate Invite',
            userInfo: 'User',
            role: 'Role',
            status: 'Status',
            quotaUsage: 'Quota Usage',
            allInstances: 'All Instances',
            instances: 'instances',
            registeredAt: 'Registered',
            admin: 'Admin',
            user: 'User',
            active: 'Active',
            banned: 'Banned',
            searchPlaceholder: 'Search username, ID, or email...',
            searchRange: 'Search Scope',
            searchFieldUsername: 'Username',
            searchFieldId: 'ID',
            searchFieldEmail: 'Email',
            exactMatch: 'Exact Match',
            noUsers: 'No users',
            noMatchingUsers: 'No matching users found',
            noEmail: 'No email set',
            resourceQuota: 'Resource Quota',
            viewInstances: 'View Instances',
            quota: 'Quota',
            ban: 'Ban',
            unban: 'Unban',
            promoteAdmin: 'Make Admin',
            demoteAdmin: 'Remove Admin',
            confirmBan: 'Are you sure to ban user "{name}"?',
            confirmUnban: 'Are you sure to unban user "{name}"?',
            confirmPromoteAdmin: 'Make user "{name}" an admin? They need to sign in again for it to take effect.',
            confirmDemoteAdmin: 'Remove admin privileges from user "{name}"? Their current sessions will be revoked.',
            userBanned: 'User banned',
            userUnbanned: 'User unbanned',
            userPromotedAdmin: 'User is now an admin',
            userDemotedAdmin: 'Admin privileges removed',
            onlyActiveCanBeAdmin: 'Only active users can be made admins',
            loadFailed: 'Failed to load users',
            userVipLevels: 'User VIP Levels',
            vipBenefits: 'Membership Benefits',
            // Invite codes
            invites: 'Invite Codes',
            inviteCode: 'Invite Code',
            inviteStatus: 'Status',
            createdBy: 'Created By',
            usedBy: 'Used By',
            createdAt: 'Created At',
            usedExpireAt: 'Used/Expire At',
            noInvites: 'No invite codes',
            noMatchingInvites: 'No matching invite codes',
            inviteFilterAll: 'All',
            inviteFilterUsed: 'Used',
            inviteFilterUnused: 'Unused',
            inviteUsed: 'Used',
            inviteExpired: 'Expired',
            inviteUnused: 'Unused',
            permanent: 'Permanent',
            deleteInvite: 'Delete',
            confirmDeleteInvite: 'Are you sure to delete invite code {code}?',
            inviteDeleted: 'Invite code deleted',
            deleteFailed: 'Delete failed',
            // Generate invite
            generateInviteTitle: 'Generate Invite Code',
            inviteCount: 'Quantity',
            countUnit: '',
            expireDays: 'Validity',
            day1: '1 day',
            day3: '3 days',
            day7: '7 days',
            day14: '14 days',
            day30: '30 days',
            permanentValid: 'Permanent',
            expireHint: 'Set the expiration time for the invite code',
            generate: 'Generate',
            generating: 'Generating...',
            generateFailed: 'Failed to generate invite code',
            // Invite result
            inviteGenerated: 'Invite Code Generated',
            validUntil: 'Valid until',
            copyCode: 'Copy Code',
            copyAllCodes: 'Copy All',
            copyLink: 'Copy Link',
            copied: 'Copied!',
            // Quota edit
            editQuota: 'Edit Quota',
            instanceLimit: 'Instance Limit',
            instanceLimitHint: 'Maximum number of instances the user can create',
            hostLimit: 'Host Limit',
            hostLimitHint: 'Maximum number of hosts the user can own',
            friendLimit: 'Friend Limit',
            friendLimitHint: 'Maximum number of friends the user can add',
            packageLimitHint: 'Maximum number of packages the user can create',
            packageLimit: 'Package limit',
            notAuthorized: 'Not authorized',
            cpuAllowance: 'CPU Allowance',
            cpuAllowanceHint: 'Allowance ÷ 100 ≈ available cores, min 10, step 5',
            cpuCores: '~{n} cores',
            memoryLimit: 'Memory (MB)',
            diskLimit: 'Disk (MB)',
            portLimit: 'NAT Port Limit',
            portLimitHint: 'Total port quota limit for all instances',
            snapshotLimit: 'Snapshot Limit',
            snapshotLimitHint: 'Total snapshot quota limit for all instances',
            backupLimit: 'Backup Limit',
            backupLimitHint: 'Total backup quota limit for all instances',
            trafficLimit: 'Monthly Traffic Limit',
            trafficLimitPlaceholder: 'Leave empty for unlimited',
            trafficLimitHint: 'In GB, leave empty for unlimited',
            quotaUpdated: 'Quota updated',
            totalRecords: '{count} records',
            prevPage: 'Previous',
            nextPage: 'Next',
            // Reset password
            resetPassword: 'Reset Password',
            resetPasswordConfirm: 'Are you sure to reset password for user "{name}"?',
            resetPasswordHint: 'A new password will be generated automatically. All user sessions will be revoked and re-login with new password is required.',
            confirmResetPassword: 'Confirm Reset',
            resetting: 'Resetting...',
            passwordResetSuccess: 'Password Reset Successfully',
            newPasswordFor: 'New password for "{name}":',
            copyPassword: 'Copy Password',
            copyPasswordHint: 'Please save this password securely. It cannot be viewed again after closing this dialog.',
            // Disable 2FA
            disable2FA: 'Disable 2FA',
            disable2FAConfirm: 'Are you sure to disable two-factor authentication for user "{name}"?',
            disable2FAWarning: 'After disabling, the user will no longer need a verification code to log in, which may reduce account security.',
            twoFADisabled: 'Two-factor authentication disabled',
            // Unbind GitHub
            unbindGitHub: 'Unbind GitHub',
            unbindGitHubConfirm: 'Are you sure to unbind GitHub OAuth for user "{name}"?',
            unbindGitHubWarning: 'After unbinding, the user will not be able to use GitHub quick login.',
            githubUnbound: 'GitHub OAuth unbound successfully',
            // User activity and login records
            userActivity: 'User Activity',
            registeredNew: 'New',
            registeredDays: 'Registered {days}d',
            viewLoginRecords: 'View login records',
            noLoginRecord: 'No login record',
            loginRecords: 'Login Records',
            noLoginRecords: 'No login records',
            loadLoginRecordsFailed: 'Failed to load login records',
            // Send message
            sendMessage: 'Send Message',
            sendMessageTo: 'Send Message to {username}',
            messageTitle: 'Message Title',
            messageTitlePlaceholder: 'Enter message title',
            messageTitleRequired: 'Please enter message title',
            messageContent: 'Message Content',
            messageContentPlaceholder: 'Enter message content',
            messageContentRequired: 'Please enter message content',
            messageSent: 'Message sent',
            messageSendFailed: 'Failed to send message',
            // User balance
            balance: 'Balance',
            viewBalance: 'View Balance Details',
            consumed: 'Consumed',
            totalConsumed: 'Total amount consumed',
            balanceDetails: 'Balance Details',
            balanceOverview: 'Account Overview',
            balanceLogs: 'Balance Logs',
            rechargeRecords: 'Recharge Records',
            currentBalance: 'Current Balance',
            totalRecharge: 'Total Recharged',
            totalConsume: 'Total Consumed',
            noBalanceLogs: 'No balance changes',
            noRechargeRecords: 'No recharge records',
            loadBalanceFailed: 'Failed to load balance info',
            loadBalanceLogsFailed: 'Failed to load balance logs',
            loadRechargeRecordsFailed: 'Failed to load recharge records',
            balanceType: {
                recharge: 'Recharge',
                consume: 'Consume',
                refund: 'Refund',
                admin_adjust: 'Admin Adjust',
                gift: 'Gift',
                transfer_fee: 'Transfer Fee',
                transfer_refund: 'Fee Refund',
            },
            // Adjust balance
            adjustBalance: 'Adjust Balance',
            adjustBalanceFor: 'Adjust Balance for {username}',
            adjustType: 'Adjustment Type',
            addBalance: 'Add Balance',
            deductBalance: 'Deduct Balance',
            amount: 'Amount',
            amountPlaceholder: 'Enter amount',
            adjustReason: 'Reason',
            adjustReasonPlaceholder: 'Enter reason for adjustment (required)',
            invalidAmount: 'Please enter a valid amount',
            reasonRequired: 'Please enter a reason',
            balanceAdjusted: 'Balance adjusted successfully',
            balanceAdjustFailed: 'Failed to adjust balance',
            // Points
            points: 'Points',
            earned: 'Total',
            totalEarnedPoints: 'Total earned points',
            spent: 'Spent',
            spentPoints: 'Spent points',
            adjustPoints: 'Adjust Points',
            currentPoints: 'Current Points',
            pointsAmount: 'Amount',
            pointsAmountHint: 'Positive to add, negative to deduct',
            pointsAmountPlaceholder: 'e.g. 100 or -50',
            pointsReasonPlaceholder: 'Enter reason for adjustment (required)',
            invalidPointsAmount: 'Please enter a valid points amount',
            pointsAdjusted: 'Points adjusted successfully',
            pointsAdjustFailed: 'Failed to adjust points',
            // Hosting balance
            hostingBalance: 'Hosting Balance',
            hostingBalanceDetails: 'Hosting Balance Details',
            hostingBalanceOverview: 'Overview',
            hostingBalanceLogs: 'Logs',
            adjustHostingBalance: 'Adjust Hosting Balance',
            viewHostingBalance: 'View Hosting Balance',
            frozenHostingBalance: 'Frozen Hosting Balance',
            availableBalance: 'Available Balance',
            frozenBalance: 'Frozen Balance',
            frozen: 'Frozen',
            available: 'Available',
            operation: 'Operation',
            operationAdd: 'Add',
            operationDeduct: 'Deduct',
            hostingReasonPlaceholder: 'Enter reason for adjustment (required)',
            hostingBalanceAdjusted: 'Hosting balance adjusted successfully',
            hostingBalanceAdjustFailed: 'Failed to adjust hosting balance',
            loadHostingLogsFailed: 'Failed to load hosting balance logs',
            logTime: 'Time',
            logType: 'Type',
            logAmount: 'Amount',
            logStatus: 'Status',
            logDescription: 'Description',
            hostingLogType: {
                income: 'Income',
                deduction: 'Deduction',
                unfreeze: 'Unfreeze',
                withdraw: 'Withdraw',
                admin_adjust: 'Admin Adjust',
            },
            // Linked accounts detection
            linkedAccounts: 'Linked Accounts',
            detectDays: 'Detection Range',
            daysUnit: 'days',
            startDetect: 'Start Detection',
            detecting: 'Detecting...',
            detectingHint: 'Analyzing user data, please wait...',
            clickToDetect: 'Click the button above to start detecting linked accounts',
            loadLinkedAccountsFailed: 'Failed to load linked accounts detection',
            detectTime: 'Detection Time',
            detectDuration: 'Duration',
            detectRange: 'Detection Range',
            ipGroupCount: 'IP linked groups',
            emailGroupCount: 'email similar groups',
            usernameGroupCount: 'username similar groups',
            ipLinkedGroups: 'IP Linked Groups',
            emailSimilarGroups: 'Email Similar Groups',
            usernameSimilarGroups: 'Username Similar Groups',
            usersCount: 'users',
            loginsCount: 'logins',
            lastLoginAt: 'Last login',
            noLinkedAccounts: 'No linked accounts detected, your users are clean!',
        },
        // Host management
        hosts: {
            title: 'Host Management',
            description: 'Manage hosts and node groups',
            create: 'Add Host',
            address: 'Address',
            status: 'Status',
            online: 'Online',
            offline: 'Offline',
            maintenance: 'Maintenance',
            hostsTab: 'Hosts',
            searchPlaceholder: 'Search hosts...',
            noHosts: 'No hosts',
            name: 'Name',
            resources: 'Resources',
            instances: 'Instances',
            actions: 'Actions',
            cpu: 'CPU',
            cpuQuota: 'CPU Quota',
            memory: 'Memory',
            memoryQuota: 'Memory Quota',
            disk: 'Disk',
            diskUsage: 'Disk Usage',
            cores: 'cores',
            allowanceLimit: 'Allowance limit',
            memoryLimit: 'Memory limit',
            instanceType: 'Type',
            typeContainer: 'Container',
            typeVm: 'VM',
            typeBoth: 'Both',
            edit: 'Edit',
            test: 'Test',
            delete: 'Delete',
            testSuccess: 'Connection successful',
            testFailed: 'Connection failed',
            confirmDelete: 'Are you sure to delete host "{name}"?',
            hostDeleted: 'Host deleted',
            deleteFailed: 'Delete failed',
            // Add/Edit host
            addHost: 'Add Host',
            editHost: 'Edit Host',
            hostName: 'Name',
            hostNameHint: 'Only letters, numbers, - and _ allowed',
            hostNameRequired: 'Please enter the node name',
            hostDesc: 'Description',
            apiUrl: 'API URL',
            ipAddress: 'Server Address',
            ipAddressHint: 'Supports bare IPv4, bare IPv6, or a domain name',
            ipAddressRequired: 'Please enter the server address',
            apiPort: 'API Port',
            apiPortHint: 'Default 8443',
            tokenPrompt: 'If prompted for a secure communication Token during installation, please copy and paste the following content:',
            copyToken: 'Copy Token',
            country: 'Country or Region',
            certPath: 'Certificate Path',
            keyPath: 'Key Path',
            natPublicIp: 'NIC IP',
            natPublicIpPlaceholder: 'Enter server NIC IP',
            natConfig: 'NAT Config',
            natPublicIpv4: 'Public IPv4',
            natPublicIpv4Placeholder: 'Enter the public IPv4 shown to users',
            natPublicIpv4Desc: 'The public IPv4 address users see for IPv4 port mappings.',
            natPublicIpv6: 'Public IPv6',
            natPublicIpv6Placeholder: 'e.g. 2600:1900:41a0:5bb::',
            natPublicIpv6Desc: 'The public IPv6 address shown to users. It does not have to be the actual bind address.',
            natBindIpv4: 'Bind IPv4',
            natBindIpv4Placeholder: 'Leave empty for auto-detect, e.g. 0.0.0.0 or 10.170.0.3',
            natBindIpv4Desc: 'The address used when binding IPv4 ports. Leave empty to let the system choose.',
            natBindIpv6: 'Bind IPv6',
            natBindIpv6Placeholder: 'Leave empty for auto-detect, e.g. 2600:1900:41a0:5bb::',
            natBindIpv6Desc: 'The address used when binding IPv6 ports. Leave empty to let the system choose.',
            natPublicIpv6Invalid: 'Public IPv6 address format is invalid',
            natBindIpv6Invalid: 'Bind IPv6 address format is invalid',
            portRangeStart: 'Port Range Start',
            portRangeEnd: 'Port Range End',
            portRangeEndMustBeGreater: 'Port range end must be greater than or equal to start',
            cpuAllowanceMax: 'Total CPU Time Quota',
            memoryMax: 'Max Memory',
            instanceTypeLabel: 'Instance Type',
            networkModeLabel: 'Network Mode',
            networkModeNat: 'IPv4 NAT',
            networkModeNatIpv6: 'IPv4 NAT & IPv6',
            networkModeNatIpv6Nat: 'IPv4 NAT & IPv6 NAT',
            networkModeIpv6Only: 'IPv6 Only',
            networkModeIpv6Nat: 'IPv6 NAT',
            autoAssign: 'Auto Assign',
            hostAdded: 'Host added',
            hostUpdated: 'Host updated',
            typeChangeWarning: 'Host type change warning',
            addFailed: 'Add failed',
            updateFailed: 'Update failed',
            // Init config
            initConfig: 'Init Config',
            // Storage config
            storageConfig: 'Storage Config',
            storageDriver: 'Storage Driver',
            storageDriverZfs: 'ZFS (Recommended)',
            storageDriverLvm: 'LVM',
            storageType: 'Storage Type',
            storageTypeLoop: 'Loop File',
            storageTypeDisk: 'Physical Disk',
            storagePath: 'Device Path',
            storagePathHint: 'e.g. /dev/sdb',
            storageSize: 'Storage Size',
            // Network config
            networkConfig: 'Network Config',
            networkOption: 'Network Option',
            networkOptionHint: 'Select the network egress mode for container instances',
            independentIpv6: 'Independent IPv6',
            ipv6Mode: 'IPv6 Mode',
            ipv6Routed: 'Routed',
            ipv6Nat: 'NAT',
            ipv6Disabled: 'Disabled',
            ipv6Subnet: 'IPv6 Subnet',
            ipv6SubnetHint: 'IPv6 subnet allocated to containers',
            ipv6SubnetRequired: 'Please enter IPv6 subnet',
            ipv6SubnetInvalid: 'Invalid IPv6 subnet format, CIDR prefix required (e.g. /48)',
            ipv6Gateway: 'IPv6 Gateway',
            ipv6ParentInterface: 'IPv6 Parent Interface',
            ipv6ParentInterfaceHint: 'Physical NIC name on the host for IPv6 routed mode (e.g. eth0)',
            ipv6ParentInterfaceRequired: 'Please enter IPv6 parent interface',
            enableApi: 'Enable API',
            // Sysctl config
            sysctlConfig: 'Kernel Parameters',
            sysctlConfigHint: 'Custom sysctl config, leave empty for defaults',
            resetSysctl: 'Reset to Default',
            enableBBR: 'Enable BBR',
            bbrEnabled: 'BBR Enabled',
            // Install script
            installScript: 'Install Script',
            runOnHost: 'Run the following command on the host with root privileges:',
            copyCommand: 'Copy Command',
            step1RunScript: 'Run Install Script',
            step2Verify: 'Verify & Connect',
            verifyHint: 'After the script completes, click the button below to verify the connection',
            verifyAndConnect: 'Verify & Connect',
            verifying: 'Verifying...',
            verifySuccess: 'Successfully connected!',
            verifyFailed: 'Verification failed',
            reinstall: 'Reinstall',
            reinstallScript: 'Reinstall Script',
            reinstallFailed: 'Failed to generate install command',
            waitingInstall: 'Waiting for installation...',
            installSuccess: 'Installation successful!',
            tokenExpired: 'Token expired, please recreate the host',
            // Detail page
            tabInfo: 'Info',
            tabConfig: 'Config',
            tabInstances: 'Instances',
            tabStorage: 'Storage',
            tabImages: 'Images',
            tabOps: 'Ops',
            tabCreate: 'Create',
            basicInfo: 'Basic Info',
            config: 'Config',
            resourceLimits: 'Resource Limits',
            transferControl: 'Transfer Control',
            transferEnabled: 'Allow Transfer',
            transferEnabledHint: 'When disabled, instances on this host cannot initiate transfer requests',
            notificationSettings: 'Notification Settings',
            notificationSettingsHint: 'These notifications are sent only through your enabled Telegram, Discord, or Webhook channels. Email is not used here.',
            notifyPurchase: 'Purchase Notification',
            notifyPurchaseHint: 'Notify you when a user purchases a paid instance on this host.',
            notifyRenew: 'Renewal Notification',
            notifyRenewHint: 'Notify you when a user renews a paid instance on this host.',
            notifyDestroy: 'Destroy Notification',
            notifyDestroyHint: 'Notify you when a user destroys an instance on this host, including refund and fee amounts.',
            extraConfig: 'Extra Config',
            trafficConfig: 'Traffic Config',
            trafficResetDay: 'Traffic Reset Day',
            trafficResetDayHint: 'Day of month to reset instance traffic (1-28)',
            enableResourcePool: 'Enable Resource Pool',
            enableResourcePoolHint: 'When enabled, instances on this host can participate in check-in/lottery resource applications',
            announcement: 'Announcement',
            announcementPlaceholder: 'Enter announcement content here, will be displayed on all instances under this host',
            announcementHint: 'Leave empty to hide announcement, supports line breaks',
            probeUrl: 'Probe URL',
            probeUrlPlaceholder: 'Enter node probe monitoring page URL',
            probeUrlHint: 'You can enter probe, script test results or other links for this node. Once configured, users can click the icon to view when selecting hosts',
            portRange: 'Port Range',
            portsUsed: 'Ports Used',
            recalculateResources: 'Align Used',
            recalculateResourcesTip: 'Recalculate resource usage and align quota to used amount',
            recalculateSuccess: 'Resources recalculated, quota aligned',
            recalculateNoChanges: 'Resources are correct, no changes needed',
            recalculateFailed: 'Resource recalculation failed',
            ops: {
                title: 'Host Operations Center',
                description: 'Run non-destructive inventory, baseline sync, and network repair first for legacy host onboarding and state reconciliation.',
                discover: 'Inventory',
                baselineSync: 'Baseline Sync',
                networkRepair: 'Network Repair',
                refresh: 'Refresh Result',
                managed: 'Managed Instances',
                orphaned: 'Unmanaged Legacy Instances',
                missing: 'Database Missing Instances',
                summary: 'Summary',
                totalIncus: 'Host Instances',
                totalDb: 'Database Instances',
                managedCount: 'Managed',
                orphanedCount: 'Unmanaged',
                missingCount: 'Missing',
                runSuccess: 'Operation completed successfully',
                runFailed: 'Operation failed',
                lastRunAt: 'Last run at',
                empty: 'No result yet. Run an operation above first.',
                sectionInventory: 'Host Instance Inventory',
                sectionRepair: 'Safe Repair Actions',
                sectionReport: 'Execution Result',
                resultInventory: 'Inventory Result',
                resultBaseline: 'Baseline Sync Result',
                resultNetwork: 'Network Repair Result',
                resultPreview: 'Instance Precheck Result',
                resultInstanceSync: 'Single Instance Sync Result',
                resultInstanceRestart: 'Single Instance Restart Result',
                resultDanger: 'Dangerous Action Result',
                instanceName: 'Instance Name',
                instanceType: 'Type',
                incusStatus: 'Host Status',
                dbStatus: 'DB Status',
                dbInstance: 'DB Instance',
                changes: 'Changes',
                synced: 'Synced',
                failed: 'Failed',
                total: 'Total',
                ipv4: 'IPv4',
                ipv6: 'IPv6',
                details: 'Details',
                noManaged: 'No managed instances found',
                noOrphaned: 'No unmanaged legacy instances found',
                noMissing: 'No database-missing instances found',
                baselineHint: 'Sync host resource usage and batch backfill status/IP for running instances.',
                networkHint: 'Batch reconcile status, IPv4 and IPv6 records for non-deleted instances.',
                discoverHint: 'Read all current Incus containers / KVMs from the host and reconcile with database records.',
                selectInstanceHint: 'Select one managed instance to perform single-instance sync, restart, or dangerous actions.',
                instancePanel: 'Single Instance Panel',
                loadPreview: 'Load Precheck',
                syncInstance: 'Sync Instance',
                safeRestart: 'Safe Restart',
                forceRestart: 'Force Restart',
                dangerZone: 'Danger Zone',
                dangerHint: 'These actions may wipe or replace the instance system data. Use them only when inventory, sync, and restart can no longer solve the issue.',
                rebuild: 'Rebuild Current Instance',
                recreate: 'Recreate Replacement Instance',
                imageAlias: 'Image Alias',
                imageAliasPlaceholder: 'e.g. ubuntu/22.04 or debian/12',
                selectImage: 'Image Selection',
                imagePlaceholder: 'Please select a target image',
                loadingImages: 'Loading available images...',
                noImagesAvailable: 'No available images on this host',
                sshKeyId: 'SSH Key ID',
                selectSshKey: 'SSH Key',
                sshKeyPlaceholder: 'Do not specify an SSH key',
                loadingSshKeys: 'Loading SSH keys...',
                noSshKeysAvailable: 'This instance user has no SSH keys. Leaving this empty will use backend default handling.',
                sshKeyOptionalHint: 'Optional. If empty, the instance user default key strategy is used.',
                customInitCommandIds: 'Custom Init Command IDs',
                selectInitCommands: 'Init Commands',
                loadingInitCommands: 'Loading init commands...',
                noInitCommandsAvailable: 'No init commands are available for the selected image',
                optionalField: 'Optional, leave empty if not needed',
                confirmDangerTitle: 'Confirm Before Execution',
                riskCheckbox: 'I understand this action may cause irreversible loss of instance system or data, and I confirm this is intentional.',
                confirmTextHint: 'Enter the real instance name to confirm, e.g. u2-g65uoeo1',
                ownerUserId: 'User ID',
                fullInstanceName: 'Full Instance Name',
                selectedOnlyHint: 'Single-instance actions only affect the currently selected instance. Other instances are not affected.',
                localizedNone: 'No action needed',
                dangerActionType: 'Action Type',
                dangerConfirm1Title: 'First Dangerous Action Confirmation',
                dangerConfirm1Hint: 'Please confirm again that you are about to execute an irreversible dangerous action.',
                dangerConfirm1Btn: 'Confirm and Continue',
                dangerConfirm2Title: 'Second Dangerous Action Confirmation',
                dangerConfirm2Hint: 'This is the final confirmation. A task will be created immediately after execution.',
                dangerConfirm2Btn: 'Confirm Execution',
                dangerConfirmStep: 'Confirmation step {step} / {total}',
                executeDangerAction: 'Execute Dangerous Action',
                suggestedAction: 'Suggested Action',
                activeTask: 'Active Task',
                latestInstanceAction: 'Latest Single-Instance Action',
            },
            statusOnline: 'Online',
            statusOffline: 'Offline',
            statusMaintenance: 'Maintenance',
            invalidId: 'Invalid host ID',
            loadFailed: 'Load failed',
            noInstances: 'No instances on this host',
            search: 'Search',
            instanceSearchPlaceholder: 'Search by instance ID, name, username, email, IP address...',
            imagesOnHost: 'Images on host {name}',
            noImagesOnHost: 'No images on this host',
            selectImagesToSync: 'Select images to sync to host {name}',
            allImagesSynced: 'All images are synced to this host',
            imagePolicy: {
                title: 'Image Policy',
                description: 'Configure which images can be selected for provisioning and rebuild on host "{name}"',
                defaultMode: 'Use panel defaults',
                defaultDesc: 'Do not restrict this host separately. Provisioning and rebuild will load all available images for the host architecture and instance type.',
                restrictedMode: 'Restrict to selected images',
                restrictedDesc: 'Only the checked images will appear in the provisioning and rebuild lists for this host.',
                selectableImages: 'Selectable images',
                defaultHint: 'This host is currently using the default image policy.',
                selectedCount: '{count} images selected',
                searchPlaceholder: 'Search by image name, alias, or distro...',
                emptySelection: 'Restricted mode requires at least one selected image. Switch back to default mode if you do not want to restrict this host.',
                noImages: 'No visible images match this host architecture and instance type.',
                loadFailed: 'Failed to load image policy',
                saveSuccess: 'Image policy saved',
                saveFailed: 'Failed to save image policy',
            },
            addHostDesc: 'Add a new host node',
            allocated: 'Allocated',
            includesPageCache: 'includes page cache',
            syncTime: 'Sync Time',
            deleteHost: 'Delete Host',
            deleteWarning: 'This action cannot be undone! Please ensure there are no instances on this host before deleting.',
            deleteConfirmHint: 'Please enter the host name "{name}" to confirm deletion:',
            enterHostName: 'Host Name',
            confirmDeleteBtn: 'Confirm Delete',
            deleteNameMismatch: 'Name does not match',
            hasInstances: 'This host still has {count} instance(s), please delete or migrate them first',
            checkFailed: 'Check failed',
            // Batch extend
            batchExtend: 'Gift Time',
            extendHint: '{count} paid instance(s) on this host will be extended',
            extendDaysLabel: 'Days to extend',
            extendDaysPlaceholder: 'Enter a number between 1-365',
            extendDaysInvalid: 'Please enter a valid number of days (1-365)',
            confirmExtendBtn: 'Confirm',
            extendSuccess: 'Successfully extended {count} paid instance(s) by {days} days',
            extendFailed: 'Batch extend failed',
            // Batch delete instances
            selectedCount: '{count} instance(s) selected',
            noInstanceSelected: 'Select instances to use batch actions',
            batchDelete: 'Batch Delete',
            batchDeleteTitle: 'Batch Delete Instances',
            batchDeleteWarning: 'This action cannot be undone! Instance data will be permanently deleted.',
            batchDeleteConfirm: 'Are you sure to delete these {count} instance(s)?',
            confirmBatchDelete: 'Confirm Delete',
            databaseOnlyDelete: 'Database Only',
            batchDeleteSuccess: 'Successfully deleted {count} instance(s)',
            batchDeletePartial: 'Successfully deleted {success} instance(s), {failed} failed',
            batchDeleteFailed: 'Batch delete failed',
            batchDeleteRefundWarning: 'Deleting paid instances will automatically refund the remaining value to the user and deduct from your hosting balance.',
            batchDeleteRefundTotal: 'Total Refund Amount',
            instanceName: 'Instance Name',
            instanceUser: 'Owner',
            refundAmount: 'Refund Amount',
            // Batch sync instance status
            batchSyncStatus: 'Sync Status',
            batchSyncSuccess: 'Successfully synced {synced} instance(s), {changed} status updated',
            batchSyncWithIpv4: 'Successfully synced {synced} instance(s), {changed} status updated, {ipv4Changed} internal IP updated',
            batchSyncPartial: 'Synced {synced}, updated {changed}, failed {failed}',
            batchSyncNoChange: 'Successfully synced {synced} instance(s), no status change',
            batchSyncFailed: 'Sync status failed',
            // Batch suspend instances
            batchSuspend: 'Batch Suspend',
            batchSuspendTitle: 'Batch Suspend Instances',
            batchSuspendWarning: 'After suspension, instance owners will not be able to perform any operations until unsuspended.',
            batchSuspendConfirm: 'Are you sure you want to suspend these {count} instances?',
            confirmBatchSuspend: 'Confirm Suspend',
            batchSuspendSuccess: 'Successfully suspended {count} instance(s)',
            batchSuspendPartial: 'Successfully suspended {success} instance(s), {failed} failed',
            batchSuspendFailed: 'Batch suspend failed',
            batchUnsuspend: 'Batch Unsuspend',
            batchUnsuspendSuccess: 'Successfully unsuspended {count} instances',
            batchUnsuspendPartial: 'Unsuspended {success} instances, {failed} failed',
            batchUnsuspendNone: 'No suspended instances found in the selection',
            batchUnsuspendFailed: 'Batch unsuspend failed',
            suspendReason: 'Suspension Reason (Optional)',
            suspendReasonPlaceholder: 'Enter suspension reason, instance owners will be notified via inbox...',
            deleteReason: 'Deletion Reason (Optional)',
            deleteReasonPlaceholder: 'Enter the reason for deletion, users will be notified via inbox and notification channels...',
            deleteReasonHint: 'If a reason is provided, the instance owner will receive a notification',
            // Instance traffic
            trafficUsage: 'Traffic Usage',
            trafficUnlimited: 'Unlimited',
            resetTraffic: 'Reset Traffic',
            trafficResetSuccess: 'Traffic reset successfully',
            trafficResetFailed: 'Failed to reset traffic',
            resetTrafficTitle: 'Reset Instance Traffic',
            resetTrafficWarning: 'If the instance has exceeded its quota, resetting traffic will not automatically restore the bandwidth throttling (1Mbps). Please manually restore the bandwidth rate for this instance.',
            resetTrafficDesc: 'Are you sure you want to reset traffic for instance "{instance}"?',
            // Host traffic statistics
            trafficStats: 'Traffic Statistics',
            monthlyUsed: 'Monthly Used',
            hostTotalLimit: 'Host Total Limit',
            // Host status
            agentStatusTitle: 'Host Status',
            agentStatusDesc: 'Agent reports live host resources and runtime status every {seconds} seconds',
            agentStatusRefreshSuccess: 'Host status refreshed',
            agentStatusLoadFailed: 'Failed to load host status',
            agentNotInstalled: 'Not installed',
            agentDisabled: 'Disabled',
            agentOnline: 'Online',
            agentOffline: 'Offline',
            agentUnknown: 'Unknown',
            agentVersionLatest: 'Latest',
            agentVersionOutdated: 'Update available',
            agentVersionUnknown: 'Version unknown',
            agentLatestVersion: 'Latest version: {version}',
            agentUpgradeClickHint: 'Click to request upgrade to {version}; Agent will run it on next heartbeat',
            agentUpgradeRequestSuccess: 'Upgrade requested; Agent will run it on the next heartbeat in about {seconds}s',
            agentUpgradeRequestFailed: 'Failed to request Agent upgrade',
            agentAlreadyLatest: 'Agent is already latest',
            agentInstallCommand: 'Install/Reinstall Agent',
            agentInstallCommandTitle: 'Agent Installation Command',
            agentInstallCommandHint: 'Run the full command on the host, or paste it or its ait_ token into the Agent menu.',
            agentInstallCommandConfirm: 'Generating a new Agent installation command rotates this host Agent credentials. The old Agent will stop reporting until it is reinstalled. Continue?',
            agentInstallTokenExpiresAt: 'Expires at {time}',
            agentInstallCommandSuccess: 'Agent installation command generated',
            agentInstallCommandFailed: 'Failed to generate Agent installation command',
            agentInstallCommandCopied: 'Agent installation command copied',
            agentNoRecordHint: 'No Agent heartbeat has been recorded for this host. It will report automatically after Agent install or reinstall.',
            agentId: 'Agent ID',
            agentLastSeen: 'Last Heartbeat',
            agentHeartbeatIp: 'Heartbeat IP',
            agentReportedAt: 'Reported At',
            agentIncus: 'Incus Check',
            agentIncusAvailable: 'Available',
            agentIncusUnavailable: 'Unavailable',
            agentCpuTotal: 'CPU Cores',
            agentMemoryTotal: 'Total Memory',
            agentUptime: 'Host Uptime',
            agentSocket: 'Incus Socket',
            agentCpuUsage: 'CPU Usage',
            agentCpuCores: 'cores',
            agentMemoryUsage: 'Memory Usage',
            agentSwapUsage: 'SWAP Usage',
            agentDiskUsage: 'Disk Usage',
            agentLoadAverage: 'Load Average',
            agentLoadAverageHint: '1 / 5 / 15 minutes',
            agentProcessCount: 'Process Count',
            // Storage pool management
            storage: {
                title: 'Storage Pools',
                subtitle: 'Manage Incus storage pools on this host',
                create: 'Add Storage Pool',
                createTitle: 'Create Storage Pool',
                empty: 'No storage pools',
                loadFailed: 'Failed to load storage pools',
                createSuccess: 'Storage pool created',
                createFailed: 'Failed to create storage pool',
                deleteSuccess: 'Storage pool deleted',
                deleteFailed: 'Failed to delete storage pool',
                deleteConfirm: 'Are you sure to delete storage pool "{name}"? This action cannot be undone.',
                updateSuccess: 'Storage pool updated',
                updateFailed: 'Failed to update storage pool',
                editTitle: 'Edit Storage Pool',
                currentSize: 'Current Size',
                newSize: 'New Size',
                newSizeHint: 'Only expansion is supported, not shrinking',
                nameRequired: 'Please enter storage pool name',
                sourceRequired: 'Please enter storage source (device path)',
                sizeRequired: 'Please enter storage size',
                pathRequired: 'Please enter directory path',
                poolName: 'Pool Name',
                driver: 'Driver Type',
                description: 'Description',
                source: 'Source',
                size: 'Size',
                usedBy: 'Used by',
                volumes: 'volumes',
                // Driver descriptions
                zfsDesc: 'Recommended: Full features (snapshots, clones, compression, quotas), excellent performance',
                lvmDesc: 'Linux standard, very stable, thin provisioning recommended',
                btrfsDesc: 'Similar to ZFS features, suitable for single disk or RAID1/10',
                dirDesc: 'Directory storage, lowest performance, for testing only',
                // Common
                useLoop: 'Use loop file',
                loopSizeHint: 'Will create image file in /var/lib/incus/',
                // ZFS
                zfsSourceHint: 'Physical disk or partition path, e.g. /dev/disk/by-id/nvme-xxx',
                zfsPoolName: 'ZFS Pool Name',
                zfsPoolNameHint: 'Optional, defaults to storage pool name',
                // LVM
                lvmSourceHint: 'Physical disk path, e.g. /dev/sdb',
                lvmVgName: 'Volume Group Name',
                lvmUseThinpool: 'Enable Thin Provisioning',
                lvmThinpoolHint: 'Strongly recommended, otherwise snapshot performance is poor',
                // Btrfs
                btrfsSourceHint: 'Physical disk path, e.g. /dev/sdb',
                // DIR
                dirPath: 'Directory Path',
                dirPathHint: 'Specify an existing directory, e.g. /mnt/data/incus-storage',
                // Storage purpose
                purpose: 'Storage Purpose',
                forInstances: 'For instance system disk',
                forInstancesHint: 'Used as default storage when creating instances',
                forVolumes: 'For instance storage volumes',
                forVolumesHint: 'Can be manually mounted to instances',
                purposeSystemDisk: 'System',
                purposeStorageDisk: 'Storage',
                // Mode switch
                modeCreate: 'Create New Pool',
                modeExisting: 'Link Existing Pool',
                modeImport: 'Import Existing Storage',
                modeCreateHint: 'Create a new storage pool on the host, requires driver type, source and other parameters',
                modeExistingHint: 'Link an existing storage pool on the host, just enter the pool name',
                modeImportHint: 'Import storage that exists at OS level but Incus does not know about (e.g. manually created ZFS pool, LVM VG)',
                linkSuccess: 'Storage pool linked successfully',
                importSuccess: 'Storage pool imported successfully',
                // Import storage pool
                importZfsSource: 'ZFS Pool Name',
                importLvmSource: 'LVM Volume Group Name',
                importBtrfsSource: 'Btrfs Device or Subvolume Path',
                importDirSource: 'Directory Path',
                importZfsHint: 'Existing ZFS pool name (check with zpool list)',
                importLvmHint: 'Existing LVM volume group name (check with vgs)',
                importBtrfsHint: 'Device or subvolume path formatted as Btrfs',
                importDirHint: 'Existing directory path, e.g. /mnt/storage',
                importSourceRequired: 'Btrfs and DIR types require storage source path',
            },
        },
        // Image management
        images: {
            title: 'Image Management',
            description: 'Manage system images for users to select when creating instances',
            create: 'Add Image',
            edit: 'Edit Image',
            imagesTab: 'Image Library',
            syncTab: 'Sync Status',
            noImages: 'No images added yet',
            noImagesForArchitecture: 'No images for the selected architecture',
            addImage: 'Add Image',
            syncToHost: 'Sync Image to Host',
            delete: 'Delete',
            confirmDelete: 'Are you sure to delete image "{name}"?',
            imageDeleted: 'Image deleted',
            deleteFailed: 'Delete failed',
            deleteSuccess: 'Image deleted',
            enabled: 'Enabled',
            disabled: 'Disabled',
            active: 'Active',
            show: 'Show',
            hide: 'Hide',
            shown: 'Image shown',
            hidden: 'Image hidden',
            statusVisible: 'Visible',
            statusHidden: 'Hidden',
            createSuccess: 'Image created',
            updateSuccess: 'Image updated',
            saveFailed: 'Save failed',
            loadFailed: 'Failed to load images',
            validation: {
                requiredFields: 'Please fill in name, remote alias and icon',
            },
            fields: {
                icon: 'Icon',
                name: 'Name',
                remoteAlias: 'Remote Alias',
                osType: 'OS Type',
                architecture: 'Architecture',
                instanceType: 'Instance Type',
                sortOrder: 'Sort Order',
                status: 'Status',
                hidden: 'Hide this image from users',
            },
            placeholder: {
                name: 'e.g. Ubuntu 24.04 LTS',
                remoteAlias: 'e.g. ubuntu/noble/cloud',
                icon: 'Select icon',
            },
            hint: {
                remoteAlias: 'Incus remote image alias, e.g. ubuntu/noble/cloud',
                sortOrder: 'Lower values appear first',
                instanceType: 'Specify whether this image is for containers, VMs, or both',
            },
            // Instance types
            typeContainer: 'Container',
            typeVm: 'Virtual Machine',
            typeBoth: 'Both',
            // Sync status
            syncStatusDesc: 'View sync status of images on each host, click cells to sync or delete',
            refresh: 'Refresh',
            addToLibraryFirst: 'Please add images to the library first',
            noSystemImages: 'No system images available',
            image: 'Image',
            statusReady: 'Ready',
            statusSyncing: 'Syncing',
            statusPending: 'Pending',
            statusError: 'Error',
            statusNotSynced: 'Not Synced',
            retry: 'Retry',
            sync: 'Sync',
            confirmDeleteFromHost: 'Are you sure to delete this image from the host?',
            deletedFromHost: 'Image deleted from host',
            imageInUse: 'This image is being used by {count} instance(s) and cannot be deleted',
            syncStarted: 'Sync task started',
            syncFailed: 'Sync failed',
            loadStatusFailed: 'Failed to load image status',
            loadHostsFailed: 'Failed to load hosts',
            // Form
            imageName: 'Name',
            osType: 'OS Type',
            remoteAlias: 'Remote Alias',
            imageDesc: 'Description',
            sortOrder: 'Sort Order',
            activeStatus: 'Active Status',
            selectHosts: 'Select Sync Hosts',
            imageAdded: 'Image added',
            imageCreated: 'Image created',
            imageUpdated: 'Image updated',
            // Image form modal
            selectDistro: 'Select Distribution',
            selectVersion: 'Select Version',
            configureInfo: 'Configure Info',
            selectDistroHint: 'Select the Linux distribution to add',
            versionsCount: '{count} versions',
            imageVariant: 'Image Variant',
            cloudVariantDesc: 'Cloud optimized, supports cloud-init',
            defaultVariantDesc: 'Standard version',
            displayName: 'Display Name',
            descPlaceholder: 'Optional description...',
            enableImage: 'Enable this image',
            syncHosts: 'Sync Hosts',
            selectAll: 'Select All',
            deselectAll: 'Deselect All',
            editSyncHint: 'Deselected hosts will have the image removed on save, newly selected hosts will start syncing',
            createSyncHint: 'Selected hosts will start syncing after save',
            // Sync modal
            selectTargetHosts: 'Select Target Hosts',
            syncWarning: 'Image sync may take several minutes depending on image size and network speed',
            startSync: 'Start Sync',
        },
        // Package management
        packages: {
            title: 'Package Management',
            description: 'Configure instance specification templates',
            create: 'Create Package',
            noPackages: 'No packages',
            createFirst: 'Create your first package',
            noDesc: 'No description',
            enabled: 'Enabled',
            disabled: 'Disabled',
            status: 'Status',
            cpu: 'CPU',
            memory: 'Memory',
            disk: 'Disk',
            cores: '~{n} cores',
            networkNat: 'NAT',
            networkIpv6: 'IPv6',
            networkDual: 'Dual Stack',
            nested: 'Nested Virtualization',
            privileged: 'Privileged Container',
            allNodes: 'All Nodes',
            enable: 'Enable',
            disable: 'Disable',
            edit: 'Edit',
            delete: 'Delete',
            confirmDelete: 'Are you sure to delete package "{name}"?',
            packageDeleted: 'Package deleted',
            packageEnabled: 'Package enabled',
            packageDisabled: 'Package disabled',
            deleteFailed: 'Delete failed',
            operationFailed: 'Operation failed',
            // Form
            createPackage: 'Create Package',
            editPackage: 'Edit Package',
            basicInfo: 'Basic Info',
            name: 'Name',
            namePlaceholder: 'Starter',
            descLabel: 'Description',
            descPlaceholder: 'Suitable for lightweight applications',
            resourceLimits: 'Resource Limits',
            maxCpuAllowance: 'Max CPU Allowance',
            cpuAllowanceHint: 'Allowance ÷ 100 ≈ available cores, min 10, step 5',
            maxMemory: 'Max Memory (MB)',
            maxDisk: 'Max Disk (MB)',
            networkAndScheduling: 'Network & Scheduling',
            networkMode: 'Network Mode',
            allNodesNoLimit: 'All Nodes (no limit)',
            boundHosts: 'Bound Hosts',
            mustBindHost: 'Must bind at least one host',
            noHostsBound: 'No hosts bound',
            noHostsAvailable: 'No hosts available',
            advancedOptions: 'Advanced Options',
            nestedLabel: 'Nested Virtualization',
            nestedHint: 'Allow running Docker/VM inside container',
            privilegedLabel: 'Privileged Container',
            privilegedHint: 'Grant higher system privileges (security risk)',
            enablePackage: 'Enable Package',
            enablePackageHint: 'Users cannot select this package when disabled',
            enterName: 'Please enter package name',
            packageCreated: 'Package created',
            packageUpdated: 'Package updated',
            trafficLimit: 'Monthly Traffic Limit',
            trafficLimitPlaceholder: 'Leave empty for unlimited',
            trafficLimitHint: 'Unit: GB, leave empty for unlimited',
            syncTraffic: 'Sync Traffic Limits',
            confirmSyncTraffic: 'Sync all package traffic limits to their instances?',
            syncTrafficSuccess: 'Synced traffic limits for {count} instances',
            syncTrafficFailed: 'Sync failed',
            // Package list
            traffic: 'Monthly Traffic',
            unlimited: 'Unlimited',
            unlimitedPlaceholder: 'Leave empty for unlimited',
            active: 'Active',
            inactive: 'Archived',
            archivedHint: 'Archived packages will not appear in the package selection when creating instances',
            activeLabel: 'Active',
            saveFailed: 'Save failed',
            loadFailed: 'Failed to load package',
            instanceMaxLimit: 'Instance max limit',
        },
        // Help management
        helpManage: {
            title: 'Help Documentation',
            description: 'Create and manage help documents',
            create: 'New Article',
            noArticles: 'No articles',
            createFirst: 'Create your first article',
            edit: 'Edit',
            delete: 'Delete',
            confirmDelete: 'Are you sure to delete article "{title}"?',
            articleDeleted: 'Article deleted',
            deleteFailed: 'Delete failed',
            // Tabs
            articlesTab: 'Articles',
            categoriesTab: 'Category Management',
            // Categories
            addCategory: 'Add Category',
            noCategories: 'No categories, click "Add Category" to create',
            categoryId: 'Category ID',
            categoryIdHint: 'Only lowercase letters, numbers and hyphens allowed',
            categoryName: 'Category Name',
            categoryColor: 'Color',
            categoryAdded: 'Category added',
            categoryUpdated: 'Category updated',
            categoryDeleted: 'Category deleted',
            categoryInUse: 'This category has documents, cannot delete',
            confirmDeleteCategory: 'Are you sure to delete category "{name}"?',
            duplicateCategoryId: 'This category ID already exists',
            invalidCategoryId: 'Category ID can only contain lowercase letters, numbers and hyphens',
            fillCategoryIdAndName: 'Please fill in category ID and name',
            // Articles table
            articleTitleCol: 'Title',
            categoryCol: 'Category',
            statusCol: 'Status',
            updatedAtCol: 'Updated At',
            actionsCol: 'Actions',
            totalArticles: '{count} articles',
            prevPage: 'Previous',
            nextPage: 'Next',
            hide: 'Hide',
            publish: 'Publish',
            articleHidden: 'Article hidden',
            articlePublished: 'Article published',
            // Form
            createArticle: 'New Article',
            editArticle: 'Edit Article',
            articleTitle: 'Title',
            titlePlaceholder: 'Document title',
            urlSlug: 'URL Slug',
            urlSlugPlaceholder: 'getting-started',
            urlSlugHint: 'Only lowercase letters, numbers and hyphens allowed',
            category: 'Category',
            sortOrder: 'Sort Order',
            content: 'Content',
            contentMarkdown: 'Content (Markdown)',
            preview: 'Preview',
            activeStatus: 'Publish Status',
            published: 'Published',
            draft: 'Draft',
            pinned: 'Pinned',
            notPinned: 'Not Pinned',
            articleCreated: 'Article created',
            articleUpdated: 'Article updated',
            saveFailed: 'Save failed',
            loadFailed: 'Load failed',
            operationFailed: 'Operation failed',
            fillRequired: 'Please fill in title, URL slug and content',
            invalidSlug: 'URL slug can only contain lowercase letters, numbers and hyphens',
            noTitle: 'No title',
            // Markdown help
            showMarkdownHelp: 'Show syntax help',
            hideMarkdownHelp: 'Hide syntax help',
            markdownHeading1: 'Heading 1',
            markdownHeading2: 'Heading 2',
            markdownBold: 'Bold text',
            markdownItalic: 'Italic text',
            markdownLink: 'Hyperlink',
            markdownImage: 'Image',
            markdownUnorderedList: 'Unordered list',
            markdownOrderedList: 'Ordered list',
            markdownInlineCode: 'Inline code',
            markdownCodeBlock: 'Code block',
            markdownQuote: 'Quote block',
            markdownHr: 'Horizontal rule',
            customAlerts: 'Custom Alerts:',
            alertInfo: 'Info alert',
            alertSuccess: 'Success alert',
            alertWarning: 'Warning alert',
            alertDanger: 'Danger alert',
            alertNote: 'Note alert',
        },
        // OAuth config
        oauth: {
            title: 'OAuth Config',
            description: 'Configure third-party login methods',
            noProviders: 'No OAuth providers',
            provider: 'Provider',
            clientId: 'Client ID',
            clientSecret: 'Client Secret',
            enabled: 'Enabled',
            disabled: 'Disabled',
            enable: 'Enable',
            disable: 'Disable',
            edit: 'Edit',
            save: 'Save',
            saving: 'Saving...',
            saveSuccess: 'Config saved',
            saveFailed: 'Save failed',
            notConfigured: 'Not configured. Go to',
            developerConsole: 'Developer Console',
            createOAuthApp: 'to create an OAuth app.',
            callbackUrl: 'Callback URL',
            usageGuide: 'Usage Guide',
            step1: '1. Create an OAuth app in the developer console of the corresponding platform to get Client ID and Client Secret.',
            step2: '2. Fill in the callback URL shown above in the OAuth app configuration.',
            step3: '3. Enter the Client ID and Client Secret on this page and enable it.',
            step4: '4. Users can bind OAuth accounts in their profile settings, then use quick login.',
            warning: 'Note: Users must register an account and bind it first, cannot directly register with OAuth.',
            configure: 'Configure',
            enterClientId: 'Enter Client ID',
            enterClientSecret: 'Enter Client Secret',
            leaveEmptyUnchanged: '(leave empty to keep unchanged)',
            enableLogin: 'Enable this login method',
            enableLoginHint: 'Users can use this method for quick login when enabled',
        },
        // Payment Providers Management
        paymentProviders: {
            title: 'Payment Providers',
            description: 'Configure and manage payment providers',
            add: 'Add Provider',
            create: 'Add Provider',
            noProviders: 'No payment providers',
            empty: 'No payment providers configured yet',
            createFirst: 'Add the first payment provider',
            providerName: 'Provider Name',
            providerType: 'Provider Type',
            displayName: 'Display Name',
            description_label: 'Description',
            status: 'Status',
            statusActive: 'Active',
            statusDisabled: 'Disabled',
            statusTesting: 'Testing',
            feeRate: 'Fee Rate',
            feeFixed: 'Fixed Fee',
            minAmount: 'Min Amount',
            maxAmount: 'Max Amount',
            sortOrder: 'Sort Order',
            methods: 'Payment Methods',
            paymentMethods: 'Supported Payment Methods',
            configLabel: 'Config',
            configPlaceholder: 'JSON format provider config',
            edit: 'Edit',
            delete: 'Delete',
            name: 'Name',
            namePlaceholder: 'Enter provider name',
            nameRequired: 'Please enter provider name',
            type: 'Type',
            notImplemented: 'Pending implementation',
            providerTypes: {
                yipay: 'Yipay',
                heleket: 'Heleket',
                stripe: 'Stripe',
                alipayDirect: 'Alipay Direct',
                wechatDirect: 'WeChat Direct',
                manual: 'Manual Recharge',
            },
            deleteConfirm: 'Confirm Delete',
            confirmDelete: 'Are you sure to delete payment provider "{name}"?',
            deleteWarning: 'Are you sure to delete payment provider "{name}"? This action cannot be undone.',
            createSuccess: 'Payment provider created successfully',
            updateSuccess: 'Payment provider updated successfully',
            deleteSuccess: 'Payment provider deleted',
            statusUpdated: 'Status updated',
            statusUpdateSuccess: 'Status updated successfully',
            statusUpdateFailed: 'Failed to update status',
            saveFailed: 'Save failed',
            createFailed: 'Failed to create payment provider',
            updateFailed: 'Failed to update payment provider',
            deleteFailed: 'Delete failed',
            loadFailed: 'Load failed',
            createProvider: 'Add Payment Provider',
            editProvider: 'Edit Payment Provider',
            displayNamePlaceholder: 'Name shown to users',
            descPlaceholder: 'Optional provider description',
            feeRateHint: 'e.g. 0.02 means 2% fee',
            types: {
                alipay: 'Alipay',
                wechat: 'WeChat Pay',
                stripe: 'Stripe',
                paypal: 'PayPal',
                usdt: 'USDT',
                manual: 'Manual',
            },
            config: {
                sdkVersion: 'SDK Version',
                apiurl: 'API URL',
                pid: 'Merchant ID',
                key: 'Merchant Key',
                platformPublicKey: 'Platform Public Key',
                merchantPrivateKey: 'Merchant Private Key',
                heleketMerchantUuid: 'Merchant UUID',
                heleketApiKey: 'API Key',
                heleketInvoiceCurrency: 'Invoice Fiat Currency',
                heleketLifetime: 'Invoice Lifetime (Seconds)',
                heleketApiUrlHint: 'Uses the official Heleket endpoint by default. Switch to a proxy or private gateway if needed.',
                heleketCurrencyHint: 'The fiat currency used when creating Heleket invoices. CNY is the common choice.',
                heleketLifetimeHint: 'Invoice lifetime used for Heleket. Defaults to 3600 seconds and is mirrored to the local order expiry.',
                yipayVersionV1: 'V1 (MD5 Signature) - Legacy',
                yipayVersionV2: 'V2 (RSA Signature) - New',
                yipayVersionV1Hint: 'V1 uses MD5 signing and is intended for legacy Yipay deployments.',
                yipayVersionV2Hint: 'V2 uses RSA signing and is intended for newer Rainbow Yipay deployments.',
                yipayApiUrlPlaceholder: 'e.g. https://pay.example.com/',
                yipayApiUrlHint: 'Payment API URL, ending with /.',
                yipayPidPlaceholder: 'Merchant ID',
                yipayKeyPlaceholder: 'Merchant Key',
                yipayKeyHint: 'The merchant key issued by the Yipay platform.',
                platformPublicKeyPlaceholder: 'Platform Public Key (RSA)',
                platformPublicKeyHint: 'The public key provided by the platform for verifying returned signatures.',
                merchantPrivateKeyPlaceholder: 'Merchant Private Key (RSA)',
                merchantPrivateKeyHint: 'Your generated RSA private key used to sign requests.',
                yipayMethodsHint: 'Choose at least one payment method supported by this provider.',
                yipayMethodFeeHint: 'Fees are added to the payable amount based on the selected payment method. The recharge principal is still credited in full.',
                yipayFeeFieldHint: 'Set Yipay fees per payment method above.',
                heleketMethods: 'Common Currency Display',
                heleketMethodsPlaceholder: 'USDT@TRON\nUSDT@BSC\nBTC\nETH',
                heleketMethodsHint: 'Used only as an admin-side display/reference list. It does not restrict the final currency or network chosen on the Heleket payment page.',
                instructions: 'Recharge Instructions',
                instructionsPlaceholder: 'Enter instructions shown to users when recharging...',
            },
        },
        // Billing Management (legacy key name)
        billingManage: {
            title: 'Billing Management',
            description: 'Manage paid instances and billing records',
            tabOverview: 'Overview',
            tabInstances: 'Paid Instances',
            tabRecords: 'Billing Records',
            totalIncome: 'Total Income',
            monthIncome: 'Monthly Income',
            todayIncome: 'Today Income',
            totalRefund: 'Total Refund',
            paidInstances: 'Paid Instances',
            activeInstances: 'Active Instances',
            searchPlaceholder: 'Search instances...',
            instanceId: 'Instance ID',
            instanceName: 'Name',
            user: 'User',
            plan: 'Plan',
            expiresAt: 'Expires At',
            status: 'Status',
            actions: 'Actions',
            noInstances: 'No paid instances',
            suspend: 'Suspend',
            unsuspend: 'Unsuspend',
            extend: 'Extend',
            refund: 'Refund',
            confirmSuspend: 'Are you sure to suspend instance "{name}"?',
            confirmUnsuspend: 'Are you sure to unsuspend instance "{name}"?',
            suspendSuccess: 'Instance suspended',
            unsuspendSuccess: 'Instance unsuspended',
            extendTitle: 'Extend Instance',
            extendDays: 'Extend Days',
            extendReason: 'Extend Reason',
            freeExtend: 'Free Extend',
            freeExtendHint: 'No deduction from user balance when checked',
            extendSuccess: 'Instance extended',
            extendFailed: 'Extend failed',
            refundTitle: 'Refund Instance',
            refundAmount: 'Refund Amount',
            refundReason: 'Refund Reason',
            refundSuccess: 'Refund successful',
            refundFailed: 'Refund failed',
            recordId: 'Record ID',
            recordType: 'Type',
            amount: 'Amount',
            period: 'Period',
            remark: 'Remark',
            createdAt: 'Time',
            noRecords: 'No billing records',
            userBalance: 'User Balance',
            adjustBalance: 'Adjust Balance',
            giftBalance: 'Gift Balance',
            adjustTitle: 'Adjust User Balance',
            giftTitle: 'Gift Balance',
            adjustAmount: 'Adjust Amount',
            giftAmount: 'Gift Amount',
            adjustRemark: 'Adjust Reason',
            giftRemark: 'Gift Remark',
            adjustHint: 'Positive to add, negative to deduct',
            adjustSuccess: 'Balance adjusted successfully',
            giftSuccess: 'Balance gifted successfully',
            operationFailed: 'Operation failed',
        },
        // Billing Management (new key name, matching component)
        billing: {
            title: 'Billing Management',
            description: 'Manage paid instances and billing records',
            loadFailed: 'Failed to load billing data',
            loadInstancesFailed: 'Failed to load instances',
            loadRecordsFailed: 'Failed to load billing records',
            // Tab labels
            tabs: {
                overview: 'Overview',
                instances: 'Paid Instances',
                records: 'Billing Records',
                rechargeRecords: 'Recharge Records',
                affConversions: 'AFF Conversions',
                paymentProviders: 'Payment Providers',
            },
            // Overview statistics
            totalRevenue: 'Total Revenue',
            thisMonthRevenue: 'This Month',
            todayRevenue: 'Today',
            totalRefunds: 'Total Refunds',
            paidInstances: 'Paid Instances',
            activeInstances: 'Active Instances',
            suspendedInstances: 'Suspended Instances',
            expiringInstances: 'Expiring Soon',
            netRevenueLabel: 'Net Revenue',
            thisMonthVsLastMonth: 'This Month / Last Month',
            hostedRevenueShare: 'Hosted Revenue Share',
            revenueBreakdownTitle: 'Revenue Mix',
            directRevenue: 'Direct Revenue',
            hostedRevenue: 'Hosted Revenue',
            instanceHealthTitle: 'Instance Health',
            affOverviewTitle: 'AFF Overview',
            rechargeLabel: 'Recharge',
            revenueLabel: 'Revenue',
            overviewPeriods: {
                total: 'Overview',
                thisMonth: 'This Month',
                today: 'Today',
            },
            // Instance list
            allStatus: 'All Status',
            allHosts: 'All Hosts',
            showExpiring: 'Show expiring only',
            showDateColumns: 'Show date columns',
            searchPlaceholder: 'Search user/host/instance/plan/package...',
            user: 'User',
            host: 'Host',
            plan: 'Plan',
            package: 'Package',
            price: 'Price',
            expiresAt: 'Expires At',
            purchaseDate: 'Purchase Date',
            remainingDays: 'Remaining Days',
            expired: 'Expired',
            days: 'days',
            instanceType: 'Type',
            instanceName: 'Instance Name',
            instanceStatus: 'Status',
            noInstances: 'No paid instances',
            viewInstance: 'View',
            autoRenew: 'Auto Renew',
            // Hosting type
            hostingType: 'Hosting',
            direct: 'Direct',
            hosted: 'Hosted',
            cycle: 'Cycle',
            cycleMonths: '{months} month(s)',
            perPage: 'Per page',
            totalCount: '{count} items',
            // Actions
            suspend: 'Suspend',
            unsuspend: 'Unsuspend',
            extend: 'Extend',
            refund: 'Refund',
            deleteRefund: 'Delete & Refund',
            // Action modals
            suspendTitle: 'Suspend Instance',
            unsuspendTitle: 'Unsuspend Instance',
            extendTitle: 'Extend Instance',
            refundTitle: 'Refund',
            deleteRefundTitle: 'Delete & Refund',
            targetInstance: 'Target Instance',
            reason: 'Reason',
            reasonPlaceholder: 'Enter reason...',
            extendDays: 'Extend Days',
            freeExtend: 'Free extend (no charge)',
            refundAmount: 'Refund Amount',
            refundReasonPlaceholder: 'Enter refund reason...',
            refundReasonRequired: 'Please enter refund reason',
            // Delete and refund related
            deleteRefundWarning: 'Warning: This operation will permanently delete the instance and all its data (snapshots, backups, port mappings, etc.). This action cannot be undone!',
            refundTypeLabel: 'Refund Type',
            refundTypeRemaining: 'Refund by remaining value (calculated by remaining days)',
            refundTypeFull: 'Full refund (refund all consumed amount)',
            deleteRefundReasonPlaceholder: 'Enter delete reason...',
            deleteRefundReasonRequired: 'Please enter delete reason',
            deleteRefundSuccess: 'Instance deleted and refunded',
            databaseOnlyDelete: 'Database Only Delete',
            deleteRefundDatabaseOnlySuccess: 'Instance deleted from database',
            // Apply discount
            applyDiscount: 'Apply Discount',
            applyDiscountTitle: 'Apply Renewal Discount',
            applyDiscountHint: 'After entering the AFF code, this instance will automatically receive a 5% discount on future renewals, and the code creator will also receive renewal commissions.',
            affCodeLabel: 'AFF Code',
            affCodePlaceholder: 'Enter AFF code...',
            affCodeRequired: 'Please enter AFF code',
            applyDiscountSuccess: 'Renewal discount applied successfully',
                        // Update price
                        updatePrice: 'Update Price',
                        owner: 'Owner',
                        currentPrice: 'Current Price',
                        newPrice: 'New Price',
                        enterNewPrice: 'Enter new price',
                        priceHint: 'This is the price per billing cycle, changes will affect renewal fees',
                        settleBalance: 'Settle balance (charge/refund based on remaining days)',
                        needPay: 'Need to pay',
                        willRefund: 'Will refund',
                        priceDiffHint: 'Calculated based on {days} remaining days, will automatically process user balance',
                        noSettleHint: 'Without balance settlement, only future renewal price will change, current cycle unaffected',
                        affDiscount: 'AFF Discount',
                        actualRenewPrice: 'Actual Renew Price',
                        affAppliedHint: 'This instance has a promo code applied, {discount}% discount on renewal. Price difference is calculated based on discounted price.',
                        newActualPrice: 'New Actual Price',
            // Upgrade plan
            upgradePlan: 'Upgrade',
            upgradePlanTitle: 'Upgrade Plan',
            currentPlan: 'Current Plan',
            planName: 'Plan Name',
            monthlyPrice: 'Monthly Price',
            memoryLabel: 'Memory',
            diskLabel: 'Disk',
            selectNewPlan: 'Select New Plan',
            noAvailablePlans: 'No plans available for upgrade (new plan monthly price must be higher)',
            priceDifference: 'Price Difference',
            priceDifferenceHint: 'Calculated based on remaining days, will be deducted from user balance',
            userBalance: 'User Balance',
            insufficientBalance: 'Insufficient user balance, cannot complete upgrade',
            confirmUpgrade: 'Confirm Upgrade',
            monthly: 'Monthly',
            quarterly: 'Quarterly',
            semiAnnual: 'Semi-Annual',
            yearly: 'Yearly',
            month: 'month',
            months: 'months',
            // Action results
            suspendSuccess: 'Instance suspended',
            unsuspendSuccess: 'Instance unsuspended',
            extendSuccess: 'Instance extended',
            refundSuccess: 'Refund successful',
            batchUpdatePrice: 'Batch Update Price',
            batchSelectedCount: '{count} selected',
            selectAllCurrentPage: 'Select current page instances',
            selectInstance: 'Select instance',
            batchPriceNoSelection: 'Select instances first',
            batchSelected: 'Selected',
            batchPreviewChanged: 'Will update',
            batchPreviewFailed: 'Failed',
            batchPriceHint: 'Applies one cycle price to all selected instances. Preview calculates each instance by its cycle, remaining days, and AFF discount.',
            batchTotalCharge: 'Total charge',
            batchTotalRefund: 'Total refund',
            batchNetAmount: 'Net impact',
            batchPreviewBlocked: 'This preview has failed items or insufficient user balance and cannot be submitted.',
            batchUserImpact: 'User balance impact',
            batchPreviewDetails: 'Preview details',
            batchPreviewWaiting: 'Preview will be generated after entering a price.',
            batchPriceStatusReady: 'Ready',
            batchPriceStatusUnchanged: 'No change',
            batchPriceStatusFailed: 'Failed',
            result: 'Result',
            // Billing records
            recordType: 'Type',
            recordTypes: {
                newPurchase: 'Purchase',
                renew: 'Renewal',
                upgrade: 'Upgrade',
                downgrade: 'Downgrade',
                refund: 'Refund',
                transfer_fee: 'Transfer Fee',
            },
            amount: 'Amount',
            instance: 'Instance',
            remark: 'Remark',
            time: 'Time',
            noRecords: 'No billing records',
            // Recharge statistics
            totalRecharge: 'Total Recharge',
            thisMonthRecharge: 'This Month Recharge',
            todayRecharge: 'Today Recharge',
            orders: 'orders',
            // AFF commission statistics
            totalAffCommission: 'Total AFF Commission',
            thisMonthAff: 'This Month AFF',
            affConverted: 'Converted Amount',
            affPendingConvert: 'Pending Convert',
            // Recharge records
            loadRechargeRecordsFailed: 'Failed to load recharge records',
            noRechargeRecords: 'No recharge records',
            rechargeOrderNo: 'Order No.',
            creditAmount: 'Credit Amount',
            actualAmount: 'Credited',
            estimatedAmount: 'Estimated Credit',
            payChannel: 'Pay Channel',
            paymentDetails: 'Payment Details',
            paymentUuid: 'UUID:',
            paymentTxid: 'TxID:',
            rechargeStatusLabel: 'Status',
            tradeNo: 'Trade No.',
            sync: 'Sync',
            syncSuccess: 'Sync successful, recharge completed',
            rechargeStatus: {
                pending: 'Pending',
                completed: 'Completed',
                cancelled: 'Cancelled',
                failed: 'Failed',
            },
        },
    },

    // Error pages
    error: {
        notFound: 'Page Not Found',
        notFoundDesc: 'Sorry, the page you visited does not exist',
        backHome: 'Back to Home',
        serverError: 'Server Error',
        networkError: 'Network Error',
    },

    // Logs
    logs: {
        title: 'System Logs',
        module: 'Module',
        allModules: 'All Modules',
        search: 'Search',
        searchPlaceholder: 'Search username, action or content...',
        reset: 'Reset',
        time: 'Time',
        user: 'User',
        action: 'Action',
        content: 'Content',
        result: 'Result',
        system: 'System',
        loading: 'Loading...',
        noLogs: 'No logs',
        loadFailed: 'Failed to load logs',
        loadModulesFailed: 'Failed to load modules',
        totalRecords: '{total} records, page {page} / {totalPages}',
        success: 'Success',
        failed: 'Failed',
        expand: 'Expand',
        collapse: 'Collapse',
    },

    // Help
    help: {
        title: 'Help Center',
        search: 'Search help...',
        description: 'View guides and FAQs',
        backToHelp: 'Back to Help Center',
        updatedAt: 'Updated on {date}',
        all: 'All',
        noArticles: 'No help articles',
        articleNotFound: 'Article not found or has been deleted',
        totalArticles: '{count} articles',
        categories: {
            general: 'General',
            gettingStarted: 'Getting Started',
            instances: 'Instances',
            networking: 'Networking',
            billing: 'Billing',
            faq: 'FAQ',
        },
    },

    // Log modules translation
    logModules: {
        security: 'Security',
        instance: 'Instance',
        snapshot: 'Snapshot',
        backup: 'Backup',
        image: 'Image',
        host: 'Host',
        package: 'Package',
        user: 'User',
        personal: 'Personal',
        ssh_key: 'SSH Key',
        notification: 'Notification',
        system: 'System',
        auth: 'Auth',
        storage: 'Storage',
        // Legacy Chinese module names compatibility
        '登录操作': 'Login',
        '安全事件': 'Security',
        '实例操作': 'Instance',
        '快照操作': 'Snapshot',
        '备份操作': 'Backup',
        '镜像操作': 'Image',
        '节点操作': 'Host',
        '节点组操作': 'Node Group',
        '套餐操作': 'Package',
        '用户管理': 'User',
        '个人设置': 'Personal',
        '通知设置': 'Notification',
        '系统配置': 'System',
        '认证操作': 'Auth',
        '远程存储': 'Storage',
    },

    // Log actions translation
    logActions: {
        // Security events
        'login_success': 'Login Success',
        'login_failed': 'Login Failed',
        'logout': 'Logout',
        'register_success': 'Register Success',
        'rate_limit_exceeded': 'Rate Limit Exceeded',
        'invalid_invite_code': 'Invalid Invite Code',
        'suspicious_activity': 'Suspicious Activity',
        'permission_denied': 'Permission Denied',
        'unauthorized_access': 'Unauthorized Access',
        'admin_action': 'Admin Action',
        // Instance operations
        'instance.create': 'Create Instance',
        'instance.delete': 'Delete Instance',
        'instance.start': 'Start Instance',
        'instance.stop': 'Stop Instance',
        'instance.restart': 'Restart Instance',
        'instance.rebuild': 'Rebuild System',
        'instance.recreate': 'Recreate Instance',
        'instance.change_host': 'Change Host',
        'instance.cloud_init_manual_complete': 'Manually Complete Init Check',
        'instance.update_quota': 'Update Instance Quota',
        'instance.rename': 'Rename Instance',
        // Port mapping
        'port.add': 'Add Port Mapping',
        'port.delete': 'Delete Port Mapping',
        // Snapshot operations
        'snapshot.create': 'Create Snapshot',
        'snapshot.delete': 'Delete Snapshot',
        'snapshot.restore': 'Restore Snapshot',
        // Backup operations
        'backup.create': 'Create Backup',
        'backup.delete': 'Delete Backup',
        'backup.export': 'Export Backup',
        // Image operations
        'image.sync': 'Sync Image',
        'image.delete': 'Delete Image',
        'image.create': 'Create Image',
        'image.update': 'Update Image',
        // Host operations
        'host.create': 'Add Host',
        'host.update': 'Update Host',
        'host.delete': 'Delete Host',
        'host.test': 'Test Host',
        // Node group operations
        // Package operations
        'package.create': 'Create Package',
        'package.update': 'Update Package',
        'package.delete': 'Delete Package',
        // User management
        'user.ban': 'Ban User',
        'user.unban': 'Unban User',
        'user.delete': 'Delete User',
        'user.update_quota': 'Update User Quota',
        'user.revoke_sessions': 'Revoke User Sessions',
        // Personal settings
        'profile.update': 'Update Profile',
        'password.change': 'Change Password',
        // SSH key
        'ssh_key.add': 'Add SSH Key',
        'ssh_key.delete': 'Delete SSH Key',
        // Notification settings
        'notification.add': 'Add Notification Channel',
        'notification.delete': 'Delete Notification Channel',
        // Security settings
        '2fa.setup': 'Setup 2FA',
        '2fa.enable': 'Enable 2FA',
        '2fa.disable': 'Disable 2FA',
        '2fa.recovery_reset': 'Reset Recovery Codes',
        // Auth operations
        'session.revoke': 'Revoke Session',
        'session.revoke_all': 'Revoke All Sessions',
        // System config
        'system.config_update': 'Update System Config',
        // Help articles
        'help.create': 'Create Help Article',
        'help.update': 'Update Help Article',
        'help.delete': 'Delete Help Article',
        // Backup upload operations
        'backup.upload': 'Upload Backup',
        'backup.upload.queue': 'Queue Backup Upload',
        'backup.upload.cancel': 'Cancel Backup Upload',
        // Backup restore operations
        'backup.restore': 'Restore Backup',
        'backup.restore.rollback': 'Rollback Restore',
        'backup.restore.cancel': 'Cancel Restore',
        // Storage config operations
        'storage.create': 'Create Storage Config',
        'storage.update': 'Update Storage Config',
        'storage.delete': 'Delete Storage Config',
        // AFF Referral Program
        'aff.create_code': 'Create Promo Code',
        'aff.convert_request': 'Request AFF Conversion',
        'aff.approve_convert': 'Approve AFF Conversion',
        'aff.reject_convert': 'Reject AFF Conversion',
    },

    // Log results translation
    logResults: {
        success: 'Success',
        failed: 'Failed',
        warning: 'Warning',
    },

    // API error codes translation
    errors: {
        // Common errors
        INVALID_ID: 'Invalid ID',
        NOT_FOUND: 'Resource not found',
        UNAUTHORIZED: 'Unauthorized',
        FORBIDDEN: 'Access denied',
        ADMIN_REQUIRED: 'Admin privileges required',
        // User errors
        USER_NOT_FOUND: 'User not found',
        USER_EXISTS: 'Username already exists',
        CANNOT_MODIFY_SELF: 'Cannot modify your own status',
        CANNOT_DELETE_SELF: 'Cannot delete yourself',
        CANNOT_BAN_ADMIN: 'Cannot ban admin account',
        CANNOT_DELETE_ADMIN: 'Cannot delete admin account',
        USER_HAS_INSTANCES: 'User has instances, please delete them first',
        // Auth errors
        INVALID_CREDENTIALS: 'Invalid username or password',
        ACCOUNT_BANNED: 'Account has been disabled',
        TOO_MANY_ATTEMPTS: 'Too many login attempts, please try again later',
        REGISTRATION_DISABLED: 'Registration is currently closed',
        INVALID_INVITE_CODE: 'Invalid or used invite code',
        INVITE_CODE_EXPIRED: 'Invite code has expired',
        INVALID_2FA_CODE: 'Invalid verification code or recovery code',
        TWO_FA_REQUIRED: 'Two-factor authentication required',
        TWO_FA_ALREADY_ENABLED: '2FA is already enabled, please disable it first',
        TWO_FA_NOT_ENABLED: '2FA is not enabled',
        REFRESH_TOKEN_MISSING: 'Refresh token missing',
        REFRESH_TOKEN_INVALID: 'Refresh token invalid or expired',
        SESSION_NOT_FOUND: 'Session not found',
        // Validation errors
        INVALID_EMAIL: 'Please enter a valid email address',
        EMAIL_CONTAINS_ILLEGAL: 'Email contains illegal characters',
        USERNAME_CONTAINS_ILLEGAL: 'Username contains illegal characters',
        PASSWORD_TOO_WEAK: 'Password is too weak',
        INVALID_SSH_KEY: 'Invalid SSH public key format',
        SSH_KEY_EXISTS: 'This SSH key has already been added',
        INVALID_NAME: 'Invalid name format',
        // Instance errors
        INSTANCE_NOT_FOUND: 'Instance not found',
        INSTANCE_ALREADY_RUNNING: 'Instance is already running',
        INSTANCE_ALREADY_STOPPED: 'Instance is already stopped',
        INSTANCE_STATUS_INVALID: 'Instance status does not allow this operation',
        INSTANCE_SUSPENDED: 'Instance is suspended and cannot perform this operation',
        INSTANCE_NOT_SUSPENDED: 'Instance is not in suspended status',
        INSTANCE_SUSPENDED_EXPIRED: 'Instance is suspended due to expiration, please renew to unsuspend',
        INSTANCE_DESTROY_TRAFFIC_LIMIT_EXCEEDED: 'Destroy is unavailable in the current monthly traffic cycle because usage has reached 5G',
        // Host errors
        HOST_NOT_FOUND: 'Host not found',
        HOST_OFFLINE: 'Host is offline',
        HOST_HAS_INSTANCES: 'Host has instances, please delete them first',
        HOST_ALREADY_OFFICIAL: 'Host is already official',
        HOST_TAKEOVER_PACKAGE_BINDING_CONFLICT: 'Takeover blocked because some packages would lose all bound hosts',
        NO_AVAILABLE_HOSTS: 'No available hosts',
        // Image errors
        IMAGE_NOT_FOUND: 'Image not found',
        IMAGE_SYNCED_ON_HOSTS: 'Image is synced on hosts, please delete from hosts first',
        IMAGE_TYPE_MISMATCH: 'Selected image is not compatible with package instance type',
        // Package errors
        PACKAGE_NOT_FOUND: 'Package not found',
        PACKAGE_IN_USE: 'Package is in use by instances',
        // Quota errors
        QUOTA_EXCEEDED: 'Quota exceeded',
        QUOTA_CPU_EXCEEDED: 'CPU quota exceeded',
        QUOTA_MEMORY_EXCEEDED: 'Memory quota exceeded',
        QUOTA_DISK_EXCEEDED: 'Disk quota exceeded',
        QUOTA_INSTANCE_EXCEEDED: 'Instance quota exceeded',
        QUOTA_PORT_EXCEEDED: 'Port quota exceeded',
        QUOTA_SNAPSHOT_EXCEEDED: 'Snapshot quota exceeded',
        QUOTA_BACKUP_EXCEEDED: 'Backup quota exceeded',
        QUOTA_NOT_ALLOCATED: 'Quota not allocated',
        // Snapshot errors
        SNAPSHOT_NOT_FOUND: 'Snapshot not found',
        SNAPSHOT_RESTORE_REQUIRES_STOP: 'Please stop the instance before restoring snapshot',
        // Backup errors
        BACKUP_NOT_FOUND: 'Backup not found',
        BACKUP_NOT_READY: 'Backup is not ready for export',
        EXPORT_TASK_NOT_FOUND: 'Export task not found or expired',
        EXPORT_TASK_EXPIRED: 'Export task has expired',
        // Port mapping errors
        PORT_IN_USE: 'Port is already in use',
        PORT_OUT_OF_RANGE: 'Port is out of allowed range',
        PORT_MAPPING_NOT_FOUND: 'Port mapping not found',
        // Node group errors
        NODE_GROUP_NOT_FOUND: 'Node group not found',
        NODE_GROUP_HAS_HOSTS: 'Node group has hosts, please remove them first',
        NODE_GROUP_HAS_PACKAGES: 'Node group is used by packages',
        // Notification errors
        NOTIFICATION_CHANNEL_NOT_FOUND: 'Notification channel not found',
        // Help errors
        ARTICLE_NOT_FOUND: 'Article not found',
        SLUG_EXISTS: 'Slug already exists',
        // Invite code errors
        INVITE_CODE_USED: 'Invite code has been used',
        INVITE_CODE_NOT_FOUND: 'Invite code not found',
        // OAuth errors
        OAUTH_PROVIDER_DISABLED: 'This login method has been disabled',
        OAUTH_ALREADY_BOUND: 'This account is already bound to another user',
        OAUTH_NOT_BOUND: 'Account not bound',
        OAUTH_TOKEN_ERROR: 'Failed to get authorization',
        // SSH Key errors
        SSH_KEY_NOT_FOUND: 'SSH key not found',
        SSH_KEY_REQUIRED: 'SSH key is required, please add one in settings first',
        SSH_KEY_NOT_OWNED: 'SSH key not found or does not belong to this user',
        // Package errors (additional)
        PACKAGE_UNAVAILABLE: 'Package is unavailable or discontinued',
        CANNOT_CREATE_OWN_PAID_PACKAGE: 'Cannot create instance with your own paid package',
        // Host resource errors
        HOST_UNAVAILABLE: 'Selected host is unavailable or has insufficient resources',
        HOST_NO_ONLINE: 'No online hosts available, please test connection in node management',
        HOST_RESOURCES_NOT_SYNCED: 'Host resources not synced, please click "Test Connection" in node management',
        HOST_NODE_GROUP_NO_HOSTS: 'No available hosts in the required node group',
        HOST_RESOURCES_INSUFFICIENT: 'All hosts have insufficient resources, please try later or choose another package',
        HOST_NAME_EXISTS: 'Host name already exists',
        HOST_ADDRESS_EXISTS: 'Host connection address already exists',
        HOST_ADDRESS_UNRESOLVABLE: 'The panel could not resolve this host connection address',
        HOST_CERT_NOT_CONFIGURED: 'Please configure certificate path first',
        HOST_INVALID_CPU_MAX: 'CPU max allowance cannot be negative',
        HOST_INVALID_MEMORY_MAX: 'Memory max cannot be negative or less than 256MB',
        HOST_INVALID_IPV6_MODE: 'IPv6 mode must be 1 (route), 2 (NAT), or 3 (disabled)',
        HOST_IPV6_ROUTE_REQUIRES_CONFIG: 'IPv6 route mode requires subnet and parent interface configuration',
        HOST_CPU_BELOW_USED: 'CPU max allowance cannot be less than current usage by instances',
        HOST_MEMORY_BELOW_USED: 'Memory max cannot be less than current usage by instances',
        // Instance operation errors
        INSTANCE_STOP_REQUIRED: 'Please stop the instance first',
        INSTANCE_IMAGE_REQUIRED: 'Please specify an image',
        INSTANCE_IMAGE_UNAVAILABLE: 'Selected image is not available on this host',
        INSTANCE_REBUILD_FAILED: 'Instance rebuild failed',
        INSTANCE_IPV6_NOT_SUPPORTED: 'Only NAT + IPv6 mode instances support IPv6 reassignment',
        INSTANCE_IPV6_REASSIGN_FAILED: 'Failed to reassign IPv6 address',
        INSTANCE_NO_IPV4: 'VM instance requires IPv4 address for port mapping',
        HOST_NO_IPV6_SUBNET: 'Host has no IPv6 subnet configured',
        IPV6_POOL_EXHAUSTED: 'IPv6 address pool exhausted, please try again later',
        IPV6_REASSIGN_COOLDOWN: 'IPv6 can only be reassigned once per day, please try again later',
        // Port mapping errors (additional)
        PORT_MAPPING_NAT_ONLY: 'Port mapping is only supported in NAT or dual-stack mode',
        PORT_NO_AVAILABLE: 'No available ports, please contact administrator',
        PORT_CONFLICT: 'Port is already in use, please use another port',
        PORT_MAPPING_INVALID_ID: 'Invalid instance or port mapping ID',
        // Image errors (additional)
        IMAGE_CREATE_FAILED: 'Image creation failed',
        IMAGE_UPDATE_FAILED: 'Image update failed',
        IMAGE_INVALID_HOST_ID: 'Invalid image or host ID',
        // Backup errors (additional)
        BACKUP_CREATE_FAILED: 'Backup creation failed',
        BACKUP_DELETE_FAILED: 'Backup deletion failed',
        BACKUP_EXPORT_FAILED: 'Backup export failed',
        BACKUP_QUOTA_NOT_SET: 'Please set backup quota for this instance first',
        BACKUP_EXPORT_STATUS_INVALID: 'Export task status is invalid',
        // Config errors
        CONFIG_INVALID_KEY: 'Invalid configuration key',
        CONFIG_INVALID_VALUE: 'Configuration value must be a non-negative integer',
        // Snapshot errors (additional)
        SNAPSHOT_QUOTA_NOT_SET: 'Please set snapshot quota for this instance first',
        // Package errors (additional)
        PACKAGE_HAS_INSTANCES: 'Package is in use by instances and cannot be deleted',
        // Resource limit errors
        RESOURCE_CPU_EXCEEDS_PACKAGE: 'CPU configuration exceeds package limit',
        RESOURCE_MEMORY_EXCEEDS_PACKAGE: 'Memory configuration exceeds package limit',
        RESOURCE_DISK_EXCEEDS_PACKAGE: 'Disk configuration exceeds package limit',
        // User quota errors (detailed)
        QUOTA_CPU_INSUFFICIENT: 'CPU quota insufficient',
        QUOTA_MEMORY_INSUFFICIENT: 'Memory quota insufficient',
        QUOTA_DISK_INSUFFICIENT: 'Disk quota insufficient',
        QUOTA_INSTANCE_LIMIT_REACHED: 'Instance limit reached',
        QUOTA_HOST_LIMIT_REACHED: 'Host limit reached',
        QUOTA_FRIEND_LIMIT_REACHED: 'Your friend limit reached',
        QUOTA_PORT_BELOW_USED: 'Port quota cannot be less than current usage',
        QUOTA_SNAPSHOT_BELOW_USED: 'Snapshot quota cannot be less than current usage',
        QUOTA_BACKUP_BELOW_USED: 'Backup quota cannot be less than current usage',
        QUOTA_PORT_TOTAL_EXCEEDED: 'Total port quota exceeds user limit',
        QUOTA_SNAPSHOT_TOTAL_EXCEEDED: 'Total snapshot quota exceeds user limit',
        QUOTA_BACKUP_TOTAL_EXCEEDED: 'Total backup quota exceeds user limit',
        // Image errors (additional)
        IMAGE_NOT_SYNCED: 'Image not synced to selected host',
        IMAGE_SYNCING_CANNOT_DELETE: 'Image is syncing on hosts and cannot be deleted',
        IMAGE_NO_HOSTS: 'No available hosts, please add hosts first',
        // Port errors (additional)
        PORT_RANGE_INVALID: 'Port must be within allowed range',
        // Snapshot policy errors
        SNAPSHOT_MANUAL_FULL: 'Manual snapshots have reached instance quota, cannot enable auto snapshot',
        SNAPSHOT_RETENTION_EXCEEDS: 'Retention count exceeds available quota',
        // Backup policy errors
        BACKUP_MANUAL_FULL: 'Manual backups have reached instance quota, cannot enable auto backup',
        BACKUP_RETENTION_EXCEEDS: 'Retention count exceeds available quota',
        // OAuth errors (additional)
        OAUTH_NOT_ENABLED: 'This OAuth provider is not enabled',
        // Storage pool errors
        STORAGE_POOL_NOT_CONFIGURED: 'No system disk storage pool configured on host, cannot create instance',
        // Friends system errors
        CANNOT_ADD_SELF: 'Cannot add yourself as a friend',
        ALREADY_FRIENDS: 'You are already friends',
        FRIEND_REQUEST_PENDING: 'Friend request is already pending',
        FRIEND_REQUEST_NOT_FOUND: 'Friend request not found',
        FRIEND_REQUEST_NOT_PENDING: 'Request has already been processed',
        FRIENDSHIP_NOT_FOUND: 'Friendship not found',
        TARGET_FRIEND_QUOTA_FULL: 'Target user friend quota is full, cannot add',
        // Package share errors
        CANNOT_SHARE_TO_SELF: 'Cannot share to yourself',
        PACKAGE_ALREADY_SHARED: 'Package is already shared to this user',
        SHARE_NOT_FOUND: 'Share record not found',
        NOT_FRIENDS: 'Target user is not your friend',
        SHARE_QUOTA_CPU_EXCEEDED: 'Shared package CPU quota exceeded',
        SHARE_QUOTA_MEMORY_EXCEEDED: 'Shared package memory quota exceeded',
        SHARE_QUOTA_INSTANCES_EXCEEDED: 'Shared package instance limit exceeded',
        // Email verification errors
        EMAIL_VERIFICATION_DISABLED: 'Email verification is not enabled',
        EMAIL_CODE_REQUIRED: 'Email verification code is required',
        INVALID_EMAIL_CODE: 'Invalid or expired verification code',
        TOO_MANY_VERIFICATION_REQUESTS: 'Too many verification requests, please try again later',
        EMAIL_SEND_FAILED: 'Failed to send verification email, please try again later',
        EMAIL_ALREADY_REGISTERED: 'This email address is already in use',
        EMAIL_DOMAIN_NOT_ALLOWED: 'This email domain is not allowed for registration, please use another email',
        // Transfer errors
        TRANSFER_NOT_FOUND: 'Transfer request not found',
        TRANSFER_TO_SELF: 'Cannot transfer to yourself',
        TRANSFER_TO_BANNED: 'Cannot transfer to a banned user',
        TRANSFER_ALREADY_PENDING: 'This instance already has a pending transfer request',
        TRANSFER_NOT_PENDING: 'Transfer request is not pending',
        TRANSFER_INVALID_STATUS: 'Instance status does not allow transfer',
        TRANSFER_QUOTA_NOT_FOUND: 'Target user quota not found',
        TRANSFER_QUOTA_INSUFFICIENT: 'Target user quota insufficient',
        TRANSFER_INSTANCE_LOCKED: 'Instance is locked due to pending transfer',
        TRANSFER_HOST_DISABLED: 'Transfer is disabled for this host',
        TRANSFER_INSUFFICIENT_BALANCE: 'Insufficient balance for transfer fee',
        // Transfer process errors
        INSTANCE_MUST_BE_STOPPED: 'Instance must be stopped before transfer',
        INCUS_RENAME_FAILED: 'Failed to rename instance on host',
        DATABASE_ERROR: 'Database operation failed, please try again',
        // Sensitive operation verification errors
        VERIFICATION_REQUIRED: 'This operation requires verification',
        INVALID_CODE: 'Verification code is invalid or expired',
        NO_NOTIFICATION_CHANNEL: 'No notification channel configured',
        EMAIL_NOT_CONFIGURED: 'Email not configured, cannot send verification code',
        SEND_FAILED: 'Failed to send verification code',
        // Checkin errors
        CHECKIN_NO_INSTANCE: 'You need at least one instance to check in',
        CHECKIN_ALREADY_TODAY: 'You have already checked in today',
        REDEEM_ALREADY_TODAY: 'You have already redeemed a code today',
        REDEEM_CODE_NOT_FOUND: 'Redeem code not found',
        REDEEM_CODE_USED: 'Redeem code has already been used',
        REDEEM_CODE_EXPIRED: 'Redeem code has expired',
        REDEEM_CODE_SELF_ONLY: 'This redeem code can only be used by its owner',
        REDEEM_CODE_DISABLED: 'This redeem code has been disabled',
        REDEEM_CODE_INVALID_FORMAT: 'Invalid code format, only h- prefix codes are supported',
        REDEEM_CODE_EXHAUSTED: 'This redeem code has reached its maximum usage limit',
        REDEEM_CODE_ALREADY_USED_BY_USER: 'You have already used this redeem code',
        REDEEM_CODE_HOST_MISMATCH: 'This redeem code can only be used on instances from the same host',
        REDEEM_CODE_BATCH_LIMIT: 'You have already used another redeem code from this batch',
        REDEEM_EXCEEDS_PACKAGE_QUOTA: 'Redeeming would exceed instance package quota',
        REDEEM_ALREADY_AT_LIMIT: 'Instance resource is already at package limit',
        CHECKIN_CODE_PAID_INSTANCE: 'Check-in redeem codes can only be used on free instances',
        PAID_INSTANCE_DELETION_NOT_ALLOWED: 'Paid instances cannot be deleted',
        // Balance errors
        INSUFFICIENT_BALANCE: 'Insufficient balance, please top up first',
        INTERNAL_ERROR: 'Internal server error',
    },

    // Traffic Statistics
    traffic: {
        title: 'Traffic Statistics',
        monthlyUsage: 'Monthly Traffic',
        used: 'Used',
        unlimited: 'Unlimited',
        total: 'Total',
        history30Days: 'Last 30 Days Traffic',
        historyPeriod: 'Period Traffic',
        noData: 'No traffic data',
        noHistoryData: 'No history data',
        throttledHint: 'Throttled to 1Mbps',
        resetHint: 'Resets on the 1st of each month',
        periodResetHint: 'Resets on the {date}th of each month',
        status: {
            normal: 'Normal',
            warning: 'Warning',
            limited: 'Limited',
        },
        download: 'Download',
        upload: 'Upload',
        limit: 'Limit',
        extraQuota: 'Extra Quota',
        resetDate: 'Reset Date',
        nextReset: 'Next Reset',
    },

    // Instance Transfer
    transfer: {
        title: 'Instance Transfer',
        sentTab: 'Sent',
        receivedTab: 'Received',
        pendingCount: 'Pending',
        noTransfers: 'No transfer records',
        noPendingTransfers: 'No pending transfers',
        searchPlaceholder: 'Search by instance name, username, or remark...',
        // Status
        status: {
            pending: 'Pending',
            processing: 'Processing',
            accepted: 'Accepted',
            rejected: 'Rejected',
            cancelled: 'Cancelled',
        },
        // Actions
        actions: {
            transfer: 'Transfer',
            accept: 'Accept',
            reject: 'Reject',
            cancel: 'Cancel',
            push: 'Push',
        },
        // Completion times
        completedAt: 'Completed at',
        rejectedAt: 'Rejected at',
        cancelledAt: 'Cancelled at',
        // Transfer Modal
        modal: {
            title: 'Transfer Instance',
            targetUser: 'Target Username',
            targetUserPlaceholder: 'Enter target username',
            searchUser: 'Search User',
            userNotFound: 'User not found',
            userBanned: 'This user is banned',
            cannotTransferToSelf: 'Cannot transfer to yourself',
            remark: 'Remark (optional)',
            remarkPlaceholder: 'Enter transfer remark',
            quotaCheck: 'Quota Check',
            instance: 'Instance',
            quotaSufficient: 'Quota sufficient',
            quotaInsufficient: 'Quota insufficient',
            canTransfer: 'User status is normal, transfer operation can be performed',
            confirmTransfer: 'Confirm Transfer',
            transferring: 'Transferring...',
            deleteWarning: 'Note: If the recipient accepts the transfer, the system will automatically delete the instance\'s port mappings, proxy sites, snapshots, backups and other associated resources.',
            feeLabel: 'Transfer Fee',
            balanceLabel: 'Current Balance',
            insufficientBalance: 'Insufficient balance, please top up first',
            feeRefundHint: 'Fee will be charged upon confirmation. Automatically refunded if the recipient rejects',
        },
        // Reject Modal
        rejectModal: {
            title: 'Reject Transfer',
            reason: 'Reason (optional)',
            reasonPlaceholder: 'Enter rejection reason',
        },
        // Config Detail Modal
        configModal: {
            title: 'Configuration at Transfer',
            instanceName: 'Instance Name',
            hostInfo: 'Host Information',
            networkMode: 'Network Mode',
            portMappings: 'Port Mappings',
            snapshots: 'Snapshots',
            backups: 'Backups',
            package: 'Package',
        },
        hasRemark: 'Has remark',
        // Detail
        detail: {
            fromUser: 'From',
            toUser: 'To',
            instance: 'Instance',
            snapshot: 'Configuration at Transfer',
            cpu: 'CPU',
            memory: 'Memory',
            disk: 'Disk',
            ports: 'Port Mappings',
            snapshots: 'Snapshots',
            backups: 'Backups',
            host: 'Host',
            package: 'Package',
            remark: 'Remark',
            rejectReason: 'Rejection Reason',
            createdAt: 'Created At',
            acceptedAt: 'Accepted At',
            rejectedAt: 'Rejected At',
            cancelledAt: 'Cancelled At',
        },
        // Messages
        messages: {
            transferSuccess: 'Transfer request sent',
            transferComplete: 'Transfer completed',
            acceptSuccess: 'Transfer accepted',
            rejectSuccess: 'Transfer rejected',
            cancelSuccess: 'Transfer cancelled',
            pushSuccess: 'Instance pushed successfully',
            instanceLocked: 'This instance is being transferred and cannot be operated',
        },
        // Errors
        errors: {
            TRANSFER_NOT_FOUND: 'Transfer request not found',
            TRANSFER_TO_SELF: 'Cannot transfer to yourself',
            TRANSFER_TO_BANNED: 'Cannot transfer to a banned user',
            TRANSFER_ALREADY_PENDING: 'This instance already has a pending transfer',
            TRANSFER_NOT_PENDING: 'Transfer request is not pending',
            TRANSFER_INVALID_STATUS: 'Instance status does not allow transfer',
            TRANSFER_QUOTA_NOT_FOUND: 'Target user quota not found',
            TRANSFER_QUOTA_INSUFFICIENT: 'Target user quota insufficient',
            TRANSFER_INSTANCE_LOCKED: 'Instance is locked due to pending transfer',
            TRANSFER_HOST_DISABLED: 'Transfer is disabled for this host',
            TRANSFER_INSUFFICIENT_BALANCE: 'Insufficient balance for transfer fee',
            PUSH_NOT_HOST_OWNER: 'Only host owner can push transfer directly',
        },
    },

    // Friends System
    friends: {
        title: 'Friends',
        description: 'Manage your friends list. Friends can share resources with each other',
        friendsList: 'Friends List',
        pendingRequests: 'Pending Requests',
        historyRequests: 'History',
        addFriend: 'Add Friend',
        username: 'Username',
        usernamePlaceholder: 'Enter username',
        usernameHint: 'Enter the username of the friend you want to add',
        remark: 'Remark',
        remarkPlaceholder: 'Enter remark (optional)',
        remarkHint: 'e.g., how you met, purpose, etc.',
        sendRequest: 'Send Request',
        accept: 'Accept',
        reject: 'Reject',
        noFriends: 'No friends yet',
        noFriendsHint: 'Add friends to share hosts, packages, and images',
        noSearchResult: 'No matching friends found',
        noHistorySearchResult: 'No matching history records found',
        noPendingRequests: 'No pending friend requests',
        noHistoryRecords: 'No history records',
        noHistoryRecordsHint: 'Processed friend requests will appear here',
        addedOn: 'Added on',
        requestedOn: 'Requested on',
        sentOn: 'Sent on',
        sentTo: 'Sent to {username}',
        processedOn: 'Processed on',
        confirmRemove: 'Are you sure you want to remove {name} from your friends?',
        requestSent: 'Friend request sent',
        requestAccepted: 'Friend request accepted',
        requestRejected: 'Friend request rejected',
        friendRemoved: 'Friend removed',
        statusAccepted: 'Accepted',
        statusRejected: 'Rejected',
        filterAll: 'All',
        filterAccepted: 'Accepted',
        filterRejected: 'Rejected',
        hosts: 'Hosts',
        instances: 'Instances',
        // Invite codes
        invites: 'Invite Codes',
        generateInvite: 'Generate Invite',
        generateInviteTitle: 'Generate Invite Code',
        inviteCode: 'Invite Code',
        inviteStatus: 'Status',
        inviteUsed: 'Used',
        inviteExpired: 'Expired',
        inviteUnused: 'Unused',
        usedBy: 'Used By',
        createdAt: 'Created At',
        expiresAt: 'Expires At',
        permanent: 'Permanent',
        noInvites: 'No invite codes',
        noInvitesHint: 'Generate invite codes for others to register',
        inviteCount: 'Quantity',
        inviteCountHint: 'Can generate 1-10 invite codes at once',
        expireDays: 'Expire Days',
        expireDaysPlaceholder: '0 means never expire',
        expireDaysHint: 'Set expiration time for invite codes, 0 means never expire',
        generate: 'Generate',
        confirmDeleteInvite: 'Are you sure to delete invite code {code}?',
        inviteDeleted: 'Invite code deleted',
        inviteGenerated: 'Invite Code Generated',
        copyCode: 'Copy Code',
        copyLink: 'Copy Link',
        inviteCodeCopied: 'Invite code copied',
        inviteLinkCopied: 'Invite link copied',
        close: 'Close',
        deleteInvite: 'Delete',
        userNotFound: 'User not found',
        cannotAddSelf: 'Cannot add yourself as a friend',
        alreadyFriend: 'You are already friends',
        requestAlreadyPending: 'Friend request is already pending',
        requestNotFound: 'Request not found or already processed',
        friendshipNotFound: 'Friendship not found',
        // Package sharing
        selectFriendHint: 'Select a friend',
        selectFriendDesc: 'Click a friend card on the left to manage package sharing',
        sharedPackages: 'Shared Packages',
        availablePackages: 'Available Packages',
        noSharedPackages: 'No packages shared yet',
        addShare: 'Add Share',
        addFirstShare: 'Share your first package',
        removeShare: 'Remove Share',
        editQuota: 'Edit Quota',
        quotaMultiplier: 'Quota Multiplier',
        quotaMultiplierHint: 'e.g. 1, 1.5, 2x, set the resource ratio available to friend',
        maxInstances: 'Max Instances',
        maxInstancesHint: 'Limit the number of instances friend can create',
        noLimit: 'No limit',
        currentUsage: 'Current Usage',
        shareAdded: 'Package shared',
        shareRemoved: 'Share removed',
        quotaUpdated: 'Quota updated',
        confirmRemoveShare: 'Are you sure you want to remove the share of {package}?',
        addShareTitle: 'Share Package',
        shareToFriend: 'Share to this friend',
        selectPackage: 'Select Package',
        selectPackagePlaceholder: 'Select a package to share',
        confirmShare: 'Confirm Share',
        editQuotaTitle: 'Edit Quota Limits',
        sharedTo: 'Shared to',
        removeFriend: 'Remove Friend',
        noPackagesToShare: 'You have no packages to share',
        createPackageFirst: 'Please create a package in "My Packages" first',
        noPackageSearchResult: 'No matching packages found',
    },

    // Package labels
    package: {
        shared: 'Friend',
        globalShared: 'Available',
        friendPrefix: 'Friend:',
        myPackage: 'My Package',
        soldOut: 'Sold Out',
    },

    // User Resources Management
    resources: {
        hosts: {
            title: 'My Hosts',
            description: 'Manage your hosts that can be used by you and your friends',
            create: 'Add Host',
            createDesc: 'Add a new Incus host',
            ubuntuOnlyHint: 'Currently supports Ubuntu 22.04+ and Debian 11+ only.',
            installHintTitle: 'After submitting, the system will generate an install command with the panel URL and Token embedded. Copy and run it on the host to complete installation.',
            installHintIpv6: 'Tip: For IPv6 modes (NAT+IPv6, IPv6 Only), run the install script on the host first. It will auto-generate IPv6 subnet info for you to fill in below.',
            ipv6OptionalHint: 'Not sure? Leave blank for now. Run the install script on the host first — it will detect and display your IPv6 subnet. Then come back and edit the node to fill in.',
            storagePoolAfterConnectHint: 'After the node connects successfully, remember to create a storage pool from the Storage tab on the node detail page.',
            noHosts: 'No hosts',
            noHostsHint: 'Add hosts to create instances on them',
            calibrateAll: 'Sync All Usage',
            noOnlineHosts: 'No online hosts to sync',
            calibrateAllDone: 'Synced {total} hosts, {changed} with differences corrected',
            calibrateAllNoChange: 'Synced {total} hosts, no differences',
            nameHint: 'Node name is prefixed with PEER + your user ID, followed by custom suffix',
            nameSuffixRequired: 'Please enter the node name suffix',
            // Admin only: Host scope toggle
            mine: 'My Hosts',
            hosted: 'Hosted',
            owner: 'Owner',
            filterByUserId: 'User ID',
            takeoverOfficial: 'Take Over',
            takeoverOfficialLoading: 'Taking over...',
            takeoverOfficialConfirm: 'Take over host "{name}" as official? This transfers the current host and any safely transferable packages. Existing instances stay with their current users.',
            takeoverOfficialSuccess: 'Host {name} taken over. {packages} packages transferred, {instances} instances kept.',
            takeoverOfficialDetached: '{count} packages were still bound to other hosted nodes, so the current host binding was removed: {names}',
            takeoverOfficialBlocked: 'Takeover blocked: {count} packages would lose all bound hosts after removing the current host. Resolve these packages first: {names}',
        },
        packages: {
            title: 'My Packages',
            description: 'Manage your package configurations that can be used by you and your friends',
            create: 'Create Package',
            noPackages: 'No packages',
            noPackagesHint: 'Create packages to use when creating instances',
            share: 'Share Package',
            viewShares: 'View Shares',
            selectFriend: 'Select Friend',
            selectFriendPlaceholder: 'Please select a friend to share with',
            noFriends: 'No friends yet, please add friends first',
            shareSuccess: 'Package shared successfully',
            shareFailed: 'Failed to share package',
            confirmUnshare: 'Are you sure you want to unshare?',
            unshareSuccess: 'Unshared successfully',
            unshareFailed: 'Failed to unshare',
            sharesList: 'Shares List',
            sharesCount: '{count} people',
            noShares: 'No shares yet',
            noSharesHint: 'Share to let friends use this package',
            sharedAt: 'Shared at',
            unshare: 'Unshare',
            searchFriend: 'Search friends...',
            noAvailableFriends: 'All friends have been shared this package',
            selectToShare: 'Select a friend to share',
            // Quota limits
            quotaSettings: 'Quota Limits',
            quotaMultiplier: 'Resource Quota Multiplier',
            quotaMultiplierHint: 'Limit CPU/Memory as a fraction of package quota',
            maxInstances: 'Max Instances',
            maxInstancesHint: 'Limit the maximum number of instances',
            noLimit: 'No limit',
            instanceUnit: '{n} instance | {n} instances',
            quotaDisplay: 'Quota: {multiplier} · Instances: {instances}',
            usageDisplay: 'Used: {cpu}% CPU / {memory} MB Memory / {instances} instances',
            updateQuota: 'Update Quota',
            updateQuotaSuccess: 'Quota updated',
            updateQuotaFailed: 'Failed to update quota',
            // Enhanced modal additions
            shareToFriend: 'Share Package to Friend',
            noFriendsHint: 'Add friends first to share packages',
            allFriendsShared: 'All Shared',
            confirmShare: 'Confirm Share',
            editQuota: 'Edit Quota',
            editQuotaFor: 'Editing quota for {username}',
            quotaUpdated: 'Quota updated',
            quotaUpdateFailed: 'Failed to update quota',
            usageStatus: 'Usage Status',
            instanceCount: 'Instance Count',
            packageInstanceCount: 'Package Instances',
            networkModeColumn: 'Network Mode',
            instanceTypeColumn: 'Instance Type',
            trafficMultiplierColumn: 'Traffic Multiplier',
            hostColumn: 'Host',
            instanceColumn: 'Instances',
            publicBadge: 'Public',
            currentUsage: 'Current: {cpu}% CPU / {memory} MB Memory / {instances} instances',
            currentUsageInfo: 'Currently using {cpu}% CPU, {memory} MB memory, {instances} instances',
            addShare: 'Add Share',
            globalShared: 'Global Shared',
            shared: 'Shared',
            searchPlaceholder: 'Search name, host, description...',
            noSearchResults: 'No matching packages found',
            clearSearch: 'Clear search',
            // Notification channel settings
            notifyChannel: 'Notification Channel',
            notifyChannelTitle: 'Resource Release Notification Channel',
            notifyChannelDesc: 'System will send notifications via this channel when users delete instances or when quota is released',
            // Share link
            copyShareLink: 'Copy Share Link',
            shareLinkCopied: 'Share link copied, users can access this link to directly create instances',
            // Admin only: Package scope toggle
            mine: 'My Packages',
            hosted: 'Hosted',
            owner: 'Owner',
            filterByUserId: 'User ID',
        },
        // Package plans management
        plans: {
            title: 'Plan Management',
            manage: 'Manage Plans',
            noPlans: 'No plans',
            noPlansHint: 'Create a plan to allow users to purchase paid instances for this package',
            add: 'Add Plan',
            create: 'Create Plan',
            edit: 'Edit Plan',
            name: 'Plan Name',
            namePlaceholder: 'e.g., Basic, Pro, Enterprise',
            description: 'Plan Description',
            descriptionPlaceholder: 'Optional, describe the plan features',
            resourceConfig: 'Resource Configuration',
            portLimit: 'Ports',
            snapshotLimit: 'Snapshots',
            backupLimit: 'Backups',
            siteLimit: 'Sites',
            swapSize: 'SWAP Size',
            trafficLimit: 'Traffic Limit',
            trafficSpeed: 'Bandwidth Limit',
            unlimitedHint: 'Leave empty for unlimited',
            billingConfig: 'Billing Configuration',
            price: 'Price',
            billingCycle: 'Billing Cycle',
            setupFee: 'Setup Fee',
            slaGuarantee: 'SLA Guarantee',
            stock: 'Stock',
            isActive: 'Enable Plan',
            status: 'Plan Status',
            statusActive: 'Available',
            statusActiveHint: 'Visible and available for new orders',
            statusSoldOut: 'Sold Out',
            statusSoldOutHint: 'Still visible, but blocked for new orders and plan changes',
            statusInactive: 'Inactive',
            statusInactiveHint: 'Hidden from order entry points and cannot be selected',
            sortOrder: 'Sort Order',
            daily: 'Daily',
            weekly: 'Weekly',
            monthly: 'Monthly',
            quarterly: 'Quarterly',
            semiAnnual: 'Semi-Annual',
            yearly: 'Yearly',
            days: 'days',
            months: 'months',
            createSuccess: 'Plan created successfully',
            updateSuccess: 'Plan updated successfully',
            saveFailed: 'Failed to save plan',
            priceRangeHint: 'Max ¥{max}',
            priceRangeError: 'Plan price must be between 0 and {max} yuan, with up to 2 decimal places',
            confirmDelete: 'Are you sure you want to delete the plan "{name}"?',
            deleteSuccess: 'Plan deleted',
            deleteFailed: 'Failed to delete plan',
        },
        images: {
            title: 'My Images',
            description: 'Manage your image configurations that can be used by you and your friends',
            create: 'Add Image',
            noImages: 'No images',
            noImagesHint: 'Add images to use when creating instances',
        },
    },

    // Instance config tab
    instanceConfig: {
        title: 'Advanced Configuration',
        sections: {
            swap: 'SWAP',
            storageIO: 'Storage I/O Limits',
            networkLimits: 'Network Limits',
            processScheduling: 'Process & Scheduling',
            bootSettings: 'Boot Settings',
        },
        swap: {
            size: 'Size',
            enabled: 'Enabled',
            disabled: 'Closed',
            enableButton: 'Enable SWAP',
            disableButton: 'Disable SWAP',
            toggleHint: 'SWAP can be enabled or disabled at any time and the current state is kept after rebuild/recreate.',
            runningRequired: 'The VM must be running before SWAP can be enabled.',
            vmHint: 'VMs enable SWAP persistently through a guest swapfile.',
            containerHint: 'Containers apply SWAP through the Incus memory swap limit.',
            enableConfirmTitle: 'Enable SWAP',
            enableConfirmText: 'Enable {size} of SWAP for this instance?',
            disableConfirmTitle: 'Disable SWAP',
            disableConfirmText: 'Disable SWAP for this instance?',
            enableSuccess: 'SWAP enabled',
            enableFailed: 'Failed to enable SWAP',
            disableSuccess: 'SWAP disabled',
            disableFailed: 'Failed to disable SWAP',
        },
        changeHost: {
            title: 'Change Host',
            description: 'Recreate this instance on another host in the same package while keeping the instance ID and billing data.',
            currentHost: 'Current host',
            availableCount: '{count} available host(s)',
            button: 'Change host',
            loadFailed: 'Failed to load hosts',
            submitFailed: 'Failed to submit host change',
            taskQueued: 'Host change task submitted, please wait...',
            modalTitle: 'Select Target Host',
            modalSubtitle: 'Only hosts in the same package with enough CPU and memory can be selected.',
            warning: 'This recreates the system disk. Old instance data, snapshots, backups, port mappings, and proxy sites will be cleared.',
            selectSshKey: 'SSH key',
            noSshKey: 'No SSH key available',
            confirm: 'Confirm Change',
            current: 'Current',
            available: 'Available',
            memory: 'Memory',
            reasons: {
                current_host: 'Current host',
                host_offline: 'Offline',
                host_type_mismatch: 'Type mismatch',
                cpu_full: 'Full',
                memory_full: 'Full',
                resource_unconfigured: 'Quota missing',
                image_unavailable: 'Image unavailable',
            },
        },
        overridden: 'Overridden',
        resetToDefault: 'Reset to package default',
        saveSuccess: 'Configuration saved',
        saveFailed: 'Failed to save configuration',
        boostProcesses: {
            button: 'Boost',
            title: 'Boost Process Limit',
            confirm: 'Are you sure you want to boost the process limit for this {type} instance? The process limit will be increased to {limit}.',
            hint: 'This operation only increases the process limit and does not affect other configurations',
            success: 'Process limit has been boosted to {limit}',
            failed: 'Failed to boost process limit',
        },
    },

    // Package form page
    packageForm: {
        createTitle: 'Create Package',
        editTitle: 'Edit Package',
        description: 'Configure resource limits and advanced options for the package',
        sections: {
            basicInfo: 'Basic Info',
            resourceLimits: 'Resource Limits',
            storageIO: 'Storage I/O Limits',
            networkLimits: 'Network Limits',
            processScheduling: 'Process & Scheduling',
            bootSettings: 'Boot Settings',
            prerequisite: 'Prerequisite Package',
            visibility: 'Visibility',
            instancePermissions: 'Instance Operation Permissions',
            advancedOptions: 'Advanced Options',
            instanceQuota: 'Instance Quota',
        },
        fields: {
            networkMode: 'Network Mode',
            instanceType: 'Instance Type',
            packageCreationMode: 'Package Usage',
            ioLimitMode: 'IO Limit Mode',
            limitsRead: 'Read Rate Limit',
            limitsWrite: 'Write Rate Limit',
            limitsReadIops: 'Read IOPS Limit',
            limitsWriteIops: 'Write IOPS Limit',
            limitsIngress: 'Ingress Bandwidth Limit',
            limitsEgress: 'Egress Bandwidth Limit',
            limitsProcesses: 'Max Processes',
            limitsCpuPriority: 'CPU Priority',
            bootAutostart: 'Auto-start with Host',
            bootAutostartPriority: 'Startup Priority',
            bootAutostartDelay: 'Startup Delay',
            bootHostShutdownTimeout: 'Shutdown Timeout',
            portLimit: 'Port Mapping Limit',
            snapshotLimit: 'Snapshot Limit',
            backupLimit: 'Backup Limit',
            siteLimit: 'Site Limit',
            hostStoragePools: 'Host System Disk Pool',
            hostTrafficMultiplier: 'Host Traffic Multiplier',
            requiredPackage: 'Prerequisite Package',
            publicAccess: 'Public Package',
            globalMaxInstances: 'Max Instances',
            allowInstanceDeletion: 'Allow users to delete instances',
        },
        hostSelector: {
            official: 'Official Hosts',
            searchPlaceholder: 'Search host name, region, URL, owner...',
            selectedCount: '{count} host(s) selected',
            noSearchResults: 'No matching hosts found',
            detailUnavailable: 'This host is not loaded in the current view; the binding will still be preserved when saved',
        },
        creationModes: {
            free: {
                title: 'Free Instance Package',
                description: 'Instances use the package resource, quota, and bandwidth limits directly',
            },
            paid: {
                title: 'Paid Instance Package',
                description: 'Create plans afterward to set resources, quotas, traffic, and price',
            },
        },
        ioMode: {
            throughput: 'Throughput Limit',
            iops: 'IOPS Limit',
        },
        hints: {
            ioLimitMode: 'Incus only supports one IO limit mode at a time, please select one',
            cpuPriority: '0 is lowest priority, 10 is highest priority',
            bootPriority: 'Lower values start first',
            startupDelay: 'Seconds to wait before starting instance (5-600)',
            shutdownTimeout: 'Seconds to wait for instance shutdown when host shuts down (30-600)',
            instanceQuota: 'Limit the number of resources a user can create on instances using this package',
            portLimit: 'Maximum port mappings per instance',
            snapshotLimit: 'Maximum snapshots per instance (0 = no quota)',
            backupLimit: 'Maximum backups per instance (0 = no quota)',
            siteLimit: 'Maximum proxy sites per instance (0 = no quota)',
            hostStoragePools: 'Choose the default system disk storage pool for each bound host. Leave empty to use automatic selection.',
            hostTrafficMultiplier: 'Instance monthly traffic = package or plan traffic multiplied by this value. Default is 1.',
            requiredPackage: 'When selected, users must already have an instance from this package before they can create an instance from this package.',
            noSystemStoragePools: 'This host currently has no storage pool available for instance system disks',
            instanceType: 'Containers are lightweight and fast, VMs provide full isolation',
            publicAccess: 'When enabled, the package will be visible to all users who can use it to create instances; when disabled, the package will be hidden/archived',
            globalMaxInstances: 'Limit the maximum number of instances users can create. Required integer from 1 to 5.',
            allowInstanceDeletion: 'When disabled, instances created with this package will not allow users to delete them',
            freePackageCreationMode: 'Free instances do not need a plan. They inherit the settings on this page directly. If you need an entry requirement or want to use the paid instance flow, choose a paid instance package, then add a plan with the price set to 0.',
            paidPackageCreationMode: 'Paid instances use the resources, quotas, traffic, and price from their plan. This page hides the fields that will be overridden by plans and saves package defaults instead.',
        },
        units: {
            seconds: 'seconds',
        },
        placeholders: {
            unlimited: 'Leave empty for unlimited',
            autoStoragePool: 'Auto select (not specified)',
            noPrerequisite: 'No prerequisite package',
        },
        validation: {
            cpuPriorityRange: 'CPU priority must be between 0 and 10',
            bootPriorityRange: 'Boot priority must be between 0 and 100',
            startupDelayRange: 'Startup delay must be between 5 and 600 seconds',
            shutdownTimeoutRange: 'Shutdown timeout must be between 30 and 600 seconds',
            portLimitMin: 'Port limit must be at least 1',
            globalMaxInstancesRange: 'Public package max instances must be an integer from 1 to 5',
        },
        typeHelp: {
            containerFast: 'Fast startup, seconds to ready',
            containerLight: 'Low overhead, suitable for most Linux apps',
            containerDocker: 'Docker support (requires nesting)',
            vmIsolation: 'Full isolation, independent kernel',
            vmKernel: 'Custom kernel and kernel modules support',
            vmWindows: 'Can run Windows and other non-Linux OS',
        },
    },

    // Sensitive operation verification
    sensitiveVerification: {
        title: 'Sensitive Operation Verification',
        description: 'This operation requires verification to ensure account security',
        operationLabel: 'Operation Type',
        requestHint: 'Click the button below to receive a verification code via your notification channel',
        sendCode: 'Send Code',
        sendingCode: 'Sending...',
        resendCode: 'Resend',
        resendIn: 'Resend in {seconds}s',
        codeSent: 'Code sent',
        codeSentTo: 'Code sent to {channel}',
        enterCode: 'Enter verification code',
        codePlaceholder: '000000',
        verify: 'Verify',
        verifying: 'Verifying...',
        verifySuccess: 'Verification successful, please retry the operation',
        verifyFailed: 'Verification failed',
        codeExpired: 'Code expired, please resend',
        invalidCode: 'Invalid code, please enter 6 digits',
        operationTypes: {
            change_password: 'Change Password',
            disable_2fa: 'Disable Two-Factor Authentication',
            change_email: 'Change Email Address',
            delete_account: 'Delete Account',
            delete_instance: 'Delete Instance',
            reinstall_instance: 'Reinstall Instance',
            recreate_instance: 'Recreate Instance',
            transfer_instance: 'Transfer Instance',
            delete_snapshot: 'Delete Snapshot',
            delete_backup: 'Delete Backup',
        },
        channels: {
            email: 'Email',
            telegram: 'Telegram',
            discord: 'Discord',
            webhook: 'Webhook',
        },
    },

    // Host Caddy management
    host: {
        caddy: {
            title: 'Caddy Proxy',
            description: 'Provide domain reverse proxy service for your instances through Caddy, with automatic SSL certificate.',
            enabled: 'Enabled',
            disabled: 'Disabled',
            notInstalled: 'Caddy is not installed yet. Click the button below to generate installation command.',
            generateCommand: 'Generate Command',
            installCommand: 'Installation Command',
            commandLabel: 'Run the following command on your host',
            confirmInstalled: 'Confirm Installed',
            viewCommand: 'View Command',
            resetCredentials: 'Reset Credentials',
            resetConfirm: 'After resetting credentials, you need to re-run the installation command on the host. Continue?',
            resetSuccess: 'Credentials reset. Please re-run the installation command on the host.',
            resetFailed: 'Failed to reset credentials',
            testConnection: 'Test Connection',
            apiPort: 'API Port',
            username: 'Username',
            password: 'Password',
            publicIp: 'Public IP',
            sitesCount: 'Sites Count',
            loadFailed: 'Failed to load Caddy status',
            generateFailed: 'Failed to generate command',
            confirmSuccess: 'Caddy installation confirmed',
            confirmFailed: 'Confirmation failed',
            testSuccess: 'Connection successful',
            testFailed: 'Connection failed',
            installHint: 'Installation Steps',
            step1: 'Copy the command above and run it as root on your host',
            step2: 'Wait for installation to complete, you should see "Caddy Reverse Proxy Ready"',
            step3: 'Return to this page and click "Confirm Installed" button',
            // Sites list
            sitesList: 'Proxy Sites',
            sitesTotalCount: '{count} sites in total',
            loadSitesFailed: 'Failed to load sites',
            noSites: 'No proxy sites',
            instance: 'Instance',
            targetPort: 'Target Port',
            siteActive: 'Active',
            sitePending: 'Pending',
            siteError: 'Error',
            siteDisabled: 'Disabled',
            prevPage: 'Previous',
            nextPage: 'Next',
            pageInfo: 'Page {current}/{total}, {count} total',
        },
        // Host create instance
        createInstance: {
            title: 'Create Instance',
            selfMode: 'Create for Myself',
            giftMode: 'Gift to User',
            selfModeHint: 'Use your own SSH key and init commands to create a free instance on this host.',
            giftModeHint: 'Create an instance for another user on this host. Paid plans can only be gifted for free days.',
            adminModeHint: 'Admins can create a free instance for a specified user on this host, or gift the first period of a paid instance.',
            selectPackage: 'Select Package',
            noPackages: 'No packages available for this host',
            noPackagesHint: 'Please create and bind packages to this host first',
            instanceName: 'Instance Name',
            giftDaysLabel: 'Free Gift Days',
            giftDaysHint: 'Only free gifted days are supported. No deduction will be made from the recipient balance.',
            giftDaysRange: 'Range: 1-365 days',
            giftDuration: 'Gift Duration',
            giftDurationValue: '{days} days free',
            giftOnlyFreeHint: 'After the free period ends, renewal will follow the selected plan price.',
            creating: 'Creating...',
            success: 'Instance created successfully',
            giftSuccess: 'Instance has been created for {username}',
            userInactive: 'This user is not active',
            cannotGiftToSelf: 'Use the self-create mode if you want to create an instance for yourself',
        },
        // Host owner notifies instance users
        notify: {
            title: 'Send Notification',
            sendToUsers: 'Notify Users',
            hint: 'An inbox message will be sent immediately to all unique users with instances on this host',
            hintSelected: 'An inbox message will be sent immediately to users of the {count} selected instance(s), with duplicate users removed',
            deliveryHint: 'If email is enabled, a single recipient is emailed immediately. Multiple recipients are queued and sent at a rate of one email per minute.',
            messageTitle: 'Message Title',
            titlePlaceholder: 'Enter message title',
            titleRequired: 'Please enter message title',
            messageContent: 'Message Content',
            contentPlaceholder: 'Enter message content',
            contentRequired: 'Please enter message content',
            sendEmail: 'Also send email notification',
            sendEmailHint: 'Emails are only sent to users who have an email address set. Bulk emails are queued automatically to avoid burst sending.',
            send: 'Send Notification',
            sendSuccess: 'Successfully sent to {count} users',
            sendSuccessBase: 'Inbox message sent to {count} users',
            emailDirectSuccess: '{count} email sent immediately',
            emailQueuedSuccess: '{count} email queued',
            emailSkipped: '{count} user(s) skipped because no email address is set',
            emailFailed: '{count} email(s) failed to send or queue',
            sendFailed: 'Failed to send',
            // Send to single instance user
            sendToUser: 'Send Message',
            sendToUserTitle: 'Send Message to {username}',
            sendToUserHint: 'Message will be sent to the owner of instance "{instance}"',
            sendToUserSuccess: 'Message sent',
        },
        // Renewal Price
        price: {
            editPrice: 'Edit Renewal Price',
            modalTitle: 'Edit Renewal Price',
            hint: 'Modify the renewal price for instance "{instance}". The new price will take effect at next renewal and will not affect the current month.',
            currentPrice: 'Current Price',
            newPrice: 'New Price',
            placeholder: 'Enter new renewal price',
            effectHint: 'New price takes effect at next renewal, no impact on current month',
            minPriceError: 'Price cannot be negative',
            samePriceError: 'New price is the same as current price',
            updateSuccess: 'Renewal price updated, user notified',
            updateFailed: 'Update failed',
        },
        // Batch Configuration
        batchConfig: {
            title: 'Batch Config',
            button: 'Batch Config',
            targetAll: 'Apply to: All {count} instances on host',
            targetSelected: 'Apply to: {count} selected instances',
            enableFieldHint: 'Check the box to enable modification for the field',
            // Sections
            section: {
                resources: 'Resources',
                quota: 'Quota Limits',
                permissions: 'Container Permissions',
                advanced: 'Advanced',
                io: 'Storage I/O Limits',
                network: 'Network Limits',
                process: 'Process & Scheduling',
                boot: 'Boot Settings',
            },
            // Fields
            cpu: 'CPU Cores',
            memory: 'Memory',
            disk: 'Disk',
            traffic: 'Traffic',
            swapEnabled: 'SWAP Toggle',
            swapSize: 'SWAP Size',
            portLimit: 'Port Limit',
            snapshotLimit: 'Snapshot Limit',
            backupLimit: 'Backup Limit',
            siteLimit: 'Site Limit',
            nested: 'Nested Virtualization',
            privileged: 'Privileged Container',
            limitsRead: 'Read Limit',
            limitsWrite: 'Write Limit',
            limitsIngress: 'Ingress Limit',
            limitsEgress: 'Egress Limit',
            limitsProcesses: 'Max Processes',
            limitsCpuPriority: 'CPU Priority',
            bootPriority: 'Boot Priority',
            bootAutostart: 'Auto Start',
            bootDelay: 'Boot Delay',
            shutdownTimeout: 'Shutdown Timeout',
            // Placeholders
            placeholder: {
                cpu: 'e.g. 1, 2, 4',
                memory: 'e.g. 512, 1024, 2048',
                disk: 'e.g. 10, 20, 50',
                traffic: 'e.g. 100, 500, 1000',
                swapSize: 'e.g. 512, 1024, 2048',
                limit: 'e.g. 5, 10, 20',
                ioLimit: 'e.g. 100MB',
                priority: 'e.g. 5',
                processLimit: 'e.g. 500, 1000',
                bootPriority: 'e.g. 0, 1, 2',
            },
            // Status
            processing: 'Applying batch configuration...',
            processed: 'Processed {current} / {total}',
            // Results
            success: 'Success',
            failed: 'Failed',
            successAll: 'Batch config applied successfully to {count} instances',
            partial: 'Partial success: {success} succeeded, {failed} failed',
            allFailed: 'All Failed',
            submitFailed: 'Submit failed',
            retrySuccess: 'Retry succeeded for {count} instances',
            retryPartial: 'Retry partial: {success} succeeded, {failed} failed',
            retryFailed: 'Retry Failed',
            failedDetails: 'Failed Details',
            instanceName: 'Instance Name',
            incusId: 'Incus ID',
            errorReason: 'Error Reason',
            copyIncusIds: 'Copy Failed Incus IDs',
            copiedIncusIds: 'Copied {count} Incus IDs',
            // Actions
            submit: 'Apply Config ({count})',
            close: 'Close',
            noFieldsEnabled: 'Please enable at least one config field',
            noChanges: 'No configuration changes',
        },
        // Batch migrate instances
        migrate: {
            title: 'Migrate Instances to Another Node',
            button: 'Migrate',
            selectedCount: '{count} instance(s) selected',
            targetNode: 'Target Node',
            selectTarget: 'Select target node',
            targetImage: 'Target OS',
            selectImage: 'Select target OS',
            selectImageRequired: 'Please select target OS',
            loadImagesFailed: 'Failed to load OS list',
            noImageAvailable: 'No OS images available on target node',
            imageHint: 'Migration will rebuild instances with this OS instead of their old image',
            instances: 'instances',
            warning: 'Migration Notes',
            warningCloudInit: 'cloud-init will be re-executed',
            warningImage: 'Instances will be rebuilt with the selected OS',
            warningIp: 'Instances will get new IP addresses',
            warningNotify: 'Users will be notified after migration',
            confirm: 'Confirm Migration',
            migrating: 'Migrating...',
            resultSummary: '{success} succeeded, {failed} failed',
            failedInstances: 'Failed Instances',
            loadHostsFailed: 'Failed to load host list',
            selectTargetRequired: 'Please select target node',
            noInstancesSelected: 'Please select instances to migrate first',
            failed: 'Migration failed',
            // Paid instance plan selection
            targetPlan: 'Target Plan',
            selectPlan: 'Select target plan',
            selectPlanRequired: 'Please select target plan',
            loadPlansFailed: 'Failed to load plan list',
            noPlanAvailable: 'No plans available on target node',
            planHint: 'Paid instances will use the new plan\'s renewal price, keeping original expiry date and coupon',
        },
        // Gift Days
        giftDays: {
            title: 'Gift Days',
            button: 'Gift Days',
            hint: 'Extend expiry date for selected paid instances for free, no charges.',
            confirm: 'Will gift days to {count} paid instance(s)',
            daysLabel: 'Days to Gift',
            daysRange: 'Range: 1-365 days',
            confirmButton: 'Confirm Gift',
            success: 'Successfully gifted {days} days to {count} instance(s)',
            partial: 'Success: {success}, Failed: {failed}',
            failed: 'Gift failed',
            skipped: 'Skipped {count} free instance(s)',
            noPaidInstances: 'Please select paid instances',
        },
    },

    // Inbox (Notifications)
    inbox: {
        title: 'Notification Center',
        description: 'View all your system notifications',
        notifications: 'Notifications',
        unread: 'Unread',
        all: 'All',
        allCategories: 'All Types',
        markAllRead: 'Mark all read',
        markRead: 'Mark as read',
        clearRead: 'Clear read',
        noMessages: 'No notifications',
        noUnread: 'No unread notifications',
        noCategoryMessages: 'No messages in this category',
        viewAll: 'View all',
        justNow: 'Just now',
        minutesAgo: '{n} min ago',
        hoursAgo: '{n} hr ago',
        daysAgo: '{n} days ago',
        deleteConfirm: 'Delete this notification?',
        clearConfirm: 'Clear all read notifications?',
        deleted: 'Deleted',
        cleared: 'Cleared',
        markedRead: 'Marked as read',
        markedAllRead: 'All marked as read',
        currentPageFiltered: 'Filtered on this page: {count} items',
        // Message categories
        categories: {
            instance: 'Instance',
            snapshot: 'Snapshot',
            backup: 'Backup',
            social: 'Friends',
            transfer: 'Transfer',
            package: 'Package',
            security: 'Security',
            quota: 'Quota',
            ticket: 'Ticket',
            system: 'System',
        },
    },

    // Quota Release
    quotaRelease: {
        title: 'Release Quota',
        packageQuota: 'Package Quota',
        noHosts: 'No hosts available',
        noHostsHint: 'No hosts are bound to this package',
        selectHosts: 'Select Hosts',
        selectAll: 'Select All',
        deselectAll: 'Deselect All',
        available: 'Available',
        quotaToAdd: 'Quota to Add',
        preview: 'Will add {cpu}% CPU and {memory} RAM to each of {count} host(s)',
        notificationChannel: 'Notification Channel',
        noNotification: 'No notification',
        notificationHint: 'System will send a notification via this channel after releasing quota',
        selectChannel: 'Select notification channel',
        bindChannelHint: 'Only disabled channels are shown for release quota notifications',
        unbindChannel: 'Unbind',
        sendNotification: 'Send Notification',
        noDisabledChannel: 'No available notification channel',
        noDisabledChannelHint: 'Please add a channel in "Profile - Notifications" and disable it first',
        channelEnabledWarning: 'This channel is enabled and will also receive system event notifications',
        noGlobalChannel: 'No global notification channel available',
        noGlobalChannelHint: 'Please ask the admin to create a global notification channel in system settings',
        confirm: 'Release Quota',
        success: 'Successfully released quota to {count} host(s)',
        failed: 'Failed to release quota',
        loadFailed: 'Failed to load host information',
        selectHost: 'Please select at least one host',
        enterQuota: 'Please enter the quota to add',
        channelUpdated: 'Notification channel updated',
        channelUpdateFailed: 'Failed to update notification channel',
    },

    // Web Terminal
    terminal: {
        title: 'Terminal',
        connecting: 'Connecting...',
        connected: 'Connected',
        disconnected: 'Disconnected',
        failed: 'Connection Failed',
        connectionFailed: 'Connection Failed',
        reconnect: 'Reconnect',
        requiresRunning: 'Instance must be running',
        clear: 'Clear',
        fullscreen: 'Fullscreen',
        exitFullscreen: 'Exit Fullscreen',
        fontSize: 'Font Size',
        fontSizeIncrease: 'Increase Font',
        fontSizeDecrease: 'Decrease Font',
        connectionError: 'Connection Error',
        reconnecting: 'Reconnecting...',
        close: 'Close Terminal',
        disconnect: 'Disconnect',
        modeExec: 'Shell',
        modeConsole: 'Console',
        modeBootConsole: 'Boot Console',
        modeSwitching: 'Switching to Shell',
        modeUnknown: 'Unknown Mode',
        consoleFallback: 'Fell back to console mode',
        consoleFallbackHint: 'This virtual machine could not enter shell mode, so the terminal is using the serial console. If the experience is poor, check qemu-guest-agent, cloud-init, and serial login configuration.',
        switchingToShell: 'Switching to Shell...',
        switchingToShellHint: 'The shell transport is ready, and the terminal is switching from boot console to interactive shell.',
        shellReadyNotice: 'Shell Attached',
        shellReadyHint: 'Boot console output is complete, and the terminal is now attached to the interactive shell.',
        consoleOnlyHint: 'The terminal is still on the console. The shell is not ready yet or is reconnecting.',
        instanceInfo: 'Instance: {name}',
        statusConnecting: 'Connecting',
        statusConnected: 'Connected',
        statusDisconnected: 'Disconnected',
        statusError: 'Error',
        escToClose: 'Press Esc to close',
        pressCtrlShiftFToSearch: 'Press Ctrl+Shift+F to search',
        searchPlaceholder: 'Search...',
        searchNext: 'Next',
        searchPrevious: 'Previous',
        restore: 'Restore Terminal',
        exportLog: 'Export Log',
        // Multi-tab
        tab: 'Tab',
        newTab: 'New Tab',
        closeTab: 'Close Tab',
        maxTabsReached: 'Maximum tabs reached',
        // Context menu
        contextMenu: {
            copy: 'Copy',
            paste: 'Paste',
            selectAll: 'Select All',
        },
        // Cloud-init status
        cloudInitChecking: 'Checking instance initialization status...',
        cloudInitInProgress: 'Instance is initializing',
        cloudInitInProgressHint: 'Instance is running Cloud-init initialization, which may take 10-60 seconds. Please click "Retry" to try connecting again.',
        cloudInitUnknown: 'Cloud-init Status Unknown',
        cloudInitUnknownHint: 'The Cloud-init status inside this KVM instance cannot be detected reliably right now. You can continue connecting or mark it as completed manually.',
        cloudInitRetry: 'Retry',
        cloudInitSkip: 'Skip and Connect',
        cloudInitManualComplete: 'Mark Complete',
        cloudInitManualCompleteSuccess: 'This instance has been marked as cloud-init completed manually',
        // Mobile hints
        mobileKeyboardHint: 'Please switch to English keyboard for best experience',
        // Help
        help: 'Help',
        helpTitle: 'Terminal Help',
        helpShortcuts: 'Keyboard Shortcuts',
        helpShortcutSearch: 'Search',
        helpShortcutCopy: 'Copy selection',
        helpShortcutPaste: 'Paste',
        helpShortcutFontIncrease: 'Increase font',
        helpShortcutFontDecrease: 'Decrease font',
        helpShortcutFontReset: 'Reset font',
        helpShortcutExport: 'Export log',
        helpShortcutNewTab: 'New tab',
        helpShortcutCloseTab: 'Close tab',
        helpMouseOps: 'Mouse Operations',
        helpMouseSelect: 'Drag to select text',
        helpMouseCopy: 'Right-click to copy/paste',
        helpMouseScroll: 'Scroll wheel to view history',
        helpTouchOps: 'Touch Operations',
        helpTouchPinchZoom: 'Pinch to zoom font size',
        helpTouchSwipeScroll: 'Swipe to scroll history',
        // Settings panel
        settings: 'Settings',
        settingBell: 'Terminal Alert Sound',
        settingBellDesc: 'Play sound when program sends alert (e.g., command complete, error warning)',
        settingAutoCopy: 'Auto Copy on Select',
        settingAutoCopyDesc: 'Automatically copy selected text to clipboard',
        settingLinkPreview: 'Link Preview',
        settingLinkPreviewDesc: 'Show URL when hovering over links',
        settingTouch: 'Touch Optimization',
        settingTouchDesc: 'Enable mobile touch gestures (pinch to zoom, etc.)',
        settingTheme: 'Terminal Theme',
        settingThemeDesc: 'Choose the color scheme for terminal',
        themeDark: 'Dark',
        themeLight: 'Light',
        themeHighContrast: 'High Contrast',
        currentStatus: 'Current Status',
        latency: 'Latency',
        savedCommands: {
            cloud: 'Cloud Sync',
            title: 'Saved Commands',
            subtitle: 'Store common commands and send them into the active terminal.',
            add: 'Add',
            synced: 'Synced',
            encrypted: 'Encrypted',
            count: '{count} saved',
            collapse: 'Collapse saved commands',
            expand: 'Expand saved commands',
            open: 'Open saved commands',
            short: 'Cmd',
            new: 'New Command',
            edit: 'Edit Command',
            name: 'Name',
            namePlaceholder: 'Example: Update package index',
            command: 'Command',
            commandPlaceholder: 'Enter the terminal command to save in the cloud',
            description: 'Description',
            descriptionPlaceholder: 'Optional note describing what this command does',
            loadFailed: 'Failed to load saved commands',
            createSuccess: 'Saved command created',
            updateSuccess: 'Saved command updated',
            saveFailed: 'Failed to save command',
            deleteSuccess: 'Saved command deleted',
            deleteFailed: 'Failed to delete command',
            deleteConfirm: 'Delete "{name}"?',
            emptyTitle: 'No saved commands yet',
            emptyDescription: 'Use the add button to keep your common terminal commands here.',
            selected: 'Selected: {name}',
            notSelected: 'Select a command to execute or delete it',
            execute: 'Run',
            runHint: 'The command is sent straight into the active terminal and executed immediately.',
            disconnectedHint: 'Connect the terminal before running a saved command',
            shellRequiredHint: 'Wait for the interactive shell before running a saved command',
        },
        // Mobile accessory bar
        paste: 'Paste',
        hideKeyboard: 'Hide Keyboard',
    },

    // Terminal management page
    terminalPage: {
        newConnection: 'New Connection',
        selectInstance: 'Select Instance',
        runningCount: '{count} running instances',
        selectedInstance: 'Selected Instance',
        selectionHint: 'Pick a running instance and the terminal will connect directly into it.',
        directShell: 'Console-first access',
        directShellHint: 'The terminal attaches to the boot console first, then switches to the interactive shell as soon as it is ready.',
        host: 'Host',
        package: 'Package',
        instanceId: 'Instance ID',
        statusRunning: 'Running',
        noConnections: 'No terminal connections',
        noRunningInstances: 'No running instances',
        noRunningInstancesHint: 'Start an instance first, or check its status from the instance detail page.',
        connect: 'Connect',
        description: 'Manage terminal connections for all instances',
        searchInstances: 'Search by name or image...',
        noMatchingInstances: 'No matching instances',
        noMatchingInstancesHint: 'Try another keyword or clear the search to see all running instances.',
    },

    // Ticket System
    tickets: {
        title: 'Ticket Center',
        myTickets: 'My Tickets',
        hostTickets: 'Received Tickets',
        createTicket: 'Create Ticket',
        newTicket: 'New Ticket',
        ticketDetails: 'Ticket Details',
        noTickets: 'No Tickets',
        noTicketsHint: 'You have not created any tickets yet',
        noHostTickets: 'No Received Tickets',
        noHostTicketsHint: 'Your hosts have not received any tickets',
        noUserTickets: 'No User Tickets',
        noUserTicketsHint: 'There are no user tickets sent directly to admins without an instance',
        noOfficialTickets: 'No Official Tickets',
        noOfficialTicketsHint: 'There are no tickets from official hosts',
        noHostedTickets: 'No Hosted Tickets',
        noHostedTicketsHint: 'There are no tickets from hosted nodes',
        // Ticket status
        status: {
            open: 'Open',
            in_progress: 'In Progress',
            resolved: 'Resolved',
            closed: 'Closed',
        },
        // Ticket priority
        priority: {
            low: 'Low',
            normal: 'Normal',
            high: 'High',
            urgent: 'Urgent',
        },
        // Ticket category
        category: {
            general: 'General Inquiry',
            billing: 'Billing Issue',
            technical: 'Technical Support',
            abuse: 'Abuse Report',
        },
        // Form
        subject: 'Subject',
        subjectPlaceholder: 'Brief description of the issue',
        content: 'Content',
        contentPlaceholder: 'Please enter at least 10 characters to describe your issue, or upload image attachments',
        selectInstance: 'Select Instance',
        selectInstanceHint: 'Select instance (optional)',
        noInstancesHint: 'You have no instances, you can submit ticket directly',
        hostedInstanceHint: 'For tickets related to hosted instances, please select the corresponding instance. The ticket will be sent to the node operator.',
            hostedInstanceHintTitle: 'Hosted Instance Tips',
        selectCategory: 'Select Category',
        selectPriority: 'Select Priority',
        // Actions
        reply: 'Reply',
        replyPlaceholder: 'Enter your reply...',
        close: 'Close Ticket',
        reopen: 'Reopen',
        updateStatus: 'Update Status',
        markResolved: 'Mark as Resolved',
        markInProgress: 'Mark as In Progress',
        // Confirmation dialogs
        confirmClose: 'Close this ticket?',
        confirmCloseHint: 'You will not be able to reply after closing',
        // Messages
        createSuccess: 'Ticket created successfully',
        replySuccess: 'Reply sent successfully',
        closeSuccess: 'Ticket closed',
        deleteMessage: 'Delete message',
        confirmDeleteMessage: 'Are you sure you want to delete this message? It will be invisible to everyone.',
        deleteMessageSuccess: 'Message deleted',
        statusUpdated: 'Status updated',
        // Other
        host: 'Host',
        instance: 'Instance',
        from: 'From',
        assignedTo: 'Assigned To',
        createdAt: 'Created At',
        lastReply: 'Last Reply',
        messages: 'Messages',
        viewDetails: 'View Details',
        pendingCount: 'Pending',
        allHosts: 'All Hosts',
        filterByHost: 'Filter by Host',
        filterByStatus: 'Filter by Status',
        sourceFilter: {
            all: 'All Tickets',
            user: 'User Tickets',
            official: 'Official Tickets',
            hosted: 'Hosted Tickets',
        },
        activeStatus: 'Active',
        allStatus: 'All',
        ownerReply: 'Support Reply',
        userReply: 'User Reply',
        ticketClosed: 'Ticket is closed, cannot reply',
        mustSelectInstance: 'Please select an instance first',
        noInstancesAvailable: 'No instances available',
        instanceDetails: 'Instance Details',
        instanceStatus: 'Status',
        instanceId: 'Instance ID',
        incusId: 'Incus ID',
        packageName: 'Package',
        cores: 'Cores',
        memory: 'Memory',
        disk: 'Disk',
        image: 'Image',
        loadMoreMessages: 'Load More Messages',
        remaining: 'remaining',
        needsReply: 'Needs Reply',
        searchPlaceholder: 'Search ticket ID, subject, username...',
        perPage: 'Per page',
        totalCount: 'Total {count}',
        images: {
            label: 'Image Attachments',
            hint: 'Supports JPG, PNG, WebP, GIF and AVIF. Up to {count} images, {size}MB each.',
            add: 'Add Images',
            remove: 'Remove Image',
            selected: '{count}/{max} images selected',
            maxReached: 'You can upload up to {count} images',
            invalidType: 'Only JPG, PNG, WebP, GIF and AVIF images are supported',
            fileTooLarge: 'Each image must be no larger than {size}MB',
            loadFailed: 'Failed to load image',
            zoomIn: 'Zoom in',
            zoomOut: 'Zoom out',
            resetZoom: 'Reset zoom',
        },
    },

    // Checkin system
    checkin: {
        title: 'Daily Check-in',
        checkinTab: 'Check-in',
        redeemTab: 'Redeem',
        recordsTab: 'Records',
        // Checkin status
        notCheckedIn: 'Not checked in today',
        alreadyCheckedIn: 'Already checked in today',
        checkinButton: 'Check-in',
        checkinSuccess: 'Check-in successful',
        noInstance: 'You need at least one instance to check in',
        clickToOpen: 'Click the gift box to claim your reward',
        opening: 'Opening',
        revealing: 'Revealing reward',
        congratulations: 'Congratulations! You got',
        // Redeem code
        redeemCode: 'Redeem Code',
        codeExpired: 'Expired',
        codeUsed: 'Used',
        expiresIn: 'Expires in',
        copyCode: 'Copy Code',
        codeCopied: 'Code copied',
        // Resource types
        resourceType: 'Resource Type',
        resourceValue: 'Resource Value',
        cpu: 'CPU',
        memory: 'Memory',
        disk: 'Disk',
        traffic: 'Traffic',
        points: 'Points',
        // Redeem
        redeemTitle: 'Redeem Code',
        inputCode: 'Enter redeem code',
        selectInstance: 'Select Instance',
        selectInstanceHint: 'Select a free instance to apply resources',
        redeemButton: 'Redeem',
        redeemSuccess: 'Redeem successful',
        cappedFromPackageLimit: 'capped at package limit',
        redeemHint: 'Check-in codes can only be used on free instances',
        alreadyRedeemed: 'Check-in code already redeemed today',
        noInstancesForRedeem: 'No free instances available',
        // Records
        checkinRecords: 'Check-in Records',
        redeemRecords: 'Redeem Records',
        noRecords: 'No records',
                showingRecent: 'Showing {count} of {total}',
        usedBy: 'Used by',
        usedFor: 'Used for',
        self: 'Self',
        others: 'Others',
        unused: 'Unused',
        // Share rules
        selfOnlyMode: 'Self-only',
        selfOnlyHint: 'Your codes have been used by others for 2 consecutive days. From today, only you can use your codes until you use one yourself',
                // Rules
                rulesTitle: 'Check-in Rules',
                rulesCheckin: 'Check-in',
                rulesCheckin1: 'Once daily, resets at midnight',
                rulesCheckin2: 'Requires at least 1 instance',
                rulesCheckin3: 'Randomly receive CPU / Memory / Disk / Traffic rewards',
                rulesRedeem: 'Redemption',
                rulesRedeem1: 'Redeem codes expire in 3 hours',
                rulesRedeem2: 'Limit 1 redemption per person per day',
                rulesRedeem3: 'Resources cannot exceed package limits',
                rulesShare: 'Sharing',
                rulesShare1: 'Redeem codes can be shared with friends',
                rulesShare2: 'Used by others for 2 consecutive days will restrict to self-only until you use one yourself',
        // Units
        percent: '%',
        mb: 'MB',
        gb: 'GB',
        // Resource pool system
        tabCheckin: 'Check-in',
        tabRedeem: 'Redeem',
        tabPool: 'Resource Pool',
        tabLogs: 'Logs',
        clickToCheckin: 'Click to check in and claim rewards',
        noInstances: 'You need at least one instance to check in',
        bonusPoints: 'Bonus {points} points',
        savedToPool: 'Added to resource pool',
        redeemSystemCode: 'System Redeem Code',
        enterCode: 'Enter redeem code',
        systemCodePlaceholder: 'Enter h- prefix system code',
        systemCodeHint: 'System codes (h- prefix) require selecting a target instance, resources will be applied directly to that instance',
        redeem: 'Redeem',
        redeemToInstanceSuccess: '{type} +{value}{unit} applied to {instance}',
        applyToInstance: 'Apply to Instance',
        amount: 'Amount',
        targetInstance: 'Target Instance',
        kvmCpuHint: 'CPU must be a multiple of 100 when applied to KVM instances',
        kvmHint: 'KVM limits: CPU must be multiple of 100, memory must be multiple of 128MB, disk must be multiple of 1GB, and memory/disk changes require stopped instance. LXC instances have no such limits.',
        apply: 'Apply',
        applySuccess: '{type} +{value}{unit} applied to {instance}',
        insufficientPool: 'Insufficient resource pool balance',
        enterAmount: 'Please enter amount',
        allActions: 'All actions',
        allResources: 'All resources',
        noLogs: 'No records',
        action: 'Action',
        instance: 'Instance',
        time: 'Time',
        actionCheckin: 'Check-in',
        actionRedeem: 'Redeem',
        actionAdminGrant: 'Admin grant',
        actionSystemGrant: 'System reward',
        actionLottery: 'Lottery',
        actionApply: 'Apply',
        actionSystemRedeem: 'System Code',
    },

    // Redeem codes management
    redeemCodes: {
        title: 'Redeem Codes',
        create: 'Create Code',
        createTitle: 'Create Redeem Code',
        createBatch: 'Batch Create',
        codeType: 'Resource Type',
        codeValue: 'Resource Value',
        resourceType: 'Resource Type',
        resourceValue: 'Resource Value',
        maxUses: 'Max Uses',
        usedCount: 'Used',
        expiresAt: 'Expires At',
        expiresAtHint: 'Leave empty for no expiration',
        neverExpires: 'Never expires',
        enabled: 'Enabled',
        disabled: 'Disabled',
        enable: 'Enable',
        disable: 'Disable',
        remark: 'Remark',
        remarkPlaceholder: 'Optional remark',
        batchCount: 'Quantity',
        batchCountHint: 'When greater than 1, generates single-use codes in batch',
        createSuccess: 'Redeem code created',
        batchCreateSuccess: 'Successfully created {count} redeem codes',
        createFailed: 'Failed to create',
        deleteConfirm: 'Confirm Delete',
        deleteSuccess: 'Successfully deleted {count} code(s)',
        deleteFailed: 'Failed to delete',
        confirmDelete: 'Confirm Delete',
        confirmDeleteMessage: 'Are you sure you want to delete {count} selected code(s)? This action cannot be undone.',
        deleteSelected: 'Delete Selected ({count})',
        updateSuccess: 'Updated successfully',
        copyCode: 'Copy Code',
        copyAll: 'Copy All',
        copyCodes: 'Copy All Codes',
        codesCopied: 'Codes copied',
        exhausted: 'Exhausted',
        expired: 'Expired',
        active: 'Active',
        paused: 'Paused',
        usages: 'Usage History',
        usageRecords: 'Usage Records',
        noUsages: 'No usage records',
        user: 'User',
        instance: 'Instance',
        usedAt: 'Used At',
        selectType: 'Select resource type',
        selectValue: 'Please select a value',
        empty: 'No redeem codes',
        emptyList: 'No redeem codes yet. Click the button above to create.',
        filterAll: 'All',
        filterEnabled: 'Enabled',
        filterDisabled: 'Disabled',
        batchDelete: 'Batch Delete',
        batchDeleteConfirm: 'Are you sure you want to delete {count} selected codes?',
        usesHint: 'Set to 1 for single-use code',
        batchHint: 'Batch create generates single-use codes only',
        batchResult: 'Batch Create Result',
        code: 'Code',
        type: 'Type',
        usage: 'Usage',
        status: 'Status',
        actions: 'Actions',
        loadFailed: 'Failed to load',
        batchId: 'Batch ID',
        batchLimitHint: 'Each user can only use one code from the same batch',
        batch: 'Batch',
        valueRange: 'Range: {min} - {max}',
        valueOutOfRange: 'Value must be between {min} and {max}',
        valueMustBeInteger: 'Value must be an integer',
    },

    // Extensions
    extensions: {
        title: 'Scripts',
        description: 'Manage extensions',
        initCommands: {
            title: 'Custom Init Commands',
            description: 'Create command templates to run during instance creation/rebuild',
            add: 'Add Command',
            addFirst: 'Add First Command',
            edit: 'Edit Command',
            view: 'View Details',
            viewDetail: 'Command Details',
            empty: 'No custom commands',
            emptyHint: 'Click the button above to create your first init command template',
            name: 'Name',
            namePlaceholder: 'Enter command name',
            command: 'Commands',
            commandPlaceholder: 'Enter shell commands, one per line\nExample:\napt update\napt install -y nginx',
            commandHint: 'One command per line, executed in order during instance initialization',
            distros: 'Compatible Distros',
            distrosHint: 'Select the Linux distributions this command is compatible with',
            remark: 'Description',
            remarkPlaceholder: 'Optional description',
            createdAt: 'Created At',
            actions: 'Actions',
            status: 'Status',
            statusEnabled: 'Enabled',
            statusDisabled: 'Disabled',
            enabled: 'Command enabled',
            disabled: 'Command disabled',
            clickToEnable: 'Click to enable',
            clickToDisable: 'Click to disable',
            toggleFailed: 'Failed to toggle status',
            confirmDelete: 'Are you sure you want to delete command "{name}"? This action cannot be undone.',
            createSuccess: 'Command created',
            updateSuccess: 'Command updated',
            deleteSuccess: 'Command deleted',
            createFailed: 'Failed to create',
            updateFailed: 'Failed to update',
            deleteFailed: 'Failed to delete',
            loadFailed: 'Failed to load commands',
            loadDetailFailed: 'Failed to load command details',
            noContent: 'No content',
            lineCount: '{count} lines',
            // Modal
            addTitle: 'Add Init Command',
            editTitle: 'Edit Init Command',
            modalDesc: 'Commands will be executed during instance initialization',
            // Selector
            selectTitle: 'Init Commands',
            optional: '(optional)',
            noAvailable: 'No init commands available',
            goToManage: 'Go to Extensions to create',
            selectHint: 'Selected commands will run after instance initialization completes',
            selectedCount: '{count} selected',
            showAll: 'Show all {count}',
            collapse: 'Collapse',
            // Distro names
            distroAll: 'All Distros',
            distroNames: {
                all: 'All Distros',
                ubuntu: 'Ubuntu',
                debian: 'Debian',
                rhel: 'RHEL/CentOS/Fedora',
                alpine: 'Alpine',
                arch: 'Arch Linux',
                suse: 'openSUSE/SLES',
            },
        },
    },

    // Billing
    billing: {
        // Common
        balance: 'Balance',
        frozen: 'Frozen',
        totalRecharge: 'Total Recharge',
        totalConsume: 'Total Consumption',
        yuan: 'CNY',
        months: 'months',
        month: 'mo',
        days: 'days',
        freeInstance: 'Free Instance',
        paidInstance: 'Paid Instance',
        traffic: 'Monthly Traffic',
        trafficBidirectional: 'Bidirectional',
        soldOut: 'Sold Out',
        save: 'Save',
        setupFee: 'Setup Fee',
        cycle: {
            monthly: 'Monthly',
            quarterly: 'Quarterly',
            semiAnnual: 'Semi-Annual',
            annual: 'Annual',
            months: 'months',
        },
        
        // Instance billing info
        billingInfo: 'Billing Info',
        currentPlan: 'Current Plan',
        expiresAt: 'Expires At',
        neverExpires: 'Never Expires',
        autoRenew: 'Auto Renew',
        autoRenewOn: 'Auto On',
        autoRenewOff: 'Auto Off',
        autoRenewEnabled: 'Auto-renew enabled',
        autoRenewDisabled: 'Auto-renew disabled',
        autoRenewing: 'Auto-renewing',
        enableAutoRenew: 'Enable Auto-renew',
        disableAutoRenew: 'Disable Auto-renew',
        autoRenewHint: 'Will automatically deduct from balance 24 hours before expiration',
        autoRenewDesc: 'Once enabled, the instance will automatically renew per {cycle} cycle, costing ￥{price} each time',
        currentStatus: 'Current Status',
        
        // Renewal
        renew: 'Renew',
        renewInstance: 'Renew Instance',
        renewTitle: 'Renew Instance',
        selectRenewPeriod: 'Select Renewal Period',
        renewMonths: '{months} months',
        renewPrice: 'Renewal Amount',
        originalPrice: 'Original Price',
        affDiscount: 'Promo Code Discount',
        actualPrice: 'Actual Price',
        newExpiresAt: 'New Expiration',
        currentBalance: 'Current Balance',
        balanceAfterRenew: 'Balance After Renewal',
        insufficientBalance: 'Insufficient Balance',
        goRecharge: 'Go to Recharge',
        renewing: 'Renewing...',
        renewSuccess: 'Renewal Successful',
        renewFailed: 'Renewal Failed',
        freeInstanceNoRenew: 'Free instances do not need renewal',
        hostingRenewTooEarly: 'Hosted instances can only be renewed within 7 days before expiration (currently {days} days remaining)',
        
        // Plan change
        changePlan: 'Upgrade',
        changePlanTitle: 'Upgrade Instance Plan',
        upgrade: 'Upgrade',
        selectNewPlan: 'Select New Plan',
        currentPlanLabel: 'Current Plan',
        newPlanLabel: 'New Plan',
        remainingDays: 'Remaining Days',
        remainingValue: 'Remaining Value',
        newPlanCost: 'New Plan Cost',
        priceDiff: 'Price Difference',
        needPay: 'Amount to Pay',
        noPriceChange: 'No Price Difference',
        isUpgrade: 'Upgrade',
        planNotActive: 'Plan is inactive',
        planNoStock: 'Plan is sold out',
        changePlanInProgress: 'Upgrading plan...',
        changePlanSuccess: 'Plan upgraded successfully',
        changePlanFailed: 'Failed to upgrade plan',
        needRestart: 'Please restart instance to apply new configuration',
        newConfig: 'New Configuration',
        freeInstanceNoChange: 'Free instances do not support upgrade',
        samePlan: 'Cannot change to the same plan',
        // Change rules
        viewRules: 'View Rules',
        hideRules: 'Hide Rules',
        changePlanRulesTitle: 'Plan Upgrade Rules',
        changePlanRule1: 'Price difference calculated by daily rate; pay difference on upgrade',
        changePlanRule2: 'Remaining days must be ≥ 15 to upgrade plan',
        changePlanRule3: 'Expiration date remains unchanged',
        changePlanRule4: 'Promo code discounts continue to apply',
        // Highest plan
        alreadyHighestPlan: 'Already on the highest plan',
        contactForCustomPlan: 'Submit a ticket for custom higher configurations',
        // KVM/LXC restart hints
        kvmRestartHint: 'KVM instances require a restart to apply new configuration; instances using reinstall scripts may need to expand partitions manually',
        lxcInstantHint: 'LXC instance configuration takes effect immediately after upgrade',
        kvmRestartRequired: 'KVM instance plan has been changed, please restart the instance to apply new configuration',
        // Cannot change reasons
        cannotChange: 'Cannot Upgrade Now',
        cannotChangeRemainingDays: 'Less than {days} days remaining, cannot upgrade plan',
        cannotChangeInstanceStatus: 'Current instance status does not allow plan upgrade, only running or stopped instances can be modified',
        cannotChangeUnknown: 'Cannot upgrade plan at this time',
        // Calculation details
        oldDailyPrice: 'Current Daily Rate',
        newDailyPrice: 'New Daily Rate',
        day: 'day',
        newPlanCostOriginal: 'New Plan Remaining Cost',
        newPlanCostFinal: 'New Plan Remaining Cost (After Discount)',
        discountAmount: 'Promo Discount',
        
        // Billing records
        records: 'Records',
        billingRecords: 'Billing Records',
        recordType: 'Type',
        recordAmount: 'Amount',
        recordPeriod: 'Period',
        recordRemark: 'Remark',
        recordTypes: {
            purchase: 'Purchase',
            renewal: 'Renewal',
            upgrade: 'Upgrade',
            downgrade: 'Downgrade',
            admin_extension: 'Admin Extension',
        },
        
        // Recharge
        recharge: 'Recharge',
        rechargeTitle: 'Account Recharge',
        rechargeAmount: 'Recharge Amount',
        actualAmount: 'Actual Amount',
        fee: 'Fee',
        minAmount: 'Minimum Amount',
        maxAmount: 'Maximum Amount',
        selectPaymentMethod: 'Select Payment Method',
        noPaymentProviders: 'No payment methods available',
        createOrder: 'Create Order',
        creatingOrder: 'Creating order...',
        orderCreated: 'Order Created',
        orderNo: 'Order No.',
        orderStatus: 'Order Status',
        orderExpiredAt: 'Payment Deadline',
        cancelOrder: 'Cancel Order',
        orderCancelled: 'Order Cancelled',
        orderStatus_pending: 'Pending',
        orderStatus_paid: 'Paid',
        orderStatus_completed: 'Completed',
        orderStatus_failed: 'Failed',
        orderStatus_cancelled: 'Cancelled',
        orderStatus_expired: 'Expired',
        orderStatus_refunded: 'Refunded',
        
        // Recharge records
        rechargeRecords: 'Recharge Records',
        noRecords: 'No Records',
        viewDetails: 'View Details',
        
        // Balance logs
        balanceLogs: 'Balance History',
        balanceLogTypes: {
            recharge: 'Recharge',
            purchase: 'Purchase',
            renewal: 'Renewal',
            upgrade: 'Upgrade',
            downgrade: 'Downgrade',
            refund: 'Refund',
            admin_adjust: 'Admin Adjustment',
        },
        
        // Package plans
        plan: 'Plan',
        planName: 'Plan Name',
        planPrice: 'Price',
        planBillingCycle: 'Billing Cycle',
        planConfig: 'Configuration',
        planStock: 'Stock',
        planSoldOut: 'Sold Out',
        planInactive: 'Inactive',
        billingCycleMonthly: 'Monthly',
        billingCycleQuarterly: 'Quarterly',
        billingCycleYearly: 'Yearly',
        perMonth: '/mo',
        perQuarter: '/qtr',
        perYear: '/yr',
    },

    // Hosting Access
    hosting: {
        accessDenied: {
            title: 'Hosting Requirements Not Met',
            description: 'You need to meet the following condition to use hosting features:',
            condition: 'Own at least 1 instance',
            currentInstances: 'Currently own {count} instances',
            hint: 'Includes both free and paid instances, from official or hosted nodes.',
            featureHiddenCondition: 'Hosting is currently unavailable to new users',
            featureHiddenCurrent: 'You have not created any host yet, so this entry is currently hidden by the system.',
            featureHiddenHint: 'Contact an administrator to reopen hosting access, or try again when the feature is enabled again.',
        },
    },

    // Hosting Wallet
    hostingWallet: {
        title: 'Hosting Earnings',
        description: 'View your node hosting earnings and withdrawal records',
        hostingMember: 'Hosting Member',
        notice: {
            title: 'Hosting Notice',
        },
        balance: {
            available: 'Available Balance',
            frozen: 'Frozen',
            frozenNote: 'Income unfreezes after 30 days',
            totalIncome: 'Total Income',
        },
        stats: {
            myHostsCount: 'Hosted Nodes',
            instancesOnMyHosts: 'Node Instances',
            uniqueCustomersCount: 'Customers',
            monthIncome: 'This Month',
        },
        withdraw: {
            button: 'Request Withdrawal',
            minAmountNote: 'Withdrawal available when balance reaches {amount}',
        },
        tabs: {
            overview: 'Overview',
            logs: 'Transactions',
            withdrawals: 'Withdrawals',
            blocks: 'Blacklist',
        },
        overview: {
            title: 'Withdrawal Info',
            howItWorks: 'How It Works',
            step1Title: 'User Purchases',
            step1Desc: 'Users buy/renew instances on your nodes',
            step2Title: 'Income Frozen',
            step2Desc: 'Earnings credited to balance, frozen for 30 days',
            step3Title: 'Withdraw',
            step3Desc: 'Withdraw after freeze period ends',
            minAmountTitle: 'Minimum Amount',
            minAmount: 'Minimum withdrawal {amount}',
            feeTitle: 'Withdrawal Fee',
            feeDesc: 'Panel balance withdrawal fee {rate}%',
            feeDescNew: 'Panel balance withdrawal fee 5%, specified method fee 10%',
            manualTitle: 'Manual Withdrawal',
            manualDesc: 'For other methods (10% fee), please submit a ticket',
            withdrawMethodTitle: 'Withdrawal Method',
            withdrawMethodDesc: 'Self-serve withdraw to balance, or submit a ticket for other withdrawal methods',
        },
        logs: {
            noRecords: 'No transaction records',
            emptyHint: 'When users purchase instances on your nodes, earnings will appear here',
            searchPlaceholder: 'Search by username/email/instance...',
            filterAll: 'All Types',
            freePlan: 'Free',
            columns: {
                type: 'Type',
                amount: 'Amount',
                status: 'Status',
                buyer: 'Buyer',
                instance: 'Instance',
                host: 'Host',
                package: 'Package',
                plan: 'Plan',
                remark: 'Remark',
                time: 'Time',
            },
            types: {
                income: 'Income',
                unfreeze: 'Unfreeze',
                withdraw: 'Withdrawal',
                deduction: 'Deduction',
            },
            actionTypes: {
                purchase: 'Purchase',
                renew: 'Renew',
                upgrade: 'Upgrade',
                destroy: 'Destroy',
                unfreeze: 'Unfreeze',
                withdraw: 'Withdrawal',
                admin_adjust: 'Admin Adjust',
            },
            status: {
                frozen: 'Frozen',
                unfrozen: 'Unfrozen',
            },
            unknownInstance: 'Unknown Instance',
            unknownUser: 'Unknown User',
            unknownHost: 'Unknown Host',
        },
        perPage: '/page',
        prevPage: 'Previous',
        nextPage: 'Next',
        withdrawals: {
            noRecords: 'No withdrawal records',
            emptyTitle: 'No Withdrawals Yet',
            emptyHint: 'You can request a withdrawal once your available balance reaches the minimum amount',
            startEarning: 'Withdraw Now',
            columns: {
                amount: 'Amount',
                actualAmount: 'Actual Amount',
                target: 'Method',
                status: 'Status',
                time: 'Request Time',
            },
            target: {
                balance: 'Panel Balance',
            },
            status: {
                pending: 'Pending',
                approved: 'Approved',
                rejected: 'Rejected',
                completed: 'Completed',
            },
        },
        blocks: {
            title: 'User Blacklist',
            description: 'Blocked users cannot see your hosted packages or plans in the instance creation flow, and cannot create new instances from your packages.',
            total: '{count} users',
            searchLabel: 'Search users',
            searchPlaceholder: 'Enter UID, username, or email, at least 2 characters',
            noSearchResults: 'No matching users found',
            blockedUsers: 'Blocked Users',
            effectHint: 'These users cannot create new instances from your hosted packages. Existing instances and renewals are unaffected.',
            emptyTitle: 'No blocked users',
            emptyHint: 'Search above to add one.',
            block: 'Block',
            unblock: 'Unblock',
            blockSuccess: 'User added to blacklist',
            unblockSuccess: 'User removed from blacklist',
        },
        modal: {
            title: 'Request Withdrawal',
            amount: 'Withdrawal Amount',
            availableNote: 'Available: {amount}',
            targetBalance: 'To panel balance ({rate}% fee)',
            manualWithdrawNote: 'For manual withdrawal to specified method (10% fee), please submit a ticket to request hosting balance withdrawal',
            summary: {
                amount: 'Withdrawal Amount',
                fee: 'Fee',
                actual: 'Actual Amount',
            },
            cancel: 'Cancel',
            confirm: 'Confirm Withdrawal',
            submitting: 'Submitting...',
        },
        errors: {
            minAmount: 'Minimum withdrawal is {amount}',
            exceedBalance: 'Amount exceeds available balance',
        },
    },

    vipBenefits: {
        commonMember: 'Member',
        overviewLabel: 'VIP Benefits Hall',
        overviewTitle: 'Current Level {level}',
        overviewDesc: 'At {level}, you can claim every unlocked reward below. Claim lower-level rewards before higher-level rewards.',
        noVipDesc: 'Upgrade to VIP to unlock level rewards. All rewards are shown from low to high level.',
        availableSummary: 'Unlocked Reward Summary',
        availableSummaryDesc: 'A compact total of every reward unlocked by your current level.',
        remainingSummary: 'Remaining',
        noAvailableReward: 'No unlocked rewards yet',
        empty: 'No VIP benefits configured yet.',
        levelRewards: 'VIP{level} Rewards',
        levelUnlocked: 'This level is unlocked',
        levelLocked: 'Unlock after upgrade',
        rewardCount: '{count} reward(s)',
        rewardValue: 'Reward',
        claimProgress: 'Claims',
        claim: 'Claim',
        claimAll: 'Claim All Remaining',
        claimingAll: 'Claiming...',
        claimed: 'Claimed',
        pendingDelivery: 'Pending',
        upgradeRequired: 'Upgrade Required',
        claimLowerFirst: 'Claim VIP{level} First',
        claimSuccess: 'Reward claimed',
        noClaimableReward: 'No claimable rewards',
        rewardReceived: 'VIP benefit reward',
        pointsUnit: 'points',
        instanceReward: 'Package instance',
        instanceValue: '{plan} · {quantity} instance(s) · {days} day(s)',
        feedback: {
            delivered: 'Delivered',
            pending: 'Pending delivery',
        },
        types: {
            balance: 'Balance',
            points: 'Points',
            instance: 'Instance',
        },
        summary: {
            unlocked: 'Unlocked',
            claimable: 'Claimable',
            claimed: 'Claimed',
            pending: 'Pending',
        },
        status: {
            claimable: 'Claimable',
            claimed: 'Claimed',
            locked: 'Locked',
            blocked: 'Claim VIP{level} first',
            pending: 'Pending',
        },
    },

    // Benefits System
    entertainment: {
        title: 'Benefits',
        description: 'Claim membership benefits and manage points and badges',
        currentPoints: 'Current Points',
        convertPoints: 'Convert Points',
        noPointsToConvert: 'No points to convert',
        convertSuccess: 'Successfully converted {points} points',
        convertFailed: 'Conversion failed',
        pointsUnit: 'pts',
        tabs: {
            lottery: 'Lottery',
            records: 'Lottery Records',
            points: 'Points History',
        },
        mainTabs: {
            vipBenefits: 'VIP Benefits',
            lottery: 'Lottery',
            badge: 'Badges',
            blindbox: 'Blind Box',
            checkin: 'Check-in',
        },
        comingSoon: 'Coming Soon',
        blindbox: {
            title: 'Blind Box',
        },
        checkinSection: {
            title: 'Daily Check-in',
        },
        // Lottery
        spin: 'Spin',
        spinCost: 'Cost: {points} points',
        spinFailed: 'Lottery failed',
        selectLottery: 'Please select a lottery',
        notEnoughPoints: 'Not enough points',
        noActiveLotteries: 'No active lottery available',
        prizeList: 'Prize List',
        probability: 'Probability',
        remaining: 'Remaining',
        // Multi Draw
        multiDraw: 'Multi Draw x10',
        multiDrawAgain: 'Draw Again',
        multiDrawFailed: 'Multi draw failed',
        multiDrawResults: 'Multi Draw Results',
        multiDrawStopped: 'Draw stopped early',
        notEnoughPointsForMulti: 'Not enough points. Required: {required}, Current: {current}',
        totalDraws: 'Total Draws',
        totalPointsSpent: 'Points Spent',
        badgeUnit: 'badge(s)',
        instanceUnit: '',
        multiDrawBadgesTitle: 'Badges Won in This 10x Draw',
        multiDrawBadgesSubtitle: 'You obtained {count} badge rewards in this 10x draw. Review them before the full result list.',
        continueToMultiResults: 'Continue to 10x Results',
        // Prize types
        prizeTypes: {
            nothing: 'Better Luck Next Time',
            points: 'Points',
            balance: 'Balance',
            badge: 'Random Badge',
            instance: 'Instance',
            cpu: 'CPU Resource',
            memory: 'Memory Resource',
            disk: 'Disk Resource',
            traffic: 'Traffic Resource',
        },
        // Result
        congratulations: 'Congratulations!',
        betterLuckNextTime: 'Better Luck Next Time',
        wonPoints: 'Won {points} points',
        wonBalance: 'Won ¥{amount} balance',
        wonBadge: 'Won badge: {badge}',
        wonInstance: 'Please submit a ticket to claim your instance prize',
        wonCpu: 'Won {value}% CPU, added to resource pool',
        wonMemory: 'Won {value}MB memory, added to resource pool',
        wonDisk: 'Won {value}MB disk, added to resource pool',
        wonTraffic: 'Won {value}GB traffic, added to resource pool',
        // Records
        lotteryName: 'Lottery Name',
        prize: 'Prize',
        prizeType: 'Prize Type',
        value: 'Value',
        time: 'Time',
        noRecords: 'No lottery records',
        loadRecordsFailed: 'Failed to load lottery records',
        loadLotteriesFailed: 'Failed to load lotteries',
        // Points history
        pointsLogType: 'Type',
        pointsChange: 'Change',
        pointsAfter: 'Balance After',
        remark: 'Remark',
        noPointsLogs: 'No points history',
        loadPointsLogsFailed: 'Failed to load points history',
        pointsLogTypes: {
            convert: 'Consumption Conversion',
            lotteryWin: 'Lottery Win',
            lotterySpend: 'Lottery Spend',
            badgeDrawSpend: 'Badge Random Draw Spend',
            badgeSelectSpend: 'Badge Select Spend',
            adminAdjust: 'Admin Adjustment',
            checkin: 'Check-in Reward',
        },
        badges: {
            drawTab: 'Draw',
            myTab: 'My Badges',
            randomTitle: 'Random Draw',
            randomHint: 'Equal odds, guaranteed badge',
            randomDescription: 'Spend {points} points for an equal-odds draw. Every draw grants one badge copy.',
            randomButton: 'Random Draw ({points} pts)',
            randomMultiButton: '10x Random Draw ({points} pts)',
            selectTitle: 'Select Badge',
            selectHint: 'Choose a specific badge directly',
            selectDescription: 'Spend {points} points to directly claim one selected badge.',
            selectButton: 'Claim Selected Badge ({points} pts)',
            multiDrawTitle: 'Badges Won in 10x Draw',
            multiDrawSubtitle: 'You obtained {count} badges in this 10x draw.',
            myTitle: 'My Badges',
            summary: 'Available {available}, Applied {applied}',
            filterAll: 'All Types',
            ownedCount: 'Owned {count}',
            empty: 'No badges obtained yet.',
            statusAvatar: 'Applied to avatar',
            statusInstance: 'Applied to instance',
            statusUnused: 'Unused',
            sourceLabel: 'Source',
            sourceDraw: 'Random draw',
            sourceLottery: 'Lottery reward',
            sourceSelect: 'Direct select',
            sourceAdminGrant: 'Admin grant',
            obtainedAt: 'Obtained At',
            currentInstance: 'Current Instance',
            applyAvatar: 'Apply to Avatar',
            applyInstance: 'Apply to Instance Icon',
            applyInstanceButton: 'Apply to Instance',
            selectInstance: 'Select an instance',
            unapply: 'Remove Application',
            selectRequired: 'Please select a badge first',
            instanceRequired: 'Please select an instance first',
            drawSuccess: 'Badge obtained: {badge}',
            selectSuccess: 'Badge claimed: {badge}',
            rewardTitleDraw: 'Draw Successful',
            rewardTitleSelect: 'Claim Successful',
            rewardSubtitle: 'Your new badge is now in your collection. You can apply it to your avatar or an instance from My Badges.',
            rewardSeriesLabel: 'Series',
            rewardRemainingPoints: 'Remaining Points',
            rewardDrawAgain: 'Draw Again',
            rewardViewMine: 'View My Badges',
            applyAvatarSuccess: 'Applied to avatar',
            applyInstanceSuccess: 'Applied to instance icon',
            unapplySuccess: 'Application removed',
        },
        // Admin
        admin: {
            title: 'Entertainment Management',
            description: 'Manage lotteries, prizes, and user points',
            tabs: {
                lotteries: 'Lotteries',
                records: 'Win Records',
                users: 'User Points',
                badges: 'Badges',
            },
            createLottery: 'Create Lottery',
            editLottery: 'Edit Lottery',
            lotteryName: 'Lottery Name',
            enterLotteryName: 'Enter lottery name',
            lotteryDesc: 'Description',
            enterDescription: 'Enter description (optional)',
            costPoints: 'Cost Points',
            startAt: 'Start Date',
            endAt: 'End Date',
            isActive: 'Active',
            enterName: 'Please enter name',
            invalidCostPoints: 'Cost points must be greater than 0',
            createSuccess: 'Created successfully',
            updateSuccess: 'Updated successfully',
            saveFailed: 'Failed to save',
            deleteSuccess: 'Deleted successfully',
            deleteFailed: 'Failed to delete',
            noLotteries: 'No lotteries',
            loadLotteriesFailed: 'Failed to load lotteries',
            prizes: 'Prizes',
            totalDraws: 'Total Draws',
            status: 'Status',
            active: 'Active',
            inactive: 'Inactive',
            // Prize management
            managePrizes: 'Manage Prizes',
            addPrize: 'Add Prize',
            prizeName: 'Prize Name',
            prizeType: 'Prize Type',
            prizeValue: 'Prize Value',
            balanceValue: 'Balance (cents)',
            balanceCents: 'Enter cents, e.g. 100=¥1',
            cpuPercent: 'Enter CPU percentage',
            memoryMB: 'Enter memory (MB)',
            diskMB: 'Enter disk (MB)',
            trafficGB: 'Enter traffic (GB)',
            probability: 'Weight',
            quantity: 'Quantity',
            unlimited: 'Unlimited',
            noQuantityForType: 'This prize type cannot have quantity limits',
            replenish: 'Replenish',
            remaining: 'Remaining',
            replenishPlaceholder: 'Enter amount to add',
            instanceDesc: 'Instance Description',
            instanceDescPlaceholder: 'e.g. 1 Core/1G RAM/10G SSD',
            noPrizes: 'No prizes. Click the button above to add one.',
            enterPrizeName: 'Please enter prize name',
            invalidProbability: 'Weight must be greater than 0',
            savePrizesSuccess: 'Prizes saved successfully',
            savePrizesFailed: 'Failed to save prizes',
            // Win records
            user: 'User',
            searchUser: 'Search username',
            noRecords: 'No win records',
            loadRecordsFailed: 'Failed to load win records',
            // User points
            currentPoints: 'Current Points',
            totalEarned: 'Total Earned',
            totalSpent: 'Total Spent',
            lastConvertedAt: 'Last Converted',
            noUsers: 'No user points data',
            loadUsersFailed: 'Failed to load user points',
            // Badge catalog
            badgeCatalog: {
                loadFailed: 'Failed to load badge catalog',
                fillSeriesRequired: 'Please fill in series ID, title, name, and description',
                seriesUpdated: 'Series updated',
                seriesCreated: 'Series created',
                saveSeriesFailed: 'Failed to save series',
                seriesDeleted: 'Series deleted',
                deleteSeriesFailed: 'Failed to delete series',
                fillBadgeRequired: 'Please fill in badge ID, name, label, series, and default image URL',
                badgeUpdated: 'Badge updated',
                badgeCreated: 'Badge created',
                saveBadgeFailed: 'Failed to save badge',
                badgeDeleted: 'Badge deleted',
                deleteBadgeFailed: 'Failed to delete badge',
                addSeries: 'Add Series',
                addBadge: 'Add Badge',
                series: {
                    title: 'Series',
                    description: 'Controls frontend filter groups and whole-series availability',
                    add: 'Add',
                    all: 'All Series',
                    enabledCount: '{active} / {total} enabled',
                    empty: 'No series',
                    editTitle: 'Edit Series',
                    createTitle: 'Add Series',
                    id: 'Series ID',
                    sort: 'Sort',
                    nameZh: 'Chinese Name',
                    nameEn: 'English Name',
                    titleLabel: 'Title',
                    titlePlaceholder: 'SUPREME Series',
                    descriptionLabel: 'Description',
                    sourceId: 'Source ID',
                    sourceLabel: 'Source Name',
                    enable: 'Enable this series',
                },
                badges: {
                    title: 'Badges',
                    currentFilter: 'Current filter: {name}',
                    empty: 'No badges',
                    tableBadge: 'Badge',
                    tableSeries: 'Series',
                    tableAssetUrl: 'Image URL',
                    tableStatus: 'Status',
                    tableUsage: 'Usage',
                    drawable: 'Drawable',
                    notDrawable: 'Not drawable',
                    usage: 'Owned {ownership} / Avatar {avatar} / Instance {instance}',
                    editTitle: 'Edit Badge',
                    createTitle: 'Add Badge',
                    id: 'Badge ID',
                    series: 'Series',
                    name: 'Name',
                    nameEn: 'English Name',
                    fullLabel: 'Full Label',
                    fullLabelPlaceholder: 'Elite',
                    sourceId: 'Source ID',
                    sourceLabel: 'Source Name',
                    assetUrl: 'Default Image URL',
                    assetUrlPlaceholder: '/badges/dark/elite.svg or https://example.com/badge.svg',
                    assetUrlDark: 'Dark Image URL',
                    assetUrlLight: 'Light Image URL',
                    sort: 'Sort',
                    enable: 'Enable this badge',
                    preview: 'Preview',
                    previewName: 'Badge Name',
                    previewLabel: 'Full Label',
                },
            },
            // Notification config
            notification: {
                title: 'Win Notification',
                enabled: 'Enable Notification',
                type: 'Notification Type',
                conditions: 'Notification Conditions',
                notifyBalance: 'Notify on balance win',
                notifyInstance: 'Notify on instance win',
                secret: 'Secret Key',
                secretPlaceholder: 'For Webhook signature verification (optional)',
                fillTelegram: 'Please fill in Telegram Bot Token and Chat ID',
                fillDiscord: 'Please fill in Discord Webhook URL',
                fillWebhook: 'Please fill in Webhook URL',
                saveSuccess: 'Notification config saved',
                saveFailed: 'Failed to save notification config',
            },
        },
    },

    // Mail
    mail: {
        title: 'Mail',
        description: 'Manage your professional email service',
        tabs: {
            my: 'My Mail',
            buy: 'Buy Mail',
            accounts: 'Accounts',
            dns: 'DNS Config',
            settings: 'Settings',
        },
        noSubscription: 'You have no mail service',
        buyNowHint: 'Purchase professional mail service now',
        buyNow: 'Buy Now',
        subscriptionOverview: 'Subscription Overview',
        expiresAt: 'Expires At',
        domainsUsed: 'Domains Used',
        diskUsed: 'Disk Used',
        totalSpace: 'Total Space',
        accounts: 'Accounts',
        plan: 'Plan',
        domains: 'domains',
        month: 'month',
        year: 'year',
        renew: 'Renew',
        myDomains: 'My Domains',
        addDomain: 'Add Domain',
        noDomains: 'No domains, click the button above to add',
        used: 'used',
        status: {
            active: 'Active',
            expired: 'Expired',
            suspended: 'Suspended',
        },
        domainStatus: {
            pending: 'Pending',
            verified: 'Verified',
            suspended: 'Suspended',
        },
        selectRegion: 'Select Service Region',
        nodeStatus: {
            available: 'Node Status: Available',
            limited: 'Limited Stock',
        },
        plans: 'plans',
        planDetails: 'Plan Configuration',
        planTag: 'Pro Plan',
        allFeaturesIncluded: 'All basic and advanced features included',
        pureStorage: 'Pure Storage',
        feature: {
            domains: 'Support {count} custom domain bindings',
            domainStorage: '{count} Domain {storage}G Storage',
            unlimitedAliases: 'Unlimited aliases per domain',
            unlimitedMailboxes: 'Unlimited mailboxes per domain',
            emailLimit: '600 emails/hour per domain',
            emClientPro: 'Free eM Client Pro license',
            catchAll: 'Catch All support',
            antispam: 'Built-in anti-spam gateway',
            protocols: 'Support SMTP/IMAP/POP3 protocols',
            aliases: 'Unlimited email aliases',
        },
        otherOptions: 'Other Options',
        verify: 'Verify',
        checkout: {
            title: 'Order Summary',
            region: 'Selected Region',
            serviceStatus: 'Service Status',
            instant: 'Instant Activation',
            amount: 'Amount Due',
            confirm: 'Activate Now',
            securePayment: 'Secure payment, refund available anytime',
            balanceRequired: 'Please recharge balance first to purchase',
        },
        help: {
            title: 'Need Help?',
            desc: 'If you encounter any technical issues during purchase, please submit a ticket to contact support.',
        },
        selectPlan: 'Select Plan',
        storage: 'Storage',
        unlimitedAccounts: 'Unlimited Accounts',
        orderConfirm: 'Order Confirmation',
        billingCycle: 'Billing Cycle',
        monthly: 'Monthly',
        yearly: 'Yearly',
        totalPrice: 'Total',
        confirmRenew: 'Confirm Renew',
        confirmPurchase: 'Confirm Purchase',
        renewSubscription: 'Renew Subscription',
        renewMonths: 'Renewal Period',
        monthlyPrice: 'Monthly Price',
        yearlyPrice: 'Yearly Price',
                alreadyPurchased: 'You have already purchased email service in this region',
                alreadyPurchasedDesc: 'Each user can only purchase one email plan per region. To change your plan, please manage it in "My Email".',
                viewMySubscription: 'View My Subscription',
        renewDuration: 'Duration',
        months: 'months',
        renewSuccess: 'Renewal successful',
        selectPlanFirst: 'Please select a plan first',
        purchaseSuccess: 'Purchase successful',
        domainName: 'Domain',
        domainPlaceholder: 'e.g. example.com',
        domainHint: 'Enter your domain, DNS verification required after adding',
        domainRequired: 'Please enter a domain',
        domainAdded: 'Domain added, please configure DNS records',
        accountsDescription: 'Manage email accounts under this domain',
        createAccount: 'Create Account',
        verifyFirst: 'Please verify domain DNS first before creating accounts',
        completeDnsFirst: 'Please complete DNS configuration first to use email service',
        goDnsConfig: 'Configure DNS',
        adminAccount: 'Admin Account',
        adminAccountDesc: 'This account was created automatically when adding the domain, use it to login to Webmail',
        webmailUrl: 'Login URL',
        helpDoc: 'View Help Documentation',
        noAdminAccount: 'Admin account information unavailable',
        refreshStatus: 'Refresh Status',
        noAccounts: 'No email accounts',
        admin: 'Admin',
        resetPassword: 'Reset Password',
        deleteAccountConfirm: 'Are you sure to delete account {email}? This cannot be undone.',
        accountDeleted: 'Account deleted',
        dnsDescription: 'Add the following records in your domain DNS management panel',
        recordType: 'Type',
        hostRecord: 'Host',
        recordValue: 'Value',
        emailAddress: 'Email Address',
        txtVerification: 'TXT Verification',
        pending: 'Pending',
        verified: 'Verified',
        mxRecords: 'MX Records',
        cnameRecords: 'CNAME Records',
        spfRecord: 'SPF Record',
        dkimRecord: 'DKIM Record',
        optional: 'Optional',
        required: 'Required',
        recommended: 'Recommended',
        dnsHint: {
            txt: 'Domain verification record. Click "Refresh Status" after adding.',
            mx: 'Mail exchange record. Number indicates priority (lower = higher priority).',
            cname: 'Alias record for Webmail and auto-discover functionality.',
            spf: 'Sender Policy Framework. Prevents spoofing and improves deliverability.',
            dkim: 'Domain key authentication. Improves email credibility.',
            dmarc: 'Domain-based Message Authentication. Prevents phishing and fraud.',
        },
        domainInfo: 'Domain Info',
        createdAt: 'Created At',
        verifiedAt: 'Verified At',
        dangerZone: 'Danger Zone',
        deleteDomainWarning: 'Deleting this domain will also delete all accounts and data. This cannot be undone.',
        deleteDomain: 'Delete Domain',
        deleteDomainConfirm: 'Are you sure to delete domain {domain}? All data will be lost.',
        domainDeleted: 'Domain deleted',
        domainVerified: 'Domain verified successfully',
        domainNotVerified: 'DNS records not yet active, please try again later',
        username: 'Username',
        password: 'Password',
        displayName: 'Display Name',
        diskLimit: 'Disk Quota',
        setAsAdmin: 'Set as Domain Admin',
        usernamePlaceholder: 'e.g. admin',
        passwordPlaceholder: 'At least 8 characters',
        passwordHint: 'At least 8 characters, recommend mixed case and numbers',
        displayNamePlaceholder: 'e.g. John Doe',
        accountFieldsRequired: 'Please enter username and password',
        accountCreated: 'Account created',
        accountUpdated: 'Account updated',
        passwordMinLength: 'Password must be at least 8 characters',
        passwordReset: 'Password reset successfully',
        editAccount: 'Edit Account',
        newPassword: 'New Password',
        newPasswordPlaceholder: 'Enter new password',
    },
}
