feat(media): extract workspace package

This commit is contained in:
Maofeng
2026-09-20 16:44:15 +08:00
parent 2a6284d1b0
commit c519d4e74b
29 changed files with 112 additions and 16 deletions
@@ -0,0 +1,38 @@
import { describe, expect, it } from "vitest"
import { mediaMessages } from "../messages"
import { mediaCatalogLocales } from "./catalogs"
import { messages as enUS } from "./en-US"
import { messages as zhHans } from "./zh-Hans"
describe("media locale catalogs", () => {
it("ships every media message in every built-in locale", () => {
expectCompleteCatalogs({
catalogs: {
"en-US": enUS,
"zh-Hans": zhHans,
},
locales: mediaCatalogLocales,
messageIds: Object.values(mediaMessages).map(
(descriptor) => descriptor.id
),
})
})
})
function expectCompleteCatalogs({
catalogs,
locales,
messageIds,
}: {
catalogs: Readonly<Record<string, Readonly<Record<string, string>>>>
locales: readonly string[]
messageIds: readonly string[]
}) {
expect(Object.keys(catalogs)).toEqual([...locales])
const expectedIds = new Set(messageIds)
for (const messages of Object.values(catalogs)) {
expect(new Set(Object.keys(messages))).toEqual(expectedIds)
}
}
+16
View File
@@ -0,0 +1,16 @@
import type { mediaMessages } from "../messages"
export const mediaCatalogLocales = ["en-US", "zh-Hans"] as const
interface MessageDescriptorMap {
readonly [key: string]: {
readonly id: string
}
}
type MessageId<T extends MessageDescriptorMap> = T[keyof T]["id"]
export type MediaCatalogLocale = (typeof mediaCatalogLocales)[number]
export type MediaMessageCatalog = Readonly<
Record<MessageId<typeof mediaMessages>, string>
>
+73
View File
@@ -0,0 +1,73 @@
import type { MediaMessageCatalog } from "./catalogs"
export const locale = "en-US"
export const languageTag = "en-US"
export const messages = {
"blocks.media.actions.cancel": "Cancel",
"blocks.media.actions.copyInformation": "Copy information",
"blocks.media.actions.copyLink": "Copy link",
"blocks.media.actions.copyName": "Copy name",
"blocks.media.actions.delete": "Delete",
"blocks.media.actions.details": "View details",
"blocks.media.actions.favorite": "Favorite",
"blocks.media.actions.loadMore": "Load more",
"blocks.media.actions.moveToFolder": "Move to folder",
"blocks.media.actions.rename": "Rename",
"blocks.media.actions.retry": "Try again",
"blocks.media.actions.save": "Save",
"blocks.media.actions.saving": "Saving…",
"blocks.media.actions.select": "Select",
"blocks.media.actions.selectFolder": "Select folder {name}",
"blocks.media.actions.unfavorite": "Unfavorite",
"blocks.media.actions.upload": "Upload",
"blocks.media.actions.viewOriginal": "View original",
"blocks.media.copy.failed":
"Copy failed. Check browser clipboard permissions.",
"blocks.media.deleteAsset.description":
"This media item will no longer appear in the library.",
"blocks.media.deleteAsset.title": "Delete media",
"blocks.media.deleteFolder.description":
"This folder and its child folders will be deleted. Their media items will become unclassified.",
"blocks.media.deleteFolder.title": "Delete folder",
"blocks.media.details.dimensions": "Dimensions",
"blocks.media.details.fileName": "File name",
"blocks.media.details.noDimensions": "Unknown",
"blocks.media.details.size": "Size",
"blocks.media.details.type": "Type",
"blocks.media.details.uploadedAt": "Uploaded",
"blocks.media.empty.description":
"Upload images or videos to manage them here.",
"blocks.media.empty.title": "No media",
"blocks.media.emptySearch.description": "No media files match your search.",
"blocks.media.filters.all": "All media",
"blocks.media.filters.favorite": "Favorites",
"blocks.media.filters.image": "Images",
"blocks.media.filters.unclassified": "Unclassified",
"blocks.media.filters.video": "Videos",
"blocks.media.folders.classification":
"Folders only organize media in this library and do not change file URLs.",
"blocks.media.folders.create": "New folder",
"blocks.media.folders.empty": "No folders yet. Create one.",
"blocks.media.folders.name": "Folder name",
"blocks.media.folders.newChild": "New child folder",
"blocks.media.folders.placeholder": "Enter a folder name",
"blocks.media.folders.rename": "Rename folder",
"blocks.media.folders.title": "Folders",
"blocks.media.load.error": "Unable to load media",
"blocks.media.loading": "Loading media…",
"blocks.media.picker.description":
"Choose an uploaded image or video from the media library.",
"blocks.media.picker.selectedCount": "{count} selected",
"blocks.media.picker.title": "Select media",
"blocks.media.picker.useSelected": "Use selected media",
"blocks.media.renameMedia.description":
"This changes the display name without changing the file or its URL.",
"blocks.media.renameMedia.title": "Rename media",
"blocks.media.search": "Search media files",
"blocks.media.title": "Media library",
"blocks.media.upload.chooseStorage": "Choose cloud storage",
"blocks.media.upload.cloud": "Upload to cloud",
"blocks.media.upload.error": "Unable to upload media.",
"blocks.media.upload.server": "Upload to server",
"blocks.media.upload.success": "{count} media files uploaded.",
} as const satisfies MediaMessageCatalog
+69
View File
@@ -0,0 +1,69 @@
import type { MediaMessageCatalog } from "./catalogs"
export const locale = "zh-Hans"
export const languageTag = "zh-CN"
export const messages = {
"blocks.media.actions.cancel": "取消",
"blocks.media.actions.copyInformation": "复制媒体信息",
"blocks.media.actions.copyLink": "复制链接",
"blocks.media.actions.copyName": "复制名称",
"blocks.media.actions.delete": "删除",
"blocks.media.actions.details": "查看详情",
"blocks.media.actions.favorite": "收藏",
"blocks.media.actions.loadMore": "加载更多",
"blocks.media.actions.moveToFolder": "移动到目录",
"blocks.media.actions.rename": "重命名",
"blocks.media.actions.retry": "重新加载",
"blocks.media.actions.save": "保存",
"blocks.media.actions.saving": "正在保存…",
"blocks.media.actions.select": "选择",
"blocks.media.actions.selectFolder": "选择目录:{name}",
"blocks.media.actions.unfavorite": "取消收藏",
"blocks.media.actions.upload": "上传",
"blocks.media.actions.viewOriginal": "查看原文件",
"blocks.media.copy.failed": "复制失败,请检查浏览器剪贴板权限。",
"blocks.media.deleteAsset.description": "该媒体将不再显示在媒体库中。",
"blocks.media.deleteAsset.title": "删除媒体",
"blocks.media.deleteFolder.description":
"该目录及其子目录将被删除,其中的媒体会变为未分类。",
"blocks.media.deleteFolder.title": "删除目录",
"blocks.media.details.dimensions": "尺寸",
"blocks.media.details.fileName": "文件名称",
"blocks.media.details.noDimensions": "未知",
"blocks.media.details.size": "大小",
"blocks.media.details.type": "类型",
"blocks.media.details.uploadedAt": "上传时间",
"blocks.media.empty.description": "上传图片或视频后,可在这里统一管理。",
"blocks.media.empty.title": "暂无媒体",
"blocks.media.emptySearch.description": "没有找到匹配的媒体文件。",
"blocks.media.filters.all": "全部媒体",
"blocks.media.filters.favorite": "收藏",
"blocks.media.filters.image": "图片",
"blocks.media.filters.unclassified": "未分类",
"blocks.media.filters.video": "视频",
"blocks.media.folders.classification":
"目录仅用于媒体库内分类,不会改变文件链接。",
"blocks.media.folders.create": "新建目录",
"blocks.media.folders.empty": "暂无目录,点击新建。",
"blocks.media.folders.name": "目录名称",
"blocks.media.folders.newChild": "新建子目录",
"blocks.media.folders.placeholder": "输入目录名称",
"blocks.media.folders.rename": "重命名目录",
"blocks.media.folders.title": "目录",
"blocks.media.load.error": "无法加载媒体",
"blocks.media.loading": "正在加载媒体…",
"blocks.media.picker.description": "从媒体库中选择已上传的图片或视频。",
"blocks.media.picker.selectedCount": "已选择 {count} 项",
"blocks.media.picker.title": "选择媒体",
"blocks.media.picker.useSelected": "使用所选媒体",
"blocks.media.renameMedia.description":
"仅修改展示名称,不会改变文件或已有链接。",
"blocks.media.renameMedia.title": "修改媒体名称",
"blocks.media.search": "搜索媒体文件",
"blocks.media.title": "媒体库",
"blocks.media.upload.chooseStorage": "选择云端存储",
"blocks.media.upload.cloud": "上传到云端",
"blocks.media.upload.error": "无法上传媒体文件。",
"blocks.media.upload.server": "上传到服务器",
"blocks.media.upload.success": "已上传 {count} 个媒体文件。",
} as const satisfies MediaMessageCatalog