SillyTarvanでChat Translationを使うとアスタリスクが壊れる問題を回避

※要は自分向けの備忘です
確認済みはLibreTranslate、Google、DeepL API、DeepLX

表題の通り、*が全角になったり※になったり消えてしまったりしてもうひたすらにストレスが溜まる問題を回避しましょう。

ソースぶん投げてChatGPT o4にお願いしたら作ってくれたのを少し手直し。
プレースホルダーに置換して戻すだけです。

SillyTavern\public\scripts\extensions\translate\index.js

/**
 * Common translation function that handles the translation logic
 * @param {string} text Text to translate
 * @param {string} lang Target language code
 * @param {string} provider Translation provider to use
 * @returns {Promise<string>} Translated text
 */
async function translateInner(text, lang, provider) {
    if (text == '') {
        return '';
    }
    if (!provider) {
        provider = extension_settings.translate.provider;
    }

    text = preprocess(text);

    let translatedText;  

    switch (provider) {
        case 'libre':
            translatedText = await translateProviderLibre(text, lang);
            break;
        case 'google':
            translatedText = await chunkedTranslate(text, lang, translateProviderGoogle, 5000);
            break;
        case 'lingva':
            translatedText = await chunkedTranslate(text, lang, translateProviderLingva, 5000);
            break;
        case 'deepl':
            translatedText = await translateProviderDeepl(text, lang);
            break;
        case 'deeplx':
            translatedText = await chunkedTranslate(text, lang, translateProviderDeepLX, 500);
            break;
        case 'oneringtranslator':
            translatedText = await translateProviderOneRing(text, lang);
            break;
        case 'bing':
            translatedText = await chunkedTranslate(text, lang, translateProviderBing, 1000);
            break;
        case 'yandex':
            translatedText = await translateProviderYandex(text, lang);
            break;
        default:
            console.error('Unknown translation provider', provider);
            translatedText = text;  
    }

    return postprocess(translatedText);
}

function preprocess(text) {
    text = text.replace(/\*/g, ' <m id = 0 /> ');
    return text;
}

function postprocess(text) {
    text = text.replace(/ *<m id *= *0 *\/> */g, '*');
    return text;
}

技術的には翻訳前にhtmlタグっぽいのを*の代わりに書いておいて復元するだけ。
* → ' <m id = 0 /> ' → *
ID増やせばなんでも変換できる

前後の空白は入れておかないとDeepLが文章中にタグを移動しちゃうので回避用。
GoogleもLibreTranslateもタグ中にスペースを入れ込むのでそれも回避。※実際に*が本文にぶち込まれたら変になるかもだけどそこは呑みこもう。

ちゃんとプレースホルダー用の項目追加するとかの改良をして本体にpushするのは面倒くさいのでナシです。やってくれる神が居たら崇めます。

Unknown translation providerの時に置換した文字が戻ってしまうのは現状仕様です。ChatGPTに指摘するのも面倒くさいしそうそう起きないから敢えてそのまま。

#SillyTarvan #AIチャット #AI彼女

いいなと思ったら応援しよう!