Publish Docker image / build (linux/amd64, ubuntu-latest, amd64) (push) Canceled after 0s
Publish Docker image / build (linux/arm64, ubuntu-24.04-arm, arm64) (push) Canceled after 0s
Publish Docker image / merge (push) Canceled after 0s
ci / ci (22, ubuntu-latest) (push) Canceled after 0s
GitHub Release / release (push) Canceled after 0s
670 lines
26 KiB
JSON
670 lines
26 KiB
JSON
{
|
||
"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"
|
||
}
|
||
}
|