diff --git a/src/components/Practice/AddArticle.vue b/src/components/Practice/AddArticle.vue index a7ca1908..5a3b7b11 100644 --- a/src/components/Practice/AddArticle.vue +++ b/src/components/Practice/AddArticle.vue @@ -1,9 +1,9 @@ @@ -148,6 +1272,7 @@ function changeArticle() { 译文
翻译类型:
- + 本地翻译 网络翻译
-
- 开始翻译 +
+ 开始翻译 @@ -196,21 +1321,23 @@ function changeArticle() {
正文:
@@ -230,10 +1357,10 @@ function changeArticle() { />
取消 - 保存 + 保存
-
+
{{ sentence.translate }}
diff --git a/src/components/Practice/TypeArticle.vue b/src/components/Practice/TypeArticle.vue index 4ff6b4c2..895bd2fb 100644 --- a/src/components/Practice/TypeArticle.vue +++ b/src/components/Practice/TypeArticle.vue @@ -30,7 +30,7 @@ import {useBaseStore} from "@/stores/base"; import {usePracticeStore} from "@/components/Practice/usePracticeStore.ts"; import {useEventListener} from "@/hooks/useEvent.ts"; import TypeWord from "@/components/Practice/TypeWord.vue"; -import {localTranslate, networkTranslate} from "@/hooks/translate.ts"; +import {applyLocalTranslate, getNetworkTranslate} from "@/hooks/translate.ts"; import IconWrapper from "@/components/IconWrapper.vue"; import Tooltip from "@/components/Tooltip.vue"; import MiniModal from "@/components/MiniModal.vue"; @@ -126,7 +126,7 @@ onMounted(async () => { console.time() // await useNetworkTranslate(article, TranslateEngine.Baidu, true) - localTranslate(article, article.customTranslate) + applyLocalTranslate(article, article.customTranslate) console.timeEnd() // console.log(cloneDeep(article)) }) diff --git a/src/hooks/article.ts b/src/hooks/article.ts index 5103ddc5..c238cbc1 100644 --- a/src/hooks/article.ts +++ b/src/hooks/article.ts @@ -109,6 +109,10 @@ export function splitArticle(article: string, lang: string = 'en', keyboardMap: } }) if (addCurrent) { + //`“这是私人谈话”`这种没有结束符号的情况,swtich走不到结束符号,也就不会起新的一行 + if (word.name.length) { + sentence.words.push(word) + } sentence.words.push(cloneDeep({ ...DefaultArticleWord, name: v, @@ -132,7 +136,9 @@ export function splitArticle(article: string, lang: string = 'en', keyboardMap: break case '\n': - section.pop() + if (!sentence.words.length) { + section.pop() + } if (i !== arr.length - 1) { sections.push([]) section = sections[sections.length - 1] @@ -204,7 +210,6 @@ export function splitCNArticle(article: string, lang: string = 'en', keyboardMap word = cloneDeep(DefaultArticleWord) break case keyboardMap.QuoteLeft: - sentence.words.push(cloneDeep({ ...DefaultArticleWord, name: v, @@ -215,7 +220,7 @@ export function splitCNArticle(article: string, lang: string = 'en', keyboardMap word = cloneDeep(DefaultArticleWord) break case keyboardMap.QuoteRight: - let symbolPosition = null + let nearSymbolPosition = null let indexs = { a: -1, b: -1, @@ -225,17 +230,15 @@ export function splitCNArticle(article: string, lang: string = 'en', keyboardMap sections.toReversed().map((sectionItem, a) => { sectionItem.toReversed().map((sentenceItem, b) => { sentenceItem.words.toReversed().map((wordItem, c) => { - if (wordItem.symbolPosition !== '' && symbolPosition === null) { - symbolPosition = wordItem.symbolPosition === 'end' + if (wordItem.symbolPosition !== '' && nearSymbolPosition === null) { + nearSymbolPosition = wordItem.symbolPosition indexs = {a, b, c} } }) }) }) - if (symbolPosition || symbolPosition === null) { - - } else { + if (nearSymbolPosition === 'start' || nearSymbolPosition === null) { let addCurrent = false sentence.words.toReversed().map((wordItem, c) => { if (wordItem.symbolPosition === 'start' && !addCurrent) { @@ -243,6 +246,10 @@ export function splitCNArticle(article: string, lang: string = 'en', keyboardMap } }) if (addCurrent) { + //`“这是私人谈话”`这种没有结束符号的情况,swtich走不到结束符号,也就不会起新的一行 + if (word.name.length) { + sentence.words.push(word) + } sentence.words.push(cloneDeep({ ...DefaultArticleWord, name: v, @@ -263,10 +270,11 @@ export function splitCNArticle(article: string, lang: string = 'en', keyboardMap })) } } - break case '\n': - section.pop() + if (!sentence.words.length) { + section.pop() + } if (i !== arr.length - 1) { sections.push([]) section = sections[sections.length - 1] @@ -284,6 +292,8 @@ export function splitCNArticle(article: string, lang: string = 'en', keyboardMap break } }) + console.log(cloneDeep(sections)) + sections = sections.filter(sectionItem => sectionItem.length) sections.map((sectionItem, a) => { sectionItem.map((sentenceItem, b) => { sentenceItem.text = sentenceItem.words.reduce((previousValue: string, currentValue) => { diff --git a/src/hooks/translate.ts b/src/hooks/translate.ts index 987e5767..7ad7e506 100644 --- a/src/hooks/translate.ts +++ b/src/hooks/translate.ts @@ -1,13 +1,13 @@ import {Article, Sentence, TranslateEngine} from "@/types.ts"; import Baidu from "@opentranslate/baidu"; import {axiosInstance} from "@/utils/http.ts"; -import {CnKeyboardMap, splitCNArticle} from "@/hooks/article.ts"; +import {CnKeyboardMap, EnKeyboardMap, splitCNArticle} from "@/hooks/article.ts"; import {Translator} from "@opentranslate/translator/src/translator.ts"; -export function localTranslate(article: Article, translate: string) { +export function applyLocalTranslate(article: Article, translate: string) { if (translate.trim()) { let articleTranslate = splitCNArticle(translate, 'cn', CnKeyboardMap) - console.log('articleTranslate',articleTranslate) + // console.log('articleTranslate', articleTranslate) for (let i = 0; i < article.sections.length; i++) { let v = article.sections[i] @@ -15,8 +15,8 @@ export function localTranslate(article: Article, translate: string) { let sentence = v[j] try { sentence.translate = articleTranslate[i][j].text - }catch (e) { - console.log('没有对应的翻译',sentence.text) + } catch (e) { + // console.log('没有对应的翻译', sentence.text) } } } @@ -40,14 +40,14 @@ export function getCompleteTranslate(article: Article) { * @param allShow 是否翻译完所有之后才显示 * @param progressCb 进度回调 * */ -export async function networkTranslate( +export async function getNetworkTranslate( article: Article, translateEngine: TranslateEngine, allShow: boolean = false, progressCb?: (val: number) => void ) { if (article.networkTranslate) { - localTranslate(article, article.networkTranslate) + applyLocalTranslate(article, article.networkTranslate) } else { let translator: Translator if (translateEngine === TranslateEngine.Baidu) { @@ -77,7 +77,16 @@ export async function networkTranslate( let r = await translator.translate(sentence.text, 'en', 'zh-CN') if (r) { const cb = () => { - sentence.translate = r.trans.paragraphs[0] + //特殊情况 + // http://localhost:3000/baidu?from=en&to=zh&q=In+the+end,+&salt=1694621045527&appid=20230910001811857&sign=c4f0bf403fd34936c6bc4978b13ad31f + //百度翻译In the end,返回的结果没有逗号,导致少了一句,解析出错 + let str = r.trans.paragraphs[0] + if (sentence.words[sentence.words.length - 1].name === EnKeyboardMap.Comma) { + if (str[str.length - 1] !== ',') { + str += ',' + } + } + sentence.translate = str if (!allShow) { //一次显示所有,顺序会乱 article.networkTranslate += sentence.translate diff --git a/src/types.ts b/src/types.ts index ab72e416..9f0edfe6 100644 --- a/src/types.ts +++ b/src/types.ts @@ -122,6 +122,7 @@ export interface Article { newWords: Word[], articleAllWords: string[], sections: Sentence[][], + translateType: number } export interface Dict {