feat: 界面全部改为中文

- 侧边栏导航:仪表盘、登录、内容浏览、发布、互动、API 测试、设置
- 7 个页面所有按钮、标签、提示、错误信息改为中文
- API 端点列表分类改为中文(登录、内容、发布、互动)
- 组件内文本:展开/收起、复制、点赞、收藏、评论等
- 页面标题改为 Social MCP - 管理后台
This commit is contained in:
2026-03-01 16:52:57 +08:00
parent 0e693842a6
commit 69a0f7b24c
16 changed files with 233 additions and 233 deletions
+30 -30
View File
@@ -34,7 +34,7 @@ export function PublishPage() {
const handlePublishImage = useCallback(async () => {
if (!imgTitle.trim() || !imgPaths.trim()) {
toast('warning', 'Title and images are required');
toast('warning', '标题和图片为必填项');
return;
}
setImgLoading(true);
@@ -52,12 +52,12 @@ export function PublishPage() {
});
setImgResult(res);
if (res.success) {
toast('success', 'Image note published!');
toast('success', '图文笔记发布成功!');
} else {
toast('error', res.error?.message || 'Publish failed');
toast('error', res.error?.message || '发布失败');
}
} catch (err) {
const msg = err instanceof Error ? err.message : 'Publish failed';
const msg = err instanceof Error ? err.message : '发布失败';
toast('error', msg);
setImgResult({ error: msg });
} finally {
@@ -67,7 +67,7 @@ export function PublishPage() {
const handlePublishVideo = useCallback(async () => {
if (!vidTitle.trim() || !vidPath.trim()) {
toast('warning', 'Title and video path are required');
toast('warning', '标题和视频路径为必填项');
return;
}
setVidLoading(true);
@@ -83,12 +83,12 @@ export function PublishPage() {
});
setVidResult(res);
if (res.success) {
toast('success', 'Video note published!');
toast('success', '视频笔记发布成功!');
} else {
toast('error', res.error?.message || 'Publish failed');
toast('error', res.error?.message || '发布失败');
}
} catch (err) {
const msg = err instanceof Error ? err.message : 'Publish failed';
const msg = err instanceof Error ? err.message : '发布失败';
toast('error', msg);
setVidResult({ error: msg });
} finally {
@@ -98,12 +98,12 @@ export function PublishPage() {
return (
<div className="max-w-3xl space-y-4">
<h1 className="text-2xl font-bold">Publish Note</h1>
<h1 className="text-2xl font-bold"></h1>
<Tabs
tabs={[
{ key: 'image', label: 'Image Note' },
{ key: 'video', label: 'Video Note' },
{ key: 'image', label: '图文笔记' },
{ key: 'video', label: '视频笔记' },
]}
active={tab}
onChange={setTab}
@@ -112,28 +112,28 @@ export function PublishPage() {
{tab === 'image' && (
<Card>
<div className="space-y-4">
<Input label="Title" value={imgTitle} onChange={(e) => setImgTitle(e.target.value)} placeholder="Note title" />
<Textarea label="Content" value={imgContent} onChange={(e) => setImgContent(e.target.value)} placeholder="Note body text" />
<Textarea label="Image Paths (one per line)" value={imgPaths} onChange={(e) => setImgPaths(e.target.value)} placeholder="/path/to/image1.jpg&#10;/path/to/image2.jpg" />
<Input label="Tags (comma separated)" value={imgTags} onChange={(e) => setImgTags(e.target.value)} placeholder="travel, food" />
<Input label="标题" value={imgTitle} onChange={(e) => setImgTitle(e.target.value)} placeholder="笔记标题" />
<Textarea label="正文" value={imgContent} onChange={(e) => setImgContent(e.target.value)} placeholder="笔记正文" />
<Textarea label="图片路径(每行一个)" value={imgPaths} onChange={(e) => setImgPaths(e.target.value)} placeholder="/path/to/image1.jpg&#10;/path/to/image2.jpg" />
<Input label="标签(逗号分隔)" value={imgTags} onChange={(e) => setImgTags(e.target.value)} placeholder="旅行, 美食" />
<div className="flex gap-4 items-end">
<Select
label="Visibility"
label="可见性"
options={[
{ value: 'public', label: 'Public' },
{ value: 'private', label: 'Private' },
{ value: 'friends', label: 'Friends' },
{ value: 'public', label: '公开' },
{ value: 'private', label: '私密' },
{ value: 'friends', label: '仅好友' },
]}
value={imgVisibility}
onChange={(e) => setImgVisibility(e.target.value)}
/>
<label className="flex items-center gap-2 pb-2 cursor-pointer">
<input type="checkbox" checked={imgOriginal} onChange={(e) => setImgOriginal(e.target.checked)} className="rounded" />
<span className="text-sm text-dark-muted">Original content</span>
<span className="text-sm text-dark-muted"></span>
</label>
</div>
<Button onClick={() => void handlePublishImage()} loading={imgLoading}>
Publish Image Note
</Button>
{imgResult !== null && <JsonViewer data={imgResult} />}
</div>
@@ -143,22 +143,22 @@ export function PublishPage() {
{tab === 'video' && (
<Card>
<div className="space-y-4">
<Input label="Title" value={vidTitle} onChange={(e) => setVidTitle(e.target.value)} placeholder="Note title" />
<Textarea label="Content" value={vidContent} onChange={(e) => setVidContent(e.target.value)} placeholder="Note body text" />
<Input label="Video Path" value={vidPath} onChange={(e) => setVidPath(e.target.value)} placeholder="/path/to/video.mp4" />
<Input label="Tags (comma separated)" value={vidTags} onChange={(e) => setVidTags(e.target.value)} placeholder="travel, vlog" />
<Input label="标题" value={vidTitle} onChange={(e) => setVidTitle(e.target.value)} placeholder="笔记标题" />
<Textarea label="正文" value={vidContent} onChange={(e) => setVidContent(e.target.value)} placeholder="笔记正文" />
<Input label="视频路径" value={vidPath} onChange={(e) => setVidPath(e.target.value)} placeholder="/path/to/video.mp4" />
<Input label="标签(逗号分隔)" value={vidTags} onChange={(e) => setVidTags(e.target.value)} placeholder="旅行, vlog" />
<Select
label="Visibility"
label="可见性"
options={[
{ value: 'public', label: 'Public' },
{ value: 'private', label: 'Private' },
{ value: 'friends', label: 'Friends' },
{ value: 'public', label: '公开' },
{ value: 'private', label: '私密' },
{ value: 'friends', label: '仅好友' },
]}
value={vidVisibility}
onChange={(e) => setVidVisibility(e.target.value)}
/>
<Button onClick={() => void handlePublishVideo()} loading={vidLoading}>
Publish Video Note
</Button>
{vidResult !== null && <JsonViewer data={vidResult} />}
</div>