Forráskód Böngészése

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

# Conflicts:
#	backend/open_webui/retrieval/web/utils.py
Rory 2 hónapja
szülő
commit
7bac1a170d
60 módosított fájl, 476 hozzáadás és 308 törlés
  1. 4 0
      backend/open_webui/retrieval/web/main.py
  2. 13 4
      backend/open_webui/retrieval/web/utils.py
  3. 34 32
      src/lib/components/channel/MessageInput.svelte
  4. 49 47
      src/lib/components/chat/Chat.svelte
  5. 138 90
      src/lib/components/chat/MessageInput.svelte
  6. 47 82
      src/lib/components/chat/MessageInput/InputMenu.svelte
  7. 1 1
      src/lib/components/chat/Messages.svelte
  8. 1 1
      src/lib/components/common/FileItem.svelte
  9. 19 0
      src/lib/components/icons/CommandLine.svelte
  10. 21 0
      src/lib/components/icons/Photo.svelte
  11. 2 2
      src/lib/components/layout/Help.svelte
  12. 3 1
      src/lib/i18n/locales/ar-BH/translation.json
  13. 3 1
      src/lib/i18n/locales/bg-BG/translation.json
  14. 3 1
      src/lib/i18n/locales/bn-BD/translation.json
  15. 3 1
      src/lib/i18n/locales/ca-ES/translation.json
  16. 3 1
      src/lib/i18n/locales/ceb-PH/translation.json
  17. 3 1
      src/lib/i18n/locales/cs-CZ/translation.json
  18. 3 1
      src/lib/i18n/locales/da-DK/translation.json
  19. 3 1
      src/lib/i18n/locales/de-DE/translation.json
  20. 3 1
      src/lib/i18n/locales/dg-DG/translation.json
  21. 3 1
      src/lib/i18n/locales/el-GR/translation.json
  22. 3 1
      src/lib/i18n/locales/en-GB/translation.json
  23. 3 1
      src/lib/i18n/locales/en-US/translation.json
  24. 3 1
      src/lib/i18n/locales/es-ES/translation.json
  25. 3 1
      src/lib/i18n/locales/eu-ES/translation.json
  26. 3 1
      src/lib/i18n/locales/fa-IR/translation.json
  27. 3 1
      src/lib/i18n/locales/fi-FI/translation.json
  28. 3 1
      src/lib/i18n/locales/fr-CA/translation.json
  29. 3 1
      src/lib/i18n/locales/fr-FR/translation.json
  30. 3 1
      src/lib/i18n/locales/he-IL/translation.json
  31. 3 1
      src/lib/i18n/locales/hi-IN/translation.json
  32. 3 1
      src/lib/i18n/locales/hr-HR/translation.json
  33. 3 1
      src/lib/i18n/locales/hu-HU/translation.json
  34. 3 1
      src/lib/i18n/locales/id-ID/translation.json
  35. 3 1
      src/lib/i18n/locales/ie-GA/translation.json
  36. 3 1
      src/lib/i18n/locales/it-IT/translation.json
  37. 3 1
      src/lib/i18n/locales/ja-JP/translation.json
  38. 3 1
      src/lib/i18n/locales/ka-GE/translation.json
  39. 3 1
      src/lib/i18n/locales/ko-KR/translation.json
  40. 3 1
      src/lib/i18n/locales/lt-LT/translation.json
  41. 3 1
      src/lib/i18n/locales/ms-MY/translation.json
  42. 3 1
      src/lib/i18n/locales/nb-NO/translation.json
  43. 3 1
      src/lib/i18n/locales/nl-NL/translation.json
  44. 3 1
      src/lib/i18n/locales/pa-IN/translation.json
  45. 3 1
      src/lib/i18n/locales/pl-PL/translation.json
  46. 3 1
      src/lib/i18n/locales/pt-BR/translation.json
  47. 3 1
      src/lib/i18n/locales/pt-PT/translation.json
  48. 3 1
      src/lib/i18n/locales/ro-RO/translation.json
  49. 3 1
      src/lib/i18n/locales/ru-RU/translation.json
  50. 3 1
      src/lib/i18n/locales/sk-SK/translation.json
  51. 3 1
      src/lib/i18n/locales/sr-RS/translation.json
  52. 3 1
      src/lib/i18n/locales/sv-SE/translation.json
  53. 3 1
      src/lib/i18n/locales/th-TH/translation.json
  54. 3 1
      src/lib/i18n/locales/tk-TW/translation.json
  55. 3 1
      src/lib/i18n/locales/tr-TR/translation.json
  56. 3 1
      src/lib/i18n/locales/uk-UA/translation.json
  57. 3 1
      src/lib/i18n/locales/ur-PK/translation.json
  58. 3 1
      src/lib/i18n/locales/vi-VN/translation.json
  59. 3 1
      src/lib/i18n/locales/zh-CN/translation.json
  60. 3 1
      src/lib/i18n/locales/zh-TW/translation.json

+ 4 - 0
backend/open_webui/retrieval/web/main.py

@@ -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)

+ 13 - 4
backend/open_webui/retrieval/web/utils.py

@@ -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

+ 34 - 32
src/lib/components/channel/MessageInput.svelte

@@ -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=" 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 mb-1.5 flex space-x-1 mr-1">
+							<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"

+ 49 - 47
src/lib/components/chat/Chat.svelte

@@ -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);
+			_chatId = chat.id;
+			await chatId.set(_chatId);
+
 			await chats.set(await getChatList(localStorage.token, $currentChatPage));
-			await chatId.set(chat.id);
+			currentChatPage.set(1);
 
-			window.history.replaceState(history.state, '', `/c/${chat.id}`);
+			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"

+ 138 - 90
src/lib/components/chat/MessageInput.svelte

@@ -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=" 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 mb-1.5 flex space-x-1 mr-1">
+									<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"

+ 47 - 82
src/lib/components/chat/MessageInput/InputMenu.svelte

@@ -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;
-					}}
-				>
-					<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) {
+						if (fileUploadEnabled) {
+							if (!detectMobile()) {
 								screenCaptureHandler();
+							} else {
+								const cameraInputElement = document.getElementById('camera-input');
+
+								if (cameraInputElement) {
+									cameraInputElement.click();
+								}
 							}
-						}}
-					>
-						<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') : ''}

+ 1 - 1
src/lib/components/chat/Messages.svelte

@@ -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;

+ 1 - 1
src/lib/components/common/FileItem.svelte

@@ -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');

+ 19 - 0
src/lib/components/icons/CommandLine.svelte

@@ -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>

+ 21 - 0
src/lib/components/icons/Photo.svelte

@@ -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>

+ 2 - 2
src/lib/components/layout/Help.svelte

@@ -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>

+ 3 - 1
src/lib/i18n/locales/ar-BH/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/bg-BG/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/bn-BD/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/ca-ES/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/ceb-PH/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/cs-CZ/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/da-DK/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/de-DE/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/dg-DG/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/el-GR/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/en-GB/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/en-US/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/es-ES/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/eu-ES/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/fa-IR/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/fi-FI/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/fr-CA/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/fr-FR/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/he-IL/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/hi-IN/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/hr-HR/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/hu-HU/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/id-ID/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/ie-GA/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/it-IT/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/ja-JP/translation.json

@@ -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エンジン",

+ 3 - 1
src/lib/i18n/locales/ka-GE/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/ko-KR/translation.json

@@ -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 엔진",

+ 3 - 1
src/lib/i18n/locales/lt-LT/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/ms-MY/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/nb-NO/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/nl-NL/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/pa-IN/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/pl-PL/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/pt-BR/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/pt-PT/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/ro-RO/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/ru-RU/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/sk-SK/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/sr-RS/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/sv-SE/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/th-TH/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/tk-TW/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/tr-TR/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/uk-UA/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/ur-PK/translation.json

@@ -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",

+ 3 - 1
src/lib/i18n/locales/vi-VN/translation.json

@@ -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": "",

+ 3 - 1
src/lib/i18n/locales/zh-CN/translation.json

@@ -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 引擎",

+ 3 - 1
src/lib/i18n/locales/zh-TW/translation.json

@@ -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 引擎",