diff --git a/public/index.html b/public/index.html index 46942e6d9..a4d645bf0 100644 --- a/public/index.html +++ b/public/index.html @@ -1762,6 +1762,19 @@ Use the appropriate tokenizer for Google models via their API. Slower prompt processing, but offers much more accurate token counting. +
+ +
+ + Merges all system messages up until the first message with a non system role, and sends them through google's system_instruction field instead of with the rest of the prompt contents. + +
+
Assistant Prefill @@ -2248,7 +2261,7 @@
- +

@@ -5843,7 +5856,7 @@
- +
diff --git a/public/locales/ru-ru.json b/public/locales/ru-ru.json index d03ff14e7..530108758 100644 --- a/public/locales/ru-ru.json +++ b/public/locales/ru-ru.json @@ -1,31 +1,31 @@ { - "clickslidertips": "Щелкните на цифру ползунка, чтобы вписать вручную.", - "kobldpresets": "Предустановки Kobold", - "guikoboldaisettings": "Интерфейс KoboldAI", - "novelaipreserts": "Предустановки NovelAI", + "clickslidertips": "Кликайте по цифрам под ползунками, чтобы менять их вручную.", + "kobldpresets": "Пресеты для Kobold", + "guikoboldaisettings": "Настройки из интерфейса KoboldAI", + "novelaipreserts": "Пресеты для NovelAI", "default": "По умолчанию", - "openaipresets": "Предустановки OpenAI", - "text gen webio(ooba) presets": "Предустановки WebUI(ooba)", - "response legth(tokens)": "Длина ответа (в токенах)", + "openaipresets": "Пресеты для OpenAI", + "text gen webio(ooba) presets": "Пресеты для WebUI(ooba)", + "response legth(tokens)": "Ответ (в токенах)", "select": "Выбрать", - "context size(tokens)": "Размер контекста (в токенах)", + "context size(tokens)": "Контекст (в токенах)", "unlocked": "Неограниченный", "Only select models support context sizes greater than 4096 tokens. Increase only if you know what you're doing.": "Только отдельные модели поддерживают контекст, превышающий 4096 токенов. Используйте только если понимаете, что делаете.", - "rep.pen": "Штраф за повторение", - "WI Entry Status:🔵 Constant🟢 Normal❌ Disabled": "Статус входа WI:\n 🔵 Константа\n 🟢 Cтандартный\n ❌ Отключен", - "rep.pen range": "Диапазон штрафов за повтор.", - "Temperature controls the randomness in token selection": "Temperature контролирует случайность выбора токенов:\n- низкая Temperature (<1.0) приводит к более предсказуемому тексту, отдавая предпочтение токенам с высокой вероятностью.\n- высокая Temperature (>1.0) повышает креативность и разнообразие вывода, давая токенам с низкой вероятностью больше шансов.\nУстановите значение 1.0 для исходных вероятностей.", - "temperature": "Temperature", - "Top K sets a maximum amount of top tokens that can be chosen from": "Top K задает максимальное количество токенов, которые могут быть выбраны.\nЕсли Top-K равен 20, это означает, что будут сохранены только 20 токенов с наивысшим рейтингом (независимо от того, что их вероятности разнообразны или ограничены)\nУстановите значение 0, чтобы отключить.", - "Top P (a.k.a. nucleus sampling)": "Top P (также известная как выборка ядра) складывает все верхние токены, необходимые для достижения целевого процента.\nТо есть, если 2 верхних токена составляют 25%, а Top-P равен 0.50, учитываются только эти 2 верхних токена.\nУстановите значение 1.0, чтобы отключить.", + "rep.pen": "Штраф за повтор", + "WI Entry Status:🔵 Constant🟢 Normal❌ Disabled": "Статус записи:\n 🔵 Постоянная\n 🟢 Обычная\n ❌ Отключена", + "rep.pen range": "Окно для штрафов за повтор", + "Temperature controls the randomness in token selection": "Температура контролирует процесс выбора токена:\n- при низкой температуре (<1.0) предпочтение отдаётся наиболее вероятным токенам, текст получается предсказуемым.\n- при высокой температуре (>1.0) повышаются шансы у токенов с низкой вероятностью, текст получается более креативным.\nУстановите значение 1.0, чтобы вероятности не менялись.", + "temperature": "Температура", + "Top K sets a maximum amount of top tokens that can be chosen from": "Top K задает жёсткое ограничение на количество рассматриваемых токенов.\nЕсли Top-K равен 20, это означает, что будут сохранены только 20 наиболее вероятных токенов (распределение их вероятностей в расчёт не берётся)\nУстановите значение 0, чтобы отключить.", + "Top P (a.k.a. nucleus sampling)": "Top P (он же nucleus sampling) складывает все верхние токены, пока их суммарные вероятности не достигнут целевого процента.\nТо есть, если 2 верхних токена составляют 25%, а Top-P равен 0.50, учитываются только эти 2 верхних токена.\nУстановите значение 1.0, чтобы отключить.", "Typical P Sampling prioritizes tokens based on their deviation from the average entropy of the set": "Сэмплер Typical P определяет приоритет токенов на основе их отклонения от средней энтропии набора.\nОстаются токены, чья кумулятивная вероятность близка к заданному порогу (например, 0,5), выделяя те, которые имеют среднее информационное содержание.\nУстановите значение 1.0, чтобы отключить.", "Min P sets a base minimum probability": "Min P устанавливает базовую минимальную вероятность. Она масштабируется в зависимости от вероятности верхнего токена.\nЕсли вероятность верхнего токена составляет 80%, а Min P - 0.1, будут рассматриваться только токены с вероятностью выше 8%.\nУстановите значение 0, чтобы отключить.", "Top A sets a threshold for token selection based on the square of the highest token probability": "Top A устанавливает порог для отбора токенов на основе квадрата наибольшей вероятности токена.\nЕсли значение Top A равно 0.2, а вероятность верхнего токена равна 50%, то токены с вероятностью ниже 5% (0.2 * 0.5^2) будут исключены.\nУстановите значение 0, чтобы отключить.", "Tail-Free Sampling (TFS)": "Tail-Free Sampling (TFS) ищет хвост маловероятных токнов в распределении,\n анализируя скорость изменения вероятностей токенов с помощью производных. Он сохраняет токены до порога (например, 0.3), основанного на нормированной второй производной.\nЧем ближе к 0, тем больше отброшенных токенов. Установите значение 1.0, чтобы отключить.", "Epsilon cutoff sets a probability floor below which tokens are excluded from being sampled": "Epsilon cutoff устанавливает уровень вероятности, ниже которого токены исключаются из выборки.\nВ единицах 1e-4; разумное значение - 3.\nУстановите 0, чтобы отключить.", "Scale Temperature dynamically per token, based on the variation of probabilities": "Динамическое масштабирование Temperature для каждого токена, основанное на изменении вероятностей.", - "Minimum Temp": "Минимальная Temp", - "Maximum Temp": "Максимальная Temp", + "Minimum Temp": "Мин. температура", + "Maximum Temp": "Макс. температура", "Exponent": "Экспонента", "Mirostat Mode": "Режим", "Mirostat Tau": "Tau", @@ -35,35 +35,35 @@ "Strength of the Contrastive Search regularization term. Set to 0 to disable CS": "Сила условия регуляризации контрастивного поиска. Установите значение 0, чтобы отключить CS.", "Temperature Last": "Temperature Last", "Use the temperature sampler last": "Использовать Temperature сэмплер в последнюю очередь. Это почти всегда разумно.\nПри включении: сначала выборка набора правдоподобных токенов, затем применение Temperature для корректировки их относительных вероятностей (технически, логитов).\nПри отключении: сначала применение Temperature для корректировки относительных вероятностей ВСЕХ токенов, затем выборка правдоподобных токенов из этого.\nОтключение Temperature Last увеличивает вероятности в хвосте распределения, что увеличивает шансы получить несогласованный ответ.", - "LLaMA / Mistral / Yi models only": "Только для моделей LLaMA / Mistral / Yi. Убедитесь, что сначала выбрали подходящий токенизатор.\nПоследовательности, которые вы не хотите видеть в выходных данных.\nОдна на строку. Текст или [идентификаторы токенов].\nМногие токены имеют пробел впереди. Используйте счетчик токенов, если не уверены.", + "LLaMA / Mistral / Yi models only": "Только для моделей LLaMA / Mistral / Yi. Перед этим обязательно выберите подходящий токенизатор.\nПоследовательности, которых не должно быть на выходе.\nОдна на строку. Текст или [идентификаторы токенов].\nМногие токены имеют пробел впереди. Используйте счетчик токенов, если не уверены.", "Example: some text [42, 69, 1337]": "Пример:\nкакой-то текст\n[42, 69, 1337]", - "Classifier Free Guidance. More helpful tip coming soon": "Руководство без классификатора. Больше полезных советов в ближайшее время.", + "Classifier Free Guidance. More helpful tip coming soon": "Classifier Free Guidance. Чуть позже опишем более подробно", "Scale": "Масштаб", "GBNF Grammar": "Грамматика GBNF", "Usage Stats": "Статистика исп.", "Click for stats!": "Нажмите для получения статистики!", - "Backup": "Резер. копирование", - "Backup your personas to a file": "Резервное копирование персон в файл", + "Backup": "Бэкап", + "Backup your personas to a file": "Создать бэкап (резервную копию) персоны в виде файла", "Restore": "Восстановить", "Restore your personas from a file": "Восстановление персон из файла", "Type in the desired custom grammar": "Введите нужную пользовательскую грамматику", - "Encoder Rep. Pen.": "Штраф за кодирование", + "Encoder Rep. Pen.": "Штраф за повтор для кодировщика", "Smoothing Factor": "Коэффициент сглаживания", - "No Repeat Ngram Size": "Нет повторов размера Ngram", - "Min Length": "Минимальная длина", + "No Repeat Ngram Size": "Размер no_repeat_ngram", + "Min Length": "Мин. длина", "OpenAI Reverse Proxy": "Прокси с OpenAI", "Alternative server URL (leave empty to use the default value).": "Альтернативный URL сервера (оставьте пустым для стандартного значения)", - "Remove your real OAI API Key from the API panel BEFORE typing anything into this box": "Удалите свой личный OAI API Key из панели API прежде, чем вносить сюда ЧТО УГОДНО", + "Remove your real OAI API Key from the API panel BEFORE typing anything into this box": "Удалите свой личный OAI API Key из панели API, и ТОЛЬКО ПОСЛЕ ЭТОГО вводите что-то сюда", "We cannot provide support for problems encountered while using an unofficial OpenAI proxy": "Мы не сможем предоставить помощь с проблемами, с которыми вы столкнетесь при использовании неофициальных прокси для OpenAI", - "Legacy Streaming Processing": "Старый способ потокового вывода текста", - "Enable this if the streaming doesn't work with your proxy": "Включите это, если потоковый вывод текста не работает с вашим прокси", + "Legacy Streaming Processing": "Старый способ стриминга", + "Enable this if the streaming doesn't work with your proxy": "Если на вашей прокси не работает стриминг, попробуйте включить эту опцию", "Context Size (tokens)": "Размер контекста (в токенах)", - "Max Response Length (tokens)": "Максимальная длина ответа (в токенах)", - "Temperature": "Temperature", + "Max Response Length (tokens)": "Макс. длина ответа (в токенах)", + "Temperature": "Температура", "Frequency Penalty": "Штраф за частоту", "Presence Penalty": "Штраф за присутствие", "Top-p": "Top P", - "Display bot response text chunks as they are generated": "Отображать ответ ИИ по мере генерации текста", + "Display bot response text chunks as they are generated": "Отображать ответ ИИ отрывками по мере генерации текста", "Top A": "Top А", "Typical Sampling": "Typical Sampling", "Tail Free Sampling": "Tail Free Sampling", @@ -72,10 +72,10 @@ "Top K": "Top K", "Top P": "Top P", "Do Sample": "Сделать образец", - "Add BOS Token": "Добавить BOS-токен", - "Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative": "Добавлять BOS-токен в начале инструкции. Выключение этого может сделать ответы более креативными. ", - "Ban EOS Token": "Заблокировать EOS-токен", - "Ban the eos_token. This forces the model to never end the generation prematurely": "Блокировка EOS-токена вынудит модель никогда не завершать генерацию преждевременно", + "Add BOS Token": "Добавлять BOS-токен", + "Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative": "Добавлять BOS-токен в начале промпта. Если выключить, ответы могут стать более креативными.", + "Ban EOS Token": "Запретить EOS-токен", + "Ban the eos_token. This forces the model to never end the generation prematurely": "Запрет EOS-токена не позволит модели завершить генерацию преждевременно", "Skip Special Tokens": "Пропускать специальные токены", "Beam search": "Поиск Beam", "Number of Beams": "Количество Beam", @@ -86,15 +86,15 @@ "Seed": "Зерно", "Epsilon Cutoff": "Epsilon Cutoff", "Eta Cutoff": "Eta Cutoff", - "Negative Prompt": "Отрицательная подсказка", - "Mirostat (mode=1 is only for llama.cpp)": "Mirostat", - "Mirostat is a thermostat for output perplexity": "Mirostat - это термостат для недоумения на выходе.\nMirostat подгоняет недоумение на выходе к недоумению на входе, что позволяет избежать ловушки повторения.\n(когда по мере того, как авторегрессионный вывод производит текст, недоумение на выходе стремится к нулю)\n и ловушки путаницы (когда недоумение расходится)\nДля подробностей смотрите статью Mirostat: A Neural Text Decoding Algorithm that Directly Controls Perplexity by Basu et al. (2020).\nРежим выбирает версию Mirostat. 0=отключить, 1=Mirostat 1.0 (только llama.cpp), 2=Mirostat 2.0.", - "Add text here that would make the AI generate things you don't want in your outputs.": "Добавьте сюда текст, который заставит ИИ генерировать то, что вы не хотите видеть в своих выводах", - "Phrase Repetition Penalty": "Штраф за повторение фразы", + "Negative Prompt": "Отрицательный промпт", + "Mirostat (mode=1 is only for llama.cpp)": "Mirostat (режим=1 предназначен только для llama.cpp)", + "Mirostat is a thermostat for output perplexity": "Mirostat - своего рода термометр, измеряющий перплексию для выводимого текста.\nMirostat подгоняет перплексию генерируемого текста к перплексии входного текста, что позволяет избежать повторов.\n(когда по мере генерации текста авторегрессионным инференсом, перплексия всё больше приближается к нулю)\n а также ловушки перплексии (когда перплексия начинает уходить в сторону)\nБолее подробное описание в статье Mirostat: A Neural Text Decoding Algorithm that Directly Controls Perplexity by Basu et al. (2020).\nРежим выбирает версию Mirostat. 0=отключить, 1=Mirostat 1.0 (только llama.cpp), 2=Mirostat 2.0.", + "Add text here that would make the AI generate things you don't want in your outputs.": "Добавьте сюда текст, который заставит ИИ генерировать то, что вы не хотите видеть в его текстах", + "Phrase Repetition Penalty": "Штраф за повтор фразы", "Preamble": "Преамбула", - "Use style tags to modify the writing style of the output.": "Используйте теги стиля, чтобы изменить стиль написания вывода.", + "Use style tags to modify the writing style of the output.": "Используйте теги стиля, чтобы изменить стиль написания выходного текста.", "Banned Tokens": "Запрещенные токены", - "Sequences you don't want to appear in the output. One per line.": "Последовательности, которые вы не хотите отображать в выводе. По одному на строку.", + "Sequences you don't want to appear in the output. One per line.": "Строки, которых не должно быть в выходном тексте. По одной на строчку.", "AI Module": "Модуль ИИ", "Changes the style of the generated text.": "Изменяет стиль создаваемого текста.", "Used if CFG Scale is unset globally, per chat or character": "Используется, если масштаб CFG не установлен глобально, для каждого чата или персонажа.", @@ -104,42 +104,42 @@ "Tell the AI that NSFW is allowed.": "Сообщает AI, что ему позволено генерировать NSFW.", "NSFW Prioritized": "Предпочитать NSFW", "NSFW prompt text goes first in the prompt to emphasize its effect.": "Отправлять NSFW-инструкцию в начале для усиления его эффекта", - "Streaming": "Потоковый вывод текста", - "Dynamic Temperature": "Динамическая Temperature", - "Restore current preset": "Восстановить текущую предустановку", + "Streaming": "Стриминг текста", + "Dynamic Temperature": "Динамическая температура", + "Restore current preset": "Восстановить текущий пресет", "Neutralize Samplers": "Нейтрализовать сэмплеры", - "Text Completion presets": "Предустановки Text Completion", + "Text Completion presets": "Пресеты для Text Completion", "Documentation on sampling parameters": "Документация по параметрам сэмплеров", "Set all samplers to their neutral/disabled state.": "Установить все сэмплеры в нейтральное/отключенное состояние.", - "Only enable this if your model supports context sizes greater than 4096 tokens": "Включите эту опцию, только если ваша модель поддерживает размер контекста более 4096 токенов.\nУвеличивайте только если вы знаете, что делаете.", - "Display the response bit by bit as it is generated": "Отображение ответа бит за битом по мере его генерации.\nКогда этот параметр выключен, ответы будут отображаться все сразу после их завершения.", - "Generate only one line per request (KoboldAI only, ignored by KoboldCpp).": "Генерируйте только одну строку для каждого запроса (только KoboldAI, игнорируется KoboldCpp).", - "Ban the End-of-Sequence (EOS) token (with KoboldCpp, and possibly also other tokens with KoboldAI).": "Запретите токен конца последовательности (EOS) (с помощью KoboldCpp и, возможно, также других токенов с помощью KoboldAI).", - "Good for story writing, but should not be used for chat and instruct mode.": "Подходит для написания историй, но не должен использоваться в режиме чата и инструктирования.", - "Enhance Definitions": "Улучшенная узнаваемость", - "Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "Позволяет использовать базу знаний, улучшающую узнаваемость ИИ публичных лиц и вымышленных персонажей", + "Only enable this if your model supports context sizes greater than 4096 tokens": "Включайте эту опцию, только если ваша модель поддерживает размер контекста более 4096 токенов.\nУвеличивайте только если вы знаете, что делаете.", + "Display the response bit by bit as it is generated": "Выводить текст последовательно по мере его генерации.\nЕсли параметр выключен, ответы будут отображаться сразу целиком, и только после полного завершения генерации.", + "Generate only one line per request (KoboldAI only, ignored by KoboldCpp).": "Генерировать только одну строку на каждый запрос (только для KoboldAI, игнорируется KoboldCpp).", + "Ban the End-of-Sequence (EOS) token (with KoboldCpp, and possibly also other tokens with KoboldAI).": "Запретить токен конца последовательности (EOS) (актуально для KoboldCpp, но KoboldAI может запрещать ещё и другие токены).", + "Good for story writing, but should not be used for chat and instruct mode.": "Подходит для написания историй, но не должен использоваться в режиме Chat и Instruct.", + "Enhance Definitions": "Улучшить описания", + "Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "Позволяет использовать базу знаний OAI, улучшающую описания для публичных лиц и известных вымышленных персонажей", "Wrap in Quotes": "Заключать в кавычки", - "Wrap entire user message in quotes before sending.": "Заключить всё сообщение пользователя в кавычки перед отправкой.", + "Wrap entire user message in quotes before sending.": "Перед отправкой заключать всё сообщение пользователя в кавычки.", "Leave off if you use quotes manually for speech.": "Оставьте выключенным, если вручную выставляете кавычки для прямой речи.", - "Main prompt": "Основная инструкция", - "The main prompt used to set the model behavior": "Основная инструкция, используемая для установки поведения модели", - "NSFW prompt": "NSFW-инструкция", - "Prompt that is used when the NSFW toggle is on": "Инструкция, отправляемая ИИ при включенном поощрении NSFW.", - "Jailbreak prompt": "Инструкция для JailBreak", - "Prompt that is used when the Jailbreak toggle is on": "Инструкция, отправляемая ИИ при включенном JailBreak.", - "Impersonation prompt": "Инструкция для перевоплощения", - "Prompt that is used for Impersonation function": "Инструкция, отправляемая ИИ для генерации действий за пользователя", - "Logit Bias": "Ошибка логита", - "Helps to ban or reenforce the usage of certain words": "Позволяет запретить или поощрять использование определенных слов", - "View / Edit bias preset": "Посмотреть/Настроить предустановку для bias", - "Add bias entry": "Добавить инструкцию в Bias", - "Jailbreak activation message": "Сообщение об активации JailBreak", - "Message to send when auto-jailbreak is on.": "Сообщение, отправляемое когда автоматический JailBreak включен.", + "Main prompt": "Основной промпт", + "The main prompt used to set the model behavior": "Основной промпт, задающий поведение модели", + "NSFW prompt": "NSFW-промпт", + "Prompt that is used when the NSFW toggle is on": "Промпт, применяемый при включенном поощрении NSFW.", + "Jailbreak prompt": "Джейлбрейк-промпт", + "Prompt that is used when the Jailbreak toggle is on": "Промпт, применяемый при включенном джейлбрейке.", + "Impersonation prompt": "Промпт для перевоплощения", + "Prompt that is used for Impersonation function": "Промпт, применяемый при генерации действий за пользователя", + "Logit Bias": "Смещение логитов", + "Helps to ban or reenforce the usage of certain words": "Запрещает или поощряет использование определенных слов", + "View / Edit bias preset": "Просмотр / Редактирование пресета смещения", + "Add bias entry": "Добавить правило смещения", + "Jailbreak activation message": "Сообщение об активации джейлбрейка", + "Message to send when auto-jailbreak is on.": "Сообщение, отправляемое когда автоматический джейлбрейк включен.", "Jailbreak confirmation reply": "Подтверждение JailBreak", "Bot must send this back to confirm jailbreak": "Это сообщение будет отправлено ИИ при успешном включении JailBreak.", "Character Note": "Заметки о персонаже", "Influences bot behavior in its responses": "Влияет на поведение ИИ и его ответы.", - "Connect": "Подключить", + "Connect": "Подключиться", "Test Message": "Тестовое сообщение", "API": "API", "KoboldAI": "KoboldAI", @@ -153,7 +153,7 @@ "API key": "API-ключ", "Tabby API key": "Tabby API-ключ", "Get it here:": "Получить здесь:", - "Register": "Регистрация", + "Register": "Зарегистрироваться", "TogetherAI Model": "Модель TogetherAI", "Example: 127.0.0.1:5001": "Пример: http://127.0.0.1:5001", "ggerganov/llama.cpp": "ggerganov/llama.cpp (сервер вывода)", @@ -164,18 +164,18 @@ "TogetherAI API Key": "TogetherAI API-ключ", "-- Connect to the API --": "-- Подключитесь к API --", "View my Kudos": "Посмотреть мой рейтинг(Kudos)", - "Enter": "Вставьте", + "Enter": "Введите", "to use anonymous mode.": "чтобы использовать анонимный режим.", "For privacy reasons": "В целях конфиденциальности API-ключ будет скрыт после перезагрузки страницы", "Models": "Модели", - "Hold Control / Command key to select multiple models.": "Удерживайте Control / Command для выбора нескольких моделей.", + "Hold Control / Command key to select multiple models.": "Удерживайте клавишу Control / Command для выбора нескольких моделей.", "Horde models not loaded": "Модели Horde не загружены", - "Not connected...": "Не подключено...", + "Not connected...": "Нет подключения...", "Novel API key": "API-ключ для NovelAI", "Follow": "Следуйте", "these directions": "данным инструкциям", "to get your NovelAI API key.": "чтобы получить свой API-ключ от NovelAI", - "Enter it in the box below": "Введите это в окошко ниже", + "Enter it in the box below": "Введите его в окошко ниже", "Novel AI Model": "Модель NovelAI", "If you are using:": "Если вы используете:", "oobabooga/text-generation-webui": "", @@ -189,34 +189,34 @@ "Use API key (Only required for Mancer)": "Нажмите на ячейку (и добавьте свой API ключ!):", "Blocking API url": "Блокирующий API url", "Example: 127.0.0.1:5000": "Пример: http://127.0.0.1:5000", - "Legacy API (pre-OAI, no streaming)": "Устаревший API (до OAI, без потоковой передачи)", + "Legacy API (pre-OAI, no streaming)": "Устаревший API (до OAI, без стриминга)", "Bypass status check": "Обход проверки статуса", "Streaming API url": "Потоковый API URL", "Example: ws://127.0.0.1:5005/api/v1/stream": "Пример: ws://127.0.0.1:5005/api/v1/stream", - "Mancer API key": "Mancer API ключ", + "Mancer API key": "Ключ от Mancer API", "Example: https://neuro.mancer.tech/webui/MODEL/api": "Пример: https://neuro.mancer.tech/webui/MODEL/api", - "to get your OpenAI API key.": "для получения API-ключа OpenAI", + "to get your OpenAI API key.": "для получения ключа от OpenAI API", "Window AI Model": "Модель Window AI", "OpenAI Model": "Модель OpenAI", - "Claude API Key": "Claude API ключ", - "Get your key from": "Получить ключ из", - "Anthropic's developer console": "Консоли разработчика Anthropic", - "Slack and Poe cookies will not work here, do not bother trying.": "Файлы cookie Slack и Poe здесь не подойдут, не пытайтесь.", + "Claude API Key": "Ключ от Claude API", + "Get your key from": "Получите ключ в", + "Anthropic's developer console": "консоли разработчика Anthropic", + "Slack and Poe cookies will not work here, do not bother trying.": "Файлы cookie Slack и Poe здесь не подойдут, можете их не пробовать.", "Claude Model": "Модель Claude", - "Scale API Key": "Scale API ключ", + "Scale API Key": "Ключ от Scale API", "Alt Method": "Альтернативный метод", - "AI21 API Key": "AI21 API ключ", + "AI21 API Key": "Ключ от API AI21", "AI21 Model": "Модель AI21", "View API Usage Metrics": "Посмотреть статистику использования API", "Show External models (provided by API)": "Показать \"сторонние\" модели (предоставленные API)", "Bot": "Бот:", "Allow fallback routes": "Разрешить резервные маршруты", "Allow fallback routes Description": "Автоматически выбирает альтернативную модель, если выбранная модель не может удовлетворить ваш запрос.", - "OpenRouter API Key": "OpenRouter API ключ", + "OpenRouter API Key": "Ключ от OpenRouter API", "Connect to the API": "Соединение с API", "OpenRouter Model": "Модель OpenRouter", "View Remaining Credits": "Посмотреть оставшиеся кредиты", - "Click Authorize below or get the key from": "Нажмите «Авторизовать» ниже или получите ключ от", + "Click Authorize below or get the key from": "Нажмите «Авторизоваться» ниже или получите ключ от", "Auto-connect to Last Server": "Автоматическое подключение к последнему серверу", "View hidden API keys": "Посмотреть скрытые API-ключи", "Advanced Formatting": "Расширенное форматирование", @@ -227,56 +227,56 @@ "Disable scenario formatting": "Отключить форматирование сценария", "Disable example chats formatting": "Отключить форматирование примеров чата", "Disable chat start formatting": "Отключить форматирование начала чата", - "Custom Chat Separator": "Пользовательское разделение чата", + "Custom Chat Separator": "Кастомный разделитель для чата", "Replace Macro in Custom Stopping Strings": "Заменить макрос в пользовательских стоп-строках", "Strip Example Messages from Prompt": "Удалить примеры сообщений из подсказки", "Story String": "Строка истории", "Example Separator": "Пример разделителя", "Chat Start": "Начало чата", - "Activation Regex": "Активация Regex", - "Instruct Mode": "Режим \"Инструктаж\"", - "Wrap Sequences with Newline": "Отделять последовательности красной строкой", - "Include Names": "Показывать имена", - "Force for Groups and Personas": "Усилия для Групп и Персон", - "System Prompt": "Системная инструкция", - "Instruct Mode Sequences": "Последовательности режима обучения", + "Activation Regex": "Regex для активации", + "Instruct Mode": "Режим Instruct", + "Wrap Sequences with Newline": "Отделять строки символом новой строки", + "Include Names": "Добавлять имена", + "Force for Groups and Personas": "Также для групп и персон", + "System Prompt": "Системный промпт", + "Instruct Mode Sequences": "Строки для Instruct-режима", "Input Sequence": "Входная последовательность", "Output Sequence": "Выходная последовательность", "First Output Sequence": "Первая выходная последовательность", "Last Output Sequence": "Последняя выходная последовательность", "System Sequence Prefix": "Префикс системной последовательности", "System Sequence Suffix": "Суффикс системной последовательности", - "Stop Sequence": "Последовательность остановки", + "Stop Sequence": "Стоп-строка", "Context Formatting": "Форматирование контекста", "(Saved to Context Template)": "(Сохраняется в шаблоне контекста)", "Tokenizer": "Токенайзер", - "None / Estimated": "Отсутствует/Приблизительно", + "None / Estimated": "Отсутствует / Приблизительно", "Sentencepiece (LLaMA)": "Sentencepiece (LLaMA)", - "Token Padding": "Заполнение токенов", - "Save preset as": "Сохранить предустановку как", - "Always add character's name to prompt": "Всегда добавлять имя персонажа в инструкции", - "Use as Stop Strings": "Использование в качестве стоп-строк", + "Token Padding": "Кол-во добавочных токенов", + "Save preset as": "Сохранить пресет как", + "Always add character's name to prompt": "Всегда добавлять имя персонажа в промпт", + "Use as Stop Strings": "Использовать в качестве стоп-строк", "Bind to Context": "Привязка к контексту", - "Generate only one line per request": "Генерировать только одну строку для каждого запроса", + "Generate only one line per request": "Генерировать одну строку на запрос", "Misc. Settings": "Доп. настройки", - "Auto-Continue": "Авто продолжение", - "Collapse Consecutive Newlines": "Свернуть последовательные новые строки", - "Allow for Chat Completion APIs": "Разрешить API завершения чата", + "Auto-Continue": "Авто-продолжение", + "Collapse Consecutive Newlines": "Сворачивать последовательные новые строки", + "Allow for Chat Completion APIs": "Разрешить для API Chat Completion", "Target length (tokens)": "Целевая длина (токены)", - "Keep Example Messages in Prompt": "Сохранять примеры сообщений в инструкции", + "Keep Example Messages in Prompt": "Сохранять примеры сообщений в промпте", "Remove Empty New Lines from Output": "Удалять пустые строчки из вывода", "Disabled for all models": "Выключено для всех моделей", "Automatic (based on model name)": "Автоматически (выбор по названию модели)", "Enabled for all models": "Включить для всех моделей", "Anchors Order": "Порядок Anchors", - "Character then Style": "Персонаж после Стиля", - "Style then Character": "Стиль после Персонажа", + "Character then Style": "Стиль после Персонажа", + "Style then Character": "Персонаж после Стиля", "Character Anchor": "Anchors Персонажа", "Style Anchor": "Стиль Anchors", "World Info": "Информация о мире", "Scan Depth": "Глубина сканирования", "Case-Sensitive": "С учетом регистра", - "Match Whole Words": "Сопоставить целые слова", + "Match Whole Words": "Только целые слова", "Use global setting": "Использовать глобальную настройку", "Yes": "Да", "No": "Нет", @@ -291,9 +291,9 @@ "User Settings": "Настройки пользователя", "UI Mode": "Режим интерфейса", "UI Language": "Язык интерфейса", - "MovingUI Preset": "Предустановка MovingUI", + "MovingUI Preset": "Пресет MovingUI", "UI Customization": "Настройки интерфейса", - "Avatar Style": "Стиль аватаров", + "Avatar Style": "Аватарки", "Circle": "Круглые", "Rectangle": "Прямоугольные", "Square": "Квадратные", @@ -306,28 +306,28 @@ "Message Timer": "Таймер сообщений", "Model Icon": "Показать значки модели", "# of messages (0 = disabled)": "# сообщений (0 = отключено)", - "Advanced Character Search": "Расширенный поиск персонажей", + "Advanced Character Search": "Расширенный поиск по персонажам", "Allow {{char}}: in bot messages": "Показывать {{char}}: в ответах", "Allow {{user}}: in bot messages": "Показать {{user}}: в ответах", "Show tags in responses": "Показывать <теги> в ответах", - "Aux List Field": "Вспомогательное поле списка", - "Lorebook Import Dialog": "Импрот Lorebook-ка", - "MUI Preset": "Предустановка MUI:", - "If set in the advanced character definitions, this field will be displayed in the characters list.": "Если это поле задано в расширенных параметрах персонажа, оно будет отображаться в списке персонажа.", + "Aux List Field": "Вспомогательное поле в списке", + "Lorebook Import Dialog": "Показывать окно импорта лорбука", + "MUI Preset": "Пресет MUI:", + "If set in the advanced character definitions, this field will be displayed in the characters list.": "Если это поле задано в расширенных параметрах персонажа, оно будет отображаться в списке персонажей.", "Relaxed API URLS": "Смягченные URL-адреса API", "Custom CSS": "Пользовательский CSS", "Default (oobabooga)": "По умолчанию (oobabooga)", "Mancer Model": "Модель Mancer", "API Type": "Тип API", - "Aphrodite API key": "API-ключ Aphrodite", - "Relax message trim in Groups": "Расслабленная отделка сообщений в Группах", - "Characters Hotswap": "Смена персонажей на лету", - "Request token probabilities": "Вероятность запроса токена", - "Movable UI Panels": "Перемещение панелей интерфейса", + "Aphrodite API key": "Ключ от API Aphrodite", + "Relax message trim in Groups": "Мягкая обрезка сообщений в группах", + "Characters Hotswap": "HotSwap (смена персонажей на лету)", + "Request token probabilities": "Запрашивать вероятность токена", + "Movable UI Panels": "Подвижные панели UI", "Reset Panels": "Сбросить MovingUI", - "UI Colors": "Цвета интерфейса", + "UI Colors": "Цвета UI", "Main Text": "Основной текст", - "Italics Text": "Курсивный текст", + "Italics Text": "Курсив", "Quote Text": "Текст в кавычках", "Shadow Color": "Цвет теней", "FastUI BG": "Фон FastUI", @@ -335,15 +335,15 @@ "Font Scale": "Размер текста", "Blur Strength": "Сила размытия", "Text Shadow Width": "Размер теней текста", - "UI Theme Preset": "Предустановки интерфейса", + "UI Theme Preset": "Пресет темы UI", "Power User Options": "Продвинутые параметры", - "Swipes": "Свайвы", + "Swipes": "Свайпы", "Miscellaneous": "Разное", - "Theme Toggles": "Переключатели темы", + "Theme Toggles": "Настройки темы", "Background Sound Only": "Только фоновый звук", - "Auto-load Last Chat": "Автоматически загружать последий чат", + "Auto-load Last Chat": "Автозагрузка последнего чата", "Auto-save Message Edits": "Автоматически сохранять отредактированные сообщения", - "Auto-fix Markdown": "Автоматическое исправление подчеркиваний", + "Auto-fix Markdown": "Автоисправление разметки", "Allow : in bot messages": "Разрешить : в сообщениях ИИ", "Auto-scroll Chat": "Автоматическая прокрутка чата", "Render Formulas": "Рендер формул", @@ -352,50 +352,50 @@ "Automatic (desktop)": "Автоматически (системные настройки)", "Always enabled": "Всегда включена", "Debug Menu": "Меню отладки", - "Restore User Input": "Восстановить запрос пользователя", + "Restore User Input": "Восстанавливать введённый текст", "Character Handling": "Обработка персонажа", - "Example Messages Behavior": "Пример поведения в сообщениях:", + "Example Messages Behavior": "Примеры сообщений:", "Gradual push-out": "Постепенное выталкивание", - "Chat/Message Handling": "Обработка чата/сообщения", - "Always include examples": "Всегда включать примеры", - "Never include examples": "Никогда не включать примеры", + "Chat/Message Handling": "Обработка чата и сообщений", + "Always include examples": "Всегда применять примеры", + "Never include examples": "Никогда не применять примеры", "Forbid External Media": "Запрет внешних медиа", "System Backgrounds": "Системные фоны", "Name": "Имя", - "Your Avatar": "Ваш Аватар", + "Your Avatar": "Ваш аватар", "Extensions API:": "API для расширений", "SillyTavern-extras": "SillyTavern-extras", - "Auto-connect": "Автоматическое соединение", + "Auto-connect": "Подключаться автоматически", "Active extensions": "Актививные расширения", "Extension settings": "Настройки расширений", "Description": "Описание", "First message": "Первое сообщение", - "Group Controls": "Контроль группы", - "Group reply strategy": "Сортировка ответов в группе", - "Natural order": "Обычный порядок", - "List order": "Порядок по листу", + "Group Controls": "Управление группой", + "Group reply strategy": "Персонажи отвечают...", + "Natural order": "По алфавиту", + "List order": "По списку", "Allow self responses": "Разрешить ответ себе", - "Auto Mode": "Автоматический режим", - "Add Members": "Добавить членов", - "Current Members": "Текущие члены", + "Auto Mode": "Авто-режим", + "Add Members": "Добавить участников", + "Current Members": "Текущие участники", "text": "текст", "Delete": "Удалить", "Cancel": "Отменить", - "Advanced Defininitions": "Улучшенная узнаваемость", - "Personality summary": "Личная сводка", + "Advanced Defininitions": "Продвинутое описание", + "Personality summary": "Сводка по личности", "A brief description of the personality": "Краткое описание личности", "Scenario": "Сценарий", "Circumstances and context of the dialogue": "Обстоятельства и контекст диалога", "Talkativeness": "Разговорчивость", "How often the chracter speaks in": "Как часто персонаж говорит", - "group chats!": "в груповых чатах", + "group chats!": "в групповых чатах!", "Shy": "Застенчивый", "Normal": "Обычный", "Chatty": "Разговорчивый", "Examples of dialogue": "Примеры диалога", - "Forms a personality more clearly": "Определите личность более точно", + "Forms a personality more clearly": "Определяет личность более точно", "Save": "Сохранить", - "World Info Editor": "Редактирование информации о мире", + "World Info Editor": "Редактировать информацию о мире", "New summary": "Новая переменная", "Export": "Экспорт", "Delete World": "Удалить мир", @@ -408,17 +408,17 @@ "Content": "Содержание", "What this keyword should mean to the AI": "Значение данного ключевого слова для ИИ", "Memo/Note": "Напоминание", - "Not sent to AI": "Не отправлять ИИ", + "Not sent to AI": "Не отправляется ИИ", "Constant": "Постоянно", "Selective": "Выборочно", "Before Char": "Перед Персонажем", "After Char": "После Персонажа", "Insertion Order": "Порядок внесения", - "Tokens:": "Токены", + "Tokens:": "Токены:", "Disable": "Отключено", - "${characterName}": "${имяПерсонажа}", + "${characterName}": "${characterName}", "CHAR": "ПЕРСОНАЖ", - "is typing": "Печатает...", + "is typing": "печатает...", "Back to parent chat": "Вернуться в основной чат", "Save bookmark": "Сохранить закладку", "Convert to group": "Превратить в группу", @@ -429,18 +429,18 @@ "Regenerate": "Повторная генерация", "PNG": "PNG", "JSON": "JSON", - "presets": "Предустановки", + "presets": "Пресеты", "Message Sound": "Звук сообщения", - "Author's Note": "Авторские заметки", - "Send Jailbreak": "Отправлять JailBreak", + "Author's Note": "Пометки автора", + "Send Jailbreak": "Отправлять джейлбрейк", "Replace empty message": "Заменять пустые сообщения", "Send this text instead of nothing when the text box is empty.": "Этот текст будет отправлен в случае отсутствия текста на отправку.", - "NSFW avoidance prompt": "Инструкции для избегания NSFW", - "Prompt that is used when the NSFW toggle is off": "Инструкции, используемые, когда поощрение NSFW отключено", + "NSFW avoidance prompt": "Анти-NSFW промпт", + "Prompt that is used when the NSFW toggle is off": "Промпт, применяемый, когда поощрение NSFW отключено", "Advanced prompt bits": "Дополнительные инструкции", - "World Info format": "Шаблон форматирования Информации о мире", + "World Info format": "Шаблон форматирования информации о мире", "Wraps activated World Info entries before inserting into the prompt. Use {0} to mark a place where the content is inserted.": "Выделяет активную Информацию о мире перед внесением в инструкции. Используйте {0} чтобы уточнить место с необходимой информацией.", - "Unrestricted maximum value for the context slider": "Неограниченное максимальное значение для ползунка с размером контекста", + "Unrestricted maximum value for the context slider": "Убрать потолок для ползунка контекста. Включайте только если точно знаете, что делаете", "Chat Completion Source": "Источник для Chat Completion", "Avoid sending sensitive information to the Horde.": "Избегайте отправки личной информации Horde", "Review the Privacy statement": "Ознакомиться с заявлением о конфиденциальности", @@ -454,25 +454,25 @@ "KoboldAI Horde": "KoboldAI Horde", "Text Gen WebUI (ooba)": "Text Gen WebUI (ooba)", "NovelAI": "NovelAI", - "Chat Completion (OpenAI, Claude, Window/OpenRouter, Scale)": "Дополнение диалога (OpenAI, Claude, Window/OpenRouter, Scale)", - "OpenAI API key": "API-ключ для OpenAI", + "Chat Completion (OpenAI, Claude, Window/OpenRouter, Scale)": "Char Completion (OpenAI, Claude, Window/OpenRouter, Scale)", + "OpenAI API key": "Ключ для API OpenAI", "Trim spaces": "Обрезать пробелы", - "Trim Incomplete Sentences": "Обрезать неоконченные предложения", - "Include Newline": "Использовать красную строку", + "Trim Incomplete Sentences": "Удалять неоконченные предложения", + "Include Newline": "Добавлять новую строку", "Non-markdown strings": "Строки без разметки", - "Replace Macro in Sequences": "Заменить макросы в последовательности", - "Presets": "Предустановки", + "Replace Macro in Sequences": "Заменить макросы в строках", + "Presets": "Пресеты", "Separator": "Разделитель", "Start Reply With": "Начинать ответ с", - "Show reply prefix in chat": "Показывать префиксы ответов в чате", - "Worlds/Lorebooks": "Миры/Lorebook-ки", + "Show reply prefix in chat": "Показывать префикс ответов в чате", + "Worlds/Lorebooks": "Миры и лорбуки", "Active World(s)": "Активные миры", "Activation Settings": "Настройки активации", - "Character Lore Insertion Strategy": "Порядок включения сведений", + "Character Lore Insertion Strategy": "Порядок включения лора персонажа", "Sorted Evenly": "Равномерная сортировка", "Active World(s) for all chats": "Активные миры для всех чатов", "-- World Info not found --": "-- Информация о мире не найдена --", - "--- Pick to Edit ---": "--- Редактировать ---", + "--- Pick to Edit ---": "--- Выберите для редактирования ---", "or": "или", "New": "Новый", "Priority": "Приритет", @@ -485,26 +485,26 @@ "Depth ↘": "Глубина ↘", "Order ↗": "Порядок ↗", "Order ↘": "Порядок ↘", - "UID ↗": "Уник. ID ↗", - "UID ↘": "Уник. ID ↘", + "UID ↗": "UID ↗", + "UID ↘": "UID ↘", "Trigger% ↗": "Триггер% ↗", "Trigger% ↘": "Триггер% ↘", "Order:": "Порядок:", "Depth:": "Глубина:", - "Character Lore First": "Сначала сведения о персонаже", - "Global Lore First": "Сначала общие сведения", + "Character Lore First": "Сначала лор персонажа", + "Global Lore First": "Сначала глобальный лор", "Recursive Scan": "Рекурсивное сканирование", "Case Sensitive": "Учитывать регистр", "Match whole words": "Только полное совпадение", "Alert On Overflow": "Оповещение о переполнении", - "World/Lore Editor": "Редактировать Мир/Сведения", - "--- None ---": "---Отсутствует---", - "Comma seperated (ignored if empty)": "Разделение запятыми (не используется, если оставлено пустым)", + "World/Lore Editor": "Редактировать мир или лор", + "--- None ---": "--- Отсутствует ---", + "Comma seperated (ignored if empty)": "Через запятую (не используется, если оставлено пустым)", "Use Probability": "Использовать вероятность", "Exclude from recursion": "Исключить из рекурсии", - "Entry Title/Memo": "Вставьте Название/Заметку", + "Entry Title/Memo": "Название или заметка о записи", "Position:": "Положение:", - "T_Position": "↑Char: Перед определениями Персонажа\n↓Char: После определений Персонажа\n↑AN: Перед Авторскими заметками\n↓AN: После Авторских заметок\n@D: На глубине", + "T_Position": "↑Char: Перед определениями Персонажа\n↓Char: После определений Персонажа\n↑AN: Перед Пометок автора\n↓AN: После Пометок автора\n@D: На глубине", "Before Char Defs": "↑Перс.", "After Char Defs": "↓Перс.", "Before AN": "↑АЗ", @@ -514,35 +514,35 @@ "Probability:": "Вероятность:", "Update a theme file": "Обновить файл темы", "Save as a new theme": "Сохранить как новую тему", - "Minimum number of blacklisted words detected to trigger an auto-swipe": "Минимальное количество обнаруженных слов в черном списке для запуска авто-свайпа.", - "Delete Entry": "Удалить запись:", - "User Message Blur Tint": "Сообщение пользователя", - "AI Message Blur Tint": "Сообщение ИИ", + "Minimum number of blacklisted words detected to trigger an auto-swipe": "Минимальное количество обнаруженных запрещённых слов, при котором срабатывает авто-свайп.", + "Delete Entry": "Удалить запись", + "User Message Blur Tint": "Ваши сообщения", + "AI Message Blur Tint": "Сообщения ИИ", "Chat Backgrounds": "Фоны чата", "Chat Background": "Фон чата", - "UI Background": "Фон интерфейса", + "UI Background": "Фон UI", "Mad Lab Mode": "Режим безумца", "Show Message Token Count": "Счетчик токенов сообщения", "Compact Input Area (Mobile)": "Компактная зона ввода", "Zen Sliders": "Дзен слайдеры", - "UI Border": "Границы интерфейса", + "UI Border": "Границы UI", "Chat Style:": "Стиль чата", "Chat Width (PC)": "Ширина чата (для ПК)", "Chat Timestamps": "Временные метки в чате", "Tags as Folders": "Теги как папки", "Chat Truncation": "Усечение чата", "(0 = unlimited)": "(0 = неограниченное)", - "Streaming FPS": "Потоковый FPS", + "Streaming FPS": "FPS для стриминга", "Gestures": "Жесты", "Message IDs": "ID сообщений", - "Prefer Character Card Prompt": "Предпочитать инструкции из Карточки Персонажа", - "Prefer Character Card Jailbreak": "Предпочитать Джеилбреик из Карточки Персонажа", - "Press Send to continue": "Нажатие 'Отправить' для продолжения", - "Quick 'Continue' button": "Кнопка быстрого 'Продолжения'", - "Log prompts to console": "Выводы журнала в консоли", + "Prefer Character Card Prompt": "Предпочитать промпт из карточки персонажа", + "Prefer Character Card Jailbreak": "Предпочитать джейлбрейк из карточки керсонажа", + "Press Send to continue": "Кнопка отправки продолжает сообщение", + "Quick 'Continue' button": "Кнопка быстрого продолжения", + "Log prompts to console": "Выводить промпты в консоль", "Never resize avatars": "Никогда не менять размер аватаров", "Show avatar filenames": "Показывать названия файлов аватаров", - "Import Card Tags": "Импорт тегов Карточки", + "Import Card Tags": "Импорт тегов карточки", "Confirm message deletion": "Подтверждение удаления сообщений", "Spoiler Free Mode": "Режим без спойлеров", "Auto-swipe": "Автоматические свайпы", @@ -550,7 +550,7 @@ "Blacklisted words": "Запрещенные слова", "Blacklisted word count to swipe": "Количество запрещенных слов для свайпа", "Reload Chat": "Перезагрузить чат", - "Search Settings": "Поиск настроек", + "Search Settings": "Поиск по настройкам", "Disabled": "Отключено", "Automatic (PC)": "Автоматическое (ПК)", "Enabled": "Включено", @@ -569,54 +569,54 @@ "Show sequential message numbers in the chat log": "Показывать порядковые номера сообщений в журнале чата.", "Show the number of tokens in each message in the chat log": "Показать количество токенов в каждом сообщении в журнале чата.", "Single-row message input area. Mobile only, no effect on PC": "Однорядная область ввода сообщений. Только для мобильных устройств, на ПК не работает.", - "In the Character Management panel, show quick selection buttons for favorited characters": "На панели управления персонажами отображають кнопки быстрого выбора для избранных персонажей.", + "In the Character Management panel, show quick selection buttons for favorited characters": "На панели управления персонажами будут отображены кнопки быстрого выбора для избранных персонажей.", "Show tagged character folders in the character list": "Отобразить теговые папки с персонажами в списке персонажей.", "Play a sound when a message generation finishes": "Воспроизведение звука при завершении генерации сообщения.", "Only play a sound when ST's browser tab is unfocused": "Воспроизводить звук только тогда, когда вкладка браузера ST не выбрана.", "Reduce the formatting requirements on API URLs": "Снижение требований к форматированию URL-адресов API.", - "Ask to import the World Info/Lorebook for every new character with embedded lorebook. If unchecked, a brief message will be shown instead": "Запросить импорт информации о мире/Lorebook для каждого нового персонажа со встроенным Lorebook. Если флажок снят, вместо этого будет показано короткое сообщение.", + "Ask to import the World Info/Lorebook for every new character with embedded lorebook. If unchecked, a brief message will be shown instead": "Спрашивать разрешение на импорт лорбука для всех персонажей со встроенным лорбуком. При выключенной опции вместо этого будет показываться короткое сообщение", "Restore unsaved user input on page refresh": "Восстановление несохраненного пользовательского запроса при обновлении страницы.", - "Allow repositioning certain UI elements by dragging them. PC only, no effect on mobile": "Позволяет изменять положение некоторых элементов пользовательского интерфейса путем их перетаскивания. Только для ПК, на мобильных не работает.", - "MovingUI preset. Predefined/saved draggable positions": "Предварительная настройка MovingUI. Предопределенные/сохраненные позиции для перетаскивания.", - "Save movingUI changes to a new file": "Сохранение изменений перемещаемого пользовательского интерфейса в новый файл.", - "Apply a custom CSS style to all of the ST GUI": "Применить пользовательский стиль CSS ко всем элементам графического интерфейса ST.", - "Use fuzzy matching, and search characters in the list by all data fields, not just by a name substring": "Использовать нечеткое сопоставление и искать символы в списке по всем полям данных, а не только по подстроке имени.", - "If checked and the character card contains a prompt override (System Prompt), use that instead": "Если установлен флажок и карточка персонажа содержит переопределение подсказки (Системная подсказка), будет использована она вместо изначальной.", - "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Если установлен флажок и карточка персонажа содержит переопределение джейлбрейка (инструкция Истории сообщений), будет использована он вместо изначального.", - "Avoid cropping and resizing imported character images. When off, crop/resize to 400x600": "Избегать обрезки и изменения размера импортированных изображений персонажей. Если выключено, обрезать/изменить размер до 400x600.", - "Show actual file names on the disk, in the characters list display only": "Отображение фактических имен файлов на диске, только в списке персонажей.", - "Prompt to import embedded card tags on character import. Otherwise embedded tags are ignored": "Запрос на импорт встроенных тегов карт при импорте персонажей. В противном случае встроенные теги игнорируются.", - "Hide character definitions from the editor panel behind a spoiler button": "Скрыть определения персонажей из панели редактора за кнопкой спойлера.", - "Show a button in the input area to ask the AI to continue (extend) its last message": "Показать кнопку в области ввода, чтобы попросить ИИ продолжить (продлить) его последнее сообщение.", + "Allow repositioning certain UI elements by dragging them. PC only, no effect on mobile": "Позволяет перемещать некоторые элементы интерфейса путем их перетаскивания. Только для ПК, на телефонах не работает.", + "MovingUI preset. Predefined/saved draggable positions": "Пресет для MovingUI. Предопределенные/сохраненные позиции для перетаскивания.", + "Save movingUI changes to a new file": "Сохранение изменений MovingUI в новый файл.", + "Apply a custom CSS style to all of the ST GUI": "Применять пользовательский CSS ко всему интерфейсу Таверны.", + "Use fuzzy matching, and search characters in the list by all data fields, not just by a name substring": "Искать персонажей по всем полям данных, а не только по имени.", + "If checked and the character card contains a prompt override (System Prompt), use that instead": "При включении этой опции, системный промпт будет заменяться кастомным промптом из карточки (при его наличии).", + "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "При включении этой опции, пользовательский джейлбрейк будет заменяться кастомным джейлбрейком из карточки (при его наличии).", + "Avoid cropping and resizing imported character images. When off, crop/resize to 400x600": "Не растягивать и не обрезать изображения импортируемых персонажей. При выключении опции, изображения будут всегда приводиться к размеру 400x600.", + "Show actual file names on the disk, in the characters list display only": "Отображение названий файлов персонажей на диске, только в списке персонажей.", + "Prompt to import embedded card tags on character import. Otherwise embedded tags are ignored": "Запрашивать разрешения на импорт встроенных тегов карт при импорте персонажей. В противном случае встроенные теги игнорируются.", + "Hide character definitions from the editor panel behind a spoiler button": "Спрятать определения персонажей из панели редактора за кнопку спойлера.", + "Show a button in the input area to ask the AI to continue (extend) its last message": "Показывать на форме ответа кнопку, по нажатии на которую ИИ продолжит своё предыдущее сообщение.", "Show arrow buttons on the last in-chat message to generate alternative AI responses. Both PC and mobile": "Показывать кнопки со стрелками на последнем сообщении в чате, чтобы генерировать альтернативные ответы ИИ. Как для ПК, так и для мобильных устройств.", "Allow using swiping gestures on the last in-chat message to trigger swipe generation. Mobile only, no effect on PC": "Позволяет использовать жесты смахивания на последнем сообщении в чате, чтобы вызвать альтернативную генерацию. Только для мобильных устройств, на ПК не работает.", - "Save edits to messages without confirmation as you type": "Сохранять правки в сообщениях без подтверждения при вводе текста.", + "Save edits to messages without confirmation as you type": "Сохранять правки в сообщениях без подтверждения по мере ввода текста.", "Render LaTeX and AsciiMath equation notation in chat messages. Powered by KaTeX": "Отображение нотации уравнений LaTeX и AsciiMath в сообщениях чата. При поддержке KaTeX.", - "Disalow embedded media from other domains in chat messages": "Запретить встроенные медиафайлы из других доменов в сообщениях чата.", + "Disalow embedded media from other domains in chat messages": "Запретить в сообщениях чата встроенные медиафайлы из других доменов.", "Skip encoding and characters in message text, allowing a subset of HTML markup as well as Markdown": "Не кодировать символы < и > в тексте сообщения, что позволяет использовать подмножество HTML-разметки, а также Markdown.", - "Allow AI messages in groups to contain lines spoken by other group members": "Разрешить в групповых сообщениях AI содержать реплики, произнесенные другими членами группы.", + "Allow AI messages in groups to contain lines spoken by other group members": "Разрешить ИИ в группах генерировать строчки за других участников группы в своих сообщениях.", "Requests logprobs from the API for the Token Probabilities feature": "Запросить логпробы из API для функции Token Probabilities.", "Automatically reject and re-generate AI message based on configurable criteria": "Автоматическое отклонение и повторная генерация сообщений AI на основе настраиваемых критериев.", - "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Включить функцию автоматического пролистывания. Настройки в этом разделе действуют только при включенном автопролистывании.", + "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Включить авто-свайп. Настройки в этом разделе действуют только при включенном авто-свайпе.", "If the generated message is shorter than this, trigger an auto-swipe": "Если сгенерированное сообщение короче этого значения, срабатывает авто-свайп.", "Reload and redraw the currently open chat": "Перезагрузить и перерисовать открытый в данный момент чат.", "Auto-Expand Message Actions": "Развернуть контекстные элементы", "Not Connected": "Не подключено", - "Persona Management": "Управление Персоной", - "Persona Description": "Описание Персоны", - "Your Persona": "Ваша Персона", - "Show notifications on switching personas": "Показывать уведомления о смене персоны", + "Persona Management": "Управление персоной", + "Persona Description": "Описание персоны", + "Your Persona": "Ваша персона", + "Show notifications on switching personas": "Показывать уведомления при смене персоны", "Blank": "Пустой", - "In Story String / Chat Completion: Before Character Card": "В строке истории / Дополнение диалога: Перед Карточкой Персонажа", - "In Story String / Chat Completion: After Character Card": "В строке истории / Дополнение диалога: После Карточки Персонажа", - "In Story String / Prompt Manager": "В строке истории/Менеджер подсказок", - "Top of Author's Note": "Перед Авторскими Заметками", - "Bottom of Author's Note": "После Авторских Заметок", - "How do I use this?": "Как мне это использовать?", - "More...": "Узнать больше...", + "In Story String / Chat Completion: Before Character Card": "В строке истории / в Chat Completion: Перед карточкой персонажа", + "In Story String / Chat Completion: After Character Card": "В строке истории / в Chat Completion: После карточки персонажа", + "In Story String / Prompt Manager": "В строке истории / Менеджер промптов", + "Top of Author's Note": "Перед Заметками автора", + "Bottom of Author's Note": "После Заметок автора", + "How do I use this?": "Как пользоваться?", + "More...": "Ещё...", "Link to World Info": "Ссылка на информацию о мире", - "Import Card Lore": "Импортировать Карточку Сведений", - "Scenario Override": "Замещение сценария", + "Import Card Lore": "Импортировать лор карточки", + "Scenario Override": "Перезапись сценария", "Rename": "Переименовать", "Character Description": "Описание персонажа", "Creator's Notes": "Заметки создателя", @@ -624,114 +624,113 @@ "Z-A": "Z-A", "Newest": "Новейшие", "Oldest": "Старейшие", - "Favorites": "Любимые", + "Favorites": "Избранные", "Recent": "Последние", "Most chats": "Больше всего чатов", "Least chats": "Меньше всего чатов", "Back": "Назад", - "Prompt Overrides (For OpenAI/Claude/Scale APIs, Window/OpenRouter, and Instruct mode)": "Замещение инструкций (Для OpenAI/Claude/Scale API, Window/OpenRouter, и Режима Instruct)", - "Insert {{original}} into either box to include the respective default prompt from system settings.": "Внесите {{original}} в любое поле для внесения стандартных инструкций из системных настроек", - "Main Prompt": "Главные инструкции", - "Jailbreak": "Jailbreak", - "Creator's Metadata (Not sent with the AI prompt)": "Сведения о создателе (не отправляются ИИ с инструкциями)", - "Everything here is optional": "Всё в данных полях опционально", - "Created by": "Создано", - "Character Version": "Версия Персонажа", - "Tags to Embed": "Теги для встраивания", + "Prompt Overrides (For OpenAI/Claude/Scale APIs, Window/OpenRouter, and Instruct mode)": "Перезапись промпта (Для OpenAI/Claude/Scale API, Window/OpenRouter, и режима Instruct)", + "Insert {{original}} into either box to include the respective default prompt from system settings.": "Введите {{original}} в любое поле, чтобы использовать соответствующий промпт из системных настроек", + "Main Prompt": "Основной промпт", + "Jailbreak": "Джейлбрейк", + "Creator's Metadata (Not sent with the AI prompt)": "Метаданные (не отправляются ИИ)", + "Everything here is optional": "Все поля необязательные", + "Created by": "Автор", + "Character Version": "Версия персонажа", + "Tags to Embed": "Встраиваемые теги", "How often the character speaks in group chats!": "Как часто персонаж говорит в групповых чатах", - "Important to set the character's writing style.": "Важные замечания для стиля написания персонажа", + "Important to set the character's writing style.": "Серьёзно влияет на стиль письма персонажа.", "ATTENTION!": "ВНИМАНИЕ!", - "Samplers Order": "Порядок семплирования", - "Samplers will be applied in a top-down order. Use with caution.": "Семплирование будет применено в порядке сверху-вниз. Используйте с осторожностью.", - "Repetition Penalty": "Наказание за повторы", - "Rep. Pen. Range.": "Размер наказания за повторы", - "Rep. Pen. Freq.": "Частота наказания за повторы", - "Rep. Pen. Presence": "Наличие наказания за повторы", + "Samplers Order": "Порядок сэмплеров", + "Samplers will be applied in a top-down order. Use with caution.": "Сэмплеры будут применяться в порядке от верхнего к нижнему. Используйте с осторожностью.", + "Repetition Penalty": "Штраф за повторы", + "Rep. Pen. Range.": "Диапазон поиска повторов", + "Rep. Pen. Freq.": "Частота штрафа за повторы", + "Rep. Pen. Presence": "Наличие штрафа за повторы", "Enter it in the box below:": "Введите в поле ниже:", "separate with commas w/o space between": "разделять запятыми без пробела", "Document": "Документ", "Suggest replies": "Предлагать ответы", "Show suggested replies. Not all bots support this.": "Показывать предлагаемые ответы. Не все боты поддерживают это.", - "Use 'Unlocked Context' to enable chunked generation.": "Использовать 'Безлимитный контекст' для активации кусочной генерации", + "Use 'Unlocked Context' to enable chunked generation.": "Использовать 'Неограниченный контекст' для активации кусочной генерации", "It extends the context window in exchange for reply generation speed.": "Увеличивает размер контекста в обмен на скорость генерации.", "Continue": "Продолжить", "CFG Scale": "Масштаб CFG", "Editing:": "Изменения", - "AI reply prefix": "Префикс Ответ ИИ", - "Custom Stopping Strings": "Настройка ограничивающий нитей", - "JSON serialized array of strings": "JSON ориентированный набор нитей", - "words you dont want generated separated by comma ','": "Слова, которые вы не хотите генерировать, разделяются запятыми ','", - "Extensions URL": "URL расширений ", - "API Key": "Ключ API", + "AI reply prefix": "Префикс для ответа ИИ", + "Custom Stopping Strings": "Стоп-строки", + "JSON serialized array of strings": "Список строк в формате JSON", + "words you dont want generated separated by comma ','": "слова, которые вы не хотите генерировать, через запятую ','", + "Extensions URL": "URL расширений", + "API Key": "Ключ от API", "Enter your name": "Введите свое имя", "Name this character": "Назовите этого персонажа", "Search / Create Tags": "Искать / Создать тэги", - "Describe your character's physical and mental traits here.": "Опишите ментальные и физические черты персонажа здесь", - "This will be the first message from the character that starts every chat.": "Это булет первое сообщение от Персонажа при начале нового чата", - "Chat Name (Optional)": "Название Чата (Необязательно)", - "Filter...": "Отфильтровать...", + "Describe your character's physical and mental traits here.": "Опишите ментальные и физические черты персонажа", + "This will be the first message from the character that starts every chat.": "Это будет первое сообщение от персонажа при начале нового чата", + "Chat Name (Optional)": "Название чата (необязательно)", + "Filter...": "Фильтры...", "Search...": "Поиск...", "Any contents here will replace the default Main Prompt used for this character. (v2 spec: system_prompt)": "Все содержание этой ячейки будет заменять стандартный Промт", "Any contents here will replace the default Jailbreak Prompt used for this character. (v2 spec: post_history_instructions)": "Все содержание этой ячейки будет заменять стандартный Джейлбрейк", - "(Botmaker's name / Contact Info)": "Ваше имя / Контакты", - "(If you want to track character versions)": "Если вы хотите отслеживать модель персонажа", - "(Describe the bot, give use tips, or list the chat models it has been tested on. This will be displayed in the character list.)": "Опишите Персонажа, дайте советы, или упомяните на каких моделях он был протестирован", - "(Write a comma-separated list of tags)": "Запишите лист тэгов, разделяя запятой", - "(A brief description of the personality)": "Краткое описание личности)", - "(Circumstances and context of the interaction)": "(Обстоятельства и контекст этого взаимодействия)", + "(Botmaker's name / Contact Info)": "(Имя автора / Контакты)", + "(If you want to track character versions)": "Если вы хотите отслеживать версии персонажа", + "(Describe the bot, give use tips, or list the chat models it has been tested on. This will be displayed in the character list.)": "(Описание персонажа, советы по использованию, список моделей, на которых он тестировался. Информация будет отображаться в списке персонажей)", + "(Write a comma-separated list of tags)": "(Список тегов через запятую)", + "(A brief description of the personality)": "(Краткое описание личности)", + "(Circumstances and context of the interaction)": "(Обстоятельства и контекст этого диалога)", "(Examples of chat dialog. Begin each example with START on a new line.)": "(Примеры диалога. Начинайте каждый пример с START или новой линией.)", - "Injection text (supports parameters)": "Текст включения (Поддерживает параметры)", - "Injection depth": "Глубина включения", + "Injection text (supports parameters)": "Текст для инжекта (поддерживает параметры)", + "Injection depth": "Глубина инжекта", "Type here...": "Пишите здесь...", - "Comma separated (required)": "Разделять через запятую (Обязательное)", - "Comma separated (ignored if empty)": "Разделять через запятую (Игнорируется если пусто)", + "Comma separated (required)": "Через запятую (обязательное поле)", + "Comma separated (ignored if empty)": "Через запятую (пустое поле игнорируется)", "What this keyword should mean to the AI, sent verbatim": "Что это ключевое слово должно означать для ИИ, отправляется дословно", - "Filter to Character(s)": "Фильтр к персонажу(ам)", - "Character Exclusion": "Исключение персонажей", - "Inclusion Group": "Инклюзивная группа", - "Only one entry with the same label will be activated": "Будет актив. только одна запись с одинаковой меткой", - "-- Characters not found --": "-- Персонаж не найден --", + "Filter to Character(s)": "Фильтр по персонажу(ам)", + "Character Exclusion": "Исключить персонажей", + "Inclusion Group": "Включить персонажей", + "Only one entry with the same label will be activated": "Будет активна только одна запись с одинаковой меткой", + "-- Characters not found --": "-- Персонажей не найдено --", "Not sent to the AI": "Не отправляется ИИ", "(This will be the first message from the character that starts every chat)": "(Это будет первое сообщение от персонажа, когда вы начинаете новый чат)", - "Not connected to API!": "Нет подключения к API", - "AI Response Configuration": "Еастройка Ответа ИИ", - "AI Configuration panel will stay open": "Панель Настройки ИИ останется открытой", - "Update current preset": "Обновить текущую настройку", - "Create new preset": "Создать новую настройку", - "Import preset": "Импорт предустановки", - "Export preset": "Экспорт предустановки", - "Delete the preset": "Удалить предустановку", - "Auto-select this preset for Instruct Mode": "Автоматический выбор этой предустановки для режима 'Инструктаж'.", - "Auto-select this preset on API connection": "Автоматический выбор этой предустановки при подключении к API.", - "NSFW block goes first in the resulting prompt": "НСФВ блокировка идет первой при отправки Промта", - "Enables OpenAI completion streaming": "Включить процесс генерации OpenAI", - "Wrap user messages in quotes before sending": "Заключить ответ Пользователя в кавычки", - "Restore default prompt": "Восстановить станндартный промт", - "New preset": "Новая настройка", - "Delete preset": "Удалить настройку", + "AI Response Configuration": "Настройка ответа ИИ", + "AI Configuration panel will stay open": "Панель настройки ИИ останется открытой", + "Update current preset": "Обновить текущий пресет", + "Create new preset": "Создать новый пресет", + "Import preset": "Импортировать пресет", + "Export preset": "Экспортировать пресет", + "Delete the preset": "Удалить пресет", + "Auto-select this preset for Instruct Mode": "Автоматический выбор этого пресета для режима Instruct.", + "Auto-select this preset on API connection": "Автоматический выбор этого пресета при подключении к API.", + "NSFW block goes first in the resulting prompt": "Блок NSFW идёт первым при отправке промпта", + "Enables OpenAI completion streaming": "Включить стриминг OpenAI", + "Wrap user messages in quotes before sending": "Перед отправкой заключать ответ пользователя в кавычки", + "Restore default prompt": "Восстановить станндартный промпт", + "New preset": "Новый пресет", + "Delete preset": "Удалить пресет", "Restore default jailbreak": "Восстановить стандартный джейлбрейк", "Restore default reply": "Восстановить стандартный ответ", "Restore defaul note": "Восстановить стандартную заметку", - "API Connections": "Соединения API", + "API Connections": "Соединения с API", "Can help with bad responses by queueing only the approved workers. May slowdown the response time.": "Может помочь с плохими ответами ставя в очередь только подтвержденных работников. Может замедлить время ответа.", - "Clear your API key": "Очистить свои ключи API", + "Clear your API key": "Очистите свой ключ от API", "Refresh models": "Обновить модели", "Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai": "Получите свой OpenRouter API токен используя OAuth. У вас будет открыта вкладка openrouter.ai", - "Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!": "Подверждает ваше соединение к API. Знайте, что за это снимут деньги с вашего счета.", + "Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!": "Проверка работоспособности вашего соединения с API. Знайте, что оно будет отправлено от вашего лица.", "Create New": "Создать новое", "Edit": "Изменить", - "Locked = World Editor will stay open": "Закреплено = Редактирование Мира останется открытым", - "Entries can activate other entries by mentioning their keywords": "Записи могут активировать другие записи если в них содержаться ключевые слова", + "Locked = World Editor will stay open": "Закреплено = Редактор мира останется открытым", + "Entries can activate other entries by mentioning their keywords": "Записи могут активировать другие записи, если в них содержатся ключевые слова", "Lookup for the entry keys in the context will respect the case": "Большая буква имеет значение при активации ключевого слова", "If the entry key consists of only one word, it would not be matched as part of other words": "Если ключевое слово состоит только из одного слова, оно не будет активироваться как часть других слов", - "Open all Entries": "Открыть все Записи", - "Close all Entries": "Закрыть все Записи", + "Open all Entries": "Открыть все записи", + "Close all Entries": "Закрыть все записи", "Create": "Создать", - "Import World Info": "Импортировать Мир", - "Export World Info": "Экспортировать Мир", - "Delete World Info": "Удалить Мир", - "Duplicate World Info": "Дублировать Мир", - "Rename World Info": "Переименовать Мир", + "Import World Info": "Импортировать мир", + "Export World Info": "Экспортировать мир", + "Delete World Info": "Удалить мир", + "Duplicate World Info": "Дублировать мир", + "Rename World Info": "Переименовать мир", "Refresh": "Обновить", "Primary Keywords": "Основные ключевые слова", "Logic": "Логика", @@ -740,74 +739,74 @@ "NOT ALL": "НЕ ВСЕ", "NOT ANY": "НЕ ЛЮБОЙ", "Optional Filter": "Дополнительный фильтр", - "New Entry": "Новая Запись", + "New Entry": "Новая запись", "Fill empty Memo/Titles with Keywords": "Заполните пустые Заметки/Названия ключевыми словами", - "Save changes to a new theme file": "Сохранить изменения в новой теме", + "Save changes to a new theme file": "Сохранить изменения в файл новой темы", "removes blur and uses alternative background color for divs": "убирает размытие и использует альтернативный фон для разделов", "AI Response Formatting": "Формат ответа ИИ", "Change Background Image": "Изменить фон", "Extensions": "Расширения", "Click to set a new User Name": "Нажмите, чтобы задать новое имя пользователя.", - "Click to lock your selected persona to the current chat. Click again to remove the lock.": "Нажмите, чтобы закрепить выбранную персону за текущим чатом. Нажмите еще раз, чтобы снять блокировку.", + "Click to lock your selected persona to the current chat. Click again to remove the lock.": "Нажмите, чтобы закрепить выбранную персону для текущего чата. Нажмите еще раз, чтобы открепить.", "Click to set user name for all messages": "Нажмите, чтобы задать имя пользователя для всех сообщений.", - "Create a dummy persona": "Создать болванку", - "Character Management": "Управление Персонажами", - "Locked = Character Management panel will stay open": "Закреплено = Панель Управление Персонажами останется открытой ", + "Create a dummy persona": "Создать персону-болванку", + "Character Management": "Управление персонажами", + "Locked = Character Management panel will stay open": "Закреплено = Панель управление персонажами останется открытой", "Select/Create Characters": "Выбрать/Создать персонажа", - "Token counts may be inaccurate and provided just for reference.": "Счетчик токенов может быть неточным и используется только для примера", - "Click to select a new avatar for this character": "Нажмите что бы выбрать новый аватар для этого персонажа", + "Token counts may be inaccurate and provided just for reference.": "Счетчик токенов может быть неточным, используйте как ориентир", + "Click to select a new avatar for this character": "Нажмите чтобы выбрать новый аватар для этого персонажа", "Example: [{{user}} is a 28-year-old Romanian cat girl.]": "Пример:\n [{{user}} is a 28-year-old Romanian cat girl.]", "Toggle grid view": "Переключить вид сетки", - "Add to Favorites": "Добавить в Любимые", - "Advanced Definition": "Расширенные Определения", - "Character Lore": "Сведения Персонажа", - "Export and Download": "Экспортировать и Скачать", + "Add to Favorites": "Добавить в Избранное", + "Advanced Definition": "Расширенное определение", + "Character Lore": "Лор персонажа", + "Export and Download": "Экспортировать и скачать", "Duplicate Character": "Дублировать персонажа", "Create Character": "Создать персонажа", "Delete Character": "Удалить персонажа", "View all tags": "Показать все тэги", - "Click to set additional greeting messages": "Нажмите что бы создать дополнительное вступительное сообщение", - "Show / Hide Description and First Message": "Показать/Убрать Описание и Первое сообщение", - "Click to select a new avatar for this group": "Нажмите что бы выбрать новый аватар для этого группового чата", - "Set a group chat scenario": "Создать сценарий для группового чата", - "Restore collage avatar": "Восстановить коллаж персонажа", + "Click to set additional greeting messages": "Нажмите чтобы создать дополнительное вступительное сообщение", + "Show / Hide Description and First Message": "Показать / убрать описание и первое сообщение", + "Click to select a new avatar for this group": "Нажмите чтобы выбрать новый аватар для этой группы", + "Set a group chat scenario": "Задать сценарий для группового чата", + "Restore collage avatar": "Восстановить аватар-коллаж", "Create New Character": "Создать нового персонажа", - "Import Character from File": "Внести персонажа из файла", - "Import content from external URL": "Вставить содержимое из внешнего URL", + "Import Character from File": "Импортировать персонажа из файла", + "Import content from external URL": "Импортировать содержимое из внешнего URL", "Create New Chat Group": "Создать новый групповой чат", - "Characters sorting order": "Упорядовачивание порядка персонажа", - "Add chat injection": "Добавить включение в чат", - "Remove injection": "Убрать включение", + "Characters sorting order": "Порядок сортировки персонажей", + "Add chat injection": "Добавить инжект в чат", + "Remove injection": "Убрать инжект", "Remove": "Убрать", - "Select a World Info file for": "Выбрать файл для Информации Мира", - "Primary Lorebook": "Основной Лорбук", - "A selected World Info will be bound to this character as its own Lorebook.": "Информация Мира будет закреплена на персонажем как собственный Лорбук", - "When generating an AI reply, it will be combined with the entries from a global World Info selector.": "Когда ИИ генерирует ответ, в него будет включены заметки из Информации Мира", - "Exporting a character would also export the selected Lorebook file embedded in the JSON data.": "Скачивание этого персонажа так же будет включать в себя закрепленный за ним Сведения", - "Additional Lorebooks": "Вспомогательные Сведения", - "Associate one or more auxillary Lorebooks with this character.": "Закрепить этот или еще больше вспомогательных Сведений за этим персонажем", - "NOTE: These choices are optional and won't be preserved on character export!": "ВНИМАНИЕ: Эти выборы необязательные и не будут сохранены при экспорте персонажа", + "Select a World Info file for": "Выбрать файл с миром для", + "Primary Lorebook": "Основного лорбука", + "A selected World Info will be bound to this character as its own Lorebook.": "Информация о мире будет привязана к персонажу как его собственный лорбук", + "When generating an AI reply, it will be combined with the entries from a global World Info selector.": "Когда ИИ генерирует ответ, он будет совмещён с записями из глобально выбранного мира", + "Exporting a character would also export the selected Lorebook file embedded in the JSON data.": "При экспорте персонажа вместе с ним также выгрузится выбранный лорбук в виде JSON", + "Additional Lorebooks": "Вспомогательные лорбуки", + "Associate one or more auxillary Lorebooks with this character.": "Привязать к этому персонажу один или больше вспомогательных лорбуков", + "NOTE: These choices are optional and won't be preserved on character export!": "ВНИМАНИЕ: эти выборы необязательные и не будут сохранены при экспорте персонажа!", "Rename chat file": "Переименовать чат", - "Export JSONL chat file": "Создать чат в форме JSONL", - "Download chat as plain text document": "Скачать чат в формте .txt", + "Export JSONL chat file": "Экспортировать чат в формате JSONL", + "Download chat as plain text document": "Скачать чат в формате .txt", "Delete chat file": "Удалить файл этого чата", "Delete tag": "Удалить тэг", "Translate message": "Перевести сообщение", "Generate Image": "Создать изображение", "Narrate": "Повествовать", - "Prompt": "Промт", + "Prompt": "Промпт", "Create Bookmark": "Создать закладку", "Copy": "Скопировать", "Open bookmark chat": "Открыть чат из закладки", "Confirm": "Подтвердить", - "Copy this message": "Скопировать это сообщение", - "Delete this message": "Удалить это сообщение", + "Copy this message": "Скопировать сообщение", + "Delete this message": "Удалить сообщение", "Move message up": "Переместить сообщение вверх", "Move message down": "Переместить сообщение вниз", "Enlarge": "Увеличить", - "Temporarily disable automatic replies from this character": "Временно отключить сообщения от этого персонажа", + "Temporarily disable automatic replies from this character": "Временно отключить автоматические сообщения от этого персонажа", "Enable automatic replies from this character": "Включить автоматическую отправку сообщения этого персонажа", - "Trigger a message from this character": "Активировать сообщение этого персонажа", + "Trigger a message from this character": "Запросить сообщение от этого персонажа", "Move up": "Переместить вверх", "Move down": "Переместить вниз", "View character card": "Посмотреть карточку персонажа", @@ -816,95 +815,95 @@ "Add": "Добавить", "Abort request": "Прекратить генерацию", "Send a message": "Отправить сообщение", - "Ask AI to write your message for you": "Попросить ИИ написать для вас сообщение.", + "Ask AI to write your message for you": "Попросить ИИ написать сообщение за вас", "Continue the last message": "Продолжить текущее сообщение", - "Bind user name to that avatar": "Закрепить имя за этой Персоной", + "Bind user name to that avatar": "Закрепить имя за этим аватаром", "Select this as default persona for the new chats.": "Выберать эту Персону в качестве персоны по умолчанию для новых чатов.", - "Change persona image": "Сменить аватар Персоны.", - "Delete persona": "Удалить Персону.", + "Change persona image": "Сменить аватар персоны", + "Delete persona": "Удалить персону", "Reduced Motion": "Сокращение анимаций", - "Auto-select": "Авто выбор", + "Auto-select": "Авто-выбор", "Automatically select a background based on the chat context": "Автоматический выбор фона в зависимости от контекста чата", "Filter": "Фильтр", - "Exclude message from prompts": "Исключить сообщение из подсказок", + "Exclude message from prompts": "Исключить сообщение из промпта", "Include message in prompts": "Включить сообщение в подсказки", - "Create checkpoint": "Создание контрольной точки", - "Create Branch": "Создать Ветку", + "Create checkpoint": "Создать чекпоинт", + "Create Branch": "Создать ветку", "Embed file or image": "Вставить файл или изображение", - "UI Theme": "Тема пользовательского интерфейса", + "UI Theme": "Тема UI", "This message is invisible for the AI": "Это сообщение невидимо для ИИ", - "Sampler Priority": "Приоритет сэмплера", + "Sampler Priority": "Приоритет сэмплеров", "Ooba only. Determines the order of samplers.": "Только Ooba. Определяет порядок сэмплеров.", "Load default order": "Загрузить стандартный порядок", "Max Tokens Second": "Максимальное количество токенов в секунду", "CFG": "CFG", "No items": "Нет элементов", - "Extras API key (optional)": "Дополнительный ключ API (необязательно)", - "Notify on extension updates": "Уведомлять о обновлениях расширения", - "Toggle character grid view": "Переключить вид сетки персонажа", + "Extras API key (optional)": "Ключ от Extras API (необязательно)", + "Notify on extension updates": "Уведомлять об обновлениях расширений", + "Toggle character grid view": "Изменить вид грида персонажей", "Bulk edit characters": "Массовое редактирование персонажей", "Bulk delete characters": "Массовое удаление персонажей", - "Favorite characters to add them to HotSwaps": "Добавить избранных персонажей в HotSwaps", - "Underlined Text": "Подчеркнутый текст", + "Favorite characters to add them to HotSwaps": "Чтобы включить персонажа в HotSwaps, добавьте его в Избранное", + "Underlined Text": "Подчёркнутый", "Token Probabilities": "Вероятности токенов", "Close chat": "Закрыть чат", "Manage chat files": "Управление файлами чата", "Import Extension From Git Repo": "Импортировать расширение из Git Repository", "Install extension": "Установить расширение", "Manage extensions": "Управление расширениями", - "Tokens persona description": "Описание токенов", + "Tokens persona description": "Токенов", "Most tokens": "Больше всего токенов", "Least tokens": "Меньше всего токенов", "Random": "Случайно", "Skip Example Dialogues Formatting": "Пропустить форматирование примеров диалогов", "Import a theme file": "Импортировать файл темы", "Export a theme file": "Экспортировать файл темы", - "Unlocked Context Size": "Размер разблокированного контекста", - "Display the response bit by bit as it is generated.": "Показывать ответ по битам по мере его генерации.", - "When this is off, responses will be displayed all at once when they are complete.": "Когда это отключено, ответы будут отображаться сразу после завершения.", - "Quick Prompts Edit": "Быстрое редактирование подсказок", - "Enable OpenAI completion streaming": "Включить потоковое завершение OpenAI", + "Unlocked Context Size": "Неограниченный размер контекста", + "Display the response bit by bit as it is generated.": "Выводить текст последовательно по мере его генерации.", + "When this is off, responses will be displayed all at once when they are complete.": "Если параметр выключен, ответы будут отображаться сразу целиком, и только после полного завершения генерации.", + "Quick Prompts Edit": "Быстрое редактирование промптов", + "Enable OpenAI completion streaming": "Включить стриминг OpenAI", "Main": "Главное", - "Utility Prompts": "Подсказки утилиты", + "Utility Prompts": "Служебные промпты", "Add character names": "Добавить имена персонажей", "Send names in the message objects. Helps the model to associate messages with characters.": "Отправить имена в объектах сообщений. Помогает модели ассоциировать сообщения с персонажами.", - "Continue prefill": "Продолжить предварительное заполнение", + "Continue prefill": "Префилл для продолжения", "Continue sends the last message as assistant role instead of system message with instruction.": "Продолжение отправляет последнее сообщение в роли ассистента, а не системное сообщение с инструкцией.", - "Squash system messages": "Объединять системные сообщения", + "Squash system messages": "Склеивать сообщения системыы", "Combines consecutive system messages into one (excluding example dialogues). May improve coherence for some models.": "Объединяет последовательные системные сообщения в одно (за исключением примеров диалогов). Может улучшить согласованность для некоторых моделей.", "Send inline images": "Отправлять встроенные изображения", - "Assistant Prefill": "Предварительное заполнение ассистента", + "Assistant Prefill": "Префилл от ассистента", "Start Claude's answer with...": "Начать ответ Клода с...", - "Use system prompt (Claude 2.1+ only)": "Использовать системную подсказку (только Claude 2.1+)", - "Send the system prompt for supported models. If disabled, the user message is added to the beginning of the prompt.": "Отправлять системную подсказку для поддерживаемых моделей. Если отключено, сообщение пользователя добавляется в начало подсказки.", - "Prompts": "Подсказки", + "Use system prompt (Claude 2.1+ only)": "Использовать системный промпт (только Claude 2.1+)", + "Send the system prompt for supported models. If disabled, the user message is added to the beginning of the prompt.": "Отправлять системный промпт для поддерживаемых моделей. Если отключено, сообщение пользователя добавляется в начало промпта.", + "Prompts": "Промпты", "Total Tokens:": "Всего токенов:", - "Insert prompt": "Вставить подсказку", - "Delete prompt": "Удалить подсказку", - "Import a prompt list": "Импортировать список подсказок", - "Export this prompt list": "Экспортировать этот список подсказок", + "Insert prompt": "Вставить промпт", + "Delete prompt": "Удалить промпт", + "Import a prompt list": "Импортировать список промптов", + "Export this prompt list": "Экспортировать этот список промпт", "Reset current character": "Сбросить текущего персонажа", - "New prompt": "Новая подсказка", - "Tokens": "Токены", - "Want to update?": "Хотите обновить SillyTavern?", + "New prompt": "Новый промпт", + "Tokens": "токенов", + "Want to update?": "Хотите обновиться?", "How to start chatting?": "Как начать общение?", - "Click": "Нажмите ", + "Click": "Нажмите", "and select a": " и выберите", "Chat API": "API чата", - "and pick a character": " и выберите персонажа", + "and pick a character": "и выберите персонажа", "in the chat bar": " в поле чата", "Confused or lost?": "Запутались или потерялись?", "click these icons!": "нажмите на эти значки!", "SillyTavern Documentation Site": "Сайт документации SillyTavern", - "Extras Installation Guide": "Руководство по установке дополнительных возможностей", - "Still have questions?": "Есть еще вопросы?", - "Join the SillyTavern Discord": "Присоединяйтесь к SillyTavern Discord", - "Post a GitHub issue": "Опубликуйте проблему на GitHub", + "Extras Installation Guide": "Руководство по установке Extras", + "Still have questions?": "Остались вопросы?", + "Join the SillyTavern Discord": "Заходите на сервер SillyTavern в Discord", + "Post a GitHub issue": "Опубликуйте GitHub issue", "Contact the developers": "Свяжитесь с разработчиками", - "Nucleus Sampling": "Выборка ядра", - "Typical P": "Типичное P", - "Top K Sampling": "Выборка лучших K", - "Top A Sampling": "Выборка лучших A", + "Nucleus Sampling": "Nucleus Sampling", + "Typical P": "Typical P", + "Top K Sampling": "Top K", + "Top A Sampling": "Top A", "Off": "Выключено", "Very light": "Очень легкий", "Light": "Легкий", @@ -914,6 +913,72 @@ "Eta cutoff is the main parameter of the special Eta Sampling technique. In units of 1e-4; a reasonable value is 3. Set to 0 to disable. See the paper Truncation Sampling as Language Model Desmoothing by Hewitt et al. (2022) for details.": "Отсечение эпсилон - основной параметр специальной техники выборки эпсилон. В единицах 1e-4; разумное значение - 3. Установите в 0, чтобы отключить. См. статью Truncation Sampling as Language Model Desmoothing от Хьюитт и др. (2022) для получения подробной информации.", "Learn how to contribute your idle GPU cycles to the Horde": "Узнайте, как внести свой вклад в свои свободные GPU-циклы в орду", "Use the appropriate tokenizer for Google models via their API. Slower prompt processing, but offers much more accurate token counting.": "Используйте соответствующий токенизатор для моделей Google через их API. Медленная обработка подсказок, но предлагает намного более точный подсчет токенов.", - "Load koboldcpp order": "Загрузить порядок koboldcpp", - "Use Google Tokenizer": "Использовать токенизатор Google" -} \ No newline at end of file + "Load koboldcpp order": "Загрузить порядок из koboldcpp", + "Use Google Tokenizer": "Использовать токенизатор Google", + "koboldcpp API key (optional)": "Ключ от API koboldcpp (необязательно)", + "Reverse Proxy": "Прокси", + "Use Proxy password field instead. This input will be ignored.": "Используйте поле \"Пароль от прокси\". Значение в этом окошке игнорируется", + "Proxy Password": "Пароль от прокси", + "Will be used as a password for the proxy instead of API key.": "Будет использован в качестве пароля от прокси вместо ключа от API", + "Proxy Presets": "Пресеты для прокси", + "Saved addresses and passwords.": "Сохранённые адреса и пароли.", + "Save Proxy": "Сохранить прокси", + "Delete Proxy": "Удалить прокси", + "Proxy Name": "Название прокси", + "This will show up as your saved preset.": "Будет отображено в вашем списке пресетов.", + "Proxy Server URL": "Адрес прокси-сервера", + "MistralAI Model": "Модель MistralAI", + "MistralAI API Key": "Ключ от API MistralAI", + "MakerSuite API Key": "Ключ от API MakerSuite", + "Google Model": "Модель Google", + "Cohere API Key": "Ключ от API Cohere", + "Cohere Model": "Модель Cohere", + "Model Order": "Сортировка моделей OpenRouter", + "Alphabetically": "По алфавиту", + "Price": "По цене (наиболее низкая)", + "Context Size": "По размеру контекста", + "Group by vendors": "Сгруппировать по владельцу", + "Group by vendors Description": "Модели от OpenAI попадут в одну группу, от Anthropic - в другую, и т.д. Можно комбинировать с сортировкой.", + "LEGACY": "УСТАР.", + "Force Instruct Mode formatting": "Включить форматирование для Instruct-режима", + "Force Instruct Mode formatting Description": "Если эта опция включена при активном режиме Instruct, то SillyTavern преобразует промпт в соответствие с настройками расширенного форматирования (кроме системного промпта для instruct). Если опция выключена, промпт форматируется самим OpenRouter.", + "Allow Jailbreak": "Разрешить джейлбрейк", + "System Prompt Wrapping": "Обрамление для системного промпта", + "System Prompt Prefix": "Префикс системного промпта", + "System Prompt Suffix": "Постфикс системного промпта", + "Chat Messages Wrapping": "Обрамление для сообщений в чате", + "User Message Prefix": "Префикс сообщения пользователя", + "User Message Suffix": "Постфикс сообщения пользователя", + "Assistant Message Prefix": "Префикс сообщения ассистента", + "Assistant Message Suffix": "Постфикс сообщения ассистента", + "System Message Prefix": "Префикс сообщения системы", + "System Message Suffix": "Постфикс сообщения системы", + "System same as User": "Для системы то же самое, что и для пользователя", + "Misc. Sequences": "Прочие строки", + "First Assistant Prefix": "Первый префикс ассистента", + "Last Assistant Prefix": "Последний префикс ассистента", + "System Instruction Prefix": "Префикс системной инструкции", + "User Filler Message": "Принудительное сообщение пользователя", + "Permanent": "перманентных", + "Alt. Greetings": "Др. варианты", + "Smooth Streaming": "Плавный стриминг", + "Save checkpoint": "Сохранить чекпоинт", + "Min Activations": "Мин. число активаций", + "Scan chronologically until reached min entries or token budget.": "Сканировать в хронологической последовательности, пока не будет достигнуто мин. число вхождений или не израсходуется бюджет токенов.", + "Max Depth": "Макс. глубина", + "(0 = unlimited, use budget)": "(0 = безграничная, использовать бюджет)", + "Ext. Media": "Внешн. медиа", + "Multiple swipes per generation": "Несколько свайпов на генерацию", + "Set to get deterministic results. Use -1 for random seed.": "Используется для получения предсказуемого результата. Введите -1 для случайного зерна", + "Most tokens have a leading space.": "У большинства токенов в начале пробел.", + "Prompts": "Промпты", + "Text or token ids": "Текст или [идентификаторы токенов]", + "World Info Format Template": "Шаблон форматирования информации о мире", + "Wraps activated World Info entries before inserting into the prompt.": "Дополняет информацию об активном на данный момент мире перед её отправкой в промпт.", + "Doesn't work? Try adding": "Не работает? Попробуйте добавить в конце", + "at the end!": "!", + "Authorize": "Авторизоваться", + "No persona description": "[Нет описания]", + "Not connected to API!": "Нет соединения с API!", + "Type a message, or /? for help": "Введите сообщение, или /? для получения справки по командам" +} diff --git a/public/locales/zh-cn.json b/public/locales/zh-cn.json index ce1d8fa65..d48da734d 100644 --- a/public/locales/zh-cn.json +++ b/public/locales/zh-cn.json @@ -4,122 +4,123 @@ "guikoboldaisettings": "KoboldAI 用户界面设置", "novelaipreserts": "NovelAI 预设", "default": "默认", - "openaipresets": "OpenAI 预设", + "openaipresets": "对话补全预设", "text gen webio(ooba) presets": "WebUI(ooba) 预设", "response legth(tokens)": "响应长度(Token)", "select": "选择", "context size(tokens)": "上下文长度(Token)", "unlocked": "已解锁", - "Only select models support context sizes greater than 4096 tokens. Increase only if you know what you're doing.": "仅选择的模型支持大于 4096 个Token的上下文大小。只有在知道自己在做什么的情况下才增加。", + "Only select models support context sizes greater than 4096 tokens. Increase only if you know what you're doing.": "只有特定的模型支持超过4096 Tokens的上下文长度。仅在你清楚自己在做什么的情况下再增加这个值。", "rep.pen": "重复惩罚", - "WI Entry Status:🔵 Constant🟢 Normal❌ Disabled": "WI 输入状态:\n🔵 恒定\n🟢 正常\n❌ 禁用", + "WI Entry Status:🔵 Constant🟢 Normal❌ Disabled": "条目输入状态:\n🔵 常开\n🟢 触发\n❌ 禁用", "rep.pen range": "重复惩罚范围", "Temperature controls the randomness in token selection": "温度控制Token选择中的随机性:\n- 低温(<1.0)导致更可预测的文本,优先选择高概率的Token。\n- 高温(>1.0)鼓励创造性和输出的多样性,更多地选择低概率的Token。\n将值设置为 1.0 以使用原始概率。", "temperature": "温度", - "Top K sets a maximum amount of top tokens that can be chosen from": "Top K 设置可以从中选择的顶级Token的最大数量。", - "Top P (a.k.a. nucleus sampling)": "Top P(又称核心采样)将所有必需的顶级Token合并到一个特定百分比中。\n换句话说,如果前两个Token代表 25%,而 Top-P 为 0.50,则只考虑这两个Token。\n将值设置为 1.0 以禁用。", - "Typical P Sampling prioritizes tokens based on their deviation from the average entropy of the set": "典型的 P 采样根据它们与集合平均熵的偏差对Token进行优先排序。\n保留概率累积接近指定阈值(例如 0.5)的Token,区分包含平均信息的那些。\n将值设置为 1.0 以禁用。", - "Min P sets a base minimum probability": "Min P 设置基本最小概率。它根据顶级Token的概率进行优化。\n如果顶级Token的概率为 80%,而 Min P 为 0.1,则只考虑概率高于 8% 的Token。\n将值设置为 0 以禁用。", - "Top A sets a threshold for token selection based on the square of the highest token probability": "Top A 根据最高Token概率的平方设置Token选择的阈值。\n如果 Top A 为 0.2,最高Token概率为 50%,则排除概率低于 5% 的Token(0.2 * 0.5^2)。\n将值设置为 0 以禁用。", - "Tail-Free Sampling (TFS)": "无尾采样(TFS)查找分布中概率较低的尾部Token,\n 通过分析Token概率的变化率以及二阶导数。 Token保留到阈值(例如 0.3),取决于统一的二阶导数。\n值越接近 0,被拒绝的Token数量就越多。将值设置为 1.0 以禁用。", - "Epsilon cutoff sets a probability floor below which tokens are excluded from being sampled": "ε 截止设置了一个概率下限,低于该下限的Token将被排除在样本之外。\n以 1e-4 单位;合适的值为 3。将其设置为 0 以禁用。", - "Scale Temperature dynamically per token, based on the variation of probabilities": "根据概率的变化动态地按Token缩放温度。", + "Temperature": "温度", + "Top K sets a maximum amount of top tokens that can be chosen from": "Top K 限定了可供选择的最高概率 Token 的最大数目。", + "Top P (a.k.a. nucleus sampling)": "Top P(又称 nucleus sampling)累加所有需要达到目标百分比的最高概率 Token 。\n例如,如果前两个最高概率标记都是 25%,并且 Top P 设置为 0.50,那么只有这前两个 Token 会被考虑。\n如果将 Top P 设置为 1.0,则表示禁用该功能。", + "Typical P Sampling prioritizes tokens based on their deviation from the average entropy of the set": "典型的 P 采样根据令牌与集合平均熵的偏差来确定令牌的优先级。\n它保留累积概率接近预定义阈值(例如0.5)的令牌,强调那些具有平均信息内容的令牌。\n设置为1.0可禁用该功能。", + "Min P sets a base minimum probability": "最小概率(Min P)设置了一个基本的最小概率。这个概率会根据概率最高的令牌(top token)的概率进行缩放。\n例如,如果概率最高的令牌的概率为80%,且最小概率设置为0.1,则只有概率高于8%的令牌会被考虑。\n将最小概率设置为0可以禁用该功能。", + "Top A sets a threshold for token selection based on the square of the highest token probability": "Top A 根据最高令牌概率的平方设置令牌选择的阈值。\n例如,如果 Top-A 值为0.2,且概率最高的令牌的概率为50%,则概率低于5%(0.2 × 0.5^2)的令牌会被排除在外。\n将 Top A 设置为0可以禁用该功能。", + "Tail-Free Sampling (TFS)": "无尾采样(TFS)查找分布中概率较低的尾部Token,\n 通过分析Token概率的变化率以及二阶导数。Token保留到阈值(例如 0.3),取决于统一的二阶导数。\n值越接近 0,被拒绝的Token数量就越多。将值设置为 1.0 以禁用。", + "Epsilon cutoff sets a probability floor below which tokens are excluded from being sampled": "Epsilon 截止设置了一个概率下限,低于该下限的Token将被排除在样本之外。\n以 1e-4 单位;合适的值为 3。将其设置为 0 以禁用。", + "Scale Temperature dynamically per token, based on the variation of probabilities": "根据概率的变化,动态地调整每个令牌的温度(Temperature)", "Minimum Temp": "最小温度", "Maximum Temp": "最大温度", "Exponent": "指数", "Mirostat Mode": "Mirostat 模式", "Mirostat Tau": "Mirostat Tau", "Mirostat Eta": "Mirostat Eta", - "Variability parameter for Mirostat outputs": "Mirostat 输出的变异性参数。", - "Learning rate of Mirostat": "Mirostat 的学习率。", - "Strength of the Contrastive Search regularization term. Set to 0 to disable CS": "对比搜索正则化项的强度。 将值设置为 0 以禁用 CS。", - "Temperature Last": "最后温度", - "Use the temperature sampler last": "最后使用温度采样器。 通常是合理的。\n当启用时:首先进行潜在Token的选择,然后应用温度来修正它们的相对概率(技术上是对数似然)。\n当禁用时:首先应用温度来修正所有Token的相对概率,然后从中选择潜在Token。\n禁用最后的温度。", - "LLaMA / Mistral / Yi models only": "仅限 LLaMA / Mistral / Yi 模型。 确保首先选择适当的分析师。\n结果中不应出现串。\n每行一个串。 文本或 [Token标识符]。\n许多Token以空格开头。 如果不确定,请使用Token计数器。", + "Variability parameter for Mirostat outputs": "Mirostat 输出的可变性参数", + "Learning rate of Mirostat": "Mirostat 的学习率", + "Strength of the Contrastive Search regularization term. Set to 0 to disable CS": "对比搜索(Contrastive Search)正则化项的强度。设置为 0 可禁用对比搜索。", + "Temperature Last": "温度采样器后置", + "Use the temperature sampler last": "最后再使用温度采样器。这几乎总是明智的做法。\n当启用时:首先对一组合理的令牌进行采样,然后应用温度来调整它们的相对概率(技术上称为对数概率)。\n当禁用时:首先应用温度来调整所有令牌的相对概率,然后从中采样出合理的令牌。\n禁用会提高分布尾部的概率,这往往会增加得到不连贯响应的几率。", + "LLaMA / Mistral / Yi models only": "仅适用于 LLaMA / Mistral / Yi 模型。请确保首先选择适当的分词器。\n每行输入一个你不希望出现在输出中的序列,可以是文本或 [Token ID]。\n大多数Token前面都有一个空格。如果不确定,请使用Token计数器。", "Example: some text [42, 69, 1337]": "例如:\n一些文本\n[42, 69, 1337]", - "Classifier Free Guidance. More helpful tip coming soon": "免费的分类器指导。 更多有用的提示词即将推出。", + "Classifier Free Guidance. More helpful tip coming soon": "免费的分类器指导。更多有用的提示即将推出。", "Scale": "比例", "GBNF Grammar": "GBNF 语法", "Usage Stats": "使用统计", "Click for stats!": "点击查看统计!", "Backup": "备份", - "Backup your personas to a file": "将您的人设备份到文件中", + "Backup your personas to a file": "将我的角色备份到文件中", "Restore": "恢复", - "Restore your personas from a file": "从文件中恢复您的人设", + "Restore your personas from a file": "从文件中恢复我的角色", "Type in the desired custom grammar": "输入所需的自定义语法", "Encoder Rep. Pen.": "编码器重复惩罚", "Smoothing Factor": "平滑系数", - "No Repeat Ngram Size": "无重复 n-gram 大小", + "No Repeat Ngram Size": "无重复n-gram大小", "Min Length": "最小长度", "OpenAI Reverse Proxy": "OpenAI 反向代理", - "Alternative server URL (leave empty to use the default value).": "备用服务器 URL(留空以使用默认值)。", - "Remove your real OAI API Key from the API panel BEFORE typing anything into this box": "在键入任何内容之前,从 API 面板中删除您的真实 OAI API 密钥", - "We cannot provide support for problems encountered while using an unofficial OpenAI proxy": "我们无法为使用非官方 OpenAI 代理时遇到的问题提供支持", + "Alternative server URL (leave empty to use the default value).": "备用服务器URL(留空以使用默认值)。", + "Remove your real OAI API Key from the API panel BEFORE typing anything into this box": "在键入任何内容之前,从API面板中删除您的真实OpenAI API密钥", + "We cannot provide support for problems encountered while using an unofficial OpenAI proxy": "我们无法为使用非官方OpenAI代理时遇到的问题提供支持", "Legacy Streaming Processing": "传统流处理", - "Enable this if the streaming doesn't work with your proxy": "如果流媒体与您的代理不兼容,请启用此选项", + "Enable this if the streaming doesn't work with your proxy": "如果流式传输与您的代理不兼容,请启用此选项", "Context Size (tokens)": "上下文长度(Token)", "Max Response Length (tokens)": "最大回复长度(Token)", - "Frequency Penalty": "Frequency Penalty 频率惩罚", - "Presence Penalty": "Presence Penalty 存在惩罚", - "Top-p": "Top-p", + "Frequency Penalty": "频率惩罚", + "Presence Penalty": "存在惩罚", + "Top-p": "Top P", "Display bot response text chunks as they are generated": "生成时显示机器人响应文本片段", "Top A": "Top A", - "Typical Sampling": "Typical Sampling 典型采样", - "Tail Free Sampling": "Tail Free Sampling 无尾采样", - "Rep. Pen. Slope": "Rep. Pen. Slope 重复惩罚斜率", - "Single-line mode": "Single-line 单行模式", + "Typical Sampling": "典型采样", + "Tail Free Sampling": "无尾采样", + "Rep. Pen. Slope": "重复惩罚斜率", + "Single-line mode": "单行模式", "Top K": "Top K", "Top P": "Top P", "Do Sample": "进行采样", - "Add BOS Token": "添加 BOS Token", - "Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative": "在提示词的开头添加 bos_token。 禁用此功能可以使回复更具创意", - "Ban EOS Token": "禁止 EOS Token", - "Ban the eos_token. This forces the model to never end the generation prematurely": "禁止 eos_token。 这将强制模型永远不会提前结束生成", + "Add BOS Token": "添加BOS Token", + "Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative": "在提示词的开头添加BOS Token。禁用此功能可以使回复更具创意", + "Ban EOS Token": "禁止EOS Token", + "Ban the eos_token. This forces the model to never end the generation prematurely": "禁止EOS Token。这将强制模型永远不会提前结束生成", "Skip Special Tokens": "跳过特殊Token", "Beam search": "束搜索", "Number of Beams": "束数量", "Length Penalty": "长度惩罚", "Early Stopping": "提前停止", "Contrastive search": "对比搜索", - "Penalty Alpha": "惩罚 Alpha", + "Penalty Alpha": "惩罚Alpha", "Seed": "Seed 种子", - "Epsilon Cutoff": "Epsilon Cutoff", - "Eta Cutoff": "Eta Cutoff", + "Epsilon Cutoff": "Epsilon截断", + "Eta Cutoff": "Eta截断", "Negative Prompt": "负面提示词", "Mirostat (mode=1 is only for llama.cpp)": "Mirostat(mode=1 仅用于 llama.cpp)", - "Mirostat is a thermostat for output perplexity": "Mirostat 是输出困惑度的恒温器", - "Add text here that would make the AI generate things you don't want in your outputs.": "在这里添加文本,使 AI 生成您不希望在输出中出现的内容。", + "Mirostat is a thermostat for output perplexity": "Mirostat是控制输出困惑度的恒温器", + "Add text here that would make the AI generate things you don't want in your outputs.": "在此处添加可能导致AI生成你不想要的内容的文本。", "Phrase Repetition Penalty": "短语重复惩罚", "Preamble": "序文", "Use style tags to modify the writing style of the output.": "使用样式标签修改输出的写作风格。", "Banned Tokens": "禁用的Token", - "Sequences you don't want to appear in the output. One per line.": "您不希望出现在输出中的序列。 每行一个。", + "Sequences you don't want to appear in the output. One per line.": "您不希望出现在输出中的序列。每行一个。", "AI Module": "AI 模块", "Changes the style of the generated text.": "更改生成文本的样式。", - "Used if CFG Scale is unset globally, per chat or character": "如果 CFG Scal在全局未设置、它将作用于每个聊天或每个角色", - "Inserts jailbreak as a last system message.": "将 jailbreak 插入为最后一个系统消息。", - "This tells the AI to ignore its usual content restrictions.": "这告诉 AI 忽略其通常的内容限制。", - "NSFW Encouraged": "鼓励 NSFW", - "Tell the AI that NSFW is allowed.": "告诉 AI NSFW 是允许的。", - "NSFW Prioritized": "优先考虑 NSFW", - "NSFW prompt text goes first in the prompt to emphasize its effect.": "NSFW 提示词文本首先出现在提示词中以强调其效果。", - "Streaming": "Streaming 流式传输", - "Dynamic Temperature": "Dynamic Temperature 动态温度", + "Used if CFG Scale is unset globally, per chat or character": "如果CFG Scale未在全局设置,此项将作用于每个聊天或角色", + "Inserts jailbreak as a last system message.": "将jailbreak插入为最后一条系统消息。", + "This tells the AI to ignore its usual content restrictions.": "这告诉AI忽略其通常的内容限制。", + "NSFW Encouraged": "鼓励NSFW", + "Tell the AI that NSFW is allowed.": "告诉AI NSFW是允许的。", + "NSFW Prioritized": "优先NSFW", + "NSFW prompt text goes first in the prompt to emphasize its effect.": "NSFW提示词文本首先出现在提示词中以强调其效果。", + "Streaming": "流式传输", + "Dynamic Temperature": "动态温度", "Restore current preset": "恢复当前预设", - "Neutralize Samplers": "Neutralize Samplers 中和采样器", + "Neutralize Samplers": "中和采样器", "Text Completion presets": "文本补全预设", "Documentation on sampling parameters": "有关采样参数的文档", "Set all samplers to their neutral/disabled state.": "将所有采样器设置为中性/禁用状态。", - "Only enable this if your model supports context sizes greater than 4096 tokens": "仅在您的模型支持大于4096个标记的上下文大小时启用此选项", - "Display the response bit by bit as it is generated": "逐位显示生成的响应", + "Only enable this if your model supports context sizes greater than 4096 tokens": "仅在您的模型支持大于4096 Tokens的上下文长度时启用此选项", + "Display the response bit by bit as it is generated": "随着响应的生成,逐步显示结果", "Generate only one line per request (KoboldAI only, ignored by KoboldCpp).": "每个请求仅生成一行(仅限KoboldAI,KoboldCpp不支持)。", - "Ban the End-of-Sequence (EOS) token (with KoboldCpp, and possibly also other tokens with KoboldAI).": "禁止序列末尾(EOS)标记(与KoboldCpp一起,可能还有其他与KoboldAI的标记)。", - "Good for story writing, but should not be used for chat and instruct mode.": "适用于写故事,但不应用于聊天和指导模式。", + "Ban the End-of-Sequence (EOS) token (with KoboldCpp, and possibly also other tokens with KoboldAI).": "禁用序列结束(EOS)Token(使用KoboldCpp,可能还包括KoboldAI中的其他Token。", + "Good for story writing, but should not be used for chat and instruct mode.": "适合用于故事写作,但不应用于聊天和指令模式。", "Enhance Definitions": "增强定义", - "Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "使用OAI知识库来增强公众人物和已知虚构角色的定义", - "Wrap in Quotes": "用引号括起来", - "Wrap entire user message in quotes before sending.": "在发送之前用引号括起整个用户消息。", - "Leave off if you use quotes manually for speech.": "如果您手动使用引号进行讲话,请省略。", + "Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "使用OpenAI知识库来增强对公众人物和已知虚构角色的定义", + "Wrap in Quotes": "用引号包裹", + "Wrap entire user message in quotes before sending.": "在发送之前用引号包裹整个用户消息。", + "Leave off if you use quotes manually for speech.": "如果您手动使用引号包裹对话,请忽略此项。", "Main prompt": "主提示词", "The main prompt used to set the model behavior": "用于设置模型行为的主提示词", "NSFW prompt": "NSFW提示词", @@ -128,26 +129,26 @@ "Prompt that is used when the Jailbreak toggle is on": "在越狱开关打开时使用的提示词", "Impersonation prompt": "冒名顶替提示词", "Prompt that is used for Impersonation function": "用于冒名顶替功能的提示词", - "Logit Bias": "对数偏差", + "Logit Bias": "对数偏置", "Helps to ban or reenforce the usage of certain words": "有助于禁止或加强某些单词的使用", "View / Edit bias preset": "查看/编辑偏置预设", "Add bias entry": "添加偏置条目", - "Jailbreak activation message": "越狱激活消息", + "Jailbreak activation message": "越狱启用消息", "Message to send when auto-jailbreak is on.": "自动越狱时发送的消息。", "Jailbreak confirmation reply": "越狱确认回复", "Bot must send this back to confirm jailbreak": "机器人必须发送此内容以确认越狱", - "Character Note": "角色注记", + "Character Note": "角色注释", "Influences bot behavior in its responses": "影响机器人在其响应中的行为", "Connect": "连接", "Test Message": "发送测试消息", "API": "API", "KoboldAI": "KoboldAI", - "Use Horde": "使用部落", - "API url": "API地址", - "PygmalionAI/aphrodite-engine": "PygmalionAI/aphrodite-engine(用于OpenAI API的包装器)", - "Register a Horde account for faster queue times": "注册Horde部落帐户以加快排队时间", - "Learn how to contribute your idle GPU cycles to the Hord": "了解如何将闲置的GPU周期贡献给部落", - "Adjust context size to worker capabilities": "根据工作人员的能力调整上下文大小", + "Use Horde": "使用 Horde", + "API url": "API URL", + "PygmalionAI/aphrodite-engine": "PygmalionAI/aphrodite-engine (OpenAI API wrapper 模式)", + "Register a Horde account for faster queue times": "注册Horde帐户以减少排队时间", + "Learn how to contribute your idle GPU cycles to the Hord": "了解如何将闲置的GPU算力贡献给Horde", + "Adjust context size to worker capabilities": "根据工作人员的能力调整上下文长度", "Adjust response length to worker capabilities": "根据工作人员的能力调整响应长度", "API key": "API密钥", "Tabby API key": "Tabby API密钥", @@ -168,7 +169,7 @@ "For privacy reasons": "出于隐私考虑", "Models": "模型", "Hold Control / Command key to select multiple models.": "按住Control / Command键选择多个模型。", - "Horde models not loaded": "部落模型未加载", + "Horde models not loaded": "Horde模型未加载", "Not connected...": "未连接...", "Novel API key": "Novel AI API密钥", "Follow": "跟随", @@ -181,16 +182,16 @@ "Make sure you run it with": "确保您用以下方式运行它", "flag": "标志", "API key (optional)": "API密钥(可选)", - "Server url": "服务器地址", + "Server url": "服务器URL", "Custom model (optional)": "自定义模型(可选)", "Bypass API status check": "绕过API状态检查", "Mancer AI": "Mancer AI", "Use API key (Only required for Mancer)": "使用API密钥(仅Mancer需要)", - "Blocking API url": "阻止API地址", + "Blocking API url": "阻止API URL", "Example: 127.0.0.1:5000": "示例:127.0.0.1:5000", "Legacy API (pre-OAI, no streaming)": "传统API(OAI之前,无流式传输)", "Bypass status check": "绕过状态检查", - "Streaming API url": "流式API地址", + "Streaming API url": "流式传输API地址", "Example: ws://127.0.0.1:5005/api/v1/stream": "示例:ws://127.0.0.1:5005/api/v1/stream", "Mancer API key": "Mancer API密钥", "Example: https://neuro.mancer.tech/webui/MODEL/api": "示例:https://neuro.mancer.tech/webui/MODEL/api", @@ -209,36 +210,36 @@ "View API Usage Metrics": "查看API使用指标", "Show External models (provided by API)": "显示外部模型(由API提供)", "Bot": "机器人", - "Allow fallback routes": "允许后备路由", + "Allow fallback routes": "允许路由回退", "Allow fallback routes Description": "如果所选模型无法响应您的请求,则自动选择备用模型。", "OpenRouter API Key": "OpenRouter API密钥", "Connect to the API": "连接到API", "OpenRouter Model": "OpenRouter模型", - "View Remaining Credits": "查看剩余信用额", + "View Remaining Credits": "查看剩余额度", "Click Authorize below or get the key from": "点击下方授权或从以下位置获取密钥", "Auto-connect to Last Server": "自动连接到上次的服务器", "View hidden API keys": "查看隐藏的API密钥", - "Advanced Formatting": "高级格式设置", + "Advanced Formatting": "高级格式化设置", "Context Template": "上下文模板", "AutoFormat Overrides": "自动格式覆盖", - "Disable description formatting": "禁用描述格式", - "Disable personality formatting": "禁用人格格式", - "Disable scenario formatting": "禁用情景格式", - "Disable example chats formatting": "禁用示例聊天格式", - "Disable chat start formatting": "禁用聊天开始格式", + "Disable description formatting": "禁用描述格式化", + "Disable personality formatting": "禁用人格格式化", + "Disable scenario formatting": "禁用情景格式化", + "Disable example chats formatting": "禁用示例聊天格式化", + "Disable chat start formatting": "禁用聊天开始格式化", "Custom Chat Separator": "自定义聊天分隔符", - "Replace Macro in Custom Stopping Strings": "自定义停止字符串替换宏", + "Replace Macro in Custom Stopping Strings": "在自定义停止字符串中替换宏", "Strip Example Messages from Prompt": "从提示词中删除示例消息", - "Story String": "Story String 故事字符串", + "Story String": "故事字符串", "Example Separator": "示例分隔符", "Chat Start": "聊天开始", - "Activation Regex": "激活正则表达式", - "Instruct Mode": "指导模式", - "Wrap Sequences with Newline": "用换行符包装序列", + "Activation Regex": "启用正则表达式", + "Instruct Mode": "指令模式", + "Wrap Sequences with Newline": "用换行符包裹序列", "Include Names": "包括名称", - "Force for Groups and Personas": "强制适配群组和人物", + "Force for Groups and Personas": "强制适用于群聊和我的角色", "System Prompt": "系统提示词", - "Instruct Mode Sequences": "Instruct Mode Sequences 指导模式序列", + "Instruct Mode Sequences": "指令模式序列", "Input Sequence": "输入序列", "Output Sequence": "输出序列", "First Output Sequence": "第一个输出序列", @@ -246,7 +247,7 @@ "System Sequence Prefix": "系统序列前缀", "System Sequence Suffix": "系统序列后缀", "Stop Sequence": "停止序列", - "Context Formatting": "上下文格式", + "Context Formatting": "上下文格式化", "(Saved to Context Template)": "(保存到上下文模板)", "Tokenizer": "分词器", "None / Estimated": "无 / 估计", @@ -256,11 +257,11 @@ "Always add character's name to prompt": "始终将角色名称添加到提示词", "Use as Stop Strings": "用作停止字符串", "Bind to Context": "绑定到上下文", - "Generate only one line per request": "每个请求只生成一行", + "Generate only one line per request": "每次请求只生成一行", "Misc. Settings": "其他设置", "Auto-Continue": "自动继续", "Collapse Consecutive Newlines": "折叠连续的换行符", - "Allow for Chat Completion APIs": "允许聊天完成API", + "Allow for Chat Completion APIs": "允许对话补全API", "Target length (tokens)": "目标长度(Token)", "Keep Example Messages in Prompt": "在提示词中保留示例消息", "Remove Empty New Lines from Output": "从输出中删除空行", @@ -272,7 +273,7 @@ "Style then Character": "样式然后角色", "Character Anchor": "角色锚点", "Style Anchor": "样式锚点", - "World Info": "世界信息", + "World Info": "世界书", "Scan Depth": "扫描深度", "Case-Sensitive": "区分大小写", "Match Whole Words": "匹配整个单词", @@ -280,7 +281,7 @@ "Yes": "是", "No": "否", "Context %": "上下文百分比", - "Budget Cap": "预算上限", + "Budget Cap": "Token预算上限", "(0 = disabled)": "(0 = 禁用)", "depth": "深度", "Token Budget": "Token预算", @@ -289,7 +290,7 @@ "None": "无", "User Settings": "用户设置", "UI Mode": "UI 模式", - "UI Language": "语言", + "UI Language": "UI 语言", "MovingUI Preset": "MovingUI 预设", "UI Customization": "UI 自定义", "Avatar Style": "头像样式", @@ -301,8 +302,8 @@ "Bubbles": "气泡", "No Blur Effect": "禁用模糊效果", "No Text Shadows": "禁用文本阴影", - "Waifu Mode": "AI老婆模式", - "Message Timer": "AI回复消息计时器", + "Waifu Mode": "视觉小说模式", + "Message Timer": "AI回复计时器", "Model Icon": "模型图标", "# of messages (0 = disabled)": "消息数量(0 = 禁用)", "Advanced Character Search": "高级角色搜索", @@ -310,7 +311,7 @@ "Allow {{user}}: in bot messages": "在机器人消息中允许 {{user}}:", "Show tags in responses": "在响应中显示标签", "Aux List Field": "辅助列表字段", - "Lorebook Import Dialog": "Lorebook 导入对话框", + "Lorebook Import Dialog": "世界书导入对话框", "MUI Preset": "可移动UI 预设", "If set in the advanced character definitions, this field will be displayed in the characters list.": "如果在高级角色定义中设置,此字段将显示在角色列表中。", "Relaxed API URLS": "宽松的API URL", @@ -319,10 +320,10 @@ "Mancer Model": "Mancer 模型", "API Type": "API 类型", "Aphrodite API key": "Aphrodite API 密钥", - "Relax message trim in Groups": "放松群组中的消息修剪", + "Relax message trim in Groups": "宽松的群聊消息修剪", "Characters Hotswap": "收藏角色卡置顶显示", "Request token probabilities": "请求Token概率", - "Movable UI Panels": "可移动的 UI 面板", + "Movable UI Panels": "可移动UI 面板", "Reset Panels": "重置面板", "UI Colors": "UI 颜色", "Main Text": "主要文本", @@ -362,15 +363,15 @@ "System Backgrounds": "系统背景", "Name": "名称", "Your Avatar": "您的头像", - "Extensions API:": "扩展 API地址:", - "SillyTavern-extras": "SillyTavern-额外功能", + "Extensions API:": "扩展API地址:", + "SillyTavern-extras": "SillyTavern扩展", "Auto-connect": "自动连接", - "Active extensions": "激活扩展", + "Active extensions": "启用扩展", "Extension settings": "扩展设置", "Description": "描述", "First message": "第一条消息", - "Group Controls": "群组控制", - "Group reply strategy": "群组回复策略", + "Group Controls": "群聊控制", + "Group reply strategy": "群聊回复策略", "Natural order": "自然顺序", "List order": "列表顺序", "Allow self responses": "允许自我回复", @@ -385,42 +386,42 @@ "A brief description of the personality": "个性的简要描述", "Scenario": "情景", "Circumstances and context of the dialogue": "对话的情况和背景", - "Talkativeness": "健谈", + "Talkativeness": "健谈度", "How often the chracter speaks in": "角色在其中讲话的频率", "group chats!": "群聊中!", "Shy": "害羞", - "Normal": "正常", + "Normal": "普通", "Chatty": "话多", "Examples of dialogue": "对话示例", "Forms a personality more clearly": "更清晰地形成个性", "Save": "保存", - "World Info Editor": "世界信息编辑器", + "World Info Editor": "世界书编辑器", "New summary": "新摘要", "Export": "导出", "Delete World": "删除世界", "Chat History": "聊天记录", - "Group Chat Scenario Override": "群组聊天情景替代", - "All group members will use the following scenario text instead of what is specified in their character cards.": "所有群组成员将使用以下情景文本,而不是在其角色卡中指定的内容。", + "Group Chat Scenario Override": "群聊情景覆盖", + "All group members will use the following scenario text instead of what is specified in their character cards.": "所有群聊成员将使用以下情景文本,而不是在其角色卡中指定的内容。", "Keywords": "关键词", "Separate with commas": "用逗号分隔", - "Secondary Required Keywords": "次要必需关键词", + "Secondary Required Keywords": "第二个必需关键词", "Content": "内容", "What this keyword should mean to the AI": "这个关键词对 AI 的含义", "Memo/Note": "备忘录/注释", "Not sent to AI": "不发送给 AI", "Constant": "常量", "Selective": "选择性", - "Before Char": "角色之前", - "After Char": "角色之后", + "Before Char": "角色定义之前", + "After Char": "角色定义之后", "Insertion Order": "插入顺序", - "Tokens:": "Token:", + "Tokens:": "Tokens:", "Disable": "禁用", "${characterName}": "${角色名称}", "CHAR": "角色", "is typing": "正在输入...", "Back to parent chat": "返回到父级聊天", "Save bookmark": "保存书签", - "Convert to group": "转换为群组", + "Convert to group": "转换为群聊", "Start new chat": "开始新聊天", "View past chats": "查看过去的聊天记录", "Delete messages": "删除消息", @@ -437,13 +438,13 @@ "NSFW avoidance prompt": "禁止 NSFW 提示词", "Prompt that is used when the NSFW toggle is off": "NSFW 开关关闭时使用的提示词", "Advanced prompt bits": "高级提示词位", - "World Info format": "世界信息格式", - "Wraps activated World Info entries before inserting into the prompt. Use {0} to mark a place where the content is inserted.": "在插入到提示词中之前包装激活的世界信息条目。使用 {0} 标记内容插入的位置。", - "Unrestricted maximum value for the context slider": "AI可见的最大上下文长度", - "Chat Completion Source": "聊天补全来源", + "World Info format": "世界书格式", + "Wraps activated World Info entries before inserting into the prompt. Use {0} to mark a place where the content is inserted.": "在插入到提示词中之前包裹启用的世界书条目。使用 {0} 标记内容插入的位置。", + "Unrestricted maximum value for the context slider": "上下文长度滑块的最大值无限制,仅在你知道自己在做什么的情况下才启用。", + "Chat Completion Source": "对话补全来源", "Avoid sending sensitive information to the Horde.": "避免向 Horde 发送敏感信息。", "Review the Privacy statement": "查看隐私声明", - "Learn how to contribute your idel GPU cycles to the Horde": "了解如何将您的空闲 GPU 周期贡献给 Horde", + "Learn how to contribute your idel GPU cycles to the Horde": "了解如何将您的空闲 GPU 算力贡献给 Horde", "Trusted workers only": "仅信任的工作人员", "For privacy reasons, your API key will be hidden after you reload the page.": "出于隐私原因,重新加载页面后您的 API 密钥将被隐藏。", "-- Horde models not loaded --": "-- Horde 模型未加载 --", @@ -451,9 +452,9 @@ "No connection...": "没有连接...", "Get your NovelAI API Key": "获取您的 NovelAI API 密钥", "KoboldAI Horde": "KoboldAI Horde", - "Text Gen WebUI (ooba)": "文本生成 WebUI(ooba)", + "Text Gen WebUI (ooba)": "Text Gen WebUI(ooba)", "NovelAI": "NovelAI", - "Chat Completion (OpenAI, Claude, Window/OpenRouter, Scale)": "聊天补全(OpenAI、Claude、Window/OpenRouter、Scale)", + "Chat Completion (OpenAI, Claude, Window/OpenRouter, Scale)": "对话补全(OpenAI、Claude、Window/OpenRouter、Scale)", "OpenAI API key": "OpenAI API 密钥", "Trim spaces": "修剪空格", "Trim Incomplete Sentences": "修剪不完整的句子", @@ -464,16 +465,16 @@ "Separator": "分隔符", "Start Reply With": "以...开始回复", "Show reply prefix in chat": "在聊天中显示回复前缀", - "Worlds/Lorebooks": "世界/传说书", - "Active World(s)": "活动世界", - "Activation Settings": "激活配置", - "Character Lore Insertion Strategy": "角色传说插入策略", + "Worlds/Lorebooks": "世界书/传说书", + "Active World(s)": "当前启用的世界书", + "Activation Settings": "启用配置", + "Character Lore Insertion Strategy": "角色世界书条目插入策略", "Sorted Evenly": "均匀排序", "Active World(s) for all chats": "已启用的世界书(全局有效)", - "-- World Info not found --": "-- 未找到世界信息 --", + "-- World Info not found --": "-- 未找到世界书 --", "--- Pick to Edit ---": "--- 选择以编辑 ---", "or": "或", - "New": "新", + "New": "新建", "Priority": "优先级", "Custom": "自定义", "Title A-Z": "标题 A-Z", @@ -486,23 +487,23 @@ "Order ↘": "顺序 ↘", "UID ↗": "UID ↗", "UID ↘": "UID ↘", - "Trigger% ↗": "触发器% ↗", - "Trigger% ↘": "触发器% ↘", + "Trigger% ↗": "触发频率% ↗", + "Trigger% ↘": "触发频率% ↘", "Order:": "顺序:", "Depth:": "深度:", - "Character Lore First": "角色传说优先", - "Global Lore First": "全局传说优先", + "Character Lore First": "角色世界书优先", + "Global Lore First": "全局世界书优先", "Recursive Scan": "递归扫描", "Case Sensitive": "区分大小写", "Match whole words": "完整匹配单词", "Alert On Overflow": "溢出警报", - "World/Lore Editor": "世界/传说编辑器", + "World/Lore Editor": "世界书编辑器", "--- None ---": "--- 无 ---", "Use Probability": "使用概率", - "Exclude from recursion": "排除递归", + "Exclude from recursion": "从递归中排除", "Entry Title/Memo": "条目标题/备忘录", "Position:": "位置:", - "T_Position": "↑Char:在角色定义之前\n↓Char:在角色定义之后\n↑AN:在作者注释之前\n↓AN:在作者注释之后\n@D:在深度处", + "T_Position": "↑Char:在角色定义之前\n↓Char:在角色定义之后\n↑AN:在作者注释之前\n↓AN:在作者注释之后\n@D:在深度D处", "Before Char Defs": "角色定义之前", "After Char Defs": "角色定义之后", "Before AN": "作者注释之前", @@ -512,7 +513,7 @@ "Probability:": "概率:", "Update a theme file": "更新主题文件", "Save as a new theme": "另存为新主题", - "Minimum number of blacklisted words detected to trigger an auto-swipe": "检测到触发自动滑动的黑名单词语的最小数量", + "Minimum number of blacklisted words detected to trigger an auto-swipe": "触发自动滑动的检测到的黑名单词汇的最小数量", "Delete Entry": "删除条目", "User Message Blur Tint": "用户消息模糊色调", "AI Message Blur Tint": "AI 消息模糊色调", @@ -522,7 +523,7 @@ "Mad Lab Mode": "疯狂实验室模式", "Show Message Token Count": "显示消息Token计数", "Compact Input Area (Mobile)": "紧凑输入区域(移动端)", - "Zen Sliders": "禅滑块", + "Zen Sliders": "禅意滑块", "UI Border": "UI 边框", "Chat Style:": "聊天风格:", "Chat Width (PC)": "聊天宽度(PC)", @@ -535,18 +536,18 @@ "Message IDs": "显示消息编号", "Prefer Character Card Prompt": "角色卡提示词优先", "Prefer Character Card Jailbreak": "角色卡越狱优先", - "Press Send to continue": "按发送键继续", + "Press Send to continue": "按发送键以继续", "Quick 'Continue' button": "快速“继续”按钮", "Log prompts to console": "将提示词记录到控制台", "Never resize avatars": "不调整头像大小", "Show avatar filenames": "显示头像文件名", "Import Card Tags": "导入卡片标签", - "Confirm message deletion": "确认删除消息", + "Confirm message deletion": "删除消息前确认", "Spoiler Free Mode": "隐藏角色卡信息", "Auto-swipe": "自动滑动", "Minimum generated message length": "生成的消息的最小长度", - "Blacklisted words": "黑名单词语", - "Blacklisted word count to swipe": "滑动的黑名单词语数量", + "Blacklisted words": "黑名单词汇", + "Blacklisted word count to swipe": "滑动的黑名单词汇数量", "Reload Chat": "重新加载聊天", "Search Settings": "搜索设置", "Disabled": "已禁用", @@ -571,8 +572,8 @@ "Show tagged character folders in the character list": "在角色列表中显示已标记的角色文件夹", "Play a sound when a message generation finishes": "当消息生成完成时播放声音", "Only play a sound when ST's browser tab is unfocused": "仅在ST的浏览器选项卡未聚焦时播放声音", - "Reduce the formatting requirements on API URLs": "减少API URL的格式要求", - "Ask to import the World Info/Lorebook for every new character with embedded lorebook. If unchecked, a brief message will be shown instead": "询问是否为每个具有嵌入式传说书的新角色导入世界信息/传说书。如果未选中,则会显示简短的消息", + "Reduce the formatting requirements on API URLs": "减少API URL的格式化要求", + "Ask to import the World Info/Lorebook for every new character with embedded lorebook. If unchecked, a brief message will be shown instead": "询问是否为每个具有嵌入的世界书的新角色导入世界书。如果未选中,则会显示简短的消息", "Restore unsaved user input on page refresh": "在页面刷新时恢复未保存的用户输入", "Allow repositioning certain UI elements by dragging them. PC only, no effect on mobile": "允许通过拖动重新定位某些UI元素。仅适用于PC,对移动设备无影响", "MovingUI preset. Predefined/saved draggable positions": "MovingUI预设。预定义/保存的可拖动位置", @@ -600,20 +601,20 @@ "Reload and redraw the currently open chat": "重新加载和重绘当前打开的聊天", "Auto-Expand Message Actions": "自动展开消息操作菜单", "Not Connected": "未连接", - "Persona Management": "角色管理", - "Persona Description": "角色描述", - "Your Persona": "您的角色", - "Show notifications on switching personas": "切换角色时显示通知", + "Persona Management": "我的角色管理", + "Persona Description": "我的角色描述", + "Your Persona": "我的角色", + "Show notifications on switching personas": "切换我的角色时显示通知", "Blank": "空白", - "In Story String / Chat Completion: Before Character Card": "故事模式/聊天补全模式:在角色卡之前", - "In Story String / Chat Completion: After Character Card": "故事模式/聊天补全模式:在角色卡之后", + "In Story String / Chat Completion: Before Character Card": "故事模式/对话补全模式:在角色卡之前", + "In Story String / Chat Completion: After Character Card": "故事模式/对话补全模式:在角色卡之后", "In Story String / Prompt Manager": "在故事字符串/提示词管理器", - "Top of Author's Note": "作者注的顶部", - "Bottom of Author's Note": "作者注的底部", + "Top of Author's Note": "作者注释的顶部", + "Bottom of Author's Note": "作者注释的底部", "How do I use this?": "怎样使用?", "More...": "更多...", - "Link to World Info": "链接到世界信息", - "Import Card Lore": "导入卡片知识", + "Link to World Info": "链接到世界书", + "Import Card Lore": "导入人物卡的世界书", "Scenario Override": "场景覆盖", "Rename": "重命名", "Character Description": "角色描述", @@ -627,13 +628,13 @@ "Most chats": "最多聊天", "Least chats": "最少聊天", "Back": "返回", - "Prompt Overrides (For OpenAI/Claude/Scale APIs, Window/OpenRouter, and Instruct mode)": "提示词覆盖(适用于OpenAI/Claude/Scale API、Window/OpenRouter和Instruct模式)", + "Prompt Overrides (For OpenAI/Claude/Scale APIs, Window/OpenRouter, and Instruct mode)": "提示词覆盖(适用于OpenAI/Claude/Scale API、Window/OpenRouter和指令模式)", "Insert {{original}} into either box to include the respective default prompt from system settings.": "将{{original}}插入到任一框中,以包含系统设置中的相应默认提示词。", "Main Prompt": "主要提示词", "Jailbreak": "越狱", "Creator's Metadata (Not sent with the AI prompt)": "创作者的元数据(不与AI提示词一起发送)", "Everything here is optional": "这里的一切都是可选的", - "Created by": "作者", + "Created by": "创作者", "Character Version": "角色版本", "Tags to Embed": "嵌入的标签", "How often the character speaks in group chats!": "角色在群聊中说话的频率!", @@ -642,7 +643,7 @@ "Samplers Order": "采样器顺序", "Samplers will be applied in a top-down order. Use with caution.": "采样器将按自上而下的顺序应用。请谨慎使用。", "Repetition Penalty": "重复惩罚", - "Rep. Pen. Range.": "重复惩罚范围。", + "Rep. Pen. Range.": "重复惩罚范围", "Rep. Pen. Freq.": "重复惩罚频率", "Rep. Pen. Presence": "重复惩罚存在", "Enter it in the box below:": "在下面的框中输入它:", @@ -651,9 +652,9 @@ "Suggest replies": "建议回复", "Show suggested replies. Not all bots support this.": "显示建议的回复。并非所有机器人都支持此功能。", "Use 'Unlocked Context' to enable chunked generation.": "使用'Unlocked Context'启用分块生成。", - "It extends the context window in exchange for reply generation speed.": "它扩展了上下文窗口,以换取回复生成速度。", + "It extends the context window in exchange for reply generation speed.": "它以回复生成速度为代价,扩展了上下文窗口", "Continue": "继续", - "CFG Scale": "CFG规模", + "CFG Scale": "CFG Scale", "Editing:": "编辑:", "AI reply prefix": "AI回复前缀", "Custom Stopping Strings": "自定义停止字符串", @@ -664,8 +665,8 @@ "Enter your name": "输入您的名字", "Name this character": "为这个角色命名", "Search / Create Tags": "搜索/创建标签", - "Describe your character's physical and mental traits here.": "在这里描述您角色的身体和精神特征。", - "This will be the first message from the character that starts every chat.": "这将是每次开始的角色的第一条消息。", + "Describe your character's physical and mental traits here.": "在这里描述您角色的身体和心理特征。", + "This will be the first message from the character that starts every chat.": "这将是每次开始对话时角色的第一条消息。", "Chat Name (Optional)": "聊天名称(可选)", "Filter...": "过滤...", "Search...": "搜索...", @@ -674,10 +675,10 @@ "(Botmaker's name / Contact Info)": "(机器人制作者的姓名/联系信息)", "(If you want to track character versions)": "(如果您想跟踪角色版本)", "(Describe the bot, give use tips, or list the chat models it has been tested on. This will be displayed in the character list.)": "(描述机器人,提供使用技巧,或列出已经测试过的聊天模型。这将显示在角色列表中。)", - "(Write a comma-separated list of tags)": "(编写逗号分隔的标签列表)", + "(Write a comma-separated list of tags)": "(编写一个以逗号分隔的标签列表。)", "(A brief description of the personality)": "(性格的简要描述)", "(Circumstances and context of the interaction)": "(交互的情况和背景)", - "(Examples of chat dialog. Begin each example with START on a new line.)": "(聊天对话的示例。每个示例都以新行上的START开头。)", + "(Examples of chat dialog. Begin each example with START on a new line.)": "(聊天对话的示例,每个示例都另起一行以开头。)", "Injection text (supports parameters)": "注入文本(支持参数)", "Injection depth": "注入深度", "Type here...": "在此处输入...", @@ -687,23 +688,23 @@ "Filter to Character(s)": "过滤到角色", "Character Exclusion": "角色排除", "Inclusion Group": "包含组", - "Only one entry with the same label will be activated": "只有一个带有相同标签的条目将被激活", + "Only one entry with the same label will be activated": "只有一个带有相同标签的条目将被启用", "-- Characters not found --": "-- 未找到角色 --", "Not sent to the AI": "不发送到AI", - "(This will be the first message from the character that starts every chat)": "(这将是每次开始的角色的第一条消息)", + "(This will be the first message from the character that starts every chat)": "(这将是每次开始对话时角色的第一条消息。)", "Not connected to API!": "未连接到API!", "AI Response Configuration": "AI响应配置", - "AI Configuration panel will stay open": "AI配置面板将保持打开状态", + "AI Configuration panel will stay open": "AI配置面板将保持打开", "Update current preset": "更新当前预设", "Create new preset": "创建新预设", "Import preset": "导入预设", "Export preset": "导出预设", "Delete the preset": "删除预设", - "Auto-select this preset for Instruct Mode": "自动选择此预设以进行指示模式", + "Auto-select this preset for Instruct Mode": "为指令模式自动选择此预设", "Auto-select this preset on API connection": "在API连接时自动选择此预设", "NSFW block goes first in the resulting prompt": "结果提示词中首先是NSFW块", - "Enables OpenAI completion streaming": "启用OpenAI完成流", - "Wrap user messages in quotes before sending": "在发送之前将用户消息用引号括起来", + "Enables OpenAI completion streaming": "启用OpenAI补全流式传输", + "Wrap user messages in quotes before sending": "在发送之前将用户消息用引号包裹起来", "Restore default prompt": "恢复默认提示词", "New preset": "新预设", "Delete preset": "删除预设", @@ -711,56 +712,56 @@ "Restore default reply": "恢复默认回复", "Restore defaul note": "恢复默认备注", "API Connections": "API连接", - "Can help with bad responses by queueing only the approved workers. May slowdown the response time.": "可以通过仅排队批准的工作人员来帮助处理不良响应。可能会减慢响应时间。", + "Can help with bad responses by queueing only the approved workers. May slowdown the response time.": "可以通过仅将批准的工作人员加入排队来帮助处理不良响应。可能会延长响应时间。", "Clear your API key": "清除您的API密钥", "Refresh models": "刷新模型", - "Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai": "使用OAuth流程获取您的OpenRouter APIToken。您将被重定向到openrouter.ai", - "Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!": "通过发送简短的测试消息验证您的API连接。请注意,您将因此而获得信用!", - "Create New": "创建新", + "Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai": "使用OAuth流程获取您的OpenRouter API Token。您将被重定向到openrouter.ai", + "Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!": "通过发送简短的测试消息验证您的API连接。请注意,这也将被纳入计费!", + "Create New": "新建", "Edit": "编辑", - "Locked = World Editor will stay open": "锁定=世界编辑器将保持打开状态", - "Entries can activate other entries by mentioning their keywords": "条目可以通过提及它们的关键字来激活其他条目", + "Locked = World Editor will stay open": "锁定 = 世界书编辑器将保持打开状态", + "Entries can activate other entries by mentioning their keywords": "条目可以通过提及对应的关键字来启用其他条目", "Lookup for the entry keys in the context will respect the case": "在上下文中查找条目键将保持大小写敏感", "If the entry key consists of only one word, it would not be matched as part of other words": "如果条目键只由一个单词组成,则不会作为其他单词的一部分匹配", "Open all Entries": "打开所有条目", "Close all Entries": "关闭所有条目", "Create": "创建", - "Import World Info": "导入世界信息", - "Export World Info": "导出世界信息", - "Delete World Info": "删除世界信息", - "Duplicate World Info": "复制世界信息", - "Rename World Info": "重命名世界信息", + "Import World Info": "导入世界书", + "Export World Info": "导出世界书", + "Delete World Info": "删除世界书", + "Duplicate World Info": "复制世界书", + "Rename World Info": "重命名世界书", "Refresh": "刷新", "Primary Keywords": "主要关键字", "Logic": "逻辑", - "AND ANY": "和任意", - "AND ALL": "和所有", - "NOT ALL": "不是所有", - "NOT ANY": "没有任何", + "AND ANY": "与任意", + "AND ALL": "与所有", + "NOT ALL": "非所有", + "NOT ANY": "非任何", "Optional Filter": "可选过滤器", "New Entry": "新条目", "Fill empty Memo/Titles with Keywords": "使用关键字填充空的备忘录/标题", "Save changes to a new theme file": "将更改保存到新的主题文件", "removes blur and uses alternative background color for divs": "消除模糊并为div使用替代背景颜色", - "AI Response Formatting": "AI响应格式", + "AI Response Formatting": "AI响应格式化", "Change Background Image": "更改背景图片", - "Extensions": "扩展管理", + "Extensions": "扩展", "Click to set a new User Name": "点击设置新的用户名", - "Click to lock your selected persona to the current chat. Click again to remove the lock.": "单击以将您选择的角色锁定到当前聊天。再次单击以移除锁定。", + "Click to lock your selected persona to the current chat. Click again to remove the lock.": "单击以将您选择的我的角色锁定到当前聊天。再次单击以移除锁定。", "Click to set user name for all messages": "点击为所有消息设置用户名", - "Create a dummy persona": "创建虚拟角色", + "Create a dummy persona": "创建虚拟我的角色", "Character Management": "角色管理", - "Locked = Character Management panel will stay open": "已锁定=角色管理面板将保持打开状态", + "Locked = Character Management panel will stay open": "已锁定 = 角色管理面板将保持打开状态", "Select/Create Characters": "选择/创建角色", "Token counts may be inaccurate and provided just for reference.": "Token计数可能不准确,仅供参考。", "Click to select a new avatar for this character": "单击以为此角色选择新的头像", - "Example: [{{user}} is a 28-year-old Romanian cat girl.]": "示例:[{{user}}是一个28岁的罗马尼亚猫女孩。]", + "Example: [{{user}} is a 28-year-old Romanian cat girl.]": "示例:[{{user}}是一个28岁的罗马尼亚猫娘。]", "Toggle grid view": "切换网格视图", "Add to Favorites": "添加到收藏夹", "Advanced Definition": "高级定义", - "Character Lore": "角色传说", + "Character Lore": "角色世界书", "Export and Download": "导出并下载", - "Duplicate Character": "复制角色", + "Duplicate Character": "创建角色副本", "Create Character": "创建角色", "Delete Character": "删除角色", "View all tags": "查看所有标签", @@ -769,22 +770,22 @@ "Click to select a new avatar for this group": "单击以为该组选择新的头像", "Set a group chat scenario": "设置群组聊天场景", "Restore collage avatar": "恢复拼贴头像", - "Create New Character": "创建新角色", + "Create New Character": "新建角色", "Import Character from File": "从文件导入角色", "Import content from external URL": "从外部URL导入内容", - "Create New Chat Group": "创建新的聊天组", + "Create New Chat Group": "创建新的群聊", "Characters sorting order": "角色排序顺序", "Add chat injection": "添加聊天注入", "Remove injection": "移除注入", "Remove": "移除", - "Select a World Info file for": "为...选择一个世界信息文件", - "Primary Lorebook": "主要传说书", - "A selected World Info will be bound to this character as its own Lorebook.": "所选的世界信息将作为该角色自己的传说书绑定到此角色。", - "When generating an AI reply, it will be combined with the entries from a global World Info selector.": "在生成AI回复时,它将与全局世界信息选择器中的条目结合。", - "Exporting a character would also export the selected Lorebook file embedded in the JSON data.": "导出角色还将导出嵌入在JSON数据中的所选传说书文件。", - "Additional Lorebooks": "附加传说书", - "Associate one or more auxillary Lorebooks with this character.": "将一个或多个辅助传说书与此角色关联。", - "NOTE: These choices are optional and won't be preserved on character export!": "注意:这些选择是可选的,并且不会在角色导出时保留!", + "Select a World Info file for": "为...选择一个世界书文件", + "Primary Lorebook": "主要世界书", + "A selected World Info will be bound to this character as its own Lorebook.": "所选的世界书将会于该角色绑定,作为该角色自己的世界书", + "When generating an AI reply, it will be combined with the entries from a global World Info selector.": "在生成AI回复时,它将与全局世界书选择器中的条目相结合。", + "Exporting a character would also export the selected Lorebook file embedded in the JSON data.": "导出角色还将导出嵌入在JSON数据中的所选世界书文件。", + "Additional Lorebooks": "附加世界书", + "Associate one or more auxillary Lorebooks with this character.": "将一个或多个辅助世界书与此角色关联。", + "NOTE: These choices are optional and won't be preserved on character export!": "注意:这些选项是可选的,并且不会在角色导出时被一并导出!", "Rename chat file": "重命名聊天文件", "Export JSONL chat file": "导出JSONL聊天文件", "Download chat as plain text document": "将聊天下载为纯文本文档", @@ -817,9 +818,9 @@ "Ask AI to write your message for you": "请求AI为您撰写消息", "Continue the last message": "继续上一条消息", "Bind user name to that avatar": "将用户名称绑定到该头像", - "Select this as default persona for the new chats.": "选择此项作为新聊天的默认人物。", - "Change persona image": "更改人物形象", - "Delete persona": "删除人物", + "Select this as default persona for the new chats.": "将这个设置为新聊天的默认我的角色。", + "Change persona image": "更改我的角色头像", + "Delete persona": "删除我的角色", "Reduced Motion": "减少动态效果", "Auto-select": "自动选择", "Automatically select a background based on the chat context": "根据聊天上下文自动选择背景", @@ -832,7 +833,7 @@ "UI Theme": "UI主题", "This message is invisible for the AI": "此消息对AI不可见", "Sampler Priority": "采样器优先级", - "Ooba only. Determines the order of samplers.": "仅适用于Ooba。确定采样器的顺序。", + "Ooba only. Determines the order of samplers.": "确定采样器的顺序(仅适用于Ooba)", "Load default order": "加载默认顺序", "Max Tokens Second": "每秒最大Token数", "CFG": "CFG", @@ -850,30 +851,30 @@ "Import Extension From Git Repo": "从Git存储库导入扩展", "Install extension": "安装扩展", "Manage extensions": "管理扩展", - "Tokens persona description": "Token人物描述", - "Most tokens": "大多数Token", - "Least tokens": "最少Token", + "Tokens persona description": "我的角色描述 Tokens", + "Most tokens": "最多Tokens", + "Least tokens": "最少Tokens", "Random": "随机", - "Skip Example Dialogues Formatting": "跳过示例对话格式", + "Skip Example Dialogues Formatting": "跳过示例对话格式化", "Import a theme file": "导入主题文件", "Export a theme file": "导出主题文件", "Unlocked Context Size": "解锁上下文长度", - "Display the response bit by bit as it is generated.": "逐位显示生成的响应。", - "When this is off, responses will be displayed all at once when they are complete.": "当此选项关闭时,响应将在完成时一次性显示。", + "Display the response bit by bit as it is generated.": "随着响应的生成,逐步显示结果。", + "When this is off, responses will be displayed all at once when they are complete.": "当此选项关闭时,响应将在完成后一次性显示。", "Quick Prompts Edit": "快速提示词编辑", - "Enable OpenAI completion streaming": "启用OpenAI完成流", + "Enable OpenAI completion streaming": "启用OpenAI流式传输补全", "Main": "主要", - "Utility Prompts": "Utility Prompts 实用提示词", + "Utility Prompts": "实用提示词", "Add character names": "添加角色名称", - "Send names in the message objects. Helps the model to associate messages with characters.": "在消息对象中发送名称。有助于模型将消息与角色关联起来。", - "Continue prefill": "继续预填充", - "Continue sends the last message as assistant role instead of system message with instruction.": "继续将上一条消息发送为助手角色,而不是带有说明的系统消息。", + "Send names in the message objects. Helps the model to associate messages with characters.": "在消息对象中发送名称,有助于模型将消息与角色关联起来。", + "Continue prefill": "“继续”预填充", + "Continue sends the last message as assistant role instead of system message with instruction.": "继续以AI助手的角色发送最后一条消息,而不是带有指令的系统消息。", "Squash system messages": "压缩系统消息", - "Combines consecutive system messages into one (excluding example dialogues). May improve coherence for some models.": "将连续的系统消息合并为一条(不包括示例对话)。可能会提高一些模型的连贯性。", + "Combines consecutive system messages into one (excluding example dialogues). May improve coherence for some models.": "将连续的系统消息合并为一条(不包括示例对话),可能会提高一些模型的连贯性。", "Send inline images": "发送内联图像", "Assistant Prefill": "助手预填充", - "Start Claude's answer with...": "以以下内容开始Claude克劳德的回答...", - "Use system prompt (Claude 2.1+ only)": "仅使用系统提示词(仅适用于Claude 2.1+)", + "Start Claude's answer with...": "以如下内容开始Claude的回答...", + "Use system prompt (Claude 2.1+ only)": "使用系统提示词(仅适用于Claude 2.1+)", "Send the system prompt for supported models. If disabled, the user message is added to the beginning of the prompt.": "为支持的模型发送系统提示词。如果禁用,则用户消息将添加到提示词的开头。", "Prompts": "提示词", "Total Tokens:": "总Token数:", @@ -883,7 +884,7 @@ "Export this prompt list": "导出此提示词列表", "Reset current character": "重置当前角色", "New prompt": "新提示词", - "Tokens": "Tokens Token", + "Tokens": "Tokens", "Want to update?": "获取最新版本", "How to start chatting?": "如何快速开始聊天?", "Click": "点击", @@ -899,8 +900,8 @@ "Join the SillyTavern Discord": "加入SillyTavern Discord", "Post a GitHub issue": "发布GitHub问题", "Contact the developers": "联系开发人员", - "Nucleus Sampling": "核心采样", - "Typical P": "Typical P 典型P", + "Nucleus Sampling": "核采样", + "Typical P": "典型P", "Top K Sampling": "Top K 采样", "Top A Sampling": "Top A 采样", "Off": "关闭", @@ -909,9 +910,9 @@ "Medium": "中", "Aggressive": "激进", "Very aggressive": "非常激进", - "Eta cutoff is the main parameter of the special Eta Sampling technique. In units of 1e-4; a reasonable value is 3. Set to 0 to disable. See the paper Truncation Sampling as Language Model Desmoothing by Hewitt et al. (2022) for details.": "Eta截止是特殊Eta采样技术的主要参数。 以1e-4为单位;合理的值为3。 设置为0以禁用。 有关详细信息,请参阅Hewitt等人的论文《Truncation Sampling as Language Model Desmoothing》(2022年)。", - "Learn how to contribute your idle GPU cycles to the Horde": "了解如何将您的空闲GPU时间分享给Horde", - "Use the appropriate tokenizer for Google models via their API. Slower prompt processing, but offers much more accurate token counting.": "通过其API为Google模型使用适当的标记器。处理速度较慢,但提供更准确的Token计数。", + "Eta cutoff is the main parameter of the special Eta Sampling technique.\nIn units of 1e-4; a reasonable value is 3.\nSet to 0 to disable.\nSee the paper Truncation Sampling as Language Model Desmoothing by Hewitt et al. (2022) for details.": "Eta截止是特殊Eta采样技术的主要参数。\n以1e-4为单位;合理的值为3。\n设置为0以禁用。\n有关详细信息,请参阅Hewitt等人的论文 Truncation Sampling as Language Model Desmoothing (2022)", + "Learn how to contribute your idle GPU cycles to the Horde": "了解如何将您的空闲GPU算力分享给Horde", + "Use the appropriate tokenizer for Google models via their API. Slower prompt processing, but offers much more accurate token counting.": "通过其API为Google模型使用适当的分词器。处理速度较慢,但提供更准确的Token计数。", "Load koboldcpp order": "加载koboldcpp顺序", - "Use Google Tokenizer": "使用Google标记器" + "Use Google Tokenizer": "使用Google分词器" } diff --git a/public/script.js b/public/script.js index 84a0e9d5d..a20a04ccb 100644 --- a/public/script.js +++ b/public/script.js @@ -153,7 +153,7 @@ import { ensureImageFormatSupported, } from './scripts/utils.js'; -import { ModuleWorkerWrapper, doDailyExtensionUpdatesCheck, extension_settings, getContext, loadExtensionSettings, renderExtensionTemplate, runGenerationInterceptors, saveMetadataDebounced, writeExtensionField } from './scripts/extensions.js'; +import { ModuleWorkerWrapper, doDailyExtensionUpdatesCheck, extension_settings, getContext, loadExtensionSettings, renderExtensionTemplate, renderExtensionTemplateAsync, runGenerationInterceptors, saveMetadataDebounced, writeExtensionField } from './scripts/extensions.js'; import { COMMENT_NAME_DEFAULT, executeSlashCommands, getSlashCommandsHelp, processChatSlashCommands, registerSlashCommand } from './scripts/slash-commands.js'; import { tag_map, @@ -212,6 +212,7 @@ import { appendFileContent, hasPendingFileAttachment, populateFileAttachment, de import { initPresetManager } from './scripts/preset-manager.js'; import { evaluateMacros } from './scripts/macros.js'; import { callGenericPopup } from './scripts/popup.js'; +import { renderTemplate, renderTemplateAsync } from './scripts/templates.js'; //exporting functions and vars for mods export { @@ -286,6 +287,7 @@ export { printCharactersDebounced, isOdd, countOccurrences, + renderTemplate, }; showLoader(); @@ -575,14 +577,14 @@ export const MAX_INJECTION_DEPTH = 1000; let system_messages = {}; -function getSystemMessages() { +async function getSystemMessages() { system_messages = { help: { name: systemUserName, force_avatar: system_avatar, is_user: false, is_system: true, - mes: renderTemplate('help'), + mes: await renderTemplateAsync('help'), }, slash_commands: { name: systemUserName, @@ -596,21 +598,21 @@ function getSystemMessages() { force_avatar: system_avatar, is_user: false, is_system: true, - mes: renderTemplate('hotkeys'), + mes: await renderTemplateAsync('hotkeys'), }, formatting: { name: systemUserName, force_avatar: system_avatar, is_user: false, is_system: true, - mes: renderTemplate('formatting'), + mes: await renderTemplateAsync('formatting'), }, macros: { name: systemUserName, force_avatar: system_avatar, is_user: false, is_system: true, - mes: renderTemplate('macros'), + mes: await renderTemplateAsync('macros'), }, welcome: { @@ -618,7 +620,7 @@ function getSystemMessages() { force_avatar: system_avatar, is_user: false, is_system: true, - mes: renderTemplate('welcome'), + mes: await renderTemplateAsync('welcome'), }, group: { name: systemUserName, @@ -672,52 +674,6 @@ $(document).ajaxError(function myErrorHandler(_, xhr) { } }); -/** - * Loads a URL content using XMLHttpRequest synchronously. - * @param {string} url URL to load synchronously - * @returns {string} Response text - */ -function getUrlSync(url) { - console.debug('Loading URL synchronously', url); - const request = new XMLHttpRequest(); - request.open('GET', url, false); // `false` makes the request synchronous - request.send(); - - if (request.status >= 200 && request.status < 300) { - return request.responseText; - } - - throw new Error(`Error loading ${url}: ${request.status} ${request.statusText}`); -} - -const templateCache = new Map(); - -export function renderTemplate(templateId, templateData = {}, sanitize = true, localize = true, fullPath = false) { - try { - const pathToTemplate = fullPath ? templateId : `/scripts/templates/${templateId}.html`; - let template = templateCache.get(pathToTemplate); - if (!template) { - const templateContent = getUrlSync(pathToTemplate); - template = Handlebars.compile(templateContent); - templateCache.set(pathToTemplate, template); - } - let result = template(templateData); - - if (sanitize) { - result = DOMPurify.sanitize(result); - } - - if (localize) { - result = applyLocale(result); - } - - return result; - } catch (err) { - console.error('Error rendering template', templateId, templateData, err); - toastr.error('Check the DevTools console for more information.', 'Error rendering template'); - } -} - async function getClientVersion() { try { const response = await fetch('/version'); @@ -781,7 +737,7 @@ function getCurrentChatId() { if (selected_group) { return groups.find(x => x.id == selected_group)?.chat_id; } - else if (this_chid) { + else if (this_chid !== undefined) { return characters[this_chid]?.chat; } } @@ -901,7 +857,7 @@ async function firstLoadInit() { await getClientVersion(); await readSecretState(); await getSettings(); - getSystemMessages(); + await getSystemMessages(); sendSystemMessage(system_message_types.WELCOME); initLocales(); initTags(); @@ -1204,7 +1160,7 @@ export function resultCheckStatus() { } export async function selectCharacterById(id) { - if (characters[id] == undefined) { + if (characters[id] === undefined) { return; } @@ -1567,7 +1523,7 @@ async function getCharacters() { characters[i]['chat'] = String(characters[i]['chat']); } - if (this_chid != undefined && this_chid != 'invalid-safety-id') { + if (this_chid !== undefined) { $('#avatar_url_pole').val(characters[this_chid].avatar); } @@ -1720,11 +1676,12 @@ export async function reloadCurrentChat() { if (selected_group) { await getGroupChat(selected_group, true); } - else if (this_chid) { + else if (this_chid !== undefined) { await getChat(); } else { resetChatState(); + await getCharacters(); await printMessages(); await eventSource.emit(event_types.CHAT_CHANGED, getCurrentChatId()); } @@ -1827,7 +1784,7 @@ function messageFormatting(mes, ch_name, isSystem, isUser, messageId) { mes = mes.replaceAll('<', '<').replaceAll('>', '>'); } - if ((this_chid === undefined || this_chid === 'invalid-safety-id') && !selected_group) { + if (this_chid === undefined && !selected_group) { mes = mes .replace(/\*\*(.+?)\*\*/g, '$1') .replace(/\n/g, '
'); @@ -2084,7 +2041,7 @@ function addOneMessage(mes, { type = 'normal', insertAfter = null, scroll = true if (!mes['is_user']) { if (mes.force_avatar) { avatarImg = mes.force_avatar; - } else if (this_chid === undefined || this_chid === 'invalid-safety-id') { + } else if (this_chid === undefined) { avatarImg = system_avatar; } else { if (characters[this_chid].avatar != 'none') { @@ -3177,12 +3134,12 @@ async function Generate(type, { automatic_trigger, force_name2, quiet_prompt, qu quiet_prompt = main_api == 'novel' && !quietToLoud ? adjustNovelInstructionPrompt(quiet_prompt) : quiet_prompt; } - const isChatValid = online_status != 'no_connection' && this_chid != undefined && this_chid !== 'invalid-safety-id'; + const isChatValid = online_status !== 'no_connection' && this_chid !== undefined; // We can't do anything because we're not in a chat right now. (Unless it's a dry run, in which case we need to // assemble the prompt so we can count its tokens regardless of whether a chat is active.) if (!dryRun && !isChatValid) { - if (this_chid === undefined || this_chid === 'invalid-safety-id') { + if (this_chid === undefined) { toastr.warning('Сharacter is not selected'); } is_send_press = false; @@ -4614,7 +4571,7 @@ async function DupeChar() { } } -function promptItemize(itemizedPrompts, requestedMesId) { +async function promptItemize(itemizedPrompts, requestedMesId) { console.log('PROMPT ITEMIZE ENTERED'); var incomingMesId = Number(requestedMesId); console.debug(`looking for MesId ${incomingMesId}`); @@ -4655,7 +4612,7 @@ function promptItemize(itemizedPrompts, requestedMesId) { chatInjects: getTokenCount(itemizedPrompts[thisPromptSet].chatInjects), }; - if (params.chatInjects){ + if (params.chatInjects) { params.ActualChatHistoryTokens = params.ActualChatHistoryTokens - params.chatInjects; } @@ -4737,10 +4694,12 @@ function promptItemize(itemizedPrompts, requestedMesId) { } if (params.this_main_api == 'openai') { - callPopup(renderTemplate('itemizationChat', params), 'text'); + const template = await renderTemplateAsync('itemizationChat', params); + callPopup(template, 'text'); } else { - callPopup(renderTemplate('itemizationText', params), 'text'); + const template = await renderTemplateAsync('itemizationText', params); + callPopup(template, 'text'); } } @@ -5309,7 +5268,7 @@ export function deactivateSendButtons() { function resetChatState() { //unsets expected chid before reloading (related to getCharacters/printCharacters from using old arrays) - this_chid = 'invalid-safety-id'; + this_chid = undefined; // replaces deleted charcter name with system user since it will be displayed next. name2 = systemUserName; // sets up system user to tell user about having deleted a character @@ -5982,7 +5941,7 @@ function getUserAvatarBlock(name) { const personaName = power_user.personas[name]; const personaDescription = power_user.persona_descriptions[name]?.description; template.find('.ch_name').text(personaName || '[Unnamed Persona]'); - template.find('.ch_description').text(personaDescription || '[No description]').toggleClass('text_muted', !personaDescription); + template.find('.ch_description').text(personaDescription || $('#user_avatar_block').attr('no_desc_text')).toggleClass('text_muted', !personaDescription); template.attr('imgfile', name); template.find('.avatar').attr('imgfile', name).attr('title', name); template.toggleClass('default_persona', name === power_user.default_persona); @@ -7692,7 +7651,7 @@ async function createOrEditCharacter(e) { $('#create_button').attr('value', '✅'); let oldSelectedChar = null; - if (this_chid != undefined && this_chid != 'invalid-safety-id') { + if (this_chid !== undefined) { oldSelectedChar = characters[this_chid].avatar; } @@ -7814,7 +7773,11 @@ window['SillyTavern'].getContext = function () { */ registerHelper: () => { }, registedDebugFunction: registerDebugFunction, + /** + * @deprecated Use renderExtensionTemplateAsync instead. + */ renderExtensionTemplate: renderExtensionTemplate, + renderExtensionTemplateAsync: renderExtensionTemplateAsync, callPopup: callPopup, callGenericPopup: callGenericPopup, mainApi: main_api, @@ -8439,7 +8402,7 @@ async function importCharacter(file, preserveFileName = false) { $('#character_search_bar').val('').trigger('input'); let oldSelectedChar = null; - if (this_chid != undefined && this_chid != 'invalid-safety-id') { + if (this_chid !== undefined) { oldSelectedChar = characters[this_chid].avatar; } @@ -8570,7 +8533,7 @@ export async function handleDeleteCharacter(popup_type, this_chid, delete_chats) export async function deleteCharacter(name, avatar, reloadCharacters = true) { await clearChat(); $('#character_cross').click(); - this_chid = 'invalid-safety-id'; + this_chid = undefined; characters.length = 0; name2 = systemUserName; chat = [...safetychat]; diff --git a/public/scripts/RossAscends-mods.js b/public/scripts/RossAscends-mods.js index 87cbbff2c..b007a0d7e 100644 --- a/public/scripts/RossAscends-mods.js +++ b/public/scripts/RossAscends-mods.js @@ -108,13 +108,22 @@ export function humanizeGenTime(total_gen_time) { return time_spent; } -let parsedUA = null; -try { - parsedUA = Bowser.parse(navigator.userAgent); -} catch { - // In case the user agent is an empty string or Bowser can't parse it for some other reason -} +/** + * DON'T OPTIMIZE, don't change this to a const or let, it needs to be a var. + */ +var parsedUA = null; +function getParsedUA() { + if (!parsedUA) { + try { + parsedUA = Bowser.parse(navigator.userAgent); + } catch { + // In case the user agent is an empty string or Bowser can't parse it for some other reason + } + } + + return parsedUA; +} /** * Checks if the device is a mobile device. @@ -123,7 +132,7 @@ try { export function isMobile() { const mobileTypes = ['mobile', 'tablet']; - return mobileTypes.includes(parsedUA?.platform?.type); + return mobileTypes.includes(getParsedUA()?.platform?.type); } export function shouldSendOnEnter() { @@ -275,7 +284,7 @@ export async function favsToHotswap() { //helpful instruction message if no characters are favorited if (favs.length == 0) { - container.html(' Favorite characters to add them to HotSwaps'); + container.html(`${DOMPurify.sanitize(container.attr('no_favs'))}`); return; } @@ -285,7 +294,8 @@ export async function favsToHotswap() { //changes input bar and send button display depending on connection status function RA_checkOnlineStatus() { if (online_status == 'no_connection') { - $('#send_textarea').attr('placeholder', 'Not connected to API!'); //Input bar placeholder tells users they are not connected + const send_textarea = $('#send_textarea'); + send_textarea.attr('placeholder', send_textarea.attr('no_connection_text')); //Input bar placeholder tells users they are not connected $('#send_form').addClass('no-connection'); //entire input form area is red when not connected $('#send_but').addClass('displayNone'); //send button is hidden when not connected; $('#mes_continue').addClass('displayNone'); //continue button is hidden when not connected; @@ -294,7 +304,8 @@ function RA_checkOnlineStatus() { connection_made = false; } else { if (online_status !== undefined && online_status !== 'no_connection') { - $('#send_textarea').attr('placeholder', 'Type a message, or /? for help'); //on connect, placeholder tells user to type message + const send_textarea = $('#send_textarea'); + send_textarea.attr('placeholder', send_textarea.attr('connected_text')); //on connect, placeholder tells user to type message $('#send_form').removeClass('no-connection'); $('#API-status-top').removeClass('fa-plug-circle-exclamation redOverlayGlow'); $('#API-status-top').addClass('fa-plug'); diff --git a/public/scripts/extensions.js b/public/scripts/extensions.js index 8bc3f8769..26e9e58dd 100644 --- a/public/scripts/extensions.js +++ b/public/scripts/extensions.js @@ -1,5 +1,6 @@ -import { callPopup, eventSource, event_types, saveSettings, saveSettingsDebounced, getRequestHeaders, substituteParams, renderTemplate, animation_duration } from '../script.js'; +import { callPopup, eventSource, event_types, saveSettings, saveSettingsDebounced, getRequestHeaders, animation_duration } from '../script.js'; import { hideLoader, showLoader } from './loader.js'; +import { renderTemplate, renderTemplateAsync } from './templates.js'; import { isSubsetOf, setValueByPath } from './utils.js'; export { getContext, @@ -50,17 +51,31 @@ export function saveMetadataDebounced() { } /** - * Provides an ability for extensions to render HTML templates. + * Provides an ability for extensions to render HTML templates synchronously. * Templates sanitation and localization is forced. * @param {string} extensionName Extension name * @param {string} templateId Template ID * @param {object} templateData Additional data to pass to the template * @returns {string} Rendered HTML + * + * @deprecated Use renderExtensionTemplateAsync instead. */ export function renderExtensionTemplate(extensionName, templateId, templateData = {}, sanitize = true, localize = true) { return renderTemplate(`scripts/extensions/${extensionName}/${templateId}.html`, templateData, sanitize, localize, true); } +/** + * Provides an ability for extensions to render HTML templates asynchronously. + * Templates sanitation and localization is forced. + * @param {string} extensionName Extension name + * @param {string} templateId Template ID + * @param {object} templateData Additional data to pass to the template + * @returns {Promise} Rendered HTML + */ +export function renderExtensionTemplateAsync(extensionName, templateId, templateData = {}, sanitize = true, localize = true) { + return renderTemplateAsync(`scripts/extensions/${extensionName}/${templateId}.html`, templateData, sanitize, localize, true); +} + // Disables parallel updates class ModuleWorkerWrapper { constructor(callback) { diff --git a/public/scripts/extensions/assets/index.js b/public/scripts/extensions/assets/index.js index 66f5e55cb..a44b31727 100644 --- a/public/scripts/extensions/assets/index.js +++ b/public/scripts/extensions/assets/index.js @@ -4,7 +4,7 @@ TODO: //const DEBUG_TONY_SAMA_FORK_MODE = true import { getRequestHeaders, callPopup, processDroppedFiles } from '../../../script.js'; -import { deleteExtension, extensionNames, getContext, installExtension, renderExtensionTemplate } from '../../extensions.js'; +import { deleteExtension, extensionNames, getContext, installExtension, renderExtensionTemplateAsync } from '../../extensions.js'; import { executeSlashCommands } from '../../slash-commands.js'; import { getStringHash, isValidUrl } from '../../utils.js'; export { MODULE_NAME }; @@ -355,7 +355,8 @@ async function updateCurrentAssets() { // This function is called when the extension is loaded jQuery(async () => { // This is an example of loading HTML from a file - const windowHtml = $(renderExtensionTemplate(MODULE_NAME, 'window', {})); + const windowTemplate = await renderExtensionTemplateAsync(MODULE_NAME, 'window', {}); + const windowHtml = $(windowTemplate); const assetsJsonUrl = windowHtml.find('#assets-json-url-field'); assetsJsonUrl.val(ASSETS_JSON_URL); @@ -366,7 +367,7 @@ jQuery(async () => { const rememberKey = `Assets_SkipConfirm_${getStringHash(url)}`; const skipConfirm = localStorage.getItem(rememberKey) === 'true'; - const template = renderExtensionTemplate(MODULE_NAME, 'confirm', { url }); + const template = await renderExtensionTemplateAsync(MODULE_NAME, 'confirm', { url }); const confirmation = skipConfirm || await callPopup(template, 'confirm'); if (confirmation) { diff --git a/public/scripts/extensions/expressions/index.js b/public/scripts/extensions/expressions/index.js index 4ee04f552..15ad253be 100644 --- a/public/scripts/extensions/expressions/index.js +++ b/public/scripts/extensions/expressions/index.js @@ -1,6 +1,6 @@ import { callPopup, eventSource, event_types, getRequestHeaders, saveSettingsDebounced } from '../../../script.js'; import { dragElement, isMobile } from '../../RossAscends-mods.js'; -import { getContext, getApiUrl, modules, extension_settings, ModuleWorkerWrapper, doExtrasFetch, renderExtensionTemplate } from '../../extensions.js'; +import { getContext, getApiUrl, modules, extension_settings, ModuleWorkerWrapper, doExtrasFetch, renderExtensionTemplateAsync } from '../../extensions.js'; import { loadMovingUIState, power_user } from '../../power-user.js'; import { registerSlashCommand } from '../../slash-commands.js'; import { onlyUnique, debounce, getCharaFilename, trimToEndSentence, trimToStartSentence } from '../../utils.js'; @@ -594,7 +594,7 @@ async function moduleWorker() { } // non-characters not supported - if (!context.groupId && (context.characterId === undefined || context.characterId === 'invalid-safety-id')) { + if (!context.groupId && context.characterId === undefined) { removeExpression(); return; } @@ -977,6 +977,10 @@ async function getExpressionLabel(text) { return getFallbackExpression(); } + if (extension_settings.expressions.translate && typeof window['translate'] === 'function') { + text = await window['translate'](text, 'en'); + } + text = sampleClassifyText(text); try { @@ -1051,18 +1055,18 @@ async function validateImages(character, forceRedrawCached) { if (spriteCache[character]) { if (forceRedrawCached && $('#image_list').data('name') !== character) { console.debug('force redrawing character sprites list'); - drawSpritesList(character, labels, spriteCache[character]); + await drawSpritesList(character, labels, spriteCache[character]); } return; } const sprites = await getSpritesList(character); - let validExpressions = drawSpritesList(character, labels, sprites); + let validExpressions = await drawSpritesList(character, labels, sprites); spriteCache[character] = validExpressions; } -function drawSpritesList(character, labels, sprites) { +async function drawSpritesList(character, labels, sprites) { let validExpressions = []; $('#no_chat_expressions').hide(); $('#open_chat_expressions').show(); @@ -1074,18 +1078,20 @@ function drawSpritesList(character, labels, sprites) { return []; } - labels.sort().forEach((item) => { + for (const item of labels.sort()) { const sprite = sprites.find(x => x.label == item); const isCustom = extension_settings.expressions.custom.includes(item); if (sprite) { validExpressions.push(sprite); - $('#image_list').append(getListItem(item, sprite.path, 'success', isCustom)); + const listItem = await getListItem(item, sprite.path, 'success', isCustom); + $('#image_list').append(listItem); } else { - $('#image_list').append(getListItem(item, '/img/No-Image-Placeholder.svg', 'failure', isCustom)); + const listItem = await getListItem(item, '/img/No-Image-Placeholder.svg', 'failure', isCustom); + $('#image_list').append(listItem); } - }); + } return validExpressions; } @@ -1095,12 +1101,12 @@ function drawSpritesList(character, labels, sprites) { * @param {string} imageSrc Path to image * @param {'success' | 'failure'} textClass 'success' or 'failure' * @param {boolean} isCustom If expression is added by user - * @returns {string} Rendered list item template + * @returns {Promise} Rendered list item template */ -function getListItem(item, imageSrc, textClass, isCustom) { +async function getListItem(item, imageSrc, textClass, isCustom) { const isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1; imageSrc = isFirefox ? `${imageSrc}?t=${Date.now()}` : imageSrc; - return renderExtensionTemplate(MODULE_NAME, 'list-item', { item, imageSrc, textClass, isCustom }); + return renderExtensionTemplateAsync(MODULE_NAME, 'list-item', { item, imageSrc, textClass, isCustom }); } async function getSpritesList(name) { @@ -1162,7 +1168,7 @@ async function renderFallbackExpressionPicker() { async function getExpressionsList() { // Return cached list if available if (Array.isArray(expressionsList)) { - return expressionsList; + return [...expressionsList, ...extension_settings.expressions.custom].filter(onlyUnique); } /** @@ -1211,7 +1217,7 @@ async function getExpressionsList() { } const result = await resolveExpressionsList(); - return [...result, ...extension_settings.expressions.custom]; + return [...result, ...extension_settings.expressions.custom].filter(onlyUnique); } async function setExpression(character, expression, force) { @@ -1367,7 +1373,8 @@ function onClickExpressionImage() { } async function onClickExpressionAddCustom() { - let expressionName = await callPopup(renderExtensionTemplate(MODULE_NAME, 'add-custom-expression'), 'input'); + const template = await renderExtensionTemplateAsync(MODULE_NAME, 'add-custom-expression'); + let expressionName = await callPopup(template, 'input'); if (!expressionName) { console.debug('No custom expression name provided'); @@ -1406,14 +1413,15 @@ async function onClickExpressionAddCustom() { } async function onClickExpressionRemoveCustom() { - const selectedExpression = $('#expression_custom').val(); + const selectedExpression = String($('#expression_custom').val()); if (!selectedExpression) { console.debug('No custom expression selected'); return; } - const confirmation = await callPopup(renderExtensionTemplate(MODULE_NAME, 'remove-custom-expression', { expression: selectedExpression }), 'confirm'); + const template = await renderExtensionTemplateAsync(MODULE_NAME, 'remove-custom-expression', { expression: selectedExpression }); + const confirmation = await callPopup(template, 'confirm'); if (!confirmation) { console.debug('Custom expression removal cancelled'); @@ -1712,11 +1720,16 @@ async function fetchImagesNoCache() { $('body').append(element); } async function addSettings() { - $('#extensions_settings').append(renderExtensionTemplate(MODULE_NAME, 'settings')); + const template = await renderExtensionTemplateAsync(MODULE_NAME, 'settings'); + $('#extensions_settings').append(template); $('#expression_override_button').on('click', onClickExpressionOverrideButton); $('#expressions_show_default').on('input', onExpressionsShowDefaultInput); $('#expression_upload_pack_button').on('click', onClickExpressionUploadPackButton); $('#expressions_show_default').prop('checked', extension_settings.expressions.showDefault).trigger('input'); + $('#expression_translate').prop('checked', extension_settings.expressions.translate).on('input', function () { + extension_settings.expressions.translate = !!$(this).prop('checked'); + saveSettingsDebounced(); + }); $('#expression_local').prop('checked', extension_settings.expressions.local).on('input', function () { extension_settings.expressions.local = !!$(this).prop('checked'); moduleWorker(); @@ -1743,7 +1756,7 @@ async function fetchImagesNoCache() { $('#expression_custom_add').on('click', onClickExpressionAddCustom); $('#expression_custom_remove').on('click', onClickExpressionRemoveCustom); - $('#expression_fallback').on('change', onExpressionFallbackChanged) + $('#expression_fallback').on('change', onExpressionFallbackChanged); } // Pause Talkinghead to save resources when the ST tab is not visible or the window is minimized. diff --git a/public/scripts/extensions/expressions/settings.html b/public/scripts/extensions/expressions/settings.html index 4abc49fcc..b0b3b0bd3 100644 --- a/public/scripts/extensions/expressions/settings.html +++ b/public/scripts/extensions/expressions/settings.html @@ -10,6 +10,10 @@ Local server classification +