Merge remote-tracking branch 'upstream/dev' into playwright

# Conflicts:
#	backend/open_webui/retrieval/web/utils.py
This commit is contained in:
Rory 2025-02-03 22:32:46 -06:00
commit 7bac1a170d
60 changed files with 477 additions and 309 deletions

View File

@ -1,3 +1,5 @@
import validators
from typing import Optional
from urllib.parse import urlparse
@ -10,6 +12,8 @@ def get_filtered_results(results, filter_list):
filtered_results = []
for result in results:
url = result.get("url") or result.get("link", "")
if not validators.url(url):
continue
domain = urlparse(url).netloc
if any(domain.endswith(filtered_domain) for filtered_domain in filter_list):
filtered_results.append(result)

View File

@ -48,6 +48,15 @@ def validate_url(url: Union[str, Sequence[str]]):
else:
return False
def safe_validate_urls(url: Sequence[str]) -> Sequence[str]:
valid_urls = []
for u in url:
try:
if validate_url(u):
valid_urls.append(u)
except ValueError:
continue
return valid_urls
def resolve_hostname(hostname):
# Get address information
addr_info = socket.getaddrinfo(hostname, None)
@ -243,12 +252,12 @@ def get_web_loader(
verify_ssl: bool = True,
requests_per_second: int = 2,
):
# Check if the URL is valid
if not validate_url(urls):
raise ValueError(ERROR_MESSAGES.INVALID_URL)
# Check if the URLs are valid
safe_urls = safe_validate_urls([urls] if isinstance(urls, str) else urls)
web_loader_args = {
"urls": urls,
"urls": safe_urls,
"verify_ssl": verify_ssl,
"requests_per_second": requests_per_second,
"continue_on_failure": True

View File

@ -398,7 +398,7 @@
dir={$settings?.chatDirection ?? 'LTR'}
>
{#if files.length > 0}
<div class="mx-1 mt-2.5 mb-1 flex flex-wrap gap-2">
<div class="mx-2 mt-2.5 flex flex-wrap gap-2">
{#each files as file, fileIdx}
{#if file.type === 'image'}
<div class=" relative group">
@ -411,7 +411,7 @@
</div>
<div class=" absolute -top-1 -right-1">
<button
class=" bg-gray-400 text-white border border-white rounded-full group-hover:visible invisible transition"
class=" bg-white text-black border border-white rounded-full group-hover:visible invisible transition"
type="button"
on:click={() => {
files.splice(fileIdx, 1);
@ -453,35 +453,9 @@
</div>
{/if}
<div class=" flex">
<div class="ml-1 self-end mb-1.5 flex space-x-1">
<InputMenu
{screenCaptureHandler}
uploadFilesHandler={() => {
filesInputElement.click();
}}
>
<button
class="bg-transparent hover:bg-white/80 text-gray-800 dark:text-white dark:hover:bg-gray-800 transition rounded-full p-2 outline-none focus:outline-none"
type="button"
aria-label="More"
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="size-5"
>
<path
d="M10.75 4.75a.75.75 0 0 0-1.5 0v4.5h-4.5a.75.75 0 0 0 0 1.5h4.5v4.5a.75.75 0 0 0 1.5 0v-4.5h4.5a.75.75 0 0 0 0-1.5h-4.5v-4.5Z"
/>
</svg>
</button>
</InputMenu>
</div>
<div class="px-2.5">
<div
class="scrollbar-hidden text-left bg-transparent dark:text-gray-100 outline-none w-full py-2.5 px-1 rounded-xl resize-none h-fit max-h-80 overflow-auto"
class="scrollbar-hidden font-primary text-left bg-transparent dark:text-gray-100 outline-none w-full pt-2.5 pb-1 px-1 rounded-xl resize-none h-fit max-h-80 overflow-auto"
>
<RichTextInput
bind:value={content}
@ -528,8 +502,36 @@
}}
/>
</div>
</div>
<div class="self-end mb-1.5 flex space-x-1 mr-1">
<div class=" flex justify-between mb-2">
<div class="ml-1 self-end flex space-x-1">
<InputMenu
{screenCaptureHandler}
uploadFilesHandler={() => {
filesInputElement.click();
}}
>
<button
class="bg-transparent hover:bg-white/80 text-gray-800 dark:text-white dark:hover:bg-gray-800 transition rounded-full p-1.5 outline-none focus:outline-none"
type="button"
aria-label="More"
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="size-5"
>
<path
d="M10.75 4.75a.75.75 0 0 0-1.5 0v4.5h-4.5a.75.75 0 0 0 0 1.5h4.5v4.5a.75.75 0 0 0 1.5 0v-4.5h4.5a.75.75 0 0 0 0-1.5h-4.5v-4.5Z"
/>
</svg>
</button>
</InputMenu>
</div>
<div class="self-end flex space-x-1 mr-1">
{#if content === ''}
<Tooltip content={$i18n.t('Record voice')}>
<button
@ -591,7 +593,7 @@
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="size-6"
class="size-5"
>
<path
fill-rule="evenodd"

View File

@ -41,6 +41,7 @@
convertMessagesToHistory,
copyToClipboard,
getMessageContentParts,
createMessagesList,
extractSentencesForAudio,
promptTemplate,
splitStream,
@ -226,7 +227,7 @@
}
await tick();
saveChatHandler(_chatId);
saveChatHandler(_chatId, history);
};
const chatEventHandler = async (event, cb) => {
@ -826,20 +827,6 @@
messagesContainerElement.scrollTop = messagesContainerElement.scrollHeight;
}
};
const createMessagesList = (responseMessageId) => {
if (responseMessageId === null) {
return [];
}
const message = history.messages[responseMessageId];
if (message?.parentId) {
return [...createMessagesList(message.parentId), message];
} else {
return [message];
}
};
const chatCompletedHandler = async (chatId, modelId, responseMessageId, messages) => {
const res = await chatCompleted(localStorage.token, {
model: modelId,
@ -896,7 +883,7 @@
};
const chatActionHandler = async (chatId, actionId, modelId, responseMessageId, event = null) => {
const messages = createMessagesList(responseMessageId);
const messages = createMessagesList(history, responseMessageId);
const res = await chatAction(localStorage.token, actionId, {
model: modelId,
@ -965,7 +952,7 @@
const modelId = selectedModels[0];
const model = $models.filter((m) => m.id === modelId).at(0);
const messages = createMessagesList(history.currentId);
const messages = createMessagesList(history, history.currentId);
const parentMessage = messages.length !== 0 ? messages.at(-1) : null;
const userMessageId = uuidv4();
@ -1010,9 +997,9 @@
}
if (messages.length === 0) {
await initChatHandler();
await initChatHandler(history);
} else {
await saveChatHandler($chatId);
await saveChatHandler($chatId, history);
}
}
};
@ -1074,9 +1061,9 @@
}
if (messages.length === 0) {
await initChatHandler();
await initChatHandler(history);
} else {
await saveChatHandler($chatId);
await saveChatHandler($chatId, history);
}
};
@ -1210,7 +1197,12 @@
);
history.messages[message.id] = message;
await chatCompletedHandler(chatId, message.model, message.id, createMessagesList(message.id));
await chatCompletedHandler(
chatId,
message.model,
message.id,
createMessagesList(history, message.id)
);
}
console.log(data);
@ -1226,7 +1218,7 @@
const submitPrompt = async (userPrompt, { _raw = false } = {}) => {
console.log('submitPrompt', userPrompt, $chatId);
const messages = createMessagesList(history.currentId);
const messages = createMessagesList(history, history.currentId);
const _selectedModels = selectedModels.map((modelId) =>
$models.map((m) => m.id).includes(modelId) ? modelId : ''
);
@ -1325,25 +1317,30 @@
saveSessionSelectedModels();
await sendPrompt(userPrompt, userMessageId, { newChat: true });
await sendPrompt(history, userPrompt, userMessageId, { newChat: true });
};
const sendPrompt = async (
history,
prompt: string,
parentId: string,
{ modelId = null, modelIdx = null, newChat = false } = {}
) => {
let _chatId = JSON.parse(JSON.stringify($chatId));
// Create new chat if newChat is true and first user message
if (
newChat &&
history.messages[history.currentId].parentId === null &&
history.messages[history.currentId].role === 'user'
) {
await initChatHandler();
_chatId = await initChatHandler(history);
} else {
await saveChatHandler($chatId);
await saveChatHandler(_chatId, history);
}
await tick();
// If modelId is provided, use it, else use selected model
let selectedModelIds = modelId
? [modelId]
@ -1390,16 +1387,15 @@
await tick();
// Save chat after all messages have been created
await saveChatHandler($chatId);
await saveChatHandler(_chatId, history);
const _chatId = JSON.parse(JSON.stringify($chatId));
await Promise.all(
selectedModelIds.map(async (modelId, _modelIdx) => {
console.log('modelId', modelId);
const model = $models.filter((m) => m.id === modelId).at(0);
if (model) {
const messages = createMessagesList(parentId);
const messages = createMessagesList(history, parentId);
// If there are image files, check if model is vision capable
const hasImages = messages.some((message) =>
message.files?.some((file) => file.type === 'image')
@ -1444,7 +1440,7 @@
const chatEventEmitter = await getChatEventEmitter(model.id, _chatId);
scrollToBottom();
await sendPromptSocket(model, responseMessageId, _chatId);
await sendPromptSocket(history, model, responseMessageId, _chatId);
if (chatEventEmitter) clearInterval(chatEventEmitter);
} else {
@ -1457,7 +1453,7 @@
chats.set(await getChatList(localStorage.token, $currentChatPage));
};
const sendPromptSocket = async (model, responseMessageId, _chatId) => {
const sendPromptSocket = async (history, model, responseMessageId, _chatId) => {
const responseMessage = history.messages[responseMessageId];
const userMessage = history.messages[responseMessage.parentId];
@ -1507,7 +1503,7 @@
}`
}
: undefined,
...createMessagesList(responseMessageId).map((message) => ({
...createMessagesList(history, responseMessageId).map((message) => ({
...message,
content: removeDetails(message.content, ['reasoning', 'code_interpreter'])
}))
@ -1704,7 +1700,7 @@
history.currentId = userMessageId;
await tick();
await sendPrompt(userPrompt, userMessageId);
await sendPrompt(history, userPrompt, userMessageId);
};
const regenerateResponse = async (message) => {
@ -1716,11 +1712,11 @@
if ((userMessage?.models ?? [...selectedModels]).length == 1) {
// If user message has only one model selected, sendPrompt automatically selects it for regeneration
await sendPrompt(userPrompt, userMessage.id);
await sendPrompt(history, userPrompt, userMessage.id);
} else {
// If there are multiple models selected, use the model of the response message for regeneration
// e.g. many model chat
await sendPrompt(userPrompt, userMessage.id, {
await sendPrompt(history, userPrompt, userMessage.id, {
modelId: message.model,
modelIdx: message.modelIdx
});
@ -1742,7 +1738,7 @@
.at(0);
if (model) {
await sendPromptSocket(model, responseMessage.id, _chatId);
await sendPromptSocket(history, model, responseMessage.id, _chatId);
}
}
};
@ -1785,7 +1781,7 @@
}
}
await saveChatHandler(_chatId);
await saveChatHandler(_chatId, history);
} else {
console.error(res);
}
@ -1794,42 +1790,48 @@
}
};
const initChatHandler = async () => {
const initChatHandler = async (history) => {
let _chatId = $chatId;
if (!$temporaryChatEnabled) {
chat = await createNewChat(localStorage.token, {
id: $chatId,
id: _chatId,
title: $i18n.t('New Chat'),
models: selectedModels,
system: $settings.system ?? undefined,
params: params,
history: history,
messages: createMessagesList(history.currentId),
messages: createMessagesList(history, history.currentId),
tags: [],
timestamp: Date.now()
});
currentChatPage.set(1);
await chats.set(await getChatList(localStorage.token, $currentChatPage));
await chatId.set(chat.id);
_chatId = chat.id;
await chatId.set(_chatId);
window.history.replaceState(history.state, '', `/c/${chat.id}`);
await chats.set(await getChatList(localStorage.token, $currentChatPage));
currentChatPage.set(1);
window.history.replaceState(history.state, '', `/c/${_chatId}`);
} else {
_chatId = 'local';
await chatId.set('local');
}
await tick();
return _chatId;
};
const saveChatHandler = async (_chatId) => {
const saveChatHandler = async (_chatId, history) => {
if ($chatId == _chatId) {
if (!$temporaryChatEnabled) {
chat = await updateChatById(localStorage.token, _chatId, {
models: selectedModels,
history: history,
messages: createMessagesList(history.currentId),
messages: createMessagesList(history, history.currentId),
params: params,
files: chatFiles
});
currentChatPage.set(1);
await chats.set(await getChatList(localStorage.token, $currentChatPage));
}
@ -1933,7 +1935,7 @@
{/if}
<div class="flex flex-col flex-auto z-10 w-full">
{#if $settings?.landingPageMode === 'chat' || createMessagesList(history.currentId).length > 0}
{#if $settings?.landingPageMode === 'chat' || createMessagesList(history, history.currentId).length > 0}
<div
class=" pb-2.5 flex flex-col justify-between w-full flex-auto overflow-auto h-0 max-w-full z-10 scrollbar-hidden"
id="messages-container"

View File

@ -22,23 +22,27 @@
import { blobToFile, compressImage, createMessagesList, findWordIndices } from '$lib/utils';
import { transcribeAudio } from '$lib/apis/audio';
import { uploadFile } from '$lib/apis/files';
import { getTools } from '$lib/apis/tools';
import { generateAutoCompletion } from '$lib/apis';
import { deleteFileById } from '$lib/apis/files';
import { WEBUI_BASE_URL, WEBUI_API_BASE_URL, PASTED_TEXT_CHARACTER_LIMIT } from '$lib/constants';
import Tooltip from '../common/Tooltip.svelte';
import InputMenu from './MessageInput/InputMenu.svelte';
import Headphone from '../icons/Headphone.svelte';
import VoiceRecording from './MessageInput/VoiceRecording.svelte';
import FileItem from '../common/FileItem.svelte';
import FilesOverlay from './MessageInput/FilesOverlay.svelte';
import Commands from './MessageInput/Commands.svelte';
import XMark from '../icons/XMark.svelte';
import RichTextInput from '../common/RichTextInput.svelte';
import { generateAutoCompletion } from '$lib/apis';
import { error, text } from '@sveltejs/kit';
import Tooltip from '../common/Tooltip.svelte';
import FileItem from '../common/FileItem.svelte';
import Image from '../common/Image.svelte';
import { deleteFileById } from '$lib/apis/files';
import XMark from '../icons/XMark.svelte';
import Headphone from '../icons/Headphone.svelte';
import GlobeAlt from '../icons/GlobeAlt.svelte';
import PhotoSolid from '../icons/PhotoSolid.svelte';
import Photo from '../icons/Photo.svelte';
import CommandLine from '../icons/CommandLine.svelte';
const i18n = getContext('i18n');
@ -386,7 +390,7 @@
</div>
<div class="w-full relative">
{#if atSelectedModel !== undefined || selectedToolIds.length > 0 || webSearchEnabled || imageGenerationEnabled || codeInterpreterEnabled}
{#if atSelectedModel !== undefined || selectedToolIds.length > 0 || imageGenerationEnabled || codeInterpreterEnabled}
<div
class="px-3 pb-0.5 pt-1.5 text-left w-full flex flex-col absolute bottom-0 left-0 right-0 bg-gradient-to-t from-white dark:from-gray-900 z-10"
>
@ -454,22 +458,6 @@
</div>
{/if}
{#if webSearchEnabled}
<div class="flex items-center justify-between w-full">
<div class="flex items-center gap-2.5 text-sm dark:text-gray-500">
<div class="pl-1">
<span class="relative flex size-2">
<span
class="animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75"
/>
<span class="relative inline-flex rounded-full size-2 bg-green-500" />
</span>
</div>
<div class=" translate-y-[0.5px]">{$i18n.t('Search the web')}</div>
</div>
</div>
{/if}
{#if atSelectedModel !== undefined}
<div class="flex items-center justify-between w-full">
<div class="pl-[1px] flex items-center gap-2 text-sm dark:text-gray-500">
@ -585,7 +573,7 @@
dir={$settings?.chatDirection ?? 'LTR'}
>
{#if files.length > 0}
<div class="mx-1 mt-2.5 mb-1 flex items-center flex-wrap gap-2">
<div class="mx-2 mt-2.5 flex items-center flex-wrap gap-2">
{#each files as file, fileIdx}
{#if file.type === 'image'}
<div class=" relative group">
@ -623,7 +611,7 @@
</div>
<div class=" absolute -top-1 -right-1">
<button
class=" bg-gray-400 text-white border border-white rounded-full group-hover:visible invisible transition"
class=" bg-white text-black border border-white rounded-full group-hover:visible invisible transition"
type="button"
on:click={() => {
files.splice(fileIdx, 1);
@ -673,66 +661,10 @@
</div>
{/if}
<div class=" flex">
<div class="ml-1 self-end mb-1.5 flex space-x-1">
<InputMenu
bind:imageGenerationEnabled
bind:codeInterpreterEnabled
bind:webSearchEnabled
bind:selectedToolIds
{screenCaptureHandler}
uploadFilesHandler={() => {
filesInputElement.click();
}}
uploadGoogleDriveHandler={async () => {
try {
const fileData = await createPicker();
if (fileData) {
const file = new File([fileData.blob], fileData.name, {
type: fileData.blob.type
});
await uploadFileHandler(file);
} else {
console.log('No file was selected from Google Drive');
}
} catch (error) {
console.error('Google Drive Error:', error);
toast.error(
$i18n.t('Error accessing Google Drive: {{error}}', {
error: error.message
})
);
}
}}
onClose={async () => {
await tick();
const chatInput = document.getElementById('chat-input');
chatInput?.focus();
}}
>
<button
class="bg-transparent hover:bg-white/80 text-gray-800 dark:text-white dark:hover:bg-gray-800 transition rounded-full p-2 outline-none focus:outline-none"
type="button"
aria-label="More"
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="size-5"
>
<path
d="M10.75 4.75a.75.75 0 0 0-1.5 0v4.5h-4.5a.75.75 0 0 0 0 1.5h4.5v4.5a.75.75 0 0 0 1.5 0v-4.5h4.5a.75.75 0 0 0 0-1.5h-4.5v-4.5Z"
/>
</svg>
</button>
</InputMenu>
</div>
<div class="px-2.5">
{#if $settings?.richTextInput ?? true}
<div
class="scrollbar-hidden text-left bg-transparent dark:text-gray-100 outline-none w-full py-2.5 px-1 rounded-xl resize-none h-fit max-h-80 overflow-auto"
class="scrollbar-hidden text-left bg-transparent dark:text-gray-100 outline-none w-full pt-2.5 pb-1 px-1 rounded-xl resize-none h-fit max-h-80 overflow-auto"
>
<RichTextInput
bind:this={chatInputElement}
@ -936,7 +868,7 @@
<textarea
id="chat-input"
bind:this={chatInputElement}
class="scrollbar-hidden bg-transparent dark:text-gray-100 outline-none w-full py-3 px-1 rounded-xl resize-none h-[48px]"
class="scrollbar-hidden bg-transparent dark:text-gray-100 outline-none w-full pt-3 pb-1 px-1 rounded-xl resize-none"
placeholder={placeholder ? placeholder : $i18n.t('Send a Message')}
bind:value={prompt}
on:keypress={(e) => {
@ -1125,8 +1057,120 @@
}}
/>
{/if}
</div>
<div class="self-end mb-1.5 flex space-x-1 mr-1">
<div class=" flex justify-between mb-2">
<div class="ml-1 self-end gap-0.5 flex items-center">
<InputMenu
bind:selectedToolIds
{screenCaptureHandler}
{inputFilesHandler}
uploadFilesHandler={() => {
filesInputElement.click();
}}
uploadGoogleDriveHandler={async () => {
try {
const fileData = await createPicker();
if (fileData) {
const file = new File([fileData.blob], fileData.name, {
type: fileData.blob.type
});
await uploadFileHandler(file);
} else {
console.log('No file was selected from Google Drive');
}
} catch (error) {
console.error('Google Drive Error:', error);
toast.error(
$i18n.t('Error accessing Google Drive: {{error}}', {
error: error.message
})
);
}
}}
onClose={async () => {
await tick();
const chatInput = document.getElementById('chat-input');
chatInput?.focus();
}}
>
<button
class="bg-transparent hover:bg-gray-100 text-gray-800 dark:text-white dark:hover:bg-gray-800 transition rounded-full p-1.5 outline-none focus:outline-none"
type="button"
aria-label="More"
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="size-5"
>
<path
d="M10.75 4.75a.75.75 0 0 0-1.5 0v4.5h-4.5a.75.75 0 0 0 0 1.5h4.5v4.5a.75.75 0 0 0 1.5 0v-4.5h4.5a.75.75 0 0 0 0-1.5h-4.5v-4.5Z"
/>
</svg>
</button>
</InputMenu>
{#if $_user}
{#if $config?.features?.enable_web_search && ($_user.role === 'admin' || $_user?.permissions?.features?.web_search)}
<Tooltip content={$i18n.t('Search the internet')} placement="top">
<button
on:click|preventDefault={() => (webSearchEnabled = !webSearchEnabled)}
type="button"
class="px-1.5 sm:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-none max-w-full overflow-hidden {webSearchEnabled
? 'bg-blue-100 dark:bg-blue-500/20 text-blue-500 dark:text-blue-400'
: 'bg-transparent text-gray-600 dark:text-gray-400 border-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800'}"
>
<GlobeAlt className="size-5" strokeWidth="1.75" />
<span
class="hidden sm:block whitespace-nowrap overflow-hidden text-ellipsis translate-y-[0.5px] mr-0.5"
>{$i18n.t('Web Search')}</span
>
</button>
</Tooltip>
{/if}
{#if $config?.features?.enable_image_generation && ($_user.role === 'admin' || $_user?.permissions?.features?.image_generation)}
<Tooltip content={$i18n.t('Generate an image')} placement="top">
<button
on:click|preventDefault={() =>
(imageGenerationEnabled = !imageGenerationEnabled)}
type="button"
class="px-1.5 sm:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-none max-w-full overflow-hidden {imageGenerationEnabled
? 'bg-gray-100 dark:bg-gray-500/20 text-gray-600 dark:text-gray-400'
: 'bg-transparent text-gray-600 dark:text-gray-300 border-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 '}"
>
<Photo className="size-5" strokeWidth="1.75" />
<span
class="hidden sm:block whitespace-nowrap overflow-hidden text-ellipsis translate-y-[0.5px] mr-0.5"
>{$i18n.t('Image')}</span
>
</button>
</Tooltip>
{/if}
<Tooltip content={$i18n.t('Executes code for analysis')} placement="top">
<button
on:click|preventDefault={() =>
(codeInterpreterEnabled = !codeInterpreterEnabled)}
type="button"
class="px-1.5 sm:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-none max-w-full overflow-hidden {codeInterpreterEnabled
? 'bg-gray-100 dark:bg-gray-500/20 text-gray-600 dark:text-gray-400'
: 'bg-transparent text-gray-600 dark:text-gray-300 border-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 '}"
>
<CommandLine className="size-5" strokeWidth="1.75" />
<span
class="hidden sm:block whitespace-nowrap overflow-hidden text-ellipsis translate-y-[0.5px] mr-0.5"
>{$i18n.t('Code Intepreter')}</span
>
</button>
</Tooltip>
{/if}
</div>
<div class="self-end flex space-x-1 mr-1">
{#if !history?.currentId || history.messages[history.currentId]?.done == true}
<Tooltip content={$i18n.t('Record voice')}>
<button
@ -1181,7 +1225,9 @@
<div class=" flex items-center">
<Tooltip content={$i18n.t('Call')}>
<button
class=" bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full p-2 self-center"
class=" {webSearchEnabled
? 'bg-blue-500 text-white hover:bg-blue-400 '
: 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100'} transition rounded-full p-1.5 self-center"
type="button"
on:click={async () => {
if (selectedModels.length > 1) {
@ -1234,7 +1280,9 @@
<button
id="send-message-button"
class="{prompt !== ''
? 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100 '
? webSearchEnabled
? 'bg-blue-500 text-white hover:bg-blue-400 '
: 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100 '
: 'text-white bg-gray-200 dark:text-gray-900 dark:bg-gray-700 disabled'} transition rounded-full p-1.5 self-center"
type="submit"
disabled={prompt === ''}
@ -1243,7 +1291,7 @@
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="size-6"
class="size-5"
>
<path
fill-rule="evenodd"

View File

@ -21,31 +21,17 @@
export let screenCaptureHandler: Function;
export let uploadFilesHandler: Function;
export let inputFilesHandler: Function;
export let uploadGoogleDriveHandler: Function;
export let selectedToolIds: string[] = [];
export let webSearchEnabled: boolean;
export let imageGenerationEnabled: boolean;
export let codeInterpreterEnabled: boolean;
export let onClose: Function;
let tools = {};
let show = false;
let showImageGeneration = false;
$: showImageGeneration =
$config?.features?.enable_image_generation &&
($user.role === 'admin' || $user?.permissions?.features?.image_generation);
let showWebSearch = false;
$: showWebSearch =
$config?.features?.enable_web_search &&
($user.role === 'admin' || $user?.permissions?.features?.web_search);
$: if (show) {
init();
}
@ -67,8 +53,31 @@
return a;
}, {});
};
const detectMobile = () => {
const userAgent = navigator.userAgent || navigator.vendor || window.opera;
return /android|iphone|ipad|ipod|windows phone/i.test(userAgent);
};
function handleFileChange(event) {
const inputFiles = Array.from(event.target?.files);
if (inputFiles && inputFiles.length > 0) {
console.log(inputFiles);
inputFilesHandler(inputFiles);
}
}
</script>
<!-- Hidden file input used to open the camera on mobile -->
<input
id="camera-input"
type="file"
accept="image/*"
capture="environment"
on:change={handleFileChange}
style="display: none;"
/>
<Dropdown
bind:show
on:change={(e) => {
@ -134,76 +143,32 @@
<hr class="border-black/5 dark:border-white/5 my-1" />
{/if}
{#if showImageGeneration}
<button
class="flex w-full justify-between gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer rounded-xl"
on:click={() => {
imageGenerationEnabled = !imageGenerationEnabled;
}}
>
<div class="flex-1 flex items-center gap-2">
<PhotoSolid />
<div class=" line-clamp-1">{$i18n.t('Image')}</div>
</div>
<Switch state={imageGenerationEnabled} />
</button>
{/if}
<button
class="flex w-full justify-between gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer rounded-xl"
on:click={() => {
codeInterpreterEnabled = !codeInterpreterEnabled;
}}
<Tooltip
content={!fileUploadEnabled ? $i18n.t('You do not have permission to upload files') : ''}
className="w-full"
>
<div class="flex-1 flex items-center gap-2">
<CommandLineSolid />
<div class=" line-clamp-1">{$i18n.t('Code Intepreter')}</div>
</div>
<Switch state={codeInterpreterEnabled} />
</button>
{#if showWebSearch}
<button
class="flex w-full justify-between gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer rounded-xl"
<DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-xl {!fileUploadEnabled
? 'opacity-50'
: ''}"
on:click={() => {
webSearchEnabled = !webSearchEnabled;
if (fileUploadEnabled) {
if (!detectMobile()) {
screenCaptureHandler();
} else {
const cameraInputElement = document.getElementById('camera-input');
if (cameraInputElement) {
cameraInputElement.click();
}
}
}
}}
>
<div class="flex-1 flex items-center gap-2">
<GlobeAltSolid />
<div class=" line-clamp-1">{$i18n.t('Web Search')}</div>
</div>
<Switch state={webSearchEnabled} />
</button>
{/if}
{#if showImageGeneration || showWebSearch}
<hr class="border-black/5 dark:border-white/5 my-1" />
{/if}
{#if !$mobile}
<Tooltip
content={!fileUploadEnabled ? $i18n.t('You do not have permission to upload files') : ''}
className="w-full"
>
<DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-xl {!fileUploadEnabled
? 'opacity-50'
: ''}"
on:click={() => {
if (fileUploadEnabled) {
screenCaptureHandler();
}
}}
>
<CameraSolid />
<div class=" line-clamp-1">{$i18n.t('Capture')}</div>
</DropdownMenu.Item>
</Tooltip>
{/if}
<CameraSolid />
<div class=" line-clamp-1">{$i18n.t('Capture')}</div>
</DropdownMenu.Item>
</Tooltip>
<Tooltip
content={!fileUploadEnabled ? $i18n.t('You do not have permission to upload files') : ''}

View File

@ -233,7 +233,7 @@
history.currentId = userMessageId;
await tick();
await sendPrompt(userPrompt, userMessageId);
await sendPrompt(history, userPrompt, userMessageId);
} else {
// Edit user message
history.messages[messageId].content = content;

View File

@ -119,7 +119,7 @@
{#if dismissible}
<div class=" absolute -top-1 -right-1">
<button
class=" bg-gray-400 text-white border border-white rounded-full group-hover:visible invisible transition"
class=" bg-white text-black border border-white rounded-full group-hover:visible invisible transition"
type="button"
on:click|stopPropagation={() => {
dispatch('dismiss');

View File

@ -0,0 +1,19 @@
<script lang="ts">
export let className = 'w-4 h-4';
export let strokeWidth = '1.5';
</script>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width={strokeWidth}
stroke="currentColor"
class={className}
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m6.75 7.5 3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0 0 21 18V6a2.25 2.25 0 0 0-2.25-2.25H5.25A2.25 2.25 0 0 0 3 6v12a2.25 2.25 0 0 0 2.25 2.25Z"
/>
</svg>

View File

@ -0,0 +1,21 @@
<script lang="ts">
export let className = 'size-4';
export let strokeWidth = '1.5';
</script>
<svg
class={className}
stroke-width={strokeWidth}
aria-hidden="true"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
>
<path
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="m3 16 5-7 6 6.5m6.5 2.5L16 13l-4.286 6M14 10h.01M4 19h16a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1Z"
/>
</svg>

View File

@ -10,7 +10,7 @@
let showShortcuts = false;
</script>
<div class=" hidden lg:flex fixed bottom-0 right-0 px-2 py-2 z-20">
<div class=" hidden lg:flex fixed bottom-0 right-0 px-1 py-1 z-20">
<button
id="show-shortcuts-button"
class="hidden"
@ -29,7 +29,7 @@
>
<Tooltip content={$i18n.t('Help')} placement="left">
<button
class="text-gray-600 dark:text-gray-300 bg-gray-300/20 size-5 flex items-center justify-center text-[0.7rem] rounded-full"
class="text-gray-600 dark:text-gray-300 bg-gray-300/20 size-4 flex items-center justify-center text-[0.7rem] rounded-full"
>
?
</button>

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "تجريبي",
"Explore the cosmos": "",
"Export": "تصدير",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "عام",
"General Settings": "الاعدادات العامة",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "إنشاء استعلام بحث",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "أبحث حث",
"Search Result Count": "عدد نتائج البحث",
"Search the web": "",
"Search the internet": "",
"Search Tools": "",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "Експериментално",
"Explore the cosmos": "",
"Export": "Износ",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "Основни",
"General Settings": "Основни Настройки",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "Генериране на заявка за търсене",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Търси Промптове",
"Search Result Count": "Брой резултати от търсенето",
"Search the web": "",
"Search the internet": "",
"Search Tools": "",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "পরিক্ষামূলক",
"Explore the cosmos": "",
"Export": "রপ্তানি",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "সাধারণ",
"General Settings": "সাধারণ সেটিংসমূহ",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "অনুসন্ধান ক্যোয়ারী তৈরি করা হচ্ছে",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "প্রম্পটসমূহ অনুসন্ধান করুন",
"Search Result Count": "অনুসন্ধানের ফলাফল গণনা",
"Search the web": "",
"Search the internet": "",
"Search Tools": "",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "Exemple: ou=users,dc=foo,dc=example",
"Example: sAMAccountName or uid or userPrincipalName": "Exemple: sAMAccountName o uid o userPrincipalName",
"Exclude": "Excloure",
"Executes code for analysis": "",
"Experimental": "Experimental",
"Explore the cosmos": "Explorar el cosmos",
"Export": "Exportar",
@ -468,6 +469,7 @@
"Functions imported successfully": "Les funcions s'han importat correctament",
"General": "General",
"General Settings": "Preferències generals",
"Generate an image": "",
"Generate Image": "Generar imatge",
"Generating search query": "Generant consulta",
"Get started": "Començar",
@ -803,7 +805,7 @@
"Search options": "Opcions de cerca",
"Search Prompts": "Cercar indicacions",
"Search Result Count": "Recompte de resultats de cerca",
"Search the web": "Cercar la web",
"Search the internet": "",
"Search Tools": "Cercar eines",
"SearchApi API Key": "Clau API de SearchApi",
"SearchApi Engine": "Motor de SearchApi",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "Eksperimento",
"Explore the cosmos": "",
"Export": "",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "Heneral",
"General Settings": "kinatibuk-ang mga setting",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Pangitaa ang mga prompt",
"Search Result Count": "",
"Search the web": "",
"Search the internet": "",
"Search Tools": "",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "Vyloučit",
"Executes code for analysis": "",
"Experimental": "Experimentální",
"Explore the cosmos": "",
"Export": "Exportovat",
@ -468,6 +469,7 @@
"Functions imported successfully": "Funkce byly úspěšně importovány",
"General": "Obecný",
"General Settings": "Obecná nastavení",
"Generate an image": "",
"Generate Image": "Vygenerovat obrázek",
"Generating search query": "Generování vyhledávacího dotazu",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Vyhledávací dotazy",
"Search Result Count": "Počet výsledků hledání",
"Search the web": "",
"Search the internet": "",
"Search Tools": "Nástroje pro vyhledávání",
"SearchApi API Key": "Klíč API pro SearchApi",
"SearchApi Engine": "Vyhledávací engine API",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "Eksperimentel",
"Explore the cosmos": "",
"Export": "Eksportér",
@ -468,6 +469,7 @@
"Functions imported successfully": "Funktioner importeret.",
"General": "Generelt",
"General Settings": "Generelle indstillinger",
"Generate an image": "",
"Generate Image": "Generer billede",
"Generating search query": "Genererer søgeforespørgsel",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Søg i prompts",
"Search Result Count": "Antal søgeresultater",
"Search the web": "",
"Search the internet": "",
"Search Tools": "Søg i værktøjer",
"SearchApi API Key": "SearchApi API-nøgle",
"SearchApi Engine": "SearchApi-engine",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "Beispiel: ou=users,dc=foo,dc=example",
"Example: sAMAccountName or uid or userPrincipalName": "Beispiel: sAMAccountName or uid or userPrincipalName",
"Exclude": "Ausschließen",
"Executes code for analysis": "",
"Experimental": "Experimentell",
"Explore the cosmos": "Erforschen Sie das Universum",
"Export": "Exportieren",
@ -468,6 +469,7 @@
"Functions imported successfully": "Funktionen erfolgreich importiert",
"General": "Allgemein",
"General Settings": "Allgemeine Einstellungen",
"Generate an image": "",
"Generate Image": "Bild erzeugen",
"Generating search query": "Suchanfrage wird erstellt",
"Get started": "Loslegen",
@ -803,7 +805,7 @@
"Search options": "Suchoptionen",
"Search Prompts": "Prompts durchsuchen...",
"Search Result Count": "Anzahl der Suchergebnisse",
"Search the web": "Im Web suchen",
"Search the internet": "",
"Search Tools": "Werkzeuge durchsuchen...",
"SearchApi API Key": "SearchApi-API-Schlüssel",
"SearchApi Engine": "SearchApi-Engine",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "Much Experiment",
"Explore the cosmos": "",
"Export": "",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "Woweral",
"General Settings": "General Doge Settings",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Search Prompts much wow",
"Search Result Count": "",
"Search the web": "",
"Search the internet": "",
"Search Tools": "",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "Παράδειγμα: ou=users,dc=foo,dc=example",
"Example: sAMAccountName or uid or userPrincipalName": "Παράδειγμα: sAMAccountName ή uid ή userPrincipalName",
"Exclude": "Εξαίρεση",
"Executes code for analysis": "",
"Experimental": "Πειραματικό",
"Explore the cosmos": "Εξερευνήστε το σύμπαν",
"Export": "Εξαγωγή",
@ -468,6 +469,7 @@
"Functions imported successfully": "Οι λειτουργίες εισήχθησαν με επιτυχία",
"General": "Γενικά",
"General Settings": "Γενικές Ρυθμίσεις",
"Generate an image": "",
"Generate Image": "Δημιουργία Εικόνας",
"Generating search query": "Γενιά αναζήτησης ερώτησης",
"Get started": "Ξεκινήστε",
@ -803,7 +805,7 @@
"Search options": "Επιλογές Αναζήτησης",
"Search Prompts": "Αναζήτηση Προτροπών",
"Search Result Count": "Αριθμός Αποτελεσμάτων Αναζήτησης",
"Search the web": "Αναζήτηση στο διαδίκτυο",
"Search the internet": "",
"Search Tools": "Αναζήτηση Εργαλείων",
"SearchApi API Key": "Κλειδί API SearchApi",
"SearchApi Engine": "Μηχανή SearchApi",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "",
"Explore the cosmos": "",
"Export": "",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "",
"General Settings": "",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "",
"Search Result Count": "",
"Search the web": "",
"Search the internet": "",
"Search Tools": "",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "",
"Explore the cosmos": "",
"Export": "",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "",
"General Settings": "",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "",
"Search Result Count": "",
"Search the web": "",
"Search the internet": "",
"Search Tools": "",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "Experimental",
"Explore the cosmos": "",
"Export": "Exportar",
@ -468,6 +469,7 @@
"Functions imported successfully": "Funciones importadas exitosamente",
"General": "General",
"General Settings": "Opciones Generales",
"Generate an image": "",
"Generate Image": "Generar imagen",
"Generating search query": "Generación de consultas de búsqueda",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Buscar Prompts",
"Search Result Count": "Recuento de resultados de búsqueda",
"Search the web": "",
"Search the internet": "",
"Search Tools": "Búsqueda de herramientas",
"SearchApi API Key": "Clave API de SearchApi",
"SearchApi Engine": "Motor de SearchApi",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "Adibidea: ou=users,dc=foo,dc=example",
"Example: sAMAccountName or uid or userPrincipalName": "Adibidea: sAMAccountName edo uid edo userPrincipalName",
"Exclude": "Baztertu",
"Executes code for analysis": "",
"Experimental": "Esperimentala",
"Explore the cosmos": "Esploratu kosmosa",
"Export": "Esportatu",
@ -468,6 +469,7 @@
"Functions imported successfully": "Funtzioak ongi inportatu dira",
"General": "Orokorra",
"General Settings": "Ezarpen Orokorrak",
"Generate an image": "",
"Generate Image": "Sortu Irudia",
"Generating search query": "Bilaketa kontsulta sortzen",
"Get started": "Hasi",
@ -803,7 +805,7 @@
"Search options": "Bilaketa aukerak",
"Search Prompts": "Bilatu prompt-ak",
"Search Result Count": "Bilaketa emaitzen kopurua",
"Search the web": "Bilatu sarean",
"Search the internet": "",
"Search Tools": "Bilaketa tresnak",
"SearchApi API Key": "SearchApi API gakoa",
"SearchApi Engine": "SearchApi motorra",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "آزمایشی",
"Explore the cosmos": "",
"Export": "برون\u200cریزی",
@ -468,6 +469,7 @@
"Functions imported successfully": "درون\u200cریزی توابع با موفقیت انجام شد",
"General": "عمومی",
"General Settings": "تنظیمات عمومی",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "در حال تولید پرسوجوی جستجو",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "جستجوی پرامپت\u200cها",
"Search Result Count": "تعداد نتایج جستجو",
"Search the web": "",
"Search the internet": "",
"Search Tools": "ابزارهای جستجو",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "Esimerkki: ou=käyttäjät,dc=foo,dc=example",
"Example: sAMAccountName or uid or userPrincipalName": "Esimerkki: sAMAccountName tai uid tai userPrincipalName",
"Exclude": "Jätä pois",
"Executes code for analysis": "",
"Experimental": "Kokeellinen",
"Explore the cosmos": "Tutki avaruutta",
"Export": "Vie",
@ -468,6 +469,7 @@
"Functions imported successfully": "Toiminnot tuotu onnistuneesti",
"General": "Yleinen",
"General Settings": "Yleiset asetukset",
"Generate an image": "",
"Generate Image": "Luo kuva",
"Generating search query": "Luodaan hakukyselyä",
"Get started": "Aloita",
@ -803,7 +805,7 @@
"Search options": "Hakuvaihtoehdot",
"Search Prompts": "Hae kehotteia",
"Search Result Count": "Hakutulosten määrä",
"Search the web": "Etsi verkosta",
"Search the internet": "",
"Search Tools": "Hae työkaluja",
"SearchApi API Key": "SearchApi API -avain",
"SearchApi Engine": "SearchApi-moottori",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "Expérimental",
"Explore the cosmos": "",
"Export": "Exportation",
@ -468,6 +469,7 @@
"Functions imported successfully": "Fonctions importées avec succès",
"General": "Général",
"General Settings": "Paramètres Généraux",
"Generate an image": "",
"Generate Image": "Générer une image",
"Generating search query": "Génération d'une requête de recherche",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Recherche de prompts",
"Search Result Count": "Nombre de résultats de recherche",
"Search the web": "",
"Search the internet": "",
"Search Tools": "Outils de recherche",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "Exemple: ou=utilisateurs,dc=foo,dc=exemple",
"Example: sAMAccountName or uid or userPrincipalName": "Exemple: sAMAccountName ou uid ou userPrincipalName",
"Exclude": "Exclure",
"Executes code for analysis": "",
"Experimental": "Expérimental",
"Explore the cosmos": "Explorer le cosmos",
"Export": "Exportation",
@ -468,6 +469,7 @@
"Functions imported successfully": "Fonctions importées avec succès",
"General": "Général",
"General Settings": "Paramètres généraux",
"Generate an image": "",
"Generate Image": "Générer une image",
"Generating search query": "Génération d'une requête de recherche",
"Get started": "Commencer",
@ -803,7 +805,7 @@
"Search options": "Options de recherche",
"Search Prompts": "Rechercher des prompts",
"Search Result Count": "Nombre de résultats de recherche",
"Search the web": "Rechercher sur le web",
"Search the internet": "",
"Search Tools": "Rechercher des outils",
"SearchApi API Key": "Clé API SearchApi",
"SearchApi Engine": "Moteur de recherche SearchApi",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "ניסיוני",
"Explore the cosmos": "",
"Export": "ייצא",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "כללי",
"General Settings": "הגדרות כלליות",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "יצירת שאילתת חיפוש",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "חפש פקודות",
"Search Result Count": "ספירת תוצאות חיפוש",
"Search the web": "",
"Search the internet": "",
"Search Tools": "",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "प्रयोगात्मक",
"Explore the cosmos": "",
"Export": "निर्यातित माल",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "सामान्य",
"General Settings": "सामान्य सेटिंग्स",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "खोज क्वेरी जनरेट करना",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "प्रॉम्प्ट खोजें",
"Search Result Count": "खोज परिणामों की संख्या",
"Search the web": "",
"Search the internet": "",
"Search Tools": "",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "Eksperimentalno",
"Explore the cosmos": "",
"Export": "Izvoz",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "Općenito",
"General Settings": "Opće postavke",
"Generate an image": "",
"Generate Image": "Gneriraj sliku",
"Generating search query": "Generiranje upita za pretraživanje",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Pretraga prompta",
"Search Result Count": "Broj rezultata pretraživanja",
"Search the web": "",
"Search the internet": "",
"Search Tools": "Alati za pretraživanje",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "Kizárás",
"Executes code for analysis": "",
"Experimental": "Kísérleti",
"Explore the cosmos": "",
"Export": "Exportálás",
@ -468,6 +469,7 @@
"Functions imported successfully": "Funkciók sikeresen importálva",
"General": "Általános",
"General Settings": "Általános beállítások",
"Generate an image": "",
"Generate Image": "Kép generálása",
"Generating search query": "Keresési lekérdezés generálása",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Promptok keresése",
"Search Result Count": "Keresési találatok száma",
"Search the web": "",
"Search the internet": "",
"Search Tools": "Eszközök keresése",
"SearchApi API Key": "SearchApi API kulcs",
"SearchApi Engine": "SearchApi motor",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "Percobaan",
"Explore the cosmos": "",
"Export": "Ekspor",
@ -468,6 +469,7 @@
"Functions imported successfully": "Fungsi berhasil diimpor",
"General": "Umum",
"General Settings": "Pengaturan Umum",
"Generate an image": "",
"Generate Image": "Menghasilkan Gambar",
"Generating search query": "Membuat kueri penelusuran",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Perintah Pencarian",
"Search Result Count": "Jumlah Hasil Pencarian",
"Search the web": "",
"Search the internet": "",
"Search Tools": "Alat Pencarian",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "Sampla: ou=úsáideoirí,dc=foo,dc=sampla",
"Example: sAMAccountName or uid or userPrincipalName": "Sampla: sAMAaccountName nó uid nó userPrincipalName",
"Exclude": "Eisigh",
"Executes code for analysis": "",
"Experimental": "Turgnamhach",
"Explore the cosmos": "Déan iniúchadh ar an cosmos",
"Export": "Easpórtáil",
@ -468,6 +469,7 @@
"Functions imported successfully": "Feidhmeanna allmhairi",
"General": "Ginearálta",
"General Settings": "Socruithe Ginearálta",
"Generate an image": "",
"Generate Image": "Ginigh Íomhá",
"Generating search query": "Giniúint ceist cuardaigh",
"Get started": "Cuir tús leis",
@ -803,7 +805,7 @@
"Search options": "Roghanna cuardaigh",
"Search Prompts": "Leideanna Cuardaigh",
"Search Result Count": "Líon Torthaí Cuardaigh",
"Search the web": "Cuardaigh an gréasán",
"Search the internet": "",
"Search Tools": "Uirlisí Cuardaigh",
"SearchApi API Key": "Eochair API SearchAPI",
"SearchApi Engine": "Inneall SearchAPI",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "Sperimentale",
"Explore the cosmos": "",
"Export": "Esportazione",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "Generale",
"General Settings": "Impostazioni generali",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "Generazione di query di ricerca",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Cerca prompt",
"Search Result Count": "Conteggio dei risultati della ricerca",
"Search the web": "",
"Search the internet": "",
"Search Tools": "",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "実験的",
"Explore the cosmos": "",
"Export": "エクスポート",
@ -468,6 +469,7 @@
"Functions imported successfully": "Functionsのインポートが成功しました",
"General": "一般",
"General Settings": "一般設定",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "検索クエリの生成",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "プロンプトを検索",
"Search Result Count": "検索結果数",
"Search the web": "",
"Search the internet": "",
"Search Tools": "ツールの検索",
"SearchApi API Key": "SearchApiのAPIKey",
"SearchApi Engine": "SearchApiエンジン",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "ექსპერიმენტალური",
"Explore the cosmos": "",
"Export": "ექსპორტი",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "ზოგადი",
"General Settings": "ზოგადი პარამეტრები",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "საძიებო მოთხოვნის გენერირება",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "მოთხოვნების ძიება",
"Search Result Count": "ძიების შედეგების რაოდენობა",
"Search the web": "",
"Search the internet": "",
"Search Tools": "",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "미포함",
"Executes code for analysis": "",
"Experimental": "실험적",
"Explore the cosmos": "",
"Export": "내보내기",
@ -468,6 +469,7 @@
"Functions imported successfully": "성공적으로 함수가 가져왔습니다",
"General": "일반",
"General Settings": "일반 설정",
"Generate an image": "",
"Generate Image": "이미지 생성",
"Generating search query": "검색 쿼리 생성",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "옵션 검색",
"Search Prompts": "프롬프트 검색",
"Search Result Count": "검색 결과 수",
"Search the web": "",
"Search the internet": "",
"Search Tools": "검색 도구",
"SearchApi API Key": "SearchApi API 키",
"SearchApi Engine": "SearchApi 엔진",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "Eksperimentinis",
"Explore the cosmos": "",
"Export": "Eksportuoti",
@ -468,6 +469,7 @@
"Functions imported successfully": "Funkcijos importuotos sėkmingai",
"General": "Bendri",
"General Settings": "Bendri nustatymai",
"Generate an image": "",
"Generate Image": "Generuoti paveikslėlį",
"Generating search query": "Generuoti paieškos užklausą",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Ieškoti užklausų",
"Search Result Count": "Paieškos rezultatų skaičius",
"Search the web": "",
"Search the internet": "",
"Search Tools": "Paieškos įrankiai",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "Percubaan",
"Explore the cosmos": "",
"Export": "Eksport",
@ -468,6 +469,7 @@
"Functions imported successfully": "Fungsi berjaya diimport",
"General": "Umum",
"General Settings": "Tetapan Umum",
"Generate an image": "",
"Generate Image": "Jana Imej",
"Generating search query": "Jana pertanyaan carian",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Carian Gesaan",
"Search Result Count": "Kiraan Hasil Carian",
"Search the web": "",
"Search the internet": "",
"Search Tools": "Alat Carian",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "Eksempel: ou=users,dc=foo,dc=example",
"Example: sAMAccountName or uid or userPrincipalName": "Eksempel: sAMAccountName eller uid eller userPrincipalName",
"Exclude": "Utelukk",
"Executes code for analysis": "",
"Experimental": "Eksperimentell",
"Explore the cosmos": "Utforsk verdensrommet",
"Export": "Eksporter",
@ -468,6 +469,7 @@
"Functions imported successfully": "Funksjoner er importert",
"General": "Generelt",
"General Settings": "Generelle innstillinger",
"Generate an image": "",
"Generate Image": "Generer bilde",
"Generating search query": "Genererer søkespørring",
"Get started": "Kom i gang",
@ -803,7 +805,7 @@
"Search options": "Søk etter alternativer",
"Search Prompts": "Søk etter ledetekster",
"Search Result Count": "Antall søkeresultater",
"Search the web": "Søk på nettet",
"Search the internet": "",
"Search Tools": "Søkeverktøy",
"SearchApi API Key": "API-nøkkel for SearchApi",
"SearchApi Engine": "Motor for SearchApi",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "Voorbeeld: ou=users,dc=foo,dc=example",
"Example: sAMAccountName or uid or userPrincipalName": "Voorbeeld: sAMAccountName or uid or userPrincipalName",
"Exclude": "Sluit uit",
"Executes code for analysis": "",
"Experimental": "Experimenteel",
"Explore the cosmos": "Ontdek de kosmos",
"Export": "Exporteren",
@ -468,6 +469,7 @@
"Functions imported successfully": "Functies succesvol geïmporteerd",
"General": "Algemeen",
"General Settings": "Algemene instellingen",
"Generate an image": "",
"Generate Image": "Genereer afbeelding",
"Generating search query": "Zoekopdracht genereren",
"Get started": "Begin",
@ -803,7 +805,7 @@
"Search options": "Opties zoeken",
"Search Prompts": "Prompts zoeken",
"Search Result Count": "Aantal zoekresultaten",
"Search the web": "Zoek op het internet",
"Search the internet": "",
"Search Tools": "Zoek gereedschappen",
"SearchApi API Key": "SearchApi API-sleutel",
"SearchApi Engine": "SearchApi Engine",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "ਪਰਮਾਣੂਕ੍ਰਿਤ",
"Explore the cosmos": "",
"Export": "ਨਿਰਯਾਤ",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "ਆਮ",
"General Settings": "ਆਮ ਸੈਟਿੰਗਾਂ",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "ਖੋਜ ਪੁੱਛਗਿੱਛ ਤਿਆਰ ਕਰਨਾ",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "ਪ੍ਰੰਪਟ ਖੋਜੋ",
"Search Result Count": "ਖੋਜ ਨਤੀਜੇ ਦੀ ਗਿਣਤੀ",
"Search the web": "",
"Search the internet": "",
"Search Tools": "",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "Eksperymentalne",
"Explore the cosmos": "",
"Export": "Eksport",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "Ogólne",
"General Settings": "Ogólne ustawienia",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "Generowanie zapytania",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Szukaj promptów",
"Search Result Count": "Liczba wyników wyszukiwania",
"Search the web": "",
"Search the internet": "",
"Search Tools": "",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "Exemplo: ou=users,dc=foo,dc=example",
"Example: sAMAccountName or uid or userPrincipalName": "Exemplo: sAMAccountName ou uid ou userPrincipalName",
"Exclude": "Excluir",
"Executes code for analysis": "",
"Experimental": "Experimental",
"Explore the cosmos": "Explorar o cosmos",
"Export": "Exportar",
@ -468,6 +469,7 @@
"Functions imported successfully": "Funções importadas com sucesso",
"General": "Geral",
"General Settings": "Configurações Gerais",
"Generate an image": "",
"Generate Image": "Gerar Imagem",
"Generating search query": "Gerando consulta de pesquisa",
"Get started": "Iniciar",
@ -803,7 +805,7 @@
"Search options": "Opções de pesquisa",
"Search Prompts": "Prompts de Pesquisa",
"Search Result Count": "Contagem de Resultados da Pesquisa",
"Search the web": "Pesquisar web",
"Search the internet": "",
"Search Tools": "Pesquisar Ferramentas",
"SearchApi API Key": "Chave API SearchApi",
"SearchApi Engine": "Motor SearchApi",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "Experimental",
"Explore the cosmos": "",
"Export": "Exportar",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "Geral",
"General Settings": "Configurações Gerais",
"Generate an image": "",
"Generate Image": "Gerar imagem",
"Generating search query": "A gerar a consulta da pesquisa",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Pesquisar Prompts",
"Search Result Count": "Contagem de resultados da pesquisa",
"Search the web": "",
"Search the internet": "",
"Search Tools": "",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "Exclude",
"Executes code for analysis": "",
"Experimental": "Experimental",
"Explore the cosmos": "",
"Export": "Exportă",
@ -468,6 +469,7 @@
"Functions imported successfully": "Funcțiile au fost importate cu succes",
"General": "General",
"General Settings": "Setări Generale",
"Generate an image": "",
"Generate Image": "Generează Imagine",
"Generating search query": "Se generează interogarea de căutare",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Caută Prompturi",
"Search Result Count": "Număr Rezultate Căutare",
"Search the web": "",
"Search the internet": "",
"Search Tools": "Caută Instrumente",
"SearchApi API Key": "Cheie API pentru SearchApi",
"SearchApi Engine": "Motorul SearchApi",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "Исключать",
"Executes code for analysis": "",
"Experimental": "Экспериментальное",
"Explore the cosmos": "Исследуйте космос",
"Export": "Экспорт",
@ -468,6 +469,7 @@
"Functions imported successfully": "Функции успешно импортированы",
"General": "Общее",
"General Settings": "Общие настройки",
"Generate an image": "",
"Generate Image": "Сгенерировать изображение",
"Generating search query": "Генерация поискового запроса",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Поиск промптов",
"Search Result Count": "Количество результатов поиска",
"Search the web": "",
"Search the internet": "",
"Search Tools": "Поиск инструментов",
"SearchApi API Key": "Ключ SearchApi API",
"SearchApi Engine": "Движок SearchApi",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "Vylúčiť",
"Executes code for analysis": "",
"Experimental": "Experimentálne",
"Explore the cosmos": "",
"Export": "Exportovať",
@ -468,6 +469,7 @@
"Functions imported successfully": "Funkcie boli úspešne importované",
"General": "Všeobecné",
"General Settings": "Všeobecné nastavenia",
"Generate an image": "",
"Generate Image": "Vygenerovať obrázok",
"Generating search query": "Generovanie vyhľadávacieho dotazu",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Vyhľadávacie dotazy",
"Search Result Count": "Počet výsledkov hľadania",
"Search the web": "",
"Search the internet": "",
"Search Tools": "Nástroje na vyhľadávanie",
"SearchApi API Key": "Kľúč API pre SearchApi",
"SearchApi Engine": "Vyhľadávací engine API",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "Експериментално",
"Explore the cosmos": "",
"Export": "Извоз",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "Опште",
"General Settings": "Општа подешавања",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "Генерисање упита претраге",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "Опције претраге",
"Search Prompts": "Претражи упите",
"Search Result Count": "Број резултата претраге",
"Search the web": "Претражи веб",
"Search the internet": "",
"Search Tools": "Алати претраге",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "Experimentell",
"Explore the cosmos": "",
"Export": "Export",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "Allmän",
"General Settings": "Allmänna inställningar",
"Generate an image": "",
"Generate Image": "Generera bild",
"Generating search query": "Genererar sökfråga",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Sök instruktioner",
"Search Result Count": "Antal sökresultat",
"Search the web": "",
"Search the internet": "",
"Search Tools": "Sökverktyg",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "การทดลอง",
"Explore the cosmos": "",
"Export": "ส่งออก",
@ -468,6 +469,7 @@
"Functions imported successfully": "นำเข้าฟังก์ชันสำเร็จ",
"General": "ทั่วไป",
"General Settings": "การตั้งค่าทั่วไป",
"Generate an image": "",
"Generate Image": "สร้างภาพ",
"Generating search query": "สร้างคำค้นหา",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "ค้นหาพรอมต์",
"Search Result Count": "จำนวนผลลัพธ์การค้นหา",
"Search the web": "",
"Search the internet": "",
"Search Tools": "เครื่องมือค้นหา",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "",
"Explore the cosmos": "",
"Export": "",
@ -468,6 +469,7 @@
"Functions imported successfully": "",
"General": "",
"General Settings": "",
"Generate an image": "",
"Generate Image": "",
"Generating search query": "",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "",
"Search Result Count": "",
"Search the web": "",
"Search the internet": "",
"Search Tools": "",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "Örnek: ou=users,dc=foo,dc=example",
"Example: sAMAccountName or uid or userPrincipalName": "Örnek: sAMAccountName or uid or userPrincipalName",
"Exclude": "Hariç tut",
"Executes code for analysis": "",
"Experimental": "Deneysel",
"Explore the cosmos": "Evreni keşfet",
"Export": "Dışa Aktar",
@ -468,6 +469,7 @@
"Functions imported successfully": "Fonksiyonlar başarıyla içe aktarıldı",
"General": "Genel",
"General Settings": "Genel Ayarlar",
"Generate an image": "",
"Generate Image": "Görsel Üret",
"Generating search query": "Arama sorgusu oluşturma",
"Get started": "Başlayın",
@ -803,7 +805,7 @@
"Search options": "Arama seçenekleri",
"Search Prompts": "Prompt Ara",
"Search Result Count": "Arama Sonucu Sayısı",
"Search the web": "Web'de ara",
"Search the internet": "",
"Search Tools": "Arama Araçları",
"SearchApi API Key": "Arama-API API Anahtarı",
"SearchApi Engine": "Arama-API Motoru",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "Приклад: ou=users,dc=foo,dc=example",
"Example: sAMAccountName or uid or userPrincipalName": "Приклад: sAMAccountName або uid або userPrincipalName",
"Exclude": "Виключити",
"Executes code for analysis": "",
"Experimental": "Експериментальне",
"Explore the cosmos": "Досліджуйте космос",
"Export": "Експорт",
@ -468,6 +469,7 @@
"Functions imported successfully": "Функції успішно імпортовано",
"General": "Загальні",
"General Settings": "Загальні налаштування",
"Generate an image": "",
"Generate Image": "Створити зображення",
"Generating search query": "Сформувати пошуковий запит",
"Get started": "Почати",
@ -803,7 +805,7 @@
"Search options": "Опції пошуку",
"Search Prompts": "Пошук промтів",
"Search Result Count": "Кількість результатів пошуку",
"Search the web": "Шукати в Інтернеті",
"Search the internet": "",
"Search Tools": "Пошуку інструментів",
"SearchApi API Key": "Ключ API для SearchApi",
"SearchApi Engine": "Рушій SearchApi",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "خارج کریں",
"Executes code for analysis": "",
"Experimental": "تجرباتی",
"Explore the cosmos": "",
"Export": "برآمد کریں",
@ -468,6 +469,7 @@
"Functions imported successfully": "فنکشنز کامیابی سے درآمد ہو گئے ہیں",
"General": "عمومی",
"General Settings": "عمومی ترتیبات",
"Generate an image": "",
"Generate Image": "تصویر بنائیں",
"Generating search query": "تلاش کے لیے سوالیہ عبارت تیار کی جا رہی ہے",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "تلاش کے اشارے",
"Search Result Count": "تلاش کا نتیجہ شمار ",
"Search the web": "",
"Search the internet": "",
"Search Tools": "تلاش کے اوزار",
"SearchApi API Key": "سرچ اے پی آئی کی API کلید",
"SearchApi Engine": "تلاش انجن API",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "",
"Example: sAMAccountName or uid or userPrincipalName": "",
"Exclude": "",
"Executes code for analysis": "",
"Experimental": "Thử nghiệm",
"Explore the cosmos": "",
"Export": "Xuất khẩu",
@ -468,6 +469,7 @@
"Functions imported successfully": "Các function đã được nạp thành công",
"General": "Cài đặt chung",
"General Settings": "Cấu hình chung",
"Generate an image": "",
"Generate Image": "Sinh ảnh",
"Generating search query": "Tạo truy vấn tìm kiếm",
"Get started": "",
@ -803,7 +805,7 @@
"Search options": "",
"Search Prompts": "Tìm prompt",
"Search Result Count": "Số kết quả tìm kiếm",
"Search the web": "",
"Search the internet": "",
"Search Tools": "Tìm kiếm Tools",
"SearchApi API Key": "",
"SearchApi Engine": "",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "例如ou=users,dc=foo,dc=example",
"Example: sAMAccountName or uid or userPrincipalName": "例如sAMAccountName 或 uid 或 userPrincipalName",
"Exclude": "排除",
"Executes code for analysis": "",
"Experimental": "实验性",
"Explore the cosmos": "探索宇宙",
"Export": "导出",
@ -468,6 +469,7 @@
"Functions imported successfully": "函数导入成功",
"General": "通用",
"General Settings": "通用设置",
"Generate an image": "",
"Generate Image": "生成图像",
"Generating search query": "生成搜索查询",
"Get started": "开始使用",
@ -803,7 +805,7 @@
"Search options": "搜索选项",
"Search Prompts": "搜索提示词",
"Search Result Count": "搜索结果数量",
"Search the web": "从网络搜索",
"Search the internet": "",
"Search Tools": "搜索工具",
"SearchApi API Key": "SearchApi API 密钥",
"SearchApi Engine": "SearchApi 引擎",

View File

@ -402,6 +402,7 @@
"Example: ou=users,dc=foo,dc=example": "範例ou=users,dc=foo,dc=example",
"Example: sAMAccountName or uid or userPrincipalName": "範例sAMAccountName 或 uid 或 userPrincipalName",
"Exclude": "排除",
"Executes code for analysis": "",
"Experimental": "實驗性功能",
"Explore the cosmos": "探索宇宙",
"Export": "匯出",
@ -468,6 +469,7 @@
"Functions imported successfully": "成功匯入函式",
"General": "一般",
"General Settings": "一般設定",
"Generate an image": "",
"Generate Image": "產生圖片",
"Generating search query": "正在產生搜尋查詢",
"Get started": "開始使用",
@ -803,7 +805,7 @@
"Search options": "搜尋選項",
"Search Prompts": "搜尋提示詞",
"Search Result Count": "搜尋結果數量",
"Search the web": "搜尋網頁",
"Search the internet": "",
"Search Tools": "搜尋工具",
"SearchApi API Key": "SearchApi API 金鑰",
"SearchApi Engine": "SearchApi 引擎",