diff --git a/src/lang/en.ts b/src/lang/en.ts index 0e1c7a42..af62cebc 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -161,6 +161,7 @@ export const languageEnglish = { , strictJsonSchema: "If enabled, it will strictly follow the Provided Schema for JSON on some models. if it is disabled, it may ignore the JSON Schema.", extractJson: "If it is not blank, it will extract specific JSON data from the response. for example, if you want to extract `response.text[0]` in response `{\"response\": {\"text\": [\"hello\"]}}`, you can put `response.text.0`.", + translatorNote: "Here, you can add a unique translation prompt for each character. This option only applies when using the Ax. model for translation. To apply it, include `{{slot::tnote}}` in the language settings. It doesn't work in group chats.", }, setup: { chooseProvider: "Choose AI Provider", @@ -741,4 +742,5 @@ export const languageEnglish = { leadingDoubleQuote: "Leading Double Quote", trailingSingleQuote: "Trailing Single Quote", trailingDoubleQuote: "Trailing Double Quote", + translatorNote: "Translator's Note", } \ No newline at end of file diff --git a/src/lang/ko.ts b/src/lang/ko.ts index 7ce33eee..6b279eae 100644 --- a/src/lang/ko.ts +++ b/src/lang/ko.ts @@ -95,7 +95,8 @@ export const languageKorean = { "emotionPrompt": "이 옵션은 감정을 감지하는 데 사용되는 프롬프트를 설정하는 데 사용됩니다. 비어 있으면 기본 프롬프트를 사용합니다.", "removePunctuationHypa": "활성화되면 HypaMemory를 실행하기 전에 구두점을 제거합니다.", "defaultVariables": "여기에서는 기본 변수를 정의할 수 있습니다. `<변수 이름>=<변수 값>` 형식으로 작성하고 개행으로 구분합니다. 예를 들어, `name=RisuAI`는 트리거 스크립트 및 변수 CBS와 함께 `{{getvar::A}}`, `{{setvar::A::B}}` 또는 `{{? $A + 1}}`과 같이 사용할 수 있습니다. 프롬프트 템플릿의 기본 변수와 캐릭터의 기본 변수가 동일한 이름을 가진 경우 캐릭터의 기본 변수가 사용됩니다.", - "combineTranslation": "활성화된 경우, 한 문장이지만 HTML 태그로 분리된 텍스트를 모두 합쳐서 번역한 후, 번역된 결과에 다시 디스플레이 수정 스크립트를 적용합니다.\n이를 통해 번역기가 올바른 번역을 하도록 도와줍니다.\n이 옵션을 활성화하고 UI가 이상해지면 옵션을 끄고 제보해 주세요." + "combineTranslation": "활성화된 경우, 한 문장이지만 HTML 태그로 분리된 텍스트를 모두 합쳐서 번역한 후, 번역된 결과에 다시 디스플레이 수정 스크립트를 적용합니다.\n이를 통해 번역기가 올바른 번역을 하도록 도와줍니다.\n이 옵션을 활성화하고 UI가 이상해지면 옵션을 끄고 제보해 주세요.", + "translatorNote": "여기에서 캐릭터마다 별도의 번역 프롬프트를 넣을 수 있습니다. 해당 옵션은 Ax. model 번역을 사용할 때만 적용됩니다. 언어 설정에서 `{{slot::tnote}}`를 넣으세요. 그룹챗에서는 작동하지 않습니다.", }, "setup": { "chooseProvider": "AI 제공자를 선택해 주세요", @@ -587,5 +588,6 @@ export const languageKorean = { "supaDesc": "수파메모리는 요약을 사용하는 장기기억 시스템입니다.", "hanuraiDesc": "하느라이메모리는 벡터 검색을 사용하는 장기기억 시스템입니다.", "v2Warning": "주의: V2 카드는 더 이상 지원되지 않습니다. 일부 데이터가 누락될 수 있습니다.", - + "translatorNote": "번역가의 노트", + } \ No newline at end of file diff --git a/src/lib/SideBars/CharConfig.svelte b/src/lib/SideBars/CharConfig.svelte index b9c744a4..e5b5fae9 100644 --- a/src/lib/SideBars/CharConfig.svelte +++ b/src/lib/SideBars/CharConfig.svelte @@ -921,6 +921,9 @@ {language.defaultVariables} + {language.translatorNote} + + {language.creator} diff --git a/src/ts/storage/database.ts b/src/ts/storage/database.ts index 550f69ef..24f1c364 100644 --- a/src/ts/storage/database.ts +++ b/src/ts/storage/database.ts @@ -901,6 +901,7 @@ export interface character{ lowLevelAccess?:boolean hideChatIcon?:boolean lastInteraction?:number + translatorNote?:string } diff --git a/src/ts/translator/translator.ts b/src/ts/translator/translator.ts index e7c99a2e..b0b13b20 100644 --- a/src/ts/translator/translator.ts +++ b/src/ts/translator/translator.ts @@ -456,14 +456,23 @@ async function translateLLM(text:string, arg:{to:string}){ }) const db = get(DataBase) + const charIndex = get(selectedCharID) + const currentChar = db.characters[charIndex] + let translatorNote + if (currentChar.type === "character") { + translatorNote = currentChar.translatorNote ?? "" + } else { + translatorNote = "" + } + let formated:OpenAIChat[] = [] let prompt = db.translatorPrompt || `You are a translator. translate the following html or text into {{slot}}. do not output anything other than the translation.` - let parsedPrompt = parseChatML(prompt.replaceAll('{{slot}}', arg.to).replaceAll('{{solt::content}}', text)) + let parsedPrompt = parseChatML(prompt.replaceAll('{{slot}}', arg.to).replaceAll('{{solt::content}}', text).replaceAll('{{slot::tnote}}', translatorNote)) if(parsedPrompt){ formated = parsedPrompt } else{ - prompt = prompt.replaceAll('{{slot}}', arg.to) + prompt = prompt.replaceAll('{{slot}}', arg.to).replaceAll('{{slot::tnote}}', translatorNote) formated = [ { 'role': 'system',