Add retranslate

This commit is contained in:
Kwaroran
2024-11-27 06:31:59 +09:00
parent 981ec3921e
commit 2b50abc09c
3 changed files with 52 additions and 28 deletions

View File

@@ -809,4 +809,5 @@ export const languageEnglish = {
summarizationPrompt: "Summarization Prompt", summarizationPrompt: "Summarization Prompt",
translatorPrompt: "Translation Prompt", translatorPrompt: "Translation Prompt",
translateBeforeHTMLFormatting: "Translate Before HTML Formatting", translateBeforeHTMLFormatting: "Translate Before HTML Formatting",
retranslate: "Retranslate",
} }

View File

@@ -12,7 +12,7 @@
import { type Unsubscriber } from "svelte/store"; import { type Unsubscriber } from "svelte/store";
import { isEqual } from "lodash"; import { isEqual } from "lodash";
import { sayTTS } from "src/ts/process/tts"; 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 { longpress } from "src/ts/gui/longtouch";
import { ColorSchemeTypeStore } from "src/ts/gui/colorscheme"; import { ColorSchemeTypeStore } from "src/ts/gui/colorscheme";
import { ConnectionOpenStore } from "src/ts/sync/multiuser"; import { ConnectionOpenStore } from "src/ts/sync/multiuser";
@@ -21,6 +21,7 @@
let translating = $state(false) let translating = $state(false)
let editMode = $state(false) let editMode = $state(false)
let statusMessage:string = $state('') let statusMessage:string = $state('')
let retranslate = false
interface Props { interface Props {
message?: string; message?: string;
name?: string; name?: string;
@@ -148,9 +149,13 @@
} }
} }
if(translateText){ 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 translating = true
data = await translateHTML(data, false, charArg, chatID) data = await translateHTML(data, false, charArg, chatID, doRetranslate)
translating = false translating = false
const marked = await ParseMarkdown(data, charArg, mode, chatID, getCbsCondition()) const marked = await ParseMarkdown(data, charArg, mode, chatID, getCbsCondition())
lastParsedQueue = marked lastParsedQueue = marked
@@ -160,7 +165,7 @@
else if(!DBState.db.legacyTranslation){ else if(!DBState.db.legacyTranslation){
const marked = await ParseMarkdown(data, charArg, 'pretranslate', chatID, getCbsCondition()) const marked = await ParseMarkdown(data, charArg, 'pretranslate', chatID, getCbsCondition())
translating = true 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 translating = false
lastParsedQueue = translated lastParsedQueue = translated
lastCharArg = charArg lastCharArg = charArg
@@ -169,7 +174,7 @@
else{ else{
const marked = await ParseMarkdown(data, charArg, mode, chatID, getCbsCondition()) const marked = await ParseMarkdown(data, charArg, mode, chatID, getCbsCondition())
translating = true translating = true
const translated = await translateHTML(marked, false, charArg, chatID) const translated = await translateHTML(marked, false, charArg, chatID, doRetranslate)
translating = false translating = false
lastParsedQueue = translated lastParsedQueue = translated
lastCharArg = charArg lastCharArg = charArg
@@ -228,9 +233,10 @@
{#snippet genInfo()} {#snippet genInfo()}
<div class="flex flex-col items-end">
{#if messageGenerationInfo && DBState.db.requestInfoInsideChat} {#if messageGenerationInfo && DBState.db.requestInfoInsideChat}
<div>
<button class="text-sm p-1 text-textcolor2 border-darkborderc float-end mr-2 my-2 <button class="text-sm p-1 text-textcolor2 border-darkborderc float-end mr-2 my-1
hover:ring-darkbutton hover:ring rounded-md hover:text-textcolor transition-all flex justify-center items-center" hover:ring-darkbutton hover:ring rounded-md hover:text-textcolor transition-all flex justify-center items-center"
onclick={() => { onclick={() => {
alertRequestData({ alertRequestData({
@@ -244,8 +250,23 @@
{capitalize(getModelInfo(messageGenerationInfo.model).shortName)} {capitalize(getModelInfo(messageGenerationInfo.model).shortName)}
</span> </span>
</button> </button>
</div>
{/if} {/if}
{#if DBState.db.translatorType === 'llm' && translated && !lastParsed.startsWith(`div class="flex justify-center items-center"><div class="animate-spin`)}
<button class="text-sm p-1 text-textcolor2 border-darkborderc float-end mr-2 my-1
hover:ring-darkbutton hover:ring rounded-md hover:text-textcolor transition-all flex justify-center items-center"
onclick={() => {
lastParsed = `<div class="flex justify-center items-center"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-textcolor"></div></div>`
retranslate = true
$ReloadGUIPointer = $ReloadGUIPointer + 1
}}
>
<RefreshCcwIcon size={20} />
<span class="ml-1">
{language.retranslate}
</span>
</button>
{/if}
</div>
{/snippet} {/snippet}
{#snippet textBox()} {#snippet textBox()}

View File

@@ -216,7 +216,7 @@ export function isExpTranslator(){
return db.translatorType === 'llm' || db.translatorType === 'deepl' || db.translatorType === 'deeplX' return db.translatorType === 'llm' || db.translatorType === 'deepl' || db.translatorType === 'deeplX'
} }
export async function translateHTML(html: string, reverse:boolean, charArg:simpleCharacterArgument|string = '', chatID:number): Promise<string> { export async function translateHTML(html: string, reverse:boolean, charArg:simpleCharacterArgument|string = '', chatID:number, regenerate = false): Promise<string> {
let alwaysExistChar: character | groupChat | simpleCharacterArgument; let alwaysExistChar: character | groupChat | simpleCharacterArgument;
if(charArg !== ''){ if(charArg !== ''){
if(typeof(charArg) === 'string'){ if(typeof(charArg) === 'string'){
@@ -245,7 +245,7 @@ export async function translateHTML(html: string, reverse:boolean, charArg:simpl
} }
if(db.translatorType === 'llm'){ if(db.translatorType === 'llm'){
const tr = db.translator || 'en' const tr = db.translator || 'en'
return translateLLM(html, {to: tr}) return translateLLM(html, {to: tr, regenerate})
} }
const dom = new DOMParser().parseFromString(html, 'text/html'); const dom = new DOMParser().parseFromString(html, 'text/html');
console.log(html) console.log(html)
@@ -447,11 +447,13 @@ function needSuperChunkedTranslate(){
return getDatabase().translatorType === 'deeplX' return getDatabase().translatorType === 'deeplX'
} }
async function translateLLM(text:string, arg:{to:string}):Promise<string>{ async function translateLLM(text:string, arg:{to:string, regenerate?:boolean}):Promise<string>{
if(!arg.regenerate){
const cacheMatch = await LLMCacheStorage.getItem(text) const cacheMatch = await LLMCacheStorage.getItem(text)
if(cacheMatch){ if(cacheMatch){
return cacheMatch as string return cacheMatch as string
} }
}
const styleDecodeRegex = /\<risu-style\>(.+?)\<\/risu-style\>/gms const styleDecodeRegex = /\<risu-style\>(.+?)\<\/risu-style\>/gms
let styleDecodes:string[] = [] let styleDecodes:string[] = []
text = text.replace(styleDecodeRegex, (match, p1) => { text = text.replace(styleDecodeRegex, (match, p1) => {