Explorar el Código

Merge pull request #2782 from open-webui/dev

0.2.3
Timothy Jaeryang Baek hace 11 meses
padre
commit
14646e84ea
Se han modificado 44 ficheros con 401 adiciones y 231 borrados
  1. 15 0
      CHANGELOG.md
  2. 49 14
      backend/apps/rag/search/searxng.py
  3. 27 5
      backend/utils/misc.py
  4. 2 2
      package-lock.json
  5. 1 1
      package.json
  6. 10 21
      src/lib/components/chat/MessageInput.svelte
  7. 35 11
      src/lib/components/chat/Settings/Audio.svelte
  8. 13 1
      src/lib/components/layout/Sidebar.svelte
  9. 2 0
      src/lib/i18n/locales/ar-BH/translation.json
  10. 2 0
      src/lib/i18n/locales/bg-BG/translation.json
  11. 2 0
      src/lib/i18n/locales/bn-BD/translation.json
  12. 2 0
      src/lib/i18n/locales/ca-ES/translation.json
  13. 2 0
      src/lib/i18n/locales/ceb-PH/translation.json
  14. 2 0
      src/lib/i18n/locales/de-DE/translation.json
  15. 2 0
      src/lib/i18n/locales/dg-DG/translation.json
  16. 2 0
      src/lib/i18n/locales/en-GB/translation.json
  17. 2 0
      src/lib/i18n/locales/en-US/translation.json
  18. 2 0
      src/lib/i18n/locales/es-ES/translation.json
  19. 2 0
      src/lib/i18n/locales/fa-IR/translation.json
  20. 2 0
      src/lib/i18n/locales/fi-FI/translation.json
  21. 2 0
      src/lib/i18n/locales/fr-CA/translation.json
  22. 2 0
      src/lib/i18n/locales/fr-FR/translation.json
  23. 2 0
      src/lib/i18n/locales/he-IL/translation.json
  24. 2 0
      src/lib/i18n/locales/hi-IN/translation.json
  25. 2 0
      src/lib/i18n/locales/hr-HR/translation.json
  26. 2 0
      src/lib/i18n/locales/it-IT/translation.json
  27. 2 0
      src/lib/i18n/locales/ja-JP/translation.json
  28. 2 0
      src/lib/i18n/locales/ka-GE/translation.json
  29. 2 0
      src/lib/i18n/locales/ko-KR/translation.json
  30. 4 0
      src/lib/i18n/locales/languages.json
  31. 2 0
      src/lib/i18n/locales/nl-NL/translation.json
  32. 2 0
      src/lib/i18n/locales/pa-IN/translation.json
  33. 2 0
      src/lib/i18n/locales/pl-PL/translation.json
  34. 2 0
      src/lib/i18n/locales/pt-BR/translation.json
  35. 2 0
      src/lib/i18n/locales/pt-PT/translation.json
  36. 2 0
      src/lib/i18n/locales/ru-RU/translation.json
  37. 2 0
      src/lib/i18n/locales/sr-RS/translation.json
  38. 2 0
      src/lib/i18n/locales/sv-SE/translation.json
  39. 2 0
      src/lib/i18n/locales/tr-TR/translation.json
  40. 2 0
      src/lib/i18n/locales/uk-UA/translation.json
  41. 2 0
      src/lib/i18n/locales/vi-VN/translation.json
  42. 178 176
      src/lib/i18n/locales/zh-CN/translation.json
  43. 2 0
      src/lib/i18n/locales/zh-TW/translation.json
  44. 1 0
      src/lib/stores/index.ts

+ 15 - 0
CHANGELOG.md

@@ -5,6 +5,21 @@ 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.3] - 2024-06-03
+
+### Added
+
+- **📁 Export Chat as JSON**: You can now export individual chats as JSON files from the navbar menu by navigating to 'Download > Export Chat'. This makes sharing specific conversations easier.
+- **✏️ Edit Titles with Double Click**: Double-click on titles to rename them quickly and efficiently.
+- **🧩 Batch Multiple Embeddings**: Introduced 'RAG_EMBEDDING_OPENAI_BATCH_SIZE' to process multiple embeddings in a batch, enhancing performance for large datasets.
+- **🌍 Improved Translations**: Enhanced the translation quality across various languages for a better user experience.
+
+### Fixed
+
+- **🛠️ Modelfile Migration Script**: Fixed an issue where the modelfile migration script would fail if an invalid modelfile was encountered.
+- **💬 Zhuyin Input Method on Mac**: Resolved an issue where using the Zhuyin input method in the Web UI on a Mac caused text to send immediately upon pressing the enter key, leading to incorrect input.
+- **🔊 Local TTS Voice Selection**: Fixed the issue where the selected local Text-to-Speech (TTS) voice was not being displayed in settings.
+
 ## [0.2.2] - 2024-06-02
 
 ### Added

+ 49 - 14
backend/apps/rag/search/searxng.py

@@ -1,7 +1,8 @@
 import logging
-
 import requests
 
+from typing import List
+
 from apps.rag.search.main import SearchResult
 from config import SRC_LOG_LEVELS
 
@@ -9,20 +10,52 @@ log = logging.getLogger(__name__)
 log.setLevel(SRC_LOG_LEVELS["RAG"])
 
 
-def search_searxng(query_url: str, query: str, count: int) -> list[SearchResult]:
-    """Search a SearXNG instance for a query and return the results as a list of SearchResult objects.
+def search_searxng(query_url: str, query: str, count: int, **kwargs) -> List[SearchResult]:
+    """
+    Search a SearXNG instance for a given query and return the results as a list of SearchResult objects.
+    
+    The function allows passing additional parameters such as language or time_range to tailor the search result.
 
     Args:
-        query_url (str): The URL of the SearXNG instance to search. Must contain "<query>" as a placeholder
-        query (str): The query to search for
+        query_url (str): The base URL of the SearXNG server with a placeholder for the query "<query>".
+        query (str): The search term or question to find in the SearXNG database.
+        count (int): The maximum number of results to retrieve from the search.
+        
+    Keyword Args:
+        language (str): Language filter for the search results; e.g., "en-US". Defaults to an empty string.
+        time_range (str): Time range for filtering results by date; e.g., "2023-04-05..today" or "all-time". Defaults to ''.
+        categories: (Optional[List[str]]): Specific categories within which the search should be performed, defaulting to an empty string if not provided.
+    
+    Returns:
+        List[SearchResult]: A list of SearchResults sorted by relevance score in descending order.
+        
+    Raise:
+        requests.exceptions.RequestException: If a request error occurs during the search process.
     """
-    url = query_url.replace("<query>", query)
-    if "&format=json" not in url:
-        url += "&format=json"
-    log.debug(f"searching {url}")
+    
+    # Default values for optional parameters are provided as empty strings or None when not specified.
+    language = kwargs.get('language', 'en-US')
+    time_range = kwargs.get('time_range', '')
+    categories = ''.join(kwargs.get('categories', []))
+
+    params = {
+        "q": query,
+        "format": "json",
+        "pageno": 1,
+        "results_per_page": count,
+        'language': language,
+        'time_range': time_range,
+        'engines': '',
+        'categories': categories,
+        'theme': 'simple',
+        'image_proxy': 0
 
-    r = requests.get(
-        url,
+    }
+
+    log.debug(f"searching {query_url}")
+
+    response = requests.get(
+        query_url,
         headers={
             "User-Agent": "Open WebUI (https://github.com/open-webui/open-webui) RAG Bot",
             "Accept": "text/html",
@@ -30,15 +63,17 @@ def search_searxng(query_url: str, query: str, count: int) -> list[SearchResult]
             "Accept-Language": "en-US,en;q=0.5",
             "Connection": "keep-alive",
         },
+        params=params,
     )
-    r.raise_for_status()
 
-    json_response = r.json()
+    response.raise_for_status()  # Raise an exception for HTTP errors.
+
+    json_response = response.json()
     results = json_response.get("results", [])
     sorted_results = sorted(results, key=lambda x: x.get("score", 0), reverse=True)
     return [
         SearchResult(
             link=result["url"], title=result.get("title"), snippet=result.get("content")
         )
-        for result in sorted_results[:count]
+        for result in sorted_results
     ]

+ 27 - 5
backend/utils/misc.py

@@ -123,11 +123,25 @@ def parse_ollama_modelfile(model_text):
         "repeat_penalty": float,
         "temperature": float,
         "seed": int,
-        "stop": str,
         "tfs_z": float,
         "num_predict": int,
         "top_k": int,
         "top_p": float,
+        "num_keep": int,
+        "typical_p": float,
+        "presence_penalty": float,
+        "frequency_penalty": float,
+        "penalize_newline": bool,
+        "numa": bool,
+        "num_batch": int,
+        "num_gpu": int,
+        "main_gpu": int,
+        "low_vram": bool,
+        "f16_kv": bool,
+        "vocab_only": bool,
+        "use_mmap": bool,
+        "use_mlock": bool,
+        "num_thread": int,
     }
 
     data = {"base_model_id": None, "params": {}}
@@ -156,10 +170,18 @@ def parse_ollama_modelfile(model_text):
         param_match = re.search(rf"PARAMETER {param} (.+)", model_text, re.IGNORECASE)
         if param_match:
             value = param_match.group(1)
-            if param_type == int:
-                value = int(value)
-            elif param_type == float:
-                value = float(value)
+
+            try:
+                if param_type == int:
+                    value = int(value)
+                elif param_type == float:
+                    value = float(value)
+                elif param_type == bool:
+                    value = value.lower() == "true"
+            except Exception as e:
+                print(e)
+                continue
+
             data["params"][param] = value
 
     # Parse adapter

+ 2 - 2
package-lock.json

@@ -1,12 +1,12 @@
 {
 	"name": "open-webui",
-	"version": "0.2.2",
+	"version": "0.2.3",
 	"lockfileVersion": 3,
 	"requires": true,
 	"packages": {
 		"": {
 			"name": "open-webui",
-			"version": "0.2.2",
+			"version": "0.2.3",
 			"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.2",
+	"version": "0.2.3",
 	"private": true,
 	"scripts": {
 		"dev": "npm run pyodide:fetch && vite dev --host",

+ 10 - 21
src/lib/components/chat/MessageInput.svelte

@@ -810,10 +810,7 @@
 								? $i18n.t('Listening...')
 								: $i18n.t('Send a Message')}
 							bind:value={prompt}
-							on:keypress={(e) => {}}
-							on:keydown={async (e) => {
-								// Check if the device is not a mobile device or if it is a mobile device, check if it is not a touch device
-								// This is to prevent the Enter key from submitting the prompt on mobile devices
+							on:keypress={(e) => {
 								if (
 									!$mobile ||
 									!(
@@ -822,28 +819,18 @@
 										navigator.msMaxTouchPoints > 0
 									)
 								) {
-									// Check if Enter is pressed
-									// Check if Shift key is not pressed
+									// Prevent Enter key from creating a new line
 									if (e.key === 'Enter' && !e.shiftKey) {
 										e.preventDefault();
 									}
 
-									const commandOptionButton = [
-										...document.getElementsByClassName('selected-command-option-button')
-									]?.at(-1);
-
-									if (!commandOptionButton) {
-										if (e.key === 'Enter' && !e.shiftKey && prompt !== '') {
-											submitPrompt(prompt, user);
-											return;
-										}
-
-										if (e.key === 'Enter' && e.shiftKey && prompt !== '') {
-											return;
-										}
+									// Submit the prompt when Enter key is pressed
+									if (prompt !== '' && e.key === 'Enter' && !e.shiftKey) {
+										submitPrompt(prompt, user);
 									}
 								}
-
+							}}
+							on:keydown={async (e) => {
 								const isCtrlPressed = e.ctrlKey || e.metaKey; // metaKey is for Cmd key on Mac
 
 								// Check if Ctrl + R is pressed
@@ -904,7 +891,9 @@
 										...document.getElementsByClassName('selected-command-option-button')
 									]?.at(-1);
 
-									if (commandOptionButton) {
+									if (e.shiftKey) {
+										prompt = `${prompt}\n`;
+									} else if (commandOptionButton) {
 										commandOptionButton?.click();
 									} else {
 										document.getElementById('send-message-button')?.click();

+ 35 - 11
src/lib/components/chat/Settings/Audio.svelte

@@ -3,6 +3,7 @@
 	import { user, settings } from '$lib/stores';
 	import { createEventDispatcher, onMount, getContext } from 'svelte';
 	import { toast } from 'svelte-sonner';
+	import Switch from '$lib/components/common/Switch.svelte';
 	const dispatch = createEventDispatcher();
 
 	const i18n = getContext('i18n');
@@ -13,6 +14,7 @@
 
 	let OpenAIUrl = '';
 	let OpenAIKey = '';
+	let OpenAISpeaker = '';
 
 	let STTEngines = ['', 'openai'];
 	let STTEngine = '';
@@ -20,6 +22,7 @@
 	let conversationMode = false;
 	let speechAutoSend = false;
 	let responseAutoPlayback = false;
+	let nonLocalVoices = false;
 
 	let TTSEngines = ['', 'openai'];
 	let TTSEngine = '';
@@ -86,14 +89,14 @@
 				url: OpenAIUrl,
 				key: OpenAIKey,
 				model: model,
-				speaker: speaker
+				speaker: OpenAISpeaker
 			});
 
 			if (res) {
 				OpenAIUrl = res.OPENAI_API_BASE_URL;
 				OpenAIKey = res.OPENAI_API_KEY;
 				model = res.OPENAI_API_MODEL;
-				speaker = res.OPENAI_API_VOICE;
+				OpenAISpeaker = res.OPENAI_API_VOICE;
 			}
 		}
 	};
@@ -105,6 +108,7 @@
 
 		STTEngine = $settings?.audio?.STTEngine ?? '';
 		TTSEngine = $settings?.audio?.TTSEngine ?? '';
+		nonLocalVoices = $settings.audio?.nonLocalVoices ?? false;
 		speaker = $settings?.audio?.speaker ?? '';
 		model = $settings?.audio?.model ?? '';
 
@@ -122,7 +126,10 @@
 				OpenAIUrl = res.OPENAI_API_BASE_URL;
 				OpenAIKey = res.OPENAI_API_KEY;
 				model = res.OPENAI_API_MODEL;
-				speaker = res.OPENAI_API_VOICE;
+				OpenAISpeaker = res.OPENAI_API_VOICE;
+				if (TTSEngine === 'openai') {
+					speaker = OpenAISpeaker;
+				}
 			}
 		}
 	});
@@ -138,8 +145,14 @@
 			audio: {
 				STTEngine: STTEngine !== '' ? STTEngine : undefined,
 				TTSEngine: TTSEngine !== '' ? TTSEngine : undefined,
-				speaker: speaker !== '' ? speaker : undefined,
-				model: model !== '' ? model : undefined
+				speaker:
+					(TTSEngine === 'openai' ? OpenAISpeaker : speaker) !== ''
+						? TTSEngine === 'openai'
+							? OpenAISpeaker
+							: speaker
+						: undefined,
+				model: model !== '' ? model : undefined,
+				nonLocalVoices: nonLocalVoices
 			}
 		});
 		dispatch('save');
@@ -227,7 +240,7 @@
 						on:change={(e) => {
 							if (e.target.value === 'openai') {
 								getOpenAIVoices();
-								speaker = 'alloy';
+								OpenAISpeaker = 'alloy';
 								model = 'tts-1';
 							} else {
 								getWebAPIVoices();
@@ -290,16 +303,27 @@
 						<select
 							class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
 							bind:value={speaker}
-							placeholder="Select a voice"
 						>
-							<option value="" selected>{$i18n.t('Default')}</option>
-							{#each voices.filter((v) => v.localService === true) as voice}
-								<option value={voice.name} class="bg-gray-100 dark:bg-gray-700">{voice.name}</option
+							<option value="" selected={speaker !== ''}>{$i18n.t('Default')}</option>
+							{#each voices.filter((v) => nonLocalVoices || v.localService === true) as voice}
+								<option
+									value={voice.name}
+									class="bg-gray-100 dark:bg-gray-700"
+									selected={speaker === voice.name}>{voice.name}</option
 								>
 							{/each}
 						</select>
 					</div>
 				</div>
+				<div class="flex items-center justify-between mb-1">
+					<div class="text-sm">
+						{$i18n.t('Allow non-local voices')}
+					</div>
+
+					<div class="mt-1">
+						<Switch bind:state={nonLocalVoices} />
+					</div>
+				</div>
 			</div>
 		{:else if TTSEngine === 'openai'}
 			<div>
@@ -309,7 +333,7 @@
 						<input
 							list="voice-list"
 							class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
-							bind:value={speaker}
+							bind:value={OpenAISpeaker}
 							placeholder="Select a voice"
 						/>
 

+ 13 - 1
src/lib/components/layout/Sidebar.svelte

@@ -205,6 +205,10 @@
 		await archiveChatById(localStorage.token, id);
 		await chats.set(await getChatList(localStorage.token));
 	};
+
+	const focusEdit = async (node: HTMLInputElement) => {
+		node.focus();
+	};
 </script>
 
 <ShareChatModal bind:show={showShareChatModal} chatId={shareChatId} />
@@ -489,7 +493,11 @@
 									? 'bg-gray-100 dark:bg-gray-950'
 									: 'group-hover:bg-gray-100 dark:group-hover:bg-gray-950'}  whitespace-nowrap text-ellipsis"
 							>
-								<input bind:value={chatTitle} class=" bg-transparent w-full outline-none mr-10" />
+								<input
+									use:focusEdit
+									bind:value={chatTitle}
+									class=" bg-transparent w-full outline-none mr-10"
+								/>
 							</div>
 						{:else}
 							<a
@@ -507,6 +515,10 @@
 										showSidebar.set(false);
 									}
 								}}
+								on:dblclick={() => {
+									chatTitle = chat.title;
+									chatTitleEditId = chat.id;
+								}}
 								draggable="false"
 							>
 								<div class=" flex self-center flex-1 w-full">

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

@@ -37,6 +37,7 @@
 	"All Users": "جميع المستخدمين",
 	"Allow": "يسمح",
 	"Allow Chat Deletion": "يستطيع حذف المحادثات",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "الأحرف الأبجدية الرقمية والواصلات",
 	"Already have an account?": "هل تملك حساب ؟",
 	"an assistant": "مساعد",
@@ -206,6 +207,7 @@
 	"Experimental": "تجريبي",
 	"Export": "تصدير",
 	"Export All Chats (All Users)": "تصدير جميع الدردشات (جميع المستخدمين)",
+	"Export chat (.json)": "",
 	"Export Chats": "تصدير جميع الدردشات",
 	"Export Documents Mapping": "تصدير وثائق الخرائط",
 	"Export Models": "نماذج التصدير",

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

@@ -37,6 +37,7 @@
 	"All Users": "Всички Потребители",
 	"Allow": "Позволи",
 	"Allow Chat Deletion": "Позволи Изтриване на Чат",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "алфанумерични знаци и тире",
 	"Already have an account?": "Вече имате акаунт? ",
 	"an assistant": "асистент",
@@ -206,6 +207,7 @@
 	"Experimental": "Експериментално",
 	"Export": "Износ",
 	"Export All Chats (All Users)": "Експортване на всички чатове (За всички потребители)",
+	"Export chat (.json)": "",
 	"Export Chats": "Експортване на чатове",
 	"Export Documents Mapping": "Експортване на документен мапинг",
 	"Export Models": "Експортиране на модели",

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

@@ -37,6 +37,7 @@
 	"All Users": "সব ইউজার",
 	"Allow": "অনুমোদন",
 	"Allow Chat Deletion": "চ্যাট ডিলিট করতে দিন",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "ইংরেজি অক্ষর, সংখ্যা এবং হাইফেন",
 	"Already have an account?": "আগে থেকেই একাউন্ট আছে?",
 	"an assistant": "একটা এসিস্ট্যান্ট",
@@ -206,6 +207,7 @@
 	"Experimental": "পরিক্ষামূলক",
 	"Export": "রপ্তানি",
 	"Export All Chats (All Users)": "সব চ্যাট এক্সপোর্ট করুন (সব ইউজারের)",
+	"Export chat (.json)": "",
 	"Export Chats": "চ্যাটগুলো এক্সপোর্ট করুন",
 	"Export Documents Mapping": "ডকুমেন্টসমূহ ম্যাপিং এক্সপোর্ট করুন",
 	"Export Models": "রপ্তানি মডেল",

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

@@ -37,6 +37,7 @@
 	"All Users": "Tots els Usuaris",
 	"Allow": "Permet",
 	"Allow Chat Deletion": "Permet la Supressió del Xat",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "caràcters alfanumèrics i guions",
 	"Already have an account?": "Ja tens un compte?",
 	"an assistant": "un assistent",
@@ -206,6 +207,7 @@
 	"Experimental": "Experimental",
 	"Export": "Exportar",
 	"Export All Chats (All Users)": "Exporta Tots els Xats (Tots els Usuaris)",
+	"Export chat (.json)": "",
 	"Export Chats": "Exporta Xats",
 	"Export Documents Mapping": "Exporta el Mapatge de Documents",
 	"Export Models": "Models d'exportació",

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

@@ -37,6 +37,7 @@
 	"All Users": "Ang tanan nga mga tiggamit",
 	"Allow": "Sa pagtugot",
 	"Allow Chat Deletion": "Tugoti nga mapapas ang mga chat",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "alphanumeric nga mga karakter ug hyphen",
 	"Already have an account?": "Naa na kay account ?",
 	"an assistant": "usa ka katabang",
@@ -206,6 +207,7 @@
 	"Experimental": "Eksperimento",
 	"Export": "",
 	"Export All Chats (All Users)": "I-export ang tanan nga mga chat (Tanan nga tiggamit)",
+	"Export chat (.json)": "",
 	"Export Chats": "I-export ang mga chat",
 	"Export Documents Mapping": "I-export ang pagmapa sa dokumento",
 	"Export Models": "",

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

@@ -37,6 +37,7 @@
 	"All Users": "Alle Benutzer",
 	"Allow": "Erlauben",
 	"Allow Chat Deletion": "Chat Löschung erlauben",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "alphanumerische Zeichen und Bindestriche",
 	"Already have an account?": "Hast du vielleicht schon ein Account?",
 	"an assistant": "ein Assistent",
@@ -206,6 +207,7 @@
 	"Experimental": "Experimentell",
 	"Export": "Exportieren",
 	"Export All Chats (All Users)": "Alle Chats exportieren (alle Benutzer)",
+	"Export chat (.json)": "",
 	"Export Chats": "Chats exportieren",
 	"Export Documents Mapping": "Dokumentenmapping exportieren",
 	"Export Models": "Modelle exportieren",

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

@@ -37,6 +37,7 @@
 	"All Users": "All Users",
 	"Allow": "Allow",
 	"Allow Chat Deletion": "Allow Delete Chats",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "so alpha, many hyphen",
 	"Already have an account?": "Such account exists?",
 	"an assistant": "such assistant",
@@ -206,6 +207,7 @@
 	"Experimental": "Much Experiment",
 	"Export": "",
 	"Export All Chats (All Users)": "Export All Chats (All Doggos)",
+	"Export chat (.json)": "",
 	"Export Chats": "Export Barks",
 	"Export Documents Mapping": "Export Mappings of Dogos",
 	"Export Models": "",

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

@@ -37,6 +37,7 @@
 	"All Users": "",
 	"Allow": "",
 	"Allow Chat Deletion": "",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "",
 	"Already have an account?": "",
 	"an assistant": "",
@@ -206,6 +207,7 @@
 	"Experimental": "",
 	"Export": "",
 	"Export All Chats (All Users)": "",
+	"Export chat (.json)": "",
 	"Export Chats": "",
 	"Export Documents Mapping": "",
 	"Export Models": "",

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

@@ -37,6 +37,7 @@
 	"All Users": "",
 	"Allow": "",
 	"Allow Chat Deletion": "",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "",
 	"Already have an account?": "",
 	"an assistant": "",
@@ -206,6 +207,7 @@
 	"Experimental": "",
 	"Export": "",
 	"Export All Chats (All Users)": "",
+	"Export chat (.json)": "",
 	"Export Chats": "",
 	"Export Documents Mapping": "",
 	"Export Models": "",

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

@@ -37,6 +37,7 @@
 	"All Users": "Todos los Usuarios",
 	"Allow": "Permitir",
 	"Allow Chat Deletion": "Permitir Borrar Chats",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "caracteres alfanuméricos y guiones",
 	"Already have an account?": "¿Ya tienes una cuenta?",
 	"an assistant": "un asistente",
@@ -206,6 +207,7 @@
 	"Experimental": "Experimental",
 	"Export": "Exportar",
 	"Export All Chats (All Users)": "Exportar todos los chats (Todos los usuarios)",
+	"Export chat (.json)": "",
 	"Export Chats": "Exportar Chats",
 	"Export Documents Mapping": "Exportar el mapeo de documentos",
 	"Export Models": "Modelos de exportación",

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

@@ -37,6 +37,7 @@
 	"All Users": "همه کاربران",
 	"Allow": "اجازه دادن",
 	"Allow Chat Deletion": "اجازه حذف گپ",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "حروف الفبایی و خط فاصله",
 	"Already have an account?": "از قبل حساب کاربری دارید؟",
 	"an assistant": "یک دستیار",
@@ -206,6 +207,7 @@
 	"Experimental": "آزمایشی",
 	"Export": "صادرات",
 	"Export All Chats (All Users)": "اکسپورت از همه گپ\u200cها(همه کاربران)",
+	"Export chat (.json)": "",
 	"Export Chats": "اکسپورت از گپ\u200cها",
 	"Export Documents Mapping": "اکسپورت از نگاشت اسناد",
 	"Export Models": "مدل های صادرات",

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

@@ -37,6 +37,7 @@
 	"All Users": "Kaikki käyttäjät",
 	"Allow": "Salli",
 	"Allow Chat Deletion": "Salli keskustelujen poisto",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "kirjaimia, numeroita ja väliviivoja",
 	"Already have an account?": "Onko sinulla jo tili?",
 	"an assistant": "avustaja",
@@ -206,6 +207,7 @@
 	"Experimental": "Kokeellinen",
 	"Export": "Vienti",
 	"Export All Chats (All Users)": "Vie kaikki keskustelut (kaikki käyttäjät)",
+	"Export chat (.json)": "",
 	"Export Chats": "Vie keskustelut",
 	"Export Documents Mapping": "Vie asiakirjakartoitus",
 	"Export Models": "Vie malleja",

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

@@ -37,6 +37,7 @@
 	"All Users": "Tous les utilisateurs",
 	"Allow": "Autoriser",
 	"Allow Chat Deletion": "Autoriser la suppression des discussions",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "caractères alphanumériques et tirets",
 	"Already have an account?": "Vous avez déjà un compte ?",
 	"an assistant": "un assistant",
@@ -206,6 +207,7 @@
 	"Experimental": "Expérimental",
 	"Export": "Exportation",
 	"Export All Chats (All Users)": "Exporter toutes les discussions (Tous les utilisateurs)",
+	"Export chat (.json)": "",
 	"Export Chats": "Exporter les discussions",
 	"Export Documents Mapping": "Exporter le mappage des documents",
 	"Export Models": "Modèles d’exportation",

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

@@ -37,6 +37,7 @@
 	"All Users": "Tous les Utilisateurs",
 	"Allow": "Autoriser",
 	"Allow Chat Deletion": "Autoriser la suppression du chat",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "caractères alphanumériques et tirets",
 	"Already have an account?": "Vous avez déjà un compte ?",
 	"an assistant": "un assistant",
@@ -206,6 +207,7 @@
 	"Experimental": "Expérimental",
 	"Export": "Exportation",
 	"Export All Chats (All Users)": "Exporter Tous les Chats (Tous les Utilisateurs)",
+	"Export chat (.json)": "",
 	"Export Chats": "Exporter les Chats",
 	"Export Documents Mapping": "Exporter la Correspondance des Documents",
 	"Export Models": "Exporter les Modèles",

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

@@ -37,6 +37,7 @@
 	"All Users": "כל המשתמשים",
 	"Allow": "אפשר",
 	"Allow Chat Deletion": "אפשר מחיקת צ'אט",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "תווים אלפאנומריים ומקפים",
 	"Already have an account?": "כבר יש לך חשבון?",
 	"an assistant": "עוזר",
@@ -206,6 +207,7 @@
 	"Experimental": "ניסיוני",
 	"Export": "ייצא",
 	"Export All Chats (All Users)": "ייצוא כל הצ'אטים (כל המשתמשים)",
+	"Export chat (.json)": "",
 	"Export Chats": "ייצוא צ'אטים",
 	"Export Documents Mapping": "ייצוא מיפוי מסמכים",
 	"Export Models": "ייצוא מודלים",

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

@@ -37,6 +37,7 @@
 	"All Users": "सभी उपयोगकर्ता",
 	"Allow": "अनुमति दें",
 	"Allow Chat Deletion": "चैट हटाने की अनुमति दें",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "अल्फ़ान्यूमेरिक वर्ण और हाइफ़न",
 	"Already have an account?": "क्या आपके पास पहले से एक खाता मौजूद है?",
 	"an assistant": "एक सहायक",
@@ -206,6 +207,7 @@
 	"Experimental": "प्रयोगात्मक",
 	"Export": "निर्यातित माल",
 	"Export All Chats (All Users)": "सभी चैट निर्यात करें (सभी उपयोगकर्ताओं की)",
+	"Export chat (.json)": "",
 	"Export Chats": "चैट निर्यात करें",
 	"Export Documents Mapping": "निर्यात दस्तावेज़ मैपिंग",
 	"Export Models": "निर्यात मॉडल",

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

@@ -37,6 +37,7 @@
 	"All Users": "Svi korisnici",
 	"Allow": "Dopusti",
 	"Allow Chat Deletion": "Dopusti brisanje razgovora",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "alfanumerički znakovi i crtice",
 	"Already have an account?": "Već imate račun?",
 	"an assistant": "asistent",
@@ -206,6 +207,7 @@
 	"Experimental": "Eksperimentalno",
 	"Export": "Izvoz",
 	"Export All Chats (All Users)": "Izvoz svih razgovora (svi korisnici)",
+	"Export chat (.json)": "",
 	"Export Chats": "Izvoz razgovora",
 	"Export Documents Mapping": "Izvoz mapiranja dokumenata",
 	"Export Models": "Izvezi modele",

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

@@ -37,6 +37,7 @@
 	"All Users": "Tutti gli utenti",
 	"Allow": "Consenti",
 	"Allow Chat Deletion": "Consenti l'eliminazione della chat",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "caratteri alfanumerici e trattini",
 	"Already have an account?": "Hai già un account?",
 	"an assistant": "un assistente",
@@ -206,6 +207,7 @@
 	"Experimental": "Sperimentale",
 	"Export": "Esportazione",
 	"Export All Chats (All Users)": "Esporta tutte le chat (tutti gli utenti)",
+	"Export chat (.json)": "",
 	"Export Chats": "Esporta chat",
 	"Export Documents Mapping": "Esporta mappatura documenti",
 	"Export Models": "Esporta modelli",

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

@@ -37,6 +37,7 @@
 	"All Users": "すべてのユーザー",
 	"Allow": "許可",
 	"Allow Chat Deletion": "チャットの削除を許可",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "英数字とハイフン",
 	"Already have an account?": "すでにアカウントをお持ちですか?",
 	"an assistant": "アシスタント",
@@ -206,6 +207,7 @@
 	"Experimental": "実験的",
 	"Export": "輸出",
 	"Export All Chats (All Users)": "すべてのチャットをエクスポート (すべてのユーザー)",
+	"Export chat (.json)": "",
 	"Export Chats": "チャットをエクスポート",
 	"Export Documents Mapping": "ドキュメントマッピングをエクスポート",
 	"Export Models": "モデルのエクスポート",

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

@@ -37,6 +37,7 @@
 	"All Users": "ყველა მომხმარებელი",
 	"Allow": "ნების დართვა",
 	"Allow Chat Deletion": "მიმოწერის წაშლის დაშვება",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "ალფანუმერული სიმბოლოები და დეფისები",
 	"Already have an account?": "უკვე გაქვს ანგარიში?",
 	"an assistant": "ასისტენტი",
@@ -206,6 +207,7 @@
 	"Experimental": "ექსპერიმენტალური",
 	"Export": "ექსპორტი",
 	"Export All Chats (All Users)": "ექსპორტი ყველა ჩათი (ყველა მომხმარებელი)",
+	"Export chat (.json)": "",
 	"Export Chats": "მიმოწერის ექსპორტირება",
 	"Export Documents Mapping": "დოკუმენტების კავშირის ექსპორტი",
 	"Export Models": "ექსპორტის მოდელები",

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

@@ -37,6 +37,7 @@
 	"All Users": "모든 사용자",
 	"Allow": "허용",
 	"Allow Chat Deletion": "채팅 삭제 허용",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "영문자,숫자 및 하이픈",
 	"Already have an account?": "이미 계정이 있으신가요?",
 	"an assistant": "어시스턴트",
@@ -206,6 +207,7 @@
 	"Experimental": "실험적",
 	"Export": "수출",
 	"Export All Chats (All Users)": "모든 채팅 내보내기 (모든 사용자)",
+	"Export chat (.json)": "",
 	"Export Chats": "채팅 내보내기",
 	"Export Documents Mapping": "문서 매핑 내보내기",
 	"Export Models": "모델 내보내기",

+ 4 - 0
src/lib/i18n/locales/languages.json

@@ -79,6 +79,10 @@
 		"code": "ko-KR",
 		"title": "Korean (한국어)"
 	},
+	{
+		"code": "lt-LT",
+		"title": "Lithuanian (Lietuvių)"
+	},
 	{
 		"code": "nl-NL",
 		"title": "Dutch (Netherlands)"

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

@@ -37,6 +37,7 @@
 	"All Users": "Alle Gebruikers",
 	"Allow": "Toestaan",
 	"Allow Chat Deletion": "Sta Chat Verwijdering toe",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "alfanumerieke karakters en streepjes",
 	"Already have an account?": "Heb je al een account?",
 	"an assistant": "een assistent",
@@ -206,6 +207,7 @@
 	"Experimental": "Experimenteel",
 	"Export": "Exporteren",
 	"Export All Chats (All Users)": "Exporteer Alle Chats (Alle Gebruikers)",
+	"Export chat (.json)": "",
 	"Export Chats": "Exporteer Chats",
 	"Export Documents Mapping": "Exporteer Documenten Mapping",
 	"Export Models": "Modellen exporteren",

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

@@ -37,6 +37,7 @@
 	"All Users": "ਸਾਰੇ ਉਪਭੋਗਤਾ",
 	"Allow": "ਅਨੁਮਤੀ",
 	"Allow Chat Deletion": "ਗੱਲਬਾਤ ਮਿਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "ਅਲਫ਼ਾਨਯੂਮੈਰਿਕ ਅੱਖਰ ਅਤੇ ਹਾਈਫਨ",
 	"Already have an account?": "ਪਹਿਲਾਂ ਹੀ ਖਾਤਾ ਹੈ?",
 	"an assistant": "ਇੱਕ ਸਹਾਇਕ",
@@ -206,6 +207,7 @@
 	"Experimental": "ਪਰਮਾਣੂਕ੍ਰਿਤ",
 	"Export": "ਨਿਰਯਾਤ",
 	"Export All Chats (All Users)": "ਸਾਰੀਆਂ ਗੱਲਾਂ ਨਿਰਯਾਤ ਕਰੋ (ਸਾਰੇ ਉਪਭੋਗਤਾ)",
+	"Export chat (.json)": "",
 	"Export Chats": "ਗੱਲਾਂ ਨਿਰਯਾਤ ਕਰੋ",
 	"Export Documents Mapping": "ਡਾਕੂਮੈਂਟ ਮੈਪਿੰਗ ਨਿਰਯਾਤ ਕਰੋ",
 	"Export Models": "ਨਿਰਯਾਤ ਮਾਡਲ",

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

@@ -37,6 +37,7 @@
 	"All Users": "Wszyscy użytkownicy",
 	"Allow": "Pozwól",
 	"Allow Chat Deletion": "Pozwól na usuwanie czatu",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "znaki alfanumeryczne i myślniki",
 	"Already have an account?": "Masz już konto?",
 	"an assistant": "asystent",
@@ -206,6 +207,7 @@
 	"Experimental": "Eksperymentalne",
 	"Export": "Eksport",
 	"Export All Chats (All Users)": "Eksportuj wszystkie czaty (wszyscy użytkownicy)",
+	"Export chat (.json)": "",
 	"Export Chats": "Eksportuj czaty",
 	"Export Documents Mapping": "Eksportuj mapowanie dokumentów",
 	"Export Models": "Eksportuj modele",

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

@@ -37,6 +37,7 @@
 	"All Users": "Todos os Usuários",
 	"Allow": "Permitir",
 	"Allow Chat Deletion": "Permitir Exclusão de Bate-papo",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "caracteres alfanuméricos e hífens",
 	"Already have an account?": "Já tem uma conta?",
 	"an assistant": "um assistente",
@@ -206,6 +207,7 @@
 	"Experimental": "Experimental",
 	"Export": "Exportação",
 	"Export All Chats (All Users)": "Exportar Todos os Bate-papos (Todos os Usuários)",
+	"Export chat (.json)": "",
 	"Export Chats": "Exportar Bate-papos",
 	"Export Documents Mapping": "Exportar Mapeamento de Documentos",
 	"Export Models": "Modelos de Exportação",

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

@@ -37,6 +37,7 @@
 	"All Users": "Todos os Usuários",
 	"Allow": "Permitir",
 	"Allow Chat Deletion": "Permitir Exclusão de Bate-papo",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "caracteres alfanuméricos e hífens",
 	"Already have an account?": "Já tem uma conta?",
 	"an assistant": "um assistente",
@@ -206,6 +207,7 @@
 	"Experimental": "Experimental",
 	"Export": "Exportação",
 	"Export All Chats (All Users)": "Exportar Todos os Bate-papos (Todos os Usuários)",
+	"Export chat (.json)": "",
 	"Export Chats": "Exportar Bate-papos",
 	"Export Documents Mapping": "Exportar Mapeamento de Documentos",
 	"Export Models": "Modelos de Exportação",

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

@@ -37,6 +37,7 @@
 	"All Users": "Все пользователи",
 	"Allow": "Разрешить",
 	"Allow Chat Deletion": "Дозволять удаление чат",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "буквенно цифровые символы и дефисы",
 	"Already have an account?": "у вас уже есть аккаунт?",
 	"an assistant": "ассистент",
@@ -206,6 +207,7 @@
 	"Experimental": "Экспериментальное",
 	"Export": "Экспорт",
 	"Export All Chats (All Users)": "Экспортировать все чаты (все пользователи)",
+	"Export chat (.json)": "",
 	"Export Chats": "Экспортировать чаты",
 	"Export Documents Mapping": "Экспортировать отображение документов",
 	"Export Models": "Экспорт моделей",

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

@@ -37,6 +37,7 @@
 	"All Users": "Сви корисници",
 	"Allow": "Дозволи",
 	"Allow Chat Deletion": "Дозволи брисање ћаскања",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "алфанумерички знакови и цртице",
 	"Already have an account?": "Већ имате налог?",
 	"an assistant": "помоћник",
@@ -206,6 +207,7 @@
 	"Experimental": "Експериментално",
 	"Export": "Извоз",
 	"Export All Chats (All Users)": "Извези сва ћаскања (сви корисници)",
+	"Export chat (.json)": "",
 	"Export Chats": "Извези ћаскања",
 	"Export Documents Mapping": "Извези мапирање докумената",
 	"Export Models": "Извези моделе",

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

@@ -37,6 +37,7 @@
 	"All Users": "Alla användare",
 	"Allow": "Tillåt",
 	"Allow Chat Deletion": "Tillåt chattborttagning",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "alfanumeriska tecken och bindestreck",
 	"Already have an account?": "Har du redan ett konto?",
 	"an assistant": "en assistent",
@@ -206,6 +207,7 @@
 	"Experimental": "Experimentell",
 	"Export": "Export",
 	"Export All Chats (All Users)": "Exportera alla chattar (alla användare)",
+	"Export chat (.json)": "",
 	"Export Chats": "Exportera chattar",
 	"Export Documents Mapping": "Exportera dokumentmappning",
 	"Export Models": "Exportera modeller",

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

@@ -37,6 +37,7 @@
 	"All Users": "Tüm Kullanıcılar",
 	"Allow": "İzin ver",
 	"Allow Chat Deletion": "Sohbet Silmeye İzin Ver",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "alfanumerik karakterler ve tireler",
 	"Already have an account?": "Zaten bir hesabınız mı var?",
 	"an assistant": "bir asistan",
@@ -206,6 +207,7 @@
 	"Experimental": "Deneysel",
 	"Export": "Ihracat",
 	"Export All Chats (All Users)": "Tüm Sohbetleri Dışa Aktar (Tüm Kullanıcılar)",
+	"Export chat (.json)": "",
 	"Export Chats": "Sohbetleri Dışa Aktar",
 	"Export Documents Mapping": "Belge Eşlemesini Dışa Aktar",
 	"Export Models": "Modelleri Dışa Aktar",

+ 2 - 0
src/lib/i18n/locales/uk-UA/translation.json

@@ -37,6 +37,7 @@
 	"All Users": "Всі користувачі",
 	"Allow": "Дозволити",
 	"Allow Chat Deletion": "Дозволити видалення чату",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "алфавітно-цифрові символи та дефіси",
 	"Already have an account?": "Вже є обліковий запис?",
 	"an assistant": "асистента",
@@ -206,6 +207,7 @@
 	"Experimental": "Експериментальне",
 	"Export": "Експорт",
 	"Export All Chats (All Users)": "Експортувати всі чати (всі користувачі)",
+	"Export chat (.json)": "",
 	"Export Chats": "Експортувати чати",
 	"Export Documents Mapping": "Експортувати відображення документів",
 	"Export Models": "Експорт моделей",

+ 2 - 0
src/lib/i18n/locales/vi-VN/translation.json

@@ -37,6 +37,7 @@
 	"All Users": "Danh sách người sử dụng",
 	"Allow": "Cho phép",
 	"Allow Chat Deletion": "Cho phép Xóa nội dung chat",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "ký tự số và gạch nối",
 	"Already have an account?": "Bạn đã có tài khoản?",
 	"an assistant": "trợ lý",
@@ -206,6 +207,7 @@
 	"Experimental": "Thử nghiệm",
 	"Export": "Xuất khẩu",
 	"Export All Chats (All Users)": "Tải về tất cả nội dung chat (tất cả mọi người)",
+	"Export chat (.json)": "",
 	"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": "Tải Models về máy",

+ 178 - 176
src/lib/i18n/locales/zh-CN/translation.json

@@ -2,21 +2,21 @@
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' 或 '-1' 表示无过期时间。",
 	"(Beta)": "(测试版)",
 	"(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`)",
-	"(latest)": "(最新版)",
+	"(latest)": "(正式版)",
 	"{{ models }}": "{{ models }}",
 	"{{ owner }}: You cannot delete a base model": "{{ owner }}:您不能删除基础模型",
 	"{{modelName}} is thinking...": "{{modelName}} 正在思考...",
-	"{{user}}'s Chats": "{{user}} 的聊天记录",
+	"{{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": "准确信息",
+	"Account": "账",
+	"Accurate information": "准确信息",
 	"Add": "添加",
-	"Add a model id": "添加一个模型ID",
-	"Add a short description about what this model does": "添加一个关于这个模型的简短描述",
-	"Add a short title for this prompt": "为这个提示词添加一个简短的标题",
+	"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": "添加自定义提示词",
 	"Add Docs": "添加文档",
@@ -37,47 +37,48 @@
 	"All Users": "所有用户",
 	"Allow": "允许",
 	"Allow Chat Deletion": "允许删除聊天记录",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "字母数字字符和连字符",
-	"Already have an account?": "已经有账户了吗?",
+	"Already have an account?": "已经拥有账号了?",
 	"an assistant": "助手",
 	"and": "和",
-	"and create a new shared link.": "创建一个新的共享链接。",
-	"API Base URL": "API 基础 URL",
+	"and create a new shared link.": "并创建一个新的分享链接。",
+	"API Base URL": "API 基础地址",
 	"API Key": "API 密钥",
 	"API Key created.": "API 密钥已创建。",
 	"API keys": "API 密钥",
 	"April": "四月",
-	"Archive": "档",
-	"Archive All Chats": "存档所有聊天记录",
-	"Archived Chats": "聊天记录存档",
+	"Archive": "档",
+	"Archive All Chats": "归档所有对话记录",
+	"Archived Chats": "已归档对话",
 	"are allowed - Activate this command by typing": "允许 - 通过输入来激活这个命令",
-	"Are you sure?": "你确定吗?",
+	"Are you sure?": "是否确定?",
 	"Attach file": "添加文件",
 	"Attention to detail": "注重细节",
-	"Audio": "音",
+	"Audio": "音",
 	"August": "八月",
-	"Auto-playback response": "自动播放回应",
-	"Auto-send input after 3 sec.": "3 秒后自动发送输入",
-	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 基础 URL",
-	"AUTOMATIC1111 Base URL is required.": "需要 AUTOMATIC1111 基础 URL。",
+	"Auto-playback response": "自动念出回复内容",
+	"Auto-send input after 3 sec.": "3 秒后自动发送输入框内容",
+	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 基础地址",
+	"AUTOMATIC1111 Base URL is required.": "需要 AUTOMATIC1111 基础地址。",
 	"available!": "可用!",
 	"Back": "返回",
-	"Bad Response": "不良响应",
-	"Banners": "横幅",
-	"Base Model (From)": "基础模型 ()",
-	"before": "之前",
+	"Bad Response": "较差回复",
+	"Banners": "公告横幅",
+	"Base Model (From)": "基础模型 (来自)",
+	"before": "对话",
 	"Being lazy": "懒惰",
 	"Brave Search API Key": "Brave Search API 密钥",
 	"Bypass SSL verification for Websites": "绕过网站的 SSL 验证",
 	"Cancel": "取消",
-	"Capabilities": "能",
+	"Capabilities": "能",
 	"Change Password": "更改密码",
-	"Chat": "聊天",
-	"Chat Bubble UI": "聊天气泡 UI",
-	"Chat direction": "聊天方向",
-	"Chat History": "聊天历史",
-	"Chat History is off for this browser.": "此浏览器已关闭聊天历史功能。",
-	"Chats": "聊天",
+	"Chat": "对话",
+	"Chat Bubble UI": "气泡样式对话",
+	"Chat direction": "对话文字方向",
+	"Chat History": "对话历史记录",
+	"Chat History is off for this browser.": "此浏览器已关闭对话历史记录功能。",
+	"Chats": "对话",
 	"Check Again": "再次检查",
 	"Check for updates": "检查更新",
 	"Checking for updates...": "正在检查更新...",
@@ -87,35 +88,35 @@
 	"Chunk Size": "块大小 (Chunk Size)",
 	"Citation": "引文",
 	"Click here for help.": "点击这里获取帮助。",
-	"Click here to": "单击此处",
+	"Click here to": "单击",
 	"Click here to select": "点击这里选择",
 	"Click here to select a csv file.": "单击此处选择 csv 文件。",
-	"Click here to select documents.": "点击这里选择文档。",
+	"Click here to select documents.": "单击选择文档",
 	"click here.": "点击这里。",
-	"Click on the user role button to change a user's role.": "点击用户角色按钮以更改用户的角色。",
-	"Clone": "克隆",
+	"Click on the user role button to change a user's role.": "点击角色前方的组别按钮以更改用户所属权限组。",
+	"Clone": "复制",
 	"Close": "关闭",
-	"Collection": "收藏",
+	"Collection": "集合",
 	"ComfyUI": "ComfyUI",
-	"ComfyUI Base URL": "ComfyUI Base URL",
-	"ComfyUI Base URL is required.": "ComfyUI Base URL 是必需的。",
+	"ComfyUI Base URL": "ComfyUI 基础地址",
+	"ComfyUI Base URL is required.": "ComfyUI 基础地址为必需填写。",
 	"Command": "命令",
 	"Concurrent Requests": "并发请求",
 	"Confirm Password": "确认密码",
-	"Connections": "连接",
+	"Connections": "外部连接",
 	"Content": "内容",
 	"Context Length": "上下文长度",
-	"Continue Response": "继续回复",
-	"Conversation Mode": "对话模式",
-	"Copied shared chat URL to clipboard!": "已复制共享聊天 URL 到剪贴板!",
+	"Continue Response": "继续生成",
+	"Conversation Mode": "连续对话模式",
+	"Copied shared chat URL to clipboard!": "已复制此对话分享链接至剪贴板!",
 	"Copy": "复制",
-	"Copy last code block": "复制最后一个代码块",
-	"Copy last response": "复制最后一次回复",
+	"Copy last code block": "复制最后一个代码块中的代码",
+	"Copy last response": "复制最后一次回复内容",
 	"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':": "为以下查询创建一个简洁的、3-5 个词的短语作为标题,严格遵守 3-5 个词的限制并避免使用“标题”一词:",
+	"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':": "创建一个简洁的、3 至 5 个字的短语作为以下查询的标题,严格遵守 3 至 5 个 字的限制,并避免使用“标题”一词:",
 	"Create a model": "创建一个模型",
-	"Create Account": "创建账",
+	"Create Account": "创建账",
 	"Create new key": "创建新密钥",
 	"Create new secret key": "创建新安全密钥",
 	"Created at": "创建于",
@@ -123,7 +124,7 @@
 	"Current Model": "当前模型",
 	"Current Password": "当前密码",
 	"Custom": "自定义",
-	"Customize models for a specific purpose": "为特定目的定制模型",
+	"Customize models for a specific purpose": "定制专用目的模型",
 	"Dark": "暗色",
 	"Database": "数据库",
 	"December": "十二月",
@@ -138,96 +139,97 @@
 	"delete": "删除",
 	"Delete": "删除",
 	"Delete a model": "删除一个模型",
-	"Delete All Chats": "删除所有聊天记录",
-	"Delete chat": "删除聊天",
-	"Delete Chat": "删除聊天",
-	"delete this link": "删除这个链接",
+	"Delete All Chats": "删除所有对话记录",
+	"Delete chat": "删除对话记录",
+	"Delete Chat": "删除对话记录",
+	"delete this link": "此处删除这个链接",
 	"Delete User": "删除用户",
-	"Deleted {{deleteModelTag}}": "已删除{{deleteModelTag}}",
-	"Deleted {{name}}": "已删除{{name}}",
+	"Deleted {{deleteModelTag}}": "已删除 {{deleteModelTag}}",
+	"Deleted {{name}}": "已删除 {{name}}",
 	"Description": "描述",
-	"Didn't fully follow instructions": "没有完全遵循指",
+	"Didn't fully follow instructions": "没有完全遵循指",
 	"Disabled": "禁用",
-	"Discover a model": "探索模型",
-	"Discover a prompt": "探索提示词",
-	"Discover, download, and explore custom prompts": "发现、下载并探索自定义提示词",
-	"Discover, download, and explore model presets": "发现、下载并探索模型预设",
-	"Display the username instead of You in the Chat": "在聊天中显示用户名而不是“你”",
+	"Discover a model": "发现更多模型",
+	"Discover a prompt": "发现更多提示词",
+	"Discover, download, and explore custom prompts": "发现、下载并探索更多自定义提示词",
+	"Discover, download, and explore model presets": "发现、下载并探索更多模型预设",
+	"Display the username instead of You in the Chat": "在对话中显示用户名而不是“你”",
 	"Document": "文档",
 	"Document Settings": "文档设置",
 	"Documents": "文档",
-	"does not make any external connections, and your data stays securely on your locally hosted server.": "不进行任何外部连接,您的数据安全地存储在您的本地服务器上。",
+	"does not make any external connections, and your data stays securely on your locally hosted server.": "不会与外部建立任何连接,您的数据会安全地存储在本地托管的服务器上。",
 	"Don't Allow": "不允许",
-	"Don't have an account?": "没有账?",
-	"Don't like the style": "不喜欢这个风",
+	"Don't have an account?": "没有账?",
+	"Don't like the style": "不喜欢这个风",
 	"Download": "下载",
 	"Download canceled": "下载已取消",
 	"Download Database": "下载数据库",
 	"Drop any files here to add to the conversation": "拖动文件到此处以添加到对话中",
-	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "例如 '30s','10m'。有效的时间单位是's', 'm', 'h'。",
+	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "例如 '30s','10m'。有效的时间单位是秒:'s',分:'m',时:'h'。",
 	"Edit": "编辑",
 	"Edit Doc": "编辑文档",
 	"Edit User": "编辑用户",
-	"Email": "电子邮件",
-	"Embedding Model": "嵌入模型",
-	"Embedding Model Engine": "嵌入模型引擎",
-	"Embedding model set to \"{{embedding_model}}\"": "嵌入模型设置为 \"{{embedding_model}}\"",
-	"Enable Chat History": "启用聊天历史",
-	"Enable Community Sharing": "启用社区共享",
-	"Enable New Sign Ups": "启用新注册",
+	"Email": "邮箱地址",
+	"Embedding Model": "语义向量模型",
+	"Embedding Model Engine": "语义向量模型引擎",
+	"Embedding model set to \"{{embedding_model}}\"": "语义向量模型设置为 \"{{embedding_model}}\"",
+	"Enable Chat History": "启用对话历史记录",
+	"Enable Community Sharing": "启用分享至社区",
+	"Enable New Sign Ups": "允许新用户注册",
 	"Enable Web Search": "启用网络搜索",
 	"Enabled": "启用",
-	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "确保您的 CSV 文件按以下顺序包含 4 列: 姓名、电子邮件、密码、角色。",
+	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "确保您的 CSV 文件按以下顺序包含 4 列: 姓名、邮箱地址、密码、角色。",
 	"Enter {{role}} message here": "在此处输入 {{role}} 信息",
 	"Enter a detail about yourself for your LLMs to recall": "输入 LLM 可以记住的信息",
 	"Enter Brave Search API Key": "输入 Brave Search API 密钥",
 	"Enter Chunk Overlap": "输入块重叠 (Chunk Overlap)",
 	"Enter Chunk Size": "输入块大小 (Chunk Size)",
-	"Enter Github Raw URL": "输入 Github Raw URL",
+	"Enter Github Raw URL": "输入 Github Raw 地址",
 	"Enter Google PSE API Key": "输入 Google PSE API 密钥",
 	"Enter Google PSE Engine Id": "输入 Google PSE 引擎 ID",
-	"Enter Image Size (e.g. 512x512)": "输入图片大小 (例如 512x512)",
+	"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": "输入 Searxng 查询 URL",
+	"Enter model tag (e.g. {{modelTag}})": "输入模型标签 (例如{{modelTag}})",
+	"Enter Number of Steps (e.g. 50)": "输入步骤数 (Steps) (例如:50)",
+	"Enter Score": "输入分",
+	"Enter Searxng Query URL": "输入 Searxng 查询地址",
 	"Enter Serper API Key": "输入 Serper API 密钥",
 	"Enter Serpstack API Key": "输入 Serpstack API 密钥",
-	"Enter stop sequence": "输入停止序列",
+	"Enter stop sequence": "输入停止序列 (Stop Sequence)",
 	"Enter Top K": "输入 Top K",
-	"Enter URL (e.g. http://127.0.0.1:7860/)": "输入 URL (例如 http://127.0.0.1:7860/)",
-	"Enter URL (e.g. http://localhost:11434)": "输入 URL (例如 http://localhost:11434)",
-	"Enter Your Email": "输入您的电子邮件",
-	"Enter Your Full Name": "输入您的名",
+	"Enter URL (e.g. http://127.0.0.1:7860/)": "输入地址 (例如:http://127.0.0.1:7860/)",
+	"Enter URL (e.g. http://localhost:11434)": "输入地址 (例如:http://localhost:11434)",
+	"Enter Your Email": "输入您的邮箱地址",
+	"Enter Your Full Name": "输入您的名",
 	"Enter Your Password": "输入您的密码",
-	"Enter Your Role": "输入您的角色",
+	"Enter Your Role": "输入您的权限组",
 	"Error": "错误",
 	"Experimental": "实验性",
-	"Export": "出口",
-	"Export All Chats (All Users)": "导出所有聊天(所有用户)",
-	"Export Chats": "导出聊天",
+	"Export": "导出",
+	"Export All Chats (All Users)": "导出所有用户对话",
+	"Export chat (.json)": "",
+	"Export Chats": "导出对话",
 	"Export Documents Mapping": "导出文档映射",
 	"Export Models": "导出模型",
 	"Export Prompts": "导出提示词",
 	"Failed to create API Key.": "无法创建 API 密钥。",
 	"Failed to read clipboard contents": "无法读取剪贴板内容",
 	"February": "二月",
-	"Feel free to add specific details": "请随意添加具体细节",
+	"Feel free to add specific details": "欢迎补充具体细节",
 	"File Mode": "文件模式",
 	"File not found.": "文件未找到。",
-	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "检测到指纹欺骗: 无法使用姓名缩写作为头像。默认使用默认个人形象。",
-	"Fluidly stream large external response chunks": "流畅地传输大型外部响应块",
-	"Focus chat input": "聚焦聊天输入",
-	"Followed instructions perfectly": "完全遵循说明",
+	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "检测到指纹伪造:无法使用姓名缩写作为头像。默认使用默认个人形象。",
+	"Fluidly stream large external response chunks": "流畅地传输外部大型响应块数据",
+	"Focus chat input": "聚焦对话输入",
+	"Followed instructions perfectly": "完全遵循指令",
 	"Format your variables using square brackets like this:": "使用这样的方括号格式化你的变量:",
 	"Frequency Penalty": "频率惩罚",
-	"Full Screen Mode": "屏模式",
+	"Full Screen Mode": "屏模式",
 	"General": "通用",
 	"General Settings": "通用设置",
 	"Generating search query": "生成搜索查询",
 	"Generation Info": "生成信息",
-	"Good Response": "反应良好",
+	"Good Response": "优秀回复",
 	"Google PSE API Key": "Google PSE API 密钥",
 	"Google PSE Engine Id": "Google PSE 引擎 ID",
 	"h:mm a": "h:mm a",
@@ -235,16 +237,16 @@
 	"Hello, {{name}}": "你好,{{name}}",
 	"Help": "帮助",
 	"Hide": "隐藏",
-	"How can I help you today?": "今天能帮你做什么?",
+	"How can I help you today?": "今天能帮你做什么?",
 	"Hybrid Search": "混合搜索",
 	"Image Generation (Experimental)": "图像生成(实验性)",
 	"Image Generation Engine": "图像生成引擎",
 	"Image Settings": "图像设置",
 	"Images": "图像",
-	"Import Chats": "导入聊天",
+	"Import Chats": "导入对话记录",
 	"Import Documents Mapping": "导入文档映射",
 	"Import Models": "导入模型",
-	"Import Prompts": "导入提示",
+	"Import Prompts": "导入提示",
 	"Include `--api` flag when running stable-diffusion-webui": "运行 stable-diffusion-webui 时包含 `--api` 标志",
 	"Info": "信息",
 	"Input commands": "输入命令",
@@ -262,35 +264,35 @@
 	"Keep Alive": "保持活动",
 	"Keyboard shortcuts": "键盘快捷键",
 	"Language": "语言",
-	"Last Active": "最后活跃",
+	"Last Active": "最后在线时间",
 	"Light": "浅色",
-	"Listening...": "监听中...",
-	"LLMs can make mistakes. Verify important information.": "LLM 可能会生成错误信息,请验证重要信息。",
-	"LTR": "LTR",
+	"Listening...": "正在倾听...",
+	"LLMs can make mistakes. Verify important information.": "大语言模型可能会生成误导性错误信息,请对关键信息加以验证。",
+	"LTR": "从左至右",
 	"Made by OpenWebUI Community": "由 OpenWebUI 社区制作",
 	"Make sure to enclose them with": "确保将它们包含在内",
 	"Manage Models": "管理模型",
 	"Manage Ollama Models": "管理 Ollama 模型",
-	"Manage Pipelines": "管理管道",
+	"Manage Pipelines": "管理 Pipeline",
 	"March": "三月",
-	"Max Tokens (num_predict)": "最大标记 (num_predict)",
+	"Max Tokens (num_predict)": "最多 Token (num_predict)",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "最多可以同时下载 3 个模型,请稍后重试。",
 	"May": "五月",
-	"Memories accessible by LLMs will be shown here.": "LLMs 可以访问的记忆将显示在这里。",
+	"Memories accessible by LLMs will be shown here.": "大语言模型可访问的记忆将在此显示。",
 	"Memory": "记忆",
-	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "创建链接后发送的消息不会被共享。具有 URL 的用户将能够查看共享聊天。",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "创建链接后发送的消息不会被共享。具有 URL 的用户将能够查看共享对话。",
 	"Minimum Score": "最低分",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
+	"MMMM DD, YYYY": "YYYY年 M月 D日",
+	"MMMM DD, YYYY HH:mm": "YYYY年 M月 D日 HH:mm",
 	"Model '{{modelName}}' has been successfully downloaded.": "模型'{{modelName}}'已成功下载。",
 	"Model '{{modelTag}}' is already in queue for downloading.": "模型'{{modelTag}}'已在下载队列中。",
-	"Model {{modelId}} not found": "未找到模型{{modelId}}",
+	"Model {{modelId}} not found": "未找到模型 {{modelId}}",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "检测到模型文件系统路径,无法继续进行。更新操作需要提供模型简称。",
 	"Model ID": "模型 ID",
 	"Model not selected": "未选择模型",
 	"Model Params": "模型参数",
@@ -300,9 +302,9 @@
 	"Models": "模型",
 	"More": "更多",
 	"Name": "名称",
-	"Name Tag": "名称标签",
+	"Name Tag": "标签",
 	"Name your model": "为您的模型命名",
-	"New Chat": "新聊天",
+	"New Chat": "新对话",
 	"New Password": "新密码",
 	"No results found": "未找到结果",
 	"No search query generated": "未生成搜索查询",
@@ -312,25 +314,25 @@
 	"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)": "num_thread(奥拉马)",
+	"num_thread (Ollama)": "num_thread(Ollama)",
 	"October": "十月",
 	"Off": "关闭",
-	"Okay, Let's Go!": "好的,我们开始吧!",
-	"OLED Dark": "黑色",
+	"Okay, Let's Go!": "确认,开始使用!",
+	"OLED Dark": "黑色",
 	"Ollama": "Ollama",
 	"Ollama API": "Ollama API",
 	"Ollama API disabled": "Ollama API 已禁用",
 	"Ollama Version": "Ollama 版本",
-	"On": "开",
+	"On": "开",
 	"Only": "仅",
 	"Only alphanumeric characters and hyphens are allowed in the command string.": "命令字符串中只允许使用英文字母,数字 (0-9) 以及连字符 (-)。",
-	"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "哎呀!请稍等!您的文件仍在处理中。我们正在将它们做得尽善尽美,请耐心等待,一旦准备好我们会通知您。",
-	"Oops! Looks like the URL is invalid. Please double-check and try again.": "哎呀!看起来 URL 无效。请仔细检查后再试一次。",
-	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "哎呀!您正在使用不支持的方法(仅限前端)。请从后端提供 WebUI。",
+	"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "糟糕!请稍等!您的文件还在处理中。我们正在努力让它们达到最佳效果。请耐心等待,准备好后我们会通知您。",
+	"Oops! Looks like the URL is invalid. Please double-check and try again.": "糟糕!此链接似乎为无效链接。请检查后重试。",
+	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "糟糕!你正在使用不被支持的方法(仅前端)。请从后端提供 WebUI 服务。",
 	"Open": "打开",
 	"Open AI": "Open AI",
 	"Open AI (Dall-E)": "Open AI (Dall-E)",
-	"Open new chat": "打开新聊天",
+	"Open new chat": "打开新对话",
 	"OpenAI": "OpenAI",
 	"OpenAI API": "OpenAI API",
 	"OpenAI API Config": "OpenAI API 配置",
@@ -342,31 +344,31 @@
 	"PDF document (.pdf)": "PDF 文档 (.pdf)",
 	"PDF Extract Images (OCR)": "PDF 图像处理 (使用 OCR)",
 	"pending": "待定",
-	"Permission denied when accessing microphone: {{error}}": "访问麦克风时权限被拒绝:{{error}}",
+	"Permission denied when accessing microphone: {{error}}": "申请麦克风权限被拒绝:{{error}}",
 	"Personalization": "个性化",
-	"Pipelines": "管道",
-	"Pipelines Valves": "管道阀门",
+	"Pipelines": "Pipeline",
+	"Pipelines Valves": "Pipeline 值",
 	"Plain text (.txt)": "TXT 文档 (.txt)",
 	"Playground": "AI 对话游乐场",
-	"Positive attitude": "积极态度",
+	"Positive attitude": "较为积极态度",
 	"Previous 30 days": "过去 30 天",
 	"Previous 7 days": "过去 7 天",
 	"Profile Image": "用户头像",
 	"Prompt": "提示词",
-	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "提示(例如:告诉我一个关于罗马帝国的有趣事实)",
+	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "提示(例如:给我讲一个关于罗马帝国的趣事。)",
 	"Prompt Content": "提示词内容",
 	"Prompt suggestions": "提示词建议",
 	"Prompts": "提示词",
 	"Pull \"{{searchValue}}\" from Ollama.com": "从 Ollama.com 拉取 \"{{searchValue}}\"",
 	"Pull a model from Ollama.com": "从 Ollama.com 拉取一个模型",
 	"Query Params": "查询参数",
-	"RAG Template": "RAG 模板",
+	"RAG Template": "RAG 提示词模板",
 	"Read Aloud": "朗读",
 	"Record voice": "录音",
 	"Redirecting you to OpenWebUI Community": "正在将您重定向到 OpenWebUI 社区",
-	"Refused when it shouldn't have": "在不拒绝时拒绝",
+	"Refused when it shouldn't have": "在不拒绝时拒绝",
 	"Regenerate": "重新生成",
-	"Release Notes": "发布说明",
+	"Release Notes": "更新日志",
 	"Remove": "移除",
 	"Remove Model": "移除模型",
 	"Rename": "重命名",
@@ -376,31 +378,31 @@
 	"Reranking model disabled": "重排模型已禁用",
 	"Reranking model set to \"{{reranking_model}}\"": "重排模型设置为 \"{{reranking_model}}\"",
 	"Reset Vector Storage": "重置向量存储",
-	"Response AutoCopy to Clipboard": "自动复制回到剪贴板",
-	"Role": "角色",
+	"Response AutoCopy to Clipboard": "自动复制回到剪贴板",
+	"Role": "权限组",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
-	"RTL": "RTL",
+	"RTL": "从右至左",
 	"Save": "保存",
 	"Save & Create": "保存并创建",
 	"Save & Update": "保存并更新",
-	"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "不再支持直接将聊天记录保存到浏览器存储中。请点击下面的按钮下载并删除您的聊天记录。别担心,您可以通过轻松地将聊天记录重新导入到后端",
-	"Scan": "扫描",
+	"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "我们不再支持将聊天记录直接保存到浏览器的存储空间。请点击下面的按钮下载并删除您的聊天记录。别担心,您可以轻松地将聊天记录重新导入到后台。",
+	"Scan": "立即扫描",
 	"Scan complete!": "扫描完成!",
 	"Scan for documents from {{path}}": "从 {{path}} 扫描文档",
 	"Search": "搜索",
 	"Search a model": "搜索模型",
-	"Search Chats": "搜索聊天",
+	"Search Chats": "搜索对话",
 	"Search Documents": "搜索文档",
 	"Search Models": "搜索模型",
 	"Search Prompts": "搜索提示词",
 	"Search Result Count": "搜索结果数量",
-	"Searched {{count}} sites_other": "搜索 {{count}} 个网站_other",
-	"Searching the web for '{{searchQuery}}'": "搜索 '{{searchQuery}}' 在网络中",
+	"Searched {{count}} sites_other": "搜索 {{count}} 个网站",
+	"Searching the web for '{{searchQuery}}'": "在网络中搜索 '{{searchQuery}}' ",
 	"Searxng Query URL": "Searxng 查询 URL",
 	"See readme.md for instructions": "查看 readme.md 以获取说明",
-	"See what's new": "查看最新内容",
-	"Seed": "种子",
+	"See what's new": "查阅最新更新内容",
+	"Seed": "种子 (Seed)",
 	"Select a base model": "选择一个基础模型",
 	"Select a mode": "选择一个模式",
 	"Select a model": "选择一个模型",
@@ -408,7 +410,7 @@
 	"Select a pipeline url": "选择一个管道 URL",
 	"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": "发送消息",
@@ -418,22 +420,22 @@
 	"Server connection verified": "已验证服务器连接",
 	"Set as default": "设为默认",
 	"Set Default Model": "设置默认模型",
-	"Set embedding model (e.g. {{model}})": "设置嵌入模型(例如 {{model}})",
-	"Set Image Size": "设置图片大小",
+	"Set embedding model (e.g. {{model}})": "设置语义向量模型 (例如:{{model}})",
+	"Set Image Size": "设置图片分辨率",
 	"Set Model": "设置模型",
-	"Set reranking model (e.g. {{model}})": "设置重排模型(例如 {{model}})",
+	"Set reranking model (e.g. {{model}})": "设置重排模型 (例如:{{model}})",
 	"Set Steps": "设置步骤",
 	"Set Task Model": "设置任务模型",
-	"Set Voice": "设置音",
+	"Set Voice": "设置音",
 	"Settings": "设置",
 	"Settings saved successfully!": "设置已保存",
 	"Share": "分享",
-	"Share Chat": "分享聊天",
+	"Share Chat": "分享对话",
 	"Share to OpenWebUI Community": "分享到 OpenWebUI 社区",
 	"short-summary": "简短总结",
 	"Show": "显示",
 	"Show shortcuts": "显示快捷方式",
-	"Showcased creativity": "展示创意",
+	"Showcased creativity": "显示出较强的创造力",
 	"sidebar": "侧边栏",
 	"Sign in": "登录",
 	"Sign Out": "登出",
@@ -441,40 +443,40 @@
 	"Signing in": "正在登录",
 	"Source": "来源",
 	"Speech recognition error: {{error}}": "语音识别错误:{{error}}",
-	"Speech-to-Text Engine": "语音转文引擎",
+	"Speech-to-Text Engine": "语音转文引擎",
 	"SpeechRecognition API is not supported in this browser.": "此浏览器不支持 SpeechRecognition API。",
-	"Stop Sequence": "停止序列",
-	"STT Settings": "语音转文设置",
+	"Stop Sequence": "停止序列 (Stop Sequence)",
+	"STT Settings": "语音转文设置",
 	"Submit": "提交",
-	"Subtitle (e.g. about the Roman Empire)": "副标题(如关于罗马帝国的副标题)",
+	"Subtitle (e.g. about the Roman Empire)": "副标题(关于罗马帝国的副标题)",
 	"Success": "成功",
 	"Successfully updated.": "成功更新。",
 	"Suggested": "建议",
 	"System": "系统",
-	"System Prompt": "系统提示",
+	"System Prompt": "系统提示",
 	"Tags": "标签",
-	"Tell us more:": "告诉我们更多信息",
-	"Temperature": "温度",
+	"Tell us more:": "请告诉我们更多细节",
+	"Temperature": "温度 (Temperature)",
 	"Template": "模板",
 	"Text Completion": "文本完成",
 	"Text-to-Speech Engine": "文本转语音引擎",
 	"Tfs Z": "Tfs Z",
-	"Thanks for your feedback!": "感谢的反馈!",
+	"Thanks for your feedback!": "感谢的反馈!",
 	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "分值应介于 0.0(0%)和 1.0(100%)之间。",
 	"Theme": "主题",
-	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "这确保了您宝贵的对话被安全保存到后端数据库中。谢谢!",
+	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "这将确保您的宝贵对话被安全地保存到后台数据库中。感谢!",
 	"This setting does not sync across browsers or devices.": "此设置不会在浏览器或设备之间同步。",
 	"Thorough explanation": "详尽的解释",
-	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "提示:在每次替换后,在聊天输入中按 Tab 键可以连续更新多个变量。",
+	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "提示:在每次替换后,在对话输入中按 Tab 键可以连续更新多个变量。",
 	"Title": "标题",
-	"Title (e.g. Tell me a fun fact)": "标题(例如 告诉我一个有趣的事实)",
-	"Title Auto-Generation": "标题自动生成",
+	"Title (e.g. Tell me a fun fact)": "标题(例如 给我讲一个有趣的事实)",
+	"Title Auto-Generation": "自动生成标题",
 	"Title cannot be an empty string.": "标题不能为空字符串。",
-	"Title Generation Prompt": "自动生成标题的提示词",
+	"Title Generation Prompt": "用于自动生成标题的提示词",
 	"to": "到",
 	"To access the available model names for downloading,": "要访问可下载的模型名称,",
 	"To access the GGUF models available for downloading,": "要访问可下载的 GGUF 模型,",
-	"to chat input.": "到聊天输入。",
+	"to chat input.": "到对话输入。",
 	"Today": "今天",
 	"Toggle settings": "切换设置",
 	"Toggle sidebar": "切换侧边栏",
@@ -484,7 +486,7 @@
 	"TTS Settings": "文本转语音设置",
 	"Type": "类型",
 	"Type Hugging Face Resolve (Download) URL": "输入 Hugging Face 解析(下载)URL",
-	"Uh-oh! There was an issue connecting to {{provider}}.": "哎呀!连接到{{provider}}时出现问题。",
+	"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": "更新密码",
@@ -492,10 +494,10 @@
 	"Upload Files": "上传文件",
 	"Upload Progress": "上传进度",
 	"URL Mode": "URL 模式",
-	"Use '#' in the prompt input to load and select your documents.": "在提示输入中使用'#'来加载和选择你的文档。",
-	"Use Gravatar": "使用 Gravatar",
-	"Use Initials": "使用首字母缩写",
-	"use_mlock (Ollama)": "use_mlock(奥拉马)",
+	"Use '#' in the prompt input to load and select your documents.": "在输入框中输入'#'号来选择并附带你的文档。",
+	"Use Gravatar": "使用来自 Gravatar 的头像",
+	"Use Initials": "使用首个字符作为头像",
+	"use_mlock (Ollama)": "use_mlock(Ollama)",
 	"use_mmap (Ollama)": "use_mmap (Ollama)",
 	"user": "用户",
 	"User Permissions": "用户权限",
@@ -506,29 +508,29 @@
 	"variable to have them replaced with clipboard content.": "变量将被剪贴板内容替换。",
 	"Version": "版本",
 	"Warning": "警告",
-	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "警告: 如果更新或更改 embedding 模型,则需要重新导入所有文档。",
+	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "警告:如果您修改了语义向量模型,则需要重新导入所有文档。",
 	"Web": "网页",
-	"Web Loader Settings": "Web 加载器设置",
-	"Web Params": "Web 参数",
-	"Web Search": "Web 搜索",
+	"Web Loader Settings": "网页爬取设置",
+	"Web Params": "网络爬取设置",
+	"Web Search": "网络搜索",
 	"Web Search Engine": "Web 搜索引擎",
 	"Webhook URL": "Webhook URL",
-	"WebUI Add-ons": "WebUI 件",
+	"WebUI Add-ons": "WebUI 附加组件",
 	"WebUI Settings": "WebUI 设置",
 	"WebUI will make requests to": "WebUI 将请求",
-	"What’s New in": "最新变化",
-	"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "当历史记录被关闭时,这个浏览器上的新聊天不会出现在你任何设备的历史记录中。",
+	"What’s New in": "最近更新内容于",
+	"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "当关闭历史记录功能时,在此浏览器上新的对话记录将不会同步到您其他设备的历史记录中。",
 	"Whisper (Local)": "Whisper(本地)",
 	"Workspace": "工作空间",
-	"Write a prompt suggestion (e.g. Who are you?)": "写一个提示建议(例如:你是谁?)",
+	"Write a prompt suggestion (e.g. Who are you?)": "写一个提示建议(例如:你是谁?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "用 50 个字写一个总结 [主题或关键词]。",
 	"Yesterday": "昨天",
 	"You": "你",
-	"You cannot clone a base model": "你不能克隆基础模型",
-	"You have no archived conversations.": "你没有档的对话。",
-	"You have shared this chat": "你分享了这次聊天",
+	"You cannot clone a base model": "你不能复制基础模型",
+	"You have no archived conversations.": "你没有已归档的对话。",
+	"You have shared this chat": "你之前已经分享过此",
 	"You're a helpful assistant.": "你是一个有帮助的助手。",
 	"You're now logged in.": "已登录。",
-	"Youtube": "Youtube",
-	"Youtube Loader Settings": "Youtube 加载器设置"
+	"Youtube": "YouTube",
+	"Youtube Loader Settings": "YouTube 爬取设置"
 }

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

@@ -37,6 +37,7 @@
 	"All Users": "所有使用者",
 	"Allow": "允許",
 	"Allow Chat Deletion": "允許刪除聊天紀錄",
+	"Allow non-local voices": "",
 	"alphanumeric characters and hyphens": "英文字母、數字(0~9)和連字符(-)",
 	"Already have an account?": "已經有帳號了嗎?",
 	"an assistant": "助手",
@@ -206,6 +207,7 @@
 	"Experimental": "實驗功能",
 	"Export": "出口",
 	"Export All Chats (All Users)": "匯出所有聊天紀錄(所有使用者)",
+	"Export chat (.json)": "",
 	"Export Chats": "匯出聊天紀錄",
 	"Export Documents Mapping": "匯出文件映射",
 	"Export Models": "匯出模型",

+ 1 - 0
src/lib/stores/index.ts

@@ -111,6 +111,7 @@ type AudioSettings = {
 	TTSEngine?: string;
 	speaker?: string;
 	model?: string;
+	nonLocalVoices?: boolean;
 };
 
 type TitleSettings = {