Work on tl

This commit is contained in:
Yokayo
2025-06-13 00:37:21 +07:00
parent 5008b4223a
commit 5b4198957a
10 changed files with 180 additions and 40 deletions
+7 -7
View File
@@ -661,7 +661,7 @@
</div>
</div>
<div data-source="openrouter" class="range-block">
<div class="range-block-title" title="Allow compressing requests by removing messages from the middle of the prompt.">
<div class="range-block-title" data-i18n="[title]Allow compressing requests by removing messages from the middle of the prompt." title="Allow compressing requests by removing messages from the middle of the prompt.">
<span data-i18n="Middle-out Transform">Middle-out Transform</span>
<a href="https://openrouter.ai/docs/transforms" target="_blank" rel="noreferrer noopener" class="note-link-span fa-solid fa-circle-question"></a>
</div>
@@ -674,7 +674,7 @@
</div>
</div>
<div data-source="openrouter">
Max prompt cost: <span id="openrouter_max_prompt_cost">Unknown</span>
<span data-i18n="Max prompt cost:">Max prompt cost:</span> <span id="openrouter_max_prompt_cost" data-i18n="Unknown">Unknown</span>
</div>
<hr>
<div class="range-block">
@@ -2714,12 +2714,12 @@
</select>
<div class="marginTopBot5">
<i class="fa-solid fa-flask"></i>
<span>Experimental feature. Use at your own risk.</span>
<span data-i18n="Experimental feature. Use at your own risk.">Experimental feature. Use at your own risk.</span>
</div>
<div class="marginTopBot5">
<small>
<i class="fa-solid fa-lightbulb"></i>
&nbsp;
&nbsp;<span data-i18n="Tabby model hint prefix"></span>
<code>inline_model_loading: True</code>
<span data-i18n="must be set in Tabby's config.yml to switch models.">
must be set in Tabby's config.yml to switch models.
@@ -2851,7 +2851,7 @@
<input id="openai_reverse_proxy" type="text" class="text_pole" placeholder="https://api.openai.com/v1" />
<small class="reverse_proxy_warning">
<span data-i18n="Doesn't work? Try adding">Doesn't work? Try adding</span> <code>/v1</code> <span data-i18n="at the end!">at the end!</span>
<code>/chat/completions</code> <b data-i18n="suffix will be added automatically.">suffix will be added automatically.</b>
<span data-i18n="completions note prefix"></span><code>/chat/completions</code> <b data-i18n="suffix will be added automatically.">suffix will be added automatically.</b>
</small>
</div>
<div class="range-block-title justifyLeft" data-i18n="Proxy Password">
@@ -3566,7 +3566,7 @@
<div>
<small>
<span data-i18n="Doesn't work? Try adding">Doesn't work? Try adding</span> <code>/v1</code> <span data-i18n="at the end!">at the end!</span>
<code>/chat/completions</code> <b data-i18n="suffix will be added automatically.">suffix will be added automatically.</b>
<b data-i18n="completions note prefix"></b><code>/chat/completions</code> <b data-i18n="suffix will be added automatically.">suffix will be added automatically.</b>
</small>
</div>
<h4>
@@ -4744,7 +4744,7 @@
<input id="never_resize_avatars" type="checkbox" />
<small data-i18n="Never resize avatars">Never resize avatars</small>
</label>
<label for="background_thumbnails_animation" class="checkbox_label" title="Make animated backgrounds static in the selection menu. This will reduce UI and network lag if you have a large amount. This is only a change for the selection menu.">
<label data-i18n="[title]Make animated backgrounds static in the selection menu. This will reduce UI and network lag if you have a large amount. This is only a change for the selection menu." for="background_thumbnails_animation" class="checkbox_label" title="Make animated backgrounds static in the selection menu. This will reduce UI and network lag if you have a large amount. This is only a change for the selection menu.">
<input id="background_thumbnails_animation" type="checkbox" />
<small data-i18n="Animated background thumbnails">Animated background thumbnails</small>
</label>
+143 -5
View File
@@ -105,7 +105,7 @@
"Adjust context size to worker capabilities": "Подстраивать размер контекста под возможности рабочих машин",
"Adjust response length to worker capabilities": "Подстраивать длину ответа под возможности рабочих машин",
"API key": "API-ключ",
"Tabby API key": "Tabby API-ключ",
"Tabby API key": "Ключ от Tabby API",
"Get it here:": "Получите здесь:",
"Register": "Зарегистрироваться",
"TogetherAI Model": "Модель TogetherAI",
@@ -275,7 +275,7 @@
"Chat History": "История чатов",
"Content": "Содержание",
"Selective": "Выборочно",
"Disable": "Отключено",
"Disable": "Откл.",
"Back to parent chat": "Вернуться в основной чат",
"Convert to group": "Сделать групповым",
"Start new chat": "Начать новый чат",
@@ -509,7 +509,7 @@
"Restore default prompt": "Восстановить станндартный промпт",
"New preset": "Новый пресет",
"Delete preset": "Удалить пресет",
"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",
"Refresh models": "Обновить модели",
@@ -965,7 +965,6 @@
"char_import_5": "Персонаж с AICharacterCards.com (прямая ссылка или ID)",
"char_import_6": "Прямая ссылка на PNG-файл (список разрешённых хостов находится в",
"char_import_7": ")",
"char_import_9": "Персонаж с Soulkyn (прямая ссылка)",
"Grammar String": "Грамматика",
"GBNF or EBNF, depends on the backend in use. If you're using this you should know which.": "GBNF или EBNF, зависит от бэкенда. Если вы это используете, то, скорее всего, сами знаете, какой именно.",
"Account": "Аккаунт",
@@ -2419,5 +2418,144 @@
"Update enabled": "Обновить включенные",
"Could not connect to API": "Не удалось подключиться к API",
"Connected to API": "Соединение с API установлено",
"Go back": "Назад"
"Go back": "Назад",
"Recent Chats": "Недавние чаты",
"Docs": "Документация",
"Temporary Chat": "Временный чат",
"Load": "Загрузить",
"Import from JSONL": "Импорт из формата JSONL",
"**Hint:** Set any character as your welcome page assistant from their \"More...\" menu.": "**Подсказка**: задайте персонажа, который будет встречать вас на главной странице. Для этого зайдите в меню \"Ещё...\" в интерфейсе карточки.",
"[The chat is empty]": "[Чат пуст]",
"Show more recent chats": "Больше недавних чатов",
"Show less recent chats": "Меньше недавних чатов",
"Rename chat": "Переименовать чат",
"Delete chat": "Удалить чат",
"Hide recent chats": "Скрыть недавние чаты",
"Show recent chats": "Показать недавние чаты",
"Set / Unset as Welcome Page Assistant": "Установить / снять с роли помощника на экране приветствия",
"${0} is a system assistant. Choose another character.": "Персонаж ${0} выбран в качестве системного помощника. Выберите другого.",
"Set ${0} as your assistant.": "Персонаж ${0} установлен в качестве помощника.",
"${0} is no longer your assistant.": "Персонаж ${0} снят с роли помощника.",
"Manage API keys": "Управление ключами",
"Key:": "Ключ:",
"No secrets saved.": "Ключей нет.",
"Add Secret": "Добавить ключ",
"Enter the secret value:": "Ключ:",
"Enter a label for the secret (optional):": "Название ключа (необязательно):",
"Copy ID": "Копировать ID",
"Rename Secret": "Переименовать ключ",
"Enter new label for the secret:": "Новое название ключа:",
"Delete Secret: ${0}": "Удалить ключ ${0}",
"Are you sure you want to delete this secret? This action cannot be undone.": "Вы точно хотите удалить этот ключ? Отменить будет невозможно.",
"Secret ID copied to clipboard.": "ID ключа скопирован в буфер обмена.",
"The key exposure might be disabled by the server config.": "Вероятно, в настройках сервера отключена возможность раскрытия ключей.",
"Failed to copy secret value": "Не удалось скопировать значение",
"Select": "Выделить",
"Allow compressing requests by removing messages from the middle of the prompt.": "Включает возможность сжатия запроса путём удаления сообщений из середины промпта.",
"Allow": "Разрешить",
"Forbid": "Запретить",
"Auto": "Авто",
"Max prompt cost:": "Макс. стоимость промпта:",
"Unknown": "Неизвестно",
"enable_functions_desc_4": "Не работает, если выбрана постобработка промпта с отключенными функциями!",
"This setting affects visibility only.": "Влияет только на видимость.",
"openrouter_web_search_fee": "Платная опция! Добавляет $0,02 к стоимости каждого промпта.",
"prompt_post_processing_semi_tools": "Semi-strict (чередовать роли, функции включены)",
"prompt_post_processing_strict_tools": "Strict (чередовать роли, сначала пользователь; функции включены)",
"prompt_post_processing_single": "Только одно сообщение пользователя (функции отключены)",
"prompt_post_processing_merge_tools": "Объединять идущие подряд сообщение с одной ролью (функции включены)",
"completions note prefix": "Постфикс ",
"suffix will be added automatically.": "будет добавлен автоматически.",
"Tabby Model": "Модель Tabby",
"Experimental feature. Use at your own risk.": "Экспериментальная возможность. Используйте на собственный риск.",
"Tabby model hint prefix": "Чтобы иметь возможность менять модели на лету, укажите параметр ",
"must be set in Tabby's config.yml to switch models.": " в файле config.yml на сервере Tabby.",
"Use an admin API key.": "Используйте admin-ключ.",
"Use OpenRouter website setting": "Использовать указанную на сайте OpenRouter",
"Allocates a portion of the response length for thinking (min: 1024 tokens, low: 10%, medium: 25%, high: 50%, max: 95%), but minimum 1024 tokens. Auto does not request thinking.": "Отводит часть ответа под рассуждения (Минимальные: 10%, Обычные: 25%, Подробные: 50%, Максимальные: 95%), но минимум 1024 токена. При выборе значение Авто рассуждения не запрашиваются.",
"Use system prompt": "Включить системный промпт",
"Send inline videos": "Отправлять inline-видео",
"video_inlining_hint_1": "Отправляет модели видео, если она поддерживает такую возможность. Чтобы прикрепить видео к чату, используйте на любом сообщении кнопку",
"video_inlining_hint_2": "либо меню",
"video_inlining_hint_3": ".",
"video_inlining_hint_4": "Видео должно весить не более 20 Мб и длиться не дольше 1 минуты.",
"Allocates a portion of the response length for thinking (Flash 2.5/Pro 2.5) (min: 0/128 tokens, low: 10%, medium: 25%, high: 50%, max: 24576/32768 tokens). Auto lets the model decide.": "Отводит часть ответа под рассуждения (Flash 2.5/Pro 2.5) (Минимальные: 0/128 токенов, Поверхностные: 10%, Обычные: 25%, Подробные: 50%, Максимальные: 24576/32768 токенов). При выборе значения Авто модель определяет объём самостоятельно.",
"Google Vertex AI Configuration": "Настройки Google Vertex AI",
"Authentication Mode": "Режим аутентификации:",
"Express Mode (API Key)": "Express Mode (ключ от API)",
"Full Version (Service Account)": "Полновесный (аккаунт на сервисе)",
"Google Vertex AI API Key": "Ключ от Google Vertex AI",
"Service Account Configuration": "Настройки аккаунта",
"Region": "Регион",
"Service Account JSON Content": "Данные аккаунта в формате JSON",
"Validate JSON": "Провалидировать JSON",
"View available regions and models": "Посмотреть список доступных регионов и моделей",
"Click to Edit": "Редактирование по клику",
"Click the message text in the chat log to edit it.": "Нажмите на текст сообщения в чате, чтобы приступить к редактированию.",
"Rounded": "Закруглённые",
"Notifications:": "Уведомления:",
"Top Left": "Слева сверху",
"Top Center": "Сверху по центру",
"Top Right": "Справа сверху",
"Bottom Left": "Снизу слева",
"Bottom Center": "Снизу по центру",
"Bottom Right": "Снизу справа",
"Additional Matching Sources": "Доп. места для поиска",
"Character Personality": "Резюме по личности персонажа",
"Cap the number of entry activation recursions": "Макс. глубина рекурсии при активации записи другой записью",
"Animated background thumbnails": "Статичное превью анимированных фонов",
"Make animated backgrounds static in the selection menu. This will reduce UI and network lag if you have a large amount. This is only a change for the selection menu.": "Отключить анимацию фонов при их предпросмотре в меню выбора. Может помочь снизить объём лагов интерфейса и/или интернет-соединения. Затрагивает только меню выбора.",
"Clean-Up": "Уборка",
"Find and delete backups, unused chats, files, images, etc.": "Найти и удалить бэкапы, неиспользуемые чаты, файлы, картинки и т.д.",
"Once deleted, the files will be gone forever!": "Восстановить удалённые файлы будет невозможно!",
"Make sure to back up your data in advance.": "Перед удалением не забывайте делать копии.",
"No results yet. Tap 'Scan' to start scanning.": "Пока ничего не найдено. Нажмите \"Начать сканирование\", чтобы запустить процесс поиска.",
"Scan": "Начать сканирование",
"Chats": "Чаты",
"Chat files associated with deleted characters.": "Чаты с удалёнными персонажами.",
"Group Chats": "Групповые чаты",
"Chat files associated with deleted groups.": "Чаты с удалёнными группами.",
"Chat Backups": "Копии чатов",
"Automatically generated chat backups.": "Автоматически создаваемые бэкапы чатов.",
"Settings Backups": "Копии настроек",
"Automatically generated settings backups.": "Автоматически создаваемые бэкапы настроек.",
"Delete all items in this category": "Удалить всё в этой категории",
"View item content": "Посмотреть содержимое",
"Download item": "Скачать содержимое",
"Delete this item": "Удалить содержимое",
"This will permanently delete the file. THIS CANNOT BE UNDONE!": "Файл будет удалён навсегда. ОТМЕНИТЬ БУДЕТ НЕВОЗМОЖНО!",
"This will permanently delete all files in this category. THIS CANNOT BE UNDONE!": "Все файлы в этой категории будут удалены. ОТМЕНИТЬ БУДЕТ НЕВОЗМОЖНО!",
"Close popup": "Закрыть окно",
"Branch or tag name (optional)": "Ветка или тэг (необязательно)",
"ext_regex_bulk_edit": "Массовое редактирование",
"Enable": "Вкл.",
"Provided free of charge by Pollinations.AI": "Предоставляется бесплатно сервисом Pollinations.AI",
"Avoid sending sensitive information. Provider's outputs may include ads.": "Не отправляйте чувствительную информацию. Тексты от провайдера могут содержать рекламу.",
"Pollinations Model": "Модель Pollinations",
"Character details are hidden.": "Информация о персонаже скрыта.",
"Allow / Forbid the use of global styles for this character.": "Разрешить/запретить использование персонажем глобальных стилей.",
"Choose how to apply CSS style tags if they are defined in Creator's Notes of this character:": "Выберите, к чему применять CSS-теги, объявленные в Заметках создателя у этого персонажа:",
"CAUTION: Malformed styles may cause issues.": "ОСТОРОЖНО: некорректно размеченные стили могут приводить к неожиданному поведению.",
"Just to Creator's Notes": "Только к Заметкам создателя",
"Apply to the entire app": "Ко всему приложению",
"Pin greeting message styles": "CSS из первого сообщения активен всегда",
"Always render style tags from greetings, even if the message is unloaded due to lazy loading.": "Всегда учитывать CSS-стили из первого сообщения, даже если оно на данный момент скрыто механизмом ленивой загрузки.",
"Secret": "Ключ",
"Save and connect": "Сохранить и подключиться",
"No scripts found": "Скриптов нет",
"Are you sure you want to delete this regex script?": "Вы точно хотите удалить этот скрипт?",
"Are you sure you want to move this regex script to scoped?": "Вы точно хотите сделать этот скрипт локальным?",
"Cannot edit scoped scripts in group chats.": "Локальные скрипты невозможно редактировать в групповом чате.",
"No character selected.": "Не выбран персонаж.",
"Are you sure you want to move this regex script to global?": "Вы точно хотите сделать этот скрипт глобальным?",
"Could not save regex script: The script name was undefined or empty!": "Не удалось сохранить regex-скрипт: Не указано либо не определено название скрипта!",
"This regex script will not work, but was saved anyway: A find regex isn't present.": "Этот regex не будет работать, но всё равно сохранён: Не указано рег. выражение для поиска",
"Ephemerality": "Иллюзорность",
"This regex script will not work, but was saved anyway: One \"Affects\" checkbox must be selected!": "Этот regex не будет работать, но всё равно сохранён: Должна быть отмечена хотя бы одна галочка в блоке \"Затрагивает\"!",
"This character has embedded regex script(s).": "У этого персонажа имеются встроенные regex скрипты.",
"Would you like to allow using them?": "Должны ли они продолжать работу?",
"If you want to do it later, select 'Regex' from the extensions menu.": "Если захотите включить их позже, выберите в меню расширений пункт \"Regex\".",
"Are you sure you want to delete the selected regex scripts?": "Вы точно хотите удалить выбранные скрипты?",
"Regex script \"${0}\" imported.": "Успешно импортирован скрипт ${0}",
"Invalid regex object.": "Некорректный объект рег. выражения."
}
+3 -1
View File
@@ -680,7 +680,7 @@ const SAFETY_CHAT = [
is_system: true,
is_user: false,
create_date: 0,
mes: 'You deleted a character/chat and arrived back here for safety reasons! Pick another character!',
mes: () => t`You deleted a character/chat and arrived back here for safety reasons! Pick another character!`,
},
];
@@ -6747,6 +6747,8 @@ export function resetChatState() {
name2 = (this_chid === undefined && neutralCharacterName) ? neutralCharacterName : systemUserName;
//unsets expected chid before reloading (related to getCharacters/printCharacters from using old arrays)
setCharacterId(undefined);
// translate system user's message before diaplaying
SAFETY_CHAT[0].mes = SAFETY_CHAT[0].mes();
// sets up system user to tell user about having deleted a character
chat.splice(0, chat.length, ...SAFETY_CHAT);
// resets chat metadata
+5 -5
View File
@@ -53,11 +53,11 @@ function filterAssets() {
}
const KNOWN_TYPES = {
'extension': 'Extensions',
'character': 'Characters',
'ambient': 'Ambient sounds',
'bgm': 'Background music',
'blip': 'Blip sounds',
'extension': t`Extensions`,
'character': t`Characters`,
'ambient': t`Ambient sounds`,
'bgm': t`Background music`,
'blip': t`Blip sounds`,
};
async function downloadAssetsList(url) {
@@ -53,7 +53,7 @@
<small data-i18n="ext_regex_global_scripts_desc">
Available for all characters. Saved to local settings.
</small>
<div id="saved_regex_scripts" class="flex-container regex-script-container flexFlowColumn"></div>
<div id="saved_regex_scripts" no-scripts-text="No scripts found" data-i18n="[no-scripts-text]No scripts found" class="flex-container regex-script-container flexFlowColumn"></div>
</div>
<hr />
<div id="scoped_scripts_block" class="padding5">
@@ -68,7 +68,7 @@
<small data-i18n="ext_regex_scoped_scripts_desc">
Only available for this character. Saved to the card data.
</small>
<div id="saved_scoped_scripts" class="flex-container regex-script-container flexFlowColumn"></div>
<div id="saved_scoped_scripts" no-scripts-text="No scripts found" data-i18n="[no-scripts-text]No scripts found" class="flex-container regex-script-container flexFlowColumn"></div>
</div>
</div>
</div>
+1 -1
View File
@@ -146,7 +146,7 @@
</select>
</label>
<span>
<small data-i18n="ext_regex_other_options" data-i18n="Ephemerality">Ephemerality</small>
<small data-i18n="Ephemerality">Ephemerality</small>
<span class="fa-solid fa-circle-question note-link-span" data-i18n="[title]ext_regex_other_options_desc" title="By default, regex scripts alter the chat file directly and irreversibly.&#13;Enabling either (or both) of the options below will prevent chat file alteration, while still altering the specified item(s)."></span>
</span>
<label class="checkbox flex-container" data-i18n="[title]ext_regex_only_format_visual_desc" title="Chat history file contents won't change, but regex will be applied to the messages displayed in the Chat UI.">
@@ -1,5 +1,5 @@
<div>
<h3>This character has embedded regex script(s).</h3>
<h3>Would you like to allow using them?</h3>
<div class="m-b-1">If you want to do it later, select "Regex" from the extensions menu.</div>
<h3 data-i18n="This character has embedded regex script(s).">This character has embedded regex script(s).</h3>
<h3 data-i18n="Would you like to allow using them?">Would you like to allow using them?</h3>
<div class="m-b-1" data-i18n="If you want to do it later, select 'Regex' from the extensions menu.">If you want to do it later, select "Regex" from the extensions menu.</div>
</div>
+14 -14
View File
@@ -45,18 +45,18 @@ async function saveRegexScript(regexScript, existingScriptIndex, isScoped) {
// Is the script name undefined or empty?
if (!regexScript.scriptName) {
toastr.error('Could not save regex script: The script name was undefined or empty!');
toastr.error(t`Could not save regex script: The script name was undefined or empty!`);
return;
}
// Is a find regex present?
if (regexScript.findRegex.length === 0) {
toastr.warning('This regex script will not work, but was saved anyway: A find regex isn\'t present.');
toastr.warning(t`This regex script will not work, but was saved anyway: A find regex isn't present.`);
}
// Is there someplace to place results?
if (regexScript.placement.length === 0) {
toastr.warning('This regex script will not work, but was saved anyway: One "Affects" checkbox must be selected!');
toastr.warning(t`This regex script will not work, but was saved anyway: One "Affects" checkbox must be selected!`);
}
if (existingScriptIndex !== -1) {
@@ -139,7 +139,7 @@ async function loadRegexScripts() {
await onRegexEditorOpenClick(scriptHtml.attr('id'), isScoped);
});
scriptHtml.find('.move_to_global').on('click', async function () {
const confirm = await callGenericPopup('Are you sure you want to move this regex script to global?', POPUP_TYPE.CONFIRM);
const confirm = await callGenericPopup(t`Are you sure you want to move this regex script to global?`, POPUP_TYPE.CONFIRM);
if (!confirm) {
return;
@@ -150,16 +150,16 @@ async function loadRegexScripts() {
});
scriptHtml.find('.move_to_scoped').on('click', async function () {
if (this_chid === undefined) {
toastr.error('No character selected.');
toastr.error(t`No character selected.`);
return;
}
if (selected_group) {
toastr.error('Cannot edit scoped scripts in group chats.');
toastr.error(t`Cannot edit scoped scripts in group chats.`);
return;
}
const confirm = await callGenericPopup('Are you sure you want to move this regex script to scoped?', POPUP_TYPE.CONFIRM);
const confirm = await callGenericPopup(t`Are you sure you want to move this regex script to scoped?`, POPUP_TYPE.CONFIRM);
if (!confirm) {
return;
@@ -174,7 +174,7 @@ async function loadRegexScripts() {
download(fileData, fileName, 'application/json');
});
scriptHtml.find('.delete_regex').on('click', async function () {
const confirm = await callGenericPopup('Are you sure you want to delete this regex script?', POPUP_TYPE.CONFIRM);
const confirm = await callGenericPopup(t`Are you sure you want to delete this regex script?`, POPUP_TYPE.CONFIRM);
if (!confirm) {
return;
@@ -483,10 +483,10 @@ async function onRegexImportObjectChange(regexScript, isScoped) {
saveSettingsDebounced();
await loadRegexScripts();
toastr.success(`Regex script "${regexScript.scriptName}" imported.`);
toastr.success(t`Regex script "${regexScript.scriptName}" imported.`);
} catch (error) {
console.log(error);
toastr.error('Invalid regex object.');
toastr.error(t`Invalid regex object.`);
return;
}
}
@@ -578,12 +578,12 @@ jQuery(async () => {
});
$('#open_scoped_editor').on('click', function () {
if (this_chid === undefined) {
toastr.error('No character selected.');
toastr.error(t`No character selected.`);
return;
}
if (selected_group) {
toastr.error('Cannot edit scoped scripts in group chats.');
toastr.error(t`Cannot edit scoped scripts in group chats.`);
return;
}
@@ -707,12 +707,12 @@ jQuery(async () => {
$('#regex_scoped_toggle').on('input', function () {
if (this_chid === undefined) {
toastr.error('No character selected.');
toastr.error(t`No character selected.`);
return;
}
if (selected_group) {
toastr.error('Cannot edit scoped scripts in group chats.');
toastr.error(t`Cannot edit scoped scripts in group chats.`);
return;
}
+1 -1
View File
@@ -15,7 +15,7 @@
}
.regex-script-container:empty::after {
content: "No scripts found";
content: attr(no-scripts-text);
font-size: 0.95em;
opacity: 0.7;
display: block;
+1 -1
View File
@@ -1956,7 +1956,7 @@ function saveModelList(data) {
}
function appendOpenRouterOptions(model_list, groupModels = false, sort = false) {
$('#model_openrouter_select').append($('<option>', { value: openrouter_website_model, text: 'Use OpenRouter website setting' }));
$('#model_openrouter_select').append($('<option>', { value: openrouter_website_model, text: t`Use OpenRouter website setting` }));
const appendOption = (model, parent = null) => {
(parent || $('#model_openrouter_select')).append(