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

Merge branch 'dev' into fix/ollama-cancellation

Timothy Jaeryang Baek 11 hónapja
szülő
commit
c5ff4c24e1
47 módosított fájl, 973 hozzáadás és 539 törlés
  1. 6 0
      .github/workflows/docker-build.yaml
  2. 17 0
      CHANGELOG.md
  3. 65 32
      backend/apps/ollama/main.py
  4. 21 0
      backend/apps/openai/main.py
  5. 2 2
      package-lock.json
  6. 1 1
      package.json
  7. 2 2
      src/lib/components/chat/Messages/UserMessage.svelte
  8. 91 0
      src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte
  9. 39 10
      src/lib/components/chat/Settings/Connections.svelte
  10. 415 391
      src/lib/components/chat/Settings/Models.svelte
  11. 19 0
      src/lib/components/icons/ArrowDownTray.svelte
  12. 10 0
      src/lib/components/workspace/Models.svelte
  13. 14 0
      src/lib/components/workspace/Models/ModelMenu.svelte
  14. 5 0
      src/lib/i18n/locales/ar-BH/translation.json
  15. 5 0
      src/lib/i18n/locales/bg-BG/translation.json
  16. 5 0
      src/lib/i18n/locales/bn-BD/translation.json
  17. 5 0
      src/lib/i18n/locales/ca-ES/translation.json
  18. 5 0
      src/lib/i18n/locales/ceb-PH/translation.json
  19. 5 0
      src/lib/i18n/locales/de-DE/translation.json
  20. 5 0
      src/lib/i18n/locales/dg-DG/translation.json
  21. 5 0
      src/lib/i18n/locales/en-GB/translation.json
  22. 5 0
      src/lib/i18n/locales/en-US/translation.json
  23. 5 0
      src/lib/i18n/locales/es-ES/translation.json
  24. 5 0
      src/lib/i18n/locales/fa-IR/translation.json
  25. 5 0
      src/lib/i18n/locales/fi-FI/translation.json
  26. 5 0
      src/lib/i18n/locales/fr-CA/translation.json
  27. 5 0
      src/lib/i18n/locales/fr-FR/translation.json
  28. 5 0
      src/lib/i18n/locales/he-IL/translation.json
  29. 5 0
      src/lib/i18n/locales/hi-IN/translation.json
  30. 5 0
      src/lib/i18n/locales/hr-HR/translation.json
  31. 5 0
      src/lib/i18n/locales/it-IT/translation.json
  32. 5 0
      src/lib/i18n/locales/ja-JP/translation.json
  33. 5 0
      src/lib/i18n/locales/ka-GE/translation.json
  34. 5 0
      src/lib/i18n/locales/ko-KR/translation.json
  35. 5 0
      src/lib/i18n/locales/nl-NL/translation.json
  36. 5 0
      src/lib/i18n/locales/pa-IN/translation.json
  37. 5 0
      src/lib/i18n/locales/pl-PL/translation.json
  38. 5 0
      src/lib/i18n/locales/pt-BR/translation.json
  39. 5 0
      src/lib/i18n/locales/pt-PT/translation.json
  40. 5 0
      src/lib/i18n/locales/ru-RU/translation.json
  41. 5 0
      src/lib/i18n/locales/sr-RS/translation.json
  42. 5 0
      src/lib/i18n/locales/sv-SE/translation.json
  43. 5 0
      src/lib/i18n/locales/tr-TR/translation.json
  44. 78 73
      src/lib/i18n/locales/uk-UA/translation.json
  45. 33 28
      src/lib/i18n/locales/vi-VN/translation.json
  46. 5 0
      src/lib/i18n/locales/zh-CN/translation.json
  47. 5 0
      src/lib/i18n/locales/zh-TW/translation.json

+ 6 - 0
.github/workflows/docker-build.yaml

@@ -70,8 +70,10 @@ jobs:
           images: ${{ env.FULL_IMAGE_NAME }}
           tags: |
             type=ref,event=branch
+            ${{ github.ref_type == 'tag' && 'type=raw,value=main' || '' }}
           flavor: |
             prefix=cache-${{ matrix.platform }}-
+            latest=false
 
       - name: Build Docker image (latest)
         uses: docker/build-push-action@v5
@@ -158,8 +160,10 @@ jobs:
           images: ${{ env.FULL_IMAGE_NAME }}
           tags: |
             type=ref,event=branch
+            ${{ github.ref_type == 'tag' && 'type=raw,value=main' || '' }}
           flavor: |
             prefix=cache-cuda-${{ matrix.platform }}-
+            latest=false
 
       - name: Build Docker image (cuda)
         uses: docker/build-push-action@v5
@@ -247,8 +251,10 @@ jobs:
           images: ${{ env.FULL_IMAGE_NAME }}
           tags: |
             type=ref,event=branch
+            ${{ github.ref_type == 'tag' && 'type=raw,value=main' || '' }}
           flavor: |
             prefix=cache-ollama-${{ matrix.platform }}-
+            latest=false
 
       - name: Build Docker image (ollama)
         uses: docker/build-push-action@v5

+ 17 - 0
CHANGELOG.md

@@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [0.2.1] - 2024-06-02
+
+### Added
+
+- **🖱️ Single Model Export Button**: Easily export models with just one click using the new single model export button.
+- **🖥️ Advanced Parameters Support**: Added support for 'num_thread', 'use_mmap', and 'use_mlock' parameters for Ollama.
+- **🌐 Improved Vietnamese Translation**: Enhanced Vietnamese language support for a better user experience for our Vietnamese-speaking community.
+
+### Fixed
+
+- **🔧 OpenAI URL API Save Issue**: Corrected a problem preventing the saving of OpenAI URL API settings.
+- **🚫 Display Issue with Disabled Ollama API**: Fixed the display bug causing models to appear in settings when the Ollama API was disabled.
+
+### Changed
+
+- **💡 Versioning Update**: As a reminder from our previous update, version 0.2.y will focus primarily on bug fixes, while major updates will be designated as 0.x from now on for better version tracking.
+
 ## [0.2.0] - 2024-06-01
 
 ### Added

+ 65 - 32
backend/apps/ollama/main.py

@@ -734,44 +734,77 @@ async def generate_chat_completion(
         if model_info.params:
             payload["options"] = {}
 
-            payload["options"]["mirostat"] = model_info.params.get("mirostat", None)
-            payload["options"]["mirostat_eta"] = model_info.params.get(
-                "mirostat_eta", None
-            )
-            payload["options"]["mirostat_tau"] = model_info.params.get(
-                "mirostat_tau", None
-            )
-            payload["options"]["num_ctx"] = model_info.params.get("num_ctx", None)
+            if model_info.params.get("mirostat", None):
+                payload["options"]["mirostat"] = model_info.params.get("mirostat", None)
 
-            payload["options"]["repeat_last_n"] = model_info.params.get(
-                "repeat_last_n", None
-            )
-            payload["options"]["repeat_penalty"] = model_info.params.get(
-                "frequency_penalty", None
-            )
+            if model_info.params.get("mirostat_eta", None):
+                payload["options"]["mirostat_eta"] = model_info.params.get(
+                    "mirostat_eta", None
+                )
 
-            payload["options"]["temperature"] = model_info.params.get(
-                "temperature", None
-            )
-            payload["options"]["seed"] = model_info.params.get("seed", None)
+            if model_info.params.get("mirostat_tau", None):
 
-            payload["options"]["stop"] = (
-                [
-                    bytes(stop, "utf-8").decode("unicode_escape")
-                    for stop in model_info.params["stop"]
-                ]
-                if model_info.params.get("stop", None)
-                else None
-            )
+                payload["options"]["mirostat_tau"] = model_info.params.get(
+                    "mirostat_tau", None
+                )
 
-            payload["options"]["tfs_z"] = model_info.params.get("tfs_z", None)
+            if model_info.params.get("num_ctx", None):
+                payload["options"]["num_ctx"] = model_info.params.get("num_ctx", None)
 
-            payload["options"]["num_predict"] = model_info.params.get(
-                "max_tokens", None
-            )
-            payload["options"]["top_k"] = model_info.params.get("top_k", None)
+            if model_info.params.get("repeat_last_n", None):
+                payload["options"]["repeat_last_n"] = model_info.params.get(
+                    "repeat_last_n", None
+                )
+
+            if model_info.params.get("frequency_penalty", None):
+                payload["options"]["repeat_penalty"] = model_info.params.get(
+                    "frequency_penalty", None
+                )
+
+            if model_info.params.get("temperature", None):
+                payload["options"]["temperature"] = model_info.params.get(
+                    "temperature", None
+                )
+
+            if model_info.params.get("seed", None):
+                payload["options"]["seed"] = model_info.params.get("seed", None)
+
+            if model_info.params.get("stop", None):
+                payload["options"]["stop"] = (
+                    [
+                        bytes(stop, "utf-8").decode("unicode_escape")
+                        for stop in model_info.params["stop"]
+                    ]
+                    if model_info.params.get("stop", None)
+                    else None
+                )
+
+            if model_info.params.get("tfs_z", None):
+                payload["options"]["tfs_z"] = model_info.params.get("tfs_z", None)
 
-            payload["options"]["top_p"] = model_info.params.get("top_p", None)
+            if model_info.params.get("max_tokens", None):
+                payload["options"]["num_predict"] = model_info.params.get(
+                    "max_tokens", None
+                )
+
+            if model_info.params.get("top_k", None):
+                payload["options"]["top_k"] = model_info.params.get("top_k", None)
+
+            if model_info.params.get("top_p", None):
+                payload["options"]["top_p"] = model_info.params.get("top_p", None)
+
+            if model_info.params.get("use_mmap", None):
+                payload["options"]["use_mmap"] = model_info.params.get("use_mmap", None)
+
+            if model_info.params.get("use_mlock", None):
+                payload["options"]["use_mlock"] = model_info.params.get(
+                    "use_mlock", None
+                )
+
+            if model_info.params.get("num_thread", None):
+                payload["options"]["num_thread"] = model_info.params.get(
+                    "num_thread", None
+                )
 
         if model_info.params.get("system", None):
             # Check if the payload already has a system message

+ 21 - 0
backend/apps/openai/main.py

@@ -239,6 +239,27 @@ async def get_all_models(raw: bool = False):
     ) or not app.state.config.ENABLE_OPENAI_API:
         models = {"data": []}
     else:
+        # Check if API KEYS length is same than API URLS length
+        if len(app.state.config.OPENAI_API_KEYS) != len(
+            app.state.config.OPENAI_API_BASE_URLS
+        ):
+            # if there are more keys than urls, remove the extra keys
+            if len(app.state.config.OPENAI_API_KEYS) > len(
+                app.state.config.OPENAI_API_BASE_URLS
+            ):
+                app.state.config.OPENAI_API_KEYS = app.state.config.OPENAI_API_KEYS[
+                    : len(app.state.config.OPENAI_API_BASE_URLS)
+                ]
+            # if there are more urls than keys, add empty keys
+            else:
+                app.state.config.OPENAI_API_KEYS += [
+                    ""
+                    for _ in range(
+                        len(app.state.config.OPENAI_API_BASE_URLS)
+                        - len(app.state.config.OPENAI_API_KEYS)
+                    )
+                ]
+
         tasks = [
             fetch_url(f"{url}/models", app.state.config.OPENAI_API_KEYS[idx])
             for idx, url in enumerate(app.state.config.OPENAI_API_BASE_URLS)

+ 2 - 2
package-lock.json

@@ -1,12 +1,12 @@
 {
 	"name": "open-webui",
-	"version": "0.2.0",
+	"version": "0.2.1",
 	"lockfileVersion": 3,
 	"requires": true,
 	"packages": {
 		"": {
 			"name": "open-webui",
-			"version": "0.2.0",
+			"version": "0.2.1",
 			"dependencies": {
 				"@pyscript/core": "^0.4.32",
 				"@sveltejs/adapter-node": "^1.3.1",

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
 	"name": "open-webui",
-	"version": "0.2.0",
+	"version": "0.2.1",
 	"private": true,
 	"scripts": {
 		"dev": "npm run pyodide:fetch && vite dev --host",

+ 2 - 2
src/lib/components/chat/Messages/UserMessage.svelte

@@ -196,7 +196,7 @@
 					<div class=" mt-2 mb-1 flex justify-end space-x-1.5 text-sm font-medium">
 						<button
 							id="close-edit-message-button"
-							class="px-4 py-2 bg-white hover:bg-gray-100 text-gray-800 transition rounded-3xl"
+							class="px-4 py-2 bg-white dark:bg-gray-900 hover:bg-gray-100 text-gray-800 dark:text-gray-100 transition rounded-3xl"
 							on:click={() => {
 								cancelEditMessage();
 							}}
@@ -206,7 +206,7 @@
 
 						<button
 							id="save-edit-message-button"
-							class=" px-4 py-2 bg-gray-900 hover:bg-gray-850 text-gray-100 transition rounded-3xl"
+							class=" px-4 py-2 bg-gray-900 dark:bg-white hover:bg-gray-850 text-gray-100 dark:text-gray-800 transition rounded-3xl"
 							on:click={() => {
 								editMessageConfirmHandler();
 							}}

+ 91 - 0
src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte

@@ -20,6 +20,9 @@
 		tfs_z: '',
 		num_ctx: '',
 		max_tokens: '',
+		use_mmap: null,
+		use_mlock: null,
+		num_thread: null,
 		template: null
 	};
 
@@ -559,6 +562,7 @@
 			</div>
 		{/if}
 	</div>
+
 	<div class=" py-0.5 w-full justify-between">
 		<div class="flex w-full justify-between">
 			<div class=" self-center text-xs font-medium">{$i18n.t('Max Tokens (num_predict)')}</div>
@@ -604,6 +608,93 @@
 			</div>
 		{/if}
 	</div>
+
+	<div class=" py-0.5 w-full justify-between">
+		<div class="flex w-full justify-between">
+			<div class=" self-center text-xs font-medium">{$i18n.t('use_mmap (Ollama)')}</div>
+
+			<button
+				class="p-1 px-3 text-xs flex rounded transition"
+				type="button"
+				on:click={() => {
+					params.use_mmap = (params?.use_mmap ?? null) === null ? true : null;
+				}}
+			>
+				{#if (params?.use_mmap ?? null) === null}
+					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+				{:else}
+					<span class="ml-2 self-center">{$i18n.t('On')}</span>
+				{/if}
+			</button>
+		</div>
+	</div>
+
+	<div class=" py-0.5 w-full justify-between">
+		<div class="flex w-full justify-between">
+			<div class=" self-center text-xs font-medium">{$i18n.t('use_mlock (Ollama)')}</div>
+
+			<button
+				class="p-1 px-3 text-xs flex rounded transition"
+				type="button"
+				on:click={() => {
+					params.use_mlock = (params?.use_mlock ?? null) === null ? true : null;
+				}}
+			>
+				{#if (params?.use_mlock ?? null) === null}
+					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+				{:else}
+					<span class="ml-2 self-center">{$i18n.t('On')}</span>
+				{/if}
+			</button>
+		</div>
+	</div>
+
+	<div class=" py-0.5 w-full justify-between">
+		<div class="flex w-full justify-between">
+			<div class=" self-center text-xs font-medium">{$i18n.t('num_thread (Ollama)')}</div>
+
+			<button
+				class="p-1 px-3 text-xs flex rounded transition"
+				type="button"
+				on:click={() => {
+					params.num_thread = (params?.num_thread ?? null) === null ? 2 : null;
+				}}
+			>
+				{#if (params?.num_thread ?? null) === null}
+					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+				{:else}
+					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
+				{/if}
+			</button>
+		</div>
+
+		{#if (params?.num_thread ?? null) !== null}
+			<div class="flex mt-0.5 space-x-2">
+				<div class=" flex-1">
+					<input
+						id="steps-range"
+						type="range"
+						min="1"
+						max="256"
+						step="1"
+						bind:value={params.num_thread}
+						class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
+					/>
+				</div>
+				<div class="">
+					<input
+						bind:value={params.num_thread}
+						type="number"
+						class=" bg-transparent text-center w-14"
+						min="1"
+						max="256"
+						step="1"
+					/>
+				</div>
+			</div>
+		{/if}
+	</div>
+
 	<div class=" py-0.5 w-full justify-between">
 		<div class="flex w-full justify-between">
 			<div class=" self-center text-xs font-medium">{$i18n.t('Template')}</div>

+ 39 - 10
src/lib/components/chat/Settings/Connections.svelte

@@ -1,6 +1,6 @@
 <script lang="ts">
 	import { models, user } from '$lib/stores';
-	import { createEventDispatcher, onMount, getContext } from 'svelte';
+	import { createEventDispatcher, onMount, getContext, tick } from 'svelte';
 	const dispatch = createEventDispatcher();
 
 	import {
@@ -74,23 +74,48 @@
 	};
 
 	const updateOpenAIHandler = async () => {
+		// Check if API KEYS length is same than API URLS length
+		if (OPENAI_API_KEYS.length !== OPENAI_API_BASE_URLS.length) {
+			// if there are more keys than urls, remove the extra keys
+			if (OPENAI_API_KEYS.length > OPENAI_API_BASE_URLS.length) {
+				OPENAI_API_KEYS = OPENAI_API_KEYS.slice(0, OPENAI_API_BASE_URLS.length);
+			}
+
+			// if there are more urls than keys, add empty keys
+			if (OPENAI_API_KEYS.length < OPENAI_API_BASE_URLS.length) {
+				const diff = OPENAI_API_BASE_URLS.length - OPENAI_API_KEYS.length;
+				for (let i = 0; i < diff; i++) {
+					OPENAI_API_KEYS.push('');
+				}
+			}
+		}
+
 		OPENAI_API_BASE_URLS = await updateOpenAIUrls(localStorage.token, OPENAI_API_BASE_URLS);
 		OPENAI_API_KEYS = await updateOpenAIKeys(localStorage.token, OPENAI_API_KEYS);
-
 		await models.set(await getModels());
 	};
 
 	const updateOllamaUrlsHandler = async () => {
-		OLLAMA_BASE_URLS = await updateOllamaUrls(localStorage.token, OLLAMA_BASE_URLS);
+		OLLAMA_BASE_URLS = OLLAMA_BASE_URLS.filter((url) => url !== '');
+		console.log(OLLAMA_BASE_URLS);
 
-		const ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => {
-			toast.error(error);
-			return null;
-		});
+		if (OLLAMA_BASE_URLS.length === 0) {
+			ENABLE_OLLAMA_API = false;
+			await updateOllamaConfig(localStorage.token, ENABLE_OLLAMA_API);
 
-		if (ollamaVersion) {
-			toast.success($i18n.t('Server connection verified'));
-			await models.set(await getModels());
+			toast.info($i18n.t('Ollama API disabled'));
+		} else {
+			OLLAMA_BASE_URLS = await updateOllamaUrls(localStorage.token, OLLAMA_BASE_URLS);
+
+			const ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => {
+				toast.error(error);
+				return null;
+			});
+
+			if (ollamaVersion) {
+				toast.success($i18n.t('Server connection verified'));
+				await models.set(await getModels());
+			}
 		}
 	};
 
@@ -286,6 +311,10 @@
 							bind:state={ENABLE_OLLAMA_API}
 							on:change={async () => {
 								updateOllamaConfig(localStorage.token, ENABLE_OLLAMA_API);
+
+								if (OLLAMA_BASE_URLS.length === 0) {
+									OLLAMA_BASE_URLS = [''];
+								}
 							}}
 						/>
 					</div>

+ 415 - 391
src/lib/components/chat/Settings/Models.svelte

@@ -8,7 +8,8 @@
 		getOllamaUrls,
 		getOllamaVersion,
 		pullModel,
-		uploadModel
+		uploadModel,
+		getOllamaConfig
 	} from '$lib/apis/ollama';
 
 	import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
@@ -27,6 +28,8 @@
 
 	// Models
 
+	let ollamaEnabled = null;
+
 	let OLLAMA_URLS = [];
 	let selectedOllamaUrlIdx: string | null = null;
 
@@ -432,53 +435,138 @@
 	};
 
 	onMount(async () => {
-		await Promise.all([
-			(async () => {
-				OLLAMA_URLS = await getOllamaUrls(localStorage.token).catch((error) => {
-					toast.error(error);
-					return [];
-				});
+		const ollamaConfig = await getOllamaConfig(localStorage.token);
 
-				if (OLLAMA_URLS.length > 0) {
-					selectedOllamaUrlIdx = 0;
-				}
-			})(),
-			(async () => {
-				ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => false);
-			})()
-		]);
+		if (ollamaConfig.ENABLE_OLLAMA_API) {
+			ollamaEnabled = true;
+
+			await Promise.all([
+				(async () => {
+					OLLAMA_URLS = await getOllamaUrls(localStorage.token).catch((error) => {
+						toast.error(error);
+						return [];
+					});
+
+					if (OLLAMA_URLS.length > 0) {
+						selectedOllamaUrlIdx = 0;
+					}
+				})(),
+				(async () => {
+					ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => false);
+				})()
+			]);
+		} else {
+			ollamaEnabled = false;
+			toast.error('Ollama API is disabled');
+		}
 	});
 </script>
 
 <div class="flex flex-col h-full justify-between text-sm">
 	<div class=" space-y-3 pr-1.5 overflow-y-scroll h-[24rem]">
-		{#if ollamaVersion !== null}
-			<div class="space-y-2 pr-1.5">
-				<div class="text-sm font-medium">{$i18n.t('Manage Ollama Models')}</div>
-
-				{#if OLLAMA_URLS.length > 0}
-					<div class="flex gap-2">
-						<div class="flex-1 pb-1">
-							<select
-								class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
-								bind:value={selectedOllamaUrlIdx}
-								placeholder={$i18n.t('Select an Ollama instance')}
-							>
-								{#each OLLAMA_URLS as url, idx}
-									<option value={idx} class="bg-gray-100 dark:bg-gray-700">{url}</option>
-								{/each}
-							</select>
+		{#if ollamaEnabled}
+			{#if ollamaVersion !== null}
+				<div class="space-y-2 pr-1.5">
+					<div class="text-sm font-medium">{$i18n.t('Manage Ollama Models')}</div>
+
+					{#if OLLAMA_URLS.length > 0}
+						<div class="flex gap-2">
+							<div class="flex-1 pb-1">
+								<select
+									class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
+									bind:value={selectedOllamaUrlIdx}
+									placeholder={$i18n.t('Select an Ollama instance')}
+								>
+									{#each OLLAMA_URLS as url, idx}
+										<option value={idx} class="bg-gray-100 dark:bg-gray-700">{url}</option>
+									{/each}
+								</select>
+							</div>
+
+							<div>
+								<div class="flex w-full justify-end">
+									<Tooltip content="Update All Models" placement="top">
+										<button
+											class="p-2.5 flex gap-2 items-center bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition"
+											on:click={() => {
+												updateModelsHandler();
+											}}
+										>
+											<svg
+												xmlns="http://www.w3.org/2000/svg"
+												viewBox="0 0 16 16"
+												fill="currentColor"
+												class="w-4 h-4"
+											>
+												<path
+													d="M7 1a.75.75 0 0 1 .75.75V6h-1.5V1.75A.75.75 0 0 1 7 1ZM6.25 6v2.94L5.03 7.72a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l2.5-2.5a.75.75 0 1 0-1.06-1.06L7.75 8.94V6H10a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h2.25Z"
+												/>
+												<path
+													d="M4.268 14A2 2 0 0 0 6 15h6a2 2 0 0 0 2-2v-3a2 2 0 0 0-1-1.732V11a3 3 0 0 1-3 3H4.268Z"
+												/>
+											</svg>
+										</button>
+									</Tooltip>
+								</div>
+							</div>
 						</div>
 
+						{#if updateModelId}
+							Updating "{updateModelId}" {updateProgress ? `(${updateProgress}%)` : ''}
+						{/if}
+					{/if}
+
+					<div class="space-y-2">
 						<div>
-							<div class="flex w-full justify-end">
-								<Tooltip content="Update All Models" placement="top">
-									<button
-										class="p-2.5 flex gap-2 items-center bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition"
-										on:click={() => {
-											updateModelsHandler();
-										}}
-									>
+							<div class=" mb-2 text-sm font-medium">{$i18n.t('Pull a model from Ollama.com')}</div>
+							<div class="flex w-full">
+								<div class="flex-1 mr-2">
+									<input
+										class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
+										placeholder={$i18n.t('Enter model tag (e.g. {{modelTag}})', {
+											modelTag: 'mistral:7b'
+										})}
+										bind:value={modelTag}
+									/>
+								</div>
+								<button
+									class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition"
+									on:click={() => {
+										pullModelHandler();
+									}}
+									disabled={modelTransferring}
+								>
+									{#if modelTransferring}
+										<div class="self-center">
+											<svg
+												class=" w-4 h-4"
+												viewBox="0 0 24 24"
+												fill="currentColor"
+												xmlns="http://www.w3.org/2000/svg"
+											>
+												<style>
+													.spinner_ajPY {
+														transform-origin: center;
+														animation: spinner_AtaB 0.75s infinite linear;
+													}
+
+													@keyframes spinner_AtaB {
+														100% {
+															transform: rotate(360deg);
+														}
+													}
+												</style>
+												<path
+													d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
+													opacity=".25"
+												/>
+												<path
+													d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
+													class="spinner_ajPY"
+												/>
+											</svg>
+										</div>
+									{:else}
 										<svg
 											xmlns="http://www.w3.org/2000/svg"
 											viewBox="0 0 16 16"
@@ -486,74 +574,111 @@
 											class="w-4 h-4"
 										>
 											<path
-												d="M7 1a.75.75 0 0 1 .75.75V6h-1.5V1.75A.75.75 0 0 1 7 1ZM6.25 6v2.94L5.03 7.72a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l2.5-2.5a.75.75 0 1 0-1.06-1.06L7.75 8.94V6H10a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h2.25Z"
+												d="M8.75 2.75a.75.75 0 0 0-1.5 0v5.69L5.03 6.22a.75.75 0 0 0-1.06 1.06l3.5 3.5a.75.75 0 0 0 1.06 0l3.5-3.5a.75.75 0 0 0-1.06-1.06L8.75 8.44V2.75Z"
 											/>
 											<path
-												d="M4.268 14A2 2 0 0 0 6 15h6a2 2 0 0 0 2-2v-3a2 2 0 0 0-1-1.732V11a3 3 0 0 1-3 3H4.268Z"
+												d="M3.5 9.75a.75.75 0 0 0-1.5 0v1.5A2.75 2.75 0 0 0 4.75 14h6.5A2.75 2.75 0 0 0 14 11.25v-1.5a.75.75 0 0 0-1.5 0v1.5c0 .69-.56 1.25-1.25 1.25h-6.5c-.69 0-1.25-.56-1.25-1.25v-1.5Z"
 											/>
 										</svg>
-									</button>
-								</Tooltip>
+									{/if}
+								</button>
 							</div>
-						</div>
-					</div>
 
-					{#if updateModelId}
-						Updating "{updateModelId}" {updateProgress ? `(${updateProgress}%)` : ''}
-					{/if}
-				{/if}
-
-				<div class="space-y-2">
-					<div>
-						<div class=" mb-2 text-sm font-medium">{$i18n.t('Pull a model from Ollama.com')}</div>
-						<div class="flex w-full">
-							<div class="flex-1 mr-2">
-								<input
-									class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
-									placeholder={$i18n.t('Enter model tag (e.g. {{modelTag}})', {
-										modelTag: 'mistral:7b'
-									})}
-									bind:value={modelTag}
-								/>
+							<div class="mt-2 mb-1 text-xs text-gray-400 dark:text-gray-500">
+								{$i18n.t('To access the available model names for downloading,')}
+								<a
+									class=" text-gray-500 dark:text-gray-300 font-medium underline"
+									href="https://ollama.com/library"
+									target="_blank">{$i18n.t('click here.')}</a
+								>
 							</div>
-							<button
-								class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition"
-								on:click={() => {
-									pullModelHandler();
-								}}
-								disabled={modelTransferring}
-							>
-								{#if modelTransferring}
-									<div class="self-center">
-										<svg
-											class=" w-4 h-4"
-											viewBox="0 0 24 24"
-											fill="currentColor"
-											xmlns="http://www.w3.org/2000/svg"
-										>
-											<style>
-												.spinner_ajPY {
-													transform-origin: center;
-													animation: spinner_AtaB 0.75s infinite linear;
-												}
-
-												@keyframes spinner_AtaB {
-													100% {
-														transform: rotate(360deg);
-													}
-												}
-											</style>
-											<path
-												d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
-												opacity=".25"
-											/>
-											<path
-												d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
-												class="spinner_ajPY"
-											/>
-										</svg>
-									</div>
-								{:else}
+
+							{#if Object.keys($MODEL_DOWNLOAD_POOL).length > 0}
+								{#each Object.keys($MODEL_DOWNLOAD_POOL) as model}
+									{#if 'pullProgress' in $MODEL_DOWNLOAD_POOL[model]}
+										<div class="flex flex-col">
+											<div class="font-medium mb-1">{model}</div>
+											<div class="">
+												<div class="flex flex-row justify-between space-x-4 pr-2">
+													<div class=" flex-1">
+														<div
+															class="dark:bg-gray-600 bg-gray-500 text-xs font-medium text-gray-100 text-center p-0.5 leading-none rounded-full"
+															style="width: {Math.max(
+																15,
+																$MODEL_DOWNLOAD_POOL[model].pullProgress ?? 0
+															)}%"
+														>
+															{$MODEL_DOWNLOAD_POOL[model].pullProgress ?? 0}%
+														</div>
+													</div>
+
+													<Tooltip content={$i18n.t('Cancel')}>
+														<button
+															class="text-gray-800 dark:text-gray-100"
+															on:click={() => {
+																cancelModelPullHandler(model);
+															}}
+														>
+															<svg
+																class="w-4 h-4 text-gray-800 dark:text-white"
+																aria-hidden="true"
+																xmlns="http://www.w3.org/2000/svg"
+																width="24"
+																height="24"
+																fill="currentColor"
+																viewBox="0 0 24 24"
+															>
+																<path
+																	stroke="currentColor"
+																	stroke-linecap="round"
+																	stroke-linejoin="round"
+																	stroke-width="2"
+																	d="M6 18 17.94 6M18 18 6.06 6"
+																/>
+															</svg>
+														</button>
+													</Tooltip>
+												</div>
+												{#if 'digest' in $MODEL_DOWNLOAD_POOL[model]}
+													<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;">
+														{$MODEL_DOWNLOAD_POOL[model].digest}
+													</div>
+												{/if}
+											</div>
+										</div>
+									{/if}
+								{/each}
+							{/if}
+						</div>
+
+						<div>
+							<div class=" mb-2 text-sm font-medium">{$i18n.t('Delete a model')}</div>
+							<div class="flex w-full">
+								<div class="flex-1 mr-2">
+									<select
+										class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
+										bind:value={deleteModelTag}
+										placeholder={$i18n.t('Select a model')}
+									>
+										{#if !deleteModelTag}
+											<option value="" disabled selected>{$i18n.t('Select a model')}</option>
+										{/if}
+										{#each $models.filter((m) => !(m?.preset ?? false) && m.owned_by === 'ollama' && (selectedOllamaUrlIdx === null ? true : (m?.ollama?.urls ?? []).includes(selectedOllamaUrlIdx))) as model}
+											<option value={model.name} class="bg-gray-100 dark:bg-gray-700"
+												>{model.name +
+													' (' +
+													(model.ollama.size / 1024 ** 3).toFixed(1) +
+													' GB)'}</option
+											>
+										{/each}
+									</select>
+								</div>
+								<button
+									class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition"
+									on:click={() => {
+										deleteModelHandler();
+									}}
+								>
 									<svg
 										xmlns="http://www.w3.org/2000/svg"
 										viewBox="0 0 16 16"
@@ -561,330 +686,229 @@
 										class="w-4 h-4"
 									>
 										<path
-											d="M8.75 2.75a.75.75 0 0 0-1.5 0v5.69L5.03 6.22a.75.75 0 0 0-1.06 1.06l3.5 3.5a.75.75 0 0 0 1.06 0l3.5-3.5a.75.75 0 0 0-1.06-1.06L8.75 8.44V2.75Z"
-										/>
-										<path
-											d="M3.5 9.75a.75.75 0 0 0-1.5 0v1.5A2.75 2.75 0 0 0 4.75 14h6.5A2.75 2.75 0 0 0 14 11.25v-1.5a.75.75 0 0 0-1.5 0v1.5c0 .69-.56 1.25-1.25 1.25h-6.5c-.69 0-1.25-.56-1.25-1.25v-1.5Z"
+											fill-rule="evenodd"
+											d="M5 3.25V4H2.75a.75.75 0 0 0 0 1.5h.3l.815 8.15A1.5 1.5 0 0 0 5.357 15h5.285a1.5 1.5 0 0 0 1.493-1.35l.815-8.15h.3a.75.75 0 0 0 0-1.5H11v-.75A2.25 2.25 0 0 0 8.75 1h-1.5A2.25 2.25 0 0 0 5 3.25Zm2.25-.75a.75.75 0 0 0-.75.75V4h3v-.75a.75.75 0 0 0-.75-.75h-1.5ZM6.05 6a.75.75 0 0 1 .787.713l.275 5.5a.75.75 0 0 1-1.498.075l-.275-5.5A.75.75 0 0 1 6.05 6Zm3.9 0a.75.75 0 0 1 .712.787l-.275 5.5a.75.75 0 0 1-1.498-.075l.275-5.5a.75.75 0 0 1 .786-.711Z"
+											clip-rule="evenodd"
 										/>
 									</svg>
-								{/if}
-							</button>
-						</div>
-
-						<div class="mt-2 mb-1 text-xs text-gray-400 dark:text-gray-500">
-							{$i18n.t('To access the available model names for downloading,')}
-							<a
-								class=" text-gray-500 dark:text-gray-300 font-medium underline"
-								href="https://ollama.com/library"
-								target="_blank">{$i18n.t('click here.')}</a
-							>
+								</button>
+							</div>
 						</div>
 
-						{#if Object.keys($MODEL_DOWNLOAD_POOL).length > 0}
-							{#each Object.keys($MODEL_DOWNLOAD_POOL) as model}
-								{#if 'pullProgress' in $MODEL_DOWNLOAD_POOL[model]}
-									<div class="flex flex-col">
-										<div class="font-medium mb-1">{model}</div>
-										<div class="">
-											<div class="flex flex-row justify-between space-x-4 pr-2">
-												<div class=" flex-1">
-													<div
-														class="dark:bg-gray-600 bg-gray-500 text-xs font-medium text-gray-100 text-center p-0.5 leading-none rounded-full"
-														style="width: {Math.max(
-															15,
-															$MODEL_DOWNLOAD_POOL[model].pullProgress ?? 0
-														)}%"
-													>
-														{$MODEL_DOWNLOAD_POOL[model].pullProgress ?? 0}%
-													</div>
-												</div>
-
-												<Tooltip content={$i18n.t('Cancel')}>
-													<button
-														class="text-gray-800 dark:text-gray-100"
-														on:click={() => {
-															cancelModelPullHandler(model);
-														}}
-													>
-														<svg
-															class="w-4 h-4 text-gray-800 dark:text-white"
-															aria-hidden="true"
-															xmlns="http://www.w3.org/2000/svg"
-															width="24"
-															height="24"
-															fill="currentColor"
-															viewBox="0 0 24 24"
-														>
-															<path
-																stroke="currentColor"
-																stroke-linecap="round"
-																stroke-linejoin="round"
-																stroke-width="2"
-																d="M6 18 17.94 6M18 18 6.06 6"
-															/>
-														</svg>
-													</button>
-												</Tooltip>
-											</div>
-											{#if 'digest' in $MODEL_DOWNLOAD_POOL[model]}
-												<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;">
-													{$MODEL_DOWNLOAD_POOL[model].digest}
-												</div>
-											{/if}
-										</div>
-									</div>
-								{/if}
-							{/each}
-						{/if}
-					</div>
-
-					<div>
-						<div class=" mb-2 text-sm font-medium">{$i18n.t('Delete a model')}</div>
-						<div class="flex w-full">
-							<div class="flex-1 mr-2">
-								<select
-									class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
-									bind:value={deleteModelTag}
-									placeholder={$i18n.t('Select a model')}
+						<div class="pt-1">
+							<div class="flex justify-between items-center text-xs">
+								<div class=" text-sm font-medium">{$i18n.t('Experimental')}</div>
+								<button
+									class=" text-xs font-medium text-gray-500"
+									type="button"
+									on:click={() => {
+										showExperimentalOllama = !showExperimentalOllama;
+									}}>{showExperimentalOllama ? $i18n.t('Hide') : $i18n.t('Show')}</button
 								>
-									{#if !deleteModelTag}
-										<option value="" disabled selected>{$i18n.t('Select a model')}</option>
-									{/if}
-									{#each $models.filter((m) => !(m?.preset ?? false) && m.owned_by === 'ollama' && (selectedOllamaUrlIdx === null ? true : (m?.ollama?.urls ?? []).includes(selectedOllamaUrlIdx))) as model}
-										<option value={model.name} class="bg-gray-100 dark:bg-gray-700"
-											>{model.name +
-												' (' +
-												(model.ollama.size / 1024 ** 3).toFixed(1) +
-												' GB)'}</option
-										>
-									{/each}
-								</select>
 							</div>
-							<button
-								class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition"
-								on:click={() => {
-									deleteModelHandler();
-								}}
-							>
-								<svg
-									xmlns="http://www.w3.org/2000/svg"
-									viewBox="0 0 16 16"
-									fill="currentColor"
-									class="w-4 h-4"
-								>
-									<path
-										fill-rule="evenodd"
-										d="M5 3.25V4H2.75a.75.75 0 0 0 0 1.5h.3l.815 8.15A1.5 1.5 0 0 0 5.357 15h5.285a1.5 1.5 0 0 0 1.493-1.35l.815-8.15h.3a.75.75 0 0 0 0-1.5H11v-.75A2.25 2.25 0 0 0 8.75 1h-1.5A2.25 2.25 0 0 0 5 3.25Zm2.25-.75a.75.75 0 0 0-.75.75V4h3v-.75a.75.75 0 0 0-.75-.75h-1.5ZM6.05 6a.75.75 0 0 1 .787.713l.275 5.5a.75.75 0 0 1-1.498.075l-.275-5.5A.75.75 0 0 1 6.05 6Zm3.9 0a.75.75 0 0 1 .712.787l-.275 5.5a.75.75 0 0 1-1.498-.075l.275-5.5a.75.75 0 0 1 .786-.711Z"
-										clip-rule="evenodd"
-									/>
-								</svg>
-							</button>
 						</div>
-					</div>
 
-					<div class="pt-1">
-						<div class="flex justify-between items-center text-xs">
-							<div class=" text-sm font-medium">{$i18n.t('Experimental')}</div>
-							<button
-								class=" text-xs font-medium text-gray-500"
-								type="button"
-								on:click={() => {
-									showExperimentalOllama = !showExperimentalOllama;
-								}}>{showExperimentalOllama ? $i18n.t('Hide') : $i18n.t('Show')}</button
+						{#if showExperimentalOllama}
+							<form
+								on:submit|preventDefault={() => {
+									uploadModelHandler();
+								}}
 							>
-						</div>
-					</div>
+								<div class=" mb-2 flex w-full justify-between">
+									<div class="  text-sm font-medium">{$i18n.t('Upload a GGUF model')}</div>
 
-					{#if showExperimentalOllama}
-						<form
-							on:submit|preventDefault={() => {
-								uploadModelHandler();
-							}}
-						>
-							<div class=" mb-2 flex w-full justify-between">
-								<div class="  text-sm font-medium">{$i18n.t('Upload a GGUF model')}</div>
+									<button
+										class="p-1 px-3 text-xs flex rounded transition"
+										on:click={() => {
+											if (modelUploadMode === 'file') {
+												modelUploadMode = 'url';
+											} else {
+												modelUploadMode = 'file';
+											}
+										}}
+										type="button"
+									>
+										{#if modelUploadMode === 'file'}
+											<span class="ml-2 self-center">{$i18n.t('File Mode')}</span>
+										{:else}
+											<span class="ml-2 self-center">{$i18n.t('URL Mode')}</span>
+										{/if}
+									</button>
+								</div>
 
-								<button
-									class="p-1 px-3 text-xs flex rounded transition"
-									on:click={() => {
-										if (modelUploadMode === 'file') {
-											modelUploadMode = 'url';
-										} else {
-											modelUploadMode = 'file';
-										}
-									}}
-									type="button"
-								>
-									{#if modelUploadMode === 'file'}
-										<span class="ml-2 self-center">{$i18n.t('File Mode')}</span>
-									{:else}
-										<span class="ml-2 self-center">{$i18n.t('URL Mode')}</span>
-									{/if}
-								</button>
-							</div>
+								<div class="flex w-full mb-1.5">
+									<div class="flex flex-col w-full">
+										{#if modelUploadMode === 'file'}
+											<div
+												class="flex-1 {modelInputFile && modelInputFile.length > 0 ? 'mr-2' : ''}"
+											>
+												<input
+													id="model-upload-input"
+													bind:this={modelUploadInputElement}
+													type="file"
+													bind:files={modelInputFile}
+													on:change={() => {
+														console.log(modelInputFile);
+													}}
+													accept=".gguf,.safetensors"
+													required
+													hidden
+												/>
 
-							<div class="flex w-full mb-1.5">
-								<div class="flex flex-col w-full">
-									{#if modelUploadMode === 'file'}
-										<div class="flex-1 {modelInputFile && modelInputFile.length > 0 ? 'mr-2' : ''}">
-											<input
-												id="model-upload-input"
-												bind:this={modelUploadInputElement}
-												type="file"
-												bind:files={modelInputFile}
-												on:change={() => {
-													console.log(modelInputFile);
-												}}
-												accept=".gguf,.safetensors"
-												required
-												hidden
-											/>
+												<button
+													type="button"
+													class="w-full rounded-lg text-left py-2 px-4 bg-white dark:text-gray-300 dark:bg-gray-850"
+													on:click={() => {
+														modelUploadInputElement.click();
+													}}
+												>
+													{#if modelInputFile && modelInputFile.length > 0}
+														{modelInputFile[0].name}
+													{:else}
+														{$i18n.t('Click here to select')}
+													{/if}
+												</button>
+											</div>
+										{:else}
+											<div class="flex-1 {modelFileUrl !== '' ? 'mr-2' : ''}">
+												<input
+													class="w-full rounded-lg text-left py-2 px-4 bg-white dark:text-gray-300 dark:bg-gray-850 outline-none {modelFileUrl !==
+													''
+														? 'mr-2'
+														: ''}"
+													type="url"
+													required
+													bind:value={modelFileUrl}
+													placeholder={$i18n.t('Type Hugging Face Resolve (Download) URL')}
+												/>
+											</div>
+										{/if}
+									</div>
 
-											<button
-												type="button"
-												class="w-full rounded-lg text-left py-2 px-4 bg-white dark:text-gray-300 dark:bg-gray-850"
-												on:click={() => {
-													modelUploadInputElement.click();
-												}}
-											>
-												{#if modelInputFile && modelInputFile.length > 0}
-													{modelInputFile[0].name}
-												{:else}
-													{$i18n.t('Click here to select')}
-												{/if}
-											</button>
-										</div>
-									{:else}
-										<div class="flex-1 {modelFileUrl !== '' ? 'mr-2' : ''}">
-											<input
-												class="w-full rounded-lg text-left py-2 px-4 bg-white dark:text-gray-300 dark:bg-gray-850 outline-none {modelFileUrl !==
-												''
-													? 'mr-2'
-													: ''}"
-												type="url"
-												required
-												bind:value={modelFileUrl}
-												placeholder={$i18n.t('Type Hugging Face Resolve (Download) URL')}
-											/>
-										</div>
-									{/if}
-								</div>
+									{#if (modelUploadMode === 'file' && modelInputFile && modelInputFile.length > 0) || (modelUploadMode === 'url' && modelFileUrl !== '')}
+										<button
+											class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg disabled:cursor-not-allowed transition"
+											type="submit"
+											disabled={modelTransferring}
+										>
+											{#if modelTransferring}
+												<div class="self-center">
+													<svg
+														class=" w-4 h-4"
+														viewBox="0 0 24 24"
+														fill="currentColor"
+														xmlns="http://www.w3.org/2000/svg"
+													>
+														<style>
+															.spinner_ajPY {
+																transform-origin: center;
+																animation: spinner_AtaB 0.75s infinite linear;
+															}
 
-								{#if (modelUploadMode === 'file' && modelInputFile && modelInputFile.length > 0) || (modelUploadMode === 'url' && modelFileUrl !== '')}
-									<button
-										class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg disabled:cursor-not-allowed transition"
-										type="submit"
-										disabled={modelTransferring}
-									>
-										{#if modelTransferring}
-											<div class="self-center">
+															@keyframes spinner_AtaB {
+																100% {
+																	transform: rotate(360deg);
+																}
+															}
+														</style>
+														<path
+															d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
+															opacity=".25"
+														/>
+														<path
+															d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
+															class="spinner_ajPY"
+														/>
+													</svg>
+												</div>
+											{:else}
 												<svg
-													class=" w-4 h-4"
-													viewBox="0 0 24 24"
-													fill="currentColor"
 													xmlns="http://www.w3.org/2000/svg"
+													viewBox="0 0 16 16"
+													fill="currentColor"
+													class="w-4 h-4"
 												>
-													<style>
-														.spinner_ajPY {
-															transform-origin: center;
-															animation: spinner_AtaB 0.75s infinite linear;
-														}
-
-														@keyframes spinner_AtaB {
-															100% {
-																transform: rotate(360deg);
-															}
-														}
-													</style>
 													<path
-														d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
-														opacity=".25"
+														d="M7.25 10.25a.75.75 0 0 0 1.5 0V4.56l2.22 2.22a.75.75 0 1 0 1.06-1.06l-3.5-3.5a.75.75 0 0 0-1.06 0l-3.5 3.5a.75.75 0 0 0 1.06 1.06l2.22-2.22v5.69Z"
 													/>
 													<path
-														d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
-														class="spinner_ajPY"
+														d="M3.5 9.75a.75.75 0 0 0-1.5 0v1.5A2.75 2.75 0 0 0 4.75 14h6.5A2.75 2.75 0 0 0 14 11.25v-1.5a.75.75 0 0 0-1.5 0v1.5c0 .69-.56 1.25-1.25 1.25h-6.5c-.69 0-1.25-.56-1.25-1.25v-1.5Z"
 													/>
 												</svg>
-											</div>
-										{:else}
-											<svg
-												xmlns="http://www.w3.org/2000/svg"
-												viewBox="0 0 16 16"
-												fill="currentColor"
-												class="w-4 h-4"
-											>
-												<path
-													d="M7.25 10.25a.75.75 0 0 0 1.5 0V4.56l2.22 2.22a.75.75 0 1 0 1.06-1.06l-3.5-3.5a.75.75 0 0 0-1.06 0l-3.5 3.5a.75.75 0 0 0 1.06 1.06l2.22-2.22v5.69Z"
-												/>
-												<path
-													d="M3.5 9.75a.75.75 0 0 0-1.5 0v1.5A2.75 2.75 0 0 0 4.75 14h6.5A2.75 2.75 0 0 0 14 11.25v-1.5a.75.75 0 0 0-1.5 0v1.5c0 .69-.56 1.25-1.25 1.25h-6.5c-.69 0-1.25-.56-1.25-1.25v-1.5Z"
-												/>
-											</svg>
-										{/if}
-									</button>
-								{/if}
-							</div>
+											{/if}
+										</button>
+									{/if}
+								</div>
 
-							{#if (modelUploadMode === 'file' && modelInputFile && modelInputFile.length > 0) || (modelUploadMode === 'url' && modelFileUrl !== '')}
-								<div>
+								{#if (modelUploadMode === 'file' && modelInputFile && modelInputFile.length > 0) || (modelUploadMode === 'url' && modelFileUrl !== '')}
 									<div>
-										<div class=" my-2.5 text-sm font-medium">{$i18n.t('Modelfile Content')}</div>
-										<textarea
-											bind:value={modelFileContent}
-											class="w-full rounded-lg py-2 px-4 text-sm bg-gray-100 dark:text-gray-100 dark:bg-gray-850 outline-none resize-none"
-											rows="6"
-										/>
+										<div>
+											<div class=" my-2.5 text-sm font-medium">{$i18n.t('Modelfile Content')}</div>
+											<textarea
+												bind:value={modelFileContent}
+												class="w-full rounded-lg py-2 px-4 text-sm bg-gray-100 dark:text-gray-100 dark:bg-gray-850 outline-none resize-none"
+												rows="6"
+											/>
+										</div>
 									</div>
+								{/if}
+								<div class=" mt-1 text-xs text-gray-400 dark:text-gray-500">
+									{$i18n.t('To access the GGUF models available for downloading,')}
+									<a
+										class=" text-gray-500 dark:text-gray-300 font-medium underline"
+										href="https://huggingface.co/models?search=gguf"
+										target="_blank">{$i18n.t('click here.')}</a
+									>
 								</div>
-							{/if}
-							<div class=" mt-1 text-xs text-gray-400 dark:text-gray-500">
-								{$i18n.t('To access the GGUF models available for downloading,')}
-								<a
-									class=" text-gray-500 dark:text-gray-300 font-medium underline"
-									href="https://huggingface.co/models?search=gguf"
-									target="_blank">{$i18n.t('click here.')}</a
-								>
-							</div>
 
-							{#if uploadMessage}
-								<div class="mt-2">
-									<div class=" mb-2 text-xs">{$i18n.t('Upload Progress')}</div>
+								{#if uploadMessage}
+									<div class="mt-2">
+										<div class=" mb-2 text-xs">{$i18n.t('Upload Progress')}</div>
 
-									<div class="w-full rounded-full dark:bg-gray-800">
-										<div
-											class="dark:bg-gray-600 bg-gray-500 text-xs font-medium text-gray-100 text-center p-0.5 leading-none rounded-full"
-											style="width: 100%"
-										>
-											{uploadMessage}
+										<div class="w-full rounded-full dark:bg-gray-800">
+											<div
+												class="dark:bg-gray-600 bg-gray-500 text-xs font-medium text-gray-100 text-center p-0.5 leading-none rounded-full"
+												style="width: 100%"
+											>
+												{uploadMessage}
+											</div>
 										</div>
-									</div>
-									<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;">
-										{modelFileDigest}
-									</div>
-								</div>
-							{:else if uploadProgress !== null}
-								<div class="mt-2">
-									<div class=" mb-2 text-xs">{$i18n.t('Upload Progress')}</div>
-
-									<div class="w-full rounded-full dark:bg-gray-800">
-										<div
-											class="dark:bg-gray-600 bg-gray-500 text-xs font-medium text-gray-100 text-center p-0.5 leading-none rounded-full"
-											style="width: {Math.max(15, uploadProgress ?? 0)}%"
-										>
-											{uploadProgress ?? 0}%
+										<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;">
+											{modelFileDigest}
 										</div>
 									</div>
-									<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;">
-										{modelFileDigest}
+								{:else if uploadProgress !== null}
+									<div class="mt-2">
+										<div class=" mb-2 text-xs">{$i18n.t('Upload Progress')}</div>
+
+										<div class="w-full rounded-full dark:bg-gray-800">
+											<div
+												class="dark:bg-gray-600 bg-gray-500 text-xs font-medium text-gray-100 text-center p-0.5 leading-none rounded-full"
+												style="width: {Math.max(15, uploadProgress ?? 0)}%"
+											>
+												{uploadProgress ?? 0}%
+											</div>
+										</div>
+										<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;">
+											{modelFileDigest}
+										</div>
 									</div>
-								</div>
-							{/if}
-						</form>
-					{/if}
+								{/if}
+							</form>
+						{/if}
+					</div>
 				</div>
-			</div>
-		{:else if ollamaVersion === false}
-			<div>Ollama Not Detected</div>
+			{:else if ollamaVersion === false}
+				<div>Ollama Not Detected</div>
+			{:else}
+				<div class="flex h-full justify-center">
+					<div class="my-auto">
+						<Spinner className="size-6" />
+					</div>
+				</div>
+			{/if}
+		{:else if ollamaEnabled === false}
+			<div>Ollama API is disabled</div>
 		{:else}
 			<div class="flex h-full justify-center">
 				<div class="my-auto">

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

@@ -0,0 +1,19 @@
+<script lang="ts">
+	export let className = 'size-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="M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3"
+	/>
+</svg>

+ 10 - 0
src/lib/components/workspace/Models.svelte

@@ -126,6 +126,13 @@
 		saveAs(blob, `models-export-${Date.now()}.json`);
 	};
 
+	const exportModelHandler = async (model) => {
+		let blob = new Blob([JSON.stringify([model])], {
+			type: 'application/json'
+		});
+		saveAs(blob, `${model.id}-${Date.now()}.json`);
+	};
+
 	const positionChangeHanlder = async () => {
 		// Get the new order of the models
 		const modelIds = Array.from(document.getElementById('model-list').children).map((child) =>
@@ -322,6 +329,9 @@
 					cloneHandler={() => {
 						cloneModelHandler(model);
 					}}
+					exportHandler={() => {
+						exportModelHandler(model);
+					}}
 					hideHandler={() => {
 						hideModelHandler(model);
 					}}

+ 14 - 0
src/lib/components/workspace/Models/ModelMenu.svelte

@@ -11,6 +11,7 @@
 	import Share from '$lib/components/icons/Share.svelte';
 	import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte';
 	import DocumentDuplicate from '$lib/components/icons/DocumentDuplicate.svelte';
+	import ArrowDownTray from '$lib/components/icons/ArrowDownTray.svelte';
 
 	const i18n = getContext('i18n');
 
@@ -18,6 +19,8 @@
 
 	export let shareHandler: Function;
 	export let cloneHandler: Function;
+	export let exportHandler: Function;
+
 	export let hideHandler: Function;
 	export let deleteHandler: Function;
 	export let onClose: Function;
@@ -66,6 +69,17 @@
 				<div class="flex items-center">{$i18n.t('Clone')}</div>
 			</DropdownMenu.Item>
 
+			<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-md"
+				on:click={() => {
+					exportHandler();
+				}}
+			>
+				<ArrowDownTray />
+
+				<div class="flex items-center">{$i18n.t('Export')}</div>
+			</DropdownMenu.Item>
+
 			<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-md"
 				on:click={() => {

+ 5 - 0
src/lib/i18n/locales/ar-BH/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "أدخل الصلاحيات",
 	"Error": "",
 	"Experimental": "تجريبي",
+	"Export": "",
 	"Export All Chats (All Users)": "تصدير جميع الدردشات (جميع المستخدمين)",
 	"Export Chats": "تصدير جميع الدردشات",
 	"Export Documents Mapping": "تصدير وثائق الخرائط",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ملاحظة: إذا قمت بتعيين الحد الأدنى من النقاط، فلن يؤدي البحث إلا إلى إرجاع المستندات التي لها نقاط أكبر من أو تساوي الحد الأدنى من النقاط.",
 	"Notifications": "إشعارات",
 	"November": "نوفمبر",
+	"num_thread (Ollama)": "",
 	"October": "اكتوبر",
 	"Off": "أغلاق",
 	"Okay, Let's Go!": "حسنا دعنا نذهب!",
 	"OLED Dark": "OLED داكن",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama الاصدار",
 	"On": "تشغيل",
 	"Only": "فقط",
@@ -497,6 +500,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "أستخدم '#' في المحادثة لربطهامن المستندات",
 	"Use Gravatar": "Gravatar أستخدم",
 	"Use Initials": "Initials أستخدم",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "مستخدم",
 	"User Permissions": "صلاحيات المستخدم",
 	"Users": "المستخدمين",

+ 5 - 0
src/lib/i18n/locales/bg-BG/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Въведете вашата роля",
 	"Error": "",
 	"Experimental": "Експериментално",
+	"Export": "",
 	"Export All Chats (All Users)": "Експортване на всички чатове (За всички потребители)",
 	"Export Chats": "Експортване на чатове",
 	"Export Documents Mapping": "Експортване на документен мапинг",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Забележка: Ако зададете минимален резултат, търсенето ще върне само документи с резултат, по-голям или равен на минималния резултат.",
 	"Notifications": "Десктоп Известия",
 	"November": "Ноември",
+	"num_thread (Ollama)": "",
 	"October": "Октомври",
 	"Off": "Изкл.",
 	"Okay, Let's Go!": "ОК, Нека започваме!",
 	"OLED Dark": "OLED тъмно",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama Версия",
 	"On": "Вкл.",
 	"Only": "Само",
@@ -493,6 +496,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Използвайте '#' във промпта за да заредите и изберете вашите документи.",
 	"Use Gravatar": "Използвайте Gravatar",
 	"Use Initials": "Използвайте Инициали",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "потребител",
 	"User Permissions": "Права на потребителя",
 	"Users": "Потребители",

+ 5 - 0
src/lib/i18n/locales/bn-BD/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "আপনার রোল লিখুন",
 	"Error": "",
 	"Experimental": "পরিক্ষামূলক",
+	"Export": "",
 	"Export All Chats (All Users)": "সব চ্যাট এক্সপোর্ট করুন (সব ইউজারের)",
 	"Export Chats": "চ্যাটগুলো এক্সপোর্ট করুন",
 	"Export Documents Mapping": "ডকুমেন্টসমূহ ম্যাপিং এক্সপোর্ট করুন",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "দ্রষ্টব্য: আপনি যদি ন্যূনতম স্কোর সেট করেন তবে অনুসন্ধানটি কেবলমাত্র ন্যূনতম স্কোরের চেয়ে বেশি বা সমান স্কোর সহ নথিগুলি ফেরত দেবে।",
 	"Notifications": "নোটিফিকেশনসমূহ",
 	"November": "নভেম্বর",
+	"num_thread (Ollama)": "",
 	"October": "অক্টোবর",
 	"Off": "বন্ধ",
 	"Okay, Let's Go!": "ঠিক আছে, চলুন যাই!",
 	"OLED Dark": "OLED ডার্ক",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama ভার্সন",
 	"On": "চালু",
 	"Only": "শুধুমাত্র",
@@ -493,6 +496,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "আপনার ডকুমেন্টসমূহ নির্বাচন করার জন্য আপনার প্রম্পট ইনপুটে '# ব্যবহার করুন।",
 	"Use Gravatar": "Gravatar ব্যবহার করুন",
 	"Use Initials": "নামের আদ্যক্ষর ব্যবহার করুন",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "ব্যবহারকারী",
 	"User Permissions": "ইউজার পারমিশনসমূহ",
 	"Users": "ব্যাবহারকারীগণ",

+ 5 - 0
src/lib/i18n/locales/ca-ES/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Introdueix el Teu Ròl",
 	"Error": "",
 	"Experimental": "Experimental",
+	"Export": "",
 	"Export All Chats (All Users)": "Exporta Tots els Xats (Tots els Usuaris)",
 	"Export Chats": "Exporta Xats",
 	"Export Documents Mapping": "Exporta el Mapatge de Documents",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Si establiscs una puntuació mínima, la cerca només retornarà documents amb una puntuació major o igual a la puntuació mínima.",
 	"Notifications": "Notificacions d'Escriptori",
 	"November": "Novembre",
+	"num_thread (Ollama)": "",
 	"October": "Octubre",
 	"Off": "Desactivat",
 	"Okay, Let's Go!": "D'acord, Anem!",
 	"OLED Dark": "OLED Fosc",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Versió d'Ollama",
 	"On": "Activat",
 	"Only": "Només",
@@ -494,6 +497,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Utilitza '#' a l'entrada del prompt per carregar i seleccionar els teus documents.",
 	"Use Gravatar": "Utilitza Gravatar",
 	"Use Initials": "Utilitza Inicials",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "usuari",
 	"User Permissions": "Permisos d'Usuari",
 	"Users": "Usuaris",

+ 5 - 0
src/lib/i18n/locales/ceb-PH/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "",
 	"Error": "",
 	"Experimental": "Eksperimento",
+	"Export": "",
 	"Export All Chats (All Users)": "I-export ang tanan nga mga chat (Tanan nga tiggamit)",
 	"Export Chats": "I-export ang mga chat",
 	"Export Documents Mapping": "I-export ang pagmapa sa dokumento",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
 	"Notifications": "Mga pahibalo sa desktop",
 	"November": "",
+	"num_thread (Ollama)": "",
 	"October": "",
 	"Off": "Napuo",
 	"Okay, Let's Go!": "Okay, lakaw na!",
 	"OLED Dark": "",
 	"Ollama": "",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama nga bersyon",
 	"On": "Gipaandar",
 	"Only": "Lamang",
@@ -493,6 +496,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Gamita ang '#' sa dali nga pagsulod aron makarga ug mapili ang imong mga dokumento.",
 	"Use Gravatar": "Paggamit sa Gravatar",
 	"Use Initials": "",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "tiggamit",
 	"User Permissions": "Mga permiso sa tiggamit",
 	"Users": "Mga tiggamit",

+ 5 - 0
src/lib/i18n/locales/de-DE/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Gebe deine Rolle ein",
 	"Error": "",
 	"Experimental": "Experimentell",
+	"Export": "",
 	"Export All Chats (All Users)": "Alle Chats exportieren (alle Benutzer)",
 	"Export Chats": "Chats exportieren",
 	"Export Documents Mapping": "Dokumentenmapping exportieren",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Hinweis: Wenn du einen Mindestscore festlegst, wird die Suche nur Dokumente zurückgeben, deren Score größer oder gleich dem Mindestscore ist.",
 	"Notifications": "Desktop-Benachrichtigungen",
 	"November": "November",
+	"num_thread (Ollama)": "",
 	"October": "Oktober",
 	"Off": "Aus",
 	"Okay, Let's Go!": "Okay, los geht's!",
 	"OLED Dark": "OLED Dunkel",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama-Version",
 	"On": "Ein",
 	"Only": "Nur",
@@ -493,6 +496,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Verwende '#' in der Prompt-Eingabe, um deine Dokumente zu laden und auszuwählen.",
 	"Use Gravatar": "Gravatar verwenden",
 	"Use Initials": "Initialen verwenden",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "Benutzer",
 	"User Permissions": "Benutzerberechtigungen",
 	"Users": "Benutzer",

+ 5 - 0
src/lib/i18n/locales/dg-DG/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "",
 	"Error": "",
 	"Experimental": "Much Experiment",
+	"Export": "",
 	"Export All Chats (All Users)": "Export All Chats (All Doggos)",
 	"Export Chats": "Export Barks",
 	"Export Documents Mapping": "Export Mappings of Dogos",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
 	"Notifications": "Notifications",
 	"November": "",
+	"num_thread (Ollama)": "",
 	"October": "",
 	"Off": "Off",
 	"Okay, Let's Go!": "Okay, Let's Go!",
 	"OLED Dark": "OLED Dark",
 	"Ollama": "",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama Version",
 	"On": "On",
 	"Only": "Only",
@@ -493,6 +496,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Use '#' in the prompt input to load and select your documents. Much use.",
 	"Use Gravatar": "Use Gravatar much avatar",
 	"Use Initials": "Use Initials much initial",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "user much user",
 	"User Permissions": "User Permissions much permissions",
 	"Users": "Users much users",

+ 5 - 0
src/lib/i18n/locales/en-GB/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "",
 	"Error": "",
 	"Experimental": "",
+	"Export": "",
 	"Export All Chats (All Users)": "",
 	"Export Chats": "",
 	"Export Documents Mapping": "",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
 	"Notifications": "",
 	"November": "",
+	"num_thread (Ollama)": "",
 	"October": "",
 	"Off": "",
 	"Okay, Let's Go!": "",
 	"OLED Dark": "",
 	"Ollama": "",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "",
 	"On": "",
 	"Only": "",
@@ -493,6 +496,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "",
 	"Use Gravatar": "",
 	"Use Initials": "",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "",
 	"User Permissions": "",
 	"Users": "",

+ 5 - 0
src/lib/i18n/locales/en-US/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "",
 	"Error": "",
 	"Experimental": "",
+	"Export": "",
 	"Export All Chats (All Users)": "",
 	"Export Chats": "",
 	"Export Documents Mapping": "",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
 	"Notifications": "",
 	"November": "",
+	"num_thread (Ollama)": "",
 	"October": "",
 	"Off": "",
 	"Okay, Let's Go!": "",
 	"OLED Dark": "",
 	"Ollama": "",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "",
 	"On": "",
 	"Only": "",
@@ -493,6 +496,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "",
 	"Use Gravatar": "",
 	"Use Initials": "",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "",
 	"User Permissions": "",
 	"Users": "",

+ 5 - 0
src/lib/i18n/locales/es-ES/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Ingrese su rol",
 	"Error": "",
 	"Experimental": "Experimental",
+	"Export": "",
 	"Export All Chats (All Users)": "Exportar todos los chats (Todos los usuarios)",
 	"Export Chats": "Exportar Chats",
 	"Export Documents Mapping": "Exportar el mapeo de documentos",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Si estableces una puntuación mínima, la búsqueda sólo devolverá documentos con una puntuación mayor o igual a la puntuación mínima.",
 	"Notifications": "Notificaciones",
 	"November": "Noviembre",
+	"num_thread (Ollama)": "",
 	"October": "Octubre",
 	"Off": "Desactivado",
 	"Okay, Let's Go!": "Bien, ¡Vamos!",
 	"OLED Dark": "OLED oscuro",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Versión de Ollama",
 	"On": "Activado",
 	"Only": "Solamente",
@@ -494,6 +497,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Utilice '#' en el prompt para cargar y seleccionar sus documentos.",
 	"Use Gravatar": "Usar Gravatar",
 	"Use Initials": "Usar Iniciales",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "usuario",
 	"User Permissions": "Permisos de usuario",
 	"Users": "Usuarios",

+ 5 - 0
src/lib/i18n/locales/fa-IR/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "نقش خود را وارد کنید",
 	"Error": "",
 	"Experimental": "آزمایشی",
+	"Export": "",
 	"Export All Chats (All Users)": "اکسپورت از همه گپ\u200cها(همه کاربران)",
 	"Export Chats": "اکسپورت از گپ\u200cها",
 	"Export Documents Mapping": "اکسپورت از نگاشت اسناد",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
 	"Notifications": "اعلان",
 	"November": "نوامبر",
+	"num_thread (Ollama)": "",
 	"October": "اکتبر",
 	"Off": "خاموش",
 	"Okay, Let's Go!": "باشه، بزن بریم!",
 	"OLED Dark": "OLED تیره",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "نسخه اولاما",
 	"On": "روشن",
 	"Only": "فقط",
@@ -493,6 +496,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "در پرامپت از '#' برای لود و انتخاب اسناد خود استفاده کنید.",
 	"Use Gravatar": "استفاده از گراواتار",
 	"Use Initials": "استفاده از آبزوده",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "کاربر",
 	"User Permissions": "مجوزهای کاربر",
 	"Users": "کاربران",

+ 5 - 0
src/lib/i18n/locales/fi-FI/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Syötä roolisi",
 	"Error": "",
 	"Experimental": "Kokeellinen",
+	"Export": "",
 	"Export All Chats (All Users)": "Vie kaikki keskustelut (kaikki käyttäjät)",
 	"Export Chats": "Vie keskustelut",
 	"Export Documents Mapping": "Vie asiakirjakartoitus",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Huom: Jos asetat vähimmäispisteet, haku palauttaa vain asiakirjat, joiden pisteet ovat suurempia tai yhtä suuria kuin vähimmäispistemäärä.",
 	"Notifications": "Ilmoitukset",
 	"November": "marraskuu",
+	"num_thread (Ollama)": "",
 	"October": "lokakuu",
 	"Off": "Pois",
 	"Okay, Let's Go!": "Eikun menoksi!",
 	"OLED Dark": "OLED-tumma",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama-versio",
 	"On": "Päällä",
 	"Only": "Vain",
@@ -493,6 +496,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Käytä '#' syötteessä ladataksesi ja valitaksesi asiakirjoja.",
 	"Use Gravatar": "Käytä Gravataria",
 	"Use Initials": "Käytä alkukirjaimia",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "käyttäjä",
 	"User Permissions": "Käyttäjäoikeudet",
 	"Users": "Käyttäjät",

+ 5 - 0
src/lib/i18n/locales/fr-CA/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Entrez votre rôle",
 	"Error": "",
 	"Experimental": "Expérimental",
+	"Export": "",
 	"Export All Chats (All Users)": "Exporter toutes les discussions (Tous les utilisateurs)",
 	"Export Chats": "Exporter les discussions",
 	"Export Documents Mapping": "Exporter le mappage des documents",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note: Si vous définissez un score minimum, la recherche ne retournera que les documents avec un score supérieur ou égal au score minimum.",
 	"Notifications": "Notifications de bureau",
 	"November": "Novembre",
+	"num_thread (Ollama)": "",
 	"October": "Octobre",
 	"Off": "Éteint",
 	"Okay, Let's Go!": "Okay, Allons-y !",
 	"OLED Dark": "OLED Sombre",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Version Ollama",
 	"On": "Activé",
 	"Only": "Seulement",
@@ -494,6 +497,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Utilisez '#' dans l'entrée de prompt pour charger et sélectionner vos documents.",
 	"Use Gravatar": "Utiliser Gravatar",
 	"Use Initials": "Utiliser les Initiales",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "utilisateur",
 	"User Permissions": "Permissions de l'utilisateur",
 	"Users": "Utilisateurs",

+ 5 - 0
src/lib/i18n/locales/fr-FR/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Entrez Votre Rôle",
 	"Error": "",
 	"Experimental": "Expérimental",
+	"Export": "",
 	"Export All Chats (All Users)": "Exporter Tous les Chats (Tous les Utilisateurs)",
 	"Export Chats": "Exporter les Chats",
 	"Export Documents Mapping": "Exporter la Correspondance des Documents",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note : Si vous définissez un score minimum, la recherche ne renverra que les documents ayant un score supérieur ou égal au score minimum.",
 	"Notifications": "Notifications de bureau",
 	"November": "Novembre",
+	"num_thread (Ollama)": "",
 	"October": "Octobre",
 	"Off": "Désactivé",
 	"Okay, Let's Go!": "D'accord, allons-y !",
 	"OLED Dark": "Sombre OLED",
 	"Ollama": "Ollama",
 	"Ollama API": "API Ollama",
+	"Ollama API disabled": "",
 	"Ollama Version": "Version Ollama",
 	"On": "Activé",
 	"Only": "Seulement",
@@ -494,6 +497,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Utilisez '#' dans l'entrée du prompt pour charger et sélectionner vos documents.",
 	"Use Gravatar": "Utiliser Gravatar",
 	"Use Initials": "Utiliser les Initiales",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "utilisateur",
 	"User Permissions": "Permissions d'utilisateur",
 	"Users": "Utilisateurs",

+ 5 - 0
src/lib/i18n/locales/he-IL/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "הזן את התפקיד שלך",
 	"Error": "",
 	"Experimental": "ניסיוני",
+	"Export": "",
 	"Export All Chats (All Users)": "ייצוא כל הצ'אטים (כל המשתמשים)",
 	"Export Chats": "ייצוא צ'אטים",
 	"Export Documents Mapping": "ייצוא מיפוי מסמכים",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "הערה: אם תקבע ציון מינימלי, החיפוש יחזיר רק מסמכים עם ציון שגבוה או שווה לציון המינימלי.",
 	"Notifications": "התראות",
 	"November": "נובמבר",
+	"num_thread (Ollama)": "",
 	"October": "אוקטובר",
 	"Off": "כבוי",
 	"Okay, Let's Go!": "בסדר, בואו נתחיל!",
 	"OLED Dark": "OLED כהה",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "גרסת Ollama",
 	"On": "פועל",
 	"Only": "רק",
@@ -494,6 +497,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "השתמש ב- '#' בקלט הבקשה כדי לטעון ולבחור את המסמכים שלך.",
 	"Use Gravatar": "שימוש ב Gravatar",
 	"Use Initials": "שימוש ב initials",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "משתמש",
 	"User Permissions": "הרשאות משתמש",
 	"Users": "משתמשים",

+ 5 - 0
src/lib/i18n/locales/hi-IN/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "अपनी भूमिका दर्ज करें",
 	"Error": "",
 	"Experimental": "प्रयोगात्मक",
+	"Export": "",
 	"Export All Chats (All Users)": "सभी चैट निर्यात करें (सभी उपयोगकर्ताओं की)",
 	"Export Chats": "चैट निर्यात करें",
 	"Export Documents Mapping": "निर्यात दस्तावेज़ मैपिंग",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ध्यान दें: यदि आप न्यूनतम स्कोर निर्धारित करते हैं, तो खोज केवल न्यूनतम स्कोर से अधिक या उसके बराबर स्कोर वाले दस्तावेज़ वापस लाएगी।",
 	"Notifications": "सूचनाएं",
 	"November": "नवंबर",
+	"num_thread (Ollama)": "",
 	"October": "अक्टूबर",
 	"Off": "बंद",
 	"Okay, Let's Go!": "ठीक है, चलिए चलते हैं!",
 	"OLED Dark": "OLEDescuro",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama Version",
 	"On": "चालू",
 	"Only": "केवल",
@@ -493,6 +496,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "अपने दस्तावेज़ों को लोड करने और चुनने के लिए शीघ्र इनपुट में '#' का उपयोग करें।",
 	"Use Gravatar": "Gravatar का प्रयोग करें",
 	"Use Initials": "प्रथमाक्षर का प्रयोग करें",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "उपयोगकर्ता",
 	"User Permissions": "उपयोगकर्ता अनुमतियाँ",
 	"Users": "उपयोगकर्ताओं",

+ 5 - 0
src/lib/i18n/locales/hr-HR/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Unesite svoju ulogu",
 	"Error": "",
 	"Experimental": "Eksperimentalno",
+	"Export": "",
 	"Export All Chats (All Users)": "Izvoz svih razgovora (svi korisnici)",
 	"Export Chats": "Izvoz razgovora",
 	"Export Documents Mapping": "Izvoz mapiranja dokumenata",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Napomena: Ako postavite minimalnu ocjenu, pretraga će vratiti samo dokumente s ocjenom većom ili jednakom minimalnoj ocjeni.",
 	"Notifications": "Obavijesti",
 	"November": "Studeni",
+	"num_thread (Ollama)": "",
 	"October": "Listopad",
 	"Off": "Isključeno",
 	"Okay, Let's Go!": "U redu, idemo!",
 	"OLED Dark": "OLED Tamno",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama verzija",
 	"On": "Uključeno",
 	"Only": "Samo",
@@ -494,6 +497,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Koristite '#' u unosu prompta za učitavanje i odabir vaših dokumenata.",
 	"Use Gravatar": "Koristi Gravatar",
 	"Use Initials": "Koristi inicijale",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "korisnik",
 	"User Permissions": "Korisnička dopuštenja",
 	"Users": "Korisnici",

+ 5 - 0
src/lib/i18n/locales/it-IT/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Inserisci il tuo ruolo",
 	"Error": "",
 	"Experimental": "Sperimentale",
+	"Export": "",
 	"Export All Chats (All Users)": "Esporta tutte le chat (tutti gli utenti)",
 	"Export Chats": "Esporta chat",
 	"Export Documents Mapping": "Esporta mappatura documenti",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: se imposti un punteggio minimo, la ricerca restituirà solo i documenti con un punteggio maggiore o uguale al punteggio minimo.",
 	"Notifications": "Notifiche desktop",
 	"November": "Novembre",
+	"num_thread (Ollama)": "",
 	"October": "Ottobre",
 	"Off": "Disattivato",
 	"Okay, Let's Go!": "Ok, andiamo!",
 	"OLED Dark": "OLED scuro",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Versione Ollama",
 	"On": "Attivato",
 	"Only": "Solo",
@@ -494,6 +497,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Usa '#' nell'input del prompt per caricare e selezionare i tuoi documenti.",
 	"Use Gravatar": "Usa Gravatar",
 	"Use Initials": "Usa iniziali",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "utente",
 	"User Permissions": "Autorizzazioni utente",
 	"Users": "Utenti",

+ 5 - 0
src/lib/i18n/locales/ja-JP/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "ロールを入力してください",
 	"Error": "",
 	"Experimental": "実験的",
+	"Export": "",
 	"Export All Chats (All Users)": "すべてのチャットをエクスポート (すべてのユーザー)",
 	"Export Chats": "チャットをエクスポート",
 	"Export Documents Mapping": "ドキュメントマッピングをエクスポート",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "注意:最小スコアを設定した場合、検索は最小スコア以上のスコアを持つドキュメントのみを返します。",
 	"Notifications": "デスクトップ通知",
 	"November": "11月",
+	"num_thread (Ollama)": "",
 	"October": "10月",
 	"Off": "オフ",
 	"Okay, Let's Go!": "OK、始めましょう!",
 	"OLED Dark": "OLED ダーク",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama バージョン",
 	"On": "オン",
 	"Only": "のみ",
@@ -492,6 +495,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "プロンプト入力で '#' を使用して、ドキュメントを読み込んで選択します。",
 	"Use Gravatar": "Gravatar を使用する",
 	"Use Initials": "初期値を使用する",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "ユーザー",
 	"User Permissions": "ユーザー権限",
 	"Users": "ユーザー",

+ 5 - 0
src/lib/i18n/locales/ka-GE/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "შეიყვანეთ თქვენი როლი",
 	"Error": "",
 	"Experimental": "ექსპერიმენტალური",
+	"Export": "",
 	"Export All Chats (All Users)": "ექსპორტი ყველა ჩათი (ყველა მომხმარებელი)",
 	"Export Chats": "მიმოწერის ექსპორტირება",
 	"Export Documents Mapping": "დოკუმენტების კავშირის ექსპორტი",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "შენიშვნა: თუ თქვენ დააყენებთ მინიმალურ ქულას, ძებნა დააბრუნებს მხოლოდ დოკუმენტებს მინიმალური ქულის მეტი ან ტოლი ქულით.",
 	"Notifications": "შეტყობინება",
 	"November": "ნოემბერი",
+	"num_thread (Ollama)": "",
 	"October": "ოქტომბერი",
 	"Off": "გამორთვა",
 	"Okay, Let's Go!": "კარგი, წავედით!",
 	"OLED Dark": "OLED მუქი",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama ვერსია",
 	"On": "ჩართვა",
 	"Only": "მხოლოდ",
@@ -493,6 +496,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "პრომტში გამოიყენე '#' რომელიც გაიტანს დოკუმენტებს",
 	"Use Gravatar": "გამოიყენე Gravatar",
 	"Use Initials": "გამოიყენე ინიციალები",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "მომხმარებელი",
 	"User Permissions": "მომხმარებლის უფლებები",
 	"Users": "მომხმარებლები",

+ 5 - 0
src/lib/i18n/locales/ko-KR/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "역할 입력",
 	"Error": "",
 	"Experimental": "실험적",
+	"Export": "",
 	"Export All Chats (All Users)": "모든 채팅 내보내기 (모든 사용자)",
 	"Export Chats": "채팅 내보내기",
 	"Export Documents Mapping": "문서 매핑 내보내기",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "참고: 최소 점수를 설정하면 검색 결과는 최소 점수 이상의 점수를 가진 문서만 반환됩니다.",
 	"Notifications": "알림",
 	"November": "11월",
+	"num_thread (Ollama)": "",
 	"October": "10월",
 	"Off": "끄기",
 	"Okay, Let's Go!": "그렇습니다, 시작합시다!",
 	"OLED Dark": "OLED 어두운",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama 버전",
 	"On": "켜기",
 	"Only": "오직",
@@ -492,6 +495,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "프롬프트 입력에서 '#'를 사용하여 문서를 로드하고 선택하세요.",
 	"Use Gravatar": "Gravatar 사용",
 	"Use Initials": "초성 사용",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "사용자",
 	"User Permissions": "사용자 권한",
 	"Users": "사용자",

+ 5 - 0
src/lib/i18n/locales/nl-NL/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Voer je Rol in",
 	"Error": "",
 	"Experimental": "Experimenteel",
+	"Export": "",
 	"Export All Chats (All Users)": "Exporteer Alle Chats (Alle Gebruikers)",
 	"Export Chats": "Exporteer Chats",
 	"Export Documents Mapping": "Exporteer Documenten Mapping",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Opmerking: Als u een minimumscore instelt, levert de zoekopdracht alleen documenten op met een score groter dan of gelijk aan de minimumscore.",
 	"Notifications": "Desktop Notificaties",
 	"November": "November",
+	"num_thread (Ollama)": "",
 	"October": "Oktober",
 	"Off": "Uit",
 	"Okay, Let's Go!": "Okay, Laten we gaan!",
 	"OLED Dark": "OLED Donker",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama Versie",
 	"On": "Aan",
 	"Only": "Alleen",
@@ -493,6 +496,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Gebruik '#' in de prompt input om je documenten te laden en te selecteren.",
 	"Use Gravatar": "Gebruik Gravatar",
 	"Use Initials": "Gebruik Initials",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "user",
 	"User Permissions": "Gebruikers Rechten",
 	"Users": "Gebruikers",

+ 5 - 0
src/lib/i18n/locales/pa-IN/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "ਆਪਣੀ ਭੂਮਿਕਾ ਦਰਜ ਕਰੋ",
 	"Error": "",
 	"Experimental": "ਪਰਮਾਣੂਕ੍ਰਿਤ",
+	"Export": "",
 	"Export All Chats (All Users)": "ਸਾਰੀਆਂ ਗੱਲਾਂ ਨਿਰਯਾਤ ਕਰੋ (ਸਾਰੇ ਉਪਭੋਗਤਾ)",
 	"Export Chats": "ਗੱਲਾਂ ਨਿਰਯਾਤ ਕਰੋ",
 	"Export Documents Mapping": "ਡਾਕੂਮੈਂਟ ਮੈਪਿੰਗ ਨਿਰਯਾਤ ਕਰੋ",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ਨੋਟ: ਜੇ ਤੁਸੀਂ ਘੱਟੋ-ਘੱਟ ਸਕੋਰ ਸੈੱਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਖੋਜ ਸਿਰਫ਼ ਉਹੀ ਡਾਕੂਮੈਂਟ ਵਾਪਸ ਕਰੇਗੀ ਜਿਨ੍ਹਾਂ ਦਾ ਸਕੋਰ ਘੱਟੋ-ਘੱਟ ਸਕੋਰ ਦੇ ਬਰਾਬਰ ਜਾਂ ਵੱਧ ਹੋਵੇ।",
 	"Notifications": "ਸੂਚਨਾਵਾਂ",
 	"November": "ਨਵੰਬਰ",
+	"num_thread (Ollama)": "",
 	"October": "ਅਕਤੂਬਰ",
 	"Off": "ਬੰਦ",
 	"Okay, Let's Go!": "ਠੀਕ ਹੈ, ਚੱਲੋ ਚੱਲੀਏ!",
 	"OLED Dark": "OLED ਗੂੜ੍ਹਾ",
 	"Ollama": "ਓਲਾਮਾ",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "ਓਲਾਮਾ ਵਰਜਨ",
 	"On": "ਚਾਲੂ",
 	"Only": "ਸਿਰਫ਼",
@@ -493,6 +496,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "ਆਪਣੇ ਡਾਕੂਮੈਂਟ ਲੋਡ ਅਤੇ ਚੁਣਨ ਲਈ ਪ੍ਰੰਪਟ ਇਨਪੁਟ ਵਿੱਚ '#' ਵਰਤੋ।",
 	"Use Gravatar": "ਗ੍ਰਾਵਾਟਾਰ ਵਰਤੋ",
 	"Use Initials": "ਸ਼ੁਰੂਆਤੀ ਅੱਖਰ ਵਰਤੋ",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "ਉਪਭੋਗਤਾ",
 	"User Permissions": "ਉਪਭੋਗਤਾ ਅਧਿਕਾਰ",
 	"Users": "ਉਪਭੋਗਤਾ",

+ 5 - 0
src/lib/i18n/locales/pl-PL/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Wprowadź swoją rolę",
 	"Error": "",
 	"Experimental": "Eksperymentalne",
+	"Export": "",
 	"Export All Chats (All Users)": "Eksportuj wszystkie czaty (wszyscy użytkownicy)",
 	"Export Chats": "Eksportuj czaty",
 	"Export Documents Mapping": "Eksportuj mapowanie dokumentów",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Uwaga: Jeśli ustawisz minimalny wynik, szukanie zwróci jedynie dokumenty z wynikiem większym lub równym minimalnemu.",
 	"Notifications": "Powiadomienia",
 	"November": "Listopad",
+	"num_thread (Ollama)": "",
 	"October": "Październik",
 	"Off": "Wyłączony",
 	"Okay, Let's Go!": "Okej, zaczynamy!",
 	"OLED Dark": "Ciemny OLED",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Wersja Ollama",
 	"On": "Włączony",
 	"Only": "Tylko",
@@ -495,6 +498,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Użyj '#' w polu wprowadzania polecenia, aby załadować i wybrać swoje dokumenty.",
 	"Use Gravatar": "Użyj Gravatara",
 	"Use Initials": "Użyj inicjałów",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "użytkownik",
 	"User Permissions": "Uprawnienia użytkownika",
 	"Users": "Użytkownicy",

+ 5 - 0
src/lib/i18n/locales/pt-BR/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Digite sua Função",
 	"Error": "",
 	"Experimental": "Experimental",
+	"Export": "",
 	"Export All Chats (All Users)": "Exportar Todos os Bate-papos (Todos os Usuários)",
 	"Export Chats": "Exportar Bate-papos",
 	"Export Documents Mapping": "Exportar Mapeamento de Documentos",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Se você definir uma pontuação mínima, a pesquisa só retornará documentos com uma pontuação maior ou igual à pontuação mínima.",
 	"Notifications": "Notificações da Área de Trabalho",
 	"November": "Novembro",
+	"num_thread (Ollama)": "",
 	"October": "Outubro",
 	"Off": "Desligado",
 	"Okay, Let's Go!": "Ok, Vamos Lá!",
 	"OLED Dark": "OLED Escuro",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Versão do Ollama",
 	"On": "Ligado",
 	"Only": "Somente",
@@ -494,6 +497,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Use '#' na entrada do prompt para carregar e selecionar seus documentos.",
 	"Use Gravatar": "Usar Gravatar",
 	"Use Initials": "Usar Iniciais",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "usuário",
 	"User Permissions": "Permissões do Usuário",
 	"Users": "Usuários",

+ 5 - 0
src/lib/i18n/locales/pt-PT/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Digite sua Função",
 	"Error": "",
 	"Experimental": "Experimental",
+	"Export": "",
 	"Export All Chats (All Users)": "Exportar Todos os Bate-papos (Todos os Usuários)",
 	"Export Chats": "Exportar Bate-papos",
 	"Export Documents Mapping": "Exportar Mapeamento de Documentos",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Se você definir uma pontuação mínima, a pesquisa só retornará documentos com uma pontuação maior ou igual à pontuação mínima.",
 	"Notifications": "Notificações da Área de Trabalho",
 	"November": "Novembro",
+	"num_thread (Ollama)": "",
 	"October": "Outubro",
 	"Off": "Desligado",
 	"Okay, Let's Go!": "Ok, Vamos Lá!",
 	"OLED Dark": "OLED Escuro",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Versão do Ollama",
 	"On": "Ligado",
 	"Only": "Somente",
@@ -494,6 +497,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Use '#' na entrada do prompt para carregar e selecionar seus documentos.",
 	"Use Gravatar": "Usar Gravatar",
 	"Use Initials": "Usar Iniciais",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "usuário",
 	"User Permissions": "Permissões do Usuário",
 	"Users": "Usuários",

+ 5 - 0
src/lib/i18n/locales/ru-RU/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Введите вашу роль",
 	"Error": "",
 	"Experimental": "Экспериментальное",
+	"Export": "",
 	"Export All Chats (All Users)": "Экспортировать все чаты (все пользователи)",
 	"Export Chats": "Экспортировать чаты",
 	"Export Documents Mapping": "Экспортировать отображение документов",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Обратите внимание: Если вы установите минимальный балл, поиск будет возвращать только документы с баллом больше или равным минимальному баллу.",
 	"Notifications": "Уведомления на рабочем столе",
 	"November": "Ноябрь",
+	"num_thread (Ollama)": "",
 	"October": "Октябрь",
 	"Off": "Выключено.",
 	"Okay, Let's Go!": "Давайте начнём!",
 	"OLED Dark": "OLED темная",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Версия Ollama",
 	"On": "Включено.",
 	"Only": "Только",
@@ -495,6 +498,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Используйте '#' в поле ввода промпта для загрузки и выбора ваших документов.",
 	"Use Gravatar": "Использовать Gravatar",
 	"Use Initials": "Использовать инициалы",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "пользователь",
 	"User Permissions": "Права пользователя",
 	"Users": "Пользователи",

+ 5 - 0
src/lib/i18n/locales/sr-RS/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Унесите вашу улогу",
 	"Error": "",
 	"Experimental": "Експериментално",
+	"Export": "",
 	"Export All Chats (All Users)": "Извези сва ћаскања (сви корисници)",
 	"Export Chats": "Извези ћаскања",
 	"Export Documents Mapping": "Извези мапирање докумената",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Напомена: ако подесите најмањи резултат, претрага ће вратити само документе са резултатом већим или једнаким најмањем резултату.",
 	"Notifications": "Обавештења",
 	"November": "Новембар",
+	"num_thread (Ollama)": "",
 	"October": "Октобар",
 	"Off": "Искључено",
 	"Okay, Let's Go!": "У реду, хајде да кренемо!",
 	"OLED Dark": "OLED тамна",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Издање Ollama-е",
 	"On": "Укључено",
 	"Only": "Само",
@@ -494,6 +497,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Користи '#' у уносу упита да учитате и изаберете ваше документе.",
 	"Use Gravatar": "Користи Граватар",
 	"Use Initials": "Користи иницијале",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "корисник",
 	"User Permissions": "Овлашћења корисника",
 	"Users": "Корисници",

+ 5 - 0
src/lib/i18n/locales/sv-SE/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Ange din roll",
 	"Error": "",
 	"Experimental": "Experimentell",
+	"Export": "",
 	"Export All Chats (All Users)": "Exportera alla chattar (alla användare)",
 	"Export Chats": "Exportera chattar",
 	"Export Documents Mapping": "Exportera dokumentmappning",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Merk: Hvis du angir en minimumspoengsum, returnerer søket bare dokumenter med en poengsum som er større enn eller lik minimumspoengsummen.",
 	"Notifications": "Notifikationer",
 	"November": "november",
+	"num_thread (Ollama)": "",
 	"October": "oktober",
 	"Off": "Av",
 	"Okay, Let's Go!": "Okej, nu kör vi!",
 	"OLED Dark": "OLED mörkt",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama-version",
 	"On": "På",
 	"Only": "Endast",
@@ -493,6 +496,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Använd '#' i promptinmatningen för att ladda och välja dina dokument.",
 	"Use Gravatar": "Använd Gravatar",
 	"Use Initials": "Använd initialer",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "användare",
 	"User Permissions": "Användarbehörigheter",
 	"Users": "Användare",

+ 5 - 0
src/lib/i18n/locales/tr-TR/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "Rolünüzü Girin",
 	"Error": "Hata",
 	"Experimental": "Deneysel",
+	"Export": "",
 	"Export All Chats (All Users)": "Tüm Sohbetleri Dışa Aktar (Tüm Kullanıcılar)",
 	"Export Chats": "Sohbetleri Dışa Aktar",
 	"Export Documents Mapping": "Belge Eşlemesini Dışa Aktar",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Not: Minimum bir skor belirlerseniz, arama yalnızca minimum skora eşit veya daha yüksek bir skora sahip belgeleri getirecektir.",
 	"Notifications": "Bildirimler",
 	"November": "Kasım",
+	"num_thread (Ollama)": "",
 	"October": "Ekim",
 	"Off": "Kapalı",
 	"Okay, Let's Go!": "Tamam, Hadi Başlayalım!",
 	"OLED Dark": "OLED Koyu",
 	"Ollama": "Ollama",
 	"Ollama API": "Ollama API",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama Sürümü",
 	"On": "Açık",
 	"Only": "Yalnızca",
@@ -493,6 +496,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "Belgelerinizi yüklemek ve seçmek için promptda '#' kullanın.",
 	"Use Gravatar": "Gravatar Kullan",
 	"Use Initials": "Baş Harfleri Kullan",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "kullanıcı",
 	"User Permissions": "Kullanıcı İzinleri",
 	"Users": "Kullanıcılar",

+ 78 - 73
src/lib/i18n/locales/uk-UA/translation.json

@@ -3,19 +3,19 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
 	"(latest)": "(остання)",
-	"{{ models }}": "",
-	"{{ owner }}: You cannot delete a base model": "",
+	"{{ models }}": "{{ models }}",
+	"{{ owner }}: You cannot delete a base model": "{{ owner }}: Ви не можете видалити базову модель.",
 	"{{modelName}} is thinking...": "{{modelName}} думає...",
 	"{{user}}'s Chats": "Чати {{user}}а",
 	"{{webUIName}} Backend Required": "Необхідно підключення бекенду {{webUIName}}",
-	"A task model is used when performing tasks such as generating titles for chats and web search queries": "",
+	"A task model is used when performing tasks such as generating titles for chats and web search queries": "Модель задач використовується при виконанні таких завдань, як генерація заголовків для чатів та пошукових запитів в Інтернеті",
 	"a user": "користувача",
 	"About": "Про програму",
 	"Account": "Обліковий запис",
 	"Accurate information": "Точна інформація",
 	"Add": "Додати",
-	"Add a model id": "",
-	"Add a short description about what this model does": "",
+	"Add a model id": "Додайте id моделі",
+	"Add a short description about what this model does": "Додайте короткий опис того, що робить ця модель",
 	"Add a short title for this prompt": "Додати коротку назву для цього промту",
 	"Add a tag": "Додайте тег",
 	"Add custom prompt": "Додати користувацьку підказку",
@@ -28,10 +28,10 @@
 	"Add User": "Додати користувача",
 	"Adjusting these settings will apply changes universally to all users.": "Зміни в цих налаштуваннях будуть застосовані для всіх користувачів.",
 	"admin": "адмін",
-	"Admin Panel": "Панель адміністратора",
+	"Admin Panel": "Адмін-панель",
 	"Admin Settings": "Налаштування адміністратора",
 	"Advanced Parameters": "Розширені параметри",
-	"Advanced Params": "",
+	"Advanced Params": "Розширені параметри",
 	"all": "всі",
 	"All Documents": "Усі документи",
 	"All Users": "Всі користувачі",
@@ -48,7 +48,7 @@
 	"API keys": "Ключі API",
 	"April": "Квітень",
 	"Archive": "Архів",
-	"Archive All Chats": "",
+	"Archive All Chats": "Архівувати всі чати",
 	"Archived Chats": "Архівовані чати",
 	"are allowed - Activate this command by typing": "дозволено - активізуйте цю команду набором",
 	"Are you sure?": "Ви впевнені?",
@@ -63,14 +63,14 @@
 	"available!": "доступно!",
 	"Back": "Назад",
 	"Bad Response": "Неправильна відповідь",
-	"Banners": "",
-	"Base Model (From)": "",
+	"Banners": "Прапори",
+	"Base Model (From)": "Базова модель (від)",
 	"before": "до того, як",
 	"Being lazy": "Не поспішати",
-	"Brave Search API Key": "",
+	"Brave Search API Key": "Ключ API пошуку Brave",
 	"Bypass SSL verification for Websites": "Обхід SSL-перевірки для веб-сайтів",
 	"Cancel": "Скасувати",
-	"Capabilities": "",
+	"Capabilities": "Можливості",
 	"Change Password": "Змінити пароль",
 	"Chat": "Чат",
 	"Chat Bubble UI": "Бульбашковий UI чату",
@@ -93,14 +93,14 @@
 	"Click here to select documents.": "Натисніть тут, щоб вибрати документи.",
 	"click here.": "клацніть тут.",
 	"Click on the user role button to change a user's role.": "Натисніть кнопку ролі користувача, щоб змінити роль користувача.",
-	"Clone": "",
+	"Clone": "Клонувати",
 	"Close": "Закрити",
 	"Collection": "Колекція",
 	"ComfyUI": "ComfyUI",
 	"ComfyUI Base URL": "URL-адреса ComfyUI",
 	"ComfyUI Base URL is required.": "Необхідно вказати URL-адресу ComfyUI.",
 	"Command": "Команда",
-	"Concurrent Requests": "",
+	"Concurrent Requests": "Одночасні запити",
 	"Confirm Password": "Підтвердіть пароль",
 	"Connections": "З'єднання",
 	"Content": "Зміст",
@@ -114,7 +114,7 @@
 	"Copy Link": "Копіювати посилання",
 	"Copying to clipboard was successful!": "Копіювання в буфер обміну виконано успішно!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':",
-	"Create a model": "",
+	"Create a model": "Створити модель",
 	"Create Account": "Створити обліковий запис",
 	"Create new key": "Створити новий ключ",
 	"Create new secret key": "Створити новий секретний ключ",
@@ -123,7 +123,7 @@
 	"Current Model": "Поточна модель",
 	"Current Password": "Поточний пароль",
 	"Custom": "Налаштувати",
-	"Customize models for a specific purpose": "",
+	"Customize models for a specific purpose": "Налаштуйте моделі для конкретних цілей",
 	"Dark": "Темна",
 	"Database": "База даних",
 	"December": "Грудень",
@@ -131,24 +131,24 @@
 	"Default (Automatic1111)": "За замовчуванням (Automatic1111)",
 	"Default (SentenceTransformers)": "За замовчуванням (SentenceTransformers)",
 	"Default (Web API)": "За замовчуванням (Web API)",
-	"Default Model": "",
+	"Default Model": "Модель за замовчуванням",
 	"Default model updated": "Модель за замовчуванням оновлено",
 	"Default Prompt Suggestions": "Пропозиції промтів замовчуванням",
 	"Default User Role": "Роль користувача за замовчуванням",
 	"delete": "видалити",
 	"Delete": "Видалити",
 	"Delete a model": "Видалити модель",
-	"Delete All Chats": "",
+	"Delete All Chats": "Видалити усі чати",
 	"Delete chat": "Видалити чат",
 	"Delete Chat": "Видалити чат",
 	"delete this link": "видалити це посилання",
 	"Delete User": "Видалити користувача",
 	"Deleted {{deleteModelTag}}": "Видалено {{deleteModelTag}}",
-	"Deleted {{name}}": "",
+	"Deleted {{name}}": "Видалено {{name}}",
 	"Description": "Опис",
 	"Didn't fully follow instructions": "Не повністю дотримувалися інструкцій",
 	"Disabled": "Вимкнено",
-	"Discover a model": "",
+	"Discover a model": "Знайдіть модель",
 	"Discover a prompt": "Знайти промт",
 	"Discover, download, and explore custom prompts": "Знайдіть, завантажте та досліджуйте налаштовані промти",
 	"Discover, download, and explore model presets": "Знайдіть, завантажте та досліджуйте налаштовані налаштування моделі",
@@ -173,27 +173,27 @@
 	"Embedding Model Engine": "Двигун модели встраивания ",
 	"Embedding model set to \"{{embedding_model}}\"": "Встановлена модель вбудовування \"{{embedding_model}}\"",
 	"Enable Chat History": "Увімкнути історію чату",
-	"Enable Community Sharing": "",
+	"Enable Community Sharing": "Ввімкніть спільний доступ до спільноти",
 	"Enable New Sign Ups": "Дозволити нові реєстрації",
-	"Enable Web Search": "",
+	"Enable Web Search": "Увімкнути веб-пошук",
 	"Enabled": "Увімкнено",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Переконайтеся, що ваш CSV-файл містить 4 колонки в такому порядку: Ім'я, Email, Пароль, Роль.",
 	"Enter {{role}} message here": "Введіть повідомлення {{role}} тут",
 	"Enter a detail about yourself for your LLMs to recall": "Введіть відомості про себе для запам'ятовування вашими LLM.",
-	"Enter Brave Search API Key": "",
+	"Enter Brave Search API Key": "Введіть ключ API для пошуку Brave",
 	"Enter Chunk Overlap": "Введіть перекриття фрагменту",
 	"Enter Chunk Size": "Введіть розмір фрагменту",
-	"Enter Github Raw URL": "",
-	"Enter Google PSE API Key": "",
-	"Enter Google PSE Engine Id": "",
+	"Enter Github Raw URL": "Введіть Raw URL-адресу Github",
+	"Enter Google PSE API Key": "Введіть ключ API Google PSE",
+	"Enter Google PSE Engine Id": "Введіть Google PSE Engine Id",
 	"Enter Image Size (e.g. 512x512)": "Введіть розмір зображення (напр., 512x512)",
 	"Enter language codes": "Введіть мовні коди",
 	"Enter model tag (e.g. {{modelTag}})": "Введіть тег моделі (напр., {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Введіть кількість кроків (напр., 50)",
 	"Enter Score": "Введіть бал",
-	"Enter Searxng Query URL": "",
-	"Enter Serper API Key": "",
-	"Enter Serpstack API Key": "",
+	"Enter Searxng Query URL": "Введіть URL-адресу запиту Searxng",
+	"Enter Serper API Key": "Введіть ключ API Serper",
+	"Enter Serpstack API Key": "Введіть ключ API Serpstack",
 	"Enter stop sequence": "Введіть символ зупинки",
 	"Enter Top K": "Введіть Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Введіть URL-адресу (напр., http://127.0.0.1:7860/)",
@@ -202,12 +202,13 @@
 	"Enter Your Full Name": "Введіть ваше ім'я",
 	"Enter Your Password": "Введіть ваш пароль",
 	"Enter Your Role": "Введіть вашу роль",
-	"Error": "",
+	"Error": "Помилка",
 	"Experimental": "Експериментальне",
+	"Export": "",
 	"Export All Chats (All Users)": "Експортувати всі чати (всі користувачі)",
 	"Export Chats": "Експортувати чати",
 	"Export Documents Mapping": "Експортувати відображення документів",
-	"Export Models": "",
+	"Export Models": "Експорт моделей",
 	"Export Prompts": "Експортувати промти",
 	"Failed to create API Key.": "Не вдалося створити API ключ.",
 	"Failed to read clipboard contents": "Не вдалося прочитати вміст буфера обміну",
@@ -220,15 +221,15 @@
 	"Focus chat input": "Фокус вводу чату",
 	"Followed instructions perfectly": "Бездоганно дотримувався інструкцій",
 	"Format your variables using square brackets like this:": "Форматуйте свої змінні квадратними дужками так:",
-	"Frequency Penalty": "",
+	"Frequency Penalty": "Штраф за частоту",
 	"Full Screen Mode": "Режим повного екрану",
 	"General": "Загальні",
 	"General Settings": "Загальні налаштування",
-	"Generating search query": "",
+	"Generating search query": "Сформувати пошуковий запит",
 	"Generation Info": "Інформація про генерацію",
 	"Good Response": "Гарна відповідь",
-	"Google PSE API Key": "",
-	"Google PSE Engine Id": "",
+	"Google PSE API Key": "Ключ API Google PSE",
+	"Google PSE Engine Id": "Id двигуна Google PSE",
 	"h:mm a": "h:mm a",
 	"has no conversations.": "не має розмов.",
 	"Hello, {{name}}": "Привіт, {{name}}",
@@ -242,18 +243,18 @@
 	"Images": "Зображення",
 	"Import Chats": "Імпортувати чати",
 	"Import Documents Mapping": "Імпортувати відображення документів",
-	"Import Models": "",
+	"Import Models": "Імпорт моделей",
 	"Import Prompts": "Імпортувати промти",
 	"Include `--api` flag when running stable-diffusion-webui": "Включіть прапор `--api` при запуску stable-diffusion-webui",
-	"Info": "",
+	"Info": "Інфо",
 	"Input commands": "Команди вводу",
-	"Install from Github URL": "",
+	"Install from Github URL": "Встановіть з URL-адреси Github",
 	"Interface": "Інтерфейс",
 	"Invalid Tag": "Недійсний тег",
 	"January": "Січень",
 	"join our Discord for help.": "приєднуйтеся до нашого Discord для допомоги.",
 	"JSON": "JSON",
-	"JSON Preview": "",
+	"JSON Preview": "Перегляд JSON",
 	"July": "Липень",
 	"June": "Червень",
 	"JWT Expiration": "Термін дії JWT",
@@ -270,9 +271,9 @@
 	"Make sure to enclose them with": "Переконайтеся, що вони закриті",
 	"Manage Models": "Керування моделями",
 	"Manage Ollama Models": "Керування моделями Ollama",
-	"Manage Pipelines": "",
+	"Manage Pipelines": "Управління Pipelines",
 	"March": "Березень",
-	"Max Tokens (num_predict)": "",
+	"Max Tokens (num_predict)": "Макс токенів (num_predict)",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимум 3 моделі можна завантажити одночасно. Будь ласка, спробуйте пізніше.",
 	"May": "Травень",
 	"Memories accessible by LLMs will be shown here.": "Пам'ять, яка доступна LLM, буде показана тут.",
@@ -287,12 +288,12 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Модель '{{modelName}}' успішно завантажено.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Модель '{{modelTag}}' вже знаходиться в черзі на завантаження.",
 	"Model {{modelId}} not found": "Модель {{modelId}} не знайдено",
-	"Model {{modelName}} is not vision capable": "",
-	"Model {{name}} is now {{status}}": "",
+	"Model {{modelName}} is not vision capable": "Модель {{modelName}} не здатна бачити",
+	"Model {{name}} is now {{status}}": "Модель {{name}} тепер має {{status}}",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Виявлено шлях до файлової системи моделі. Для оновлення потрібно вказати коротке ім'я моделі, не вдасться продовжити.",
-	"Model ID": "",
+	"Model ID": "ID моделі",
 	"Model not selected": "Модель не вибрана",
-	"Model Params": "",
+	"Model Params": "Параметри моделі",
 	"Model Whitelisting": "Модель білого списку",
 	"Model(s) Whitelisted": "Модель(і) білого списку",
 	"Modelfile Content": "Вміст файлу моделі",
@@ -300,23 +301,25 @@
 	"More": "Більше",
 	"Name": "Ім'я",
 	"Name Tag": "Назва тегу",
-	"Name your model": "",
+	"Name your model": "Назвіть свою модель",
 	"New Chat": "Новий чат",
 	"New Password": "Новий пароль",
 	"No results found": "Не знайдено жодного результату",
-	"No search query generated": "",
+	"No search query generated": "Пошуковий запит не сформовано",
 	"No source available": "Джерело не доступне",
-	"None": "",
+	"None": "Нема",
 	"Not factually correct": "Не відповідає дійсності",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Примітка: Якщо ви встановите мінімальну кількість балів, пошук поверне лише документи з кількістю балів, більшою або рівною мінімальній кількості балів.",
 	"Notifications": "Сповіщення",
 	"November": "Листопад",
+	"num_thread (Ollama)": "",
 	"October": "Жовтень",
 	"Off": "Вимк",
 	"Okay, Let's Go!": "Гаразд, давайте почнемо!",
 	"OLED Dark": "Темний OLED",
 	"Ollama": "Ollama",
-	"Ollama API": "",
+	"Ollama API": "Ollama API",
+	"Ollama API disabled": "",
 	"Ollama Version": "Версія Ollama",
 	"On": "Увімк",
 	"Only": "Тільки",
@@ -341,8 +344,8 @@
 	"pending": "на розгляді",
 	"Permission denied when accessing microphone: {{error}}": "Доступ до мікрофона заборонено: {{error}}",
 	"Personalization": "Персоналізація",
-	"Pipelines": "",
-	"Pipelines Valves": "",
+	"Pipelines": "Pipelines",
+	"Pipelines Valves": "Pipelines Valves",
 	"Plain text (.txt)": "Простий текст (.txt)",
 	"Playground": "Майданчик",
 	"Positive attitude": "Позитивне ставлення",
@@ -387,34 +390,34 @@
 	"Scan for documents from {{path}}": "Сканування документів з {{path}}",
 	"Search": "Пошук",
 	"Search a model": "Шукати модель",
-	"Search Chats": "",
+	"Search Chats": "Пошук в чатах",
 	"Search Documents": "Пошук документів",
-	"Search Models": "",
+	"Search Models": "Пошук моделей",
 	"Search Prompts": "Пошук промтів",
-	"Search Result Count": "",
-	"Searched {{count}} sites_one": "",
-	"Searched {{count}} sites_few": "",
-	"Searched {{count}} sites_many": "",
-	"Searched {{count}} sites_other": "",
-	"Searching the web for '{{searchQuery}}'": "",
-	"Searxng Query URL": "",
+	"Search Result Count": "Кількість результатів пошуку",
+	"Searched {{count}} sites_one": "Переглянуто {{count}} сайт",
+	"Searched {{count}} sites_few": "Переглянуто {{count}} сайти",
+	"Searched {{count}} sites_many": "Переглянуто {{count}} сайтів",
+	"Searched {{count}} sites_other": "Переглянуто {{count}} сайтів",
+	"Searching the web for '{{searchQuery}}'": "Пошук в Інтернеті за запитом '{{searchQuery}}'",
+	"Searxng Query URL": "URL-адреса запиту Searxng",
 	"See readme.md for instructions": "Див. readme.md для інструкцій",
 	"See what's new": "Подивіться, що нового",
 	"Seed": "Сід",
-	"Select a base model": "",
+	"Select a base model": "Вибрати базову модель",
 	"Select a mode": "Оберіть режим",
 	"Select a model": "Виберіть модель",
-	"Select a pipeline": "",
-	"Select a pipeline url": "",
+	"Select a pipeline": "Виберіть pipeline",
+	"Select a pipeline url": "Виберіть адресу pipeline",
 	"Select an Ollama instance": "Виберіть екземпляр Ollama",
 	"Select model": "Вибрати модель",
-	"Selected model(s) do not support image inputs": "",
+	"Selected model(s) do not support image inputs": "Вибрані модель(і) не підтримують вхідні зображення",
 	"Send": "Надіслати",
 	"Send a Message": "Надіслати повідомлення",
 	"Send message": "Надіслати повідомлення",
 	"September": "Вересень",
-	"Serper API Key": "",
-	"Serpstack API Key": "",
+	"Serper API Key": "Ключ API Serper",
+	"Serpstack API Key": "Ключ API Serpstack",
 	"Server connection verified": "З'єднання з сервером підтверджено",
 	"Set as default": "Встановити за замовчуванням",
 	"Set Default Model": "Встановити модель за замовчуванням",
@@ -423,7 +426,7 @@
 	"Set Model": "Встановити модель",
 	"Set reranking model (e.g. {{model}})": "Встановити модель переранжування (напр., {{model}})",
 	"Set Steps": "Встановити кроки",
-	"Set Task Model": "",
+	"Set Task Model": "Встановити модель задач",
 	"Set Voice": "Встановити голос",
 	"Settings": "Налаштування",
 	"Settings saved successfully!": "Налаштування успішно збережено!",
@@ -482,19 +485,21 @@
 	"Top P": "Top P",
 	"Trouble accessing Ollama?": "Проблеми з доступом до Ollama?",
 	"TTS Settings": "Налаштування TTS",
-	"Type": "",
+	"Type": "Тип",
 	"Type Hugging Face Resolve (Download) URL": "Введіть URL ресурсу Hugging Face Resolve (завантаження)",
 	"Uh-oh! There was an issue connecting to {{provider}}.": "Ой! Виникла проблема при підключенні до {{provider}}.",
 	"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Невідомий тип файлу '{{file_type}}', але приймається та обробляється як звичайний текст",
 	"Update and Copy Link": "Оновлення та копіювання посилання",
 	"Update password": "Оновити пароль",
 	"Upload a GGUF model": "Завантажити GGUF модель",
-	"Upload Files": "",
+	"Upload Files": "Завантажити файли",
 	"Upload Progress": "Прогрес завантаження",
 	"URL Mode": "Режим URL-адреси",
 	"Use '#' in the prompt input to load and select your documents.": "Для введення промтів до веб-сторінок (URL) або вибору документів, будь ласка, використовуйте символ '#'.",
 	"Use Gravatar": "Змінити аватар",
 	"Use Initials": "Використовувати ініціали",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "користувач",
 	"User Permissions": "Права користувача",
 	"Users": "Користувачі",
@@ -503,13 +508,13 @@
 	"variable": "змінна",
 	"variable to have them replaced with clipboard content.": "змінна, щоб замінити їх вмістом буфера обміну.",
 	"Version": "Версія",
-	"Warning": "",
+	"Warning": "Увага!",
 	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Попередження: Якщо ви оновлюєте або змінюєте модель вбудовування, вам потрібно буде повторно імпортувати всі документи.",
 	"Web": "Веб",
 	"Web Loader Settings": "Налаштування веб-завантажувача",
 	"Web Params": "Налаштування веб-завантажувача",
-	"Web Search": "",
-	"Web Search Engine": "",
+	"Web Search": "Веб-пошук",
+	"Web Search Engine": "Веб-пошукова система",
 	"Webhook URL": "URL веб-запиту",
 	"WebUI Add-ons": "Додатки WebUI",
 	"WebUI Settings": "Налаштування WebUI",
@@ -522,7 +527,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Напишіть стислий зміст у 50 слів, який узагальнює [тема або ключове слово].",
 	"Yesterday": "Вчора",
 	"You": "Ви",
-	"You cannot clone a base model": "",
+	"You cannot clone a base model": "Базову модель не можна клонувати",
 	"You have no archived conversations.": "У вас немає архівованих розмов.",
 	"You have shared this chat": "Ви поділилися цим чатом",
 	"You're a helpful assistant.": "Ви корисний асистент.",

+ 33 - 28
src/lib/i18n/locales/vi-VN/translation.json

@@ -8,13 +8,13 @@
 	"{{modelName}} is thinking...": "{{modelName}} đang suy nghĩ...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Yêu cầu Backend",
-	"A task model is used when performing tasks such as generating titles for chats and web search queries": "",
+	"A task model is used when performing tasks such as generating titles for chats and web search queries": "Mô hình tác vụ được sử dụng khi thực hiện các tác vụ như tạo tiêu đề cho cuộc trò chuyện và truy vấn tìm kiếm trên web",
 	"a user": "người sử dụng",
 	"About": "Giới thiệu",
 	"Account": "Tài khoản",
 	"Accurate information": "Thông tin chính xác",
 	"Add": "Thêm",
-	"Add a model id": "",
+	"Add a model id": "Thêm model id",
 	"Add a short description about what this model does": "Thêm mô tả ngắn về những khả năng của model",
 	"Add a short title for this prompt": "Thêm tiêu đề ngắn cho prompt này",
 	"Add a tag": "Thêm thẻ (tag)",
@@ -31,7 +31,7 @@
 	"Admin Panel": "Trang Quản trị",
 	"Admin Settings": "Cài đặt hệ thống",
 	"Advanced Parameters": "Các tham số Nâng cao",
-	"Advanced Params": "",
+	"Advanced Params": "Các tham số Nâng cao",
 	"all": "tất cả",
 	"All Documents": "Tất cả tài liệu",
 	"All Users": "Danh sách người sử dụng",
@@ -93,14 +93,14 @@
 	"Click here to select documents.": "Bấm vào đây để chọn tài liệu.",
 	"click here.": "bấm vào đây.",
 	"Click on the user role button to change a user's role.": "Bấm vào nút trong cột VAI TRÒ để thay đổi quyền của người sử dụng.",
-	"Clone": "",
+	"Clone": "Nhân bản",
 	"Close": "Đóng",
 	"Collection": "Tổng hợp mọi tài liệu",
 	"ComfyUI": "ComfyUI",
 	"ComfyUI Base URL": "ComfyUI Base URL",
 	"ComfyUI Base URL is required.": "Base URL của ComfyUI là bắt buộc.",
 	"Command": "Lệnh",
-	"Concurrent Requests": "",
+	"Concurrent Requests": "Các truy vấn đồng thời",
 	"Confirm Password": "Xác nhận Mật khẩu",
 	"Connections": "Kết nối",
 	"Content": "Nội dung",
@@ -131,7 +131,7 @@
 	"Default (Automatic1111)": "Mặc định (Automatic1111)",
 	"Default (SentenceTransformers)": "Mặc định (SentenceTransformers)",
 	"Default (Web API)": "Mặc định (Web API)",
-	"Default Model": "",
+	"Default Model": "Model mặc định",
 	"Default model updated": "Mô hình mặc định đã được cập nhật",
 	"Default Prompt Suggestions": "Đề xuất prompt mặc định",
 	"Default User Role": "Vai trò mặc định",
@@ -173,27 +173,27 @@
 	"Embedding Model Engine": "Trình xử lý embedding",
 	"Embedding model set to \"{{embedding_model}}\"": "Mô hình embedding đã được thiết lập thành \"{{embedding_model}}\"",
 	"Enable Chat History": "Bật Lịch sử chat",
-	"Enable Community Sharing": "",
+	"Enable Community Sharing": "Kích hoạt Chia sẻ Cộng đồng",
 	"Enable New Sign Ups": "Cho phép đăng ký mới",
-	"Enable Web Search": "",
+	"Enable Web Search": "Kích hoạt tìm kiếm Web",
 	"Enabled": "Đã bật",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Đảm bảo tệp CSV của bạn bao gồm 4 cột theo thứ tự sau: Name, Email, Password, Role.",
 	"Enter {{role}} message here": "Nhập yêu cầu của {{role}} ở đây",
 	"Enter a detail about yourself for your LLMs to recall": "Nhập chi tiết về bản thân của bạn để LLMs có thể nhớ",
-	"Enter Brave Search API Key": "",
+	"Enter Brave Search API Key": "Nhập API key cho Brave Search",
 	"Enter Chunk Overlap": "Nhập Chunk chồng lấn (overlap)",
 	"Enter Chunk Size": "Nhập Kích thước Chunk",
-	"Enter Github Raw URL": "",
-	"Enter Google PSE API Key": "",
-	"Enter Google PSE Engine Id": "",
+	"Enter Github Raw URL": "Nhập URL cho Github Raw",
+	"Enter Google PSE API Key": "Nhập Google PSE API Key",
+	"Enter Google PSE Engine Id": "Nhập Google PSE Engine Id",
 	"Enter Image Size (e.g. 512x512)": "Nhập Kích thước ảnh (vd: 512x512)",
 	"Enter language codes": "Nhập mã ngôn ngữ",
 	"Enter model tag (e.g. {{modelTag}})": "Nhập thẻ mô hình (vd: {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Nhập số Steps (vd: 50)",
 	"Enter Score": "Nhập Score",
-	"Enter Searxng Query URL": "",
-	"Enter Serper API Key": "",
-	"Enter Serpstack API Key": "",
+	"Enter Searxng Query URL": "Nhập Query URL cho Searxng",
+	"Enter Serper API Key": "Nhập Serper API Key",
+	"Enter Serpstack API Key": "Nhập Serpstack API Key",
 	"Enter stop sequence": "Nhập stop sequence",
 	"Enter Top K": "Nhập Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Nhập URL (vd: http://127.0.0.1:7860/)",
@@ -204,10 +204,11 @@
 	"Enter Your Role": "Nhập vai trò của bạn",
 	"Error": "Lỗi",
 	"Experimental": "Thử nghiệm",
+	"Export": "",
 	"Export All Chats (All Users)": "Tải về tất cả nội dung chat (tất cả mọi người)",
 	"Export Chats": "Tải nội dung chat về máy",
 	"Export Documents Mapping": "Tải cấu trúc tài liệu về máy",
-	"Export Models": "",
+	"Export Models": "Tải Models về máy",
 	"Export Prompts": "Tải các prompt về máy",
 	"Failed to create API Key.": "Lỗi khởi tạo API Key",
 	"Failed to read clipboard contents": "Không thể đọc nội dung clipboard",
@@ -224,7 +225,7 @@
 	"Full Screen Mode": "Chế độ Toàn màn hình",
 	"General": "Cài đặt chung",
 	"General Settings": "Cấu hình chung",
-	"Generating search query": "",
+	"Generating search query": "Tạo truy vấn tìm kiếm",
 	"Generation Info": "Thông tin chung",
 	"Good Response": "Trả lời tốt",
 	"Google PSE API Key": "",
@@ -253,7 +254,7 @@
 	"January": "Tháng 1",
 	"join our Discord for help.": "tham gia Discord của chúng tôi để được trợ giúp.",
 	"JSON": "JSON",
-	"JSON Preview": "",
+	"JSON Preview": "Xem trước JSON",
 	"July": "Tháng 7",
 	"June": "Tháng 6",
 	"JWT Expiration": "JWT Hết hạn",
@@ -270,9 +271,9 @@
 	"Make sure to enclose them with": "Hãy chắc chắn bao quanh chúng bằng",
 	"Manage Models": "Quản lý mô hình",
 	"Manage Ollama Models": "Quản lý mô hình với Ollama",
-	"Manage Pipelines": "",
+	"Manage Pipelines": "Quản lý Pipelines",
 	"March": "Tháng 3",
-	"Max Tokens (num_predict)": "",
+	"Max Tokens (num_predict)": "Tokens tối đa (num_predict)",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Tối đa 3 mô hình có thể được tải xuống cùng lúc. Vui lòng thử lại sau.",
 	"May": "Tháng 5",
 	"Memories accessible by LLMs will be shown here.": "Memory có thể truy cập bởi LLMs sẽ hiển thị ở đây.",
@@ -304,19 +305,21 @@
 	"New Chat": "Tạo chat mới",
 	"New Password": "Mật khẩu mới",
 	"No results found": "Không tìm thấy kết quả",
-	"No search query generated": "",
+	"No search query generated": "Không có truy vấn tìm kiếm nào được tạo ra",
 	"No source available": "Không có nguồn",
 	"None": "",
 	"Not factually correct": "Không chính xác so với thực tế",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Lưu ý: Nếu bạn đặt điểm (Score) tối thiểu thì tìm kiếm sẽ chỉ trả về những tài liệu có điểm lớn hơn hoặc bằng điểm tối thiểu.",
 	"Notifications": "Thông báo trên máy tính (Notification)",
 	"November": "Tháng 11",
+	"num_thread (Ollama)": "",
 	"October": "Tháng 10",
 	"Off": "Tắt",
 	"Okay, Let's Go!": "Được rồi, Bắt đầu thôi!",
 	"OLED Dark": "OLED Dark",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Phiên bản Ollama",
 	"On": "Bật",
 	"Only": "Only",
@@ -391,9 +394,9 @@
 	"Search Documents": "Tìm tài liệu",
 	"Search Models": "Tìm model",
 	"Search Prompts": "Tìm prompt",
-	"Search Result Count": "",
-	"Searched {{count}} sites_other": "",
-	"Searching the web for '{{searchQuery}}'": "",
+	"Search Result Count": "Số kết quả tìm kiếm",
+	"Searched {{count}} sites_other": "Đã tìm {{count}} sites_other",
+	"Searching the web for '{{searchQuery}}'": "Tìm kiếm web cho '{{searchQuery}}'",
 	"Searxng Query URL": "",
 	"See readme.md for instructions": "Xem readme.md để biết hướng dẫn",
 	"See what's new": "Xem những cập nhật mới",
@@ -405,7 +408,7 @@
 	"Select a pipeline url": "",
 	"Select an Ollama instance": "Chọn một thực thể Ollama",
 	"Select model": "Chọn model",
-	"Selected model(s) do not support image inputs": "",
+	"Selected model(s) do not support image inputs": "Model được lựa chọn không hỗ trợ đầu vào là hình ảnh",
 	"Send": "Gửi",
 	"Send a Message": "Gửi yêu cầu",
 	"Send message": "Gửi yêu cầu",
@@ -486,12 +489,14 @@
 	"Update and Copy Link": "Cập nhật và sao chép link",
 	"Update password": "Cập nhật mật khẩu",
 	"Upload a GGUF model": "Tải lên mô hình GGUF",
-	"Upload Files": "",
+	"Upload Files": "Tải tệp lên máy chủ",
 	"Upload Progress": "Tiến trình tải tệp lên hệ thống",
 	"URL Mode": "Chế độ URL",
 	"Use '#' in the prompt input to load and select your documents.": "Sử dụng '#' trong đầu vào của prompt để tải về và lựa chọn tài liệu của bạn cần truy vấn.",
 	"Use Gravatar": "Sử dụng Gravatar",
 	"Use Initials": "Sử dụng tên viết tắt",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "Người sử dụng",
 	"User Permissions": "Phân quyền sử dụng",
 	"Users": "người sử dụng",
@@ -505,8 +510,8 @@
 	"Web": "Web",
 	"Web Loader Settings": "Cài đặt Web Loader",
 	"Web Params": "Web Params",
-	"Web Search": "",
-	"Web Search Engine": "",
+	"Web Search": "Tìm kiếm Web",
+	"Web Search Engine": "Chức năng Tìm kiếm Web",
 	"Webhook URL": "Webhook URL",
 	"WebUI Add-ons": "Tiện ích WebUI",
 	"WebUI Settings": "Cài đặt WebUI",

+ 5 - 0
src/lib/i18n/locales/zh-CN/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "输入您的角色",
 	"Error": "",
 	"Experimental": "实验性",
+	"Export": "",
 	"Export All Chats (All Users)": "导出所有聊天(所有用户)",
 	"Export Chats": "导出聊天",
 	"Export Documents Mapping": "导出文档映射",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "注意:如果设置了最低分数,搜索只会返回分数大于或等于最低分数的文档。",
 	"Notifications": "桌面通知",
 	"November": "十一月",
+	"num_thread (Ollama)": "",
 	"October": "十月",
 	"Off": "关闭",
 	"Okay, Let's Go!": "好的,我们开始吧!",
 	"OLED Dark": "暗黑色",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama 版本",
 	"On": "开",
 	"Only": "仅",
@@ -492,6 +495,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "在提示输入中使用'#'来加载和选择你的文档。",
 	"Use Gravatar": "使用 Gravatar",
 	"Use Initials": "使用首字母缩写",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "用户",
 	"User Permissions": "用户权限",
 	"Users": "用户",

+ 5 - 0
src/lib/i18n/locales/zh-TW/translation.json

@@ -204,6 +204,7 @@
 	"Enter Your Role": "輸入你的角色",
 	"Error": "",
 	"Experimental": "實驗功能",
+	"Export": "",
 	"Export All Chats (All Users)": "匯出所有聊天紀錄(所有使用者)",
 	"Export Chats": "匯出聊天紀錄",
 	"Export Documents Mapping": "匯出文件映射",
@@ -311,12 +312,14 @@
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "註:如果設置最低分數,則搜索將只返回分數大於或等於最低分數的文檔。",
 	"Notifications": "桌面通知",
 	"November": "11月",
+	"num_thread (Ollama)": "",
 	"October": "10 月",
 	"Off": "關閉",
 	"Okay, Let's Go!": "好的,啟動吧!",
 	"OLED Dark": "`",
 	"Ollama": "Ollama",
 	"Ollama API": "",
+	"Ollama API disabled": "",
 	"Ollama Version": "Ollama 版本",
 	"On": "開啟",
 	"Only": "僅有",
@@ -492,6 +495,8 @@
 	"Use '#' in the prompt input to load and select your documents.": "在輸入框中輸入 '#' 以載入並選擇你的文件。",
 	"Use Gravatar": "使用 Gravatar",
 	"Use Initials": "使用初始头像",
+	"use_mlock (Ollama)": "",
+	"use_mmap (Ollama)": "",
 	"user": "使用者",
 	"User Permissions": "使用者權限",
 	"Users": "使用者",