This commit is contained in:
parent
e954802cb5
commit
2a6263ac65
|
|
@ -31,11 +31,4 @@ export default {
|
|||
method: "get"
|
||||
})
|
||||
},
|
||||
flashRole(params: any) {
|
||||
return Request({
|
||||
url: "/corp/flash/role",
|
||||
method: "get",
|
||||
params
|
||||
})
|
||||
},
|
||||
}
|
||||
|
|
@ -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<string[]> {
|
||||
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)
|
||||
|
|
|
|||
32
tools.ts
32
tools.ts
|
|
@ -58,3 +58,35 @@ export function updateFormData(form: Form, data: Array<any>) {
|
|||
form.data.push(d)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
export async function translateRichText(
|
||||
text: string,
|
||||
translateApi: (texts: string[]) => Promise<string[]>
|
||||
): Promise<string> {
|
||||
if (!text) return text
|
||||
|
||||
const placeholderPrefix = `__RICH_TRANSLATE_`
|
||||
const textFragments: string[] = []
|
||||
|
||||
const placeholderHtml = text.replace(
|
||||
/>([^<]*[\u4e00-\u9fff][^<]*)</g,
|
||||
(match, captured: string) => {
|
||||
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
|
||||
}
|
||||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -53,9 +53,8 @@ const data: TableData = {
|
|||
},
|
||||
addNods: [
|
||||
(self: any) => {
|
||||
return self.bean && <JsonFormDialog
|
||||
return self.bean && self.bean.showJsonFormDialog && <JsonFormDialog
|
||||
uploadFile={async (file: FormData) => {
|
||||
console.log('-------')
|
||||
return await self.api?.upload(file)
|
||||
}}
|
||||
show={self.bean.showJsonFormDialog}
|
||||
|
|
|
|||
|
|
@ -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)})
|
||||
|
|
|
|||
Loading…
Reference in New Issue