浏览代码

Merge branch 'dev' into feate-webloader-support-proxy

Guofeng Yi 2 月之前
父节点
当前提交
b38acc8559

+ 13 - 0
CHANGELOG.md

@@ -5,6 +5,19 @@ 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.5.12] - 2025-02-13
+
+### Added
+
+- **🛠️ Multiple Tool Calls Support for Native Function Mode**: Functions now can call multiple tools within a single response, unlocking better automation and workflow flexibility when using native function calling.
+
+### Fixed
+
+- **📝 Playground Text Completion Restored**: Addressed an issue where text completion in the Playground was not functioning.
+- **🔗 Direct Connections Now Work for Regular Users**: Fixed a bug where users with the 'user' role couldn't establish direct API connections, enabling seamless model usage for all user tiers.
+- **⚡ Landing Page Input No Longer Lags with Long Text**: Improved input responsiveness on the landing page, ensuring fast and smooth typing experiences even when entering long messages.
+- **🔧 Parameter in Functions Fixed**: Fixed an issue where the reserved parameters wasn’t recognized within functions, restoring full functionality for advanced task-based automation.
+
 ## [0.5.11] - 2025-02-13
 
 ### Added

+ 6 - 6
backend/open_webui/main.py

@@ -349,12 +349,12 @@ class SPAStaticFiles(StaticFiles):
 
 print(
     rf"""
-  ___                    __        __   _     _   _ ___
- / _ \ _ __   ___ _ __   \ \      / /__| |__ | | | |_ _|
-| | | | '_ \ / _ \ '_ \   \ \ /\ / / _ \ '_ \| | | || |
-| |_| | |_) |  __/ | | |   \ V  V /  __/ |_) | |_| || |
- \___/| .__/ \___|_| |_|    \_/\_/ \___|_.__/ \___/|___|
-      |_|
+ ██████╗ ██████╗ ███████╗███╗   ██╗    ██╗    ██╗███████╗██████╗ ██╗   ██╗██╗
+██╔═══██╗██╔══██╗██╔════╝████╗  ██║    ██║    ██║██╔════╝██╔══██╗██║   ██║██║
+██║   ██║██████╔╝█████╗  ██╔██╗ ██║    ██║ █╗ ██║█████╗  ██████╔╝██║   ██║██║
+██║   ██║██╔═══╝ ██╔══╝  ██║╚██╗██║    ██║███╗██║██╔══╝  ██╔══██╗██║   ██║██║
+╚██████╔╝██║     ███████╗██║ ╚████║    ╚███╔███╔╝███████╗██████╔╝╚██████╔╝██║
+ ╚═════╝ ╚═╝     ╚══════╝╚═╝  ╚═══╝     ╚══╝╚══╝ ╚══════╝╚═════╝  ╚═════╝ ╚═╝
 
 
 v{VERSION} - building the best open-source AI user interface.

+ 10 - 3
backend/open_webui/retrieval/web/tavily.py

@@ -1,4 +1,5 @@
 import logging
+from typing import Optional
 
 import requests
 from open_webui.retrieval.web.main import SearchResult
@@ -8,7 +9,13 @@ log = logging.getLogger(__name__)
 log.setLevel(SRC_LOG_LEVELS["RAG"])
 
 
-def search_tavily(api_key: str, query: str, count: int) -> list[SearchResult]:
+def search_tavily(
+    api_key: str,
+    query: str,
+    count: int,
+    filter_list: Optional[list[str]] = None,
+    # **kwargs,
+) -> list[SearchResult]:
     """Search using Tavily's Search API and return the results as a list of SearchResult objects.
 
     Args:
@@ -20,8 +27,8 @@ def search_tavily(api_key: str, query: str, count: int) -> list[SearchResult]:
     """
     url = "https://api.tavily.com/search"
     data = {"query": query, "api_key": api_key}
-
-    response = requests.post(url, json=data)
+    include_domain = filter_list
+    response = requests.post(url, include_domain, json=data)
     response.raise_for_status()
 
     json_response = response.json()

+ 48 - 1
backend/open_webui/retrieval/web/utils.py

@@ -3,7 +3,8 @@ import aiohttp
 import asyncio
 import urllib.parse
 import validators
-from typing import Union, Sequence, Iterator, Dict
+from typing import Any, AsyncIterator, Dict, Iterator, List, Sequence, Union
+
 
 from langchain_community.document_loaders import (
     WebBaseLoader,
@@ -109,6 +110,32 @@ class SafeWebBaseLoader(WebBaseLoader):
                         await asyncio.sleep(cooldown * backoff**i)
         raise ValueError("retry count exceeded")
 
+    def _unpack_fetch_results(
+        self, results: Any, urls: List[str], parser: Union[str, None] = None
+    ) -> List[Any]:
+        """Unpack fetch results into BeautifulSoup objects."""
+        from bs4 import BeautifulSoup
+
+        final_results = []
+        for i, result in enumerate(results):
+            url = urls[i]
+            if parser is None:
+                if url.endswith(".xml"):
+                    parser = "xml"
+                else:
+                    parser = self.default_parser
+                self._check_parser(parser)
+            final_results.append(BeautifulSoup(result, parser, **self.bs_kwargs))
+        return final_results
+
+    async def ascrape_all(
+        self, urls: List[str], parser: Union[str, None] = None
+    ) -> List[Any]:
+        """Async fetch all urls, then return soups for all results."""
+        results = await self.fetch_all(urls)
+        return self._unpack_fetch_results(results, urls, parser=parser)
+
+
     def lazy_load(self) -> Iterator[Document]:
         """Lazy load text from the url(s) in web_path with error handling."""
         for path in self.web_paths:
@@ -132,6 +159,26 @@ class SafeWebBaseLoader(WebBaseLoader):
                 # Log the error and continue with the next URL
                 log.error(f"Error loading {path}: {e}")
 
+    async def alazy_load(self) -> AsyncIterator[Document]:
+        """Async lazy load text from the url(s) in web_path."""
+        results = await self.ascrape_all(self.web_paths)
+        for path, soup in zip(self.web_paths, results):
+            text = soup.get_text(**self.bs_get_text_kwargs)
+            metadata = {"source": path}
+            if title := soup.find("title"):
+                metadata["title"] = title.get_text()
+            if description := soup.find("meta", attrs={"name": "description"}):
+                metadata["description"] = description.get(
+                    "content", "No description found."
+                )
+            if html := soup.find("html"):
+                metadata["language"] = html.get("lang", "No language found.")
+            yield Document(page_content=text, metadata=metadata)
+
+    async def aload(self) -> list[Document]:
+        """Load data into Document objects."""
+        return [document async for document in self.alazy_load()]
+
 
 def get_web_loader(
     urls: Union[str, Sequence[str]],

+ 11 - 4
backend/open_webui/routers/retrieval.py

@@ -21,6 +21,7 @@ from fastapi import (
     APIRouter,
 )
 from fastapi.middleware.cors import CORSMiddleware
+from fastapi.concurrency import run_in_threadpool
 from pydantic import BaseModel
 import tiktoken
 
@@ -1313,7 +1314,7 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]:
 
 
 @router.post("/process/web/search")
-def process_web_search(
+async def process_web_search(
     request: Request, form_data: SearchForm, user=Depends(get_verified_user)
 ):
     try:
@@ -1347,15 +1348,21 @@ def process_web_search(
             requests_per_second=request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
             trust_env=request.app.state.config.RAG_WEB_SEARCH_TRUST_ENV,
         )
-        docs = loader.load()
-        save_docs_to_vector_db(
-            request, docs, collection_name, overwrite=True, user=user
+        docs = await loader.aload()
+        await run_in_threadpool(
+            save_docs_to_vector_db,
+            request,
+            docs,
+            collection_name,
+            overwrite=True,
+            user=user,
         )
 
         return {
             "status": True,
             "collection_name": collection_name,
             "filenames": urls,
+            "loaded_count": len(docs),
         }
     except Exception as e:
         log.exception(e)

+ 9 - 15
backend/open_webui/utils/middleware.py

@@ -334,21 +334,15 @@ async def chat_web_search_handler(
 
     try:
 
-        # Offload process_web_search to a separate thread
-        loop = asyncio.get_running_loop()
-        with ThreadPoolExecutor() as executor:
-            results = await loop.run_in_executor(
-                executor,
-                lambda: process_web_search(
-                    request,
-                    SearchForm(
-                        **{
-                            "query": searchQuery,
-                        }
-                    ),
-                    user,
-                ),
-            )
+        results = await process_web_search(
+            request,
+            SearchForm(
+                **{
+                    "query": searchQuery,
+                }
+            ),
+            user,
+        )
 
         if results:
             await event_emitter(

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

@@ -33,10 +33,7 @@
 	$: (async () => {
 		if (content) {
 			tokens = marked.lexer(
-				replaceTokens(processResponseContent(content), sourceIds, model?.name, $user?.name),
-				{
-					gfm: true
-				}
+				replaceTokens(processResponseContent(content), sourceIds, model?.name, $user?.name)
 			);
 		}
 	})();

+ 3 - 9
src/lib/components/chat/Messages/Markdown/MarkdownInlineTokens.svelte

@@ -44,13 +44,9 @@
 	{:else if token.type === 'image'}
 		<Image src={token.href} alt={token.text} />
 	{:else if token.type === 'strong'}
-		<strong>
-			<svelte:self id={`${id}-strong`} tokens={token.tokens} {onSourceClick} />
-		</strong>
+		<strong><svelte:self id={`${id}-strong`} tokens={token.tokens} {onSourceClick} /></strong>
 	{:else if token.type === 'em'}
-		<em>
-			<svelte:self id={`${id}-em`} tokens={token.tokens} {onSourceClick} />
-		</em>
+		<em><svelte:self id={`${id}-em`} tokens={token.tokens} {onSourceClick} /></em>
 	{:else if token.type === 'codespan'}
 		<!-- svelte-ignore a11y-click-events-have-key-events -->
 		<!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
@@ -64,9 +60,7 @@
 	{:else if token.type === 'br'}
 		<br />
 	{:else if token.type === 'del'}
-		<del>
-			<svelte:self id={`${id}-del`} tokens={token.tokens} {onSourceClick} />
-		</del>
+		<del><svelte:self id={`${id}-del`} tokens={token.tokens} {onSourceClick} /></del>
 	{:else if token.type === 'inlineKatex'}
 		{#if token.text}
 			<KatexRenderer content={token.text} displayMode={false} />

+ 0 - 5
src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte

@@ -238,11 +238,6 @@
 				{/each}
 			</ul>
 		{/if}
-	{:else if token.type === 'list_item'}
-		{JSON.stringify(token)}
-		<p>
-			<MarkdownInlineTokens id={`${id}-${tokenIdx}-li`} tokens={token.tokens} {onSourceClick} />
-		</p>
 	{:else if token.type === 'details'}
 		<Collapsible title={token.summary} attributes={token?.attributes} className="w-full space-y-1">
 			<div class=" mb-1.5" slot="content">

+ 1 - 4
src/lib/components/common/RichTextInput.svelte

@@ -53,10 +53,7 @@
 
 	// Function to find the next template in the document
 	function findNextTemplate(doc, from = 0) {
-		const patterns = [
-			{ start: '[', end: ']' },
-			{ start: '{{', end: '}}' }
-		];
+		const patterns = [{ start: '{{', end: '}}' }];
 
 		let result = null;
 

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

@@ -5,7 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(esim. `sh webui.sh --api`)",
 	"(latest)": "(uusin)",
 	"{{ models }}": "{{ mallit }}",
-	"{{COUNT}} Replies": "",
+	"{{COUNT}} Replies": "{{COUNT}} vastausta",
 	"{{user}}'s Chats": "{{user}}:n keskustelut",
 	"{{webUIName}} Backend Required": "{{webUIName}}-backend vaaditaan",
 	"*Prompt node ID(s) are required for image generation": "Kuvan luomiseen vaaditaan kehote-solmun ID(t)",
@@ -29,13 +29,13 @@
 	"Add Arena Model": "Lisää Arena-malli",
 	"Add Connection": "Lisää yhteys",
 	"Add Content": "Lisää sisältöä",
-	"Add content here": "",
+	"Add content here": "Lisää sisältöä tähän",
 	"Add custom prompt": "Lisää mukautettu kehote",
 	"Add Files": "Lisää tiedostoja",
 	"Add Group": "Lisää ryhmä",
 	"Add Memory": "Lisää muistia",
 	"Add Model": "Lisää malli",
-	"Add Reaction": "",
+	"Add Reaction": "Lisää reaktio",
 	"Add Tag": "Lisää tagi",
 	"Add Tags": "Lisää tageja",
 	"Add text content": "Lisää tekstisisältöä",
@@ -51,7 +51,7 @@
 	"Advanced Params": "Edistyneet parametrit",
 	"All Documents": "Kaikki asiakirjat",
 	"All models deleted successfully": "Kaikki mallit poistettu onnistuneesti",
-	"Allow Chat Controls": "",
+	"Allow Chat Controls": "Salli keskustelujen hallinta",
 	"Allow Chat Delete": "Salli keskustelujen poisto",
 	"Allow Chat Deletion": "Salli keskustelujen poisto",
 	"Allow Chat Edit": "Salli keskustelujen muokkaus",
@@ -60,21 +60,21 @@
 	"Allow Temporary Chat": "Salli väliaikaiset keskustelut",
 	"Allow User Location": "Salli käyttäjän sijainti",
 	"Allow Voice Interruption in Call": "Salli äänen keskeytys puhelussa",
-	"Allowed Endpoints": "",
+	"Allowed Endpoints": "Hyväksytyt päätepisteet",
 	"Already have an account?": "Onko sinulla jo tili?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Vaihtoehto top_p:lle, jolla pyritään varmistamaan laadun ja monipuolisuuden tasapaino. Parametri p edustaa pienintä todennäköisyyttä, jolla token otetaan huomioon suhteessa todennäköisimpään tokeniin. Esimerkiksi p=0.05 ja todennäköisin token todennäköisyydellä 0.9, arvoltaan alle 0.045 olevat logit suodatetaan pois. (Oletus: 0.0)",
-	"Always": "",
+	"Always": "Aina",
 	"Amazing": "Hämmästyttävä",
 	"an assistant": "avustaja",
-	"Analyzed": "",
-	"Analyzing...": "",
+	"Analyzed": "Analysoitu",
+	"Analyzing...": "Analysoidaan..",
 	"and": "ja",
 	"and {{COUNT}} more": "ja {{COUNT}} muuta",
 	"and create a new shared link.": "ja luo uusi jaettu linkki.",
 	"API Base URL": "APIn perus-URL",
 	"API Key": "API-avain",
 	"API Key created.": "API-avain luotu.",
-	"API Key Endpoint Restrictions": "",
+	"API Key Endpoint Restrictions": "API-avaimen päätepiste rajoitukset",
 	"API keys": "API-avaimet",
 	"Application DN": "Sovelluksen DN",
 	"Application DN Password": "Sovelluksen DN-salasana",
@@ -84,8 +84,8 @@
 	"Archive All Chats": "Arkistoi kaikki keskustelut",
 	"Archived Chats": "Arkistoidut keskustelut",
 	"archived-chat-export": "arkistoitu-keskustelu-vienti",
-	"Are you sure you want to delete this channel?": "",
-	"Are you sure you want to delete this message?": "",
+	"Are you sure you want to delete this channel?": "Haluatko varmasti poistaa tämän kanavan?",
+	"Are you sure you want to delete this message?": "Haluatko varmasti poistaa tämän viestin?",
 	"Are you sure you want to unarchive all archived chats?": "Haluatko varmasti purkaa kaikkien arkistoitujen keskustelujen arkistoinnin?",
 	"Are you sure?": "Oletko varma?",
 	"Arena Models": "Arena-mallit",
@@ -132,11 +132,11 @@
 	"Camera": "Kamera",
 	"Cancel": "Peruuta",
 	"Capabilities": "Ominaisuuksia",
-	"Capture": "",
+	"Capture": "Näyttökuva",
 	"Certificate Path": "Varmennepolku",
 	"Change Password": "Vaihda salasana",
-	"Channel Name": "",
-	"Channels": "",
+	"Channel Name": "Kanavan nimi",
+	"Channels": "Kanavat",
 	"Character": "Hahmo",
 	"Character limit for autocomplete generation input": "Automaattisen täydennyksen syötteen merkkiraja",
 	"Chart new frontiers": "Kartoita uusia rajapintoja",
@@ -165,7 +165,7 @@
 	"Click here to": "Klikkaa tästä",
 	"Click here to download user import template file.": "Lataa käyttäjien tuontipohjatiedosto klikkaamalla tästä.",
 	"Click here to learn more about faster-whisper and see the available models.": "Klikkaa tästä oppiaksesi lisää faster-whisperista ja nähdäksesi saatavilla olevat mallit.",
-	"Click here to see available models.": "",
+	"Click here to see available models.": "Klikkaa tästä nädäksesi saatavilla olevat mallit.",
 	"Click here to select": "Klikkaa tästä valitaksesi",
 	"Click here to select a csv file.": "Klikkaa tästä valitaksesi CSV-tiedosto.",
 	"Click here to select a py file.": "Klikkaa tästä valitaksesi py-tiedosto.",
@@ -174,14 +174,14 @@
 	"Click on the user role button to change a user's role.": "Klikkaa käyttäjän roolipainiketta vaihtaaksesi käyttäjän roolia.",
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Leikepöydälle kirjoitusoikeus evätty. Tarkista selaimesi asetukset ja myönnä tarvittavat käyttöoikeudet.",
 	"Clone": "Kloonaa",
-	"Clone Chat": "",
-	"Clone of {{TITLE}}": "",
+	"Clone Chat": "Kloonaa keskustelu",
+	"Clone of {{TITLE}}": "{{TITLE}} klooni",
 	"Close": "Sulje",
 	"Code execution": "Koodin suorittaminen",
 	"Code formatted successfully": "Koodin muotoilu onnistui",
-	"Code Interpreter": "",
-	"Code Interpreter Engine": "",
-	"Code Interpreter Prompt Template": "",
+	"Code Interpreter": "Ohjelmatulkki",
+	"Code Interpreter Engine": "Ohjelmatulkin moottori",
+	"Code Interpreter Prompt Template": "Ohjelmatulkin kehotemalli",
 	"Collection": "Kokoelma",
 	"Color": "Väri",
 	"ComfyUI": "ComfyUI",
@@ -197,7 +197,7 @@
 	"Confirm": "Vahvista",
 	"Confirm Password": "Vahvista salasana",
 	"Confirm your action": "Vahvista toimintasi",
-	"Confirm your new password": "",
+	"Confirm your new password": "Vahvista uusi salasanasi",
 	"Connect to your own OpenAI compatible API endpoints.": "",
 	"Connections": "Yhteydet",
 	"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "",
@@ -227,7 +227,7 @@
 	"Create a model": "Luo malli",
 	"Create Account": "Luo tili",
 	"Create Admin Account": "Luo ylläpitäjätili",
-	"Create Channel": "",
+	"Create Channel": "Luo kanava",
 	"Create Group": "Luo ryhmä",
 	"Create Knowledge": "Luo tietoa",
 	"Create new key": "Luo uusi avain",
@@ -264,7 +264,7 @@
 	"Delete chat?": "Haluatko varmasti poistaa tämän keskustelun?",
 	"Delete folder?": "Haluatko varmasti poistaa tämän kansion?",
 	"Delete function?": "Haluatko varmasti poistaa tämän toiminnon?",
-	"Delete Message": "",
+	"Delete Message": "Poista viesti",
 	"Delete prompt?": "Haluatko varmasti poistaa tämän kehotteen?",
 	"delete this link": "poista tämä linkki",
 	"Delete tool?": "Haluatko varmasti poistaa tämän työkalun?",
@@ -275,9 +275,9 @@
 	"Describe your knowledge base and objectives": "Kuvaa tietokantasi ja tavoitteesi",
 	"Description": "Kuvaus",
 	"Didn't fully follow instructions": "Ei noudattanut ohjeita täysin",
-	"Direct Connections": "",
-	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "",
-	"Direct Connections settings updated": "",
+	"Direct Connections": "Suorat yhteydet",
+	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Suorat yhteydet mahdollistavat käyttäjien yhdistää omia OpenAI-yhteensopivia API-päätepisteitä.",
+	"Direct Connections settings updated": "Suorien yhteyksien asetukset päivitetty",
 	"Disabled": "Ei käytössä",
 	"Discover a function": "Löydä toiminto",
 	"Discover a model": "Tutustu malliin",
@@ -300,7 +300,7 @@
 	"Documentation": "Dokumentaatio",
 	"Documents": "Asiakirjat",
 	"does not make any external connections, and your data stays securely on your locally hosted server.": "ei tee ulkoisia yhteyksiä, ja tietosi pysyvät turvallisesti paikallisesti isännöidyllä palvelimellasi.",
-	"Domain Filter List": "",
+	"Domain Filter List": "Verkko-osoitteiden suodatuslista",
 	"Don't have an account?": "Eikö sinulla ole tiliä?",
 	"don't install random functions from sources you don't trust.": "älä asenna satunnaisia toimintoja lähteistä, joihin et luota.",
 	"don't install random tools from sources you don't trust.": "älä asenna satunnaisia työkaluja lähteistä, joihin et luota.",
@@ -321,7 +321,7 @@
 	"e.g. Tools for performing various operations": "esim. työkaluja erilaisten toimenpiteiden suorittamiseen",
 	"Edit": "Muokkaa",
 	"Edit Arena Model": "Muokkaa Arena-mallia",
-	"Edit Channel": "",
+	"Edit Channel": "Muokkaa kanavaa",
 	"Edit Connection": "Muokkaa yhteyttä",
 	"Edit Default Permissions": "Muokkaa oletuskäyttöoikeuksia",
 	"Edit Memory": "Muokkaa muistia",
@@ -336,9 +336,9 @@
 	"Embedding model set to \"{{embedding_model}}\"": "\"{{embedding_model}}\" valittu upotusmalliksi",
 	"Enable API Key": "",
 	"Enable autocomplete generation for chat messages": "Ota automaattinen täydennys käyttöön keskusteluviesteissä",
-	"Enable Code Interpreter": "",
+	"Enable Code Interpreter": "Ota ohjelmatulkki käyttöön",
 	"Enable Community Sharing": "Ota yhteisön jakaminen käyttöön",
-	"Enable Google Drive": "",
+	"Enable Google Drive": "Salli Google Drive",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Ota Memory Locking (mlock) käyttöön estääksesi mallidatan vaihtamisen pois RAM-muistista. Tämä lukitsee mallin työsivut RAM-muistiin, varmistaen että niitä ei vaihdeta levylle. Tämä voi parantaa suorituskykyä välttämällä sivuvikoja ja varmistamalla nopean tietojen käytön.",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Ota Memory Mapping (mmap) käyttöön ladataksesi mallidataa. Tämä vaihtoehto sallii järjestelmän käyttää levytilaa RAM-laajennuksena käsittelemällä levytiedostoja kuin ne olisivat RAM-muistissa. Tämä voi parantaa mallin suorituskykyä sallimalla nopeamman tietojen käytön. Kuitenkin se ei välttämättä toimi oikein kaikissa järjestelmissä ja voi kuluttaa huomattavasti levytilaa.",
 	"Enable Message Rating": "Ota viestiarviointi käyttöön",
@@ -362,7 +362,7 @@
 	"Enter Chunk Overlap": "Syötä osien päällekkäisyys",
 	"Enter Chunk Size": "Syötä osien koko",
 	"Enter description": "Kirjoita kuvaus",
-	"Enter domains separated by commas (e.g., example.com,site.org)": "",
+	"Enter domains separated by commas (e.g., example.com,site.org)": "Verkko-osoitteet erotetaan pilkulla (esim. esimerkki.com,sivu.org",
 	"Enter Exa API Key": "",
 	"Enter Github Raw URL": "Kirjoita Github Raw -URL-osoite",
 	"Enter Google PSE API Key": "Kirjoita Google PSE API -avain",
@@ -398,12 +398,12 @@
 	"Enter stop sequence": "Kirjoita lopetussekvenssi",
 	"Enter system prompt": "Kirjoita järjestelmäkehote",
 	"Enter Tavily API Key": "Kirjoita Tavily API -avain",
-	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
+	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Kirjoita julkinen WebUI verkko-osoitteesi. Verkko-osoitetta käytetään osoitteiden luontiin ilmoituksissa.",
 	"Enter Tika Server URL": "Kirjoita Tika Server URL",
 	"Enter Top K": "Kirjoita Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Kirjoita URL-osoite (esim. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Kirjoita URL-osoite (esim. http://localhost:11434)",
-	"Enter your current password": "",
+	"Enter your current password": "Kirjoita nykyinen salasanasi",
 	"Enter Your Email": "Kirjoita sähköpostiosoitteesi",
 	"Enter Your Full Name": "Kirjoita koko nimesi",
 	"Enter your message": "Kirjoita viestisi",
@@ -411,7 +411,7 @@
 	"Enter Your Password": "Kirjoita salasanasi",
 	"Enter Your Role": "Kirjoita roolisi",
 	"Enter Your Username": "Kirjoita käyttäjätunnuksesi",
-	"Enter your webhook URL": "",
+	"Enter your webhook URL": "Kirjoita webhook osoitteesi",
 	"Error": "Virhe",
 	"ERROR": "VIRHE",
 	"Error accessing Google Drive: {{error}}": "",
@@ -424,7 +424,7 @@
 	"Example: ou=users,dc=foo,dc=example": "Esimerkki: ou=käyttäjät,dc=foo,dc=example",
 	"Example: sAMAccountName or uid or userPrincipalName": "Esimerkki: sAMAccountName tai uid tai userPrincipalName",
 	"Exclude": "Jätä pois",
-	"Execute code for analysis": "",
+	"Execute code for analysis": "Suorita koodi analysointia varten",
 	"Experimental": "Kokeellinen",
 	"Explore the cosmos": "Tutki avaruutta",
 	"Export": "Vie",
@@ -442,12 +442,12 @@
 	"External Models": "Ulkoiset mallit",
 	"Failed to add file.": "Tiedoston lisääminen epäonnistui.",
 	"Failed to create API Key.": "API-avaimen luonti epäonnistui.",
-	"Failed to fetch models": "",
+	"Failed to fetch models": "Mallien hakeminen epäonnistui",
 	"Failed to read clipboard contents": "Leikepöydän sisällön lukeminen epäonnistui",
 	"Failed to save models configuration": "Mallien määrityksen tallentaminen epäonnistui",
 	"Failed to update settings": "Asetusten päivittäminen epäonnistui",
 	"Failed to upload file.": "Tiedoston lataaminen epäonnistui.",
-	"Features Permissions": "",
+	"Features Permissions": "Ominaisuuksien käyttöoikeudet",
 	"February": "helmikuu",
 	"Feedback History": "Palautehistoria",
 	"Feedbacks": "Palautteet",
@@ -459,7 +459,7 @@
 	"File not found.": "Tiedostoa ei löytynyt.",
 	"File removed successfully.": "Tiedosto poistettu onnistuneesti.",
 	"File size should not exceed {{maxSize}} MB.": "Tiedoston koko ei saa ylittää {{maxSize}} MB.",
-	"File uploaded successfully": "",
+	"File uploaded successfully": "Tiedosto ladattiin onnistuneesti",
 	"Files": "Tiedostot",
 	"Filter is now globally disabled": "Suodatin on nyt poistettu käytöstä globaalisti",
 	"Filter is now globally enabled": "Suodatin on nyt otettu käyttöön globaalisti",
@@ -492,7 +492,7 @@
 	"Functions imported successfully": "Toiminnot tuotu onnistuneesti",
 	"General": "Yleinen",
 	"General Settings": "Yleiset asetukset",
-	"Generate an image": "",
+	"Generate an image": "Luo kuva",
 	"Generate Image": "Luo kuva",
 	"Generating search query": "Luodaan hakukyselyä",
 	"Get started": "Aloita",
@@ -524,14 +524,14 @@
 	"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Vahvistan, että olen lukenut ja ymmärrän toimintani seuraukset. Olen tietoinen mielivaltaisen koodin suorittamiseen liittyvistä riskeistä ja olen varmistanut lähteen luotettavuuden.",
 	"ID": "Tunnus",
 	"Ignite curiosity": "Sytytä uteliaisuus",
-	"Image": "",
-	"Image Compression": "",
-	"Image Generation": "",
+	"Image": "Kuva",
+	"Image Compression": "Kuvan pakkaus",
+	"Image Generation": "Kuvagenerointi",
 	"Image Generation (Experimental)": "Kuvagenerointi (kokeellinen)",
 	"Image Generation Engine": "Kuvagenerointimoottori",
-	"Image Max Compression Size": "",
-	"Image Prompt Generation": "",
-	"Image Prompt Generation Prompt": "",
+	"Image Max Compression Size": "Kuvan enimmäispakkauskoko",
+	"Image Prompt Generation": "Kuvan kehote generointi",
+	"Image Prompt Generation Prompt": "Kuvan generoinnin kehote",
 	"Image Settings": "Kuva-asetukset",
 	"Images": "Kuvat",
 	"Import Chats": "Tuo keskustelut",
@@ -552,7 +552,7 @@
 	"Interface": "Käyttöliittymä",
 	"Invalid file format.": "Virheellinen tiedostomuoto.",
 	"Invalid Tag": "Virheellinen tagi",
-	"is typing...": "",
+	"is typing...": "Kirjoittaa...",
 	"January": "tammikuu",
 	"Jina API Key": "Jina API -avain",
 	"join our Discord for help.": "liity Discordiimme saadaksesi apua.",
@@ -574,7 +574,7 @@
 	"Knowledge deleted successfully.": "Tietokanta poistettu onnistuneesti.",
 	"Knowledge reset successfully.": "Tietokanta nollattu onnistuneesti.",
 	"Knowledge updated successfully": "Tietokanta päivitetty onnistuneesti",
-	"Kokoro.js (Browser)": "",
+	"Kokoro.js (Browser)": "Kokoro.js (selain)",
 	"Kokoro.js Dtype": "",
 	"Label": "Tunniste",
 	"Landing Page Mode": "Etusivun tila",
@@ -595,7 +595,7 @@
 	"Listening...": "Kuuntelee...",
 	"Llama.cpp": "",
 	"LLMs can make mistakes. Verify important information.": "Kielimallit voivat tehdä virheitä. Tarkista tärkeät tiedot.",
-	"Loading Kokoro.js...": "",
+	"Loading Kokoro.js...": "Ladataan Kokoro.js...",
 	"Local": "Paikallinen",
 	"Local Models": "Paikalliset mallit",
 	"Lost": "Mennyt",
@@ -605,8 +605,8 @@
 	"Make sure to export a workflow.json file as API format from ComfyUI.": "Muista viedä workflow.json-tiedosto API-muodossa ComfyUI:sta.",
 	"Manage": "Hallitse",
 	"Manage Arena Models": "Hallitse Arena-malleja",
-	"Manage Direct Connections": "",
-	"Manage Models": "",
+	"Manage Direct Connections": "Hallitse suoria yhteyksiä",
+	"Manage Models": "Hallitse malleja",
 	"Manage Ollama": "Hallitse Ollamaa",
 	"Manage Ollama API Connections": "Hallitse Ollama API -yhteyksiä",
 	"Manage OpenAI API Connections": "Hallitse OpenAI API -yhteyksiä",
@@ -657,11 +657,11 @@
 	"More": "Lisää",
 	"Name": "Nimi",
 	"Name your knowledge base": "Anna tietokannalle nimi",
-	"Native": "",
+	"Native": "Natiivi",
 	"New Chat": "Uusi keskustelu",
-	"New Folder": "",
+	"New Folder": "Uusi kansio",
 	"New Password": "Uusi salasana",
-	"new-channel": "",
+	"new-channel": "uusi-kanava",
 	"No content found": "Sisältöä ei löytynyt",
 	"No content to speak": "Ei puhuttavaa sisältöä",
 	"No distance available": "Etäisyyttä ei saatavilla",
@@ -685,8 +685,8 @@
 	"Not helpful": "Ei hyödyllinen",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Huomautus: Jos asetat vähimmäispistemäärän, haku palauttaa vain sellaiset asiakirjat, joiden pistemäärä on vähintään vähimmäismäärä.",
 	"Notes": "Muistiinpanot",
-	"Notification Sound": "",
-	"Notification Webhook": "",
+	"Notification Sound": "Ilmoitusääni",
+	"Notification Webhook": "Webhook ilmoitus",
 	"Notifications": "Ilmoitukset",
 	"November": "marraskuu",
 	"num_gpu (Ollama)": "num_gpu (Ollama)",
@@ -733,9 +733,9 @@
 	"PDF document (.pdf)": "PDF-asiakirja (.pdf)",
 	"PDF Extract Images (OCR)": "Poimi kuvat PDF:stä (OCR)",
 	"pending": "odottaa",
-	"Permission denied when accessing media devices": "Käyttöoikeus epäitty media-laitteille",
-	"Permission denied when accessing microphone": "Käyttöoikeus epäitty mikrofonille",
-	"Permission denied when accessing microphone: {{error}}": "Käyttöoikeus epäitty mikrofonille: {{error}}",
+	"Permission denied when accessing media devices": "Käyttöoikeus etty media-laitteille",
+	"Permission denied when accessing microphone": "Käyttöoikeus etty mikrofonille",
+	"Permission denied when accessing microphone: {{error}}": "Käyttöoikeus etty mikrofonille: {{error}}",
 	"Permissions": "Käyttöoikeudet",
 	"Personalization": "Personointi",
 	"Pin": "Kiinnitä",
@@ -749,11 +749,11 @@
 	"Plain text (.txt)": "Pelkkä teksti (.txt)",
 	"Playground": "Leikkipaikka",
 	"Please carefully review the following warnings:": "Tarkista huolellisesti seuraavat varoitukset:",
-	"Please do not close the settings page while loading the model.": "",
+	"Please do not close the settings page while loading the model.": "Älä sulje asetussivua mallin latautuessa.",
 	"Please enter a prompt": "Kirjoita kehote",
 	"Please fill in all fields.": "Täytä kaikki kentät.",
 	"Please select a model first.": "Valitse ensin malli.",
-	"Please select a model.": "",
+	"Please select a model.": "Valitse malli.",
 	"Please select a reason": "Valitse syy",
 	"Port": "Portti",
 	"Positive attitude": "Positiivinen asenne",
@@ -762,7 +762,7 @@
 	"Previous 30 days": "Edelliset 30 päivää",
 	"Previous 7 days": "Edelliset 7 päivää",
 	"Profile Image": "Profiilikuva",
-	"Prompt": "",
+	"Prompt": "Kehote",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Kehote (esim. Kerro hauska fakta Rooman valtakunnasta)",
 	"Prompt Content": "Kehotteen sisältö",
 	"Prompt created successfully": "Kehote luotu onnistuneesti",
@@ -778,10 +778,10 @@
 	"RAG Template": "RAG-malline",
 	"Rating": "Arviointi",
 	"Re-rank models by topic similarity": "Uudelleenjärjestä mallit aiheyhteyden mukaan",
-	"Read": "",
+	"Read": "Lue",
 	"Read Aloud": "Lue ääneen",
 	"Reasoning Effort": "",
-	"Record voice": "Nauhoita ääni",
+	"Record voice": "Nauhoita ään",
 	"Redirecting you to Open WebUI Community": "Ohjataan sinut OpenWebUI-yhteisöön",
 	"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "Vähentää merkityksetöntä sisältöä tuottavan todennäköisyyttä. Korkeampi arvo (esim. 100) antaa monipuolisempia vastauksia, kun taas alhaisempi arvo (esim. 10) on konservatiivisempi. (Oletus: 40)",
 	"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Viittaa itseen \"Käyttäjänä\" (esim. \"Käyttäjä opiskelee espanjaa\")",
@@ -795,7 +795,7 @@
 	"Rename": "Nimeä uudelleen",
 	"Reorder Models": "Uudelleenjärjestä malleja",
 	"Repeat Last N": "Toista viimeiset N",
-	"Reply in Thread": "",
+	"Reply in Thread": "Vastauksia ",
 	"Request Mode": "Pyyntötila",
 	"Reranking Model": "Uudelleenpisteytymismalli",
 	"Reranking model disabled": "Uudelleenpisteytymismalli poistettu käytöstä",
@@ -804,7 +804,7 @@
 	"Reset All Models": "Palauta kaikki mallit",
 	"Reset Upload Directory": "Palauta latauspolku",
 	"Reset Vector Storage/Knowledge": "Tyhjennä vektoritallennukset/tietämys",
-	"Reset view": "",
+	"Reset view": "Palauta näkymä",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Vastausilmoituksia ei voida ottaa käyttöön, koska verkkosivuston käyttöoikeudet on evätty. Myönnä tarvittavat käyttöoikeudet selaimesi asetuksista.",
 	"Response splitting": "Vastauksen jakaminen",
 	"Result": "Tulos",
@@ -836,13 +836,13 @@
 	"Search Knowledge": "Hae tietämystä",
 	"Search Models": "Hae malleja",
 	"Search options": "Hakuvaihtoehdot",
-	"Search Prompts": "Hae kehotteia",
+	"Search Prompts": "Hae kehotteita",
 	"Search Result Count": "Hakutulosten määrä",
-	"Search the internet": "",
+	"Search the internet": "Hae verkosta",
 	"Search Tools": "Hae työkaluja",
 	"SearchApi API Key": "SearchApi API -avain",
 	"SearchApi Engine": "SearchApi-moottori",
-	"Searched {{count}} sites": "",
+	"Searched {{count}} sites": "Etsitty {{count}} sivulta",
 	"Searching \"{{searchQuery}}\"": "Haetaan \"{{searchQuery}}\"",
 	"Searching Knowledge for \"{{searchQuery}}\"": "Haetaan tietämystä \"{{searchQuery}}\"",
 	"Searxng Query URL": "Searxng-kyselyn URL-osoite",
@@ -857,8 +857,8 @@
 	"Select a pipeline": "Valitse putki",
 	"Select a pipeline url": "Valitse putken URL-osoite",
 	"Select a tool": "Valitse työkalu",
-	"Select an auth method": "",
-	"Select an Ollama instance": "",
+	"Select an auth method": "Valitse kirjautumistapa",
+	"Select an Ollama instance": "Valitse Ollama instanssi",
 	"Select Engine": "Valitse moottori",
 	"Select Knowledge": "Valitse tietämys",
 	"Select model": "Valitse malli",
@@ -974,8 +974,8 @@
 	"This will delete all models including custom models and cannot be undone.": "Tämä poistaa kaikki mallit, mukaan lukien mukautetut mallit, eikä sitä voi peruuttaa.",
 	"This will reset the knowledge base and sync all files. Do you wish to continue?": "Tämä nollaa tietokannan ja synkronoi kaikki tiedostot. Haluatko jatkaa?",
 	"Thorough explanation": "Perusteellinen selitys",
-	"Thought for {{DURATION}}": "",
-	"Thought for {{DURATION}} seconds": "",
+	"Thought for {{DURATION}}": "Ajatteli {{DURATION}}",
+	"Thought for {{DURATION}} seconds": "Ajatteli {{DURATION}} sekunttia",
 	"Tika": "Tika",
 	"Tika Server URL required.": "Tika Server URL vaaditaan.",
 	"Tiktoken": "Tiktoken",
@@ -1013,7 +1013,7 @@
 	"Tools": "Työkalut",
 	"Tools Access": "Työkalujen käyttöoikeudet",
 	"Tools are a function calling system with arbitrary code execution": "Työkalut ovat toimintokutsuihin perustuva järjestelmä, joka sallii mielivaltaisen koodin suorittamisen",
-	"Tools Function Calling Prompt": "",
+	"Tools Function Calling Prompt": "Työkalujen kutsukehote",
 	"Tools have a function calling system that allows arbitrary code execution": "Työkaluilla on toimintokutsuihin perustuva järjestelmä, joka sallii mielivaltaisen koodin suorittamisen",
 	"Tools have a function calling system that allows arbitrary code execution.": "Työkalut sallivat mielivaltaisen koodin suorittamisen toimintokutsuilla.",
 	"Top K": "Top K",
@@ -1025,7 +1025,7 @@
 	"TTS Voice": "Puhesynteesiääni",
 	"Type": "Tyyppi",
 	"Type Hugging Face Resolve (Download) URL": "Kirjoita Hugging Face -resolve-latausosoite",
-	"Uh-oh! There was an issue with the response.": "",
+	"Uh-oh! There was an issue with the response.": "Voi ei! Vastauksessa oli ongelma.",
 	"UI": "Käyttöliittymä",
 	"Unarchive All": "Pura kaikkien arkistointi",
 	"Unarchive All Archived Chats": "Pura kaikkien arkistoitujen keskustelujen arkistointi",
@@ -1071,7 +1071,7 @@
 	"variable to have them replaced with clipboard content.": "muuttuja korvataan leikepöydän sisällöllä.",
 	"Version": "Versio",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Versio {{selectedVersion}} / {{totalVersions}}",
-	"View Replies": "",
+	"View Replies": "Näytä vastaukset",
 	"Visibility": "Näkyvyys",
 	"Voice": "Ääni",
 	"Voice Input": "Äänitulolaitteen käyttö",
@@ -1082,18 +1082,18 @@
 	"Web": "Web",
 	"Web API": "Web-API",
 	"Web Loader Settings": "Web Loader -asetukset",
-	"Web Search": "Web-haku",
-	"Web Search Engine": "Web-hakukone",
-	"Web Search in Chat": "",
-	"Web Search Query Generation": "Web-haun kyselytulosten luonti",
+	"Web Search": "Verkkohaku",
+	"Web Search Engine": "Hakukoneet",
+	"Web Search in Chat": "Verkkohaku keskustelussa",
+	"Web Search Query Generation": "Verkkohakukyselyn luonti",
 	"Webhook URL": "Webhook-URL",
 	"WebUI Settings": "WebUI-asetukset",
-	"WebUI URL": "",
+	"WebUI URL": "WebUI-osoite",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "WebUI lähettää pyyntöjä osoitteeseen \"{{url}}/api/chat\"",
 	"WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI lähettää pyyntöjä osoitteeseen \"{{url}}/chat/completions\"",
 	"What are you trying to achieve?": "Mitä yrität saavuttaa?",
-	"What are you working on?": "Mihin olet työskentelemässä?",
-	"What’s New in": "",
+	"What are you working on?": "Mi olet työskentelemässä?",
+	"What’s New in": "Mitä uutta",
 	"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Kun käytössä, malli vastaa jokaiseen chatviestiin reaaliajassa, tuottaen vastauksen heti kun käyttäjä lähettää viestin. Tämä tila on hyödyllinen reaaliaikaisissa chat-sovelluksissa, mutta voi vaikuttaa suorituskykyyn hitaammilla laitteistoilla.",
 	"wherever you are": "missä tahansa oletkin",
 	"Whisper (Local)": "Whisper (paikallinen)",
@@ -1103,7 +1103,7 @@
 	"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "Toimii yhdessä top-k:n kanssa. Korkeampi arvo (esim. 0,95) tuottaa monipuolisempaa tekstiä, kun taas alhaisempi arvo (esim. 0,5) tuottaa keskittyneempää ja konservatiivisempaa tekstiä. (Oletus: 0,9)",
 	"Workspace": "Työtila",
 	"Workspace Permissions": "Työtilan käyttöoikeudet",
-	"Write": "",
+	"Write": "Kirjoita",
 	"Write a prompt suggestion (e.g. Who are you?)": "Kirjoita kehotteen ehdotus (esim. Kuka olet?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Kirjoita 50 sanan yhteenveto, joka tiivistää [aihe tai avainsana].",
 	"Write something...": "Kirjoita jotain...",
@@ -1113,8 +1113,8 @@
 	"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Voit keskustella enintään {{maxCount}} tiedoston kanssa kerralla.",
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Voit personoida vuorovaikutustasi LLM-ohjelmien kanssa lisäämällä muistoja 'Hallitse'-painikkeen kautta, jolloin ne ovat hyödyllisempiä ja räätälöityjä sinua varten.",
 	"You cannot upload an empty file.": "Et voi ladata tyhjää tiedostoa.",
-	"You do not have permission to access this feature.": "",
-	"You do not have permission to upload files": "",
+	"You do not have permission to access this feature.": "Sinulla ei ole lupaa tähän ominaisuuteen.",
+	"You do not have permission to upload files": "Sinulla ei ole lupaa ladata tiedostoja",
 	"You do not have permission to upload files.": "Sinulla ei ole lupaa ladata tiedostoja.",
 	"You have no archived conversations.": "Sinulla ei ole arkistoituja keskusteluja.",
 	"You have shared this chat": "Olet jakanut tämän keskustelun",

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

@@ -23,51 +23,51 @@
 	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "",
 	"Active Users": "Utilizatori activi",
 	"Add": "Adaugă",
-	"Add a model ID": "",
+	"Add a model ID": "Adaugă un ID de model",
 	"Add a short description about what this model does": "Adaugă o scurtă descriere despre ce face acest model",
 	"Add a tag": "Adaugă o etichetă",
 	"Add Arena Model": "Adaugă Modelul Arena",
-	"Add Connection": "",
+	"Add Connection": "Adaugă conexiune",
 	"Add Content": "Adăugați conținut",
 	"Add content here": "Adăugați conținut aici",
 	"Add custom prompt": "Adaugă prompt personalizat",
-	"Add Files": "Adaugă Fișiere",
-	"Add Group": "",
-	"Add Memory": "Adaugă Memorie",
-	"Add Model": "Adaugă Model",
-	"Add Reaction": "",
-	"Add Tag": "Adaugă Etichetă",
-	"Add Tags": "Adaugă Etichete",
+	"Add Files": "Adaugă fișiere",
+	"Add Group": "Adaugă grup",
+	"Add Memory": "Adaugă memorie",
+	"Add Model": "Adaugă model",
+	"Add Reaction": "Adaugă reacție",
+	"Add Tag": "Adaugă etichetă",
+	"Add Tags": "Adaugă etichete",
 	"Add text content": "Adăugați conținut textual",
-	"Add User": "Adaugă Utilizator",
-	"Add User Group": "",
+	"Add User": "Adaugă utilizator",
+	"Add User Group": "Adaugă grup de utilizatori",
 	"Adjusting these settings will apply changes universally to all users.": "Ajustarea acestor setări va aplica modificările universal pentru toți utilizatorii.",
 	"admin": "administrator",
 	"Admin": "Administrator",
-	"Admin Panel": "Panoul de Administrare",
-	"Admin Settings": "Setări de Administrator",
+	"Admin Panel": "Panoul de administrare",
+	"Admin Settings": "Setări pentru administrator",
 	"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Administratorii au acces la toate instrumentele în orice moment; utilizatorii au nevoie de instrumente asignate pe model în spațiul de lucru.",
-	"Advanced Parameters": "Parametri Avansați",
-	"Advanced Params": "Parametri Avansați",
-	"All Documents": "Toate Documentele",
-	"All models deleted successfully": "",
-	"Allow Chat Controls": "",
-	"Allow Chat Delete": "",
-	"Allow Chat Deletion": "Permite Ștergerea Conversațiilor",
-	"Allow Chat Edit": "",
-	"Allow File Upload": "",
+	"Advanced Parameters": "Parametri avansați",
+	"Advanced Params": "Parametri avansați",
+	"All Documents": "Toate documentele",
+	"All models deleted successfully": "Toate modelele au fost șterse cu succes",
+	"Allow Chat Controls": "Permite controalele chat-ului",
+	"Allow Chat Delete": "Permite ștergerea chat-ului",
+	"Allow Chat Deletion": "Permite ștergerea conversațiilor",
+	"Allow Chat Edit": "Permite editarea chat-ului",
+	"Allow File Upload": "Permite încărcarea fișierelor",
 	"Allow non-local voices": "Permite voci non-locale",
-	"Allow Temporary Chat": "Permite Chat Temporar",
-	"Allow User Location": "Permite Localizarea Utilizatorului",
-	"Allow Voice Interruption in Call": "Permite Întreruperea Vocii în Apel",
+	"Allow Temporary Chat": "Permite chat temporar",
+	"Allow User Location": "Permite localizarea utilizatorului",
+	"Allow Voice Interruption in Call": "Permite intreruperea vocii în apel",
 	"Allowed Endpoints": "",
 	"Already have an account?": "Deja ai un cont?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
-	"Always": "",
-	"Amazing": "",
+	"Always": "Întotdeauna",
+	"Amazing": "Uimitor",
 	"an assistant": "un asistent",
-	"Analyzed": "",
-	"Analyzing...": "",
+	"Analyzed": "Analizat",
+	"Analyzing...": "Se analizează...",
 	"and": "și",
 	"and {{COUNT}} more": "și {{COUNT}} mai multe",
 	"and create a new shared link.": "și creează un nou link partajat.",
@@ -84,9 +84,9 @@
 	"Archive All Chats": "Arhivează Toate Conversațiile",
 	"Archived Chats": "Conversații Arhivate",
 	"archived-chat-export": "",
-	"Are you sure you want to delete this channel?": "",
-	"Are you sure you want to delete this message?": "",
-	"Are you sure you want to unarchive all archived chats?": "",
+	"Are you sure you want to delete this channel?": "Ești sigur că vrei să ștergi acest canal?",
+	"Are you sure you want to delete this message?": "Ești sigur că vrei să ștergi acest mesaj?",
+	"Are you sure you want to unarchive all archived chats?": "Ești sigur că vrei să dezarhivezi toate conversațiile arhivate?",
 	"Are you sure?": "Ești sigur?",
 	"Arena Models": "Arena Models",
 	"Artifacts": "Artefacte",
@@ -98,7 +98,7 @@
 	"Attribute for Username": "",
 	"Audio": "Audio",
 	"August": "August",
-	"Authenticate": "",
+	"Authenticate": "Autentificare",
 	"Auto-Copy Response to Clipboard": "Copiere Automată a Răspunsului în Clipboard",
 	"Auto-playback response": "Redare automată a răspunsului",
 	"Autocomplete Generation": "",
@@ -156,11 +156,11 @@
 	"Chunk Overlap": "Suprapunere Bloc",
 	"Chunk Params": "Parametri Bloc",
 	"Chunk Size": "Dimensiune Bloc",
-	"Ciphers": "",
+	"Ciphers": "Cifruri",
 	"Citation": "Citație",
 	"Clear memory": "Șterge memoria",
-	"click here": "",
-	"Click here for filter guides.": "",
+	"click here": "apasă aici.",
+	"Click here for filter guides.": "Apasă aici pentru ghidul de filtrare.",
 	"Click here for help.": "Apasă aici pentru ajutor.",
 	"Click here to": "Apasă aici pentru",
 	"Click here to download user import template file.": "Apasă aici pentru a descărca fișierul șablon de import utilizator.",
@@ -174,7 +174,7 @@
 	"Click on the user role button to change a user's role.": "Apasă pe butonul rolului utilizatorului pentru a schimba rolul unui utilizator.",
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permisiunea de scriere în clipboard a fost refuzată. Vă rugăm să verificați setările browserului pentru a acorda accesul necesar.",
 	"Clone": "Clonează",
-	"Clone Chat": "",
+	"Clone Chat": "Clonează chat",
 	"Clone of {{TITLE}}": "",
 	"Close": "Închide",
 	"Code execution": "Executarea codului",
@@ -183,7 +183,7 @@
 	"Code Interpreter Engine": "",
 	"Code Interpreter Prompt Template": "",
 	"Collection": "Colecție",
-	"Color": "",
+	"Color": "Culoare",
 	"ComfyUI": "ComfyUI",
 	"ComfyUI API Key": "",
 	"ComfyUI Base URL": "URL De Bază ComfyUI",
@@ -321,12 +321,12 @@
 	"e.g. Tools for performing various operations": "",
 	"Edit": "Editează",
 	"Edit Arena Model": "Editați Modelul Arena",
-	"Edit Channel": "",
-	"Edit Connection": "",
-	"Edit Default Permissions": "",
+	"Edit Channel": "Editează canalul",
+	"Edit Connection": "Editează conexiunea",
+	"Edit Default Permissions": "Editează permisiunile implicite",
 	"Edit Memory": "Editează Memorie",
 	"Edit User": "Editează Utilizator",
-	"Edit User Group": "",
+	"Edit User Group": "Editează grupul de utilizatori",
 	"ElevenLabs": "ElevenLabs",
 	"Email": "Email",
 	"Embark on adventures": "",
@@ -334,11 +334,11 @@
 	"Embedding Model": "Model de Încapsulare",
 	"Embedding Model Engine": "Motor de Model de Încapsulare",
 	"Embedding model set to \"{{embedding_model}}\"": "Modelul de încapsulare setat la \"{{embedding_model}}\"",
-	"Enable API Key": "",
-	"Enable autocomplete generation for chat messages": "",
-	"Enable Code Interpreter": "",
+	"Enable API Key": "Activează cheia API",
+	"Enable autocomplete generation for chat messages": "Activează generarea automată pentru mesajele de chat",
+	"Enable Code Interpreter": "Activează interpretul de cod",
 	"Enable Community Sharing": "Activează Partajarea Comunitară",
-	"Enable Google Drive": "",
+	"Enable Google Drive": "Activează Google Drive",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "Activează Evaluarea Mesajelor",
@@ -778,7 +778,7 @@
 	"RAG Template": "Șablon RAG",
 	"Rating": "Evaluare",
 	"Re-rank models by topic similarity": "Reordonează modelele în funcție de similaritatea tematică",
-	"Read": "",
+	"Read": "Citește",
 	"Read Aloud": "Citește cu Voce Tare",
 	"Reasoning Effort": "",
 	"Record voice": "Înregistrează vocea",
@@ -1025,14 +1025,14 @@
 	"TTS Voice": "Voce TTS",
 	"Type": "Tip",
 	"Type Hugging Face Resolve (Download) URL": "Introduceți URL-ul de Rezolvare (Descărcare) Hugging Face",
-	"Uh-oh! There was an issue with the response.": "",
+	"Uh-oh! There was an issue with the response.": "Oh, nu! A apărut o problemă cu răspunsul.",
 	"UI": "Interfață Utilizator",
-	"Unarchive All": "",
-	"Unarchive All Archived Chats": "",
-	"Unarchive Chat": "",
+	"Unarchive All": "Dezarhivează tot",
+	"Unarchive All Archived Chats": "Dezarhivează toate conversațiile arhivate",
+	"Unarchive Chat": "Dezarhivează conversația",
 	"Unlock mysteries": "",
 	"Unpin": "Anulează Fixarea",
-	"Unravel secrets": "",
+	"Unravel secrets": "Dezvăluie secretele",
 	"Untagged": "Netichetat",
 	"Update": "Actualizează",
 	"Update and Copy Link": "Actualizează și Copiază Link-ul",
@@ -1071,8 +1071,8 @@
 	"variable to have them replaced with clipboard content.": "variabilă pentru a fi înlocuite cu conținutul clipboard-ului.",
 	"Version": "Versiune",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Versiunea {{selectedVersion}} din {{totalVersions}}",
-	"View Replies": "",
-	"Visibility": "",
+	"View Replies": "Vezi răspunsurile",
+	"Visibility": "Vizibilitate",
 	"Voice": "Voce",
 	"Voice Input": "Intrare vocală",
 	"Warning": "Avertisment",
@@ -1103,7 +1103,7 @@
 	"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
 	"Workspace": "Spațiu de Lucru",
 	"Workspace Permissions": "",
-	"Write": "",
+	"Write": "Scrie",
 	"Write a prompt suggestion (e.g. Who are you?)": "Scrieți o sugestie de prompt (de ex. Cine ești?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Scrieți un rezumat în 50 de cuvinte care rezumă [subiect sau cuvânt cheie].",
 	"Write something...": "Scrie ceva...",

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

@@ -126,7 +126,7 @@
 	"Brave Search API Key": "Brave Search API 密钥",
 	"By {{name}}": "由 {{name}} 提供",
 	"Bypass SSL verification for Websites": "绕过网站的 SSL 验证",
-	"Calendar": "",
+	"Calendar": "日历",
 	"Call": "呼叫",
 	"Call feature is not supported when using Web STT engine": "使用 Web 语音转文字引擎时不支持呼叫功能。",
 	"Camera": "摄像头",
@@ -165,7 +165,7 @@
 	"Click here to": "点击",
 	"Click here to download user import template file.": "点击此处下载用户导入所需的模板文件。",
 	"Click here to learn more about faster-whisper and see the available models.": "点击此处了解更多关于faster-whisper的信息,并查看可用的模型。",
-	"Click here to see available models.": "",
+	"Click here to see available models.": "单击此处查看可用型号。",
 	"Click here to select": "点击这里选择",
 	"Click here to select a csv file.": "点击此处选择 csv 文件。",
 	"Click here to select a py file.": "点击此处选择 py 文件。",
@@ -180,8 +180,8 @@
 	"Code execution": "代码执行",
 	"Code formatted successfully": "代码格式化成功",
 	"Code Interpreter": "代码解释器",
-	"Code Interpreter Engine": "",
-	"Code Interpreter Prompt Template": "",
+	"Code Interpreter Engine": "代码解释引擎",
+	"Code Interpreter Prompt Template": "代码解释器提示模板",
 	"Collection": "文件集",
 	"Color": "颜色",
 	"ComfyUI": "ComfyUI",
@@ -198,7 +198,7 @@
 	"Confirm Password": "确认密码",
 	"Confirm your action": "确定吗?",
 	"Confirm your new password": "确认新密码",
-	"Connect to your own OpenAI compatible API endpoints.": "",
+	"Connect to your own OpenAI compatible API endpoints.": "连接到您自己的 OpenAI 兼容 API 端点。",
 	"Connections": "外部连接",
 	"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "限制推理模型的推理努力。仅适用于支持推理努力的特定提供商的推理模型。(默认值:中等)",
 	"Contact Admin for WebUI Access": "请联系管理员以获取访问权限",
@@ -221,7 +221,7 @@
 	"Copy Link": "复制链接",
 	"Copy to clipboard": "复制到剪贴板",
 	"Copying to clipboard was successful!": "成功复制到剪贴板!",
-	"CORS must be properly configured by the provider to allow requests from Open WebUI.": "",
+	"CORS must be properly configured by the provider to allow requests from Open WebUI.": "提供商必须正确配置 CORS 以允许来自 Open WebUI 的请求。",
 	"Create": "创建",
 	"Create a knowledge base": "创建知识库",
 	"Create a model": "创建一个模型",
@@ -275,9 +275,9 @@
 	"Describe your knowledge base and objectives": "描述您的知识库和目标",
 	"Description": "描述",
 	"Didn't fully follow instructions": "没有完全遵照指示",
-	"Direct Connections": "",
-	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "",
-	"Direct Connections settings updated": "",
+	"Direct Connections": "直接连接",
+	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "直接连接允许用户连接到他们自己的与 OpenAI 兼容的 API 端点。",
+	"Direct Connections settings updated": "直接连接设置已更新",
 	"Disabled": "禁用",
 	"Discover a function": "发现更多函数",
 	"Discover a model": "发现更多模型",
@@ -300,7 +300,7 @@
 	"Documentation": "帮助文档",
 	"Documents": "文档",
 	"does not make any external connections, and your data stays securely on your locally hosted server.": "不会与外部建立任何连接,您的数据会安全地存储在本地托管的服务器上。",
-	"Domain Filter List": "",
+	"Domain Filter List": "域名过滤列表",
 	"Don't have an account?": "没有账号?",
 	"don't install random functions from sources you don't trust.": "切勿随意从不完全可信的来源安装函数。",
 	"don't install random tools from sources you don't trust.": "切勿随意从不完全可信的来源安装工具。",
@@ -336,7 +336,7 @@
 	"Embedding model set to \"{{embedding_model}}\"": "语义向量模型设置为 \"{{embedding_model}}\"",
 	"Enable API Key": "启用 API 密钥",
 	"Enable autocomplete generation for chat messages": "启用聊天消息的输入框内容猜测补全",
-	"Enable Code Interpreter": "",
+	"Enable Code Interpreter": "启用代码解释器",
 	"Enable Community Sharing": "启用分享至社区",
 	"Enable Google Drive": "启用 Google 云端硬盘",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "启用内存锁定(mlock)以防止模型数据被交换出RAM。此选项将模型的工作集页面锁定在RAM中,确保它们不会被交换到磁盘。这可以通过避免页面错误和确保快速数据访问来帮助维持性能。",
@@ -362,16 +362,16 @@
 	"Enter Chunk Overlap": "输入块重叠 (Chunk Overlap)",
 	"Enter Chunk Size": "输入块大小 (Chunk Size)",
 	"Enter description": "输入简介描述",
-	"Enter domains separated by commas (e.g., example.com,site.org)": "",
+	"Enter domains separated by commas (e.g., example.com,site.org)": "输入以逗号分隔的域名(例如:example.com,site.org)",
 	"Enter Exa API Key": "输入 Exa API 密钥",
 	"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 Jina API Key": "输入 Jina API 密钥",
-	"Enter Jupyter Password": "",
-	"Enter Jupyter Token": "",
-	"Enter Jupyter URL": "",
+	"Enter Jupyter Password": "输入 Jupyter 密码",
+	"Enter Jupyter Token": "输入 Jupyter Token",
+	"Enter Jupyter URL": "输入 Jupyter URL",
 	"Enter Kagi Search API Key": "输入 Kagi Search API 密钥",
 	"Enter language codes": "输入语言代码",
 	"Enter Model ID": "输入模型 ID",
@@ -387,8 +387,8 @@
 	"Enter SearchApi Engine": "输入 SearchApi 引擎",
 	"Enter Searxng Query URL": "输入 Searxng 查询地址",
 	"Enter Seed": "输入 Seed",
-	"Enter SerpApi API Key": "",
-	"Enter SerpApi Engine": "",
+	"Enter SerpApi API Key": "输入 SerpApi API 密钥",
+	"Enter SerpApi Engine": "输入 SerpApi 引擎",
 	"Enter Serper API Key": "输入 Serper API 密钥",
 	"Enter Serply API Key": "输入 Serply API 密钥",
 	"Enter Serpstack API Key": "输入 Serpstack API 密钥",
@@ -516,7 +516,7 @@
 	"Hex Color": "十六进制颜色代码",
 	"Hex Color - Leave empty for default color": "十六进制颜色代码 - 留空使用默认颜色",
 	"Hide": "隐藏",
-	"Home": "",
+	"Home": "主页",
 	"Host": "主机",
 	"How can I help you today?": "有什么我能帮您的吗?",
 	"How would you rate this response?": "您如何评价这个回应?",
@@ -560,8 +560,8 @@
 	"JSON Preview": "JSON 预览",
 	"July": "七月",
 	"June": "六月",
-	"Jupyter Auth": "",
-	"Jupyter URL": "",
+	"Jupyter Auth": "Jupyter Auth",
+	"Jupyter URL": "Jupyter URL",
 	"JWT Expiration": "JWT 过期",
 	"JWT Token": "JWT 令牌",
 	"Kagi Search API Key": "Kagi 搜索 API 密钥",
@@ -574,8 +574,8 @@
 	"Knowledge deleted successfully.": "知识成功删除",
 	"Knowledge reset successfully.": "知识成功重置",
 	"Knowledge updated successfully": "知识成功更新",
-	"Kokoro.js (Browser)": "",
-	"Kokoro.js Dtype": "",
+	"Kokoro.js (Browser)": "Kokoro.js (Browser)",
+	"Kokoro.js Dtype": "Kokoro.js Dtype",
 	"Label": "标签",
 	"Landing Page Mode": "默认主页样式",
 	"Language": "语言",
@@ -590,12 +590,12 @@
 	"Leave empty to include all models from \"{{URL}}/models\" endpoint": "留空表示包含所有来自 \"{{URL}}/models\" 的模型",
 	"Leave empty to include all models or select specific models": "留空表示包含所有模型或请选择模型",
 	"Leave empty to use the default prompt, or enter a custom prompt": "留空以使用默认提示词,或输入自定义提示词。",
-	"Leave model field empty to use the default model.": "",
+	"Leave model field empty to use the default model.": "将模型字段留空以使用默认模型。",
 	"Light": "浅色",
 	"Listening...": "正在倾听...",
 	"Llama.cpp": "Llama.cpp",
 	"LLMs can make mistakes. Verify important information.": "大语言模型可能会生成误导性错误信息,请对关键信息加以验证。",
-	"Loading Kokoro.js...": "",
+	"Loading Kokoro.js...": "载入 Kokoro.js...",
 	"Local": "本地",
 	"Local Models": "本地模型",
 	"Lost": "落败",
@@ -605,7 +605,7 @@
 	"Make sure to export a workflow.json file as API format from ComfyUI.": "确保从 ComfyUI 导出 API 格式的 workflow.json 文件。",
 	"Manage": "管理",
 	"Manage Arena Models": "管理竞技场模型",
-	"Manage Direct Connections": "",
+	"Manage Direct Connections": "管理直接连接",
 	"Manage Models": "管理模型",
 	"Manage Ollama": "管理 Ollama",
 	"Manage Ollama API Connections": "管理Ollama API连接",
@@ -749,8 +749,8 @@
 	"Plain text (.txt)": "TXT 文档 (.txt)",
 	"Playground": "AI 对话游乐场",
 	"Please carefully review the following warnings:": "请仔细阅读以下警告信息:",
-	"Please do not close the settings page while loading the model.": "",
-	"Please enter a prompt": "请输出一个 prompt",
+	"Please do not close the settings page while loading the model.": "加载模型时请不要关闭设置页面。",
+	"Please enter a prompt": "请输出一个 Prompt",
 	"Please fill in all fields.": "请填写所有字段。",
 	"Please select a model first.": "请先选择一个模型。",
 	"Please select a model.": "请选择一个模型。",
@@ -857,7 +857,7 @@
 	"Select a pipeline": "选择一个管道",
 	"Select a pipeline url": "选择一个管道 URL",
 	"Select a tool": "选择一个工具",
-	"Select an auth method": "",
+	"Select an auth method": "选择身份验证方法",
 	"Select an Ollama instance": "选择一个 Ollama 实例。",
 	"Select Engine": "选择引擎",
 	"Select Knowledge": "选择知识",
@@ -870,8 +870,8 @@
 	"Send message": "发送消息",
 	"Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "在请求中发送 `stream_options: { include_usage: true }`。设置后,支持的供应商会在响应中返回 Token 使用信息。",
 	"September": "九月",
-	"SerpApi API Key": "",
-	"SerpApi Engine": "",
+	"SerpApi API Key": "SerpApi API 密钥",
+	"SerpApi Engine": "SerpApi 引擎",
 	"Serper API Key": "Serper API 密钥",
 	"Serply API Key": "Serply API 密钥",
 	"Serpstack API Key": "Serpstack API 密钥",
@@ -984,7 +984,7 @@
 	"Title (e.g. Tell me a fun fact)": "标题(例如 给我讲一个有趣的事实)",
 	"Title Auto-Generation": "自动生成标题",
 	"Title cannot be an empty string.": "标题不能为空。",
-	"Title Generation": "",
+	"Title Generation": "标题生成",
 	"Title Generation Prompt": "用于自动生成标题的提示词",
 	"TLS": "TLS",
 	"To access the available model names for downloading,": "要访问可下载的模型名称,",
@@ -1084,7 +1084,7 @@
 	"Web Loader Settings": "网页爬取设置",
 	"Web Search": "联网搜索",
 	"Web Search Engine": "联网搜索引擎",
-	"Web Search in Chat": "",
+	"Web Search in Chat": "聊天中的网页搜索",
 	"Web Search Query Generation": "网页搜索关键词生成",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "WebUI 设置",