mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-11-14 00:01:03 +00:00
e0982e708f
The panels follow the reworked reclaim state: Check now starts a check in the background and the panel polls until it is done, a category with an unusually large share of unused files offers Confirm, Freed comes from the last run that deleted, a stopped check says why and no longer reads as nothing found, the switch waits for its answer and a poll that was in flight cannot flip it back, and refusals name their reason in the operator's language. Strings updated in all 28 languages.
159 lines
10 KiB
TypeScript
159 lines
10 KiB
TypeScript
import type { TranslationStrings } from '../types';
|
||
|
||
const storage: TranslationStrings = {
|
||
'storage.field.root': '根目录',
|
||
'storage.help.root': '该后端存储对象的服务器绝对路径。',
|
||
'storage.field.endpoint': '端点 URL',
|
||
'storage.help.endpoint': '兼容 S3 服务的基础 URL,例如 https://s3.example.com 或 http://127.0.0.1:9000。',
|
||
'storage.field.bucket': '存储桶',
|
||
'storage.field.accessKeyId': '访问密钥 ID',
|
||
'storage.field.secretAccessKey': '私密访问密钥',
|
||
'storage.field.region': '区域',
|
||
'storage.help.region': '除非你的提供商要求特定区域,否则保留默认值。',
|
||
'storage.field.keyPrefix': '键前缀',
|
||
'storage.help.keyPrefix': '添加到每个对象键的可选前缀,例如 trek/prod。',
|
||
'storage.field.retries': '重试次数',
|
||
'storage.field.timeoutMs': '超时(毫秒)',
|
||
'storage.field.primary': '主后端',
|
||
'storage.field.replicas': '副本',
|
||
'storage.title': '存储',
|
||
'storage.description': 'TREK 存放上传文件、照片和备份的位置。保存之前不会有任何更改。',
|
||
'storage.loading': '加载中…',
|
||
'storage.saved': '存储配置已保存',
|
||
'storage.save': '保存更改',
|
||
'storage.unsaved': '未保存的更改',
|
||
'storage.saveConflict':
|
||
'存储配置自加载后已更改,因此您的更改未被保存。请放弃这些更改并重新加载已保存的设置,然后重新开始。',
|
||
'storage.discardAndReload': '放弃我的更改并重新加载',
|
||
'storage.configError.banner': '已保存的存储设置加载失败 — 保存将替换它们:{error}',
|
||
'storage.backends.title': '后端',
|
||
'storage.backends.add': '添加后端',
|
||
'storage.backends.usedBy': '使用者:{categories}',
|
||
'storage.backends.unused': '未分配到任何分类',
|
||
'storage.backends.envReadOnly': '由环境变量定义(只读)',
|
||
'storage.source.built-in': '内置',
|
||
'storage.source.env': '环境',
|
||
'storage.source.settings': '设置',
|
||
'storage.type.local': '本地',
|
||
'storage.type.s3': 'S3',
|
||
'storage.type.mirror': '镜像',
|
||
'storage.actions.test': '测试',
|
||
'storage.actions.edit': '编辑',
|
||
'storage.actions.remove': '移除',
|
||
'storage.test.running': '测试中…',
|
||
'storage.test.ok': '连接正常',
|
||
'storage.test.failed': '测试失败',
|
||
'storage.remove.title': '移除后端',
|
||
'storage.remove.body': '从配置中移除 {name}?如果仍有内容依赖它,服务器将拒绝保存。',
|
||
'storage.remove.stillAssigned': '仍分配给:{categories}',
|
||
'storage.form.addTitle': '添加后端',
|
||
'storage.form.editTitle': '编辑后端',
|
||
'storage.form.name': '名称',
|
||
'storage.form.type': '类型',
|
||
'storage.form.apply': '应用',
|
||
'storage.form.cancel': '取消',
|
||
'storage.form.duplicateName': '名为 {name} 的后端已存在',
|
||
'storage.categories.title': '分类',
|
||
'storage.categories.default': '默认',
|
||
'storage.categories.reassignWarning': '现有对象不会移动:新对象会进入新分配的后端,旧对象保留在原处。',
|
||
'storage.category.files': '行程文档',
|
||
'storage.category.journey': '旅程照片',
|
||
'storage.category.covers': '封面图片',
|
||
'storage.category.avatars': '个人头像',
|
||
'storage.category.places': '地点图片',
|
||
'storage.category.photos-google': 'Google 照片缓存',
|
||
'storage.category.photos-trek': 'TREK 照片缓存',
|
||
'storage.category.backups': '备份',
|
||
|
||
// What each category stores — rendered under the label in the category map.
|
||
'storage.categoryDesc.files': '上传到行程的文件附件 — 车票、PDF、预订确认单,以及在行程聊天中共享的文件。',
|
||
'storage.categoryDesc.journey': '附加到旅程条目的照片和缩略图。',
|
||
'storage.categoryDesc.covers': '行程和收藏的封面图片,包括从 Unsplash 获取的封面。',
|
||
'storage.categoryDesc.avatars': '用户账户的个人头像。',
|
||
'storage.categoryDesc.places': '附加到地点和收藏地点的图片 — 上传或导入的。',
|
||
'storage.categoryDesc.photos-google': 'Google Places 照片的缓存副本 — 可重新获取,丢失也无妨。',
|
||
'storage.categoryDesc.photos-trek': '"照片"(Memories)功能使用的 TREK 照片服务缓存的照片 — 可重新获取,丢失也无妨。',
|
||
'storage.categoryDesc.backups': '由备份面板或计划任务创建的服务器备份存档。',
|
||
'storage.health.title': '健康状态',
|
||
'storage.health.allClear': '未记录任何副本故障。',
|
||
'storage.health.seedFile': '存在 storage-config.json 种子文件但已被忽略 — 配置行已存在。请在此管理存储。',
|
||
'storage.health.failureLine': '{backend} 上 {key} 的 {op} 失败:{error}',
|
||
|
||
// Replicas-on-primary mirror UX (2026-08-20 spec)
|
||
'storage.mirror.targets': '镜像目标',
|
||
'storage.mirror.targetsHelp': '对该后端的每次写入也会复制到每个选定的目标。',
|
||
'storage.mirror.latencyNote': '每次上传时,副本会依次写入 — 缓慢或无法访问的目标会拖慢该后端上每个分类的每次上传。',
|
||
'storage.mirror.mirroredTo': '已镜像至:{targets}',
|
||
'storage.mirror.replicaOf': '副本来源:{primaries}',
|
||
'storage.mirror.cacheWarning': '不建议:此分类保存的是可重新获取的内容 — 复制它通常是浪费的。',
|
||
'storage.mirror.degenerate.duplicate-mirror':
|
||
'第二个镜像包裹了 {primary} — 面板仅管理第一个;移除此项以从 {primary} 管理镜像。',
|
||
'storage.mirror.degenerate.env-primary': '包裹了一个由环境变量定义的后端 — 此处不可编辑。',
|
||
'storage.mirror.degenerate.missing-primary': '引用了一个已不存在的后端。',
|
||
'storage.remove.usedAsReplicaBy': '被用作副本,使用者:{primaries}',
|
||
|
||
// Backfill + usage (backfill/stats/notifications spec)
|
||
'storage.sync.now': '立即同步',
|
||
'storage.sync.running': '同步中… {done}/{total}',
|
||
'storage.sync.counts': '已复制 {copied} · 已跳过 {skipped} · 失败 {failed}',
|
||
'storage.sync.cancel': '取消同步',
|
||
'storage.sync.done': '同步完成:已复制 {copied},已删除 {deleted},失败 {failed}',
|
||
'storage.sync.cancelled': '同步已取消',
|
||
'storage.sync.error': '同步失败:{error}',
|
||
'storage.sync.prompt': '现有对象尚未复制 — 立即同步?',
|
||
'storage.sync.dismiss': '关闭',
|
||
'storage.usage.line': '{count} 个对象 · {size}',
|
||
'storage.usage.computed': '用量已计算:{age}',
|
||
'storage.usage.never': '尚未计算用量',
|
||
'storage.usage.refresh': '刷新',
|
||
'storage.usage.compute': '立即计算',
|
||
'storage.usage.legacyNote': '包含旧版照片库',
|
||
|
||
// Category migration (copy → flip → delta sweep)
|
||
'storage.migrate.promptTitle': '将现有对象移动到新后端?',
|
||
'storage.migrate.promptLine': '{category}:从 {from} 到 {to} 共 {count} 个对象({size})',
|
||
'storage.migrate.promptLineUnknown': '{category}:大小未知(尚未扫描用量)从 {from} 到 {to}',
|
||
'storage.migrate.move': '移动现有对象',
|
||
'storage.migrate.routeOnly': '仅路由新写入',
|
||
'storage.migrate.running': '正在移动 {category}… {done}/{total}',
|
||
'storage.migrate.done': '移动完成:已复制 {copied},已跳过 {skipped}',
|
||
'storage.migrate.doneFailures': '{failed} 个失败 — 这些对象未复制到新后端',
|
||
'storage.migrate.failed': '移动失败:{error} — 该分类未切换',
|
||
'storage.migrate.cancelled': '移动已取消 — 未切换任何内容',
|
||
'storage.migrate.reclaimable': '{count} 个对象({size})仍保留在 {from} 上,请手动回收',
|
||
'storage.migrate.cancel': '取消移动',
|
||
'storage.migrate.promptCancel': '取消',
|
||
'storage.migrate.queued': '排队中:{categories}',
|
||
'storage.migrate.queueDropped': '无法启动下一个迁移 — 剩余队列已清空:{categories}',
|
||
'storage.reclaim.title': '未被引用的文件',
|
||
'storage.reclaim.hint': 'TREK 每晚会查找不再被任何行程、地点、日志、合集或用户使用的已上传文件,例如行程被删除之后。',
|
||
'storage.reclaim.check': '立即检查',
|
||
'storage.reclaim.checked': '上次检查:{age}',
|
||
'storage.reclaim.never': '尚未检查',
|
||
'storage.reclaim.delete': '删除未被引用的文件',
|
||
'storage.reclaim.deleteHint':
|
||
'关闭时,夜间检查只做报告。开启后,一周内无人使用的文件会被删除。无论开关与否,你在 TREK 中删除的文件都会立即移除。',
|
||
'storage.reclaim.freeable': '可释放',
|
||
'storage.reclaim.waiting': '未使用不足一周',
|
||
'storage.reclaim.deleted': '上次夜间清理已释放',
|
||
'storage.reclaim.nothing': '未发现未被引用的文件。',
|
||
'storage.reclaim.stopped': '上次检查提前停止,因为运行期间数据库被恢复了。',
|
||
'storage.reclaim.skip.sources_missing': '已跳过:无法查询 TREK 的所有部分',
|
||
'storage.reclaim.skip.shared_location': '已跳过:与另一个类别共用位置',
|
||
'storage.reclaim.skip.list_failed': '已跳过:无法列出文件',
|
||
'storage.reclaim.skip.source_failed': '已跳过:某次查询失败',
|
||
'storage.reclaim.running': '正在检查…',
|
||
'storage.reclaim.stoppedFailed': '上次检查因错误而停止。今晚会再次运行。',
|
||
'storage.reclaim.skip.foreign_install': '已跳过:另一个 TREK 安装正在使用此存储',
|
||
'storage.reclaim.skip.owner_unknown': '已跳过:TREK 无法将此存储标记为自己的',
|
||
'storage.reclaim.skip.delete_failed': '已停止:存储拒绝了一次删除',
|
||
'storage.reclaim.skip.interrupted': '未完成即停止,数据仅为部分',
|
||
'storage.reclaim.confirmNeeded': '这些文件中超过五分之一看起来未被使用。在你确认这是预期情况之前,不会删除任何内容。',
|
||
'storage.reclaim.confirm': '确认',
|
||
'storage.reclaim.confirmed': '已确认。夜间清理现在可以删除这些文件。',
|
||
'storage.reclaim.error.reclaim_busy': '另一项存储任务正在运行。请稍后再试。',
|
||
'storage.reclaim.error.reclaim_demo': '演示实例中不可用。',
|
||
'storage.reclaim.error.reclaim_nothing_to_confirm': '已无需确认。请先运行一次检查。',
|
||
};
|
||
export default storage;
|