{ "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", "gallery": "Gallery", "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", "captchaHint": "Drag the slider to the slot", "captchaSuccess": "Verified", "verificationMisconfigured": "Human verification is not configured correctly. Contact an administrator.", "capInitialState": "Verify you are human", "capVerifying": "Verifying…", "capSolved": "Verified", "capError": "Verification failed", "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", "domainSeparation": "Separate admin and image domains", "domainSeparationHint": "Admin and API use the site URL; image links use a dedicated image URL", "domainSeparationProxyHint": "Point both domains to this host and reverse-proxy to port 6892 (Nginx, Caddy, NPM, etc.)", "domainSeparationProxyExample": "View example", "siteBaseUrl": "Site URL", "siteBaseUrlHint": "No trailing slash; admin UI and API upload endpoint", "siteBaseUrlPlaceholder": "https://admin.example.com", "imageBaseUrl": "Image URL", "imageBaseUrlHint": "No trailing slash; public image link prefix", "imageBaseUrlPlaceholder": "https://pic.example.com", "domainSeparationInvalid": "Enter valid site and image URLs with different hostnames", "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", "bbcode": "BBCode", "copied": "Copied to clipboard", "copiedLabel": "Copied {label}", "copiedUrl": "URL copied", "copiedMarkdown": "Markdown copied", "copiedHtml": "HTML copied", "copiedBbcode": "BBCode 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", "pageTitle": "Settings & preferences", "pageSubtitle": "Manage system configuration and activity logs", "pageSubtitleBasic": "Manage system configuration and upload preferences", "navBasic": "Basic", "navDomains": "Domains & paths", "navAccess": "Access control", "navPreferences": "Preferences", "navLogs": "Activity log", "systemVersion": "Version", "checkUpdate": "Check for updates", "saveSettings": "Save settings", "subtitle": "Saved to database; environment variables take precedence", "featureToggles": "Feature toggles", "featureTogglesHint": "Control registration and system behavior", "pathAndLink": "Paths & links", "pathAndLinkHint": "Control image URL format and upload directory structure", "domainSeparationSection": "Domain separation", "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", "refererDomainsLabel": "Allowed domains", "refererTip": "Separate multiple domains with commas (,); wildcards are not supported", "refererExamplesTitle": "Example", "refererExamplesSample": "example.com, static.example.com", "refererScenarioTitle": "Common use case", "refererScenarioDesc": "Allow your main site and static site to embed images", "refererEnabled": "Enabled", "refererUnrestricted": "Unrestricted", "loginVerification": "Login verification", "loginVerificationHint": "Human verification for login and registration (choose one)", "loginVerificationSlider": "Local slider", "loginVerificationSliderHint": "Built-in slider puzzle; no third-party service", "loginVerificationTurnstile": "Cloudflare Turnstile", "loginVerificationTurnstileHint": "Create a widget in Cloudflare Dashboard, then enter Site Key and Secret Key", "loginVerificationCap": "Cap POW", "loginVerificationCapHint": "Self-hosted Cap Standalone; enter API Endpoint and Secret Key", "turnstileSiteKey": "Turnstile Site Key", "turnstileSiteKeyPlaceholder": "0x4AAAAAAA…", "turnstileSecretKey": "Turnstile Secret Key", "turnstileSecretKeyPlaceholder": "0x4AAAAAAA…", "capApiEndpoint": "Cap API Endpoint", "capApiEndpointPlaceholder": "https://cap.example.com/your-site-key/", "capSecretKey": "Cap Secret Key", "capSecretKeyPlaceholder": "Secret key from your Cap dashboard", "systemInfo": "System", "systemInfoHint": "Current version and updates", "uploadConvenience": "Upload convenience", "defaultCopyFormat": "Default copy format", "refererPlaceholder": "example.com, www.example.com", "domainSettings": "Domain settings", "domainSeparationActive": "Domain separation enabled: image host serves images only; site host serves admin and API", "siteBaseUrl": "Site URL", "siteBaseUrlHint": "No trailing slash; admin UI and API upload endpoint", "siteBaseUrlPlaceholder": "https://admin.example.com", "siteBaseUrlActive": "Active: {url}", "imageBaseUrl": "Image URL", "imageBaseUrlHint": "No trailing slash; public image link prefix", "imageBaseUrlSingleHint": "No trailing slash; leave empty to use the current request host; single-domain setups do not need a site URL", "imageBaseUrlPlaceholder": "https://pic.example.com", "imageBaseUrlActive": "Active: {url}", "runtimeDetected": "Detected current access: {url} (will not be saved automatically)", "fillDetectedOrigin": "Use detected URL", "hostRoleUnknown": "Current Host does not match configured domains; reverse-proxy bypass may be possible", "disableDomainSeparationTitle": "Disable domain separation", "disableDomainSeparationDesc": "This clears the site URL and keeps only the image URL. Continue?", "disableDomainSeparationConfirm": "Disable", "domainSeparationRequired": "Both site and image URLs are required when domain separation is enabled", "hideFolderInUrl": "Use short image links", "hideFolderInUrlHint": "When on, links are only domain + filename, e.g. img.example.com/abc.webp. When off, date or custom folders are kept, e.g. img.example.com/2026/08/abc.webp", "storageUseDatePath": "Group uploads by year/month", "storageUseDatePathHint": "When enabled, files are stored as images/2026/08/file.webp; when disabled, as images/file.webp. Applies only to new uploads after enabling", "badgeEnv": ".env", "badgeSaved": "Saved", "badgeDefault": "Default", "badgeUnset": "Not set", "badgeOptional": "Optional", "tokenEnv": "Environment", "tokenDb": "Generated in app", "tokenNone": "Not configured", "apiTokenLine": "Source: {source}", "viewReleases": "View releases", "updateAvailable": "Update available: {version}", "upToDate": "You are on the latest version", "checkUpdateFailed": "Failed to check for updates. Please try again later", "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", "badgeDefaultStorage": "Default storage", "badgeDisabled": "Disabled", "badgeEnabled": "Enabled", "overviewTitle": "Storage overview", "overviewSubtitle": "Usage across all storage backends", "overviewTotal": "Total capacity", "overviewUsed": "Used", "overviewFree": "Free", "overviewUsageRate": "Overall usage", "overviewQuota": "Total quota", "overviewInstances": "Backends", "overviewActive": "Active", "capacityDistribution": "Distribution", "backendType": "Type", "storageId": "Storage ID", "storageType": "Storage type", "badgeLocal": "Local", "defaultStorageTip": "Default storage: new uploads are saved to “{name}”. Use “Set as default” on another backend to change this.", "supportedTitle": "Supported backends", "supportedSubtitle": "PicHost supports multiple storage backends for different scenarios", "supportedLocalDesc": "Ideal for small deployments and personal use", "supportedR2Desc": "Highly available, low-cost object storage", "supportedS3Title": "S3 compatible", "supportedS3Desc": "Storage services compatible with the Amazon S3 API", "footerTip": "The default backend receives all new uploads", "statTotal": "Total", "statUsed": "Used", "statFree": "Free", "statFileCount": "Files", "statQuota": "Quota", "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": "Gallery", "subtitle": "Browse, search, and manage uploaded images", "uploadToday": "Uploaded today", "uploadMonth": "Uploaded this month", "uploadTotal": "Total uploads", "storedCount": "Stored now", "totalFiles": "Total files", "totalOccupied": "{size} used", "storageUsage": "Storage usage", "noQuota": "No quota configured", "vsYesterday": "vs yesterday", "vsLastMonth": "vs last month", "trendUp": "↑ {p}%", "trendDown": "↓ {p}%", "trendFlat": "flat", "deleteToday": "Deleted today", "deleteMonth": "Deleted this month", "deleteTotal": "Total deleted", "userCount": "Registered users", "uploadBytes": "Total upload size", "sourceDistribution": "Uploads by source", "sourceWeb": "Web", "sourceApi": "API", "tagWeb": "Web", "tagApi": "API", "noData": "No data", "gallery": "Gallery", "imagesSection": "All images", "filterStorageAll": "All storage", "storage": "Storage", "searchPlaceholder": "Search filename", "searchPlaceholderWide": "Search filename, tags, or links", "filterType": "Image type", "filterTypeAll": "All types", "filterSource": "Upload source", "filterSourceAll": "All sources", "sourceWeb": "Web upload", "sourceApi": "API upload", "resetFilters": "Reset", "batchActions": "Bulk actions", "selectedItems": "{n} selected", "colFilename": "Filename", "colPreview": "Preview", "colSize": "Size", "colType": "Type", "colSource": "Source", "colUploadedAt": "Uploaded", "colActions": "Actions", "previewBadge": "Image", "clear": "Clear", "selected": "{n} selected", "batchDelete": "Delete selected", "batchSelect": "Batch select", "viewMode": "View mode", "viewGrid": "Grid view", "viewList": "List view", "selectAll": "Select all", "invertSelection": "Invert", "clearSelection": "Clear selection", "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", "counting": "Counting…", "summarySearch": "Search “{q}” · {total} images", "summaryTotal": "{total} images", "summarySearchStorage": "{storage} · Search “{q}” · {total} images", "summaryTotalStorage": "{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", "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", "openPreview": "View full image", "previewTitle": "Image details", "previewSubtitle": "View image info and links", "previewOriginalName": "Filename", "previewUploadedAt": "Uploaded", "previewSize": "Size", "previewSizeDetail": "{size} ({bytes} bytes)", "previewContentType": "File type", "previewOwner": "Uploader", "previewStorage": "Storage", "previewKey": "Image path", "previewExtension": "Extension", "previewDimensions": "Dimensions", "previewDimensionsUnknown": "Loading…", "previewUploadSource": "Upload source", "uploadSourceUnknown": "Unknown", "previewLinks": "Links & embed", "previewCopyLink": "Copy link", "previewDownload": "Download", "previewOpen": "Open in new tab", "previewClose": "Close", "uploader": "Uploader: {name}", "storageBackend": "Storage: {name}" }, "delete": { "confirmTitle": "Confirm delete", "confirmDesc": "Delete {count} selected image(s)? This cannot be undone.", "confirm": "Delete" }, "pagination": { "totalCount": "{total} {unit}", "pageStatus": "Page {page} / {totalPages}", "perPage": "{size} / page", "pageSize": "Page size", "pageNumber": "Page {page}", "pageOf": "Page {page} / {totalPages} · {total} {unit}", "totalOnly": "{total} {unit}", "first": "First page", "prev": "Previous page", "next": "Next page", "last": "Last page", "goTo": "Go", "goToPrefix": "Go to", "goToSuffix": "", "pagePlaceholder": "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", "searchPlaceholder": "Search endpoints…", "showToken": "Show", "hideToken": "Hide", "helpText": "Need help? Read the full API docs", "helpTitle": "Need help?", "helpSubtitle": "Read the full API docs", "expand": "Expand", "collapse": "Collapse", "viewDocs": "View docs", "requestParams": "Request parameters", "paramName": "Name", "paramType": "Type", "paramLocation": "In", "paramRequired": "Required", "paramDescription": "Description", "required": "Yes", "optional": "No", "requestExample": "Request example", "responseExample": "Response example", "categories": { "image": "Images", "extension": "Plugins", "system": "System" }, "params": { "upload": { "image": "Primary upload field", "file": "Compatibility field, single file", "files": "Compatibility field, multiple files", "token": "Twikoo protocol form token" }, "list": { "limit": "Page size, default 20, max 100", "page": "Page number, starts at 1" }, "search": { "q": "Search keyword, required" }, "delete": { "key": "Storage path, e.g. images/2026/08/xxx.webp" }, "batchDelete": { "keys": "Array of image keys to delete" }, "twikoo": { "image": "Image file", "token": "API token" }, "backendId": "Storage backend ID, optional" }, "debug": { "title": "Try it", "headers": "Headers", "query": "Query", "body": "Body", "send": "Send request", "response": "Response", "selectFile": "Select file", "noFileSelected": "No file selected", "tokenPlaceholder": "Enter Auth-Token", "invalidJson": "Invalid JSON", "sendFailed": "Request failed", "networkError": "Network error or unreachable", "notesTitle": "Notes", "noteSuccess": "200 means success with JSON body", "noteError": "4xx / 5xx means failure; check error field", "noteLimit": "Upload limit: up to 10 files, 10 MB each" }, "docs": { "upload": { "title": "Upload images", "desc": "Upload one or more images via image field. Also accepts file, files. Stored under images/." }, "list": { "title": "List images", "desc": "Paginated gallery. 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 images/. Fields: image + token." }, "config": { "title": "Get config", "desc": "Public system config; no authentication required." }, "count": { "title": "Image count", "desc": "Total images in your visible scope." } } }, "userSettings": { "loadFailed": "Failed to load settings", "saveFailed": "Failed to save settings" } }