From 890d10d811789d12c9f0c4902b7b0995641c2307 Mon Sep 17 00:00:00 2001 From: Yokayo Date: Sun, 16 Feb 2025 18:43:57 +0700 Subject: [PATCH 1/3] Work on tl --- public/index.html | 8 +- public/locales/ru-ru.json | 86 ++++++++++++++++--- public/script.js | 2 +- public/scripts/extensions.js | 8 +- public/scripts/extensions/assets/index.js | 28 +++--- .../extensions/assets/installation.html | 4 + public/scripts/extensions/assets/window.html | 2 +- .../scripts/extensions/token-counter/index.js | 26 ++---- .../extensions/token-counter/window.html | 16 ++++ public/scripts/textgen-settings.js | 4 +- 10 files changed, 124 insertions(+), 60 deletions(-) create mode 100644 public/scripts/extensions/assets/installation.html create mode 100644 public/scripts/extensions/token-counter/window.html diff --git a/public/index.html b/public/index.html index b6a3e6557..b05a88caf 100644 --- a/public/index.html +++ b/public/index.html @@ -2015,7 +2015,7 @@
-
+
@@ -4001,7 +4001,7 @@
Max Recursion Steps -
+
@@ -6890,8 +6890,8 @@
- - + +
diff --git a/public/locales/ru-ru.json b/public/locales/ru-ru.json index 8693cf7f5..28bd696a6 100644 --- a/public/locales/ru-ru.json +++ b/public/locales/ru-ru.json @@ -195,7 +195,7 @@ "Yes": "Да", "No": "Нет", "Context %": "Процент контекста", - "Budget Cap": "Бюджетный лимит", + "Budget Cap": "Лимит бюджета", "(0 = disabled)": "(0 = отключено)", "None": "Отсутствует", "User Settings": "Настройки пользователя", @@ -575,10 +575,10 @@ "Characters sorting order": "Порядок сортировки персонажей", "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.": "При экспорте персонажа вместе с ним также выгрузится выбранный лорбук в виде JSON", + "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!": "ВНИМАНИЕ: эти выборы необязательные и не будут сохранены при экспорте персонажа!", @@ -593,7 +593,7 @@ "Prompt": "Промпт", "Copy": "Скопировать", "Confirm": "Подтвердить", - "Copy this message": "Скопировать сообщение", + "Copy this message": "Продублировать сообщение", "Delete this message": "Удалить сообщение", "Move message up": "Переместить сообщение вверх", "Move message down": "Переместить сообщение вниз", @@ -612,7 +612,7 @@ "Ask AI to write your message for you": "Попросить ИИ написать сообщение за вас", "Continue the last message": "Продолжить текущее сообщение", "Bind user name to that avatar": "Закрепить имя за этим аватаром", - "Select this as default persona for the new chats.": "Выберать эту Персону в качестве персоны по умолчанию для новых чатов.", + "Select this as default persona for the new chats.": "Выбирать эту персону по умолчанию для всех новых чатов.", "Change persona image": "Сменить аватар персоны", "Delete persona": "Удалить персону", "Reduced Motion": "Сокращение анимаций", @@ -640,7 +640,7 @@ "Token Probabilities": "Вероятности токенов", "Close chat": "Закрыть чат", "Manage chat files": "Все чаты", - "Import Extension From Git Repo": "Импортировать расширение из Git Repository", + "Import Extension From Git Repo": "Импортировать расширение из Git-репозитория.", "Install extension": "Установить расширение", "Manage extensions": "Управление расширениями", "Tokens persona description": "Токенов", @@ -1122,7 +1122,7 @@ "help_hotkeys_0": "Горячие клавиши", "You can browse a list of bundled characters in the": "Комплектных персонажей можно найти в меню", "Download Extensions & Assets": "Загрузить расширения и ресурсы", - "menu within": "внутри этих кубиков", + "menu within": "в меню", "Assets URL": "URL с описанием ресурсов", "Custom (OpenAI-compatible)": "Кастомный (совместимый с OpenAI)", "Custom Endpoint (Base URL)": "Кастомный эндпоинт (базовый URL)", @@ -1943,7 +1943,7 @@ "and connect to an": "и подключитесь к", "You can add more": "Можете добавить больше", "from other websites": "с других сайтов.", - "Go to the": "Загляните в", + "Go to the": "Заходите в", "to install additional features.": ", чтобы установить разные дополнительные ресурсы.", "or_welcome": "; также доступен", "Claude API Key": "Ключ от API Claude", @@ -1958,7 +1958,7 @@ "Save": "Сохранить", "Chat Lorebook": "Лорбук для чата", "chat_world_template_txt": "Выбранный мир будет привязан к этому чату. Будет добавляться в промпт наряду с глобальным лорбуком и лором персонажа.", - "world_button_title": "Лор персонажа\n\nНажмите, чтобы загрузить\nShift + клик, чтобы открыть диалог привязки мира", + "world_button_title": "Лор персонажа\n\nНажмите, чтобы загрузить\nShift + ЛКМ, чтобы открыть диалог привязки мира", "No auxillary Lorebooks set. Click here to select.": "Вспомогательный лорбук не выбран. Нажмите, чтобы выбрать.", "ext_regex_user_input_desc": "Отправленные вами сообщения.", "ext_regex_ai_input_desc": "Полученные от API ответы.", @@ -2144,5 +2144,65 @@ "Not connected to the API!": "Нет соединения с API!", "ext_type_system": "Это комплектное расширение. Его нельзя удалить, а обновляется оно вместе со всей системой.", "Update all": "Обновить все", - "Close": "Закрыть" -} + "Close": "Закрыть", + "Optional modules:": "Необязательные модули:", + "Sort: Display Name": "Сортировать: по названию", + "Sort: Loading Order": "Сортировать: в порядке загрузки", + "Click to toggle": "Нажмите, чтобы включить или выключить", + "Loading Asset List": "Загрузить список ресурсов", + "Don't ask again for this URL": "Запомнить выбор для этого адреса", + "Are you sure you want to connect to the following url?": "Вы точно хотите подключиться к этому адресу?", + "All": "Всё", + "Characters": "Персонажи", + "Ambient sounds": "Звуковой эмбиент", + "Blip sounds": "Звуки уведомлений", + "Background music": "Фоновая музыка", + "Search": "Поиск", + "extension_install_1": "Чтобы загружать расширения из этого списка, у вас должен быть установлен ", + "extension_install_2": ".", + "extension_install_3": "Нажмите на иконку ", + "extension_install_4": ", чтобы перейти в репозиторий расширения и получить более подробную информацию о нём.", + "Extension repo/guide:": "Репозиторий расширения:", + "Preview in browser": "Предпросмотр", + "Adds a function tool": "Частично или полностью работает через вызов функций", + "Tool": "Функции", + "Move extension": "Переместить расширение", + "ext_type_local": "Это локальное расширение, доступно только вам", + "ext_type_global": "Это глобальное расширение, доступно всем пользователям", + "Move": "Переместить", + "Enter the Git URL of the extension to install": "Введите Git-адрес расширения", + "Please be aware that using external extensions can have unintended side effects and may pose security risks. Always make sure you trust the source before importing an extension. We are not responsible for any damage caused by third-party extensions.": "помните, что используя расширения от сторонних авторов, вы можете подвергать систему опасности. Устанавливайте расширения только от проверенных разработчиков. Мы не несём ответственности за любой ущерб, причинённый сторонними расширениями.", + "Disclaimer:": "Внимание:", + "Example:": "Пример:", + "context_derived": "Считывать из метаданных модели (по возможности)", + "instruct_derived": "Считывать из метаданных модели (по возможности)", + "Confirm token parsing with": "Чтобы убедиться в правильности выделения токенов, используйте", + "Reasoning Effort": "Рассуждения", + "Constrains effort on reasoning for reasoning models.": "Регулирует объём внутренних рассуждений модели (reasoning), для моделей которые поддерживают эту возможность.\nНа данный момент поддерживаются три значения: Подробные, Обычные, Поверхностные.\nПри менее подробном рассуждении ответ получается быстрее, а также экономятся токены, уходящие на расуждения.", + "openai_reasoning_effort_low": "Поверхностные", + "openai_reasoning_effort_medium": "Обычные", + "openai_reasoning_effort_high": "Подробные", + "Persona Lore Alt+Click to open the lorebook": "Лорбук данной персоны\nAlt + ЛКМ чтобы открыть лорбук", + "Persona Lorebook for": "Лорбук для персоны", + "persona_world_template_txt": "Выбранная Информация о мире будет привязана к этой персоне. Информация будет добавляться в каждом промпте вместе с глобальным лорбуком и лорбуками персонажа и чата.", + "Global list": "Глобальный список", + "Preset-specific list": "Список для данного пресета", + "Banned tokens/strings are being sent in the request.": "Запрещённые токены и строки отсылаются в запросе.", + "Banned tokens/strings are NOT being sent in the request.": "Запрещённые токены и строки НЕ отсылаются в запросе.", + "Add a reasoning block": "Добавить блок рассуждений", + "Create a copy of this message?": "Продублировать это сообщение?", + "Max Recursion Steps": "Макс. глубина рекурсии", + "0 = unlimited, 1 = scans once and doesn't recurse, 2 = scans once and recurses once, etc": "0 = неограничено, 1 = сканировать единожды, 2 = сканировать единожды и сделать один повторный проход, и т.д.\n(неактивно при указанном мин. числе активаций)", + "(disabled when max recursion steps are used)": "(неактивно при указанной макс. глубине рекурсии)", + "Enter a valid API URL": "Введите корректный адрес API", + "No Ollama model selected.": "Не выбрана модель Ollama", + "Background Fitting": "Способ подгонки фона под разрешение", + "Chat Lore Alt+Click to open the lorebook": "Лорбук данного чата\nAlt + ЛКМ чтобы открыть лорбук", + "Token Counter": "Подсчитать токены", + "Type / paste in the box below to see the number of tokens in the text.": "Введите или вставьте текст в окошко ниже, чтобы подсчитать количество токенов в нём.", + "Selected tokenizer:": "Выбранный токенайзер:", + "Input:": "Входные данные:", + "Tokenized text:": "Токенизированный текст:", + "Token IDs:": "Идентификаторы токенов:", + "Tokens:": "Токенов:" +} \ No newline at end of file diff --git a/public/script.js b/public/script.js index 6e11186f5..875e660c0 100644 --- a/public/script.js +++ b/public/script.js @@ -10943,7 +10943,7 @@ jQuery(async function () { }); $(document).on('click', '.mes_edit_copy', async function () { - const confirmation = await callGenericPopup('Create a copy of this message?', POPUP_TYPE.CONFIRM); + const confirmation = await callGenericPopup(t`Create a copy of this message?`, POPUP_TYPE.CONFIRM); if (!confirmation) { return; } diff --git a/public/scripts/extensions.js b/public/scripts/extensions.js index 83f8dfe48..08399a51c 100644 --- a/public/scripts/extensions.js +++ b/public/scripts/extensions.js @@ -603,12 +603,12 @@ function generateExtensionHtml(name, manifest, isActive, isDisabled, isExternal, } let toggleElement = isActive || isDisabled ? - `` : + '` : ``; - let deleteButton = isExternal ? `` : ''; + let deleteButton = isExternal ? `` : ''; let updateButton = isExternal ? `` : ''; - let moveButton = isExternal && isUserAdmin ? `` : ''; + let moveButton = isExternal && isUserAdmin ? `` : ''; let modulesInfo = ''; if (isActive && Array.isArray(manifest.optional)) { @@ -616,7 +616,7 @@ function generateExtensionHtml(name, manifest, isActive, isDisabled, isExternal, modules.forEach(x => optional.delete(x)); if (optional.size > 0) { const optionalString = DOMPurify.sanitize([...optional].join(', ')); - modulesInfo = `
Optional modules: ${optionalString}
`; + modulesInfo = '
' + t`Optional modules:` + ` ${optionalString}
`; } } else if (!isDisabled) { // Neither active nor disabled const requirements = new Set(manifest.requires); diff --git a/public/scripts/extensions/assets/index.js b/public/scripts/extensions/assets/index.js index a9c48f318..f50cca314 100644 --- a/public/scripts/extensions/assets/index.js +++ b/public/scripts/extensions/assets/index.js @@ -10,6 +10,7 @@ import { POPUP_TYPE, Popup, callGenericPopup } from '../../popup.js'; import { executeSlashCommands } from '../../slash-commands.js'; import { accountStorage } from '../../util/AccountStorage.js'; import { flashHighlight, getStringHash, isValidUrl } from '../../utils.js'; +import { t } from '../../i18n.js'; export { MODULE_NAME }; const MODULE_NAME = 'assets'; @@ -59,11 +60,11 @@ const KNOWN_TYPES = { 'blip': 'Blip sounds', }; -function downloadAssetsList(url) { - updateCurrentAssets().then(function () { +async function downloadAssetsList(url) { + updateCurrentAssets().then(async function () { fetch(url, { cache: 'no-cache' }) .then(response => response.json()) - .then(json => { + .then(async function(json) { availableAssets = {}; $('#assets_menu').empty(); @@ -84,10 +85,10 @@ function downloadAssetsList(url) { $('#assets_type_select').empty(); $('#assets_search').val(''); - $('#assets_type_select').append($('