{ "app": { "title": "PicHost - Image Hosting", "description": "A lightweight self-hosted image hosting system", "tagline": "Personal lightweight image host" }, "common": { "loadingSession": "Verifying session…", "save": "Save", "cancel": "Cancel", "copy": "Copy", "delete": "Delete", "edit": "Edit", "search": "Search", "refresh": "Refresh", "back": "Back", "all": "All", "notConfigured": "(not configured)", "countImages": "{count} images", "itemsUnit": "items", "imagesUnit": "images", "more": "More" }, "nav": { "api": "API", "stats": "Stats", "logs": "Activity log", "settings": "Settings", "storage": "Storage", "menu": "Menu", "language": "Language", "appearance": "Appearance", "account": "Account", "backToUpload": "Back to upload", "changePassword": "Change password", "systemSettings": "System settings", "logout": "Log out" }, "theme": { "switch": "Switch theme", "light": "Light", "dark": "Dark", "system": "System" }, "locale": { "switch": "Switch language", "zh-CN": "简体中文", "en": "English" }, "auth": { "username": "Username", "password": "Password", "confirmPassword": "Confirm password", "login": "Log in", "register": "Register", "adminSecret": "Admin secret", "adminSecretPlaceholder": "Enter ADMIN_SECRET", "legacyHint": "Legacy deployment: sign in with the secret to migrate to username/password", "noAccount": "No account?", "hasAccount": "Already have an account?", "backToLogin": "Back to login", "loginFooter": "Upload and management require sign-in", "loginSuccess": "Signed in", "loginFailedSecret": "Sign-in failed. Check your secret", "loginFailedCredentials": "Invalid username or password", "loginFailed": "Sign-in failed. Check username and password", "registerFailed": "Registration failed. Check your input", "setupFailed": "Setup failed. Check your input", "migrateFailed": "Migration failed. Check your input", "passwordMismatch": "Passwords do not match", "showPassword": "Show password", "hidePassword": "Hide password", "registerSuccess": "Registered successfully", "errors": { "invalidUsername": "Username must be 3–32 letters, numbers, or underscores", "invalidPassword": "Password must be at least 8 characters" } }, "setup": { "migrateTitle": "Migrate to username/password", "initTitle": "First run — create admin account", "usernamePlaceholder": "3–32 letters, numbers, or underscores", "passwordPlaceholder": "Set login password", "confirmPlaceholder": "Enter password again", "allowRegistration": "Allow user registration", "migrateSubmit": "Complete migration", "initSubmit": "Create and continue", "migrateSuccess": "Migration complete", "initSuccess": "Setup complete" }, "register": { "title": "Register", "subtitle": "Create a PicHost user account" }, "password": { "title": "Change password", "subtitle": "Update your login password", "current": "Current password", "new": "New password", "confirmNew": "Confirm new password", "newPlaceholder": "Set new password", "changed": "Password updated", "tooShort": "New password must be at least 8 characters", "changeFailed": "Failed to change password", "strength": "Password strength", "weak": "Weak", "medium": "Medium", "strong": "Strong", "ruleMinLength": "At least {n} characters", "ruleMixedCase": "Upper and lower case letters", "ruleNumber": "Contains a number", "ruleSpecial": "Contains a special character" }, "upload": { "title": "Drop images here to upload", "hint": "Or click to select files, press {ctrl} + {v} to paste", "formats": "JPEG / PNG / WebP / GIF / SVG / ICO, max 10 MB each, up to 10 files per batch", "selectFiles": "Select images", "settings": "Upload settings", "progress": "Upload progress", "statusPending": "Pending", "statusUploading": "Uploading", "statusSuccess": "Done", "statusError": "Failed", "selectImages": "Select images to upload", "maxFiles": "Up to {n} images per upload", "uploadSuccess": "Uploaded {n} image(s)", "uploadPartialFail": "{n} image(s) failed to upload", "uploadFailed": "Upload failed", "loginRequired": "Please sign in first", "sessionTitle": "This session", "sessionEmpty": "No uploads in this session" }, "copy": { "url": "URL", "markdown": "Markdown", "html": "HTML", "copied": "Copied to clipboard", "copiedLabel": "Copied {label}", "copiedUrl": "URL copied", "copiedMarkdown": "Markdown copied", "copiedHtml": "HTML copied", "copiedFormat": "Copied {format}", "failed": "Copy failed", "failedManual": "Copy failed — select the link manually", "curl": "cURL example copied" }, "preferences": { "title": "Upload preferences", "subtitle": "Browser-local and account settings for your uploads only", "back": "Back to upload", "processing": "Image processing", "clientCompress": "Client-side compression", "clientCompressHint": "Compress in the browser before upload (server still converts to WebP)", "autoDeletePrefix": "Auto-delete after", "autoDeleteSuffix": "days", "autoDeleteHint": "Only affects images uploaded after enabling; existing images are kept", "webpQuality": "WebP quality", "webpQualityHint": "Client compression quality (1–100); requires client-side compression", "current": "Current: {n}", "qualityHigh": "High quality", "qualityMedium": "Medium quality", "qualityLow": "Lossy", "convenience": "Convenience", "autoCopy": "Copy link after upload", "autoCopyHint": "Copy to clipboard in the selected format" }, "settings": { "title": "System settings", "subtitle": "Saved to database; environment variables take precedence", "uploadAccount": "Upload & accounts", "defaultFolder": "Default upload folder", "defaultFolderHint": "Stored in this browser only; affects your upload target", "allowRegistration": "Open registration", "allowRegistrationHint": "Allow new users to register (regular users see only their images)", "accessControl": "Access control", "refererHint": "Referer hotlink protection; comma-separated hostnames, empty = no restriction", "refererPlaceholder": "example.com, www.example.com", "linkGeneration": "Link generation", "imageBaseUrlHint": "Public URL prefix for generated links; use your public domain behind a reverse proxy", "imageBaseUrlPlaceholder": "https://pic.example.com", "imageBaseUrlActive": "Active: {url}", "badgeEnv": ".env", "badgeSaved": "Saved", "badgeDefault": "Default", "badgeUnset": "Not set", "tokenEnv": "Environment", "tokenDb": "Generated in app", "tokenNone": "Not configured", "apiTokenLine": "API Token · {source} ·", "viewReleases": "View releases", "unsavedChanges": "Unsaved changes", "manageToken": "Manage token", "envOverride": "Overridden by environment variable; cannot edit in UI", "saved": "Settings saved", "saveFailed": "Failed to save settings", "loadFailed": "Failed to load settings" }, "storage": { "title": "Storage", "subtitle": "New uploads go to the active backend; existing images keep their backend", "activeBackend": "Active backend", "backendLocal": "Local disk", "backendCloud": "Cloud storage", "backendS3": "Cloud storage", "switchHint": "Switching only affects new uploads", "provider": "Preset", "providerR2": "Cloudflare R2", "providerCos": "Tencent COS", "providerOss": "Alibaba OSS", "providerAws": "AWS S3", "providerCustom": "Custom", "endpoint": "Endpoint", "region": "Region", "bucket": "Bucket", "prefix": "Key prefix (optional)", "prefixPlaceholder": "e.g. pichost", "forcePathStyle": "Force path-style access", "accessKey": "Access Key", "secretKey": "Secret Key", "servingMode": "Serving mode", "servingProxy": "Proxy (same origin)", "servingPublic": "Public URL (302 to CDN)", "servingHint": "In public mode, configure referer protection on CDN/bucket", "publicUrl": "Public base URL", "publicUrlPlaceholder": "https://cdn.example.com", "testConnection": "Test connection", "testSuccess": "Connection successful", "testFailed": "Connection failed", "saved": "Storage settings saved", "saveFailed": "Failed to save storage settings", "loadFailed": "Failed to load storage settings", "envOverride": "Storage is overridden by environment variables", "pageTitle": "Storage management", "pageSubtitle": "Manage backends; new uploads go to the default backend", "addBackend": "Add storage", "editBackend": "Edit storage", "formCreateHint": "Configure cloud storage; set as default after saving to receive new uploads", "formEditHint": "Update connection settings; leave keys blank to keep existing secrets", "sectionBasic": "Basic", "sectionConnection": "Connection", "sectionCredentials": "Credentials", "sectionAccess": "Access", "sectionQuota": "Quota", "advancedOptions": "Advanced", "servingProxyShort": "Proxy", "servingPublicShort": "Public", "backendName": "Display name", "badgeDefault": "Default", "badgeDisabled": "Disabled", "badgeEnabled": "Enabled", "statTotal": "Total", "statUsed": "Used", "statFree": "Free", "usageRate": "Usage", "indexImages": "PicHost images {count} · {size}", "setDefault": "Set as default", "actionSetDefault": "Default", "actionTest": "Test", "disable": "Disable", "enable": "Enable", "usageCount": "{count} images", "quotaTotal": "Plan size", "quotaPlaceholder": "e.g. 10", "quotaHint": "Enter your cloud plan size; used space is calculated from PicHost image index", "quotaRequired": "Enter a valid plan size", "notConfigured": "Not configured", "created": "Storage backend added", "deleted": "Storage backend deleted", "deleteFailed": "Delete failed", "deleteBlockedImages": "This backend still has images. Move or delete them before removing the backend.", "defaultUpdated": "Default backend updated", "deleteConfirmTitle": "Delete storage", "deleteConfirmBody": "Delete “{name}”? This cannot be undone.", "secretsRequired": "Access Key and Secret Key are required for new storage", "manageStorage": "Manage object storage", "manageStorageHint": "Configure R2 / S3 / COS backends and URL serving" }, "stats": { "title": "Statistics", "subtitle": "Overview and gallery", "uploadToday": "Uploaded today", "uploadMonth": "Uploaded this month", "uploadTotal": "Total uploads", "storedCount": "Stored images", "deleteToday": "Deleted today", "deleteMonth": "Deleted this month", "deleteTotal": "Total deleted", "userCount": "Registered users", "uploadBytes": "Total upload size", "folderDistribution": "Uploads by folder", "folderUsage": "Storage by folder", "noData": "No data", "folderCount": "{count} · {size}", "gallery": "Gallery", "folder": "Folder", "filterStorageAll": "All storage", "storage": "Storage", "searchPlaceholder": "Search filename", "clear": "Clear", "selected": "{n} selected", "batchDelete": "Delete selected", "scrollTop": "Back to top", "loadFailed": "Failed to load statistics", "selectFirst": "Select images first", "deleted": "Deleted {n} image(s)", "deletePartialFail": "{n} image(s) failed to delete", "deleteFailed": "Delete failed", "deletedSingle": "Deleted", "allFolders": "All", "counting": "Counting…", "summarySearch": "{folder} · Search “{q}” · {total} images", "summaryTotal": "{folder} · {total} images", "summarySearchStorage": "{folder} · {storage} · Search “{q}” · {total} images", "summaryTotalStorage": "{folder} · {storage} · {total} images" }, "logs": { "pageTitle": "Activity log", "pageSubtitle": "Your upload and delete history", "pageSubtitleAdmin": "Upload and delete history for all users", "loadFailed": "Failed to load activity log", "empty": "No activity yet", "entriesUnit": "entries", "filterActionAll": "All actions", "filterSourceAll": "All sources", "filterUserAll": "All users", "searchPlaceholder": "Search filename", "summaryAll": "All · {total} entries, {upload} uploads, {delete} deletes", "actionUpload": "Upload", "actionDelete": "Delete", "sourceWeb": "Web", "sourceApi": "API", "sourceTwikoo": "Twikoo", "colTime": "Time", "colUser": "User", "colStorage": "Storage", "colAction": "Action", "colSource": "Source", "colFile": "File", "colFolder": "Folder", "colSize": "Size", "colKey": "Path" }, "image": { "empty": "No images", "previewFailed": "Preview failed", "uploader": "Uploader: {name}", "storageBackend": "Storage: {name}" }, "delete": { "confirmTitle": "Confirm delete", "confirmDesc": "Delete {count} selected image(s)? This cannot be undone.", "confirm": "Delete" }, "pagination": { "pageOf": "Page {page} / {totalPages} · {total} {unit}", "totalOnly": "{total} {unit}", "first": "First page", "prev": "Previous page", "next": "Next page", "last": "Last page" }, "api": { "tokenTitle": "API Token", "envOverrideTitle": "Token overridden by environment", "envOverrideDesc": "Restart after changing API_UPLOAD_TOKEN; cannot regenerate in UI.", "personalTitle": "Personal API token", "personalDesc": "For your scripts only; uploads belong to your account.", "notConfiguredTitle": "No token configured", "notConfiguredDesc": "Click Regenerate to create a token for Auth-Token on all endpoints below.", "regenerate": "Regenerate", "tokenSourceEnv": "Source: API_UPLOAD_TOKEN environment variable", "tokenSourceDb": "Source: generated in app (can regenerate)", "tokenSourceNone": "Source: not configured", "tokenHeader": "Header:", "tokenInvalidate": "Old token is invalidated immediately after regenerate", "docsTitle": "API reference", "curlExample": "cURL example", "loadFailed": "Failed to load API settings", "regenerateEnvBlocked": "Token is set via environment; cannot regenerate in UI", "regenerateFailed": "Failed to regenerate token", "confirmRegenerateTitle": "Regenerate token?", "confirmRegenerateDesc": "The old token stops working immediately. Update scripts and automation before continuing.", "confirmRegenerate": "Regenerate", "newTokenTitle": "New token generated", "newTokenDesc": "Copy and save it now. You can copy again from the field above after closing.", "copyToken": "Copy token", "saved": "Saved", "docs": { "upload": { "title": "Upload images", "descAdmin": "Upload one or more images. Use image field; folder creates directory if missing. Also accepts file, files, type.", "descUser": "Upload one or more images via image field. Also accepts file, files. Stored under images/." }, "list": { "title": "List images", "descAdmin": "Paginated gallery; optional folder filter. limit default 20, max 100.", "descUser": "Paginated list of your images. limit default 20, max 100." }, "search": { "title": "Search images", "desc": "Search by filename or path; q is required." }, "delete": { "title": "Delete image", "desc": "Delete by key (storage path, e.g. images/2026/08/xxx.webp)." }, "batchDelete": { "title": "Batch delete", "desc": "Delete multiple images; request body is a keys array." }, "twikoo": { "title": "Twikoo-compatible upload", "desc": "Twikoo / EasyImage 2.0 protocol; stored under twikoo/. Fields: image + token." } } }, "userSettings": { "loadFailed": "Failed to load settings", "saveFailed": "Failed to save settings" } }