feat(i18n): 为评论系统添加国际化支持

- 在管理后台引入 vue-i18n 并添加多语言文件
- 为前端评论组件添加翻译功能,支持自动语言检测
- 在功能设置中新增管理后台和组件语言配置选项
- 更新 API 接口以支持语言设置存储
- 优化菜单项文本溢出显示样式
This commit is contained in:
anghunk
2026-02-10 14:26:38 +08:00
parent 860830cee2
commit 4d9e2d8d31
39 changed files with 6023 additions and 332 deletions

View File

@@ -37,13 +37,18 @@ export const updateFeatureSettings = async (c: Context<{ Bindings: Bindings }>)
const visibleDomains = Array.isArray(body.visibleDomains)
? (body.visibleDomains as string[])
: undefined;
const adminLanguage = typeof body.adminLanguage === 'string' ? body.adminLanguage : undefined;
const widgetLanguage = typeof body.widgetLanguage === 'string' ? body.widgetLanguage : undefined;
await saveFeatureSettings(c.env, {
enableCommentLike,
enableArticleLike,
enableImageLightbox,
commentPlaceholder,
visibleDomains
visibleDomains,
adminLanguage,
widgetLanguage
});
return c.json({ message: '保存成功!' });

View File

@@ -5,6 +5,8 @@ export const FEATURE_ARTICLE_LIKE_KEY = 'comment_feature_article_like';
export const FEATURE_IMAGE_LIGHTBOX_KEY = 'comment_feature_image_lightbox';
export const FEATURE_COMMENT_PLACEHOLDER_KEY = 'comment_feature_placeholder';
export const FEATURE_VISIBLE_DOMAINS_KEY = 'admin_visible_domains';
export const FEATURE_ADMIN_LANGUAGE_KEY = 'admin_language';
export const FEATURE_WIDGET_LANGUAGE_KEY = 'widget_language';
export type FeatureSettings = {
enableCommentLike: boolean;
@@ -12,6 +14,8 @@ export type FeatureSettings = {
enableImageLightbox: boolean;
commentPlaceholder?: string;
visibleDomains?: string[];
adminLanguage?: string;
widgetLanguage?: string;
};
export async function loadFeatureSettings(env: Bindings): Promise<FeatureSettings> {
@@ -24,10 +28,12 @@ export async function loadFeatureSettings(env: Bindings): Promise<FeatureSetting
FEATURE_ARTICLE_LIKE_KEY,
FEATURE_IMAGE_LIGHTBOX_KEY,
FEATURE_COMMENT_PLACEHOLDER_KEY,
FEATURE_VISIBLE_DOMAINS_KEY
FEATURE_VISIBLE_DOMAINS_KEY,
FEATURE_ADMIN_LANGUAGE_KEY,
FEATURE_WIDGET_LANGUAGE_KEY
];
const { results } = await env.CWD_DB.prepare(
'SELECT key, value FROM Settings WHERE key IN (?, ?, ?, ?, ?)'
'SELECT key, value FROM Settings WHERE key IN (?, ?, ?, ?, ?, ?, ?)'
)
.bind(...keys)
.all<{ key: string; value: string }>();
@@ -63,6 +69,8 @@ export async function loadFeatureSettings(env: Bindings): Promise<FeatureSetting
const enableImageLightbox = enableImageLightboxRaw === '1';
const commentPlaceholder = map.get(FEATURE_COMMENT_PLACEHOLDER_KEY);
const adminLanguage = map.get(FEATURE_ADMIN_LANGUAGE_KEY);
const widgetLanguage = map.get(FEATURE_WIDGET_LANGUAGE_KEY);
let visibleDomains: string[] | undefined;
const visibleDomainsRaw = map.get(FEATURE_VISIBLE_DOMAINS_KEY);
@@ -79,7 +87,9 @@ export async function loadFeatureSettings(env: Bindings): Promise<FeatureSetting
enableArticleLike,
enableImageLightbox,
commentPlaceholder,
visibleDomains
visibleDomains,
adminLanguage,
widgetLanguage
};
}
@@ -126,6 +136,14 @@ export async function saveFeatureSettings(
{
key: FEATURE_VISIBLE_DOMAINS_KEY,
value: settings.visibleDomains ? JSON.stringify(settings.visibleDomains) : undefined
},
{
key: FEATURE_ADMIN_LANGUAGE_KEY,
value: settings.adminLanguage
},
{
key: FEATURE_WIDGET_LANGUAGE_KEY,
value: settings.widgetLanguage
}
];