release: v1.4.0 — 标签系统、操作日志扩展与文档截图更新
ci / ci (22, ubuntu-latest) (push) Canceled after 0s
GitHub Release / release (push) Canceled after 0s
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

- 每用户标签与彩色打标,图库 OR/AND 筛选与批量打标
- 操作日志记录登录、删除、设置与标签操作
- API 标签/打标接口;README 与文档站截图同步
This commit is contained in:
O96u committed 2026-09-09 14:46:52 +08:00
1 parent f17d79b236
commit 737235acff
110 files changed
+5881 -778

No files matched your search

+137 -5
View File
@@ -166,6 +166,104 @@
"sessionTitle": "This session",
"sessionEmpty": "No uploads in this session"
},
"tags": {
"column": "Tags",
"uploadLabel": "Tags (optional)",
"addTag": "Add tag",
"searchOrCreate": "Search or create tag",
"createNamed": "Create tag \"{name}\"",
"created": "Created tag \"{name}\"",
"createFailed": "Failed to create tag",
"updateFailed": "Failed to update tags",
"filterAll": "All tags",
"filterSelected": "{n} selected",
"filterTitle": "Filter by tag",
"manage": "Manage",
"manageTitle": "Manage tags",
"manageImageTitle": "Manage tags",
"manageSubtitle": "Centralized tag management — add, edit, delete, and merge",
"newTag": "New tag",
"addTag": "Add tag",
"mergeTags": "Merge tags",
"searchName": "Search tag name",
"filterStatusAll": "All statuses",
"filterStatusUsed": "In use",
"filterStatusUnused": "Unused",
"statTotal": "Total tags",
"statUsed": "Tags in use",
"statUnused": "Unused tags",
"statNew7d": "New in 7 days",
"colName": "Tag name",
"colImageCount": "Images",
"colLastUsed": "Last used",
"neverUsed": "Never used",
"colActions": "Actions",
"mergeIntoAction": "Merge into…",
"mergeIntoTitle": "Merge into…",
"mergeIntoSubtitle": "Merge tag \"{name}\" into another tag",
"mergeIntoChoose": "Choose the target tag",
"mergeIrreversibleTitle": "This cannot be undone",
"mergeIrreversible": "Merged tags are permanently deleted and their images move to the kept tag. This action cannot be reversed.",
"mergeConfirmKeep": "Keeping tag \"{name}\"",
"mergeWillDelete": "These tags will be deleted: {names}",
"totalCount": "{n} tags",
"sortByCount": "By count",
"sortByName": "By name",
"search": "Search tags",
"namePlaceholder": "Tag name",
"customColor": "Custom color",
"pickColor": "Pick a color",
"preview": "Preview",
"renamed": "Tag renamed",
"renameFailed": "Rename failed",
"colorFailed": "Failed to update color",
"deleted": "Deleted tag \"{name}\"",
"deleteFailed": "Failed to delete tag",
"deleteConfirmTitle": "Delete tag",
"deleteConfirmDesc": "Delete tag \"{name}\"? It will be removed from all images. This cannot be undone.",
"mergeSelectAtLeast": "Select at least 2 tags",
"mergeHint": "Select multiple tags to merge; images from other tags will move to the kept tag",
"mergeSelected": "{n} tags selected",
"mergeClear": "Clear selection",
"mergeTitle": "Merge tags",
"mergeSubtitle": "Combine multiple tags into one",
"mergeNote": "Unselected tags will be deleted; their images move to the kept tag",
"mergeChooseTarget": "Choose the tag to keep",
"mergeAction": "Merge into…",
"mergeRow": "Merge",
"mergeConfirm": "Confirm merge",
"merged": "Tags merged",
"mergeFailed": "Merge failed",
"untagged": "Untagged",
"untaggedAction": "+ Untagged",
"unlabeled": "Unlabeled",
"selectedLabel": "Selected ({n})",
"clearSelected": "Clear",
"selectAll": "Select all",
"deselectAll": "Deselect all",
"existingLabel": "Existing tags ({n})",
"commonTags": "Common tags",
"recentTags": "Recently used",
"moreTags": "{n} more tags",
"classifyHint": "Tags are for organization only and do not affect storage paths",
"saved": "Tags saved",
"saveFailed": "Failed to save tags",
"batchTagAll": "Batch tag",
"batchAddTitle": "Add tags",
"batchAddSubtitle": "{n} images selected",
"modeOr": "Any",
"modeAnd": "All",
"batchTitle": "Batch tags",
"batchSubtitle": "Update tags for {n} selected image(s)",
"batchAdd": "Add tags",
"batchRemove": "Remove tags",
"batchSuccess": "Batch update complete",
"batchFailed": "Batch update failed",
"noMatch": "No matching tags",
"emptyHint": "No tags yet — type a name to create one",
"settingsLink": "Manage tags in the gallery (create, colors, merge, delete)",
"openManage": "Open tag manager"
},
"copy": {
"url": "URL",
"markdown": "Markdown",
@@ -206,12 +304,30 @@
"title": "System settings",
"pageTitle": "Settings & preferences",
"pageSubtitle": "Manage system configuration and activity logs",
"pageSubtitleBasic": "Manage system configuration and upload preferences",
"pageSubtitleBasic": "Configure basic options so PicHost works better for you.",
"pageSubtitleDomains": "Configure site and image URLs and upload path rules",
"pageSubtitleAccess": "Configure image access policies to prevent hotlink abuse",
"pageSubtitleLogs": "View uploads, deletions, edits, and configuration changes",
"searchPlaceholder": "Search settings…",
"searchEmpty": "No matches",
"restoreDefaults": "Restore defaults",
"restoredDefaults": "Defaults restored",
"refererProtection": "Hotlink protection",
"defaultCopyFormatHint": "Link format copied automatically after upload",
"systemVersionHint": "Currently running PicHost version",
"badgeEnabled": "Enabled",
"domainSeparationProxyTitle": "Both domains must resolve to this host",
"domainSeparationProxyBody": "Point the site and image URLs to this host and reverse-proxy to port 6892 (Nginx, Caddy, NPM, etc.).",
"siteBaseUrlRoleHint": "URL for the admin UI",
"imageBaseUrlRoleHint": "URL for serving and displaying images",
"imageDomainSection": "Image domain",
"navBasic": "Basic",
"navDomains": "Domains & paths",
"navAccess": "Access control",
"navTags": "Tags",
"navPreferences": "Preferences",
"navLogs": "Activity log",
"pageSubtitleTags": "Create, rename, merge, or delete tags",
"systemVersion": "Version",
"checkUpdate": "Check for updates",
"saveSettings": "Save settings",
@@ -231,6 +347,10 @@
"refererExamplesSample": "example.com, static.example.com",
"refererScenarioTitle": "Common use case",
"refererScenarioDesc": "Allow your main site and static site to embed images",
"refererScenario1": "Personal blog embedding images",
"refererScenario2": "Corporate site and static CDN",
"refererScenario3": "Local development",
"refererScenario4": "Leave empty for no restriction",
"refererEnabled": "Enabled",
"refererUnrestricted": "Unrestricted",
"loginVerification": "Login verification",
@@ -594,20 +714,28 @@
},
"logs": {
"pageTitle": "Activity log",
"pageSubtitle": "Your upload and delete history",
"pageSubtitleAdmin": "Upload and delete history for all users",
"pageSubtitle": "Your activity history",
"pageSubtitleAdmin": "Activity 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",
"searchPlaceholder": "Search filename, path, or IP",
"dateFrom": "Start date",
"dateTo": "End date",
"dateRangeSeparator": "~",
"summaryAll": "All · {total} entries, {upload} uploads, {delete} deletes",
"actionUpload": "Upload",
"actionDelete": "Delete",
"actionLogin": "Login",
"actionEdit": "Edit",
"actionSettings": "Settings",
"actionTags": "Tags",
"sourceWeb": "Web",
"sourceApi": "API",
"sourceAdmin": "Admin",
"colTime": "Time",
"colUser": "User",
"colStorage": "Storage",
@@ -616,7 +744,11 @@
"colFile": "File",
"colFolder": "Folder",
"colSize": "Size",
"colKey": "Path"
"colKey": "Path",
"colIp": "IP address",
"colResult": "Result",
"resultSuccess": "Success",
"resultFailure": "Failed"
},
"image": {
"empty": "No images",
+156 -20
View File
@@ -97,7 +97,7 @@
"confirmPlaceholder": "再次输入密码",
"allowRegistration": "允许其他用户注册",
"domainSeparation": "启用后台与图片域名分离",
"domainSeparationHint": "管理后台与 API 使用网站域名,图片直链使用独立图片域名",
"domainSeparationHint": "启用后,可以使用不同的域名访问后台和图片资源,便于配置 CDN 和自定义域名。",
"domainSeparationProxyHint": "需将两个域名解析到本机,并通过 Nginx、Caddy、NPM 等反代到端口 6892",
"domainSeparationProxyExample": "查看示例",
"siteBaseUrl": "网站域名",
@@ -166,6 +166,104 @@
"sessionTitle": "本次上传",
"sessionEmpty": "暂无本次上传"
},
"tags": {
"column": "标签",
"uploadLabel": "标签(可选)",
"addTag": "添加标签",
"searchOrCreate": "搜索或创建标签",
"createNamed": "创建标签 \"{name}\"",
"created": "已创建标签「{name}」",
"createFailed": "创建标签失败",
"updateFailed": "更新标签失败",
"filterAll": "全部标签",
"filterSelected": "已选 {n} 个",
"filterTitle": "按标签筛选",
"manage": "管理",
"manageTitle": "管理标签",
"manageImageTitle": "管理标签",
"manageSubtitle": "集中管理图片标签,支持新增、修改、删除与合并",
"newTag": "新建标签",
"addTag": "新增标签",
"mergeTags": "合并标签",
"searchName": "搜索标签名称",
"filterStatusAll": "全部状态",
"filterStatusUsed": "已使用",
"filterStatusUnused": "未使用",
"statTotal": "标签总数",
"statUsed": "已使用标签",
"statUnused": "未使用标签",
"statNew7d": "最近 7 天新增",
"colName": "标签名称",
"colImageCount": "图片数",
"colLastUsed": "最近使用",
"neverUsed": "从未使用",
"colActions": "操作",
"mergeIntoAction": "合并到…",
"mergeIntoTitle": "合并到…",
"mergeIntoSubtitle": "将标签「{name}」合并到其他标签",
"mergeIntoChoose": "选择要合并到的目标标签",
"mergeIrreversibleTitle": "此操作不可恢复",
"mergeIrreversible": "合并后,被合并的标签将被永久删除,其关联图片会归入保留的标签。此操作无法撤销。",
"mergeConfirmKeep": "将保留标签「{name}」",
"mergeWillDelete": "以下标签将被删除:{names}",
"totalCount": "共 {n} 个标签",
"sortByCount": "按数量",
"sortByName": "按名称",
"search": "搜索标签",
"namePlaceholder": "标签名称",
"customColor": "自定义颜色",
"pickColor": "选择颜色",
"preview": "预览",
"renamed": "标签已重命名",
"renameFailed": "重命名失败",
"colorFailed": "更新颜色失败",
"deleted": "已删除标签「{name}」",
"deleteFailed": "删除标签失败",
"deleteConfirmTitle": "确认删除标签",
"deleteConfirmDesc": "确定删除标签「{name}」?图片上的该标签将被移除,此操作不可恢复。",
"mergeSelectAtLeast": "请至少选择 2 个标签",
"mergeHint": "勾选多个标签后可合并;其余标签的图片将归入保留的标签",
"mergeSelected": "已选 {n} 个标签",
"mergeClear": "取消选择",
"mergeTitle": "合并标签",
"mergeSubtitle": "将多个标签合并为一个",
"mergeNote": "未选中的标签将被删除,其图片会归入保留的标签",
"mergeChooseTarget": "选择要保留的标签",
"mergeAction": "合并为…",
"mergeRow": "合并",
"mergeConfirm": "确认合并",
"merged": "标签已合并",
"mergeFailed": "合并失败",
"untagged": "无标签",
"untaggedAction": "+ 无标签",
"unlabeled": "未标记",
"selectedLabel": "已选标签 ({n})",
"clearSelected": "清空",
"selectAll": "全选",
"deselectAll": "取消全选",
"existingLabel": "已有标签 ({n})",
"commonTags": "常用标签",
"recentTags": "最近使用",
"moreTags": "还有 {n} 个标签",
"classifyHint": "标签仅用于分类,不影响图片实际存储路径",
"saved": "标签已保存",
"saveFailed": "保存标签失败",
"batchTagAll": "批量打标签",
"batchAddTitle": "添加标签",
"batchAddSubtitle": "已选 {n} 张图片",
"modeOr": "任一",
"modeAnd": "全部",
"batchTitle": "批量标签",
"batchSubtitle": "为已选 {n} 张图片更新标签",
"batchAdd": "添加标签",
"batchRemove": "移除标签",
"batchSuccess": "批量更新完成",
"batchFailed": "批量更新失败",
"noMatch": "无匹配标签",
"emptyHint": "暂无标签,可输入名称创建",
"settingsLink": "在图库中管理标签(新建、改色、合并、删除)",
"openManage": "打开标签管理"
},
"copy": {
"url": "直链",
"markdown": "Markdown",
@@ -188,30 +286,48 @@
"back": "返回上传",
"processing": "图片处理",
"clientCompress": "客户端预压缩",
"clientCompressHint": "上传前在浏览器端压缩(服务端仍会转 WebP)",
"clientCompressHint": "在上传前于浏览器端压缩图片,减少上传体积(服务端仍会转 WebP)。",
"autoDeletePrefix": "自动删除超过",
"autoDeleteSuffix": "天的图片",
"autoDeleteHint": "仅清理开启后上传的图片,不影响此前已存的图片",
"autoDeleteHint": "自动清理指定天数前上传的图片,仅对开启后新上传的图片生效。",
"webpQuality": "WebP 压缩质量",
"webpQualityHint": "客户端预压缩质量(1–100),需开启「客户端预压缩」",
"webpQualityHint": "转换为 WebP 格式时的图片质量,数值越高画质越好、体积越大。",
"current": "当前:{n}",
"qualityHigh": "高质量",
"qualityMedium": "中等质量",
"qualityLow": "有损压缩",
"convenience": "便捷功能",
"autoCopy": "上传成功自动复制链接",
"autoCopyHint": "按所选格式复制到剪贴板"
"autoCopyHint": "图片上传成功后,自动复制图片链接到剪贴板。"
},
"settings": {
"title": "系统设置",
"pageTitle": "设置与偏好",
"pageSubtitle": "管理系统配置与操作日志",
"pageSubtitleBasic": "管理系统配置与上传偏好",
"pageSubtitleBasic": "配置系统的基本选项,让 PicHost 更好地为你服务。",
"pageSubtitleDomains": "配置网站域名、图片域名以及图片存储路径等相关设置",
"pageSubtitleAccess": "配置图片访问安全策略,防止资源被恶意盗用。",
"pageSubtitleLogs": "查看用户上传、删除、修改与系统配置记录",
"searchPlaceholder": "搜索设置项…",
"searchEmpty": "无匹配项",
"restoreDefaults": "恢复默认",
"restoredDefaults": "已恢复默认设置",
"refererProtection": "防盗链设置",
"defaultCopyFormatHint": "设置上传后自动复制的链接格式。",
"systemVersionHint": "当前运行的 PicHost 版本。",
"badgeEnabled": "已启用",
"domainSeparationProxyTitle": "需要将两个域名解析到本机",
"domainSeparationProxyBody": "请将网站域名和图片域名都解析到本机,并通过 Nginx、Caddy、NPM 等反向代理到本机的 6892 端口。",
"siteBaseUrlRoleHint": "用于访问后台管理界面的网站域名。",
"imageBaseUrlRoleHint": "用于访问和显示图片资源的域名。",
"imageDomainSection": "图片域名",
"navBasic": "基础设置",
"navDomains": "域名与路径",
"navAccess": "访问控制",
"navTags": "标签管理",
"navPreferences": "偏好设置",
"navLogs": "操作日志",
"pageSubtitleTags": "创建、重命名、合并或删除标签",
"systemVersion": "系统版本",
"checkUpdate": "检查更新",
"saveSettings": "保存设置",
@@ -222,25 +338,29 @@
"pathAndLinkHint": "控制图片直链格式与上传目录结构",
"domainSeparationSection": "域名分离",
"allowRegistration": "开放用户注册",
"allowRegistrationHint": "允许新用户自行注册(普通用户仅可见自己的图片)",
"allowRegistrationHint": "允许新用户自行注册账号。",
"accessControl": "访问控制",
"refererHint": "Referer 防盗链,逗号分隔允许引用的域名,留空不限制",
"refererHint": "通过 Referer 防盗链,限制哪些网站可以引用你的图片。",
"refererDomainsLabel": "允许引用的域名",
"refererTip": "多个域名请使用英文逗号 (,) 分隔,不支持通配符",
"refererExamplesTitle": "推荐示例",
"refererExamplesSample": "example.com, static.example.com",
"refererScenarioTitle": "常见场景",
"refererScenarioDesc": "允许主站与静态站点引用图片",
"refererScenario1": "个人博客引用本站图片",
"refererScenario2": "企业官网与静态资源站",
"refererScenario3": "开发环境本地调试",
"refererScenario4": "留空表示不限制任何来源",
"refererEnabled": "已开启",
"refererUnrestricted": "未限制",
"loginVerification": "登录验证",
"loginVerificationHint": "登录与注册时使用的人机验证方式,三选一",
"loginVerificationSlider": "本地滑块",
"loginVerificationSliderHint": "内置滑块拼图,无需第三方服务",
"loginVerificationSliderHint": "内置滑块验证,无需第三方服务。",
"loginVerificationTurnstile": "Cloudflare Turnstile",
"loginVerificationTurnstileHint": "在 Cloudflare 控制台创建 Widget,填写 Site Key 与 Secret Key",
"loginVerificationTurnstileHint": "使用 Cloudflare 提供的人机验证服务,安全可靠。",
"loginVerificationCap": "Cap POW",
"loginVerificationCapHint": "自托管 Cap Standalone,填写 API Endpoint 与 Secret Key",
"loginVerificationCapHint": "使用基于工作量证明的人机验证,适合无第三方服务的环境。",
"turnstileSiteKey": "Turnstile Site Key",
"turnstileSiteKeyPlaceholder": "0x4AAAAAAA…",
"turnstileSecretKey": "Turnstile Secret Key",
@@ -273,9 +393,9 @@
"disableDomainSeparationConfirm": "确认关闭",
"domainSeparationRequired": "启用域名分离时需同时填写网站域名与图片域名",
"hideFolderInUrl": "使用简短图片链接",
"hideFolderInUrlHint": "开启后链接仅含域名与文件名,例如 img.example.com/abc.webp;关闭后保留日期或自定义目录,例如 img.example.com/2026/08/abc.webp",
"hideFolderInUrlHint": "启用后,生成的图片链接将使用简短格式(如 /abc123.png),不包含年月目录。",
"storageUseDatePath": "上传目录按年/月分组",
"storageUseDatePathHint": "开启后保存为 images/2026/08/xxx.webp;关闭则为 images/xxx.webp。仅影响启用后的新上传",
"storageUseDatePathHint": "启用后,上传的图片将按 年/月 自动分组存储,如 2024/01/xxx.png,便于管理。",
"badgeEnv": ".env",
"badgeSaved": "已保存",
"badgeDefault": "默认",
@@ -287,7 +407,7 @@
"apiTokenLine": "来源:{source}",
"viewReleases": "查看发行版",
"updateAvailable": "有新版本 {version}",
"upToDate": "当前已是最新版本",
"upToDate": "已是最新版本",
"checkUpdateFailed": "检查更新失败,请稍后重试",
"unsavedChanges": "有未保存的更改",
"manageToken": "管理 Token",
@@ -594,20 +714,28 @@
},
"logs": {
"pageTitle": "操作日志",
"pageSubtitle": "查看您的上传与删除记录",
"pageSubtitleAdmin": "查看所有用户的上传与删除记录",
"pageSubtitle": "查看您的操作记录",
"pageSubtitleAdmin": "查看所有用户的操作记录",
"loadFailed": "加载操作日志失败",
"empty": "暂无操作记录",
"entriesUnit": "条记录",
"filterActionAll": "全部操作",
"filterSourceAll": "全部来源",
"filterUserAll": "全部用户",
"searchPlaceholder": "搜索文件名",
"searchPlaceholder": "搜索文件名、路径或 IP",
"dateFrom": "开始日期",
"dateTo": "结束日期",
"dateRangeSeparator": "~",
"summaryAll": "全部 · 共 {total} 条记录,上传 {upload} 条,删除 {delete} 条",
"actionUpload": "上传",
"actionDelete": "删除",
"actionLogin": "登录",
"actionEdit": "编辑",
"actionSettings": "设置",
"actionTags": "标签",
"sourceWeb": "网页",
"sourceApi": "API",
"sourceAdmin": "管理后台",
"colTime": "时间",
"colUser": "用户",
"colStorage": "存储",
@@ -616,7 +744,11 @@
"colFile": "文件名",
"colFolder": "目录",
"colSize": "大小",
"colKey": "路径"
"colKey": "路径",
"colIp": "IP 地址",
"colResult": "操作结果",
"resultSuccess": "成功",
"resultFailure": "失败"
},
"image": {
"empty": "暂无图片",
@@ -722,11 +854,15 @@
"image": "上传图片,主字段",
"file": "兼容字段,单图上传",
"files": "兼容字段,多图上传",
"token": "Twikoo 协议兼容,表单 token"
"token": "Twikoo 协议兼容,表单 token",
"tagIds": "可选,JSON 数组或重复字段,上传后自动打标"
},
"list": {
"limit": "每页条数,默认 20,最大 100",
"page": "页码,从 1 开始"
"page": "页码,从 1 开始",
"tagIds": "按标签筛选,逗号分隔 ID;与 untagged、tagMode 配合",
"tagMode": "多标签时 or(默认)或 and",
"untagged": "设为 1 仅显示无标签图片"
},
"search": {
"q": "搜索关键词,必填"