This commit is contained in:
parent
e954802cb5
commit
2a6263ac65
|
|
@ -31,11 +31,4 @@ export default {
|
||||||
method: "get"
|
method: "get"
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
flashRole(params: any) {
|
|
||||||
return Request({
|
|
||||||
url: "/corp/flash/role",
|
|
||||||
method: "get",
|
|
||||||
params
|
|
||||||
})
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
@ -73,6 +73,7 @@ import {
|
||||||
ElCollapse, ElCollapseItem, ElIcon, ElMessage
|
ElCollapse, ElCollapseItem, ElIcon, ElMessage
|
||||||
} from 'element-plus'
|
} from 'element-plus'
|
||||||
import { translateApi } from 'src/api/common'
|
import { translateApi } from 'src/api/common'
|
||||||
|
import { translateRichText } from 'src/tools'
|
||||||
import UploadInput from './UploadInput.vue'
|
import UploadInput from './UploadInput.vue'
|
||||||
import WangEditor from 'lib/components/WangEditor.vue'
|
import WangEditor from 'lib/components/WangEditor.vue'
|
||||||
const props = withDefaults(defineProps<{
|
const props = withDefaults(defineProps<{
|
||||||
|
|
@ -103,6 +104,17 @@ function hasChinese(str: string): boolean {
|
||||||
return /[\u4e00-\u9fa5]/.test(str)
|
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 {
|
function parseTranslateResult(res: any): string {
|
||||||
return res?.data?.text ?? res?.data ?? res?.result ?? (typeof res === 'string' ? res : '')
|
return res?.data?.text ?? res?.data ?? res?.result ?? (typeof res === 'string' ? res : '')
|
||||||
}
|
}
|
||||||
|
|
@ -201,6 +213,10 @@ async function handleTranslateAll() {
|
||||||
const results = await Promise.allSettled(
|
const results = await Promise.allSettled(
|
||||||
batch.map(async ({ parent, key }) => {
|
batch.map(async ({ parent, key }) => {
|
||||||
const text = String(parent[key]).trim()
|
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' })
|
const res = await translateApi.translate({ text, from: 'ZH', to: 'EN' })
|
||||||
return { parent, key, translated: parseTranslateResult(res) }
|
return { parent, key, translated: parseTranslateResult(res) }
|
||||||
})
|
})
|
||||||
|
|
@ -234,8 +250,13 @@ async function handleTranslateField(parent: any, key: string | number, zhParent:
|
||||||
if (!hasChinese(zhText)) return
|
if (!hasChinese(zhText)) return
|
||||||
translatingPath.value = `${key}`
|
translatingPath.value = `${key}`
|
||||||
try {
|
try {
|
||||||
const res = await translateApi.translate({ text: zhText, from: 'ZH', to: 'EN' })
|
let translated: string
|
||||||
const translated = parseTranslateResult(res)
|
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
|
if (translated) parent[key] = translated
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Translate failed:', 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)
|
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: [
|
launchTask: [
|
||||||
async (self: any) => {
|
async (self: any) => {
|
||||||
if (self.bean) {
|
if (self.bean) {
|
||||||
const res = await self.api?.getResources()
|
const res = await self.api?.getResources({type: "page"})
|
||||||
self.bean.resources = res.data.items.map((item:any) => {
|
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' ? '页面' : '接口'
|
const type = item.type === 'page' ? '页面' : '接口'
|
||||||
return {
|
return {
|
||||||
key: item.id,
|
key: item.id,
|
||||||
|
|
@ -116,7 +117,12 @@ const data: TableData = {
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
subFun(self, data) {
|
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: [
|
addNods: [
|
||||||
(self: any) => {
|
(self: any) => {
|
||||||
return self.bean && <JsonFormDialog
|
return self.bean && self.bean.showJsonFormDialog && <JsonFormDialog
|
||||||
uploadFile={async (file: FormData) => {
|
uploadFile={async (file: FormData) => {
|
||||||
console.log('-------')
|
|
||||||
return await self.api?.upload(file)
|
return await self.api?.upload(file)
|
||||||
}}
|
}}
|
||||||
show={self.bean.showJsonFormDialog}
|
show={self.bean.showJsonFormDialog}
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ const data: TableData = {
|
||||||
{ key: 'page',name: '页面' },
|
{ key: 'page',name: '页面' },
|
||||||
{ key: 'api',name: 'API' },
|
{ key: 'api',name: 'API' },
|
||||||
],
|
],
|
||||||
|
must: true,
|
||||||
value: 'page'
|
value: 'page'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -64,6 +65,11 @@ const data: TableData = {
|
||||||
type: 'input',
|
type: 'input',
|
||||||
must: true
|
must: true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
key: 'method',
|
||||||
|
name: '方法',
|
||||||
|
type: 'input',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
subFun(self, data) {
|
subFun(self, data) {
|
||||||
return self.api?.addData(data)
|
return self.api?.addData(data)
|
||||||
|
|
@ -121,6 +127,7 @@ const data: TableData = {
|
||||||
key: 'type',
|
key: 'type',
|
||||||
name: '类型',
|
name: '类型',
|
||||||
type: 'select',
|
type: 'select',
|
||||||
|
must: true,
|
||||||
items: [
|
items: [
|
||||||
{ key: 'page',name: '页面' },
|
{ key: 'page',name: '页面' },
|
||||||
{ key: 'api',name: 'API' },
|
{ key: 'api',name: 'API' },
|
||||||
|
|
@ -133,6 +140,11 @@ const data: TableData = {
|
||||||
type: 'input',
|
type: 'input',
|
||||||
must: true
|
must: true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
key: 'method',
|
||||||
|
name: '方法',
|
||||||
|
type: 'input',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
subFun(self, data) {
|
subFun(self, data) {
|
||||||
return self.api?.updateData({...data, id: String(data.id)})
|
return self.api?.updateData({...data, id: String(data.id)})
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue