From 2a6263ac65cc1d35372e41c1aa7935042d1b7c69 Mon Sep 17 00:00:00 2001 From: zhangjianjun Date: Thu, 26 Mar 2026 17:14:21 +0800 Subject: [PATCH] ud --- api/login.ts | 7 ------- components/JsonFormDialog.vue | 25 +++++++++++++++++++++++-- tools.ts | 32 ++++++++++++++++++++++++++++++++ views/admin/role.tsx | 12 +++++++++--- views/config/list.tsx | 3 +-- views/config/source.tsx | 12 ++++++++++++ 6 files changed, 77 insertions(+), 14 deletions(-) diff --git a/api/login.ts b/api/login.ts index 4caf7dc..d1cc860 100644 --- a/api/login.ts +++ b/api/login.ts @@ -31,11 +31,4 @@ export default { method: "get" }) }, - flashRole(params: any) { - return Request({ - url: "/corp/flash/role", - method: "get", - params - }) - }, } \ No newline at end of file diff --git a/components/JsonFormDialog.vue b/components/JsonFormDialog.vue index e7a0b4a..c098202 100644 --- a/components/JsonFormDialog.vue +++ b/components/JsonFormDialog.vue @@ -73,6 +73,7 @@ import { ElCollapse, ElCollapseItem, ElIcon, ElMessage } from 'element-plus' import { translateApi } from 'src/api/common' +import { translateRichText } from 'src/tools' import UploadInput from './UploadInput.vue' import WangEditor from 'lib/components/WangEditor.vue' const props = withDefaults(defineProps<{ @@ -103,6 +104,17 @@ function hasChinese(str: string): boolean { return /[\u4e00-\u9fa5]/.test(str) } +function hasHtmlTag(str: string): boolean { + return /<\/[a-zA-Z][\w:-]*\s*>/i.test(str) +} + +async function translateTexts(texts: string[]): Promise { + const results = await Promise.allSettled( + texts.map(text => translateApi.translate({ text, from: 'ZH', to: 'EN' })) + ) + return results.map(r => r.status === 'fulfilled' ? parseTranslateResult(r.value) : '') +} + function parseTranslateResult(res: any): string { return res?.data?.text ?? res?.data ?? res?.result ?? (typeof res === 'string' ? res : '') } @@ -201,6 +213,10 @@ async function handleTranslateAll() { const results = await Promise.allSettled( batch.map(async ({ parent, key }) => { const text = String(parent[key]).trim() + if (hasHtmlTag(text)) { + const translated = await translateRichText(text, translateTexts) + return { parent, key, translated } + } const res = await translateApi.translate({ text, from: 'ZH', to: 'EN' }) return { parent, key, translated: parseTranslateResult(res) } }) @@ -234,8 +250,13 @@ async function handleTranslateField(parent: any, key: string | number, zhParent: if (!hasChinese(zhText)) return translatingPath.value = `${key}` try { - const res = await translateApi.translate({ text: zhText, from: 'ZH', to: 'EN' }) - const translated = parseTranslateResult(res) + let translated: string + if (hasHtmlTag(zhText)) { + translated = await translateRichText(zhText, translateTexts) + } else { + const res = await translateApi.translate({ text: zhText, from: 'ZH', to: 'EN' }) + translated = parseTranslateResult(res) + } if (translated) parent[key] = translated } catch (e) { console.error('Translate failed:', e) diff --git a/tools.ts b/tools.ts index 03534d0..a893244 100644 --- a/tools.ts +++ b/tools.ts @@ -58,3 +58,35 @@ export function updateFormData(form: Form, data: Array) { form.data.push(d) } } + + + +export async function translateRichText( + text: string, + translateApi: (texts: string[]) => Promise +): Promise { + if (!text) return text + + const placeholderPrefix = `__RICH_TRANSLATE_` + const textFragments: string[] = [] + + const placeholderHtml = text.replace( + />([^<]*[\u4e00-\u9fff][^<]*) { + const index = textFragments.length + textFragments.push(captured) + return `>${placeholderPrefix}${index}__<` + } + ) + + if (textFragments.length === 0) return text + + const translatedFragments = await translateApi(textFragments) + + let result = placeholderHtml + for (let i = 0; i < textFragments.length; i++) { + result = result.replace(`${placeholderPrefix}${i}__`, translatedFragments[i]) + } + + return result +} \ No newline at end of file diff --git a/views/admin/role.tsx b/views/admin/role.tsx index eb7d06a..856291c 100644 --- a/views/admin/role.tsx +++ b/views/admin/role.tsx @@ -11,8 +11,9 @@ const data: TableData = { launchTask: [ async (self: any) => { if (self.bean) { - const res = await self.api?.getResources() - self.bean.resources = res.data.items.map((item:any) => { + const res = await self.api?.getResources({type: "page"}) + const res2 = await self.api?.getResources({type: "api"}) + self.bean.resources = [...res.data.items, ...res2.data.items].map((item:any) => { const type = item.type === 'page' ? '页面' : '接口' return { key: item.id, @@ -116,7 +117,12 @@ const data: TableData = { }, ], subFun(self, data) { - return self.api?.updateData({...data, id: String(data.id)}) + const params = { + ...data, + id: String(data.id), + resource: data.resource.map((i:number) => String(i)) + } + return self.api?.updateData(params) } } }, diff --git a/views/config/list.tsx b/views/config/list.tsx index e7b7324..c363ebb 100644 --- a/views/config/list.tsx +++ b/views/config/list.tsx @@ -53,9 +53,8 @@ const data: TableData = { }, addNods: [ (self: any) => { - return self.bean && { - console.log('-------') return await self.api?.upload(file) }} show={self.bean.showJsonFormDialog} diff --git a/views/config/source.tsx b/views/config/source.tsx index 24ca70a..cc618d1 100644 --- a/views/config/source.tsx +++ b/views/config/source.tsx @@ -56,6 +56,7 @@ const data: TableData = { { key: 'page',name: '页面' }, { key: 'api',name: 'API' }, ], + must: true, value: 'page' }, { @@ -64,6 +65,11 @@ const data: TableData = { type: 'input', must: true }, + { + key: 'method', + name: '方法', + type: 'input', + }, ], subFun(self, data) { return self.api?.addData(data) @@ -121,6 +127,7 @@ const data: TableData = { key: 'type', name: '类型', type: 'select', + must: true, items: [ { key: 'page',name: '页面' }, { key: 'api',name: 'API' }, @@ -133,6 +140,11 @@ const data: TableData = { type: 'input', must: true }, + { + key: 'method', + name: '方法', + type: 'input', + }, ], subFun(self, data) { return self.api?.updateData({...data, id: String(data.id)})