From 2b50abc09cf5df8642e2ec64a81366f688229b7b Mon Sep 17 00:00:00 2001 From: Kwaroran Date: Wed, 27 Nov 2024 06:31:59 +0900 Subject: [PATCH] Add retranslate --- src/lang/en.ts | 1 + src/lib/ChatScreens/Chat.svelte | 65 ++++++++++++++++++++++----------- src/ts/translator/translator.ts | 14 ++++--- 3 files changed, 52 insertions(+), 28 deletions(-) diff --git a/src/lang/en.ts b/src/lang/en.ts index 452f46a0..9601d18c 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -809,4 +809,5 @@ export const languageEnglish = { summarizationPrompt: "Summarization Prompt", translatorPrompt: "Translation Prompt", translateBeforeHTMLFormatting: "Translate Before HTML Formatting", + retranslate: "Retranslate", } \ No newline at end of file diff --git a/src/lib/ChatScreens/Chat.svelte b/src/lib/ChatScreens/Chat.svelte index a4216761..6ed2da91 100644 --- a/src/lib/ChatScreens/Chat.svelte +++ b/src/lib/ChatScreens/Chat.svelte @@ -12,7 +12,7 @@ import { type Unsubscriber } from "svelte/store"; import { isEqual } from "lodash"; import { sayTTS } from "src/ts/process/tts"; - import { capitalize } from "src/ts/util"; + import { capitalize, sleep } from "src/ts/util"; import { longpress } from "src/ts/gui/longtouch"; import { ColorSchemeTypeStore } from "src/ts/gui/colorscheme"; import { ConnectionOpenStore } from "src/ts/sync/multiuser"; @@ -21,6 +21,7 @@ let translating = $state(false) let editMode = $state(false) let statusMessage:string = $state('') + let retranslate = false interface Props { message?: string; name?: string; @@ -148,9 +149,13 @@ } } if(translateText){ - if(DBState.db.translator === 'llm' && DBState.db.translateBeforeHTMLFormatting){ + let doRetranslate = retranslate + retranslate = false + console.log(`retranslating: ${doRetranslate}`) + if(DBState.db.translatorType === 'llm' && DBState.db.translateBeforeHTMLFormatting){ + await sleep(100) translating = true - data = await translateHTML(data, false, charArg, chatID) + data = await translateHTML(data, false, charArg, chatID, doRetranslate) translating = false const marked = await ParseMarkdown(data, charArg, mode, chatID, getCbsCondition()) lastParsedQueue = marked @@ -160,7 +165,7 @@ else if(!DBState.db.legacyTranslation){ const marked = await ParseMarkdown(data, charArg, 'pretranslate', chatID, getCbsCondition()) translating = true - const translated = await postTranslationParse(await translateHTML(marked, false, charArg, chatID)) + const translated = await postTranslationParse(await translateHTML(marked, false, charArg, chatID, doRetranslate)) translating = false lastParsedQueue = translated lastCharArg = charArg @@ -169,7 +174,7 @@ else{ const marked = await ParseMarkdown(data, charArg, mode, chatID, getCbsCondition()) translating = true - const translated = await translateHTML(marked, false, charArg, chatID) + const translated = await translateHTML(marked, false, charArg, chatID, doRetranslate) translating = false lastParsedQueue = translated lastCharArg = charArg @@ -228,24 +233,40 @@ {#snippet genInfo()} - {#if messageGenerationInfo && DBState.db.requestInfoInsideChat} -
- +
+ {#if messageGenerationInfo && DBState.db.requestInfoInsideChat} + + + {/if} + {#if DBState.db.translatorType === 'llm' && translated && !lastParsed.startsWith(`div class="flex justify-center items-center">
{ + lastParsed = `
` + retranslate = true + $ReloadGUIPointer = $ReloadGUIPointer + 1 + }} + > + + + {language.retranslate} + + + {/if}
- {/if} {/snippet} {#snippet textBox()} diff --git a/src/ts/translator/translator.ts b/src/ts/translator/translator.ts index 41c4de84..72e8a35d 100644 --- a/src/ts/translator/translator.ts +++ b/src/ts/translator/translator.ts @@ -216,7 +216,7 @@ export function isExpTranslator(){ return db.translatorType === 'llm' || db.translatorType === 'deepl' || db.translatorType === 'deeplX' } -export async function translateHTML(html: string, reverse:boolean, charArg:simpleCharacterArgument|string = '', chatID:number): Promise { +export async function translateHTML(html: string, reverse:boolean, charArg:simpleCharacterArgument|string = '', chatID:number, regenerate = false): Promise { let alwaysExistChar: character | groupChat | simpleCharacterArgument; if(charArg !== ''){ if(typeof(charArg) === 'string'){ @@ -245,7 +245,7 @@ export async function translateHTML(html: string, reverse:boolean, charArg:simpl } if(db.translatorType === 'llm'){ const tr = db.translator || 'en' - return translateLLM(html, {to: tr}) + return translateLLM(html, {to: tr, regenerate}) } const dom = new DOMParser().parseFromString(html, 'text/html'); console.log(html) @@ -447,10 +447,12 @@ function needSuperChunkedTranslate(){ return getDatabase().translatorType === 'deeplX' } -async function translateLLM(text:string, arg:{to:string}):Promise{ - const cacheMatch = await LLMCacheStorage.getItem(text) - if(cacheMatch){ - return cacheMatch as string +async function translateLLM(text:string, arg:{to:string, regenerate?:boolean}):Promise{ + if(!arg.regenerate){ + const cacheMatch = await LLMCacheStorage.getItem(text) + if(cacheMatch){ + return cacheMatch as string + } } const styleDecodeRegex = /\(.+?)\<\/risu-style\>/gms let styleDecodes:string[] = []