diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c0c4de1a..acb280f5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,40 @@ 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.6.8] - 2025-05-10 + +### Added + +- 🏆 **External Reranker Support for Knowledge Base Search**: Supercharge your Retrieval-Augmented Generation (RAG) workflows with the new External Reranker integration; easily plug in advanced reranking services via the UI to deliver sharper and more relevant search results, accelerating research and insight discovery. +- 📤 **Unstylized PDF Export Option (Reduced File Size)**: When exporting chat transcripts or documents, you can now choose an unstylized PDF export for snappier downloads, minimal file size, and clean data archiving—perfect for large-scale storage or sharing. +- 📝 **Vazirmatn Font for Persian & Arabic**: Arabic and Persian users will now see their text beautifully rendered with the specialized Vazirmatn font for an improved localized reading experience. +- 🏷️ **SharePoint Tenant ID Support for OneDrive**: You can now specify a SharePoint tenant ID in OneDrive settings for seamless authentication and granular enterprise integration. +- 👤 **Refresh OAuth Profile Picture**: Your OAuth profile picture now updates in real-time, ensuring your presence and avatar always match your latest identity across integrated platforms. +- 🔧 **Milvus Configuration Improvements**: Configure index and metric types for Milvus directly within settings; take full control of your vector database for more accurate and robust AI search experiences. +- 🛡️ **S3 Tagging Toggle for Compatibility**: Optional S3 tagging via an environment toggle grants full compatibility with all storage backends—including those that don’t support tagging like Cloudflare R2—ensuring error-free attachment and document management. +- 👨‍🦯 **Icon Button Accessibility Improvements**: Key interactive icon-buttons now include aria-labels and ARIA descriptions, so screen readers provide precise guidance about what action each button performs for improved accessibility. +- ♿ **Enhanced Accessibility with Modal Focus Trap**: Modal dialogs and pop-ups now feature a focus trap and improved ARIA roles, ensuring seamless navigation and screen reader support—making the interface friendlier for everyone, including keyboard and assistive tech users. +- 🏃 **Improved Admin User List Loading Indicator**: The user list loading experience is now clearer and more responsive in the admin panel. +- 🧑‍🤝‍🧑 **Larger Admin User List Page Size**: Admins can now manage up to 30 users per page in the admin interface, drastically reducing pagination and making large user teams easier and faster to manage. +- 🌠 **Default Code Interpreter Prompt Clarified**: The built-in code interpreter prompt is now more explicit, preventing AI from wrapping code in Markdown blocks when not needed—ensuring properly formatted code runs as intended every time. +- 🧾 **Improved Default Title Generation Prompt Template**: Title generation now uses a robust template for reliable JSON output, improving chat organization and searchability. +- 🔗 **Support Jupyter Notebooks with Non-Root Base URLs**: Notebook-based code execution now supports non-root deployed Jupyter servers, granting full flexibility for hybrid or multi-user setups. +- 📰 **UI Scrollbar Always Visible for Overflow Tools**: When available tools overflow the display, the scrollbar is now always visible and there’s a handy "show all" toggle, making navigation of large toolsets snappier and more intuitive. +- 🛠️ **General Backend Refactoring for Stability**: Multiple under-the-hood improvements have been made across backend components, ensuring smoother performance, fewer errors, and a more reliable overall experience for all users. +- 🚀 **Optimized Web Search for Faster Results**: Web search speed and performance have been significantly enhanced, delivering answers and sources in record time to accelerate your research-heavy workflows. +- 💡 **More Supported Languages**: Expanded language support ensures an even wider range of users can enjoy an intuitive and natural interface in their native tongue. + +### Fixed + +- 🏃‍♂️ **Exhausting Workers in Nginx Reverse Proxy Due to Websocket Fix**: Websocket sessions are now fully compatible behind Nginx, eliminating worker exhaustion and restoring 24/7 reliability for real-time chats even in complex deployments. +- 🎤 **Audio Transcription Issue with OpenAI Resolved**: OpenAI-based audio transcription now handles WebM and newer formats without error, ensuring seamless voice-to-text workflows every time. +- 👉 **Message Input RTL Issue Fixed**: The chat message input now displays correctly for right-to-left languages, creating a flawless typing and reading experience for Arabic, Hebrew, and more. +- 🀄 **Katex: Proper Rendering of Chinese Characters Next to Math**: Math formulas now render perfectly even when directly adjacent to Chinese (CJK) characters, improving visual clarity for multilingual teams and cross-language documents. +- 🔂 **Duplicate Web Search URLs Eliminated**: Search results now reliably filter out URL duplicates, so your knowledge and search citations are always clean, trimmed, and easy to review. +- 📄 **Markdown Rendering Fixed in Knowledge Bases**: Markdown is now displayed correctly within knowledge bases, enabling better formatting and clarity of information-rich files. +- 🗂️ **LDAP Import/Loading Issue Resolved**: LDAP user imports process correctly, ensuring smooth onboarding and access without interruption. +- 🌎 **Pinecone Batch Operations and Async Safety**: All Pinecone operations (batch insert, upsert, delete) now run efficiently and safely in an async environment, boosting performance and preventing slowdowns in large-scale RAG jobs. + ## [0.6.7] - 2025-05-07 ### Added diff --git a/Caddyfile.localhost b/Caddyfile.localhost deleted file mode 100644 index 80728eedf..000000000 --- a/Caddyfile.localhost +++ /dev/null @@ -1,64 +0,0 @@ -# Run with -# caddy run --envfile ./example.env --config ./Caddyfile.localhost -# -# This is configured for -# - Automatic HTTPS (even for localhost) -# - Reverse Proxying to Ollama API Base URL (http://localhost:11434/api) -# - CORS -# - HTTP Basic Auth API Tokens (uncomment basicauth section) - - -# CORS Preflight (OPTIONS) + Request (GET, POST, PATCH, PUT, DELETE) -(cors-api) { - @match-cors-api-preflight method OPTIONS - handle @match-cors-api-preflight { - header { - Access-Control-Allow-Origin "{http.request.header.origin}" - Access-Control-Allow-Methods "GET, POST, PUT, PATCH, DELETE, OPTIONS" - Access-Control-Allow-Headers "Origin, Accept, Authorization, Content-Type, X-Requested-With" - Access-Control-Allow-Credentials "true" - Access-Control-Max-Age "3600" - defer - } - respond "" 204 - } - - @match-cors-api-request { - not { - header Origin "{http.request.scheme}://{http.request.host}" - } - header Origin "{http.request.header.origin}" - } - handle @match-cors-api-request { - header { - Access-Control-Allow-Origin "{http.request.header.origin}" - Access-Control-Allow-Methods "GET, POST, PUT, PATCH, DELETE, OPTIONS" - Access-Control-Allow-Headers "Origin, Accept, Authorization, Content-Type, X-Requested-With" - Access-Control-Allow-Credentials "true" - Access-Control-Max-Age "3600" - defer - } - } -} - -# replace localhost with example.com or whatever -localhost { - ## HTTP Basic Auth - ## (uncomment to enable) - # basicauth { - # # see .example.env for how to generate tokens - # {env.OLLAMA_API_ID} {env.OLLAMA_API_TOKEN_DIGEST} - # } - - handle /api/* { - # Comment to disable CORS - import cors-api - - reverse_proxy localhost:11434 - } - - # Same-Origin Static Web Server - file_server { - root ./build/ - } -} diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 5c617f190..38bd709f1 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -109,54 +109,7 @@ if os.path.exists(f"{DATA_DIR}/config.json"): DEFAULT_CONFIG = { "version": 0, - "ui": { - "default_locale": "", - "prompt_suggestions": [ - { - "title": [ - "Help me study", - "vocabulary for a college entrance exam", - ], - "content": "Help me study vocabulary: write a sentence for me to fill in the blank, and I'll try to pick the correct option.", - }, - { - "title": [ - "Give me ideas", - "for what to do with my kids' art", - ], - "content": "What are 5 creative things I could do with my kids' art? I don't want to throw them away, but it's also so much clutter.", - }, - { - "title": ["Tell me a fun fact", "about the Roman Empire"], - "content": "Tell me a random fun fact about the Roman Empire", - }, - { - "title": [ - "Show me a code snippet", - "of a website's sticky header", - ], - "content": "Show me a code snippet of a website's sticky header in CSS and JavaScript.", - }, - { - "title": [ - "Explain options trading", - "if I'm familiar with buying and selling stocks", - ], - "content": "Explain options trading in simple terms if I'm familiar with buying and selling stocks.", - }, - { - "title": ["Overcome procrastination", "give me tips"], - "content": "Could you start by asking me about instances when I procrastinate the most and then give me some suggestions to overcome it?", - }, - { - "title": [ - "Grammar check", - "rewrite it for better readability ", - ], - "content": 'Check the following sentence for grammar and clarity: "[sentence]". Rewrite it for better readability while maintaining its original meaning.', - }, - ], - }, + "ui": {}, } @@ -552,6 +505,12 @@ OAUTH_ALLOWED_DOMAINS = PersistentConfig( ], ) +OAUTH_UPDATE_PICTURE_ON_LOGIN = PersistentConfig( + "OAUTH_UPDATE_PICTURE_ON_LOGIN", + "oauth.update_picture_on_login", + os.environ.get("OAUTH_UPDATE_PICTURE_ON_LOGIN", "False").lower() == "true", +) + def load_oauth_providers(): OAUTH_PROVIDERS.clear() @@ -761,9 +720,10 @@ S3_BUCKET_NAME = os.environ.get("S3_BUCKET_NAME", None) S3_KEY_PREFIX = os.environ.get("S3_KEY_PREFIX", None) S3_ENDPOINT_URL = os.environ.get("S3_ENDPOINT_URL", None) S3_USE_ACCELERATE_ENDPOINT = ( - os.environ.get("S3_USE_ACCELERATE_ENDPOINT", "False").lower() == "true" + os.environ.get("S3_USE_ACCELERATE_ENDPOINT", "false").lower() == "true" ) S3_ADDRESSING_STYLE = os.environ.get("S3_ADDRESSING_STYLE", None) +S3_ENABLE_TAGGING = os.getenv("S3_ENABLE_TAGGING", "false").lower() == "true" GCS_BUCKET_NAME = os.environ.get("GCS_BUCKET_NAME", None) GOOGLE_APPLICATION_CREDENTIALS_JSON = os.environ.get( @@ -1255,7 +1215,16 @@ ENABLE_USER_WEBHOOKS = PersistentConfig( ) # FastAPI / AnyIO settings -THREAD_POOL_SIZE = int(os.getenv("THREAD_POOL_SIZE", "0")) +THREAD_POOL_SIZE = os.getenv("THREAD_POOL_SIZE", None) + +if THREAD_POOL_SIZE is not None and isinstance(THREAD_POOL_SIZE, str): + try: + THREAD_POOL_SIZE = int(THREAD_POOL_SIZE) + except ValueError: + log.warning( + f"THREAD_POOL_SIZE is not a valid integer: {THREAD_POOL_SIZE}. Defaulting to None." + ) + THREAD_POOL_SIZE = None def validate_cors_origins(origins): @@ -1357,6 +1326,9 @@ Generate a concise, 3-5 word title with an emoji summarizing the chat history. - Use emojis that enhance understanding of the topic, but avoid quotation marks or special formatting. - Write the title in the chat's primary language; default to English if multilingual. - Prioritize accuracy over excessive creativity; keep it clear and simple. +- Your entire response must consist solely of the JSON object, without any introductory or concluding text. +- The output must be a single, raw JSON object, without any markdown code fences or other encapsulating text. +- Ensure no conversational text, affirmations, or explanations precede or follow the raw JSON output, as this will cause direct parsing failure. ### Output: JSON format: { "title": "your concise title here" } ### Examples: @@ -1699,7 +1671,8 @@ DEFAULT_CODE_INTERPRETER_PROMPT = """ 1. **Code Interpreter**: `` - You have access to a Python shell that runs directly in the user's browser, enabling fast execution of code for analysis, calculations, or problem-solving. Use it in this response. - The Python code you write can incorporate a wide array of libraries, handle data manipulation or visualization, perform API calls for web-related tasks, or tackle virtually any computational challenge. Use this flexibility to **think outside the box, craft elegant solutions, and harness Python's full potential**. - - To use it, **you must enclose your code within `` XML tags** and stop right away. If you don't, the code won't execute. Do NOT use triple backticks. + - To use it, **you must enclose your code within `` XML tags** and stop right away. If you don't, the code won't execute. + - When writing code in the code_interpreter XML tag, Do NOT use the triple backticks code block for markdown formatting, example: ```py # python code ``` will cause an error because it is markdown formatting, it is not python code. - When coding, **always aim to print meaningful outputs** (e.g., results, tables, summaries, or visuals) to better interpret and verify the findings. Avoid relying on implicit outputs; prioritize explicit and clear print statements so the results are effectively communicated to the user. - After obtaining the printed output, **always provide a concise analysis, interpretation, or next steps to help the user understand the findings or refine the outcome further.** - If the results are unclear, unexpected, or require validation, refine the code and execute it again as needed. Always aim to deliver meaningful insights from the results, iterating if necessary. @@ -1746,6 +1719,12 @@ MILVUS_URI = os.environ.get("MILVUS_URI", f"{DATA_DIR}/vector_db/milvus.db") MILVUS_DB = os.environ.get("MILVUS_DB", "default") MILVUS_TOKEN = os.environ.get("MILVUS_TOKEN", None) +MILVUS_INDEX_TYPE = os.environ.get("MILVUS_INDEX_TYPE", "HNSW") +MILVUS_METRIC_TYPE = os.environ.get("MILVUS_METRIC_TYPE", "COSINE") +MILVUS_HNSW_M = int(os.environ.get("MILVUS_HNSW_M", "16")) +MILVUS_HNSW_EFCONSTRUCTION = int(os.environ.get("MILVUS_HNSW_EFCONSTRUCTION", "100")) +MILVUS_IVF_FLAT_NLIST = int(os.environ.get("MILVUS_IVF_FLAT_NLIST", "128")) + # Qdrant QDRANT_URI = os.environ.get("QDRANT_URI", None) QDRANT_API_KEY = os.environ.get("QDRANT_API_KEY", None) @@ -1833,6 +1812,11 @@ ONEDRIVE_SHAREPOINT_URL = PersistentConfig( os.environ.get("ONEDRIVE_SHAREPOINT_URL", ""), ) +ONEDRIVE_SHAREPOINT_TENANT_ID = PersistentConfig( + "ONEDRIVE_SHAREPOINT_TENANT_ID", + "onedrive.sharepoint_tenant_id", + os.environ.get("ONEDRIVE_SHAREPOINT_TENANT_ID", ""), +) # RAG Content Extraction CONTENT_EXTRACTION_ENGINE = PersistentConfig( @@ -1981,6 +1965,12 @@ RAG_EMBEDDING_PREFIX_FIELD_NAME = os.environ.get( "RAG_EMBEDDING_PREFIX_FIELD_NAME", None ) +RAG_RERANKING_ENGINE = PersistentConfig( + "RAG_RERANKING_ENGINE", + "rag.reranking_engine", + os.environ.get("RAG_RERANKING_ENGINE", ""), +) + RAG_RERANKING_MODEL = PersistentConfig( "RAG_RERANKING_MODEL", "rag.reranking_model", @@ -1989,6 +1979,7 @@ RAG_RERANKING_MODEL = PersistentConfig( if RAG_RERANKING_MODEL.value != "": log.info(f"Reranking model set: {RAG_RERANKING_MODEL.value}") + RAG_RERANKING_MODEL_AUTO_UPDATE = ( not OFFLINE_MODE and os.environ.get("RAG_RERANKING_MODEL_AUTO_UPDATE", "True").lower() == "true" @@ -1998,6 +1989,18 @@ RAG_RERANKING_MODEL_TRUST_REMOTE_CODE = ( os.environ.get("RAG_RERANKING_MODEL_TRUST_REMOTE_CODE", "True").lower() == "true" ) +RAG_EXTERNAL_RERANKER_URL = PersistentConfig( + "RAG_EXTERNAL_RERANKER_URL", + "rag.external_reranker_url", + os.environ.get("RAG_EXTERNAL_RERANKER_URL", ""), +) + +RAG_EXTERNAL_RERANKER_API_KEY = PersistentConfig( + "RAG_EXTERNAL_RERANKER_API_KEY", + "rag.external_reranker_api_key", + os.environ.get("RAG_EXTERNAL_RERANKER_API_KEY", ""), +) + RAG_TEXT_SPLITTER = PersistentConfig( "RAG_TEXT_SPLITTER", diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 06577d481..e5fdace6d 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -103,6 +103,7 @@ from open_webui.config import ( ENABLE_OPENAI_API, ONEDRIVE_CLIENT_ID, ONEDRIVE_SHAREPOINT_URL, + ONEDRIVE_SHAREPOINT_TENANT_ID, OPENAI_API_BASE_URLS, OPENAI_API_KEYS, OPENAI_API_CONFIGS, @@ -187,7 +188,10 @@ from open_webui.config import ( RAG_EMBEDDING_MODEL, RAG_EMBEDDING_MODEL_AUTO_UPDATE, RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE, + RAG_RERANKING_ENGINE, RAG_RERANKING_MODEL, + RAG_EXTERNAL_RERANKER_URL, + RAG_EXTERNAL_RERANKER_API_KEY, RAG_RERANKING_MODEL_AUTO_UPDATE, RAG_RERANKING_MODEL_TRUST_REMOTE_CODE, RAG_EMBEDDING_ENGINE, @@ -255,6 +259,7 @@ from open_webui.config import ( GOOGLE_DRIVE_API_KEY, ONEDRIVE_CLIENT_ID, ONEDRIVE_SHAREPOINT_URL, + ONEDRIVE_SHAREPOINT_TENANT_ID, ENABLE_RAG_HYBRID_SEARCH, ENABLE_RAG_LOCAL_WEB_FETCH, ENABLE_WEB_LOADER_SSL_VERIFICATION, @@ -459,10 +464,9 @@ async def lifespan(app: FastAPI): log.info("Installing external dependencies of functions and tools...") install_tool_and_function_dependencies() - pool_size = THREAD_POOL_SIZE - if pool_size and pool_size > 0: + if THREAD_POOL_SIZE and THREAD_POOL_SIZE > 0: limiter = anyio.to_thread.current_default_thread_limiter() - limiter.total_tokens = pool_size + limiter.total_tokens = THREAD_POOL_SIZE asyncio.create_task(periodic_usage_pool_cleanup()) @@ -654,7 +658,12 @@ app.state.config.CHUNK_OVERLAP = CHUNK_OVERLAP app.state.config.RAG_EMBEDDING_ENGINE = RAG_EMBEDDING_ENGINE app.state.config.RAG_EMBEDDING_MODEL = RAG_EMBEDDING_MODEL app.state.config.RAG_EMBEDDING_BATCH_SIZE = RAG_EMBEDDING_BATCH_SIZE + +app.state.config.RAG_RERANKING_ENGINE = RAG_RERANKING_ENGINE app.state.config.RAG_RERANKING_MODEL = RAG_RERANKING_MODEL +app.state.config.RAG_EXTERNAL_RERANKER_URL = RAG_EXTERNAL_RERANKER_URL +app.state.config.RAG_EXTERNAL_RERANKER_API_KEY = RAG_EXTERNAL_RERANKER_API_KEY + app.state.config.RAG_TEMPLATE = RAG_TEMPLATE app.state.config.RAG_OPENAI_API_BASE_URL = RAG_OPENAI_API_BASE_URL @@ -735,7 +744,10 @@ try: ) app.state.rf = get_rf( + app.state.config.RAG_RERANKING_ENGINE, app.state.config.RAG_RERANKING_MODEL, + app.state.config.RAG_EXTERNAL_RERANKER_URL, + app.state.config.RAG_EXTERNAL_RERANKER_API_KEY, RAG_RERANKING_MODEL_AUTO_UPDATE, ) except Exception as e: @@ -1381,6 +1393,7 @@ async def get_app_config(request: Request): "onedrive": { "client_id": ONEDRIVE_CLIENT_ID.value, "sharepoint_url": ONEDRIVE_SHAREPOINT_URL.value, + "sharepoint_tenant_id": ONEDRIVE_SHAREPOINT_TENANT_ID.value, }, "license_metadata": app.state.LICENSE_METADATA, **( diff --git a/backend/open_webui/retrieval/models/external.py b/backend/open_webui/retrieval/models/external.py new file mode 100644 index 000000000..187d66e38 --- /dev/null +++ b/backend/open_webui/retrieval/models/external.py @@ -0,0 +1,58 @@ +import logging +import requests +from typing import Optional, List, Tuple + +from open_webui.env import SRC_LOG_LEVELS + +log = logging.getLogger(__name__) +log.setLevel(SRC_LOG_LEVELS["RAG"]) + + +class ExternalReranker: + def __init__( + self, + api_key: str, + url: str = "http://localhost:8080/v1/rerank", + model: str = "reranker", + ): + self.api_key = api_key + self.url = url + self.model = model + + def predict(self, sentences: List[Tuple[str, str]]) -> Optional[List[float]]: + query = sentences[0][0] + docs = [i[1] for i in sentences] + + payload = { + "model": self.model, + "query": query, + "documents": docs, + "top_n": len(docs), + } + + try: + log.info(f"ExternalReranker:predict:model {self.model}") + log.info(f"ExternalReranker:predict:query {query}") + + r = requests.post( + f"{self.url}", + headers={ + "Content-Type": "application/json", + "Authorization": f"Bearer {self.api_key}", + }, + json=payload, + ) + + r.raise_for_status() + data = r.json() + + if "results" in data: + sorted_results = sorted(data["results"], key=lambda x: x["index"]) + return [result["relevance_score"] for result in sorted_results] + else: + log.error("No results found in external reranking response") + return None + + except Exception as e: + log.exception(f"Error in external reranking: {e}") + return None diff --git a/backend/open_webui/retrieval/vector/dbs/milvus.py b/backend/open_webui/retrieval/vector/dbs/milvus.py index f116c57f7..a4bad13d0 100644 --- a/backend/open_webui/retrieval/vector/dbs/milvus.py +++ b/backend/open_webui/retrieval/vector/dbs/milvus.py @@ -3,7 +3,6 @@ from pymilvus import FieldSchema, DataType import json import logging from typing import Optional - from open_webui.retrieval.vector.main import ( VectorDBBase, VectorItem, @@ -14,6 +13,11 @@ from open_webui.config import ( MILVUS_URI, MILVUS_DB, MILVUS_TOKEN, + MILVUS_INDEX_TYPE, + MILVUS_METRIC_TYPE, + MILVUS_HNSW_M, + MILVUS_HNSW_EFCONSTRUCTION, + MILVUS_IVF_FLAT_NLIST, ) from open_webui.env import SRC_LOG_LEVELS @@ -33,7 +37,6 @@ class MilvusClient(VectorDBBase): ids = [] documents = [] metadatas = [] - for match in result: _ids = [] _documents = [] @@ -42,11 +45,9 @@ class MilvusClient(VectorDBBase): _ids.append(item.get("id")) _documents.append(item.get("data", {}).get("text")) _metadatas.append(item.get("metadata")) - ids.append(_ids) documents.append(_documents) metadatas.append(_metadatas) - return GetResult( **{ "ids": ids, @@ -60,13 +61,11 @@ class MilvusClient(VectorDBBase): distances = [] documents = [] metadatas = [] - for match in result: _ids = [] _distances = [] _documents = [] _metadatas = [] - for item in match: _ids.append(item.get("id")) # normalize milvus score from [-1, 1] to [0, 1] range @@ -75,12 +74,10 @@ class MilvusClient(VectorDBBase): _distances.append(_dist) _documents.append(item.get("entity", {}).get("data", {}).get("text")) _metadatas.append(item.get("entity", {}).get("metadata")) - ids.append(_ids) distances.append(_distances) documents.append(_documents) metadatas.append(_metadatas) - return SearchResult( **{ "ids": ids, @@ -113,11 +110,39 @@ class MilvusClient(VectorDBBase): ) index_params = self.client.prepare_index_params() + + # Use configurations from config.py + index_type = MILVUS_INDEX_TYPE.upper() + metric_type = MILVUS_METRIC_TYPE.upper() + + log.info(f"Using Milvus index type: {index_type}, metric type: {metric_type}") + + index_creation_params = {} + if index_type == "HNSW": + index_creation_params = { + "M": MILVUS_HNSW_M, + "efConstruction": MILVUS_HNSW_EFCONSTRUCTION, + } + log.info(f"HNSW params: {index_creation_params}") + elif index_type == "IVF_FLAT": + index_creation_params = {"nlist": MILVUS_IVF_FLAT_NLIST} + log.info(f"IVF_FLAT params: {index_creation_params}") + elif index_type in ["FLAT", "AUTOINDEX"]: + log.info(f"Using {index_type} index with no specific build-time params.") + else: + log.warning( + f"Unsupported MILVUS_INDEX_TYPE: '{index_type}'. " + f"Supported types: HNSW, IVF_FLAT, FLAT, AUTOINDEX. " + f"Milvus will use its default for the collection if this type is not directly supported for index creation." + ) + # For unsupported types, pass the type directly to Milvus; it might handle it or use a default. + # If Milvus errors out, the user needs to correct the MILVUS_INDEX_TYPE env var. + index_params.add_index( field_name="vector", - index_type="HNSW", - metric_type="COSINE", - params={"M": 16, "efConstruction": 100}, + index_type=index_type, + metric_type=metric_type, + params=index_creation_params, ) self.client.create_collection( @@ -125,6 +150,9 @@ class MilvusClient(VectorDBBase): schema=schema, index_params=index_params, ) + log.info( + f"Successfully created collection '{self.collection_prefix}_{collection_name}' with index type '{index_type}' and metric '{metric_type}'." + ) def has_collection(self, collection_name: str) -> bool: # Check if the collection exists based on the collection name. @@ -145,84 +173,113 @@ class MilvusClient(VectorDBBase): ) -> Optional[SearchResult]: # Search for the nearest neighbor items based on the vectors and return 'limit' number of results. collection_name = collection_name.replace("-", "_") + # For some index types like IVF_FLAT, search params like nprobe can be set. + # Example: search_params = {"nprobe": 10} if using IVF_FLAT + # For simplicity, not adding configurable search_params here, but could be extended. result = self.client.search( collection_name=f"{self.collection_prefix}_{collection_name}", data=vectors, limit=limit, output_fields=["data", "metadata"], + # search_params=search_params # Potentially add later if needed ) - return self._result_to_search_result(result) def query(self, collection_name: str, filter: dict, limit: Optional[int] = None): # Construct the filter string for querying collection_name = collection_name.replace("-", "_") if not self.has_collection(collection_name): + log.warning( + f"Query attempted on non-existent collection: {self.collection_prefix}_{collection_name}" + ) return None - filter_string = " && ".join( [ f'metadata["{key}"] == {json.dumps(value)}' for key, value in filter.items() ] ) - max_limit = 16383 # The maximum number of records per request all_results = [] - if limit is None: - limit = float("inf") # Use infinity as a placeholder for no limit + # Milvus default limit for query if not specified is 16384, but docs mention iteration. + # Let's set a practical high number if "all" is intended, or handle true pagination. + # For now, if limit is None, we'll fetch in batches up to a very large number. + # This part could be refined based on expected use cases for "get all". + # For this function signature, None implies "as many as possible" up to Milvus limits. + limit = ( + 16384 * 10 + ) # A large number to signify fetching many, will be capped by actual data or max_limit per call. + log.info( + f"Limit not specified for query, fetching up to {limit} results in batches." + ) # Initialize offset and remaining to handle pagination offset = 0 remaining = limit try: + log.info( + f"Querying collection {self.collection_prefix}_{collection_name} with filter: '{filter_string}', limit: {limit}" + ) # Loop until there are no more items to fetch or the desired limit is reached while remaining > 0: - log.info(f"remaining: {remaining}") current_fetch = min( - max_limit, remaining - ) # Determine how many items to fetch in this iteration + max_limit, remaining if isinstance(remaining, int) else max_limit + ) + log.debug( + f"Querying with offset: {offset}, current_fetch: {current_fetch}" + ) results = self.client.query( collection_name=f"{self.collection_prefix}_{collection_name}", filter=filter_string, - output_fields=["*"], + output_fields=[ + "id", + "data", + "metadata", + ], # Explicitly list needed fields. Vector not usually needed in query. limit=current_fetch, offset=offset, ) if not results: + log.debug("No more results from query.") break all_results.extend(results) results_count = len(results) - remaining -= ( - results_count # Decrease remaining by the number of items fetched - ) + log.debug(f"Fetched {results_count} results in this batch.") + + if isinstance(remaining, int): + remaining -= results_count + offset += results_count - # Break the loop if the results returned are less than the requested fetch count + # Break the loop if the results returned are less than the requested fetch count (means end of data) if results_count < current_fetch: + log.debug( + "Fetched less than requested, assuming end of results for this query." + ) break - log.debug(all_results) + log.info(f"Total results from query: {len(all_results)}") return self._result_to_get_result([all_results]) except Exception as e: log.exception( - f"Error querying collection {collection_name} with limit {limit}: {e}" + f"Error querying collection {self.collection_prefix}_{collection_name} with filter '{filter_string}' and limit {limit}: {e}" ) return None def get(self, collection_name: str) -> Optional[GetResult]: - # Get all the items in the collection. + # Get all the items in the collection. This can be very resource-intensive for large collections. collection_name = collection_name.replace("-", "_") - result = self.client.query( - collection_name=f"{self.collection_prefix}_{collection_name}", - filter='id != ""', + log.warning( + f"Fetching ALL items from collection '{self.collection_prefix}_{collection_name}'. This might be slow for large collections." ) - return self._result_to_get_result([result]) + # Using query with a trivial filter to get all items. + # This will use the paginated query logic. + return self.query(collection_name=collection_name, filter={}, limit=None) def insert(self, collection_name: str, items: list[VectorItem]): # Insert the items into the collection, if the collection does not exist, it will be created. @@ -230,10 +287,23 @@ class MilvusClient(VectorDBBase): if not self.client.has_collection( collection_name=f"{self.collection_prefix}_{collection_name}" ): + log.info( + f"Collection {self.collection_prefix}_{collection_name} does not exist. Creating now." + ) + if not items: + log.error( + f"Cannot create collection {self.collection_prefix}_{collection_name} without items to determine dimension." + ) + raise ValueError( + "Cannot create Milvus collection without items to determine vector dimension." + ) self._create_collection( collection_name=collection_name, dimension=len(items[0]["vector"]) ) + log.info( + f"Inserting {len(items)} items into collection {self.collection_prefix}_{collection_name}." + ) return self.client.insert( collection_name=f"{self.collection_prefix}_{collection_name}", data=[ @@ -253,10 +323,23 @@ class MilvusClient(VectorDBBase): if not self.client.has_collection( collection_name=f"{self.collection_prefix}_{collection_name}" ): + log.info( + f"Collection {self.collection_prefix}_{collection_name} does not exist for upsert. Creating now." + ) + if not items: + log.error( + f"Cannot create collection {self.collection_prefix}_{collection_name} for upsert without items to determine dimension." + ) + raise ValueError( + "Cannot create Milvus collection for upsert without items to determine vector dimension." + ) self._create_collection( collection_name=collection_name, dimension=len(items[0]["vector"]) ) + log.info( + f"Upserting {len(items)} items into collection {self.collection_prefix}_{collection_name}." + ) return self.client.upsert( collection_name=f"{self.collection_prefix}_{collection_name}", data=[ @@ -276,30 +359,55 @@ class MilvusClient(VectorDBBase): ids: Optional[list[str]] = None, filter: Optional[dict] = None, ): - # Delete the items from the collection based on the ids. + # Delete the items from the collection based on the ids or filter. collection_name = collection_name.replace("-", "_") + if not self.has_collection(collection_name): + log.warning( + f"Delete attempted on non-existent collection: {self.collection_prefix}_{collection_name}" + ) + return None + if ids: + log.info( + f"Deleting items by IDs from {self.collection_prefix}_{collection_name}. IDs: {ids}" + ) return self.client.delete( collection_name=f"{self.collection_prefix}_{collection_name}", ids=ids, ) elif filter: - # Convert the filter dictionary to a string using JSON_CONTAINS. filter_string = " && ".join( [ f'metadata["{key}"] == {json.dumps(value)}' for key, value in filter.items() ] ) - + log.info( + f"Deleting items by filter from {self.collection_prefix}_{collection_name}. Filter: {filter_string}" + ) return self.client.delete( collection_name=f"{self.collection_prefix}_{collection_name}", filter=filter_string, ) + else: + log.warning( + f"Delete operation on {self.collection_prefix}_{collection_name} called without IDs or filter. No action taken." + ) + return None def reset(self): - # Resets the database. This will delete all collections and item entries. + # Resets the database. This will delete all collections and item entries that match the prefix. + log.warning( + f"Resetting Milvus: Deleting all collections with prefix '{self.collection_prefix}'." + ) collection_names = self.client.list_collections() - for collection_name in collection_names: - if collection_name.startswith(self.collection_prefix): - self.client.drop_collection(collection_name=collection_name) + deleted_collections = [] + for collection_name_full in collection_names: + if collection_name_full.startswith(self.collection_prefix): + try: + self.client.drop_collection(collection_name=collection_name_full) + deleted_collections.append(collection_name_full) + log.info(f"Deleted collection: {collection_name_full}") + except Exception as e: + log.error(f"Error deleting collection {collection_name_full}: {e}") + log.info(f"Milvus reset complete. Deleted collections: {deleted_collections}") diff --git a/backend/open_webui/retrieval/vector/dbs/pinecone.py b/backend/open_webui/retrieval/vector/dbs/pinecone.py index bc9bd8bc3..c921089b6 100644 --- a/backend/open_webui/retrieval/vector/dbs/pinecone.py +++ b/backend/open_webui/retrieval/vector/dbs/pinecone.py @@ -1,6 +1,13 @@ from typing import Optional, List, Dict, Any, Union import logging -from pinecone import Pinecone, ServerlessSpec +import time # for measuring elapsed time +from pinecone import ServerlessSpec + +import asyncio # for async upserts +import functools # for partial binding in async tasks + +import concurrent.futures # for parallel batch upserts +from pinecone.grpc import PineconeGRPC # use gRPC client for faster upserts from open_webui.retrieval.vector.main import ( VectorDBBase, @@ -40,8 +47,13 @@ class PineconeClient(VectorDBBase): self.metric = PINECONE_METRIC self.cloud = PINECONE_CLOUD - # Initialize Pinecone client - self.client = Pinecone(api_key=self.api_key) + # Initialize Pinecone gRPC client for improved performance + self.client = PineconeGRPC( + api_key=self.api_key, environment=self.environment, cloud=self.cloud + ) + + # Persistent executor for batch operations + self._executor = concurrent.futures.ThreadPoolExecutor(max_workers=5) # Create index if it doesn't exist self._initialize_index() @@ -191,27 +203,29 @@ class PineconeClient(VectorDBBase): log.warning("No items to insert") return + start_time = time.time() + collection_name_with_prefix = self._get_collection_name_with_prefix( collection_name ) points = self._create_points(items, collection_name_with_prefix) - # Insert in batches for better performance and reliability + # Parallelize batch inserts for performance + executor = self._executor + futures = [] for i in range(0, len(points), BATCH_SIZE): batch = points[i : i + BATCH_SIZE] + futures.append(executor.submit(self.index.upsert, vectors=batch)) + for future in concurrent.futures.as_completed(futures): try: - self.index.upsert(vectors=batch) - log.debug( - f"Inserted batch of {len(batch)} vectors into '{collection_name_with_prefix}'" - ) + future.result() except Exception as e: - log.error( - f"Error inserting batch into '{collection_name_with_prefix}': {e}" - ) + log.error(f"Error inserting batch: {e}") raise - + elapsed = time.time() - start_time + log.debug(f"Insert of {len(points)} vectors took {elapsed:.2f} seconds") log.info( - f"Successfully inserted {len(items)} vectors into '{collection_name_with_prefix}'" + f"Successfully inserted {len(points)} vectors in parallel batches into '{collection_name_with_prefix}'" ) def upsert(self, collection_name: str, items: List[VectorItem]) -> None: @@ -220,29 +234,119 @@ class PineconeClient(VectorDBBase): log.warning("No items to upsert") return + start_time = time.time() + + collection_name_with_prefix = self._get_collection_name_with_prefix( + collection_name + ) + points = self._create_points(items, collection_name_with_prefix) + + # Parallelize batch upserts for performance + executor = self._executor + futures = [] + for i in range(0, len(points), BATCH_SIZE): + batch = points[i : i + BATCH_SIZE] + futures.append(executor.submit(self.index.upsert, vectors=batch)) + for future in concurrent.futures.as_completed(futures): + try: + future.result() + except Exception as e: + log.error(f"Error upserting batch: {e}") + raise + elapsed = time.time() - start_time + log.debug(f"Upsert of {len(points)} vectors took {elapsed:.2f} seconds") + log.info( + f"Successfully upserted {len(points)} vectors in parallel batches into '{collection_name_with_prefix}'" + ) + + async def insert_async(self, collection_name: str, items: List[VectorItem]) -> None: + """Async version of insert using asyncio and run_in_executor for improved performance.""" + if not items: + log.warning("No items to insert") + return + + collection_name_with_prefix = self._get_collection_name_with_prefix( + collection_name + ) + points = self._create_points(items, collection_name_with_prefix) + + # Create batches + batches = [ + points[i : i + BATCH_SIZE] for i in range(0, len(points), BATCH_SIZE) + ] + loop = asyncio.get_event_loop() + tasks = [ + loop.run_in_executor( + None, functools.partial(self.index.upsert, vectors=batch) + ) + for batch in batches + ] + results = await asyncio.gather(*tasks, return_exceptions=True) + for result in results: + if isinstance(result, Exception): + log.error(f"Error in async insert batch: {result}") + raise result + log.info( + f"Successfully async inserted {len(points)} vectors in batches into '{collection_name_with_prefix}'" + ) + + async def upsert_async(self, collection_name: str, items: List[VectorItem]) -> None: + """Async version of upsert using asyncio and run_in_executor for improved performance.""" + if not items: + log.warning("No items to upsert") + return + collection_name_with_prefix = self._get_collection_name_with_prefix( collection_name ) points = self._create_points(items, collection_name_with_prefix) - # Upsert in batches - for i in range(0, len(points), BATCH_SIZE): - batch = points[i : i + BATCH_SIZE] - try: - self.index.upsert(vectors=batch) - log.debug( - f"Upserted batch of {len(batch)} vectors into '{collection_name_with_prefix}'" - ) - except Exception as e: - log.error( - f"Error upserting batch into '{collection_name_with_prefix}': {e}" - ) - raise - + # Create batches + batches = [ + points[i : i + BATCH_SIZE] for i in range(0, len(points), BATCH_SIZE) + ] + loop = asyncio.get_event_loop() + tasks = [ + loop.run_in_executor( + None, functools.partial(self.index.upsert, vectors=batch) + ) + for batch in batches + ] + results = await asyncio.gather(*tasks, return_exceptions=True) + for result in results: + if isinstance(result, Exception): + log.error(f"Error in async upsert batch: {result}") + raise result log.info( - f"Successfully upserted {len(items)} vectors into '{collection_name_with_prefix}'" + f"Successfully async upserted {len(points)} vectors in batches into '{collection_name_with_prefix}'" ) + def streaming_upsert(self, collection_name: str, items: List[VectorItem]) -> None: + """Perform a streaming upsert over gRPC for performance testing.""" + if not items: + log.warning("No items to upsert via streaming") + return + + collection_name_with_prefix = self._get_collection_name_with_prefix( + collection_name + ) + points = self._create_points(items, collection_name_with_prefix) + + # Open a streaming upsert channel + stream = self.index.streaming_upsert() + try: + for point in points: + # send each point over the stream + stream.send(point) + # close the stream to finalize + stream.close() + log.info( + f"Successfully streamed upsert of {len(points)} vectors into '{collection_name_with_prefix}'" + ) + except Exception as e: + log.error(f"Error during streaming upsert: {e}") + raise + def search( self, collection_name: str, vectors: List[List[Union[float, int]]], limit: int ) -> Optional[SearchResult]: @@ -410,3 +514,20 @@ class PineconeClient(VectorDBBase): except Exception as e: log.error(f"Failed to reset Pinecone index: {e}") raise + + def close(self): + """Shut down the gRPC channel and thread pool.""" + try: + self.client.close() + log.info("Pinecone gRPC channel closed.") + except Exception as e: + log.warning(f"Failed to close Pinecone gRPC channel: {e}") + self._executor.shutdown(wait=True) + + def __enter__(self): + """Enter context manager.""" + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """Exit context manager, ensuring resources are cleaned up.""" + self.close() diff --git a/backend/open_webui/routers/audio.py b/backend/open_webui/routers/audio.py index 5952bb59c..445857c88 100644 --- a/backend/open_webui/routers/audio.py +++ b/backend/open_webui/routers/audio.py @@ -71,23 +71,27 @@ from pydub import AudioSegment from pydub.utils import mediainfo -def get_audio_format(file_path): +def get_audio_convert_format(file_path): """Check if the given file needs to be converted to a different format.""" if not os.path.isfile(file_path): log.error(f"File not found: {file_path}") return False - info = mediainfo(file_path) - if ( - info.get("codec_name") == "aac" - and info.get("codec_type") == "audio" - and info.get("codec_tag_string") == "mp4a" - ): - return "mp4" - elif info.get("format_name") == "ogg": - return "ogg" - elif info.get("format_name") == "matroska,webm": - return "webm" + try: + info = mediainfo(file_path) + + if ( + info.get("codec_name") == "aac" + and info.get("codec_type") == "audio" + and info.get("codec_tag_string") == "mp4a" + ): + return "mp4" + elif info.get("format_name") == "ogg": + return "ogg" + except Exception as e: + log.error(f"Error getting audio format: {e}") + return False + return None @@ -538,14 +542,17 @@ def transcribe(request: Request, file_path): log.debug(data) return data elif request.app.state.config.STT_ENGINE == "openai": - audio_format = get_audio_format(file_path) - if audio_format: - os.rename(file_path, file_path.replace(".wav", f".{audio_format}")) + convert_format = get_audio_convert_format(file_path) + + if convert_format: + ext = convert_format.split(".")[-1] + + os.rename(file_path, file_path.replace(".{ext}", f".{convert_format}")) # Convert unsupported audio file to WAV format convert_audio_to_wav( - file_path.replace(".wav", f".{audio_format}"), + file_path.replace(".{ext}", f".{convert_format}"), file_path, - audio_format, + convert_format, ) r = None diff --git a/backend/open_webui/routers/auths.py b/backend/open_webui/routers/auths.py index acc456d20..309862ed5 100644 --- a/backend/open_webui/routers/auths.py +++ b/backend/open_webui/routers/auths.py @@ -234,7 +234,7 @@ async def ldap_auth(request: Request, response: Response, form_data: LdapForm): ], ) - if not search_success: + if not search_success or not connection_app.entries: raise HTTPException(400, detail="User not found in the LDAP server") entry = connection_app.entries[0] diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index d963cd632..475905da1 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -133,6 +133,7 @@ def upload_file( "audio/ogg", "audio/x-m4a", "audio/webm", + "video/webm", ) ): file_path = Storage.get_file(file_path) @@ -150,7 +151,6 @@ def upload_file( "video/mp4", "video/ogg", "video/quicktime", - "video/webm", ]: process_file(request, ProcessFileForm(file_id=id), user=user) diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index f75b03483..efefa12fc 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -3,6 +3,8 @@ import logging import mimetypes import os import shutil +import asyncio + import uuid from datetime import datetime @@ -135,7 +137,10 @@ def get_ef( def get_rf( + engine: str = "", reranking_model: Optional[str] = None, + external_reranker_url: str = "", + external_reranker_api_key: str = "", auto_update: bool = False, ): rf = None @@ -153,19 +158,33 @@ def get_rf( log.error(f"ColBERT: {e}") raise Exception(ERROR_MESSAGES.DEFAULT(e)) else: - import sentence_transformers + if engine == "external": + try: + from open_webui.retrieval.models.external import ExternalReranker + + rf = ExternalReranker( + url=external_reranker_url, + api_key=external_reranker_api_key, + model=reranking_model, + ) + except Exception as e: + log.error(f"ExternalReranking: {e}") + raise Exception(ERROR_MESSAGES.DEFAULT(e)) + else: + import sentence_transformers + + try: + rf = sentence_transformers.CrossEncoder( + get_model_path(reranking_model, auto_update), + device=DEVICE_TYPE, + trust_remote_code=RAG_RERANKING_MODEL_TRUST_REMOTE_CODE, + backend=SENTENCE_TRANSFORMERS_CROSS_ENCODER_BACKEND, + model_kwargs=SENTENCE_TRANSFORMERS_CROSS_ENCODER_MODEL_KWARGS, + ) + except Exception as e: + log.error(f"CrossEncoder: {e}") + raise Exception(ERROR_MESSAGES.DEFAULT("CrossEncoder error")) - try: - rf = sentence_transformers.CrossEncoder( - get_model_path(reranking_model, auto_update), - device=DEVICE_TYPE, - trust_remote_code=RAG_RERANKING_MODEL_TRUST_REMOTE_CODE, - backend=SENTENCE_TRANSFORMERS_CROSS_ENCODER_BACKEND, - model_kwargs=SENTENCE_TRANSFORMERS_CROSS_ENCODER_MODEL_KWARGS, - ) - except Exception as e: - log.error(f"CrossEncoder: {e}") - raise Exception(ERROR_MESSAGES.DEFAULT("CrossEncoder error")) return rf @@ -188,7 +207,7 @@ class ProcessUrlForm(CollectionNameForm): class SearchForm(BaseModel): - query: str + queries: List[str] @router.get("/") @@ -223,14 +242,6 @@ async def get_embedding_config(request: Request, user=Depends(get_admin_user)): } -@router.get("/reranking") -async def get_reraanking_config(request: Request, user=Depends(get_admin_user)): - return { - "status": True, - "reranking_model": request.app.state.config.RAG_RERANKING_MODEL, - } - - class OpenAIConfigForm(BaseModel): url: str key: str @@ -325,41 +336,6 @@ async def update_embedding_config( ) -class RerankingModelUpdateForm(BaseModel): - reranking_model: str - - -@router.post("/reranking/update") -async def update_reranking_config( - request: Request, form_data: RerankingModelUpdateForm, user=Depends(get_admin_user) -): - log.info( - f"Updating reranking model: {request.app.state.config.RAG_RERANKING_MODEL} to {form_data.reranking_model}" - ) - try: - request.app.state.config.RAG_RERANKING_MODEL = form_data.reranking_model - - try: - request.app.state.rf = get_rf( - request.app.state.config.RAG_RERANKING_MODEL, - True, - ) - except Exception as e: - log.error(f"Error loading reranking model: {e}") - request.app.state.config.ENABLE_RAG_HYBRID_SEARCH = False - - return { - "status": True, - "reranking_model": request.app.state.config.RAG_RERANKING_MODEL, - } - except Exception as e: - log.exception(f"Problem updating reranking model: {e}") - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail=ERROR_MESSAGES.DEFAULT(e), - ) - - @router.get("/config") async def get_rag_config(request: Request, user=Depends(get_admin_user)): return { @@ -383,6 +359,11 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): "DOCUMENT_INTELLIGENCE_ENDPOINT": request.app.state.config.DOCUMENT_INTELLIGENCE_ENDPOINT, "DOCUMENT_INTELLIGENCE_KEY": request.app.state.config.DOCUMENT_INTELLIGENCE_KEY, "MISTRAL_OCR_API_KEY": request.app.state.config.MISTRAL_OCR_API_KEY, + # Reranking settings + "RAG_RERANKING_MODEL": request.app.state.config.RAG_RERANKING_MODEL, + "RAG_RERANKING_ENGINE": request.app.state.config.RAG_RERANKING_ENGINE, + "RAG_EXTERNAL_RERANKER_URL": request.app.state.config.RAG_EXTERNAL_RERANKER_URL, + "RAG_EXTERNAL_RERANKER_API_KEY": request.app.state.config.RAG_EXTERNAL_RERANKER_API_KEY, # Chunking settings "TEXT_SPLITTER": request.app.state.config.TEXT_SPLITTER, "CHUNK_SIZE": request.app.state.config.CHUNK_SIZE, @@ -519,6 +500,12 @@ class ConfigForm(BaseModel): DOCUMENT_INTELLIGENCE_KEY: Optional[str] = None MISTRAL_OCR_API_KEY: Optional[str] = None + # Reranking settings + RAG_RERANKING_MODEL: Optional[str] = None + RAG_RERANKING_ENGINE: Optional[str] = None + RAG_EXTERNAL_RERANKER_URL: Optional[str] = None + RAG_EXTERNAL_RERANKER_API_KEY: Optional[str] = None + # Chunking settings TEXT_SPLITTER: Optional[str] = None CHUNK_SIZE: Optional[int] = None @@ -630,6 +617,49 @@ async def update_rag_config( else request.app.state.config.MISTRAL_OCR_API_KEY ) + # Reranking settings + request.app.state.config.RAG_RERANKING_ENGINE = ( + form_data.RAG_RERANKING_ENGINE + if form_data.RAG_RERANKING_ENGINE is not None + else request.app.state.config.RAG_RERANKING_ENGINE + ) + + request.app.state.config.RAG_EXTERNAL_RERANKER_URL = ( + form_data.RAG_EXTERNAL_RERANKER_URL + if form_data.RAG_EXTERNAL_RERANKER_URL is not None + else request.app.state.config.RAG_EXTERNAL_RERANKER_URL + ) + + request.app.state.config.RAG_EXTERNAL_RERANKER_API_KEY = ( + form_data.RAG_EXTERNAL_RERANKER_API_KEY + if form_data.RAG_EXTERNAL_RERANKER_API_KEY is not None + else request.app.state.config.RAG_EXTERNAL_RERANKER_API_KEY + ) + + log.info( + f"Updating reranking model: {request.app.state.config.RAG_RERANKING_MODEL} to {form_data.RAG_RERANKING_MODEL}" + ) + try: + request.app.state.config.RAG_RERANKING_MODEL = form_data.RAG_RERANKING_MODEL + + try: + request.app.state.rf = get_rf( + request.app.state.config.RAG_RERANKING_ENGINE, + request.app.state.config.RAG_RERANKING_MODEL, + request.app.state.config.RAG_EXTERNAL_RERANKER_URL, + request.app.state.config.RAG_EXTERNAL_RERANKER_API_KEY, + True, + ) + except Exception as e: + log.error(f"Error loading reranking model: {e}") + request.app.state.config.ENABLE_RAG_HYBRID_SEARCH = False + except Exception as e: + log.exception(f"Problem updating reranking model: {e}") + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail=ERROR_MESSAGES.DEFAULT(e), + ) + # Chunking settings request.app.state.config.TEXT_SPLITTER = ( form_data.TEXT_SPLITTER @@ -786,6 +816,11 @@ async def update_rag_config( "DOCUMENT_INTELLIGENCE_ENDPOINT": request.app.state.config.DOCUMENT_INTELLIGENCE_ENDPOINT, "DOCUMENT_INTELLIGENCE_KEY": request.app.state.config.DOCUMENT_INTELLIGENCE_KEY, "MISTRAL_OCR_API_KEY": request.app.state.config.MISTRAL_OCR_API_KEY, + # Reranking settings + "RAG_RERANKING_MODEL": request.app.state.config.RAG_RERANKING_MODEL, + "RAG_RERANKING_ENGINE": request.app.state.config.RAG_RERANKING_ENGINE, + "RAG_EXTERNAL_RERANKER_URL": request.app.state.config.RAG_EXTERNAL_RERANKER_URL, + "RAG_EXTERNAL_RERANKER_API_KEY": request.app.state.config.RAG_EXTERNAL_RERANKER_API_KEY, # Chunking settings "TEXT_SPLITTER": request.app.state.config.TEXT_SPLITTER, "CHUNK_SIZE": request.app.state.config.CHUNK_SIZE, @@ -1568,16 +1603,34 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]: async def process_web_search( request: Request, form_data: SearchForm, user=Depends(get_verified_user) ): + + urls = [] try: logging.info( - f"trying to web search with {request.app.state.config.WEB_SEARCH_ENGINE, form_data.query}" - ) - web_results = await run_in_threadpool( - search_web, - request, - request.app.state.config.WEB_SEARCH_ENGINE, - form_data.query, + f"trying to web search with {request.app.state.config.WEB_SEARCH_ENGINE, form_data.queries}" ) + + search_tasks = [ + run_in_threadpool( + search_web, + request, + request.app.state.config.WEB_SEARCH_ENGINE, + query, + ) + for query in form_data.queries + ] + + search_results = await asyncio.gather(*search_tasks) + + for result in search_results: + if result: + for item in result: + if item and item.link: + urls.append(item.link) + + urls = list(dict.fromkeys(urls)) + log.debug(f"urls: {urls}") + except Exception as e: log.exception(e) @@ -1586,10 +1639,7 @@ async def process_web_search( detail=ERROR_MESSAGES.WEB_SEARCH_ERROR(e), ) - log.debug(f"web_results: {web_results}") - try: - urls = [result.link for result in web_results] loader = get_web_loader( urls, verify_ssl=request.app.state.config.ENABLE_WEB_LOADER_SSL_VERIFICATION, @@ -1599,7 +1649,7 @@ async def process_web_search( docs = await loader.aload() urls = [ doc.metadata.get("source") for doc in docs if doc.metadata.get("source") - ] # only keep URLs + ] # only keep the urls returned by the loader if request.app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL: return { @@ -1616,29 +1666,28 @@ async def process_web_search( "loaded_count": len(docs), } else: - collection_names = [] - for doc_idx, doc in enumerate(docs): - if doc and doc.page_content: - try: - collection_name = f"web-search-{calculate_sha256_string(form_data.query + '-' + urls[doc_idx])}"[ - :63 - ] + # Create a single collection for all documents + collection_name = ( + f"web-search-{calculate_sha256_string('-'.join(form_data.queries))}"[ + :63 + ] + ) - collection_names.append(collection_name) - await run_in_threadpool( - save_docs_to_vector_db, - request, - [doc], - collection_name, - overwrite=True, - user=user, - ) - except Exception as e: - log.debug(f"error saving doc {doc_idx}: {e}") + try: + await run_in_threadpool( + save_docs_to_vector_db, + request, + docs, + collection_name, + overwrite=True, + user=user, + ) + except Exception as e: + log.debug(f"error saving docs: {e}") return { "status": True, - "collection_names": collection_names, + "collection_names": [collection_name], "filenames": urls, "loaded_count": len(docs), } diff --git a/backend/open_webui/routers/tasks.py b/backend/open_webui/routers/tasks.py index 39fca43d3..14a6c4286 100644 --- a/backend/open_webui/routers/tasks.py +++ b/backend/open_webui/routers/tasks.py @@ -186,20 +186,9 @@ async def generate_title( else: template = DEFAULT_TITLE_GENERATION_PROMPT_TEMPLATE - messages = form_data["messages"] - - # Remove reasoning details from the messages - for message in messages: - message["content"] = re.sub( - r"]*>.*?<\/details>", - "", - message["content"], - flags=re.S, - ).strip() - content = title_generation_template( template, - messages, + form_data["messages"], { "name": user.name, "location": user.info.get("location") if user.info else None, diff --git a/backend/open_webui/routers/users.py b/backend/open_webui/routers/users.py index a2bfbf665..8702ae50b 100644 --- a/backend/open_webui/routers/users.py +++ b/backend/open_webui/routers/users.py @@ -34,7 +34,7 @@ router = APIRouter() ############################ -PAGE_ITEM_COUNT = 10 +PAGE_ITEM_COUNT = 30 @router.get("/", response_model=UserListResponse) diff --git a/backend/open_webui/socket/main.py b/backend/open_webui/socket/main.py index 57ccd6e57..09eccd826 100644 --- a/backend/open_webui/socket/main.py +++ b/backend/open_webui/socket/main.py @@ -159,18 +159,19 @@ def get_models_in_use(): @sio.on("usage") async def usage(sid, data): - model_id = data["model"] - # Record the timestamp for the last update - current_time = int(time.time()) + if sid in SESSION_POOL: + model_id = data["model"] + # Record the timestamp for the last update + current_time = int(time.time()) - # Store the new usage data and task - USAGE_POOL[model_id] = { - **(USAGE_POOL[model_id] if model_id in USAGE_POOL else {}), - sid: {"updated_at": current_time}, - } + # Store the new usage data and task + USAGE_POOL[model_id] = { + **(USAGE_POOL[model_id] if model_id in USAGE_POOL else {}), + sid: {"updated_at": current_time}, + } - # Broadcast the usage data to all clients - await sio.emit("usage", {"models": get_models_in_use()}) + # Broadcast the usage data to all clients + await sio.emit("usage", {"models": get_models_in_use()}) @sio.event @@ -192,9 +193,6 @@ async def connect(sid, environ, auth): # print(f"user {user.name}({user.id}) connected with session ID {sid}") await sio.emit("user-list", {"user_ids": list(USER_POOL.keys())}) await sio.emit("usage", {"models": get_models_in_use()}) - return True - - return False @sio.on("user-join") @@ -281,7 +279,8 @@ async def channel_events(sid, data): @sio.on("user-list") async def user_list(sid): - await sio.emit("user-list", {"user_ids": list(USER_POOL.keys())}) + if sid in SESSION_POOL: + await sio.emit("user-list", {"user_ids": list(USER_POOL.keys())}) @sio.event diff --git a/backend/open_webui/storage/provider.py b/backend/open_webui/storage/provider.py index 17d7f5ab5..5c85f88bc 100644 --- a/backend/open_webui/storage/provider.py +++ b/backend/open_webui/storage/provider.py @@ -17,6 +17,7 @@ from open_webui.config import ( S3_SECRET_ACCESS_KEY, S3_USE_ACCELERATE_ENDPOINT, S3_ADDRESSING_STYLE, + S3_ENABLE_TAGGING, GCS_BUCKET_NAME, GOOGLE_APPLICATION_CREDENTIALS_JSON, AZURE_STORAGE_ENDPOINT, @@ -140,18 +141,19 @@ class S3StorageProvider(StorageProvider): ) -> Tuple[bytes, str]: """Handles uploading of the file to S3 storage.""" _, file_path = LocalStorageProvider.upload_file(file, filename, tags) - tagging = {"TagSet": [{"Key": k, "Value": v} for k, v in tags.items()]} + s3_key = os.path.join(self.key_prefix, filename) try: - s3_key = os.path.join(self.key_prefix, filename) self.s3_client.upload_file(file_path, self.bucket_name, s3_key) - self.s3_client.put_object_tagging( - Bucket=self.bucket_name, - Key=s3_key, - Tagging=tagging, - ) + if S3_ENABLE_TAGGING and tags: + tagging = {"TagSet": [{"Key": k, "Value": v} for k, v in tags.items()]} + self.s3_client.put_object_tagging( + Bucket=self.bucket_name, + Key=s3_key, + Tagging=tagging, + ) return ( open(file_path, "rb").read(), - "s3://" + self.bucket_name + "/" + s3_key, + f"s3://{self.bucket_name}/{s3_key}", ) except ClientError as e: raise RuntimeError(f"Error uploading file to S3: {e}") diff --git a/backend/open_webui/utils/code_interpreter.py b/backend/open_webui/utils/code_interpreter.py index 1ad5ee93c..f3dcbb81f 100644 --- a/backend/open_webui/utils/code_interpreter.py +++ b/backend/open_webui/utils/code_interpreter.py @@ -44,12 +44,14 @@ class JupyterCodeExecuter: :param password: Jupyter password (optional) :param timeout: WebSocket timeout in seconds (default: 60s) """ - self.base_url = base_url.rstrip("/") + self.base_url = base_url self.code = code self.token = token self.password = password self.timeout = timeout self.kernel_id = "" + if self.base_url[-1] != "/": + self.base_url += "/" self.session = aiohttp.ClientSession(trust_env=True, base_url=self.base_url) self.params = {} self.result = ResultModel() @@ -61,7 +63,7 @@ class JupyterCodeExecuter: if self.kernel_id: try: async with self.session.delete( - f"/api/kernels/{self.kernel_id}", params=self.params + f"api/kernels/{self.kernel_id}", params=self.params ) as response: response.raise_for_status() except Exception as err: @@ -81,7 +83,7 @@ class JupyterCodeExecuter: async def sign_in(self) -> None: # password authentication if self.password and not self.token: - async with self.session.get("/login") as response: + async with self.session.get("login") as response: response.raise_for_status() xsrf_token = response.cookies["_xsrf"].value if not xsrf_token: @@ -89,7 +91,7 @@ class JupyterCodeExecuter: self.session.cookie_jar.update_cookies(response.cookies) self.session.headers.update({"X-XSRFToken": xsrf_token}) async with self.session.post( - "/login", + "login", data={"_xsrf": xsrf_token, "password": self.password}, allow_redirects=False, ) as response: @@ -101,17 +103,15 @@ class JupyterCodeExecuter: self.params.update({"token": self.token}) async def init_kernel(self) -> None: - async with self.session.post( - url="/api/kernels", params=self.params - ) as response: + async with self.session.post(url="api/kernels", params=self.params) as response: response.raise_for_status() kernel_data = await response.json() self.kernel_id = kernel_data["id"] def init_ws(self) -> (str, dict): - ws_base = self.base_url.replace("http", "ws") + ws_base = self.base_url.replace("http", "ws", 1) ws_params = "?" + "&".join([f"{key}={val}" for key, val in self.params.items()]) - websocket_url = f"{ws_base}/api/kernels/{self.kernel_id}/channels{ws_params if len(ws_params) > 1 else ''}" + websocket_url = f"{ws_base}api/kernels/{self.kernel_id}/channels{ws_params if len(ws_params) > 1 else ''}" ws_headers = {} if self.password and not self.token: ws_headers = { diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index ec2949677..442dfba76 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -353,8 +353,6 @@ async def chat_web_search_handler( ) return form_data - all_results = [] - await event_emitter( { "type": "status", @@ -366,106 +364,75 @@ async def chat_web_search_handler( } ) - gathered_results = await asyncio.gather( - *( - process_web_search( - request, - SearchForm(**{"query": searchQuery}), - user=user, - ) - for searchQuery in queries - ), - return_exceptions=True, - ) + try: + results = await process_web_search( + request, + SearchForm(queries=queries), + user=user, + ) - for searchQuery, results in zip(queries, gathered_results): - try: - if isinstance(results, Exception): - raise Exception(f"Error searching {searchQuery}: {str(results)}") + if results: + files = form_data.get("files", []) - if results: - all_results.append(results) - files = form_data.get("files", []) + if results.get("collection_names"): + for col_idx, collection_name in enumerate( + results.get("collection_names") + ): + files.append( + { + "collection_name": collection_name, + "name": ", ".join(queries), + "type": "web_search", + "urls": results["filenames"], + } + ) + elif results.get("docs"): + # Invoked when bypass embedding and retrieval is set to True + docs = results["docs"] + files.append( + { + "docs": docs, + "name": ", ".join(queries), + "type": "web_search", + "urls": results["filenames"], + } + ) - if results.get("collection_names"): - for col_idx, collection_name in enumerate( - results.get("collection_names") - ): - files.append( - { - "collection_name": collection_name, - "name": searchQuery, - "type": "web_search", - "urls": [results["filenames"][col_idx]], - } - ) - elif results.get("docs"): - # Invoked when bypass embedding and retrieval is set to True - docs = results["docs"] + form_data["files"] = files - if len(docs) == len(results["filenames"]): - # the number of docs and filenames (urls) should be the same - for doc_idx, doc in enumerate(docs): - files.append( - { - "docs": [doc], - "name": searchQuery, - "type": "web_search", - "urls": [results["filenames"][doc_idx]], - } - ) - else: - # edge case when the number of docs and filenames (urls) are not the same - # this should not happen, but if it does, we will just append the docs - files.append( - { - "docs": results.get("docs", []), - "name": searchQuery, - "type": "web_search", - "urls": results["filenames"], - } - ) - - form_data["files"] = files - except Exception as e: - log.exception(e) await event_emitter( { "type": "status", "data": { "action": "web_search", - "description": 'Error searching "{{searchQuery}}"', - "query": searchQuery, + "description": "Searched {{count}} sites", + "urls": results["filenames"], + "done": True, + }, + } + ) + else: + await event_emitter( + { + "type": "status", + "data": { + "action": "web_search", + "description": "No search results found", "done": True, "error": True, }, } ) - if all_results: - urls = [] - for results in all_results: - if "filenames" in results: - urls.extend(results["filenames"]) - + except Exception as e: + log.exception(e) await event_emitter( { "type": "status", "data": { "action": "web_search", - "description": "Searched {{count}} sites", - "urls": urls, - "done": True, - }, - } - ) - else: - await event_emitter( - { - "type": "status", - "data": { - "action": "web_search", - "description": "No search results found", + "description": "An error occurred while searching the web", + "queries": queries, "done": True, "error": True, }, @@ -672,6 +639,9 @@ def apply_params_to_form_data(form_data, model): if "frequency_penalty" in params and params["frequency_penalty"] is not None: form_data["frequency_penalty"] = params["frequency_penalty"] + if "presence_penalty" in params and params["presence_penalty"] is not None: + form_data["presence_penalty"] = params["presence_penalty"] + if "reasoning_effort" in params and params["reasoning_effort"] is not None: form_data["reasoning_effort"] = params["reasoning_effort"] @@ -974,6 +944,20 @@ async def process_chat_response( if message: messages = get_message_list(message_map, message.get("id")) + # Remove reasoning details and files from the messages. + # as get_message_list creates a new list, it does not affect + # the original messages outside of this handler + for message in messages: + message["content"] = re.sub( + r"]*>.*?<\/details>", + "", + message["content"], + flags=re.S, + ).strip() + + if message.get("files"): + message["files"] = [] + if tasks and messages: if TASKS.TITLE_GENERATION in tasks: if tasks[TASKS.TITLE_GENERATION]: diff --git a/backend/open_webui/utils/oauth.py b/backend/open_webui/utils/oauth.py index efb287dbf..0bd82b577 100644 --- a/backend/open_webui/utils/oauth.py +++ b/backend/open_webui/utils/oauth.py @@ -34,6 +34,7 @@ from open_webui.config import ( OAUTH_ALLOWED_ROLES, OAUTH_ADMIN_ROLES, OAUTH_ALLOWED_DOMAINS, + OAUTH_UPDATE_PICTURE_ON_LOGIN, WEBHOOK_URL, JWT_EXPIRES_IN, AppConfig, @@ -72,6 +73,7 @@ auth_manager_config.OAUTH_ADMIN_ROLES = OAUTH_ADMIN_ROLES auth_manager_config.OAUTH_ALLOWED_DOMAINS = OAUTH_ALLOWED_DOMAINS auth_manager_config.WEBHOOK_URL = WEBHOOK_URL auth_manager_config.JWT_EXPIRES_IN = JWT_EXPIRES_IN +auth_manager_config.OAUTH_UPDATE_PICTURE_ON_LOGIN = OAUTH_UPDATE_PICTURE_ON_LOGIN class OAuthManager: @@ -282,6 +284,49 @@ class OAuthManager: id=group_model.id, form_data=update_form, overwrite=False ) + async def _process_picture_url( + self, picture_url: str, access_token: str = None + ) -> str: + """Process a picture URL and return a base64 encoded data URL. + + Args: + picture_url: The URL of the picture to process + access_token: Optional OAuth access token for authenticated requests + + Returns: + A data URL containing the base64 encoded picture, or "/user.png" if processing fails + """ + if not picture_url: + return "/user.png" + + try: + get_kwargs = {} + if access_token: + get_kwargs["headers"] = { + "Authorization": f"Bearer {access_token}", + } + async with aiohttp.ClientSession() as session: + async with session.get(picture_url, **get_kwargs) as resp: + if resp.ok: + picture = await resp.read() + base64_encoded_picture = base64.b64encode(picture).decode( + "utf-8" + ) + guessed_mime_type = mimetypes.guess_type(picture_url)[0] + if guessed_mime_type is None: + guessed_mime_type = "image/jpeg" + return ( + f"data:{guessed_mime_type};base64,{base64_encoded_picture}" + ) + else: + log.warning( + f"Failed to fetch profile picture from {picture_url}" + ) + return "/user.png" + except Exception as e: + log.error(f"Error processing profile picture '{picture_url}': {e}") + return "/user.png" + async def handle_login(self, request, provider): if provider not in OAUTH_PROVIDERS: raise HTTPException(404) @@ -382,6 +427,22 @@ class OAuthManager: if user.role != determined_role: Users.update_user_role_by_id(user.id, determined_role) + # Update profile picture if enabled and different from current + if auth_manager_config.OAUTH_UPDATE_PICTURE_ON_LOGIN: + picture_claim = auth_manager_config.OAUTH_PICTURE_CLAIM + if picture_claim: + new_picture_url = user_data.get( + picture_claim, OAUTH_PROVIDERS[provider].get("picture_url", "") + ) + processed_picture_url = await self._process_picture_url( + new_picture_url, token.get("access_token") + ) + if processed_picture_url != user.profile_image_url: + Users.update_user_profile_image_url_by_id( + user.id, processed_picture_url + ) + log.debug(f"Updated profile picture for user {user.email}") + if not user: user_count = Users.get_num_users() @@ -397,40 +458,9 @@ class OAuthManager: picture_url = user_data.get( picture_claim, OAUTH_PROVIDERS[provider].get("picture_url", "") ) - if picture_url: - # Download the profile image into a base64 string - try: - access_token = token.get("access_token") - get_kwargs = {} - if access_token: - get_kwargs["headers"] = { - "Authorization": f"Bearer {access_token}", - } - async with aiohttp.ClientSession(trust_env=True) as session: - async with session.get( - picture_url, **get_kwargs - ) as resp: - if resp.ok: - picture = await resp.read() - base64_encoded_picture = base64.b64encode( - picture - ).decode("utf-8") - guessed_mime_type = mimetypes.guess_type( - picture_url - )[0] - if guessed_mime_type is None: - # assume JPG, browsers are tolerant enough of image formats - guessed_mime_type = "image/jpeg" - picture_url = f"data:{guessed_mime_type};base64,{base64_encoded_picture}" - else: - picture_url = "/user.png" - except Exception as e: - log.error( - f"Error downloading profile image '{picture_url}': {e}" - ) - picture_url = "/user.png" - if not picture_url: - picture_url = "/user.png" + picture_url = await self._process_picture_url( + picture_url, token.get("access_token") + ) else: picture_url = "/user.png" diff --git a/backend/open_webui/utils/payload.py b/backend/open_webui/utils/payload.py index 5f8aafb78..d43dfd789 100644 --- a/backend/open_webui/utils/payload.py +++ b/backend/open_webui/utils/payload.py @@ -59,6 +59,7 @@ def apply_model_params_to_body_openai(params: dict, form_data: dict) -> dict: "top_p": float, "max_tokens": int, "frequency_penalty": float, + "presence_penalty": float, "reasoning_effort": str, "seed": lambda x: x, "stop": lambda x: [bytes(s, "utf-8").decode("unicode_escape") for s in x], diff --git a/backend/start.sh b/backend/start.sh index 4588e4c34..84d5ec895 100755 --- a/backend/start.sh +++ b/backend/start.sh @@ -65,4 +65,6 @@ if [ -n "$SPACE_ID" ]; then export WEBUI_URL=${SPACE_HOST} fi -WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" exec uvicorn open_webui.main:app --host "$HOST" --port "$PORT" --forwarded-allow-ips '*' --workers "${UVICORN_WORKERS:-1}" +PYTHON_CMD=$(command -v python3 || command -v python) + +WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" exec "$PYTHON_CMD" -m uvicorn open_webui.main:app --host "$HOST" --port "$PORT" --forwarded-allow-ips '*' --workers "${UVICORN_WORKERS:-1}" diff --git a/contribution_stats.py b/contribution_stats.py new file mode 100644 index 000000000..3caa4738e --- /dev/null +++ b/contribution_stats.py @@ -0,0 +1,74 @@ +import os +import subprocess +from collections import Counter + +CONFIG_FILE_EXTENSIONS = (".json", ".yml", ".yaml", ".ini", ".conf", ".toml") + + +def is_text_file(filepath): + # Check for binary file by scanning for null bytes. + try: + with open(filepath, "rb") as f: + chunk = f.read(4096) + if b"\0" in chunk: + return False + return True + except Exception: + return False + + +def should_skip_file(path): + base = os.path.basename(path) + # Skip dotfiles and dotdirs + if base.startswith("."): + return True + # Skip config files by extension + if base.lower().endswith(CONFIG_FILE_EXTENSIONS): + return True + return False + + +def get_tracked_files(): + try: + output = subprocess.check_output(["git", "ls-files"], text=True) + files = output.strip().split("\n") + files = [f for f in files if f and os.path.isfile(f)] + return files + except subprocess.CalledProcessError: + print("Error: Are you in a git repository?") + return [] + + +def main(): + files = get_tracked_files() + email_counter = Counter() + total_lines = 0 + + for file in files: + if should_skip_file(file): + continue + if not is_text_file(file): + continue + try: + blame = subprocess.check_output( + ["git", "blame", "-e", file], text=True, errors="replace" + ) + for line in blame.splitlines(): + # The email always inside <> + if "<" in line and ">" in line: + try: + email = line.split("<")[1].split(">")[0].strip() + except Exception: + continue + email_counter[email] += 1 + total_lines += 1 + except subprocess.CalledProcessError: + continue + + for email, lines in email_counter.most_common(): + percent = (lines / total_lines * 100) if total_lines else 0 + print(f"{email}: {lines}/{total_lines} {percent:.2f}%") + + +if __name__ == "__main__": + main() diff --git a/package-lock.json b/package-lock.json index 4ebe758d1..de4902c16 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "open-webui", - "version": "0.6.7", + "version": "0.6.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "open-webui", - "version": "0.6.7", + "version": "0.6.8", "dependencies": { "@azure/msal-browser": "^4.5.0", "@codemirror/lang-javascript": "^6.2.2", @@ -36,6 +36,7 @@ "dompurify": "^3.2.5", "eventsource-parser": "^1.1.2", "file-saver": "^2.0.5", + "focus-trap": "^7.6.4", "fuse.js": "^7.0.0", "highlight.js": "^11.9.0", "html-entities": "^2.5.3", @@ -6801,9 +6802,10 @@ "dev": true }, "node_modules/focus-trap": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", - "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.4.tgz", + "integrity": "sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==", + "license": "MIT", "dependencies": { "tabbable": "^6.2.0" } diff --git a/package.json b/package.json index efd0f2cf3..7fa6ac5a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "open-webui", - "version": "0.6.7", + "version": "0.6.8", "private": true, "scripts": { "dev": "npm run pyodide:fetch && vite dev --host", @@ -79,6 +79,7 @@ "dompurify": "^3.2.5", "eventsource-parser": "^1.1.2", "file-saver": "^2.0.5", + "focus-trap": "^7.6.4", "fuse.js": "^7.0.0", "highlight.js": "^11.9.0", "html-entities": "^2.5.3", diff --git a/src/app.css b/src/app.css index d0bd50ace..588247164 100644 --- a/src/app.css +++ b/src/app.css @@ -24,6 +24,12 @@ font-display: swap; } +@font-face { + font-family: 'Vazirmatn'; + src: url('/assets/fonts/Vazirmatn-Variable.ttf'); + font-display: swap; +} + html { word-break: break-word; } diff --git a/src/lib/components/ChangelogModal.svelte b/src/lib/components/ChangelogModal.svelte index fd727c2c4..2e7dfa199 100644 --- a/src/lib/components/ChangelogModal.svelte +++ b/src/lib/components/ChangelogModal.svelte @@ -43,6 +43,7 @@ fill="currentColor" class="w-5 h-5" > +

{$i18n.t('Close')}

diff --git a/src/lib/components/OnBoarding.svelte b/src/lib/components/OnBoarding.svelte index 1976e5c6e..f0a4a52dc 100644 --- a/src/lib/components/OnBoarding.svelte +++ b/src/lib/components/OnBoarding.svelte @@ -87,6 +87,7 @@
-
{$i18n.t(`Get started`)}
+
+ {$i18n.t(`Get started`)} +
- - {/if} diff --git a/src/lib/components/admin/Settings/Documents.svelte b/src/lib/components/admin/Settings/Documents.svelte index b54404f79..cc56356fa 100644 --- a/src/lib/components/admin/Settings/Documents.svelte +++ b/src/lib/components/admin/Settings/Documents.svelte @@ -123,35 +123,6 @@ } }; - const rerankingModelUpdateHandler = async () => { - console.log('Update reranking model attempt:', rerankingModel); - - updateRerankingModelLoading = true; - const res = await updateRerankingConfig(localStorage.token, { - reranking_model: rerankingModel - }).catch(async (error) => { - toast.error(`${error}`); - await setRerankingConfig(); - return null; - }); - updateRerankingModelLoading = false; - - if (res) { - console.log('rerankingModelUpdateHandler:', res); - if (res.status === true) { - if (rerankingModel === '') { - toast.success($i18n.t('Reranking model disabled', res), { - duration: 1000 * 10 - }); - } else { - toast.success($i18n.t('Reranking model set to "{{reranking_model}}"', res), { - duration: 1000 * 10 - }); - } - } - } - }; - const submitHandler = async () => { if (RAGConfig.CONTENT_EXTRACTION_ENGINE === 'tika' && RAGConfig.TIKA_SERVER_URL === '') { toast.error($i18n.t('Tika Server URL required.')); @@ -190,10 +161,6 @@ if (!RAGConfig.BYPASS_EMBEDDING_AND_RETRIEVAL) { await embeddingModelUpdateHandler(); - - if (RAGConfig.ENABLE_RAG_HYBRID_SEARCH) { - await rerankingModelUpdateHandler(); - } } const res = await updateRAGConfig(localStorage.token, RAGConfig); @@ -215,18 +182,8 @@ OllamaUrl = embeddingConfig.ollama_config.url; } }; - - const setRerankingConfig = async () => { - const rerankingConfig = await getRerankingConfig(localStorage.token); - - if (rerankingConfig) { - rerankingModel = rerankingConfig.reranking_model; - } - }; - onMount(async () => { await setEmbeddingConfig(); - await setRerankingConfig(); RAGConfig = await getRAGConfig(localStorage.token); }); @@ -655,6 +612,48 @@ {#if RAGConfig.ENABLE_RAG_HYBRID_SEARCH === true} +
+
+
+ {$i18n.t('Reranking Engine')} +
+
+ +
+
+ + {#if RAGConfig.RAG_RERANKING_ENGINE === 'external'} +
+ + + +
+ {/if} +
+
{$i18n.t('Reranking Model')}
@@ -666,62 +665,9 @@ placeholder={$i18n.t('Set reranking model (e.g. {{model}})', { model: 'BAAI/bge-reranker-v2-m3' })} - bind:value={rerankingModel} + bind:value={RAGConfig.RAG_RERANKING_MODEL} />
- diff --git a/src/lib/components/admin/Users/UserList.svelte b/src/lib/components/admin/Users/UserList.svelte index 1f091c47a..f9b0b7937 100644 --- a/src/lib/components/admin/Users/UserList.svelte +++ b/src/lib/components/admin/Users/UserList.svelte @@ -32,13 +32,14 @@ import About from '$lib/components/chat/Settings/About.svelte'; import Banner from '$lib/components/common/Banner.svelte'; import Markdown from '$lib/components/chat/Messages/Markdown.svelte'; + import Spinner from '$lib/components/common/Spinner.svelte'; const i18n = getContext('i18n'); let page = 1; - let users = []; - let total = 0; + let users = null; + let total = null; let query = ''; let orderBy = 'created_at'; // default sort key @@ -181,314 +182,293 @@ {/if} -
-
-
- {$i18n.t('Users')} -
-
+{#if users === null || total === null} +
+ +
+{:else} +
+
+
+ {$i18n.t('Users')} +
+
- {#if ($config?.license_metadata?.seats ?? null) !== null} - {#if total > $config?.license_metadata?.seats} - {total} of {$config?.license_metadata?.seats} - available users + {#if ($config?.license_metadata?.seats ?? null) !== null} + {#if total > $config?.license_metadata?.seats} + {total} of {$config?.license_metadata?.seats} + available users + {:else} + {total} of {$config?.license_metadata?.seats} + available users + {/if} {:else} - {total} of {$config?.license_metadata?.seats} - available users + {total} {/if} - {:else} - {total} - {/if} -
- -
-
-
-
- - - -
- -
- -
- - - -
-
-
-
- - - - - - - - - - - - - - - - {#each users as user, userIdx} - - - - +
+
setSortKey('role')} - > -
- {$i18n.t('Role')} - - {#if orderBy === 'role'} - {#if direction === 'asc'} - - {:else} - - {/if} - - {:else} - - {/if} +
+
+
+
+ + +
-
setSortKey('name')} - > -
- {$i18n.t('Name')} + +
- {#if orderBy === 'name'} - {#if direction === 'asc'} - - {:else} - - {/if} - - {:else} - - {/if} - -
setSortKey('email')} - > -
- {$i18n.t('Email')} - - {#if orderBy === 'email'} - {#if direction === 'asc'} - - {:else} - - {/if} - - {:else} - - {/if} -
-
setSortKey('last_active_at')} - > -
- {$i18n.t('Last Active')} - - {#if orderBy === 'last_active_at'} - {#if direction === 'asc'} - - {:else} - - {/if} - - {:else} - - {/if} -
-
setSortKey('created_at')} - > -
- {$i18n.t('Created at')} - {#if orderBy === 'created_at'} - {#if direction === 'asc'} - - {:else} - - {/if} - - {:else} - - {/if} -
-
setSortKey('oauth_sub')} - > -
- {$i18n.t('OAuth ID')} - - {#if orderBy === 'oauth_sub'} - {#if direction === 'asc'} - - {:else} - - {/if} - - {:else} - - {/if} -
-
-
+
+ -
-
- user + +
+ + + -
{user.name}
- -
{user.email}
+ + + - - - - - - + + + + + + + + + + + {#each users as user, userIdx} + + + + + + + + + + + + - - {/each} - -
setSortKey('role')} + > +
+ {$i18n.t('Role')} -
- {dayjs(user.last_active_at * 1000).fromNow()} - - {dayjs(user.created_at * 1000).format('LL')} - {user.oauth_sub ?? ''} -
- {#if $config.features.enable_admin_chat_access && user.role !== 'admin'} - - - + {#if orderBy === 'role'} + {#if direction === 'asc'} + + {:else} + + {/if} + + {:else} + {/if} +
+ +
setSortKey('name')} + > +
+ {$i18n.t('Name')} - - - + {#if orderBy === 'name'} + {#if direction === 'asc'} + + {:else} + + {/if} + + {:else} + + {/if} +
+
setSortKey('email')} + > +
+ {$i18n.t('Email')} - {#if user.role !== 'admin'} - + {#if orderBy === 'email'} + {#if direction === 'asc'} + + {:else} + + {/if} + + {:else} + + {/if} +
+
setSortKey('last_active_at')} + > +
+ {$i18n.t('Last Active')} + + {#if orderBy === 'last_active_at'} + {#if direction === 'asc'} + + {:else} + + {/if} + + {:else} + + {/if} +
+
setSortKey('created_at')} + > +
+ {$i18n.t('Created at')} + {#if orderBy === 'created_at'} + {#if direction === 'asc'} + + {:else} + + {/if} + + {:else} + + {/if} +
+
setSortKey('oauth_sub')} + > +
+ {$i18n.t('OAuth ID')} + + {#if orderBy === 'oauth_sub'} + {#if direction === 'asc'} + + {:else} + + {/if} + + {:else} + + {/if} +
+
+
+ + +
+ user + +
{user.name}
+
+
{user.email} + {dayjs(user.last_active_at * 1000).fromNow()} + + {dayjs(user.created_at * 1000).format('LL')} + {user.oauth_sub ?? ''} +
+ {#if $config.features.enable_admin_chat_access && user.role !== 'admin'} + + + + {/if} + + - {/if} -
-
-
-
- ⓘ {$i18n.t("Click on the user role button to change a user's role.")} -
+ {#if user.role !== 'admin'} + + + + {/if} +
+ + + {/each} + + +
- +
+ ⓘ {$i18n.t("Click on the user role button to change a user's role.")} +
+ + +{/if} {#if !$config?.license_metadata} {#if total > 50} diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index d578f3d63..5d11ce940 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -440,8 +440,10 @@ } } - loading = false; - await tick(); + if (!chatIdProp) { + loading = false; + await tick(); + } showControls.subscribe(async (value) => { if (controlPane && !$mobile) { diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index babb5e565..9e5593ea9 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -86,7 +86,7 @@ $: onChange({ prompt, - files, + files: files.filter((file) => file.type !== 'image'), selectedToolIds, imageGenerationEnabled, webSearchEnabled, @@ -604,7 +604,7 @@
{#if $settings?.richTextInput ?? true}
{#if Object.keys(tools).length > 0} -
+
{#each Object.keys(tools) as toolId}
- + {#if Object.keys(tools).length > 3} + + {/if}
{/if} diff --git a/src/lib/components/chat/Messages/Markdown/HTMLToken.svelte b/src/lib/components/chat/Messages/Markdown/HTMLToken.svelte index 168df854d..8e12f4bf0 100644 --- a/src/lib/components/chat/Messages/Markdown/HTMLToken.svelte +++ b/src/lib/components/chat/Messages/Markdown/HTMLToken.svelte @@ -32,6 +32,7 @@ title="Video player" frameborder="0" referrerpolicy="strict-origin-when-cross-origin" + controls allowfullscreen > {:else} diff --git a/src/lib/components/chat/Settings/Interface.svelte b/src/lib/components/chat/Settings/Interface.svelte index f78fa5593..f17c8b40d 100644 --- a/src/lib/components/chat/Settings/Interface.svelte +++ b/src/lib/components/chat/Settings/Interface.svelte @@ -54,6 +54,9 @@ height: '' }; + // chat export + let stylizedPdfExport = true; + // Admin - Show Update Available Toast let showUpdateToast = true; let showChangelog = true; @@ -152,6 +155,11 @@ saveSettings({ hapticFeedback: hapticFeedback }); }; + const toggleStylizedPdfExport = async () => { + stylizedPdfExport = !stylizedPdfExport; + saveSettings({ stylizedPdfExport: stylizedPdfExport }); + }; + const toggleUserLocation = async () => { userLocation = !userLocation; @@ -302,6 +310,11 @@ notificationSound = $settings?.notificationSound ?? true; notificationSoundAlways = $settings?.notificationSoundAlways ?? false; + iframeSandboxAllowSameOrigin = $settings?.iframeSandboxAllowSameOrigin ?? false; + iframeSandboxAllowForms = $settings?.iframeSandboxAllowForms ?? false; + + stylizedPdfExport = $settings?.stylizedPdfExport ?? true; + hapticFeedback = $settings.hapticFeedback ?? false; ctrlEnterToSend = $settings.ctrlEnterToSend ?? false; @@ -964,6 +977,28 @@
+
+
+
+ {$i18n.t('Stylized PDF Export')} +
+ + +
+
+
{$i18n.t('Voice')}
diff --git a/src/lib/components/common/Modal.svelte b/src/lib/components/common/Modal.svelte index 07f5c46af..e31a5248d 100644 --- a/src/lib/components/common/Modal.svelte +++ b/src/lib/components/common/Modal.svelte @@ -3,7 +3,7 @@ import { fade } from 'svelte/transition'; import { flyAndScale } from '$lib/utils/transitions'; - + import * as FocusTrap from 'focus-trap'; export let show = true; export let size = 'md'; export let containerClassName = 'p-3'; @@ -11,6 +11,10 @@ let modalElement = null; let mounted = false; + // Create focus trap to trap user tabs inside modal + // https://www.w3.org/WAI/WCAG21/Understanding/focus-order.html + // https://www.w3.org/WAI/WCAG21/Understanding/keyboard.html + let focusTrap: FocusTrap.FocusTrap | null = null; const sizeToWidth = (size) => { if (size === 'full') { @@ -45,9 +49,12 @@ $: if (show && modalElement) { document.body.appendChild(modalElement); + focusTrap = FocusTrap.createFocusTrap(modalElement); + focusTrap.activate(); window.addEventListener('keydown', handleKeyDown); document.body.style.overflow = 'hidden'; } else if (modalElement) { + focusTrap.deactivate(); window.removeEventListener('keydown', handleKeyDown); document.body.removeChild(modalElement); document.body.style.overflow = 'unset'; @@ -55,6 +62,9 @@ onDestroy(() => { show = false; + if (focusTrap) { + focusTrap.deactivate(); + } if (modalElement) { document.body.removeChild(modalElement); } @@ -66,6 +76,8 @@ @@ -822,7 +822,7 @@ className="input-prose-sm" bind:value={selectedFileContent} placeholder={$i18n.t('Add content here')} - preserveBreaks={true} + preserveBreaks={false} /> {/key}
diff --git a/src/lib/i18n/locales/ar-BH/translation.json b/src/lib/i18n/locales/ar-BH/translation.json index 97e3392ce..0de51c2a7 100644 --- a/src/lib/i18n/locales/ar-BH/translation.json +++ b/src/lib/i18n/locales/ar-BH/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "وضع الطلب", + "Reranking Engine": "", "Reranking Model": "إعادة تقييم النموذج", - "Reranking model disabled": "تم تعطيل نموذج إعادة الترتيب", - "Reranking model set to \"{{reranking_model}}\"": "تم ضبط نموذج إعادة الترتيب على \"{{reranking_model}}\"", "Reset": "", "Reset All Models": "", "Reset Upload Directory": "", @@ -1069,6 +1068,8 @@ "Show": "عرض", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "إظهار الاختصارات", "Show your support!": "", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "", "STT Settings": "STT اعدادات", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "(e.g. about the Roman Empire) الترجمة", "Success": "نجاح", "Successfully updated.": "تم التحديث بنجاح", diff --git a/src/lib/i18n/locales/ar/translation.json b/src/lib/i18n/locales/ar/translation.json index 735171b1f..7ae8bc594 100644 --- a/src/lib/i18n/locales/ar/translation.json +++ b/src/lib/i18n/locales/ar/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "عقوبة التكرار (Ollama)", "Reply in Thread": "الرد داخل سلسلة الرسائل", "Request Mode": "وضع الطلب", + "Reranking Engine": "", "Reranking Model": "إعادة تقييم النموذج", - "Reranking model disabled": "تم تعطيل نموذج إعادة الترتيب", - "Reranking model set to \"{{reranking_model}}\"": "تم ضبط نموذج إعادة الترتيب على \"{{reranking_model}}\"", "Reset": "إعادة تعيين", "Reset All Models": "إعادة تعيين جميع النماذج", "Reset Upload Directory": "إعادة تعيين مجلد التحميل", @@ -1069,6 +1068,8 @@ "Show": "عرض", "Show \"What's New\" modal on login": "عرض نافذة \"ما الجديد\" عند تسجيل الدخول", "Show Admin Details in Account Pending Overlay": "عرض تفاصيل المشرف في نافذة \"الحساب قيد الانتظار\"", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "إظهار الاختصارات", "Show your support!": "أظهر دعمك!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "بث استجابة الدردشة", "STT Model": "نموذج تحويل الصوت إلى نص (STT)", "STT Settings": "STT اعدادات", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "(e.g. about the Roman Empire) الترجمة", "Success": "نجاح", "Successfully updated.": "تم التحديث بنجاح", diff --git a/src/lib/i18n/locales/bg-BG/translation.json b/src/lib/i18n/locales/bg-BG/translation.json index f72bb308c..110a30044 100644 --- a/src/lib/i18n/locales/bg-BG/translation.json +++ b/src/lib/i18n/locales/bg-BG/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "Наказание за повторение (Ollama)", "Reply in Thread": "Отговори в тред", "Request Mode": "Режим на заявка", + "Reranking Engine": "", "Reranking Model": "Модел за преподреждане", - "Reranking model disabled": "Моделът за преподреждане е деактивиран", - "Reranking model set to \"{{reranking_model}}\"": "Моделът за преподреждане е зададен на \"{{reranking_model}}\"", "Reset": "Нулиране", "Reset All Models": "Нулиране на всички модели", "Reset Upload Directory": "Нулиране на директорията за качване", @@ -1069,6 +1068,8 @@ "Show": "Покажи", "Show \"What's New\" modal on login": "Покажи модалния прозорец \"Какво е ново\" при вписване", "Show Admin Details in Account Pending Overlay": "Покажи детайлите на администратора в наслагването на изчакващ акаунт", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Покажи преки пътища", "Show your support!": "Покажете вашата подкрепа!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Поточен чат отговор", "STT Model": "STT Модел", "STT Settings": "STT Настройки", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Подтитул (напр. за Римска империя)", "Success": "Успех", "Successfully updated.": "Успешно обновено.", diff --git a/src/lib/i18n/locales/bn-BD/translation.json b/src/lib/i18n/locales/bn-BD/translation.json index 08e5d82b1..1a7382017 100644 --- a/src/lib/i18n/locales/bn-BD/translation.json +++ b/src/lib/i18n/locales/bn-BD/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "রিকোয়েস্ট মোড", + "Reranking Engine": "", "Reranking Model": "রির্যাক্টিং মডেল", - "Reranking model disabled": "রির্যাক্টিং মডেল নিষ্ক্রিয় করা", - "Reranking model set to \"{{reranking_model}}\"": "রির ্যাঙ্কিং মডেল \"{{reranking_model}}\" -এ সেট করা আছে", "Reset": "", "Reset All Models": "", "Reset Upload Directory": "", @@ -1069,6 +1068,8 @@ "Show": "দেখান", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "শর্টকাটগুলো দেখান", "Show your support!": "", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "", "STT Settings": "STT সেটিংস", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "সাবটাইটল (রোমান ইম্পার্টের সম্পর্কে)", "Success": "সফল", "Successfully updated.": "সফলভাবে আপডেট হয়েছে", diff --git a/src/lib/i18n/locales/bo-TB/translation.json b/src/lib/i18n/locales/bo-TB/translation.json index 6f40b29b0..fc36c5953 100644 --- a/src/lib/i18n/locales/bo-TB/translation.json +++ b/src/lib/i18n/locales/bo-TB/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "བསྐྱར་ཟློས་ཀྱི་ཆད་པ། (Ollama)", "Reply in Thread": "བརྗོད་གཞིའི་ནང་ལན་འདེབས།", "Request Mode": "རེ་ཞུའི་མ་དཔེ།", + "Reranking Engine": "", "Reranking Model": "བསྐྱར་སྒྲིག་དཔེ་དབྱིབས།", - "Reranking model disabled": "བསྐྱར་སྒྲིག་དཔེ་དབྱིབས་ནུས་མེད་བཏང་།", - "Reranking model set to \"{{reranking_model}}\"": "བསྐྱར་སྒྲིག་དཔེ་དབྱིབས་ \"{{reranking_model}}\" ལ་བཀོད་སྒྲིག་བྱས།", "Reset": "སླར་སྒྲིག", "Reset All Models": "དཔེ་དབྱིབས་ཡོངས་རྫོགས་སླར་སྒྲིག", "Reset Upload Directory": "སྤར་བའི་ཐོ་འཚོལ་སླར་སྒྲིག", @@ -1069,6 +1068,8 @@ "Show": "སྟོན་པ།", "Show \"What's New\" modal on login": "ནང་འཛུལ་སྐབས་ \"གསར་པ་ཅི་ཡོད\" modal སྟོན་པ།", "Show Admin Details in Account Pending Overlay": "རྩིས་ཁྲ་སྒུག་བཞིན་པའི་གཏོགས་ངོས་སུ་དོ་དམ་པའི་ཞིབ་ཕྲ་སྟོན་པ།", + "Show All": "", + "Show Less": "", "Show Model": "དཔེ་དབྱིབས་སྟོན་པ།", "Show shortcuts": "མྱུར་ལམ་སྟོན་པ།", "Show your support!": "ཁྱེད་ཀྱི་རྒྱབ་སྐྱོར་སྟོན་པ།", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "ཁ་བརྡའི་ལན་རྒྱུག་པ།", "STT Model": "STT དཔེ་དབྱིབས།", "STT Settings": "STT སྒྲིག་འགོད།", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "ཁ་བྱང་ཕལ་པ། (དཔེར་ན། རོམ་མའི་གོང་མའི་རྒྱལ་ཁབ་སྐོར།)", "Success": "ལེགས་འགྲུབ།", "Successfully updated.": "ལེགས་པར་གསར་སྒྱུར་བྱས།", diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index 8afeee176..09a8b559b 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "Penalització per repetició (Ollama)", "Reply in Thread": "Respondre al fil", "Request Mode": "Mode de sol·licitud", + "Reranking Engine": "", "Reranking Model": "Model de reavaluació", - "Reranking model disabled": "Model de reavaluació desactivat", - "Reranking model set to \"{{reranking_model}}\"": "Model de reavaluació establert a \"{{reranking_model}}\"", "Reset": "Restableix", "Reset All Models": "Restablir tots els models", "Reset Upload Directory": "Restableix el directori de pujades", @@ -1069,6 +1068,8 @@ "Show": "Mostrar", "Show \"What's New\" modal on login": "Veure 'Què hi ha de nou' a l'entrada", "Show Admin Details in Account Pending Overlay": "Mostrar els detalls de l'administrador a la superposició del compte pendent", + "Show All": "", + "Show Less": "", "Show Model": "Mostrar el model", "Show shortcuts": "Mostrar dreceres", "Show your support!": "Mostra el teu suport!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Fer streaming de la resposta del xat", "STT Model": "Model SST", "STT Settings": "Preferències de STT", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Subtítol (per exemple, sobre l'Imperi Romà)", "Success": "Èxit", "Successfully updated.": "Actualitzat correctament.", diff --git a/src/lib/i18n/locales/ceb-PH/translation.json b/src/lib/i18n/locales/ceb-PH/translation.json index a126b71b5..94d7da452 100644 --- a/src/lib/i18n/locales/ceb-PH/translation.json +++ b/src/lib/i18n/locales/ceb-PH/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "Query mode", + "Reranking Engine": "", "Reranking Model": "", - "Reranking model disabled": "", - "Reranking model set to \"{{reranking_model}}\"": "", "Reset": "", "Reset All Models": "", "Reset Upload Directory": "", @@ -1069,6 +1068,8 @@ "Show": "Pagpakita", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Ipakita ang mga shortcut", "Show your support!": "", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "", "STT Settings": "Mga setting sa STT", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "", "Success": "Kalampusan", "Successfully updated.": "Malampuson nga na-update.", diff --git a/src/lib/i18n/locales/cs-CZ/translation.json b/src/lib/i18n/locales/cs-CZ/translation.json index ff1adb4ad..c3c08d807 100644 --- a/src/lib/i18n/locales/cs-CZ/translation.json +++ b/src/lib/i18n/locales/cs-CZ/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "Režim žádosti", + "Reranking Engine": "", "Reranking Model": "Model pro přehodnocení pořadí", - "Reranking model disabled": "Přeřazovací model je deaktivován", - "Reranking model set to \"{{reranking_model}}\"": "Model pro přeřazení nastaven na \"{{reranking_model}}\"", "Reset": "režim Reset", "Reset All Models": "", "Reset Upload Directory": "Resetovat adresář nahrávání", @@ -1069,6 +1068,8 @@ "Show": "Zobrazit", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "Zobrazit podrobnosti administrátora v překryvném okně s čekajícím účtem", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Zobrazit klávesové zkratky", "Show your support!": "Vyjadřete svou podporu!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Odezva chatu Stream", "STT Model": "Model rozpoznávání řeči na text (STT)", "STT Settings": "Nastavení STT (Rozpoznávání řeči)", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Titulky (např. o Římské říši)", "Success": "Úspěch", "Successfully updated.": "Úspěšně aktualizováno.", diff --git a/src/lib/i18n/locales/da-DK/translation.json b/src/lib/i18n/locales/da-DK/translation.json index 00291ea10..45ebbb431 100644 --- a/src/lib/i18n/locales/da-DK/translation.json +++ b/src/lib/i18n/locales/da-DK/translation.json @@ -26,7 +26,7 @@ "Accurate information": "Profilinformation", "Actions": "Handlinger", "Activate": "Aktiver", - "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "", + "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Aktiver denne kommando ved at skrive \"/{{COMMAND}}\" til chat input.", "Active Users": "Aktive brugere", "Add": "Tilføj", "Add a model ID": "Tilføj en model-ID", @@ -41,7 +41,7 @@ "Add Group": "Tilføj gruppe", "Add Memory": "Tilføj hukommelse", "Add Model": "Tilføj model", - "Add Reaction": "", + "Add Reaction": "Tilføj reaktion", "Add Tag": "Tilføj tag", "Add Tags": "Tilføj tags", "Add text content": "Tilføj tekst", @@ -63,8 +63,8 @@ "Allow Chat Delete": "Tillad sletning af chats", "Allow Chat Deletion": "Tillad sletning af chats", "Allow Chat Edit": "Tillad redigering af chats", - "Allow Chat Export": "", - "Allow Chat Share": "", + "Allow Chat Export": "Tillad eksport af chats", + "Allow Chat Share": "Tillad deling af chats", "Allow File Upload": "Tillad upload af fil", "Allow Multiple Models in Chat": "Tillad flere modeller i chats", "Allow non-local voices": "Tillad ikke-lokale stemmer", @@ -95,7 +95,7 @@ "API keys": "API nøgler", "Application DN": "", "Application DN Password": "", - "applies to all users with the \"user\" role": "", + "applies to all users with the \"user\" role": "gælder for alle brugere med \"bruger\" rolle", "April": "April", "Archive": "Arkiv", "Archive All Chats": "Arkiver alle chats", @@ -125,7 +125,7 @@ "Auto-Copy Response to Clipboard": "Automatisk kopiering af svar til udklipsholder", "Auto-playback response": "Automatisk afspil svar", "Autocomplete Generation": "Genere automatisk fuldførsel", - "Autocomplete Generation Input Max Length": "", + "Autocomplete Generation Input Max Length": "Maksimal længde for genereret autofuldførsel", "Automatic1111": "Automatic1111", "AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api Auth String", "AUTOMATIC1111 Base URL": "AUTOMATIC1111 Base URL", @@ -165,7 +165,7 @@ "Channel Name": "Kanalnavn", "Channels": "Kanaler", "Character": "Karakterer", - "Character limit for autocomplete generation input": "", + "Character limit for autocomplete generation input": "Karaktergrænse for genereret autofuldførsel", "Chart new frontiers": "", "Chat": "Chat", "Chat Background Image": "Chat baggrundsbillede", @@ -173,8 +173,8 @@ "Chat Controls": "Chat indstillinger", "Chat direction": "Chat retning", "Chat Overview": "Chat overblik", - "Chat Permissions": "", - "Chat Tags Auto-Generation": "", + "Chat Permissions": "Chat tilladelser", + "Chat Tags Auto-Generation": "Chat tags automatisk generering", "Chats": "Chats", "Check Again": "Tjek igen", "Check for updates": "Søg efter opdateringer", @@ -182,17 +182,17 @@ "Choose a model before saving...": "Vælg en model før du gemmer", "Chunk Overlap": "Chunk overlap", "Chunk Size": "Chunk størrelse", - "Ciphers": "", + "Ciphers": "Ciphers", "Citation": "Citat", "Clear memory": "Slet hukommelse", - "Clear Memory": "", - "click here": "", - "Click here for filter guides.": "", + "Clear Memory": "Slet hukommelse", + "click here": "klik her", + "Click here for filter guides.": "Klik her for filter guider", "Click here for help.": "Klik her for hjælp", "Click here to": "Klik her for at", "Click here to download user import template file.": "Klik her for at downloade bruger import template fil.", - "Click here to learn more about faster-whisper and see the available models.": "", - "Click here to see available models.": "", + "Click here to learn more about faster-whisper and see the available models.": "Klik her for at lære mere om faster-whisper og se tilgængelige modeller.", + "Click here to see available models.": "Klik her for at se tilgængelige modeller.", "Click here to select": "Klik her for at vælge", "Click here to select a csv file.": "Klik her for at vælge en csv fil", "Click here to select a py file.": "Klik her for at vælge en py fil", @@ -201,40 +201,40 @@ "Click on the user role button to change a user's role.": "Klik på bruger ikonet for at ændre brugerens rolle.", "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Skriveadgang til udklipsholderen ikke tilladt. Tjek venligst indstillingerne i din browser for at give adgang.", "Clone": "Klon", - "Clone Chat": "", - "Clone of {{TITLE}}": "", + "Clone Chat": "Klon chat", + "Clone of {{TITLE}}": "Klon af {{TITLE}}", "Close": "Luk", - "Code execution": "", - "Code Execution": "", - "Code Execution Engine": "", - "Code Execution Timeout": "", + "Code execution": "Kode kørsel", + "Code Execution": "Kode kørsel", + "Code Execution Engine": "Kode kørsel engine", + "Code Execution Timeout": "Kode kørsel timeout", "Code formatted successfully": "Kode formateret korrekt", - "Code Interpreter": "", - "Code Interpreter Engine": "", - "Code Interpreter Prompt Template": "", - "Collapse": "", + "Code Interpreter": "Kode interpreter", + "Code Interpreter Engine": "Kode interpreter engine", + "Code Interpreter Prompt Template": "Kode interpreter prompt template", + "Collapse": "Kollapse", "Collection": "Samling", - "Color": "", + "Color": "Farve", "ComfyUI": "ComfyUI", - "ComfyUI API Key": "", + "ComfyUI API Key": "ComfyUI API Key", "ComfyUI Base URL": "ComfyUI Base URL", "ComfyUI Base URL is required.": "ComfyUI Base URL er påkrævet.", "ComfyUI Workflow": "ComfyUI Workflow", "ComfyUI Workflow Nodes": "ComfyUI Workflow Nodes", "Command": "Kommando", - "Completions": "", + "Completions": "Completions", "Concurrent Requests": "Concurrent requests", - "Configure": "", + "Configure": "Konfigurer", "Confirm": "Bekræft", "Confirm Password": "Bekræft password", "Confirm your action": "Bekræft din handling", - "Confirm your new password": "", - "Connect to your own OpenAI compatible API endpoints.": "", + "Confirm your new password": "Bekræft dit nye password", + "Connect to your own OpenAI compatible API endpoints.": "Opret forbindelse til din egen OpenAI kompatible API endpoints.", "Connect to your own OpenAPI compatible external tool servers.": "", - "Connection failed": "", - "Connection successful": "", + "Connection failed": "Forbindelse mislykkedes", + "Connection successful": "Forbindelse lykkedes", "Connections": "Forbindelser", - "Connections saved successfully": "", + "Connections saved successfully": "Forbindelser gemt", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "", "Contact Admin for WebUI Access": "Kontakt din administrator for adgang til WebUI", "Content": "Indhold", @@ -242,8 +242,8 @@ "Context Length": "Kontekst længde", "Continue Response": "Fortsæt svar", "Continue with {{provider}}": "Fortsæt med {{provider}}", - "Continue with Email": "", - "Continue with LDAP": "", + "Continue with Email": "Fortsæt med Email", + "Continue with LDAP": "Fortsæt med LDAP", "Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "Kontroller hvordan beskedens tekst bliver splittet til TTS requests. 'Punctuation' (tegnsætning) splitter i sætninger, 'paragraphs' splitter i paragraffer, og 'none' beholder beskeden som en samlet streng.", "Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "", "Controls": "Indstillinger", @@ -252,34 +252,34 @@ "Copied shared chat URL to clipboard!": "Link til deling kopieret til udklipsholder", "Copied to clipboard": "Kopieret til udklipsholder", "Copy": "Kopier", - "Copy Formatted Text": "", + "Copy Formatted Text": "Kopier formateret tekst", "Copy last code block": "Kopier seneste kode", "Copy last response": "Kopier senester svar", "Copy Link": "Kopier link", - "Copy to clipboard": "", + "Copy to clipboard": "Kopier til udklipsholder", "Copying to clipboard was successful!": "Kopieret til udklipsholder!", "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", - "Create": "", - "Create a knowledge base": "", + "Create": "Opret", + "Create a knowledge base": "Opret en videnbase", "Create a model": "Lav en model", "Create Account": "Opret profil", - "Create Admin Account": "", - "Create Channel": "", - "Create Group": "", + "Create Admin Account": "Opret administrator profil", + "Create Channel": "Opret kanal", + "Create Group": "Opret gruppe", "Create Knowledge": "Opret Viden", "Create new key": "Opret en ny nøgle", "Create new secret key": "Opret en ny hemmelig nøgle", - "Create Note": "", - "Create your first note by clicking on the plus button below.": "", + "Create Note": "Opret note", + "Create your first note by clicking on the plus button below.": "Opret din første note ved at klikke på plus knappen nedenfor.", "Created at": "Oprettet", "Created At": "Oprettet", "Created by": "Oprettet af", "CSV Import": "Importer CSV", - "Ctrl+Enter to Send": "", + "Ctrl+Enter to Send": "Ctrl+Enter til at sende", "Current Model": "Nuværende model", "Current Password": "Nuværende password", "Custom": "Custom", - "Danger Zone": "", + "Danger Zone": "Danger Zone", "Dark": "Mørk", "Database": "Database", "December": "december", @@ -289,41 +289,41 @@ "Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "", "Default Model": "Standard model", "Default model updated": "Standard model opdateret", - "Default Models": "", - "Default permissions": "", - "Default permissions updated successfully": "", + "Default Models": "Standard modeller", + "Default permissions": "Standard tilladelser", + "Default permissions updated successfully": "Standard tilladelser opdateret", "Default Prompt Suggestions": "Standardforslag til prompt", "Default to 389 or 636 if TLS is enabled": "", - "Default to ALL": "", + "Default to ALL": "Standard til ALLE", "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "", "Default User Role": "Brugers rolle som standard", "Delete": "Slet", "Delete a model": "Slet en model", "Delete All Chats": "Slet alle chats", - "Delete All Models": "", + "Delete All Models": "Slet alle modeller", "Delete chat": "Slet chat", "Delete Chat": "Slet chat", "Delete chat?": "Slet chat?", - "Delete folder?": "", + "Delete folder?": "Slet mappe?", "Delete function?": "Slet funktion?", - "Delete Message": "", - "Delete message?": "", - "Delete note?": "", + "Delete Message": "Slet besked", + "Delete message?": "Slet besked?", + "Delete note?": "Slet note?", "Delete prompt?": "Slet prompt?", "delete this link": "slet dette link", "Delete tool?": "Slet værktøj?", "Delete User": "Slet bruger", "Deleted {{deleteModelTag}}": "Slettede {{deleteModelTag}}", "Deleted {{name}}": "Slettede {{name}}", - "Deleted User": "", - "Describe your knowledge base and objectives": "", + "Deleted User": "Slettede bruger", + "Describe your knowledge base and objectives": "Beskriv din videnbase og mål", "Description": "Beskrivelse", - "Detect Artifacts Automatically": "", + "Detect Artifacts Automatically": "Genkend artifakter automatisk", "Didn't fully follow instructions": "Fulgte ikke instruktioner", - "Direct": "", - "Direct Connections": "", - "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", - "Direct Connections settings updated": "", + "Direct": "Direkte", + "Direct Connections": "Direkte forbindelser", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Direkte forbindelser tillader brugere at oprette forbindelse til deres egen OpenAI kompatible API endpoints.", + "Direct Connections settings updated": "Direkte forbindelser indstillinger opdateret", "Direct Tool Servers": "", "Disabled": "Inaktiv", "Discover a function": "Find en funktion", @@ -337,11 +337,11 @@ "Discover, download, and explore custom tools": "Find, download og udforsk unikke værktøjer", "Discover, download, and explore model presets": "Find, download og udforsk modelindstillinger", "Dismissible": "Kan afvises", - "Display": "", + "Display": "Vis", "Display Emoji in Call": "Vis emoji i chat", "Display the username instead of You in the Chat": "Vis brugernavn i stedet for Dig i chatten", - "Displays citations in the response": "", - "Dive into knowledge": "", + "Displays citations in the response": "Vis citat i svaret", + "Dive into knowledge": "Undersøg viden", "Do not install functions from sources you do not fully trust.": "Lad være med at installere funktioner fra kilder, som du ikke stoler på.", "Do not install tools from sources you do not fully trust.": "Lad være med at installere værktøjer fra kilder, som du ikke stoler på.", "Docling": "", @@ -352,22 +352,22 @@ "Documentation": "Dokumentation", "Documents": "Dokumenter", "does not make any external connections, and your data stays securely on your locally hosted server.": "laver ikke eksterne kald, og din data bliver sikkert på din egen lokalt hostede server.", - "Domain Filter List": "", + "Domain Filter List": "Domæne filterliste", "Don't have an account?": "Har du ikke en profil?", "don't install random functions from sources you don't trust.": "lad være med at installere tilfældige funktioner fra kilder, som du ikke stoler på.", "don't install random tools from sources you don't trust.": "lad være med at installere tilfældige værktøjer fra kilder, som du ikke stoler på.", "Don't like the style": "Kan du ikke lide stilen", "Done": "Færdig", "Download": "Download", - "Download as SVG": "", + "Download as SVG": "Download som SVG", "Download canceled": "Download afbrudt", "Download Database": "Download database", - "Drag and drop a file to upload or select a file to view": "", - "Draw": "", - "Drop any files here to upload": "", + "Drag and drop a file to upload or select a file to view": "Træk og slip en fil for at uploade eller vælg en fil for at se", + "Draw": "Tegn", + "Drop any files here to upload": "Drop nogen filer her for at uploade", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "f.eks. '30s', '10m'. Tilladte værdier er 's', 'm', 'h'.", - "e.g. \"json\" or a JSON schema": "", - "e.g. 60": "", + "e.g. \"json\" or a JSON schema": "f.eks. \"json\" eller en JSON schema", + "e.g. 60": "f.eks. 60", "e.g. A filter to remove profanity from text": "", "e.g. My Filter": "", "e.g. My Tools": "", @@ -378,17 +378,17 @@ "e.g., en-US,ja-JP (leave blank for auto-detect)": "", "e.g., westus (leave blank for eastus)": "", "Edit": "Rediger", - "Edit Arena Model": "", - "Edit Channel": "", - "Edit Connection": "", - "Edit Default Permissions": "", + "Edit Arena Model": "Rediger Arena Model", + "Edit Channel": "Rediger kanal", + "Edit Connection": "Rediger forbindelse", + "Edit Default Permissions": "Rediger standard tilladelser", "Edit Memory": "Rediger hukommelse", "Edit User": "Rediger bruger", - "Edit User Group": "", + "Edit User Group": "Rediger brugergruppe", "ElevenLabs": "ElevenLabs", "Email": "Email", - "Embark on adventures": "", - "Embedding": "", + "Embark on adventures": "Udforsk eventyr", + "Embedding": "Embedding", "Embedding Batch Size": "Embedding Batch størrelse", "Embedding Model": "Embedding Model", "Embedding Model Engine": "Embedding Model engine", @@ -406,8 +406,8 @@ "Enabled": "Aktiveret", "Endpoint URL": "", "Enforce Temporary Chat": "", - "Enhance": "", - "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Sørg for at din CSV-fil indeholder 4 kolonner in denne rækkefølge: Name, Email, Password, Role.", + "Enhance": "Forbedre", + "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Sørg for at din CSV-fil indeholder 4 kolonner i denne rækkefølge: Name, Email, Password, Role.", "Enter {{role}} message here": "Indtast {{role}} besked her", "Enter a detail about yourself for your LLMs to recall": "Indtast en detalje om dig selv, som dine LLMs kan huske", "Enter api auth string (e.g. username:password)": "Indtast api-godkendelsesstreng (f.eks. brugernavn:adgangskode)", @@ -422,7 +422,7 @@ "Enter Chunk Overlap": "Indtast overlapning af tekststykker", "Enter Chunk Size": "Indtast størrelse af tekststykker", "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "", - "Enter description": "", + "Enter description": "Indtast beskrivelse", "Enter Docling OCR Engine": "", "Enter Docling OCR Language(s)": "", "Enter Docling Server URL": "", @@ -464,28 +464,28 @@ "Enter SearchApi API Key": "Indtast SearchApi API-nøgle", "Enter SearchApi Engine": "Indtast SearchApi-engine", "Enter Searxng Query URL": "Indtast Searxng-forespørgsels-URL", - "Enter Seed": "", - "Enter SerpApi API Key": "", - "Enter SerpApi Engine": "", + "Enter Seed": "Indtast seed", + "Enter SerpApi API Key": "Indtast SerpApi API-nøgle", + "Enter SerpApi Engine": "Indtast SerpApi-engine", "Enter Serper API Key": "Indtast Serper API-nøgle", "Enter Serply API Key": "Indtast Serply API-nøgle", "Enter Serpstack API Key": "Indtast Serpstack API-nøgle", - "Enter server host": "", - "Enter server label": "", - "Enter server port": "", - "Enter Sougou Search API sID": "", - "Enter Sougou Search API SK": "", + "Enter server host": "Indtast server-host", + "Enter server label": "Indtast server-label", + "Enter server port": "Indtast server-port", + "Enter Sougou Search API sID": "Indtast Sougou Search API sID", + "Enter Sougou Search API SK": "Indtast Sougou Search API SK", "Enter stop sequence": "Indtast stopsekvens", "Enter system prompt": "Indtast systemprompt", - "Enter system prompt here": "", + "Enter system prompt here": "Indtast systemprompt her", "Enter Tavily API Key": "Indtast Tavily API-nøgle", - "Enter Tavily Extract Depth": "", + "Enter Tavily Extract Depth": "Indtast Tavily Extract Depth", "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "", "Enter Tika Server URL": "Indtast Tika Server URL", - "Enter timeout in seconds": "", - "Enter to Send": "", + "Enter timeout in seconds": "Indtast timeout i sekunder", + "Enter to Send": "Indtast for at sende", "Enter Top K": "Indtast Top K", - "Enter Top K Reranker": "", + "Enter Top K Reranker": "Indtast Top K Reranker", "Enter URL (e.g. http://127.0.0.1:7860/)": "Indtast URL (f.eks. http://127.0.0.1:7860/)", "Enter URL (e.g. http://localhost:11434)": "Indtast URL (f.eks. http://localhost:11434)", "Enter Yacy Password": "", @@ -495,69 +495,69 @@ "Enter Your Email": "Indtast din e-mail", "Enter Your Full Name": "Indtast dit fulde navn", "Enter your message": "Indtast din besked", - "Enter your name": "", - "Enter Your Name": "", - "Enter your new password": "", + "Enter your name": "Indtast dit navn", + "Enter Your Name": "Indtast dit navn", + "Enter your new password": "Indtast din nye adgangskode", "Enter Your Password": "Indtast din adgangskode", "Enter Your Role": "Indtast din rolle", - "Enter Your Username": "", - "Enter your webhook URL": "", + "Enter Your Username": "Indtast dit brugernavn", + "Enter your webhook URL": "Indtast din webhook URL", "Error": "Fejl", - "ERROR": "", - "Error accessing Google Drive: {{error}}": "", - "Error accessing media devices.": "", - "Error starting recording.": "", - "Error uploading file: {{error}}": "", - "Evaluations": "", - "Exa API Key": "", - "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "", - "Example: ALL": "", - "Example: mail": "", - "Example: ou=users,dc=foo,dc=example": "", - "Example: sAMAccountName or uid or userPrincipalName": "", - "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "", - "Exclude": "", + "ERROR": "FEJL", + "Error accessing Google Drive: {{error}}": "Fejl ved adgang til Google Drive: {{error}}", + "Error accessing media devices.": "Fejl ved adgang til medieenheder.", + "Error starting recording.": "Fejl ved start af optagelse.", + "Error uploading file: {{error}}": "Fejl ved upload af fil: {{error}}", + "Evaluations": "Evalueringer", + "Exa API Key": "Exa API-nøgle", + "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Eksempel: (&(objectClass=inetOrgPerson)(uid=%s))", + "Example: ALL": "Eksempel: ALL", + "Example: mail": "Eksempel: mail", + "Example: ou=users,dc=foo,dc=example": "Eksempel: ou=users,dc=foo,dc=example", + "Example: sAMAccountName or uid or userPrincipalName": "Eksempel: sAMAccountName eller uid eller userPrincipalName", + "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "Du har overskredet antallet af pladser i din licens. Kontakt support for at øge antallet af pladser.", + "Exclude": "Ekskluder", "Execute code for analysis": "", - "Executing **{{NAME}}**...": "", - "Expand": "", + "Executing **{{NAME}}**...": "Kører **{{NAME}}**...", + "Expand": "Udvid", "Experimental": "Eksperimentel", - "Explain": "", - "Explain this section to me in more detail": "", + "Explain": "Forklar", + "Explain this section to me in more detail": "Forklar dette afsnit for mig i mere detalje", "Explore the cosmos": "", "Export": "Eksportér", - "Export All Archived Chats": "", + "Export All Archived Chats": "Eksportér alle arkiverede chats", "Export All Chats (All Users)": "Eksportér alle chats (alle brugere)", "Export chat (.json)": "Eksportér chat (.json)", "Export Chats": "Eksportér chats", "Export Config to JSON File": "Eksportér konfiguration til JSON-fil", "Export Functions": "Eksportér funktioner", "Export Models": "Eksportér modeller", - "Export Presets": "", + "Export Presets": "Eksportér indstillinger", "Export Prompts": "Eksportér prompts", - "Export to CSV": "", + "Export to CSV": "Eksportér til CSV", "Export Tools": "Eksportér værktøjer", - "External": "", + "External": "Ekstern", "External Models": "Eksterne modeller", - "External Web Loader API Key": "", - "External Web Loader URL": "", - "External Web Search API Key": "", - "External Web Search URL": "", - "Failed to add file.": "", - "Failed to connect to {{URL}} OpenAPI tool server": "", + "External Web Loader API Key": "Ekstern Web Loader API-nøgle", + "External Web Loader URL": "Ekstern Web Loader URL", + "External Web Search API Key": "Ekstern Web Search API-nøgle", + "External Web Search URL": "Ekstern Web Search URL", + "Failed to add file.": "Kunne ikke tilføje fil.", + "Failed to connect to {{URL}} OpenAPI tool server": "Kunne ikke forbinde til {{URL}} OpenAPI tool server", "Failed to create API Key.": "Kunne ikke oprette API-nøgle.", - "Failed to delete note": "", - "Failed to fetch models": "", - "Failed to load file content.": "", + "Failed to delete note": "Kunne ikke slette note", + "Failed to fetch models": "Kunne ikke hente modeller", + "Failed to load file content.": "Kunne ikke indlæse filindhold.", "Failed to read clipboard contents": "Kunne ikke læse indholdet af udklipsholderen", - "Failed to save connections": "", - "Failed to save models configuration": "", + "Failed to save connections": "Kunne ikke gemme forbindelser", + "Failed to save models configuration": "Kunne ikke gemme modeller konfiguration", "Failed to update settings": "Kunne ikke opdatere indstillinger", "Failed to upload file.": "Kunne ikke uploade fil.", - "Features": "", + "Features": "Features", "Features Permissions": "", "February": "Februar", "Feedback History": "", - "Feedbacks": "", + "Feedbacks": "Feedback", "Feel free to add specific details": "Du er velkommen til at tilføje specifikke detaljer", "File": "Fil", "File added successfully.": "Fil tilføjet.", @@ -566,7 +566,7 @@ "File not found.": "Filen blev ikke fundet.", "File removed successfully.": "Fil fjernet.", "File size should not exceed {{maxSize}} MB.": "Filstørrelsen må ikke overstige {{maxSize}} MB.", - "File uploaded successfully": "", + "File uploaded successfully": "Fil uploadet.", "Files": "Filer", "Filter is now globally disabled": "Filter er nu globalt deaktiveret", "Filter is now globally enabled": "Filter er nu globalt aktiveret", @@ -576,13 +576,13 @@ "Firecrawl API Key": "", "Fluidly stream large external response chunks": "Stream store eksterne svar chunks flydende", "Focus chat input": "Fokuser på chatinput", - "Folder deleted successfully": "", - "Folder name cannot be empty.": "", - "Folder name updated successfully": "", + "Folder deleted successfully": "Mappe fjernet.", + "Folder name cannot be empty.": "Mappenavn kan ikke være tom.", + "Folder name updated successfully": "Mappenavn opdateret.", "Followed instructions perfectly": "Fulgte instruktionerne perfekt", "Forge new paths": "", "Form": "Formular", - "Format your variables using brackets like this:": "", + "Format your variables using brackets like this:": "Formater dine variable ved hjælp af klammer som dette:", "Forwards system user session credentials to authenticate": "", "Frequency Penalty": "Hyppighedsstraf", "Full Context Mode": "", @@ -603,63 +603,63 @@ "Gemini API Config": "", "Gemini API Key is required.": "", "General": "Generelt", - "Generate": "", - "Generate an image": "", + "Generate": "Generer", + "Generate an image": "Generer et billede", "Generate Image": "Generer billede", - "Generate prompt pair": "", + "Generate prompt pair": "Generer prompt par", "Generating search query": "Genererer søgeforespørgsel", - "Generating...": "", - "Get started": "", - "Get started with {{WEBUI_NAME}}": "", + "Generating...": "Genererer...", + "Get started": "Kom i gang", + "Get started with {{WEBUI_NAME}}": "Kom i gang med {{WEBUI_NAME}}", "Global": "Global", "Good Response": "Godt svar", - "Google Drive": "", + "Google Drive": "Google Drive", "Google PSE API Key": "Google PSE API-nøgle", "Google PSE Engine Id": "Google PSE Engine-ID", - "Group created successfully": "", - "Group deleted successfully": "", - "Group Description": "", - "Group Name": "", - "Group updated successfully": "", - "Groups": "", + "Group created successfully": "Gruppe oprettet.", + "Group deleted successfully": "Gruppe slettet.", + "Group Description": "Gruppe beskrivelse", + "Group Name": "Gruppenavn", + "Group updated successfully": "Gruppe opdateret.", + "Groups": "Grupper", "Haptic Feedback": "Haptisk feedback", "has no conversations.": "har ingen samtaler.", "Hello, {{name}}": "Hej {{name}}", "Help": "Hjælp", - "Help us create the best community leaderboard by sharing your feedback history!": "", - "Hex Color": "", - "Hex Color - Leave empty for default color": "", + "Help us create the best community leaderboard by sharing your feedback history!": "Hjælp os med at oprette det bedste community-lederboard ved at dele din feedback-historik!", + "Hex Color": "Hex farve", + "Hex Color - Leave empty for default color": "Hex farve - Lad stå tomt for standard farve", "Hide": "Skjul", - "Hide Model": "", - "Home": "", - "Host": "", + "Hide Model": "Skjul model", + "Home": "Hjem", + "Host": "Vært", "How can I help you today?": "Hvordan kan jeg hjælpe dig i dag?", - "How would you rate this response?": "", + "How would you rate this response?": "Hvordan vurderer du dette svar?", "Hybrid Search": "Hybrid søgning", "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.": "Jeg anerkender, at jeg har læst og forstået konsekvenserne af min handling. Jeg er opmærksom på de risici, der er forbundet med at udføre vilkårlig kode, og jeg har verificeret kildens troværdighed.", "ID": "", "iframe Sandbox Allow Forms": "", "iframe Sandbox Allow Same Origin": "", "Ignite curiosity": "", - "Image": "", - "Image Compression": "", - "Image Generation": "", + "Image": "Billede", + "Image Compression": "Billedkomprimering", + "Image Generation": "Billedgenerering", "Image Generation (Experimental)": "Billedgenerering (eksperimentel)", "Image Generation Engine": "Billedgenereringsengine", "Image Max Compression Size": "", - "Image Prompt Generation": "", - "Image Prompt Generation Prompt": "", + "Image Prompt Generation": "Billedpromptgenerering", + "Image Prompt Generation Prompt": "Billedpromptgenerering prompt", "Image Settings": "Billedindstillinger", "Images": "Billeder", "Import Chats": "Importer chats", "Import Config from JSON File": "Importer konfiguration fra JSON-fil", "Import Functions": "Importer funktioner", "Import Models": "Importer modeller", - "Import Notes": "", - "Import Presets": "", + "Import Notes": "Importer noter", + "Import Presets": "Importer Presets", "Import Prompts": "Importer prompts", "Import Tools": "Importer værktøjer", - "Include": "", + "Include": "Inkluder", "Include `--api-auth` flag when running stable-diffusion-webui": "Inkluder `--api-auth` flag, når du kører stable-diffusion-webui", "Include `--api` flag when running stable-diffusion-webui": "Inkluder `--api` flag, når du kører stable-diffusion-webui", "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "", @@ -668,15 +668,15 @@ "Input commands": "Inputkommandoer", "Install from Github URL": "Installer fra Github URL", "Instant Auto-Send After Voice Transcription": "Øjeblikkelig automatisk afsendelse efter stemmetransskription", - "Integration": "", + "Integration": "Integration", "Interface": "Grænseflade", - "Invalid file content": "", - "Invalid file format.": "", - "Invalid JSON schema": "", + "Invalid file content": "Ugyldigt filindhold", + "Invalid file format.": "Ugyldigt filformat.", + "Invalid JSON schema": "Ugyldigt JSON-schema", "Invalid Tag": "Ugyldigt tag", - "is typing...": "", + "is typing...": "er i gang med at skrive...", "January": "Januar", - "Jina API Key": "", + "Jina API Key": "Jina API-nøgle", "join our Discord for help.": "tilslut dig vores Discord for at få hjælp.", "JSON": "JSON", "JSON Preview": "JSON-forhåndsvisning", @@ -688,16 +688,16 @@ "JWT Token": "JWT-token", "Kagi Search API Key": "", "Keep Alive": "Hold i live", - "Key": "", + "Key": "Nøgle", "Keyboard shortcuts": "Tastaturgenveje", "Knowledge": "Viden", - "Knowledge Access": "", + "Knowledge Access": "Videnadgang", "Knowledge created successfully.": "Viden oprettet.", "Knowledge deleted successfully.": "Viden slettet.", - "Knowledge Public Sharing": "", + "Knowledge Public Sharing": "Viden offentlig deling", "Knowledge reset successfully.": "Viden nulstillet.", "Knowledge updated successfully": "Viden opdateret.", - "Kokoro.js (Browser)": "", + "Kokoro.js (Browser)": "Kokoro.js (Browser)", "Kokoro.js Dtype": "", "Label": "", "Landing Page Mode": "Landing Page-tilstand", @@ -705,7 +705,7 @@ "Language Locales": "", "Last Active": "Sidst aktiv", "Last Modified": "Sidst ændret", - "Last reply": "", + "Last reply": "Sidste svar", "LDAP": "", "LDAP server updated": "", "Leaderboard": "", @@ -716,28 +716,28 @@ "Leave empty to include all models or select specific models": "", "Leave empty to use the default prompt, or enter a custom prompt": "Lad stå tomt for at bruge standardprompten, eller indtast en brugerdefineret prompt", "Leave model field empty to use the default model.": "", - "License": "", + "License": "Licens", "Light": "Lys", "Listening...": "Lytter...", - "Llama.cpp": "", + "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "LLM'er kan lave fejl. Bekræft vigtige oplysninger.", - "Loader": "", - "Loading Kokoro.js...": "", - "Local": "", + "Loader": "Loader", + "Loading Kokoro.js...": "Indlæser Kokoro.js...", + "Local": "Lokal", "Local Models": "Lokale modeller", - "Location access not allowed": "", - "Logit Bias": "", - "Lost": "", + "Location access not allowed": "Adgang til placering ikke tilladt", + "Logit Bias": "Logit Bias", + "Lost": "Tabt", "LTR": "LTR", "Made by Open WebUI Community": "Lavet af OpenWebUI Community", "Make sure to enclose them with": "Sørg for at omslutte dem med", "Make sure to export a workflow.json file as API format from ComfyUI.": "Sørg for at eksportere en workflow.json-fil som API-format fra ComfyUI.", "Manage": "Administrer", - "Manage Direct Connections": "", - "Manage Models": "", - "Manage Ollama": "", - "Manage Ollama API Connections": "", - "Manage OpenAI API Connections": "", + "Manage Direct Connections": "Administrer direkte forbindelser", + "Manage Models": "Administrer modeller", + "Manage Ollama": "Administrer Ollama", + "Manage Ollama API Connections": "Administrer Ollama API forbindelser", + "Manage OpenAI API Connections": "Administrer OpenAI API forbindelser", "Manage Pipelines": "Administrer pipelines", "Manage Tool Servers": "", "March": "Marts", @@ -779,8 +779,8 @@ "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Model filsystemsti registreret. Modelkortnavn er påkrævet til opdatering, kan ikke fortsætte.", "Model Filtering": "", "Model ID": "Model-ID", - "Model IDs": "", - "Model Name": "", + "Model IDs": "Model-ID'er", + "Model Name": "Modelnavn", "Model not selected": "Model ikke valgt", "Model Params": "Modelparametre", "Model Permissions": "", @@ -791,45 +791,45 @@ "Models configuration saved successfully": "", "Models Public Sharing": "", "Mojeek Search API Key": "", - "more": "", + "more": "mere", "More": "Mere", - "My Notes": "", + "My Notes": "Mine noter", "Name": "Navn", - "Name your knowledge base": "", + "Name your knowledge base": "Nanvgiv din videnbase", "Native": "", "New Chat": "Ny chat", - "New Folder": "", - "New Note": "", + "New Folder": "Ny mappe", + "New Note": "Ny note", "New Password": "Ny adgangskode", "new-channel": "", - "No content": "", - "No content found": "", - "No content found in file.": "", + "No content": "Intet indhold", + "No content found": "Intet indhold fundet", + "No content found in file.": "Intet indhold fundet i fil.", "No content to speak": "Intet indhold at tale", "No distance available": "", - "No feedbacks found": "", + "No feedbacks found": "Ingen feedback fundet", "No file selected": "Ingen fil valgt", - "No groups with access, add a group to grant access": "", + "No groups with access, add a group to grant access": "Ingen grupper med adgang, tilføj en gruppe for at give adgang", "No HTML, CSS, or JavaScript content found.": "Intet HTML-, CSS- eller JavaScript-indhold fundet.", - "No inference engine with management support found": "", + "No inference engine with management support found": "Ingen inference-engine med støtte til administration fundet", "No knowledge found": "Ingen viden fundet", - "No memories to clear": "", - "No model IDs": "", - "No models found": "", - "No models selected": "", - "No Notes": "", + "No memories to clear": "Ingen hukommelser at ryde", + "No model IDs": "Ingen model-ID'er", + "No models found": "Ingen modeller fundet", + "No models selected": "Ingen modeller valgt", + "No Notes": "Ingen noter", "No results found": "Ingen resultater fundet", "No search query generated": "Ingen søgeforespørgsel genereret", "No source available": "Ingen kilde tilgængelig", - "No users were found.": "", + "No users were found.": "Ingen brugere blev fundet.", "No valves to update": "Ingen ventiler at opdatere", "None": "Ingen", "Not factually correct": "Ikke faktuelt korrekt", - "Not helpful": "", - "Note deleted successfully": "", + "Not helpful": "Ikke hjælpsom", + "Note deleted successfully": "Note slettet", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Bemærk: Hvis du angiver en minimumscore, returnerer søgningen kun dokumenter med en score, der er større end eller lig med minimumscoren.", - "Notes": "", - "Notification Sound": "", + "Notes": "Noter", + "Notification Sound": "Notifikationslyd", "Notification Webhook": "", "Notifications": "Notifikationer", "November": "November", @@ -845,21 +845,21 @@ "Ollama API settings updated": "", "Ollama Version": "Ollama-version", "On": "Til", - "OneDrive": "", - "Only alphanumeric characters and hyphens are allowed": "", + "OneDrive": "OneDrive", + "Only alphanumeric characters and hyphens are allowed": "Kun alfanumeriske tegn og bindestreger er tilladt", "Only alphanumeric characters and hyphens are allowed in the command string.": "Kun alfanumeriske tegn og bindestreger er tilladt i kommandostrengen.", "Only collections can be edited, create a new knowledge base to edit/add documents.": "Kun samlinger kan redigeres, opret en ny vidensbase for at redigere/tilføje dokumenter.", - "Only markdown files are allowed": "", - "Only select users and groups with permission can access": "", + "Only markdown files are allowed": "Kun markdown-filer er tilladt", + "Only select users and groups with permission can access": "Kun valgte brugere og grupper med tilladelse kan tilgå", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Ups! URL'en ser ud til at være ugyldig. Tjek den igen, og prøv igen.", - "Oops! There are files still uploading. Please wait for the upload to complete.": "", - "Oops! There was an error in the previous response.": "", + "Oops! There are files still uploading. Please wait for the upload to complete.": "Ups! Der er filer, der stadig uploades. Vent, til uploaden er færdig.", + "Oops! There was an error in the previous response.": "Ups! Der var en fejl i det tidligere svar.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ups! Du bruger en metode, der ikke understøttes (kun frontend). Kør WebUI fra backend.", "Open file": "Åbn fil", "Open in full screen": "Åbn i fuld skærm", "Open new chat": "Åbn ny chat", "Open WebUI can use tools provided by any OpenAPI server.": "", - "Open WebUI uses faster-whisper internally.": "", + "Open WebUI uses faster-whisper internally.": "Open WebUI bruger faster-whisper internt.", "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI-version (v{{OPEN_WEBUI_VERSION}}) er lavere end den krævede version (v{{REQUIRED_VERSION}})", "OpenAI": "OpenAI", @@ -872,19 +872,19 @@ "or": "eller", "Organize your users": "", "Other": "Andet", - "OUTPUT": "", + "OUTPUT": "OUTPUT", "Output format": "Outputformat", "Overview": "Oversigt", "page": "side", "Password": "Adgangskode", - "Paste Large Text as File": "", + "Paste Large Text as File": "Indsæt store tekster som fil", "PDF document (.pdf)": "PDF-dokument (.pdf)", "PDF Extract Images (OCR)": "Udtræk billeder fra PDF (OCR)", "pending": "afventer", "Permission denied when accessing media devices": "Tilladelse nægtet ved adgang til medieenheder", "Permission denied when accessing microphone": "Tilladelse nægtet ved adgang til mikrofon", "Permission denied when accessing microphone: {{error}}": "Tilladelse nægtet ved adgang til mikrofon: {{error}}", - "Permissions": "", + "Permissions": "Tilladelser", "Perplexity API Key": "", "Personalization": "Personalisering", "Pin": "Fastgør", @@ -895,50 +895,50 @@ "Pipelines": "Pipelines", "Pipelines Not Detected": "Pipelines ikke registreret", "Pipelines Valves": "Pipelines-ventiler", - "Plain text (.md)": "", + "Plain text (.md)": "Almindelig tekst (.md)", "Plain text (.txt)": "Almindelig tekst (.txt)", "Playground": "Legeplads", "Playwright Timeout (ms)": "", "Playwright WebSocket URL": "", "Please carefully review the following warnings:": "Gennemgå omhyggeligt følgende advarsler:", - "Please do not close the settings page while loading the model.": "", - "Please enter a prompt": "", - "Please enter a valid path": "", - "Please enter a valid URL": "", + "Please do not close the settings page while loading the model.": "Luk ikke indstillingerne, mens modellen indlæses.", + "Please enter a prompt": "Indtast en prompt", + "Please enter a valid path": "Indtast en gyldig sti", + "Please enter a valid URL": "Indtast en gyldig URL", "Please fill in all fields.": "Udfyld alle felter.", - "Please select a model first.": "", - "Please select a model.": "", + "Please select a model first.": "Vælg en model først.", + "Please select a model.": "Vælg en model.", "Please select a reason": "Vælg en årsag", - "Port": "", + "Port": "Port", "Positive attitude": "Positiv holdning", - "Prefix ID": "", - "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "", + "Prefix ID": "Prefix ID", + "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "Prefix ID bruges til at undgå konflikter med andre forbindelser ved at tilføje et prefix til model-ID'erne - lad være tom for at deaktivere", "Presence Penalty": "", "Previous 30 days": "Seneste 30 dage", "Previous 7 days": "Seneste 7 dage", "Private": "Privat", "Profile Image": "Profilbillede", - "Prompt": "", - "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (f.eks. Fortæl mig en sjov kendsgerning om Romerriget)", + "Prompt": "Prompt", + "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (f.eks. Fortæl mig en sjov fakta om Romerriget)", "Prompt Autocompletion": "", "Prompt Content": "Promptindhold", - "Prompt created successfully": "", + "Prompt created successfully": "Prompt oprettet", "Prompt suggestions": "Promptforslag", - "Prompt updated successfully": "", + "Prompt updated successfully": "Prompt opdateret", "Prompts": "Prompts", - "Prompts Access": "", - "Prompts Public Sharing": "", - "Public": "", + "Prompts Access": "Prompts adgang", + "Prompts Public Sharing": "Prompts offentlig deling", + "Public": "Offentlig", "Pull \"{{searchValue}}\" from Ollama.com": "Hent \"{{searchValue}}\" fra Ollama.com", "Pull a model from Ollama.com": "Hent en model fra Ollama.com", "Query Generation Prompt": "", "RAG Template": "RAG-skabelon", - "Rating": "", + "Rating": "Rating", "Re-rank models by topic similarity": "", "Read": "Læs", "Read Aloud": "Læs højt", "Reasoning Effort": "", - "Record": "", + "Record": "Optag", "Record voice": "Optag stemme", "Redirecting you to Open WebUI Community": "Omdirigerer dig til OpenWebUI Community", "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.": "", @@ -954,22 +954,21 @@ "Remove": "Fjern", "Remove Model": "Fjern model", "Rename": "Omdøb", - "Reorder Models": "", + "Reorder Models": "Omarranger modeller", "Repeat Last N": "Gentag sidste N", "Repeat Penalty (Ollama)": "", - "Reply in Thread": "", + "Reply in Thread": "Svar i tråd", "Request Mode": "Forespørgselstilstand", + "Reranking Engine": "", "Reranking Model": "Omarrangeringsmodel", - "Reranking model disabled": "Omarrangeringsmodel deaktiveret", - "Reranking model set to \"{{reranking_model}}\"": "Omarrangeringsmodel sat til \"{{reranking_model}}\"", "Reset": "Nulstil", - "Reset All Models": "", + "Reset All Models": "Nulstil alle modeller", "Reset Upload Directory": "Nulstil uploadmappe", "Reset Vector Storage/Knowledge": "", - "Reset view": "", + "Reset view": "Nulstil visning", "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Svarnotifikationer kan ikke aktiveres, da webstedets tilladelser er blevet nægtet. Besøg dine browserindstillinger for at give den nødvendige adgang.", "Response splitting": "Svaropdeling", - "Result": "", + "Result": "Resultat", "Retrieval": "", "Retrieval Query Generation": "", "Rich Text Input for Chat": "", @@ -993,7 +992,7 @@ "Search Base": "", "Search Chats": "Søg i chats", "Search Collection": "Søg i samling", - "Search Filters": "", + "Search Filters": "Søg i filtre", "search for tags": "", "Search Functions": "Søg i funktioner", "Search Knowledge": "Søg i viden", @@ -1005,10 +1004,10 @@ "Search Tools": "Søg i værktøjer", "SearchApi API Key": "SearchApi API-nøgle", "SearchApi Engine": "SearchApi-engine", - "Searched {{count}} sites": "", + "Searched {{count}} sites": "Søgte {{count}} sider", "Searching \"{{searchQuery}}\"": "Søger efter \"{{searchQuery}}\"", "Searching Knowledge for \"{{searchQuery}}\"": "Søger i viden efter \"{{searchQuery}}\"", - "Searching the web...": "", + "Searching the web...": "Søger på internettet...", "Searxng Query URL": "Searxng forespørgsels-URL", "See readme.md for instructions": "Se readme.md for instruktioner", "See what's new": "Se, hvad der er nyt", @@ -1065,17 +1064,19 @@ "Share": "Del", "Share Chat": "Del chat", "Share to Open WebUI Community": "Del til OpenWebUI Community", - "Sharing Permissions": "", + "Sharing Permissions": "Delingstilladelser", "Show": "Vis", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "Vis administratordetaljer i overlay for ventende konto", - "Show Model": "", + "Show All": "", + "Show Less": "", + "Show Model": "Vis model", "Show shortcuts": "Vis genveje", "Show your support!": "Vis din støtte!", "Showcased creativity": "Udstillet kreativitet", "Sign in": "Log ind", "Sign in to {{WEBUI_NAME}}": "Log ind på {{WEBUI_NAME}}", - "Sign in to {{WEBUI_NAME}} with LDAP": "", + "Sign in to {{WEBUI_NAME}} with LDAP": "Log ind på {{WEBUI_NAME}} med LDAP", "Sign Out": "Log ud", "Sign up": "Tilmeld dig", "Sign up to {{WEBUI_NAME}}": "Tilmeld dig {{WEBUI_NAME}}", @@ -1087,11 +1088,12 @@ "Speech Playback Speed": "Talehastighed", "Speech recognition error: {{error}}": "Talegenkendelsesfejl: {{error}}", "Speech-to-Text Engine": "Tale-til-tekst-engine", - "Stop": "", + "Stop": "Stop", "Stop Sequence": "Stopsekvens", "Stream Chat Response": "Stream chatsvar", "STT Model": "STT-model", "STT Settings": "STT-indstillinger", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Undertitel (f.eks. om Romerriget)", "Success": "Succes", "Successfully updated.": "Opdateret.", @@ -1106,7 +1108,7 @@ "Tags Generation": "", "Tags Generation Prompt": "", "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "", - "Talk to model": "", + "Talk to model": "Tal til model", "Tap to interrupt": "Tryk for at afbryde", "Tasks": "", "Tavily API Key": "Tavily API-nøgle", @@ -1134,18 +1136,18 @@ "Theme": "Tema", "Thinking...": "Tænker...", "This action cannot be undone. Do you wish to continue?": "Denne handling kan ikke fortrydes. Vil du fortsætte?", - "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "", - "This chat won’t appear in history and your messages will not be saved.": "", + "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Denne kanal blev oprettet den {{createdAt}}. Dette er det helt første i kanalen {{channelName}}.", + "This chat won’t appear in history and your messages will not be saved.": "Denne chat vil ikke vises i historikken, og dine beskeder vil ikke blive gemt.", "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dette sikrer, at dine værdifulde samtaler gemmes sikkert i din backend-database. Tak!", "This is an experimental feature, it may not function as expected and is subject to change at any time.": "Dette er en eksperimentel funktion, den fungerer muligvis ikke som forventet og kan ændres når som helst.", "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "", "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Denne indstilling sletter alle eksisterende filer i samlingen og erstatter dem med nyligt uploadede filer.", - "This response was generated by \"{{model}}\"": "", + "This response was generated by \"{{model}}\"": "Dette svar blev genereret af \"{{model}}\"", "This will delete": "Dette vil slette", - "This will delete {{NAME}} and all its contents.": "", - "This will delete all models including custom models": "", - "This will delete all models including custom models and cannot be undone.": "", + "This will delete {{NAME}} and all its contents.": "Dette vil slette {{NAME}} og alt dens indhold.", + "This will delete all models including custom models": "Dette vil slette alle modeller, inklusive brugerdefinerede modeller", + "This will delete all models including custom models and cannot be undone.": "Dette vil slette alle modeller, inklusive brugerdefinerede modeller og kan ikke fortrydes.", "This will reset the knowledge base and sync all files. Do you wish to continue?": "Dette vil nulstille vidensbasen og synkronisere alle filer. Vil du fortsætte?", "Thorough explanation": "Grundig forklaring", "Thought for {{DURATION}}": "Tanker for {{DURATION}}", @@ -1219,10 +1221,10 @@ "Updated": "Opdateret", "Updated at": "Opdateret kl.", "Updated At": "Opdateret Klokken.", - "Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "", + "Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "Opgrader til en betalingsplan for at få adgang til udvidede funktioner, herunder tilpasning af tema og branding samt dedikeret support.", "Upload": "Upload", "Upload a GGUF model": "Upload en GGUF-model", - "Upload Audio": "", + "Upload Audio": "Upload lyd", "Upload directory": "Uploadmappe", "Upload files": "Upload filer", "Upload Files": "Upload filer", @@ -1232,9 +1234,9 @@ "URL Mode": "URL-tilstand", "Use '#' in the prompt input to load and include your knowledge.": "Brug '#' i promptinput for at indlæse og inkludere din viden.", "Use Gravatar": "Brug Gravatar", - "Use groups to group your users and assign permissions.": "", + "Use groups to group your users and assign permissions.": "Brug grupper til at gruppere dine brugere og tildele rettigheder.", "Use Initials": "Brug initialer", - "Use no proxy to fetch page contents.": "", + "Use no proxy to fetch page contents.": "Brug ingen proxy til at hente sideindhold.", "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", @@ -1244,7 +1246,7 @@ "User Webhooks": "Bruger Webhooks", "Username": "Brugernavn", "Users": "Brugere", - "Using the default arena model with all models. Click the plus button to add custom models.": "", + "Using the default arena model with all models. Click the plus button to add custom models.": "Brug den standard Arena-model med alle modeller. Klik på plusknappen for at tilføje brugerdefinerede modeller.", "Utilize": "Anvend", "Valid time units:": "Gyldige tidsenheder:", "Valves": "Ventiler", @@ -1252,26 +1254,26 @@ "Valves updated successfully": "Ventiler opdateret.", "variable": "variabel", "variable to have them replaced with clipboard content.": "variabel for at få dem erstattet med indholdet af udklipsholderen.", - "Verify Connection": "", - "Verify SSL Certificate": "", + "Verify Connection": "Verificer forbindelse", + "Verify SSL Certificate": "Verificer SSL-certifikat", "Version": "Version", "Version {{selectedVersion}} of {{totalVersions}}": "Version {{selectedVersion}} af {{totalVersions}}", - "View Replies": "", - "View Result from **{{NAME}}**": "", + "View Replies": "Vis svar", + "View Result from **{{NAME}}**": "Vis resultat fra **{{NAME}}**", "Visibility": "Synlighed", "Voice": "Stemme", "Voice Input": "Stemme Input", "Warning": "Advarsel", "Warning:": "Advarsel:", - "Warning: Enabling this will allow users to upload arbitrary code on the server.": "", + "Warning: Enabling this will allow users to upload arbitrary code on the server.": "Advarsel: Hvis du aktiverer dette, vil brugerne kunne uploade vilkårlig kode på serveren.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Advarsel: Hvis du opdaterer eller ændrer din indlejringsmodel, skal du importere alle dokumenter igen.", - "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "", + "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Advarsel: Jupyter-udførelse gør det muligt at udføre vilkårlig kode, hvilket udfordrer alvorlige sikkerhedsrisici - fortsæt med ekstremt omhyggelighed.", "Web": "Web", "Web API": "Web API", "Web Loader Engine": "", "Web Search": "Websøgning", "Web Search Engine": "Websøgemaskine", - "Web Search in Chat": "", + "Web Search in Chat": "Websøgning i chat", "Web Search Query Generation": "", "Webhook URL": "Webhook-URL", "WebUI Settings": "WebUI-indstillinger", diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index 7452630e6..3a42f4eda 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "Wiederholungsstrafe (Ollama)", "Reply in Thread": "Im Thread antworten", "Request Mode": "Anforderungsmodus", + "Reranking Engine": "", "Reranking Model": "Reranking-Modell", - "Reranking model disabled": "Reranking-Modell deaktiviert", - "Reranking model set to \"{{reranking_model}}\"": "Reranking-Modell \"{{reranking_model}}\" fesgelegt", "Reset": "Zurücksetzen", "Reset All Models": "Alle Modelle zurücksetzen", "Reset Upload Directory": "Upload-Verzeichnis zurücksetzen", @@ -1069,6 +1068,8 @@ "Show": "Anzeigen", "Show \"What's New\" modal on login": "\"Was gibt's Neues\"-Modal beim Anmelden anzeigen", "Show Admin Details in Account Pending Overlay": "Admin-Details im Account-Pending-Overlay anzeigen", + "Show All": "", + "Show Less": "", "Show Model": "Modell anzeigen", "Show shortcuts": "Verknüpfungen anzeigen", "Show your support!": "Zeigen Sie Ihre Unterstützung!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Chat-Antwort streamen", "STT Model": "STT-Modell", "STT Settings": "STT-Einstellungen", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Untertitel (z. B. über das Römische Reich)", "Success": "Erfolg", "Successfully updated.": "Erfolgreich aktualisiert.", diff --git a/src/lib/i18n/locales/dg-DG/translation.json b/src/lib/i18n/locales/dg-DG/translation.json index 355134294..b6a5349d8 100644 --- a/src/lib/i18n/locales/dg-DG/translation.json +++ b/src/lib/i18n/locales/dg-DG/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "Request Bark", + "Reranking Engine": "", "Reranking Model": "", - "Reranking model disabled": "", - "Reranking model set to \"{{reranking_model}}\"": "", "Reset": "", "Reset All Models": "", "Reset Upload Directory": "", @@ -1069,6 +1068,8 @@ "Show": "Show much show", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Show shortcuts much shortcut", "Show your support!": "", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "", "STT Settings": "STT Settings very settings", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "", "Success": "Success very success", "Successfully updated.": "Successfully updated. Very updated.", diff --git a/src/lib/i18n/locales/el-GR/translation.json b/src/lib/i18n/locales/el-GR/translation.json index 62cd6c9c7..350eba785 100644 --- a/src/lib/i18n/locales/el-GR/translation.json +++ b/src/lib/i18n/locales/el-GR/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "Λειτουργία Αιτήματος", + "Reranking Engine": "", "Reranking Model": "Μοντέλο Επαναταξινόμησης", - "Reranking model disabled": "Το μοντέλο επαναταξινόμησης απενεργοποιήθηκε", - "Reranking model set to \"{{reranking_model}}\"": "Το μοντέλο επαναταξινόμησης ορίστηκε σε \"{{reranking_model}}\"", "Reset": "Επαναφορά", "Reset All Models": "Επαναφορά Όλων των Μοντέλων", "Reset Upload Directory": "Επαναφορά Καταλόγου Ανεβάσματος", @@ -1069,6 +1068,8 @@ "Show": "Εμφάνιση", "Show \"What's New\" modal on login": "Εμφάνιση του παράθυρου \"Τι νέο υπάρχει\" κατά την είσοδο", "Show Admin Details in Account Pending Overlay": "Εμφάνιση Λεπτομερειών Διαχειριστή στο Υπέρθεση Εκκρεμής Λογαριασμού", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Εμφάνιση συντομεύσεων", "Show your support!": "Δείξτε την υποστήριξή σας!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Συνομιλία Ροής Απάντησης", "STT Model": "Μοντέλο STT", "STT Settings": "Ρυθμίσεις STT", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Υπότιτλος (π.χ. για την Ρωμαϊκή Αυτοκρατορία)", "Success": "Επιτυχία", "Successfully updated.": "Επιτυχώς ενημερώθηκε.", diff --git a/src/lib/i18n/locales/en-GB/translation.json b/src/lib/i18n/locales/en-GB/translation.json index 306bcc7cd..76c1b2757 100644 --- a/src/lib/i18n/locales/en-GB/translation.json +++ b/src/lib/i18n/locales/en-GB/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "", + "Reranking Engine": "", "Reranking Model": "", - "Reranking model disabled": "", - "Reranking model set to \"{{reranking_model}}\"": "", "Reset": "", "Reset All Models": "", "Reset Upload Directory": "", @@ -1069,6 +1068,8 @@ "Show": "", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "", "Show your support!": "", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "", "STT Settings": "", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "", "Success": "", "Successfully updated.": "", diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index 306bcc7cd..76c1b2757 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "", + "Reranking Engine": "", "Reranking Model": "", - "Reranking model disabled": "", - "Reranking model set to \"{{reranking_model}}\"": "", "Reset": "", "Reset All Models": "", "Reset Upload Directory": "", @@ -1069,6 +1068,8 @@ "Show": "", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "", "Show your support!": "", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "", "STT Settings": "", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "", "Success": "", "Successfully updated.": "", diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index 4a1d4a4c7..b02c660c9 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "Penalización Repetición (Ollama)", "Reply in Thread": "Responder en Hilo", "Request Mode": "Modo de Petición", + "Reranking Engine": "", "Reranking Model": "Modelo de Reclasificación", - "Reranking model disabled": "Modelo de reclasificacioń deshabilitado", - "Reranking model set to \"{{reranking_model}}\"": "Modelo de reclasificación establecido a \"{{reranking_model}}\"", "Reset": "Reiniciar", "Reset All Models": "Reiniciar Todos los Modelos", "Reset Upload Directory": "Reiniciar Directorio de Subidas", @@ -1069,6 +1068,8 @@ "Show": "Mostrar", "Show \"What's New\" modal on login": "Mostrar modal \"Qué hay de Nuevo\" al iniciar sesión", "Show Admin Details in Account Pending Overlay": "Mostrar Detalles Admin en la sobrecapa de 'Cuenta Pendiente'", + "Show All": "", + "Show Less": "", "Show Model": "Mostrar Modelo", "Show shortcuts": "Mostrar Atajos", "Show your support!": "¡Muestra tu apoyo!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Transmisión Directa de la Respuesta del Chat", "STT Model": "Modelo STT", "STT Settings": "Ajustes Voz a Texto (STT)", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Subtítulo (p.ej. sobre el Imperio Romano)", "Success": "Correcto", "Successfully updated.": "Actualizado correctamente.", diff --git a/src/lib/i18n/locales/et-EE/translation.json b/src/lib/i18n/locales/et-EE/translation.json index 282c341fd..f3fdc051e 100644 --- a/src/lib/i18n/locales/et-EE/translation.json +++ b/src/lib/i18n/locales/et-EE/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "Korduse karistus (Ollama)", "Reply in Thread": "Vasta lõimes", "Request Mode": "Päringu režiim", + "Reranking Engine": "", "Reranking Model": "Ümberjärjestamise mudel", - "Reranking model disabled": "Ümberjärjestamise mudel keelatud", - "Reranking model set to \"{{reranking_model}}\"": "Ümberjärjestamise mudel määratud kui \"{{reranking_model}}\"", "Reset": "Lähtesta", "Reset All Models": "Lähtesta kõik mudelid", "Reset Upload Directory": "Lähtesta üleslaadimiste kataloog", @@ -1069,6 +1068,8 @@ "Show": "Näita", "Show \"What's New\" modal on login": "Näita \"Mis on uut\" modaalakent sisselogimisel", "Show Admin Details in Account Pending Overlay": "Näita administraatori üksikasju konto ootel kattekihil", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Näita otseteid", "Show your support!": "Näita oma toetust!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Voogedasta vestluse vastust", "STT Model": "STT mudel", "STT Settings": "STT seaded", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Alampealkiri (nt Rooma impeeriumi kohta)", "Success": "Õnnestus", "Successfully updated.": "Edukalt uuendatud.", diff --git a/src/lib/i18n/locales/eu-ES/translation.json b/src/lib/i18n/locales/eu-ES/translation.json index ffa420ec9..9b364dfe4 100644 --- a/src/lib/i18n/locales/eu-ES/translation.json +++ b/src/lib/i18n/locales/eu-ES/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "Eskaera modua", + "Reranking Engine": "", "Reranking Model": "Berrantolatze modeloa", - "Reranking model disabled": "Berrantolatze modeloa desgaituta", - "Reranking model set to \"{{reranking_model}}\"": "Berrantolatze modeloa \"{{reranking_model}}\"-era ezarrita", "Reset": "Berrezarri", "Reset All Models": "", "Reset Upload Directory": "Berrezarri karga direktorioa", @@ -1069,6 +1068,8 @@ "Show": "Erakutsi", "Show \"What's New\" modal on login": "Erakutsi \"Berritasunak\" modala saioa hastean", "Show Admin Details in Account Pending Overlay": "Erakutsi administratzaile xehetasunak kontu zain geruzan", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Erakutsi lasterbideak", "Show your support!": "Erakutsi zure babesa!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Transmititu txat erantzuna", "STT Model": "STT modeloa", "STT Settings": "STT ezarpenak", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Azpititulua (adib. Erromatar Inperioari buruz)", "Success": "Arrakasta", "Successfully updated.": "Ongi eguneratu da.", diff --git a/src/lib/i18n/locales/fa-IR/translation.json b/src/lib/i18n/locales/fa-IR/translation.json index b298a6139..39d15f046 100644 --- a/src/lib/i18n/locales/fa-IR/translation.json +++ b/src/lib/i18n/locales/fa-IR/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "جریمه تکرار (ollama)", "Reply in Thread": "پاسخ در رشته", "Request Mode": "حالت درخواست", + "Reranking Engine": "", "Reranking Model": "مدل ری\u200cشناسی مجدد غیرفعال است", - "Reranking model disabled": "مدل ری\u200cشناسی مجدد غیرفعال است", - "Reranking model set to \"{{reranking_model}}\"": "مدل ری\u200cشناسی مجدد به \"{{reranking_model}}\" تنظیم شده است", "Reset": "بازنشانی", "Reset All Models": "بازنشانی همه مدل\u200cها", "Reset Upload Directory": "بازنشانی پوشه آپلود", @@ -1069,6 +1068,8 @@ "Show": "نمایش", "Show \"What's New\" modal on login": "نمایش مودال \"موارد جدید\" هنگام ورود", "Show Admin Details in Account Pending Overlay": "نمایش جزئیات مدیر در پوشش حساب در انتظار", + "Show All": "", + "Show Less": "", "Show Model": "نمایش مدل", "Show shortcuts": "نمایش میانبرها", "Show your support!": "حمایت خود را نشان دهید!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "پاسخ چت جریانی", "STT Model": "مدل تبدیل صدا به متن", "STT Settings": "تنظیمات تبدیل صدا به متن", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "زیرنویس (برای مثال: درباره رمانی)", "Success": "موفقیت", "Successfully updated.": "با موفقیت به\u200cروز شد", diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index fae02283a..bb8b40980 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "Toisto rangaistus (Ollama)", "Reply in Thread": "Vastauksia ", "Request Mode": "Pyyntötila", + "Reranking Engine": "", "Reranking Model": "Uudelleenpisteytymismalli", - "Reranking model disabled": "Uudelleenpisteytymismalli poistettu käytöstä", - "Reranking model set to \"{{reranking_model}}\"": "\"{{reranking_model}}\" valittu uudelleenpisteytysmalliksi", "Reset": "Palauta", "Reset All Models": "Palauta kaikki mallit", "Reset Upload Directory": "Palauta latauspolku", @@ -1069,6 +1068,8 @@ "Show": "Näytä", "Show \"What's New\" modal on login": "Näytä \"Mitä uutta\" -modaali kirjautumisen yhteydessä", "Show Admin Details in Account Pending Overlay": "Näytä ylläpitäjän tiedot odottavan tilin päällä", + "Show All": "", + "Show Less": "", "Show Model": "Näytä malli", "Show shortcuts": "Näytä pikanäppäimet", "Show your support!": "Osoita tukesi!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Streamaa keskusteluvastaus", "STT Model": "Puheentunnistusmalli", "STT Settings": "Puheentunnistuksen asetukset", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Alaotsikko (esim. Rooman valtakunta)", "Success": "Onnistui", "Successfully updated.": "Päivitetty onnistuneesti.", diff --git a/src/lib/i18n/locales/fr-CA/translation.json b/src/lib/i18n/locales/fr-CA/translation.json index 9902ce1e8..28f49a42a 100644 --- a/src/lib/i18n/locales/fr-CA/translation.json +++ b/src/lib/i18n/locales/fr-CA/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "Mode de Requête", + "Reranking Engine": "", "Reranking Model": "Modèle de ré-ranking", - "Reranking model disabled": "Modèle de ré-ranking désactivé", - "Reranking model set to \"{{reranking_model}}\"": "Modèle de ré-ranking défini sur « {{reranking_model}} »", "Reset": "Réinitialiser", "Reset All Models": "", "Reset Upload Directory": "Répertoire de téléchargement réinitialisé", @@ -1069,6 +1068,8 @@ "Show": "Montrer", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "Afficher les détails de l'administrateur dans la superposition en attente du compte", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Afficher les raccourcis", "Show your support!": "Montre ton soutien !", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "Modèle de STT", "STT Settings": "Paramètres de STT", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Sous-titres (par ex. sur l'Empire romain)", "Success": "Réussite", "Successfully updated.": "Mise à jour réussie.", diff --git a/src/lib/i18n/locales/fr-FR/translation.json b/src/lib/i18n/locales/fr-FR/translation.json index e7140249f..5bc788b50 100644 --- a/src/lib/i18n/locales/fr-FR/translation.json +++ b/src/lib/i18n/locales/fr-FR/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "Pénalité de répétition (Ollama)", "Reply in Thread": "Répondre dans le fil de discussion", "Request Mode": "Mode de requête", + "Reranking Engine": "", "Reranking Model": "Modèle de ré-ranking", - "Reranking model disabled": "Modèle de ré-ranking désactivé", - "Reranking model set to \"{{reranking_model}}\"": "Modèle de ré-ranking défini sur « {{reranking_model}} »", "Reset": "Réinitialiser", "Reset All Models": "Réinitialiser tous les modèles", "Reset Upload Directory": "Réinitialiser le répertoire de téléchargement", @@ -1069,6 +1068,8 @@ "Show": "Afficher", "Show \"What's New\" modal on login": "Afficher la fenêtre modale \"Quoi de neuf\" lors de la connexion", "Show Admin Details in Account Pending Overlay": "Afficher les coordonnées de l'administrateur aux comptes en attente", + "Show All": "", + "Show Less": "", "Show Model": "Afficher le model", "Show shortcuts": "Afficher les raccourcis", "Show your support!": "Montrez votre soutien !", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Streamer la réponse de la conversation", "STT Model": "Modèle de Speech-to-Text", "STT Settings": "Paramètres de Speech-to-Text", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Sous-titres (par ex. sur l'Empire romain)", "Success": "Réussite", "Successfully updated.": "Mise à jour réussie.", diff --git a/src/lib/i18n/locales/he-IL/translation.json b/src/lib/i18n/locales/he-IL/translation.json index ff425d4df..7cb8477e0 100644 --- a/src/lib/i18n/locales/he-IL/translation.json +++ b/src/lib/i18n/locales/he-IL/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "מצב בקשה", + "Reranking Engine": "", "Reranking Model": "מודל דירוג מחדש", - "Reranking model disabled": "מודל דירוג מחדש מושבת", - "Reranking model set to \"{{reranking_model}}\"": "מודל דירוג מחדש הוגדר ל-\"{{reranking_model}}\"", "Reset": "", "Reset All Models": "", "Reset Upload Directory": "", @@ -1069,6 +1068,8 @@ "Show": "הצג", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "הצג קיצורי דרך", "Show your support!": "", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "", "STT Settings": "הגדרות חקירה של TTS", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "תחקור (לדוגמה: על מעמד הרומי)", "Success": "הצלחה", "Successfully updated.": "עדכון הצלחה.", diff --git a/src/lib/i18n/locales/hi-IN/translation.json b/src/lib/i18n/locales/hi-IN/translation.json index 8b5c9c6dc..5fae05898 100644 --- a/src/lib/i18n/locales/hi-IN/translation.json +++ b/src/lib/i18n/locales/hi-IN/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "अनुरोध मोड", + "Reranking Engine": "", "Reranking Model": "रीरैकिंग मोड", - "Reranking model disabled": "पुनर्रैंकिंग मॉडल अक्षम किया गया", - "Reranking model set to \"{{reranking_model}}\"": "रीरैंकिंग मॉडल को \"{{reranking_model}}\" पर \u200b\u200bसेट किया गया", "Reset": "", "Reset All Models": "", "Reset Upload Directory": "", @@ -1069,6 +1068,8 @@ "Show": "दिखाओ", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "शॉर्टकट दिखाएँ", "Show your support!": "", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "", "STT Settings": "STT सेटिंग्स ", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "उपशीर्षक (जैसे रोमन साम्राज्य के बारे में)", "Success": "संपन्न", "Successfully updated.": "सफलतापूर्वक उत्परिवर्तित।", diff --git a/src/lib/i18n/locales/hr-HR/translation.json b/src/lib/i18n/locales/hr-HR/translation.json index dd22b57f4..44034bf7d 100644 --- a/src/lib/i18n/locales/hr-HR/translation.json +++ b/src/lib/i18n/locales/hr-HR/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "Način zahtjeva", + "Reranking Engine": "", "Reranking Model": "Model za ponovno rangiranje", - "Reranking model disabled": "Model za ponovno rangiranje onemogućen", - "Reranking model set to \"{{reranking_model}}\"": "Model za ponovno rangiranje postavljen na \"{{reranking_model}}\"", "Reset": "", "Reset All Models": "", "Reset Upload Directory": "Poništi upload direktorij", @@ -1069,6 +1068,8 @@ "Show": "Pokaži", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Pokaži prečace", "Show your support!": "", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "STT model", "STT Settings": "STT postavke", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Podnaslov (npr. o Rimskom carstvu)", "Success": "Uspjeh", "Successfully updated.": "Uspješno ažurirano.", diff --git a/src/lib/i18n/locales/hu-HU/translation.json b/src/lib/i18n/locales/hu-HU/translation.json index 2de08218b..bc97fcc6c 100644 --- a/src/lib/i18n/locales/hu-HU/translation.json +++ b/src/lib/i18n/locales/hu-HU/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "Ismétlési büntetés (Ollama)", "Reply in Thread": "Válasz szálban", "Request Mode": "Kérési mód", + "Reranking Engine": "", "Reranking Model": "Újrarangsoroló modell", - "Reranking model disabled": "Újrarangsoroló modell letiltva", - "Reranking model set to \"{{reranking_model}}\"": "Újrarangsoroló modell beállítva erre: \"{{reranking_model}}\"", "Reset": "Visszaállítás", "Reset All Models": "Minden modell visszaállítása", "Reset Upload Directory": "Feltöltési könyvtár visszaállítása", @@ -1069,6 +1068,8 @@ "Show": "Mutat", "Show \"What's New\" modal on login": "\"Mi újság\" modal megjelenítése bejelentkezéskor", "Show Admin Details in Account Pending Overlay": "Admin részletek megjelenítése a függő fiók átfedésben", + "Show All": "", + "Show Less": "", "Show Model": "Modell megjelenítése", "Show shortcuts": "Gyorsbillentyűk megjelenítése", "Show your support!": "Mutassa meg támogatását!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Chat válasz streamelése", "STT Model": "STT modell", "STT Settings": "STT beállítások", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Alcím (pl. a Római Birodalomról)", "Success": "Siker", "Successfully updated.": "Sikeresen frissítve.", diff --git a/src/lib/i18n/locales/id-ID/translation.json b/src/lib/i18n/locales/id-ID/translation.json index a4b4e6ce4..d294873e9 100644 --- a/src/lib/i18n/locales/id-ID/translation.json +++ b/src/lib/i18n/locales/id-ID/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "Mode Permintaan", + "Reranking Engine": "", "Reranking Model": "Model Pemeringkatan Ulang", - "Reranking model disabled": "Model pemeringkatan ulang dinonaktifkan", - "Reranking model set to \"{{reranking_model}}\"": "Model pemeringkatan diatur ke \"{{reranking_model}}\"", "Reset": "Atur Ulang", "Reset All Models": "", "Reset Upload Directory": "Setel Ulang Direktori Unggahan", @@ -1069,6 +1068,8 @@ "Show": "Tampilkan", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "Tampilkan Detail Admin di Hamparan Akun Tertunda", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Tampilkan pintasan", "Show your support!": "Tunjukkan dukungan Anda!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "Model STT", "STT Settings": "Pengaturan STT", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Subtitle (misalnya tentang Kekaisaran Romawi)", "Success": "Berhasil", "Successfully updated.": "Berhasil diperbarui.", diff --git a/src/lib/i18n/locales/ie-GA/translation.json b/src/lib/i18n/locales/ie-GA/translation.json index 099526511..b52118dd6 100644 --- a/src/lib/i18n/locales/ie-GA/translation.json +++ b/src/lib/i18n/locales/ie-GA/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "Pionós Athrá (Ollama)", "Reply in Thread": "Freagra i Snáithe", "Request Mode": "Mód Iarratais", + "Reranking Engine": "", "Reranking Model": "Múnla Athrangú", - "Reranking model disabled": "Samhail athrangú faoi mhíchumas", - "Reranking model set to \"{{reranking_model}}\"": "Samhail athrangú socraithe go \"{{reranking_model}}\"", "Reset": "Athshocraigh", "Reset All Models": "Athshocraigh Gach Múnla", "Reset Upload Directory": "Athshocraigh Eolaire Uas", @@ -1069,6 +1068,8 @@ "Show": "Taispeáin", "Show \"What's New\" modal on login": "Taispeáin módúil \"Cad atá Nua\" ar logáil isteach", "Show Admin Details in Account Pending Overlay": "Taispeáin Sonraí Riaracháin sa Chuntas ar Feitheamh Forleagan", + "Show All": "", + "Show Less": "", "Show Model": "Taispeáin Múnla", "Show shortcuts": "Taispeáin aicearraí", "Show your support!": "Taispeáin do thacaíocht!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Freagra Comhrá Sruth", "STT Model": "Múnla STT", "STT Settings": "Socruithe STT", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Fotheideal (m.sh. faoin Impireacht Rómhánach)", "Success": "Rath", "Successfully updated.": "Nuashonraithe go rathúil.", diff --git a/src/lib/i18n/locales/it-IT/translation.json b/src/lib/i18n/locales/it-IT/translation.json index 90e052abf..1167a7b97 100644 --- a/src/lib/i18n/locales/it-IT/translation.json +++ b/src/lib/i18n/locales/it-IT/translation.json @@ -1,180 +1,180 @@ { - "-1 for no limit, or a positive integer for a specific limit": "", + "-1 for no limit, or a positive integer for a specific limit": "-1 per nessun limite, o un numero intero positivo per un limite specifico", "'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' o '-1' per nessuna scadenza.", - "(e.g. `sh webui.sh --api --api-auth username_password`)": "", + "(e.g. `sh webui.sh --api --api-auth username_password`)": "(p.e. `sh webui.sh --api --api-auth username_password`)", "(e.g. `sh webui.sh --api`)": "(p.e. `sh webui.sh --api`)", "(latest)": "(ultima)", - "(leave blank for to use commercial endpoint)": "", - "(Ollama)": "", + "(leave blank for to use commercial endpoint)": "(lascia vuoto per utilizzare l'endpoint commerciale)", + "(Ollama)": "(Ollama)", "{{ models }}": "{{ modelli }}", - "{{COUNT}} Available Tools": "", - "{{COUNT}} hidden lines": "", - "{{COUNT}} Replies": "", + "{{COUNT}} Available Tools": "{{COUNT}} strumenti disponibili", + "{{COUNT}} hidden lines": "{{COUNT}} righe nascoste", + "{{COUNT}} Replies": "{{COUNT}} Risposte", "{{user}}'s Chats": "{{user}} Chat", - "{{webUIName}} Backend Required": "{{webUIName}} Backend richiesto", - "*Prompt node ID(s) are required for image generation": "", - "A new version (v{{LATEST_VERSION}}) is now available.": "", + "{{webUIName}} Backend Required": "{{webUIName}} Backend richiesta", + "*Prompt node ID(s) are required for image generation": "*ID nodo prompt sono richiesti per la generazione di immagini", + "A new version (v{{LATEST_VERSION}}) is now available.": "Una nuova versione (v{{LATEST_VERSION}}) è ora disponibile.", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Un modello di attività viene utilizzato durante l'esecuzione di attività come la generazione di titoli per chat e query di ricerca Web", "a user": "un utente", "About": "Informazioni", - "Accept autocomplete generation / Jump to prompt variable": "", - "Access": "", - "Access Control": "", - "Accessible to all users": "", + "Accept autocomplete generation / Jump to prompt variable": "Accetta generazione di completamento / Passa alla variabile del prompt", + "Access": "Accesso", + "Access Control": "Controllo accessi", + "Accessible to all users": "Accessibile a tutti gli utenti", "Account": "Account", - "Account Activation Pending": "", + "Account Activation Pending": "Attivazione di un account in attesa", "Accurate information": "Informazioni accurate", - "Actions": "", - "Activate": "", - "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "", - "Active Users": "", + "Actions": "Azioni", + "Activate": "Attiva", + "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Attiva questo comando digitando \"/{{COMMAND}}\" nell'input della chat.", + "Active Users": "Utenti attivi", "Add": "Aggiungi", - "Add a model ID": "", + "Add a model ID": "Aggiungi un ID modello", "Add a short description about what this model does": "Aggiungi una breve descrizione di ciò che fa questo modello", "Add a tag": "Aggiungi un tag", - "Add Arena Model": "", - "Add Connection": "", - "Add Content": "", - "Add content here": "", - "Add custom prompt": "Aggiungi un prompt custom", - "Add Files": "Aggiungi file", - "Add Group": "", - "Add Memory": "Aggiungi memoria", - "Add Model": "Aggiungi modello", - "Add Reaction": "", - "Add Tag": "", - "Add Tags": "Aggiungi tag", - "Add text content": "", + "Add Arena Model": "Aggiungi modello Arena", + "Add Connection": "Aggiungi connessione", + "Add Content": "Aggiungi contenuto", + "Add content here": "Aggiungi un contenuto qui", + "Add custom prompt": "Aggiungi un prompt personalizzato", + "Add Files": "Aggiungi dei files", + "Add Group": "Aggiungi un gruppo", + "Add Memory": "Aggiungi una memoria", + "Add Model": "Aggiungi un modello", + "Add Reaction": "Aggiungi una reazione", + "Add Tag": "Aggiungi un tag", + "Add Tags": "Aggiungi dei tag", + "Add text content": "Aggiungi contenuto di testo", "Add User": "Aggiungi utente", - "Add User Group": "", + "Add User Group": "Aggiungi gruppo utente", "Adjusting these settings will apply changes universally to all users.": "La modifica di queste impostazioni applicherà le modifiche universalmente a tutti gli utenti.", "admin": "amministratore", - "Admin": "", + "Admin": "Amministratore", "Admin Panel": "Pannello di amministrazione", "Admin Settings": "Impostazioni amministratore", - "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "", + "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Gli amministratori hanno accesso a tutti gli strumenti in qualsiasi momento; gli utenti hanno bisogno di strumenti assegnati per modello nello spazio di lavoro.", "Advanced Parameters": "Parametri avanzati", "Advanced Params": "Parametri avanzati", - "All": "", + "All": "Tutti", "All Documents": "Tutti i documenti", - "All models deleted successfully": "", - "Allow Call": "", - "Allow Chat Controls": "", - "Allow Chat Delete": "", + "All models deleted successfully": "Tutti i modelli eliminati con successo", + "Allow Call": "Consenti chiamata", + "Allow Chat Controls": "Consenti controlli chat", + "Allow Chat Delete": "Consenti eliminazione chat", "Allow Chat Deletion": "Consenti l'eliminazione della chat", - "Allow Chat Edit": "", - "Allow Chat Export": "", - "Allow Chat Share": "", - "Allow File Upload": "", - "Allow Multiple Models in Chat": "", - "Allow non-local voices": "", - "Allow Speech to Text": "", - "Allow Temporary Chat": "", - "Allow Text to Speech": "", - "Allow User Location": "", - "Allow Voice Interruption in Call": "", - "Allowed Endpoints": "", + "Allow Chat Edit": "Consenti modifica chat", + "Allow Chat Export": "Consenti esportazione chat", + "Allow Chat Share": "Consenti condivisione chat", + "Allow File Upload": "Consenti caricamento file", + "Allow Multiple Models in Chat": "Consenti più modelli in chat", + "Allow non-local voices": "Consenti voci non locali", + "Allow Speech to Text": "Consenti trascrizione vocale", + "Allow Temporary Chat": "Consenti chat temporanea", + "Allow Text to Speech": "Consenti sintesi vocale", + "Allow User Location": "Consenti posizione utente", + "Allow Voice Interruption in Call": "Consenti interruzione vocale in chiamata", + "Allowed Endpoints": "Endpoint consentiti", "Already have an account?": "Hai già un account?", - "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.": "", - "Always": "", - "Always Collapse Code Blocks": "", - "Always Expand Details": "", - "Always Play Notification Sound": "", - "Amazing": "", + "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.": "Alternativa al top_p e mira a garantire un equilibrio tra qualità e varietà. Il parametro p rappresenta la probabilità minima affinché un token venga considerato, rispetto alla probabilità del token più probabile. Ad esempio, con p=0.05 e il token più probabile con una probabilità di 0.9, i logits con un valore inferiore a 0.045 vengono filtrati.", + "Always": "Sempre", + "Always Collapse Code Blocks": "Riduci sempre i blocchi di codice", + "Always Expand Details": "Espandi sempre i dettagli", + "Always Play Notification Sound": "Riproduci sempre il suono di notifica", + "Amazing": "Fantastico", "an assistant": "un assistente", - "Analyzed": "", - "Analyzing...": "", + "Analyzed": "Analizzato", + "Analyzing...": "Analizzando...", "and": "e", - "and {{COUNT}} more": "", + "and {{COUNT}} more": "e {{COUNT}} altro", "and create a new shared link.": "e crea un nuovo link condiviso.", - "Android": "", + "Android": "Android", "API Base URL": "URL base API", "API Key": "Chiave API", "API Key created.": "Chiave API creata.", - "API Key Endpoint Restrictions": "", + "API Key Endpoint Restrictions": "Restrizioni endpoint chiave API", "API keys": "Chiavi API", - "Application DN": "", - "Application DN Password": "", - "applies to all users with the \"user\" role": "", + "Application DN": "DN dell'applicazione", + "Application DN Password": "Password DN dell'applicazione", + "applies to all users with the \"user\" role": "applica a tutti gli utenti con il ruolo \"utente\"", "April": "Aprile", "Archive": "Archivio", "Archive All Chats": "Archivia tutte le chat", "Archived Chats": "Chat archiviate", - "archived-chat-export": "", - "Are you sure you want to clear all memories? This action cannot be undone.": "", - "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 update this user's role to **{{ROLE}}**?": "", + "archived-chat-export": "chat-archiviata-esportazione", + "Are you sure you want to clear all memories? This action cannot be undone.": "Sei sicuro di voler cancellare tutte le memorie? Questa operazione non può essere annullata.", + "Are you sure you want to delete this channel?": "Sei sicuro di voler eliminare questo canale?", + "Are you sure you want to delete this message?": "Sei sicuro di voler eliminare questo messaggio?", + "Are you sure you want to unarchive all archived chats?": "Sei sicuro di voler disarchiviare tutte le chat archiviate?", + "Are you sure you want to update this user's role to **{{ROLE}}**?": "Sei sicuro di voler aggiornare il ruolo di questo utente in **{{ROLE}}**?", "Are you sure?": "Sei sicuro?", - "Arena Models": "", - "Artifacts": "", - "Ask": "", - "Ask a question": "", - "Assistant": "", - "Attach file from knowledge": "", + "Arena Models": "Modelli Arena", + "Artifacts": "Artefatti", + "Ask": "Chiedi", + "Ask a question": "Fai una domanda", + "Assistant": "Assistente", + "Attach file from knowledge": "Allega file dalla conoscenza", "Attention to detail": "Attenzione ai dettagli", - "Attribute for Mail": "", - "Attribute for Username": "", + "Attribute for Mail": "Attributo per la posta", + "Attribute for Username": "Attributo per il nome utente", "Audio": "Audio", "August": "Agosto", - "Auth": "", - "Authenticate": "", - "Authentication": "", - "Auto": "", + "Auth": "Autenticazione", + "Authenticate": "Autentica", + "Authentication": "Autenticazione", + "Auto": "Automatico", "Auto-Copy Response to Clipboard": "Copia automatica della risposta negli appunti", "Auto-playback response": "Riproduzione automatica della risposta", - "Autocomplete Generation": "", - "Autocomplete Generation Input Max Length": "", + "Autocomplete Generation": "Generazione dell'autocompletamento", + "Autocomplete Generation Input Max Length": "Lunghezza massima input generazione dell'autocompletamento", "Automatic1111": "", "AUTOMATIC1111 Api Auth String": "", "AUTOMATIC1111 Base URL": "URL base AUTOMATIC1111", "AUTOMATIC1111 Base URL is required.": "L'URL base AUTOMATIC1111 è obbligatorio.", - "Available list": "", - "Available Tools": "", + "Available list": "Elenco disponibile", + "Available Tools": "Strumenti disponibili", "available!": "disponibile!", - "Awful": "", - "Azure AI Speech": "", - "Azure Region": "", + "Awful": "Terribile", + "Azure AI Speech": "Azure AI Speech", + "Azure Region": "Regione di Azure", "Back": "Indietro", "Bad Response": "Risposta non valida", "Banners": "Banner", "Base Model (From)": "Modello base (da)", - "Batch Size (num_batch)": "", + "Batch Size (num_batch)": "Dimensione batch (num_batch)", "before": "prima", "Being lazy": "Essere pigri", - "Beta": "", - "Bing Search V7 Endpoint": "", + "Beta": "Beta", + "Bing Search V7 Endpoint": "Endpoint di Bing Search V7", "Bing Search V7 Subscription Key": "", - "Bocha Search API Key": "", - "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "", - "Both Docling OCR Engine and Language(s) must be provided or both left empty.": "", + "Bocha Search API Key": "Chiave API di Bocha Search", + "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Potenziare o penalizzare token specifici per risposte vincolate. I valori di bias saranno limitati tra -100 e 100 (incluso). (Predefinito: nessuno)", + "Both Docling OCR Engine and Language(s) must be provided or both left empty.": "Entrambi il Docling OCR Engine e la lingua(e) devono essere forniti o entrambi lasciati vuoti.", "Brave Search API Key": "Chiave API di ricerca Brave", - "By {{name}}": "", - "Bypass Embedding and Retrieval": "", - "Calendar": "", - "Call": "", - "Call feature is not supported when using Web STT engine": "", - "Camera": "", + "By {{name}}": "Di {{name}}", + "Bypass Embedding and Retrieval": "Bypass embedding e recupero", + "Calendar": "Calendario", + "Call": "Chiamata", + "Call feature is not supported when using Web STT engine": "La funzione di chiamata non è supportata quando si utilizza il motore Web STT", + "Camera": "Fotocamera", "Cancel": "Annulla", "Capabilities": "Funzionalità", - "Capture": "", - "Capture Audio": "", - "Certificate Path": "", + "Capture": "Cattura", + "Capture Audio": "Cattura audio", + "Certificate Path": "Percorso certificato", "Change Password": "Cambia password", - "Channel Name": "", - "Channels": "", - "Character": "", - "Character limit for autocomplete generation input": "", - "Chart new frontiers": "", + "Channel Name": "Nome canale", + "Channels": "Canali", + "Character": "Carattere", + "Character limit for autocomplete generation input": "Limite di caratteri per l'input di generazione dell'autocompletamento", + "Chart new frontiers": "Traccia nuove frontiere", "Chat": "Chat", - "Chat Background Image": "", + "Chat Background Image": "Immagine di sfondo chat", "Chat Bubble UI": "UI bolle chat", - "Chat Controls": "", + "Chat Controls": "Controlli chat", "Chat direction": "Direzione chat", - "Chat Overview": "", - "Chat Permissions": "", - "Chat Tags Auto-Generation": "", + "Chat Overview": "Panoramica chat", + "Chat Permissions": "Permessi chat", + "Chat Tags Auto-Generation": "Generazione automatica dei tag chat", "Chats": "Chat", "Check Again": "Controlla di nuovo", "Check for updates": "Controlla aggiornamenti", @@ -182,655 +182,655 @@ "Choose a model before saving...": "Scegli un modello prima di salvare...", "Chunk Overlap": "Sovrapposizione chunk", "Chunk Size": "Dimensione chunk", - "Ciphers": "", + "Ciphers": "Cifrari", "Citation": "Citazione", - "Clear memory": "", - "Clear Memory": "", - "click here": "", - "Click here for filter guides.": "", + "Clear memory": "Cancella memoria", + "Clear Memory": "Cancella memoria", + "click here": "clicca qui", + "Click here for filter guides.": "Clicca qui per le guide ai filtri.", "Click here for help.": "Clicca qui per aiuto.", "Click here to": "Clicca qui per", - "Click here to download user import template file.": "", - "Click here to learn more about faster-whisper and see the available models.": "", - "Click here to see available models.": "", + "Click here to download user import template file.": "Clicca qui per scaricare il file modello di importazione utente.", + "Click here to learn more about faster-whisper and see the available models.": "Clicca qui per saperne di più su faster-whisper e vedere i modelli disponibili.", + "Click here to see available models.": "Clicca qui per vedere i modelli disponibili.", "Click here to select": "Clicca qui per selezionare", "Click here to select a csv file.": "Clicca qui per selezionare un file csv.", - "Click here to select a py file.": "", - "Click here to upload a workflow.json file.": "", + "Click here to select a py file.": "Clicca qui per selezionare un file py.", + "Click here to upload a workflow.json file.": "Clicca qui per caricare un file workflow.json.", "click here.": "clicca qui.", "Click on the user role button to change a user's role.": "Clicca sul pulsante del ruolo utente per modificare il ruolo di un utente.", - "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "", + "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Autorizzazione di scrittura negli appunti negata. Controlla le impostazioni del browser per concedere l'accesso necessario.", "Clone": "Clone", "Clone Chat": "", - "Clone of {{TITLE}}": "", + "Clone of {{TITLE}}": "Clone di {{TITLE}}", "Close": "Chiudi", - "Code execution": "", - "Code Execution": "", - "Code Execution Engine": "", - "Code Execution Timeout": "", - "Code formatted successfully": "", - "Code Interpreter": "", - "Code Interpreter Engine": "", - "Code Interpreter Prompt Template": "", - "Collapse": "", + "Code execution": "Esecuzione codice", + "Code Execution": "Esecuzione codice", + "Code Execution Engine": "Motore di esecuzione codice", + "Code Execution Timeout": "Timeout esecuzione codice", + "Code formatted successfully": "Codice formattato con successo", + "Code Interpreter": "Interprete codice", + "Code Interpreter Engine": "Motore interprete codice", + "Code Interpreter Prompt Template": "Modello di prompt interprete codice", + "Collapse": "Riduci", "Collection": "Collezione", - "Color": "", + "Color": "Colore", "ComfyUI": "ComfyUI", - "ComfyUI API Key": "", + "ComfyUI API Key": "Chiave API ComfyUI", "ComfyUI Base URL": "URL base ComfyUI", "ComfyUI Base URL is required.": "L'URL base ComfyUI è obbligatorio.", - "ComfyUI Workflow": "", - "ComfyUI Workflow Nodes": "", + "ComfyUI Workflow": "Flusso di lavoro ComfyUI", + "ComfyUI Workflow Nodes": "Nodi flusso di lavoro ComfyUI", "Command": "Comando", - "Completions": "", + "Completions": "Completamenti", "Concurrent Requests": "Richieste simultanee", - "Configure": "", - "Confirm": "", + "Configure": "Configura", + "Confirm": "Conferma", "Confirm Password": "Conferma password", - "Confirm your action": "", - "Confirm your new password": "", - "Connect to your own OpenAI compatible API endpoints.": "", - "Connect to your own OpenAPI compatible external tool servers.": "", - "Connection failed": "", - "Connection successful": "", + "Confirm your action": "Conferma la tua azione", + "Confirm your new password": "Conferma la tua nuova password", + "Connect to your own OpenAI compatible API endpoints.": "Connettiti ai tuoi endpoint API compatibili con OpenAI.", + "Connect to your own OpenAPI compatible external tool servers.": "Connettiti ai tuoi server di strumenti esterni compatibili con OpenAPI.", + "Connection failed": "Connessione fallita", + "Connection successful": "Connessione riuscita", "Connections": "Connessioni", - "Connections saved successfully": "", - "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "", - "Contact Admin for WebUI Access": "", + "Connections saved successfully": "Connessioni salvate con successo", + "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "Limita lo sforzo di ragionamento per i modelli di ragionamento. Applicabile solo a modelli di ragionamento di fornitori specifici che supportano lo sforzo di ragionamento.", + "Contact Admin for WebUI Access": "Contatta l'amministratore per l'accesso al servizio WebUI", "Content": "Contenuto", - "Content Extraction Engine": "", + "Content Extraction Engine": "Motore di estrazione contenuti", "Context Length": "Lunghezza contesto", "Continue Response": "Continua risposta", - "Continue with {{provider}}": "", - "Continue with Email": "", - "Continue with LDAP": "", - "Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "", - "Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "", - "Controls": "", - "Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "", - "Copied": "", + "Continue with {{provider}}": "Continua con {{provider}}", + "Continue with Email": "Continua con email", + "Continue with LDAP": "Continua con LDAP", + "Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "Controlla come il testo del messaggio viene suddiviso per le richieste TTS. 'Punteggiatura' divide in frasi, 'paragrafi' divide in paragrafi e 'nessuno' mantiene il messaggio come una singola stringa.", + "Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "Controlla la ripetizione delle sequenze di token nel testo generato. Un valore più alto (ad esempio, 1.5) penalizzerà le ripetizioni in modo più forte, mentre un valore più basso (ad esempio, 1.1) sarà più indulgente. A 1, è disabilitato.", + "Controls": "Controlli", + "Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "Controlla l'equilibrio tra coerenza e diversità dell'output. Un valore più basso risulterà in un testo più focalizzato e coerente.", + "Copied": "Copiato", "Copied shared chat URL to clipboard!": "URL della chat condivisa copiato negli appunti!", - "Copied to clipboard": "", + "Copied to clipboard": "Copiato negli appunti", "Copy": "Copia", - "Copy Formatted Text": "", + "Copy Formatted Text": "Copia testo formattato", "Copy last code block": "Copia ultimo blocco di codice", "Copy last response": "Copia ultima risposta", "Copy Link": "Copia link", - "Copy to clipboard": "", + "Copy to clipboard": "Copia negli appunti", "Copying to clipboard was successful!": "Copia negli appunti riuscita!", - "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", - "Create": "", - "Create a knowledge base": "", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS deve essere configurato correttamente dal fornitore per consentire le richieste da Open WebUI.", + "Create": "Crea", + "Create a knowledge base": "Crea una base di conoscenze", "Create a model": "Creare un modello", "Create Account": "Crea account", - "Create Admin Account": "", - "Create Channel": "", - "Create Group": "", - "Create Knowledge": "", + "Create Admin Account": "Crea account amministratore", + "Create Channel": "Crea canale", + "Create Group": "Crea gruppo", + "Create Knowledge": "Crea conoscenza", "Create new key": "Crea nuova chiave", "Create new secret key": "Crea nuova chiave segreta", - "Create Note": "", + "Create Note": "Crea nota", "Create your first note by clicking on the plus button below.": "", "Created at": "Creato il", "Created At": "Creato il", - "Created by": "", - "CSV Import": "", - "Ctrl+Enter to Send": "", + "Created by": "Creato da", + "CSV Import": "Importazione CSV", + "Ctrl+Enter to Send": "Ctrl+Invio per inviare", "Current Model": "Modello corrente", "Current Password": "Password corrente", "Custom": "Personalizzato", - "Danger Zone": "", + "Danger Zone": "Zona di pericolo", "Dark": "Scuro", "Database": "Database", "December": "Dicembre", "Default": "Predefinito", - "Default (Open AI)": "", + "Default (Open AI)": "Predefinito (Open AI)", "Default (SentenceTransformers)": "Predefinito (SentenceTransformers)", - "Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "", + "Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "Il modello predefinito funziona con un'ampia gamma di modelli chiamando gli strumenti una volta prima dell'esecuzione. La modalità nativa sfrutta le capacità di chiamata degli strumenti integrate nel modello, ma richiede che il modello supporti intrinsecamente questa funzionalità.", "Default Model": "Modello di default", "Default model updated": "Modello predefinito aggiornato", - "Default Models": "", - "Default permissions": "", - "Default permissions updated successfully": "", + "Default Models": "Modelli predefiniti", + "Default permissions": "Permessi predefiniti", + "Default permissions updated successfully": "Permessi predefiniti aggiornati con successo", "Default Prompt Suggestions": "Suggerimenti prompt predefiniti", - "Default to 389 or 636 if TLS is enabled": "", - "Default to ALL": "", - "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "", + "Default to 389 or 636 if TLS is enabled": "Predefinito a 389 o 636 se TLS è ab", + "Default to ALL": "Predefinito su TUTTI", + "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "Predefinito per il recupero segmentato per un'estrazione di contenuti mirata e pertinente, questo è raccomandato per la maggior parte dei casi.", "Default User Role": "Ruolo utente predefinito", "Delete": "Elimina", "Delete a model": "Elimina un modello", "Delete All Chats": "Elimina tutte le chat", - "Delete All Models": "", + "Delete All Models": "Elimina tutti i modelli", "Delete chat": "Elimina chat", "Delete Chat": "Elimina chat", - "Delete chat?": "", - "Delete folder?": "", - "Delete function?": "", - "Delete Message": "", - "Delete message?": "", - "Delete note?": "", - "Delete prompt?": "", + "Delete chat?": "Elimina chat?", + "Delete folder?": "Elimina cartella?", + "Delete function?": "Elimina funzione?", + "Delete Message": "Elimina messaggio", + "Delete message?": "Elimina messaggio?", + "Delete note?": "Elimina nota?", + "Delete prompt?": "Elimina prompt?", "delete this link": "elimina questo link", - "Delete tool?": "", + "Delete tool?": "Elimina strumento?", "Delete User": "Elimina utente", - "Deleted {{deleteModelTag}}": "Eliminato {{deleteModelTag}}", - "Deleted {{name}}": "Eliminato {{name}}", - "Deleted User": "", - "Describe your knowledge base and objectives": "", + "Deleted {{deleteModelTag}}": "{{deleteModelTag}} eliminato", + "Deleted {{name}}": "{{name}} eliminato", + "Deleted User": "Utente eliminato", + "Describe your knowledge base and objectives": "Descrivi la tua base di conoscenza e gli obiettivi", "Description": "Descrizione", - "Detect Artifacts Automatically": "", + "Detect Artifacts Automatically": "Rileva artefatti automaticamente", "Didn't fully follow instructions": "Non ha seguito completamente le istruzioni", - "Direct": "", - "Direct Connections": "", - "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", - "Direct Connections settings updated": "", - "Direct Tool Servers": "", - "Disabled": "", - "Discover a function": "", + "Direct": "Diretto", + "Direct Connections": "Connessioni dirette", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Le connessioni dirette consentono agli utenti di connettersi ai propri endpoint API compatibili con OpenAI.", + "Direct Connections settings updated": "Impostazioni connessioni dirette aggiornate", + "Direct Tool Servers": "Connessioni dirette agli strumenti", + "Disabled": "Disabilitato", + "Discover a function": "Scopri una funzione", "Discover a model": "Scopri un modello", "Discover a prompt": "Scopri un prompt", - "Discover a tool": "", - "Discover how to use Open WebUI and seek support from the community.": "", - "Discover wonders": "", - "Discover, download, and explore custom functions": "", + "Discover a tool": "Scopri uno strumento", + "Discover how to use Open WebUI and seek support from the community.": "Scopri come utilizzare Open WebUI e cerca supporto dalla community.", + "Discover wonders": "Scopri meraviglie", + "Discover, download, and explore custom functions": "Scopri, scarica ed esplora funzioni personalizzate", "Discover, download, and explore custom prompts": "Scopri, scarica ed esplora prompt personalizzati", - "Discover, download, and explore custom tools": "", + "Discover, download, and explore custom tools": "Scopri, scarica ed esplora strumenti personalizzati", "Discover, download, and explore model presets": "Scopri, scarica ed esplora i preset del modello", - "Dismissible": "", - "Display": "", - "Display Emoji in Call": "", + "Dismissible": "Scartabile", + "Display": "Visualizza", + "Display Emoji in Call": "Visualizza emoji nella chiamata", "Display the username instead of You in the Chat": "Visualizza il nome utente invece di Tu nella chat", - "Displays citations in the response": "", - "Dive into knowledge": "", - "Do not install functions from sources you do not fully trust.": "", - "Do not install tools from sources you do not fully trust.": "", - "Docling": "", - "Docling Server URL required.": "", + "Displays citations in the response": "Visualizza citazioni nella risposta", + "Dive into knowledge": "Immergiti nella conoscenza", + "Do not install functions from sources you do not fully trust.": "Non installare funzioni da fonti di cui non ti fidi completamente.", + "Do not install tools from sources you do not fully trust.": "Non installare strumenti da fonti di cui non ti fidi completamente.", + "Docling": "Docling", + "Docling Server URL required.": "L'URL del server Docling è richiesto.", "Document": "Documento", "Document Intelligence": "", "Document Intelligence endpoint and key required.": "", - "Documentation": "", + "Documentation": "Documentazione", "Documents": "Documenti", "does not make any external connections, and your data stays securely on your locally hosted server.": "non effettua connessioni esterne e i tuoi dati rimangono al sicuro sul tuo server ospitato localmente.", - "Domain Filter List": "", + "Domain Filter List": "Elenco filtri dominio", "Don't have an account?": "Non hai un account?", - "don't install random functions from sources you don't trust.": "", - "don't install random tools from sources you don't trust.": "", + "don't install random functions from sources you don't trust.": "non installare funzioni da fonti di cui non ti fidi.", + "don't install random tools from sources you don't trust.": "non installare strumenti da fonti di cui non ti fidi.", "Don't like the style": "Non ti piace lo stile", - "Done": "", + "Done": "Fatto", "Download": "Scarica", - "Download as SVG": "", + "Download as SVG": "Scarica come SVG", "Download canceled": "Scaricamento annullato", "Download Database": "Scarica database", - "Drag and drop a file to upload or select a file to view": "", - "Draw": "", - "Drop any files here to upload": "", + "Drag and drop a file to upload or select a file to view": "Trascina e rilascia un file per caricarlo o seleziona un file da visualizzare", + "Draw": "Disegna", + "Drop any files here to upload": "Rilascia qui i file per caricarli", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "ad esempio '30s','10m'. Le unità di tempo valide sono 's', 'm', 'h'.", - "e.g. \"json\" or a JSON schema": "", - "e.g. 60": "", - "e.g. A filter to remove profanity from text": "", - "e.g. My Filter": "", - "e.g. My Tools": "", - "e.g. my_filter": "", - "e.g. my_tools": "", - "e.g. Tools for performing various operations": "", - "e.g., 3, 4, 5 (leave blank for default)": "", - "e.g., en-US,ja-JP (leave blank for auto-detect)": "", - "e.g., westus (leave blank for eastus)": "", + "e.g. \"json\" or a JSON schema": "ad esempio \"json\" o uno schema JSON", + "e.g. 60": "ad esempio 60", + "e.g. A filter to remove profanity from text": "ad esempio un filtro per rimuovere le parolacce dal testo", + "e.g. My Filter": "ad esempio il mio filtro", + "e.g. My Tools": "ad esempio i miei strumenti", + "e.g. my_filter": "ad esempio il mio_filtro", + "e.g. my_tools": "ad esempio i miei_strumenti", + "e.g. Tools for performing various operations": "ad esempio strumenti per eseguire varie operazioni", + "e.g., 3, 4, 5 (leave blank for default)": "ad esempio, 3, 4, 5 (lascia vuoto per predefinito)", + "e.g., en-US,ja-JP (leave blank for auto-detect)": "ad esempio, en-US,ja-JP (lascia vuoto per auto-rilevamento)", + "e.g., westus (leave blank for eastus)": "ad esempio, westus (lascia vuoto per est)", "Edit": "Modifica", - "Edit Arena Model": "", - "Edit Channel": "", - "Edit Connection": "", - "Edit Default Permissions": "", - "Edit Memory": "", + "Edit Arena Model": "Modifica modello Arena", + "Edit Channel": "Modifica canale", + "Edit Connection": "Modifica connessione", + "Edit Default Permissions": "Modifica permessi predefiniti", + "Edit Memory": "Modifica memoria", "Edit User": "Modifica utente", - "Edit User Group": "", - "ElevenLabs": "", + "Edit User Group": "Modifica gruppo utente", + "ElevenLabs": "ElevenLabs", "Email": "Email", - "Embark on adventures": "", - "Embedding": "", - "Embedding Batch Size": "", + "Embark on adventures": "Intraprendi avventure", + "Embedding": "Embedding", + "Embedding Batch Size": "Dimensione batch embedding", "Embedding Model": "Modello di embedding", "Embedding Model Engine": "Motore del modello di embedding", "Embedding model set to \"{{embedding_model}}\"": "Modello di embedding impostato su \"{{embedding_model}}\"", - "Enable API Key": "", - "Enable autocomplete generation for chat messages": "", - "Enable Code Execution": "", - "Enable Code Interpreter": "", + "Enable API Key": "Abilita chiave API", + "Enable autocomplete generation for chat messages": "Abilita generazione autocompletamento per i messaggi di chat", + "Enable Code Execution": "Abilita esecuzione codice", + "Enable Code Interpreter": "Abilita interprete codice", "Enable Community Sharing": "Abilita la condivisione della community", - "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": "", - "Enable Mirostat sampling for controlling perplexity.": "", + "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.": "Abilita il blocco della memoria (mlock) per impedire che i dati del modello vengano scambiati dalla RAM. Questa opzione blocca l'insieme di pagine di lavoro del modello nella RAM, assicurando che non vengano scambiate su disco. Questo può aiutare a mantenere le prestazioni evitando errori di pagina e garantendo un accesso rapido ai dati.", + "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.": "Abilita il mapping della memoria (mmap) per caricare i dati del modello. Questa opzione consente al sistema di utilizzare lo spazio di archiviazione su disco come estensione della RAM trattando i file su disco come se fossero nella RAM. Questo può migliorare le prestazioni del modello consentendo un accesso più rapido ai dati. Tuttavia, potrebbe non funzionare correttamente con tutti i sistemi e può consumare una quantità significativa di spazio su disco.", + "Enable Message Rating": "Abilita valutazione messaggio", + "Enable Mirostat sampling for controlling perplexity.": "Abilita il campionamento Mirostat per controllare la perplessità.", "Enable New Sign Ups": "Abilita nuove iscrizioni", - "Enabled": "", - "Endpoint URL": "", - "Enforce Temporary Chat": "", - "Enhance": "", + "Enabled": "Abilitato", + "Endpoint URL": "URL dell'endpoint", + "Enforce Temporary Chat": "Applica chat temporanea", + "Enhance": "Migliora", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assicurati che il tuo file CSV includa 4 colonne in questo ordine: Nome, Email, Password, Ruolo.", "Enter {{role}} message here": "Inserisci il messaggio per {{role}} qui", "Enter a detail about yourself for your LLMs to recall": "Inserisci un dettaglio su di te per che i LLM possano ricordare", - "Enter api auth string (e.g. username:password)": "", - "Enter Application DN": "", - "Enter Application DN Password": "", - "Enter Bing Search V7 Endpoint": "", - "Enter Bing Search V7 Subscription Key": "", - "Enter Bocha Search API Key": "", + "Enter api auth string (e.g. username:password)": "Inserisci la stringa di autenticazione API (ad es. nome utente:password)", + "Enter Application DN": "Inserisci DN dell'applicazione", + "Enter Application DN Password": "Inserisci password DN dell'applicazione", + "Enter Bing Search V7 Endpoint": "Inserisci l'endpoint di Bing Search V7", + "Enter Bing Search V7 Subscription Key": "Inserisci la chiave di sottoscrizione di Bing Search V7", + "Enter Bocha Search API Key": "Inserisci la chiave API di Bocha Search", "Enter Brave Search API Key": "Inserisci la chiave API di Brave Search", - "Enter certificate path": "", - "Enter CFG Scale (e.g. 7.0)": "", + "Enter certificate path": "Inserisci il percorso del certificato", + "Enter CFG Scale (e.g. 7.0)": "Inserisci CFG Scale (ad esempio 7.0)", "Enter Chunk Overlap": "Inserisci la sovrapposizione chunk", "Enter Chunk Size": "Inserisci la dimensione chunk", - "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "", - "Enter description": "", - "Enter Docling OCR Engine": "", - "Enter Docling OCR Language(s)": "", - "Enter Docling Server URL": "", - "Enter Document Intelligence Endpoint": "", - "Enter Document Intelligence Key": "", - "Enter domains separated by commas (e.g., example.com,site.org)": "", - "Enter Exa API Key": "", - "Enter External Web Loader API Key": "", - "Enter External Web Loader URL": "", - "Enter External Web Search API Key": "", - "Enter External Web Search URL": "", - "Enter Firecrawl API Base URL": "", - "Enter Firecrawl API Key": "", + "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Inserisci coppie \"token:valore_bias\" separate da virgole (esempio: 5432:100, 413:-100)", + "Enter description": "Inserisci la descrizione", + "Enter Docling OCR Engine": "Inserisci il OCR Docling Engine", + "Enter Docling OCR Language(s)": "Inserisci la lingua OCR Docling", + "Enter Docling Server URL": "Inserisci l'URL del server Docling", + "Enter Document Intelligence Endpoint": "Inserisci l'endpoint di Document Intelligence", + "Enter Document Intelligence Key": "Inserisci la chiave di Document Intelligence", + "Enter domains separated by commas (e.g., example.com,site.org)": "Inserisci i domini separati da virgole (ad es., example.com,site.org)", + "Enter Exa API Key": "Inserisci la chiave API Exa", + "Enter External Web Loader API Key": "Inserisci la chiave API del caricatore web esterno", + "Enter External Web Loader URL": "Inserisci l'URL del caricatore web esterno", + "Enter External Web Search API Key": "Inserisci la chiave API di ricerca web esterna", + "Enter External Web Search URL": "Inserisci l'URL di ricerca web esterna", + "Enter Firecrawl API Base URL": "Inserisci l'URL base dell'API Firecrawl", + "Enter Firecrawl API Key": "Inserisci la chiave API Firecrawl", "Enter Github Raw URL": "Immettere l'URL grezzo di Github", "Enter Google PSE API Key": "Inserisci la chiave API PSE di Google", "Enter Google PSE Engine Id": "Inserisci l'ID motore PSE di Google", "Enter Image Size (e.g. 512x512)": "Inserisci la dimensione dell'immagine (ad esempio 512x512)", - "Enter Jina API Key": "", - "Enter Jupyter Password": "", - "Enter Jupyter Token": "", - "Enter Jupyter URL": "", - "Enter Kagi Search API Key": "", - "Enter Key Behavior": "", + "Enter Jina API Key": "Inserisci la chiave API Jina", + "Enter Jupyter Password": "Inserisci la password Jupyter", + "Enter Jupyter Token": "Inserisci il token Jupyter", + "Enter Jupyter URL": "Inserisci l'URL Jupyter", + "Enter Kagi Search API Key": "Inserisci la chiave API di ricerca Kagi", + "Enter Key Behavior": "Inserisci il comportamento della chiave", "Enter language codes": "Inserisci i codici lingua", - "Enter Mistral API Key": "", - "Enter Model ID": "", + "Enter Mistral API Key": "Inserisci la chiave API Mistral", + "Enter Model ID": "Inserisci l'ID del modello", "Enter model tag (e.g. {{modelTag}})": "Inserisci il tag del modello (ad esempio {{modelTag}})", - "Enter Mojeek Search API Key": "", - "Enter New Password": "", + "Enter Mojeek Search API Key": "Inserisci la chiave API di ricerca Mojeek", + "Enter New Password": "Inserisci la nuova password", "Enter Number of Steps (e.g. 50)": "Inserisci il numero di passaggi (ad esempio 50)", - "Enter Perplexity API Key": "", - "Enter Playwright Timeout": "", - "Enter Playwright WebSocket URL": "", - "Enter proxy URL (e.g. https://user:password@host:port)": "", - "Enter reasoning effort": "", - "Enter Sampler (e.g. Euler a)": "", - "Enter Scheduler (e.g. Karras)": "", + "Enter Perplexity API Key": "Inserisci la chiave API Perplexity", + "Enter Playwright Timeout": "Inserisci la scadenza di Playwright", + "Enter Playwright WebSocket URL": "Inserisci l'URL WebSocket di Playwright", + "Enter proxy URL (e.g. https://user:password@host:port)": "Inserisci l'URL del proxy (ad es. https://user:password@host:port)", + "Enter reasoning effort": "Inserisci lo sforzo di ragionamento", + "Enter Sampler (e.g. Euler a)": "Inserisci il campionatore (ad esempio Euler a)", + "Enter Scheduler (e.g. Karras)": "Inserisci lo scheduler (ad esempio Karras)", "Enter Score": "Inserisci il punteggio", - "Enter SearchApi API Key": "", - "Enter SearchApi Engine": "", + "Enter SearchApi API Key": "Inserisci la chiave API SearchApi", + "Enter SearchApi Engine": "Inserisci SearchApi Engine", "Enter Searxng Query URL": "Immettere l'URL della query Searxng", - "Enter Seed": "", - "Enter SerpApi API Key": "", - "Enter SerpApi Engine": "", + "Enter Seed": "Inserisci il seme", + "Enter SerpApi API Key": "Inserisci la chiave API SerpApi", + "Enter SerpApi Engine": "Inserisci il SerpApi Engine", "Enter Serper API Key": "Inserisci la chiave API Serper", - "Enter Serply API Key": "", + "Enter Serply API Key": "Inserisci la chiave API Serply", "Enter Serpstack API Key": "Inserisci la chiave API Serpstack", - "Enter server host": "", - "Enter server label": "", - "Enter server port": "", - "Enter Sougou Search API sID": "", - "Enter Sougou Search API SK": "", + "Enter server host": "Inserisci l'host del server", + "Enter server label": "Inserisci l'etichetta del server", + "Enter server port": "Inserisci la porta del server", + "Enter Sougou Search API sID": "Inserisci l'ID sID dell'API di Sougou Search", + "Enter Sougou Search API SK": "Inserisci la chiave SK dell'API di Sougou Search", "Enter stop sequence": "Inserisci la sequenza di arresto", - "Enter system prompt": "", - "Enter system prompt here": "", - "Enter Tavily API Key": "", - "Enter Tavily Extract Depth": "", - "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "", - "Enter Tika Server URL": "", - "Enter timeout in seconds": "", - "Enter to Send": "", + "Enter system prompt": "Inserisci il prompt di sistema", + "Enter system prompt here": "Inserisci il prompt di sistema qui", + "Enter Tavily API Key": "Inserisci la chiave API Tavily", + "Enter Tavily Extract Depth": "Inserisci la profondità di estrazione Tavily", + "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Inserisci l'URL pubblico del tuo WebUI. Questo URL verrà utilizzato per generare collegamenti nelle notifiche.", + "Enter Tika Server URL": "Inserisci l'URL del server Tika", + "Enter timeout in seconds": "Inserisci la scadenza in secondi", + "Enter to Send": "Premi invio per inviare", "Enter Top K": "Inserisci Top K", - "Enter Top K Reranker": "", + "Enter Top K Reranker": "Inserisci Top K Reranker", "Enter URL (e.g. http://127.0.0.1:7860/)": "Inserisci URL (ad esempio http://127.0.0.1:7860/)", "Enter URL (e.g. http://localhost:11434)": "Inserisci URL (ad esempio http://localhost:11434)", - "Enter Yacy Password": "", - "Enter Yacy URL (e.g. http://yacy.example.com:8090)": "", - "Enter Yacy Username": "", - "Enter your current password": "", + "Enter Yacy Password": "Inserisci la password Yacy", + "Enter Yacy URL (e.g. http://yacy.example.com:8090)": "Inserisci l'URL Yacy (ad esempio http://yacy.example.com:8090)", + "Enter Yacy Username": "Inserisci il nome utente Yacy", + "Enter your current password": "Inserisci la tua password attuale", "Enter Your Email": "Inserisci la tua email", "Enter Your Full Name": "Inserisci il tuo nome completo", - "Enter your message": "", - "Enter your name": "", - "Enter Your Name": "", - "Enter your new password": "", + "Enter your message": "Inserisci il tuo messaggio", + "Enter your name": "Inserisci il tuo nome", + "Enter Your Name": "Inserisci il tuo nome", + "Enter your new password": "Inserisci la tua nuova password", "Enter Your Password": "Inserisci la tua password", "Enter Your Role": "Inserisci il tuo ruolo", - "Enter Your Username": "", - "Enter your webhook URL": "", + "Enter Your Username": "Inserisci il tuo nome utente", + "Enter your webhook URL": "Inserisci l'URL del tuo webhook", "Error": "Errore", - "ERROR": "", - "Error accessing Google Drive: {{error}}": "", - "Error accessing media devices.": "", - "Error starting recording.": "", - "Error uploading file: {{error}}": "", - "Evaluations": "", - "Exa API Key": "", - "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "", - "Example: ALL": "", - "Example: mail": "", - "Example: ou=users,dc=foo,dc=example": "", - "Example: sAMAccountName or uid or userPrincipalName": "", - "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "", - "Exclude": "", - "Execute code for analysis": "", - "Executing **{{NAME}}**...": "", - "Expand": "", + "ERROR": "ERRORE", + "Error accessing Google Drive: {{error}}": "Errore durante l'accesso a Google Drive: {{error}}", + "Error accessing media devices.": "Errore durante l'accesso ai dispositivi multimediali.", + "Error starting recording.": "Errore durante l'avvio della registrazione.", + "Error uploading file: {{error}}": "Errore durante il caricamento del file: {{error}}", + "Evaluations": "Valutazioni", + "Exa API Key": "Chiave API Exa", + "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Esempio: (&(objectClass=inetOrgPerson)(uid=%s))", + "Example: ALL": "Esempio: TUTTI", + "Example: mail": "Esempio: mail", + "Example: ou=users,dc=foo,dc=example": "Esempio: ou=users,dc=foo,dc=example", + "Example: sAMAccountName or uid or userPrincipalName": "Esempio: sAMAccountName o uid o userPrincipalName", + "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "Superato il numero di posti nella tua licenza. Contatta il supporto per aumentare il numero di posti.", + "Exclude": "Escludi", + "Execute code for analysis": "Esegui codice per analisi", + "Executing **{{NAME}}**...": "Esecuzione", + "Expand": "Espandi", "Experimental": "Sperimentale", - "Explain": "", - "Explain this section to me in more detail": "", - "Explore the cosmos": "", + "Explain": "Spiega", + "Explain this section to me in more detail": "Spiega questa sezione in modo più dettagliato", + "Explore the cosmos": "Esplora il cosmo", "Export": "Esportazione", - "Export All Archived Chats": "", + "Export All Archived Chats": "Esporta tutte le chat archiviate", "Export All Chats (All Users)": "Esporta tutte le chat (tutti gli utenti)", - "Export chat (.json)": "", + "Export chat (.json)": "Esporta chat (.json)", "Export Chats": "Esporta chat", - "Export Config to JSON File": "", - "Export Functions": "", + "Export Config to JSON File": "Esporta configurazione in un file JSON", + "Export Functions": "Esporta funzioni", "Export Models": "Esporta modelli", - "Export Presets": "", + "Export Presets": "Esporta preset", "Export Prompts": "Esporta prompt", - "Export to CSV": "", - "Export Tools": "", - "External": "", - "External Models": "", - "External Web Loader API Key": "", - "External Web Loader URL": "", - "External Web Search API Key": "", - "External Web Search URL": "", - "Failed to add file.": "", - "Failed to connect to {{URL}} OpenAPI tool server": "", + "Export to CSV": "Esporta in un CSV", + "Export Tools": "Esporta strumenti", + "External": "Esterno", + "External Models": "Modelli esterni", + "External Web Loader API Key": "Chiave API del caricatore web esterno", + "External Web Loader URL": "URL del caricatore web esterno", + "External Web Search API Key": "Chiave API di ricerca web esterna", + "External Web Search URL": "URL di ricerca web esterna", + "Failed to add file.": "Impossibile aggiungere il file.", + "Failed to connect to {{URL}} OpenAPI tool server": "Impossibile connettersi al server dello strumento OpenAPI {{URL}}", "Failed to create API Key.": "Impossibile creare la chiave API.", - "Failed to delete note": "", - "Failed to fetch models": "", - "Failed to load file content.": "", + "Failed to delete note": "Impossibile eliminare la nota", + "Failed to fetch models": "Impossibile recuperare i modelli", + "Failed to load file content.": "Impossibile caricare il contenuto del file.", "Failed to read clipboard contents": "Impossibile leggere il contenuto degli appunti", - "Failed to save connections": "", - "Failed to save models configuration": "", - "Failed to update settings": "", - "Failed to upload file.": "", - "Features": "", - "Features Permissions": "", + "Failed to save connections": "Impossibile salvare le connessioni", + "Failed to save models configuration": "Impossibile salvare la configurazione dei modelli", + "Failed to update settings": "Impossibile aggiornare le impostazioni", + "Failed to upload file.": "Impossibile caricare il file.", + "Features": "Caratteristiche", + "Features Permissions": "Permessi delle funzionalità", "February": "Febbraio", - "Feedback History": "", - "Feedbacks": "", + "Feedback History": "Storico feedback", + "Feedbacks": "Feedback", "Feel free to add specific details": "Sentiti libero/a di aggiungere dettagli specifici", - "File": "", - "File added successfully.": "", - "File content updated successfully.": "", + "File": "File", + "File added successfully.": "File aggiunto con successo.", + "File content updated successfully.": "Contenuto del file aggiornato con successo.", "File Mode": "Modalità file", "File not found.": "File non trovato.", - "File removed successfully.": "", - "File size should not exceed {{maxSize}} MB.": "", - "File uploaded successfully": "", - "Files": "", - "Filter is now globally disabled": "", - "Filter is now globally enabled": "", - "Filters": "", + "File removed successfully.": "File rimosso con successo.", + "File size should not exceed {{maxSize}} MB.": "La dimensione del file non deve superare {{maxSize}} MB.", + "File uploaded successfully": "Caricamento file riuscito", + "Files": "File", + "Filter is now globally disabled": "Il filtro è ora disabilitato globalmente", + "Filter is now globally enabled": "Il filtro è ora abilitato globalmente", + "Filters": "Filtri", "Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Rilevato spoofing delle impronte digitali: impossibile utilizzare le iniziali come avatar. Ripristino all'immagine del profilo predefinita.", - "Firecrawl API Base URL": "", + "Firecrawl API Base URL": "URL base dell'API Firecrawl", "Firecrawl API Key": "", "Fluidly stream large external response chunks": "Trasmetti in modo fluido blocchi di risposta esterni di grandi dimensioni", "Focus chat input": "Metti a fuoco l'input della chat", - "Folder deleted successfully": "", - "Folder name cannot be empty.": "", - "Folder name updated successfully": "", + "Folder deleted successfully": "Cartella rimossa con successo", + "Folder name cannot be empty.": "Il nome della cartella non può essere vuoto.", + "Folder name updated successfully": "Nome cartella aggiornato con successo", "Followed instructions perfectly": "Ha seguito le istruzioni alla perfezione", - "Forge new paths": "", - "Form": "", - "Format your variables using brackets like this:": "", - "Forwards system user session credentials to authenticate": "", + "Forge new paths": "Traccia nuovi percorsi", + "Form": "Modulo", + "Format your variables using brackets like this:": "Formatta le tue variabili usando le parentesi quadre in questo modo:", + "Forwards system user session credentials to authenticate": "Inoltra le credenziali della sessione utente di sistema per autenticare", "Frequency Penalty": "Penalità di frequenza", - "Full Context Mode": "", - "Function": "", - "Function Calling": "", - "Function created successfully": "", - "Function deleted successfully": "", - "Function Description": "", - "Function ID": "", - "Function is now globally disabled": "", - "Function is now globally enabled": "", - "Function Name": "", - "Function updated successfully": "", - "Functions": "", - "Functions allow arbitrary code execution.": "", - "Functions imported successfully": "", + "Full Context Mode": "Modalità contesto completo", + "Function": "Funzione", + "Function Calling": "Chiamata funzione", + "Function created successfully": "Funzione creata con successo", + "Function deleted successfully": "Funzione eliminata con successo", + "Function Description": "Descrizione funzione", + "Function ID": "ID funzione", + "Function is now globally disabled": "Il filtro è ora disabilitato globalmente", + "Function is now globally enabled": "Il filtro è ora abilitato globalmente", + "Function Name": "Nome funzione", + "Function updated successfully": "Funzione aggiornata con successo", + "Functions": "Funzioni", + "Functions allow arbitrary code execution.": "Le funzioni consentono l'esecuzione di codice arbitrario.", + "Functions imported successfully": "Funzioni importate con successo", "Gemini": "", - "Gemini API Config": "", - "Gemini API Key is required.": "", + "Gemini API Config": "Configurazione API Gemini", + "Gemini API Key is required.": "La chiave API Gemini è richiesta.", "General": "Generale", - "Generate": "", - "Generate an image": "", - "Generate Image": "", - "Generate prompt pair": "", + "Generate": "Genera", + "Generate an image": "Genera un'immagine", + "Generate Image": "Genera immagine", + "Generate prompt pair": "Genera coppia di prompt", "Generating search query": "Generazione di query di ricerca", - "Generating...": "", - "Get started": "", - "Get started with {{WEBUI_NAME}}": "", - "Global": "", + "Generating...": "Generazione in corso...", + "Get started": "Inizia", + "Get started with {{WEBUI_NAME}}": "Inizia con {{WEBUI_NAME}}", + "Global": "Globale", "Good Response": "Buona risposta", - "Google Drive": "", + "Google Drive": "Google Drive", "Google PSE API Key": "Chiave API PSE di Google", "Google PSE Engine Id": "ID motore PSE di Google", - "Group created successfully": "", - "Group deleted successfully": "", - "Group Description": "", - "Group Name": "", - "Group updated successfully": "", - "Groups": "", - "Haptic Feedback": "", + "Group created successfully": "Gruppo creato con successo", + "Group deleted successfully": "Gruppo eliminato con successo", + "Group Description": "Descrizione gruppo", + "Group Name": "Nome gruppo", + "Group updated successfully": "Gruppo aggiornato con successo", + "Groups": "Gruppi", + "Haptic Feedback": "Feedback aptico", "has no conversations.": "non ha conversazioni.", "Hello, {{name}}": "Ciao, {{name}}", "Help": "Aiuto", - "Help us create the best community leaderboard by sharing your feedback history!": "", - "Hex Color": "", - "Hex Color - Leave empty for default color": "", + "Help us create the best community leaderboard by sharing your feedback history!": "Aiutaci a creare la migliore classifica della community condividendo la tua cronologia feedback!", + "Hex Color": "Colore esadecimale", + "Hex Color - Leave empty for default color": "Colore esadecimale - Lascia vuoto per il colore predefinito", "Hide": "Nascondi", - "Hide Model": "", - "Home": "", - "Host": "", + "Hide Model": "Nascondi modello", + "Home": "Home", + "Host": "Host", "How can I help you today?": "Come posso aiutarti oggi?", - "How would you rate this response?": "", + "How would you rate this response?": "Come valuteresti questa risposta?", "Hybrid Search": "Ricerca ibrida", - "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.": "", - "ID": "", - "iframe Sandbox Allow Forms": "", - "iframe Sandbox Allow Same Origin": "", - "Ignite curiosity": "", - "Image": "", - "Image Compression": "", - "Image Generation": "", + "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.": "Riconosco di aver letto e compreso le implicazioni della mia azione. Sono consapevole dei rischi associati all'esecuzione di codice arbitrario e ho verificato l'affidabilità della fonte.", + "ID": "ID", + "iframe Sandbox Allow Forms": "iframe Sandbox Consenti moduli", + "iframe Sandbox Allow Same Origin": "iframe Sandbox Consenti stessa origine", + "Ignite curiosity": "Accendi la curiosità", + "Image": "Immagine", + "Image Compression": "Compressione immagine", + "Image Generation": "Generazione di immagini", "Image Generation (Experimental)": "Generazione di immagini (sperimentale)", "Image Generation Engine": "Motore di generazione immagini", - "Image Max Compression Size": "", - "Image Prompt Generation": "", - "Image Prompt Generation Prompt": "", + "Image Max Compression Size": "Dimensione massima compressione immagine", + "Image Prompt Generation": "Generazione di prompt immagine", + "Image Prompt Generation Prompt": "Generazione di prompt immagine", "Image Settings": "Impostazioni immagine", "Images": "Immagini", "Import Chats": "Importa chat", - "Import Config from JSON File": "", - "Import Functions": "", + "Import Config from JSON File": "Importa configurazione da file JSON", + "Import Functions": "Importa funzioni", "Import Models": "Importazione di modelli", - "Import Notes": "", - "Import Presets": "", + "Import Notes": "Importa note", + "Import Presets": "Importa preset", "Import Prompts": "Importa prompt", - "Import Tools": "", - "Include": "", - "Include `--api-auth` flag when running stable-diffusion-webui": "", + "Import Tools": "Importa strumenti", + "Include": "Includi", + "Include `--api-auth` flag when running stable-diffusion-webui": "Includi il flag `--api-auth` quando esegui stable-diffusion-webui", "Include `--api` flag when running stable-diffusion-webui": "Includi il flag `--api` quando esegui stable-diffusion-webui", - "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "", + "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "Influenza la velocità con cui l'algoritmo risponde al feedback del testo generato. Un tasso di apprendimento più basso comporterà aggiustamenti più lenti, mentre un tasso di apprendimento più alto renderà l'algoritmo più reattivo.", "Info": "Informazioni", - "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "", + "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Inietta l'intero contenuto come contesto per un'elaborazione completa, questo è consigliato per query complesse.", "Input commands": "Comandi di input", "Install from Github URL": "Eseguire l'installazione dall'URL di Github", - "Instant Auto-Send After Voice Transcription": "", - "Integration": "", + "Instant Auto-Send After Voice Transcription": "Invio automatico istantaneo dopo la trascrizione vocale", + "Integration": "Integrazione", "Interface": "Interfaccia", - "Invalid file content": "", - "Invalid file format.": "", - "Invalid JSON schema": "", + "Invalid file content": "Contenuto del file non valido", + "Invalid file format.": "Formato file non valido.", + "Invalid JSON schema": "Schema JSON non valido", "Invalid Tag": "Tag non valido", - "is typing...": "", + "is typing...": "sta digitando...", "January": "Gennaio", - "Jina API Key": "", + "Jina API Key": "Chiave API Jina", "join our Discord for help.": "unisciti al nostro Discord per ricevere aiuto.", "JSON": "JSON", "JSON Preview": "Anteprima JSON", "July": "Luglio", "June": "Giugno", - "Jupyter Auth": "", - "Jupyter URL": "", + "Jupyter Auth": "Autenticazione Jupyter", + "Jupyter URL": "URL Jupyter", "JWT Expiration": "Scadenza JWT", "JWT Token": "Token JWT", - "Kagi Search API Key": "", + "Kagi Search API Key": "Chiave API di ricerca Kagi", "Keep Alive": "Mantieni attivo", - "Key": "", + "Key": "Chiave", "Keyboard shortcuts": "Scorciatoie da tastiera", - "Knowledge": "", - "Knowledge Access": "", - "Knowledge created successfully.": "", - "Knowledge deleted successfully.": "", - "Knowledge Public Sharing": "", - "Knowledge reset successfully.": "", - "Knowledge updated successfully": "", - "Kokoro.js (Browser)": "", - "Kokoro.js Dtype": "", - "Label": "", - "Landing Page Mode": "", + "Knowledge": "Conoscenza", + "Knowledge Access": "Accesso alla conoscenza", + "Knowledge created successfully.": "Conoscenza creata con successo.", + "Knowledge deleted successfully.": "Conoscenza eliminata con successo.", + "Knowledge Public Sharing": "Conoscenza condivisione pubblica", + "Knowledge reset successfully.": "Conoscenza ripristinata con successo.", + "Knowledge updated successfully": "Conoscenza aggiornata con successo", + "Kokoro.js (Browser)": "Kokoro.js (Browser)", + "Kokoro.js Dtype": "Kokoro.js Dtype", + "Label": "Etichetta", + "Landing Page Mode": "Modalità pagina iniziale", "Language": "Lingua", - "Language Locales": "", + "Language Locales": "Locales della lingua", "Last Active": "Ultima attività", - "Last Modified": "", - "Last reply": "", + "Last Modified": "Ultima modifica", + "Last reply": "Ultima risposta", "LDAP": "", - "LDAP server updated": "", - "Leaderboard": "", - "Learn more about OpenAPI tool servers.": "", - "Leave empty for unlimited": "", + "LDAP server updated": "Server LDAP aggiornato", + "Leaderboard": "Classifica", + "Learn more about OpenAPI tool servers.": "Scopri di più sui server degli strumenti OpenAPI.", + "Leave empty for unlimited": "Lascia vuoto per illimitato", "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "", "Leave empty to include all models from \"{{url}}/models\" endpoint": "", - "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.": "", - "License": "", + "Leave empty to include all models or select specific models": "Lascia vuoto per includere tutti i modelli o seleziona modelli specifici", + "Leave empty to use the default prompt, or enter a custom prompt": "Lascia vuoto per utilizzare il prompt predefinito o inserisci un prompt personalizzato", + "Leave model field empty to use the default model.": "Lascia vuoto il campo modello per utilizzare il modello predefinito.", + "License": "Licenza", "Light": "Chiaro", - "Listening...": "", - "Llama.cpp": "", + "Listening...": "In ascolto...", + "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "Gli LLM possono commettere errori. Verifica le informazioni importanti.", - "Loader": "", - "Loading Kokoro.js...": "", - "Local": "", - "Local Models": "", - "Location access not allowed": "", - "Logit Bias": "", - "Lost": "", + "Loader": "Caricatore", + "Loading Kokoro.js...": "Caricamento Kokoro.js...", + "Local": "Locale", + "Local Models": "Modelli locali", + "Location access not allowed": "Accesso alla posizione non consentito", + "Logit Bias": "Bias Logit", + "Lost": "Perso", "LTR": "LTR", "Made by Open WebUI Community": "Realizzato dalla comunità OpenWebUI", "Make sure to enclose them with": "Assicurati di racchiuderli con", - "Make sure to export a workflow.json file as API format from ComfyUI.": "", - "Manage": "", - "Manage Direct Connections": "", - "Manage Models": "", - "Manage Ollama": "", - "Manage Ollama API Connections": "", - "Manage OpenAI API Connections": "", - "Manage Pipelines": "Gestire le pipeline", - "Manage Tool Servers": "", + "Make sure to export a workflow.json file as API format from ComfyUI.": "Assicurati di esportare un file workflow.json come formato API da ComfyUI.", + "Manage": "Gestisci", + "Manage Direct Connections": "Gestisci le connessioni dirette", + "Manage Models": "Gestisci i modelli", + "Manage Ollama": "Gestisci Ollama", + "Manage Ollama API Connections": "Gestisci le connessioni API Ollama", + "Manage OpenAI API Connections": "Gestisci le connessioni API OpenAI", + "Manage Pipelines": "Gestisci le pipelines", + "Manage Tool Servers": "Gestisci i server degli strumenti", "March": "Marzo", "Max Speakers": "", "Max Tokens (num_predict)": "Numero massimo di gettoni (num_predict)", - "Max Upload Count": "", - "Max Upload Size": "", + "Max Upload Count": "Conteggio massimo di caricamenti", + "Max Upload Size": "Dimensione massima di caricamento", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "È possibile scaricare un massimo di 3 modelli contemporaneamente. Riprova più tardi.", "May": "Maggio", "Memories accessible by LLMs will be shown here.": "I memori accessibili ai LLM saranno mostrati qui.", "Memory": "Memoria", - "Memory added successfully": "", - "Memory cleared successfully": "", - "Memory deleted successfully": "", - "Memory updated successfully": "", - "Merge Responses": "", + "Memory added successfully": "Memoria aggiunta con successo", + "Memory cleared successfully": "Memoria cancellata con successo", + "Memory deleted successfully": "Memoria eliminata con successo", + "Memory updated successfully": "Memoria aggiornata con successo", + "Merge Responses": "Unisci Risposte", "Merged Response": "Risposta Unita", - "Message rating should be enabled to use this feature": "", + "Message rating should be enabled to use this feature": "La valutazione dei messaggi deve essere abilitata per utilizzare questa funzionalità", "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "I messaggi inviati dopo la creazione del link non verranno condivisi. Gli utenti con l'URL saranno in grado di visualizzare la chat condivisa.", - "Microsoft OneDrive": "", - "Microsoft OneDrive (personal)": "", - "Microsoft OneDrive (work/school)": "", - "Min P": "", + "Microsoft OneDrive": "Microsoft OneDrive", + "Microsoft OneDrive (personal)": "Microsoft OneDrive (personale)", + "Microsoft OneDrive (work/school)": "Microsoft OneDrive (lavoro/scuola)", + "Min P": "Min P", "Mirostat": "Mirostat", "Mirostat Eta": "Mirostat Eta", "Mirostat Tau": "Mirostat Tau", "Mistral OCR": "", - "Mistral OCR API Key required.": "", - "Model": "", + "Mistral OCR API Key required.": "La chiave API OCR Mistral è richiesta.", + "Model": "Modello", "Model '{{modelName}}' has been successfully downloaded.": "Il modello '{{modelName}}' è stato scaricato con successo.", "Model '{{modelTag}}' is already in queue for downloading.": "Il modello '{{modelTag}}' è già in coda per il download.", "Model {{modelId}} not found": "Modello {{modelId}} non trovato", "Model {{modelName}} is not vision capable": "Il modello {{modelName}} non è in grado di vedere", "Model {{name}} is now {{status}}": "Il modello {{name}} è ora {{status}}", - "Model {{name}} is now hidden": "", - "Model {{name}} is now visible": "", - "Model accepts image inputs": "", - "Model created successfully!": "", + "Model {{name}} is now hidden": "Il modello {{name}} è ora nascosto", + "Model {{name}} is now visible": "Il modello {{name}} è ora visibile", + "Model accepts image inputs": "Il modello accetta input immagine", + "Model created successfully!": "Modello creato con successo!", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Percorso del filesystem del modello rilevato. Il nome breve del modello è richiesto per l'aggiornamento, impossibile continuare.", - "Model Filtering": "", + "Model Filtering": "Filtraggio modelli", "Model ID": "ID modello", - "Model IDs": "", - "Model Name": "", + "Model IDs": "ID modello", + "Model Name": "Nome modello", "Model not selected": "Modello non selezionato", "Model Params": "Parametri del modello", - "Model Permissions": "", - "Model updated successfully": "", + "Model Permissions": "Permessi del modello", + "Model updated successfully": "Modello aggiornato con successo", "Modelfile Content": "Contenuto del file modello", "Models": "Modelli", - "Models Access": "", - "Models configuration saved successfully": "", - "Models Public Sharing": "", - "Mojeek Search API Key": "", - "more": "", + "Models Access": "Accesso ai modelli", + "Models configuration saved successfully": "Configurazione modelli salvata con successo", + "Models Public Sharing": "Conoscenza condivisione pubblica", + "Mojeek Search API Key": "Chiave API di Mojeek Search", + "more": "altro", "More": "Altro", - "My Notes": "", + "My Notes": "Le mie note", "Name": "Nome", - "Name your knowledge base": "", - "Native": "", + "Name your knowledge base": "Dai un nome alla tua base di conoscenza", + "Native": "Nativo", "New Chat": "Nuova chat", - "New Folder": "", - "New Note": "", + "New Folder": "Nuova cartella", + "New Note": "Nuova nota", "New Password": "Nuova password", - "new-channel": "", - "No content": "", - "No content found": "", - "No content found in file.": "", - "No content to speak": "", - "No distance available": "", - "No feedbacks found": "", - "No file selected": "", - "No groups with access, add a group to grant access": "", - "No HTML, CSS, or JavaScript content found.": "", - "No inference engine with management support found": "", - "No knowledge found": "", - "No memories to clear": "", - "No model IDs": "", - "No models found": "", - "No models selected": "", - "No Notes": "", + "new-channel": "nuovo-canale", + "No content": "Nessun contenuto", + "No content found": "Nessun contenuto trovato", + "No content found in file.": "Nessun contenuto trovato nel file.", + "No content to speak": "Nessun contenuto da pronunciare", + "No distance available": "Nessuna distanza disponibile", + "No feedbacks found": "Nessun feedback trovato", + "No file selected": "Nessun file selezionato", + "No groups with access, add a group to grant access": "Nessun gruppo con accesso, aggiungi un gruppo per concedere l'accesso", + "No HTML, CSS, or JavaScript content found.": "Nessun contenuto HTML, CSS o JavaScript trovato.", + "No inference engine with management support found": "Nessun motore di inferenza con supporto per la gestione trovato", + "No knowledge found": "Nessuna conoscenza trovata", + "No memories to clear": "Nessun ricordo da cancellare", + "No model IDs": "Nessun ID modello", + "No models found": "Nessun modello trovato", + "No models selected": "Nessun modello selezionato", + "No Notes": "Nessuna nota", "No results found": "Nessun risultato trovato", "No search query generated": "Nessuna query di ricerca generata", "No source available": "Nessuna fonte disponibile", - "No users were found.": "", - "No valves to update": "", + "No users were found.": "Nessun utente trovato.", + "No valves to update": "Nessuna valvola da aggiornare", "None": "Nessuno", "Not factually correct": "Non corretto dal punto di vista fattuale", - "Not helpful": "", - "Note deleted successfully": "", + "Not helpful": "Non utile", + "Note deleted successfully": "Nota eliminata con successo", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: se imposti un punteggio minimo, la ricerca restituirà solo i documenti con un punteggio maggiore o uguale al punteggio minimo.", - "Notes": "", - "Notification Sound": "", - "Notification Webhook": "", + "Notes": "Note", + "Notification Sound": "Suono di notifica", + "Notification Webhook": "Webhook di notifica", "Notifications": "Notifiche desktop", "November": "Novembre", "num_gpu (Ollama)": "", @@ -846,473 +846,475 @@ "Ollama Version": "Versione Ollama", "On": "Attivato", "OneDrive": "", - "Only alphanumeric characters and hyphens are allowed": "", + "Only alphanumeric characters and hyphens are allowed": "Nella stringa di comando sono consentiti solo caratteri alfanumerici e trattini", "Only alphanumeric characters and hyphens are allowed in the command string.": "Nella stringa di comando sono consentiti solo caratteri alfanumerici e trattini.", - "Only collections can be edited, create a new knowledge base to edit/add documents.": "", - "Only markdown files are allowed": "", - "Only select users and groups with permission can access": "", + "Only collections can be edited, create a new knowledge base to edit/add documents.": "Solo le collezioni possono essere modificate, crea una nuova base di conoscenza per modificare/aggiungere documenti.", + "Only markdown files are allowed": "Sono consentiti solo file markdown", + "Only select users and groups with permission can access": "Solo gli utenti e i gruppi selezionati con autorizzazione possono accedere", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Ops! Sembra che l'URL non sia valido. Si prega di ricontrollare e riprovare.", - "Oops! There are files still uploading. Please wait for the upload to complete.": "", - "Oops! There was an error in the previous response.": "", + "Oops! There are files still uploading. Please wait for the upload to complete.": "Ops! Ci sono file ancora in fase di caricamento. Si prega di attendere il completamento del caricamento.", + "Oops! There was an error in the previous response.": "Ops! Si è verificato un errore nella risposta precedente.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ops! Stai utilizzando un metodo non supportato (solo frontend). Si prega di servire la WebUI dal backend.", - "Open file": "", - "Open in full screen": "", + "Open file": "Apri file", + "Open in full screen": "Apri a schermo intero", "Open new chat": "Apri nuova chat", - "Open WebUI can use tools provided by any OpenAPI server.": "", - "Open WebUI uses faster-whisper internally.": "", - "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "", - "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", + "Open WebUI can use tools provided by any OpenAPI server.": "La WebUI può utilizzare strumenti forniti da qualsiasi server OpenAPI.", + "Open WebUI uses faster-whisper internally.": "Open WebUI utilizza faster-whisper internamente.", + "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI utilizza le incorporazioni vocali di SpeechT5 e CMU Arctic.", + "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "La versione di Open WebUI (v{{OPEN_WEBUI_VERSION}}) è inferiore alla versione richiesta (v{{REQUIRED_VERSION}})", "OpenAI": "OpenAI", "OpenAI API": "API OpenAI", "OpenAI API Config": "Configurazione API OpenAI", "OpenAI API Key is required.": "La chiave API OpenAI è obbligatoria.", - "OpenAI API settings updated": "", + "OpenAI API settings updated": "Impostazioni API OpenAI aggiornate", "OpenAI URL/Key required.": "URL/Chiave OpenAI obbligatori.", - "openapi.json Path": "", + "openapi.json Path": "Percorso openapi.json", "or": "o", - "Organize your users": "", + "Organize your users": "Organizza i tuoi utenti", "Other": "Altro", "OUTPUT": "", - "Output format": "", - "Overview": "", - "page": "", + "Output format": "Formato di output", + "Overview": "Panoramica", + "page": "pagina", "Password": "Password", - "Paste Large Text as File": "", + "Paste Large Text as File": "Incolla testo grande come file", "PDF document (.pdf)": "Documento PDF (.pdf)", "PDF Extract Images (OCR)": "Estrazione immagini PDF (OCR)", "pending": "in sospeso", - "Permission denied when accessing media devices": "", - "Permission denied when accessing microphone": "", + "Permission denied when accessing media devices": "Autorizzazione negata durante l'accesso ai dispositivi multimediali", + "Permission denied when accessing microphone": "Autorizzazione negata durante l'accesso al microfono", "Permission denied when accessing microphone: {{error}}": "Autorizzazione negata durante l'accesso al microfono: {{error}}", - "Permissions": "", - "Perplexity API Key": "", + "Permissions": "Permessi", + "Perplexity API Key": "Chiave API Perplexity", "Personalization": "Personalizzazione", - "Pin": "", - "Pinned": "", - "Pioneer insights": "", - "Pipeline deleted successfully": "", - "Pipeline downloaded successfully": "", - "Pipelines": "Condutture", - "Pipelines Not Detected": "", - "Pipelines Valves": "Valvole per tubazioni", - "Plain text (.md)": "", + "Pin": "Fissa", + "Pinned": "Fissato", + "Pioneer insights": "Pioniere di intuizioni", + "Pipeline deleted successfully": "Pipeline rimossa con successo", + "Pipeline downloaded successfully": "Pipeline scaricata con successo", + "Pipelines": "Pipelines", + "Pipelines Not Detected": "Pipelines non rilevate", + "Pipelines Valves": "Valvole per pipelines", + "Plain text (.md)": "Testo normale (.md)", "Plain text (.txt)": "Testo normale (.txt)", "Playground": "Terreno di gioco", "Playwright Timeout (ms)": "", "Playwright WebSocket URL": "", - "Please carefully review the following warnings:": "", - "Please do not close the settings page while loading the model.": "", - "Please enter a prompt": "", - "Please enter a valid path": "", - "Please enter a valid URL": "", - "Please fill in all fields.": "", - "Please select a model first.": "", - "Please select a model.": "", - "Please select a reason": "", - "Port": "", + "Please carefully review the following warnings:": "Si prega di esaminare attentamente i seguenti avvisi:", + "Please do not close the settings page while loading the model.": "Si prega di non chiudere la pagina delle impostazioni durante il caricamento del modello.", + "Please enter a prompt": "Si prega di inserire un prompt", + "Please enter a valid path": "Si prega di inserire un percorso valido", + "Please enter a valid URL": "Si prega di inserire un URL valido", + "Please fill in all fields.": "Si prega di compilare tutti i campi.", + "Please select a model first.": "Si prega di selezionare prima un modello.", + "Please select a model.": "Si prega di selezionare un modello.", + "Please select a reason": "Si prega di selezionare un motivo", + "Port": "Porta", "Positive attitude": "Attitudine positiva", - "Prefix ID": "", - "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "", - "Presence Penalty": "", + "Prefix ID": "ID prefisso", + "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "L'ID prefisso viene utilizzato per evitare conflitti con altre connessioni aggiungendo un prefisso agli ID dei modelli - lasciare vuoto per disabilitare", + "Presence Penalty": "Penalità di presenza", "Previous 30 days": "Ultimi 30 giorni", "Previous 7 days": "Ultimi 7 giorni", - "Private": "", + "Private": "Privato", "Profile Image": "Immagine del profilo", "Prompt": "", "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (ad esempio Dimmi un fatto divertente sull'Impero Romano)", - "Prompt Autocompletion": "", + "Prompt Autocompletion": "Autocompletamento del prompt", "Prompt Content": "Contenuto del prompt", - "Prompt created successfully": "", + "Prompt created successfully": "Prompt creato con successo", "Prompt suggestions": "Suggerimenti prompt", - "Prompt updated successfully": "", + "Prompt updated successfully": "Prompt aggiornato con successo", "Prompts": "Prompt", - "Prompts Access": "", - "Prompts Public Sharing": "", - "Public": "", + "Prompts Access": "Accesso ai prompt", + "Prompts Public Sharing": "Condivisione pubblica dei prompt", + "Public": "Pubblico", "Pull \"{{searchValue}}\" from Ollama.com": "Estrai \"{{searchValue}}\" da Ollama.com", "Pull a model from Ollama.com": "Estrai un modello da Ollama.com", - "Query Generation Prompt": "", + "Query Generation Prompt": "Query del prompt di generazione", "RAG Template": "Modello RAG", - "Rating": "", - "Re-rank models by topic similarity": "", - "Read": "", + "Rating": "Valutazione", + "Re-rank models by topic similarity": "Riordina i modelli in base alla somiglianza degli argomenti", + "Read": "Leggi", "Read Aloud": "Leggi ad alta voce", - "Reasoning Effort": "", - "Record": "", + "Reasoning Effort": "Sforzo di ragionamento", + "Record": "Registra", "Record voice": "Registra voce", "Redirecting you to Open WebUI Community": "Reindirizzamento alla comunità OpenWebUI", - "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.": "", - "Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "", - "References from": "", + "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.": "Riduce la probabilità di generare sciocchezze. Un valore più alto (ad esempio 100) darà risposte più varie, mentre un valore più basso (ad esempio 10) sarà più conservativo.", + "Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Riferisciti a te stesso come \"Utente\" (ad esempio, \"L'utente sta imparando lo spagnolo\")", + "References from": "Riferimenti da", "Refused when it shouldn't have": "Rifiutato quando non avrebbe dovuto", "Regenerate": "Rigenera", - "Reindex": "", - "Reindex Knowledge Base Vectors": "", + "Reindex": "Reindicizza", + "Reindex Knowledge Base Vectors": "Reindicizza i vettori della base di conoscenza", "Release Notes": "Note di rilascio", - "Relevance": "", - "Relevance Threshold": "", + "Relevance": "Rilevanza", + "Relevance Threshold": "Soglia di rilevanza", "Remove": "Rimuovi", "Remove Model": "Rimuovi modello", "Rename": "Rinomina", - "Reorder Models": "", + "Reorder Models": "Riordina modelli", "Repeat Last N": "Ripeti ultimi N", - "Repeat Penalty (Ollama)": "", - "Reply in Thread": "", + "Repeat Penalty (Ollama)": "Penalità per ripetizione (Ollama)", + "Reply in Thread": "Rispondi nel thread", "Request Mode": "Modalità richiesta", + "Reranking Engine": "", "Reranking Model": "Modello di riclassificazione", - "Reranking model disabled": "Modello di riclassificazione disabilitato", - "Reranking model set to \"{{reranking_model}}\"": "Modello di riclassificazione impostato su \"{{reranking_model}}\"", - "Reset": "", - "Reset All Models": "", - "Reset Upload Directory": "", - "Reset Vector Storage/Knowledge": "", - "Reset view": "", - "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "", - "Response splitting": "", - "Result": "", - "Retrieval": "", - "Retrieval Query Generation": "", - "Rich Text Input for Chat": "", + "Reset": "Ripristina", + "Reset All Models": "Ripristina tutti i modelli", + "Reset Upload Directory": "Ripristina directory di caricamento", + "Reset Vector Storage/Knowledge": "Ripristina archiviazione vettoriale/conoscenza", + "Reset view": "Ripristina visualizzazione", + "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Le notifiche di risposta non possono essere attivate poiché i permessi del sito web sono stati negati. Si prega di visitare le impostazioni del browser per concedere l'accesso necessario.", + "Response splitting": "Divisione della risposta", + "Result": "Risultato", + "Retrieval": "Recupero ricordo", + "Retrieval Query Generation": "Generazione di query di recupero ricordo", + "Rich Text Input for Chat": "Input di testo ricco per la chat", "RK": "", "Role": "Ruolo", "Rosé Pine": "Rosé Pine", "Rosé Pine Dawn": "Rosé Pine Dawn", "RTL": "RTL", - "Run": "", - "Running": "", + "Run": "Esegui", + "Running": "In esecuzione", "Save": "Salva", "Save & Create": "Salva e crea", "Save & Update": "Salva e aggiorna", - "Save As Copy": "", - "Save Tag": "", - "Saved": "", + "Save As Copy": "Salva come copia", + "Save Tag": "Salva tag", + "Saved": "Salvato", "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": "Il salvataggio dei registri della chat direttamente nell'archivio del browser non è più supportato. Si prega di dedicare un momento per scaricare ed eliminare i registri della chat facendo clic sul pulsante in basso. Non preoccuparti, puoi facilmente reimportare i registri della chat nel backend tramite", - "Scroll On Branch Change": "", + "Scroll On Branch Change": "Scorri nel cambiamento di branch", "Search": "Cerca", "Search a model": "Cerca un modello", - "Search Base": "", + "Search Base": "Cerca base", "Search Chats": "Cerca nelle chat", - "Search Collection": "", - "Search Filters": "", - "search for tags": "", - "Search Functions": "", - "Search Knowledge": "", + "Search Collection": "Cerca collezione", + "Search Filters": "Cerca filtri", + "search for tags": "cerca tag", + "Search Functions": "Cerca funzioni", + "Search Knowledge": "Cerca conoscenza", "Search Models": "Cerca modelli", - "Search options": "", + "Search options": "Cerca opzioni", "Search Prompts": "Cerca prompt", "Search Result Count": "Conteggio dei risultati della ricerca", - "Search the internet": "", - "Search Tools": "", - "SearchApi API Key": "", + "Search the internet": "Cerca su Internet", + "Search Tools": "Cerca strumenti", + "SearchApi API Key": "Chiave API SearchApi", "SearchApi Engine": "", - "Searched {{count}} sites": "", - "Searching \"{{searchQuery}}\"": "", - "Searching Knowledge for \"{{searchQuery}}\"": "", - "Searching the web...": "", + "Searched {{count}} sites": "Cercati {{count}} siti", + "Searching \"{{searchQuery}}\"": "Cercando \"{{searchQuery}}\"", + "Searching Knowledge for \"{{searchQuery}}\"": "Cercando conoscenza per \"{{searchQuery}}\"", + "Searching the web...": "Cercando nel web...", "Searxng Query URL": "Searxng Query URL", "See readme.md for instructions": "Vedi readme.md per le istruzioni", "See what's new": "Guarda le novità", "Seed": "Seme", "Select a base model": "Selezionare un modello di base", - "Select a engine": "", - "Select a function": "", - "Select a group": "", + "Select a engine": "Seleziona un motore", + "Select a function": "Seleziona una funzione", + "Select a group": "Seleziona un gruppo", "Select a model": "Seleziona un modello", - "Select a pipeline": "Selezionare una tubazione", + "Select a pipeline": "Selezionare una pipeline", "Select a pipeline url": "Selezionare l'URL di una pipeline", - "Select a tool": "", - "Select an auth method": "", - "Select an Ollama instance": "", - "Select Engine": "", - "Select Knowledge": "", - "Select only one model to call": "", + "Select a tool": "Seleziona uno strumento", + "Select an auth method": "Seleziona un metodo di autenticazione", + "Select an Ollama instance": "Seleziona un'istanza Ollama", + "Select Engine": "Seleziona motore", + "Select Knowledge": "Seleziona conoscenza", + "Select only one model to call": "Seleziona solo un modello da chiamare", "Selected model(s) do not support image inputs": "I modelli selezionati non supportano l'input di immagini", - "Semantic distance to query": "", + "Semantic distance to query": "Distanza semantica alla query", "Send": "Invia", "Send a Message": "Invia un messaggio", "Send message": "Invia messaggio", - "Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "", + "Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "Invia `stream_options: { include_usage: true }` nella richiesta.\nI provider supportati restituiranno informazioni sull'utilizzo dei token nella risposta quando impostato.", "September": "Settembre", - "SerpApi API Key": "", + "SerpApi API Key": "Chiave API SerpApi", "SerpApi Engine": "", "Serper API Key": "Chiave API Serper", "Serply API Key": "", "Serpstack API Key": "Chiave API Serpstack", "Server connection verified": "Connessione al server verificata", "Set as default": "Imposta come predefinito", - "Set CFG Scale": "", + "Set CFG Scale": "Imposta scala CFG", "Set Default Model": "Imposta modello predefinito", - "Set embedding model": "", + "Set embedding model": "Imposta modello di embedding", "Set embedding model (e.g. {{model}})": "Imposta modello di embedding (ad esempio {{model}})", "Set Image Size": "Imposta dimensione immagine", "Set reranking model (e.g. {{model}})": "Imposta modello di riclassificazione (ad esempio {{model}})", - "Set Sampler": "", - "Set Scheduler": "", + "Set Sampler": "Imposta campionatore", + "Set Scheduler": "Imposta pianificatore", "Set Steps": "Imposta passaggi", "Set Task Model": "Imposta modello di attività", - "Set the number of layers, which will be off-loaded to GPU. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "", - "Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "", + "Set the number of layers, which will be off-loaded to GPU. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "Set il numero di strati, che verranno scaricati su GPU. Aumentare questo valore può migliorare significativamente le prestazioni per i modelli ottimizzati per l'accelerazione GPU, ma può anche consumare più energia e risorse GPU.", + "Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "Imposta il numero di thread di lavoro utilizzati per il calcolo. Questa opzione controlla quanti thread vengono utilizzati per elaborare le richieste in arrivo in modo concorrente. Aumentare questo valore può migliorare le prestazioni sotto carichi di lavoro ad alta concorrenza, ma può anche consumare più risorse CPU.", "Set Voice": "Imposta voce", - "Set whisper model": "", - "Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "", - "Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "", - "Sets how far back for the model to look back to prevent repetition.": "", - "Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "", - "Sets the size of the context window used to generate the next token.": "", - "Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "", + "Set whisper model": "Imposta modello whisper", + "Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "Imposta un bias piatto contro i token che sono apparsi almeno una volta. Un valore più alto (ad esempio, 1,5) penalizzerà le ripetizioni in modo più forte, mentre un valore più basso (ad esempio, 0,9) sarà più indulgente. A 0, è disabilitato.", + "Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "Imposta un bias di scaling contro i token per penalizzare le ripetizioni, in base a quante volte sono apparsi. Un valore più alto (ad esempio, 1,5) penalizzerà le ripetizioni in modo più forte, mentre un valore più basso (ad esempio, 0,9) sarà più indulgente. A 0, è disabilitato.", + "Sets how far back for the model to look back to prevent repetition.": "Imposta quanto lontano il modello deve guardare indietro per prevenire la ripetizione.", + "Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "Imposta il seme del numero casuale da utilizzare per la generazione. Impostando questo su un numero specifico, il modello genererà lo stesso testo per lo stesso prompt.", + "Sets the size of the context window used to generate the next token.": "Imposta la dimensione della finestra di contesto utilizzata per generare il token successivo.", + "Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Imposta le sequenze di arresto da utilizzare. Quando questo modello viene incontrato, l'LLM smetterà di generare testo e restituirà. Più modelli di arresto possono essere impostati specificando più parametri di arresto separati in un file modello.", "Settings": "Impostazioni", "Settings saved successfully!": "Impostazioni salvate con successo!", "Share": "Condividi", "Share Chat": "Condividi chat", "Share to Open WebUI Community": "Condividi con la comunità OpenWebUI", - "Sharing Permissions": "", + "Sharing Permissions": "Condivisione dei permessi", "Show": "Mostra", - "Show \"What's New\" modal on login": "", - "Show Admin Details in Account Pending Overlay": "", - "Show Model": "", + "Show \"What's New\" modal on login": "Mostra il modulo \"Novità\" al login", + "Show Admin Details in Account Pending Overlay": "Mostra i dettagli dell'amministratore nella sovrapposizione dell'account in attesa", + "Show All": "", + "Show Less": "", + "Show Model": "Mostra modello", "Show shortcuts": "Mostra", - "Show your support!": "", + "Show your support!": "Mostra il tuo supporto!", "Showcased creativity": "Creatività messa in mostra", "Sign in": "Accedi", - "Sign in to {{WEBUI_NAME}}": "", - "Sign in to {{WEBUI_NAME}} with LDAP": "", + "Sign in to {{WEBUI_NAME}}": "Accedi a {{WEBUI_NAME}}", + "Sign in to {{WEBUI_NAME}} with LDAP": "Accedi a {{WEBUI_NAME}} con LDAP", "Sign Out": "Esci", "Sign up": "Registrati", - "Sign up to {{WEBUI_NAME}}": "", - "Signing in to {{WEBUI_NAME}}": "", + "Sign up to {{WEBUI_NAME}}": "Registrati a {{WEBUI_NAME}}", + "Signing in to {{WEBUI_NAME}}": "Accedi a {{WEBUI_NAME}}", "sk-1234": "", "Sougou Search API sID": "", "Sougou Search API SK": "", "Source": "Fonte", - "Speech Playback Speed": "", + "Speech Playback Speed": "Velocità di riproduzione vocale", "Speech recognition error: {{error}}": "Errore di riconoscimento vocale: {{error}}", "Speech-to-Text Engine": "Motore da voce a testo", - "Stop": "", + "Stop": "Arresta", "Stop Sequence": "Sequenza di arresto", - "Stream Chat Response": "", + "Stream Chat Response": "Stream risposta chat", "STT Model": "", "STT Settings": "Impostazioni STT", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Sottotitolo (ad esempio sull'Impero Romano)", "Success": "Successo", "Successfully updated.": "Aggiornato con successo.", "Suggested": "Suggerito", - "Support": "", - "Support this plugin:": "", - "Sync directory": "", + "Support": "Supporto", + "Support this plugin:": "Supporta questo plugin:", + "Sync directory": "Sincronizza directory", "System": "Sistema", - "System Instructions": "", + "System Instructions": "Istruzioni di sistema", "System Prompt": "Prompt di sistema", - "Tags": "", - "Tags Generation": "", - "Tags Generation Prompt": "", - "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "", - "Talk to model": "", - "Tap to interrupt": "", - "Tasks": "", + "Tags": "Tag", + "Tags Generation": "Generazione tag", + "Tags Generation Prompt": "Prompt di generazione dei tag", + "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Il campionamento tail free viene utilizzato per ridurre l'impatto di token meno probabili dall'output. Un valore più alto (ad esempio, 2.0) ridurrà maggiormente l'impatto, mentre un valore di 1.0 disabilita questa impostazione.", + "Talk to model": "Parla al modello", + "Tap to interrupt": "Tocca per interrompere", + "Tasks": "Attività", "Tavily API Key": "", - "Tavily Extract Depth": "", + "Tavily Extract Depth": "Profondita' di estrazione Tavily", "Tell us more:": "Raccontaci di più:", "Temperature": "Temperatura", "Template": "Modello", - "Temporary Chat": "", - "Text Splitter": "", + "Temporary Chat": "Chat temporanea", + "Text Splitter": "Divisore di testo", "Text-to-Speech Engine": "Motore da testo a voce", "Tfs Z": "Tfs Z", "Thanks for your feedback!": "Grazie per il tuo feedback!", - "The Application Account DN you bind with for search": "", - "The base to search for users": "", - "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", - "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", - "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", - "The LDAP attribute that maps to the mail that users use to sign in.": "", - "The LDAP attribute that maps to the username that users use to sign in.": "", - "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", - "The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "", - "The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "", + "The Application Account DN you bind with for search": "L'account dell'applicazione DN con cui ti colleghi per la ricerca", + "The base to search for users": "La base da cercare per gli utenti", + "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "La dimensione del batch determina quanti richieste di testo vengono elaborate insieme in una sola volta. Una dimensione del batch più alta può aumentare le prestazioni e la velocità del modello, ma richiede anche più memoria.", + "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Gli sviluppatori dietro questo plugin sono volontari appassionati della comunità. Se trovi utile questo plugin, ti preghiamo di considerare di contribuire al suo sviluppo.", + "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "La classifica di valutazione è basata sul sistema di rating Elo ed è aggiornata in tempo reale.", + "The LDAP attribute that maps to the mail that users use to sign in.": "L'attributo LDAP che mappa alla mail che gli utenti usano per accedere.", + "The LDAP attribute that maps to the username that users use to sign in.": "L'attributo LDAP che mappa al nome utente che gli utenti usano per accedere.", + "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "La classifica è attualmente in beta e potremmo regolare i calcoli dei punteggi mentre perfezioniamo l'algoritmo.", + "The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "La dimensione massima del file in MB. Se la dimensione del file supera questo limite, il file non verrà caricato.", + "The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "La dimensione massima del numero di file che possono essere utilizzati contemporaneamente nella chat. Se il numero di file supera questo limite, i file non verranno caricati.", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Il punteggio dovrebbe essere un valore compreso tra 0.0 (0%) e 1.0 (100%).", - "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "", + "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "La temperatura del modello. Aumentare la temperatura farà sì che il modello risponda in modo più creativo.", "Theme": "Tema", - "Thinking...": "", - "This action cannot be undone. Do you wish to continue?": "", - "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "", - "This chat won’t appear in history and your messages will not be saved.": "", + "Thinking...": "Sto pensando...", + "This action cannot be undone. Do you wish to continue?": "Questa azione non può essere annullata. Vuoi continuare?", + "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Questo canale è stato creato il {{createdAt}}. Questo è l'inizio del canale {{channelName}}.", + "This chat won’t appear in history and your messages will not be saved.": "Questa chat non apparirà nella cronologia e i tuoi messaggi non verranno salvati.", "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Ciò garantisce che le tue preziose conversazioni siano salvate in modo sicuro nel tuo database backend. Grazie!", - "This is an experimental feature, it may not function as expected and is subject to change at any time.": "", - "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "", - "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", - "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", - "This response was generated by \"{{model}}\"": "", - "This will delete": "", - "This will delete {{NAME}} and all its contents.": "", - "This will delete all models including custom models": "", - "This will delete all models including custom models and cannot be undone.": "", - "This will reset the knowledge base and sync all files. Do you wish to continue?": "", + "This is an experimental feature, it may not function as expected and is subject to change at any time.": "Questa è una funzionalità sperimentale, potrebbe non funzionare come previsto ed è soggetta a modifiche in qualsiasi momento.", + "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "Questa opzione controlla quanti token vengono preservati quando si aggiorna il contesto. Ad esempio, se impostato su 2, gli ultimi 2 token del contesto della conversazione verranno mantenuti. Preservare il contesto può aiutare a mantenere la continuità di una conversazione, ma potrebbe ridurre la capacità di rispondere a nuovi argomenti.", + "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Questa opzione imposta il numero massimo di token che il modello può generare nella sua risposta. Aumentare questo limite consente al modello di fornire risposte più lunghe, ma potrebbe anche aumentare la probabilità che vengano generati contenuti non utili o irrilevanti.", + "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Questa opzione eliminerà tutti i file esistenti nella collezione e li sostituirà con i file appena caricati.", + "This response was generated by \"{{model}}\"": "Questa risposta è stata generata da \"{{model}}\"", + "This will delete": "Questa opzione eliminerà", + "This will delete {{NAME}} and all its contents.": "Questa opzione eliminerà {{NAME}} e tutti i suoi contenuti.", + "This will delete all models including custom models": "Questa opzione eliminerà tutti i modelli, compresi i modelli personalizzati", + "This will delete all models including custom models and cannot be undone.": "Questa opzione eliminerà tutti i modelli, compresi i modelli personalizzati e non può essere annullata.", + "This will reset the knowledge base and sync all files. Do you wish to continue?": "Questa opzione ripristinerà la base di conoscenza e sincronizzerà tutti i file. Vuoi continuare?", "Thorough explanation": "Spiegazione dettagliata", - "Thought for {{DURATION}}": "", - "Thought for {{DURATION}} seconds": "", + "Thought for {{DURATION}}": "Pensiero per {{DURATION}}", + "Thought for {{DURATION}} seconds": "Pensiero per {{DURATION}} secondi", "Tika": "", - "Tika Server URL required.": "", + "Tika Server URL required.": "L'URL del server Tika è obbligatorio.", "Tiktoken": "", "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Suggerimento: aggiorna più slot di variabili consecutivamente premendo il tasto tab nell'input della chat dopo ogni sostituzione.", "Title": "Titolo", "Title (e.g. Tell me a fun fact)": "Titolo (ad esempio Dimmi un fatto divertente)", "Title Auto-Generation": "Generazione automatica del titolo", "Title cannot be an empty string.": "Il titolo non può essere una stringa vuota.", - "Title Generation": "", + "Title Generation": "Generazione del titolo", "Title Generation Prompt": "Prompt di generazione del titolo", "TLS": "", "To access the available model names for downloading,": "Per accedere ai nomi dei modelli disponibili per il download,", "To access the GGUF models available for downloading,": "Per accedere ai modelli GGUF disponibili per il download,", - "To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "", - "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "", - "To learn more about available endpoints, visit our documentation.": "", - "To protect your privacy, only ratings, model IDs, tags, and metadata are shared from your feedback—your chat logs remain private and are not included.": "", - "To select actions here, add them to the \"Functions\" workspace first.": "", - "To select filters here, add them to the \"Functions\" workspace first.": "", - "To select toolkits here, add them to the \"Tools\" workspace first.": "", - "Toast notifications for new updates": "", + "To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Per accedere a WebUI, contatta l'amministratore. Gli amministratori possono gestire gli stati degli utenti dal pannello di amministrazione.", + "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Per allegare la base di conoscenza qui, aggiungili prima allo spazio di lavoro \"Conoscenza\".", + "To learn more about available endpoints, visit our documentation.": "Per saperne di più sugli endpoint disponibili, visita la nostra documentazione.", + "To protect your privacy, only ratings, model IDs, tags, and metadata are shared from your feedback—your chat logs remain private and are not included.": "Per proteggere la tua privacy, solo le valutazioni, gli ID dei modelli, i tag e i metadati vengono condivisi dal tuo feedback: i registri della chat rimangono privati e non sono inclusi.", + "To select actions here, add them to the \"Functions\" workspace first.": "Per selezionare le azioni qui, aggiungile prima allo spazio di lavoro \"Funzioni\".", + "To select filters here, add them to the \"Functions\" workspace first.": "Per selezionare i filtri qui, aggiungili prima allo spazio di lavoro \"Funzioni\".", + "To select toolkits here, add them to the \"Tools\" workspace first.": "Per selezionare i toolkit qui, aggiungili prima allo spazio di lavoro \"Strumenti\".", + "Toast notifications for new updates": "Notifiche toast per nuovi aggiornamenti", "Today": "Oggi", "Toggle settings": "Attiva/disattiva impostazioni", "Toggle sidebar": "Attiva/disattiva barra laterale", "Token": "", - "Tokens To Keep On Context Refresh (num_keep)": "", - "Too verbose": "", - "Tool created successfully": "", - "Tool deleted successfully": "", - "Tool Description": "", - "Tool ID": "", - "Tool imported successfully": "", - "Tool Name": "", - "Tool Servers": "", - "Tool updated successfully": "", - "Tools": "", - "Tools Access": "", - "Tools are a function calling system with arbitrary code execution": "", - "Tools Function Calling Prompt": "", - "Tools have a function calling system that allows arbitrary code execution.": "", - "Tools Public Sharing": "", + "Tokens To Keep On Context Refresh (num_keep)": "Token da mantenere durante l'aggiornamento del contesto (num_keep)", + "Too verbose": "Troppo prolisso", + "Tool created successfully": "Strumento creato con successo", + "Tool deleted successfully": "Strumento eliminato con successo", + "Tool Description": "Descrizione dello strumento", + "Tool ID": "ID strumento", + "Tool imported successfully": "Strumento importato con successo", + "Tool Name": "Nome dello strumento", + "Tool Servers": "Server degli strumenti", + "Tool updated successfully": "Strumento aggiornato con successo", + "Tools": "Strumenti", + "Tools Access": "Accesso agli strumenti", + "Tools are a function calling system with arbitrary code execution": "Gli strumenti sono un sistema di chiamata di funzioni con esecuzione di codice arbitrario", + "Tools Function Calling Prompt": "Strumento di chiamata di funzione del prompt", + "Tools have a function calling system that allows arbitrary code execution.": "Gli strumenti hanno un sistema di chiamata di funzione che consente l'esecuzione di codice arbitrario.", + "Tools Public Sharing": "Condivisione pubblica degli strumenti", "Top K": "Top K", - "Top K Reranker": "", + "Top K Reranker": "Top K Reranker", "Top P": "Top P", "Transformers": "", "Trouble accessing Ollama?": "Problemi di accesso a Ollama?", - "Trust Proxy Environment": "", + "Trust Proxy Environment": "Fidati dell'ambiente proxy", "TTS Model": "", "TTS Settings": "Impostazioni TTS", "TTS Voice": "", "Type": "Digitare", "Type Hugging Face Resolve (Download) URL": "Digita l'URL di Hugging Face Resolve (Download)", - "Uh-oh! There was an issue with the response.": "", + "Uh-oh! There was an issue with the response.": "Uh-oh! C'è stato un problema con la risposta.", "UI": "", - "Unarchive All": "", - "Unarchive All Archived Chats": "", - "Unarchive Chat": "", - "Unlock mysteries": "", - "Unpin": "", - "Unravel secrets": "", + "Unarchive All": "Disarchivia tutto", + "Unarchive All Archived Chats": "Disarchivia tutte le chat archiviate", + "Unarchive Chat": "Disarchivia chat", + "Unlock mysteries": "Sblocca misteri", + "Unpin": "Rimuovi fissato", + "Unravel secrets": "Svela segreti", "Untagged": "", "Untitled": "", - "Update": "", + "Update": "Aggiorna", "Update and Copy Link": "Aggiorna e copia link", - "Update for the latest features and improvements.": "", + "Update for the latest features and improvements.": "Aggiorna per le ultime funzionalità e miglioramenti.", "Update password": "Aggiorna password", - "Updated": "", - "Updated at": "", - "Updated At": "", - "Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "", - "Upload": "", + "Updated": "Aggiornato", + "Updated at": "Aggiornato il", + "Updated At": "Aggiornato il", + "Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "Aggiorna a un piano con licenza per funzionalità avanzate, tra cui personalizzazione del tema e branding, e supporto dedicato.", + "Upload": "Carica", "Upload a GGUF model": "Carica un modello GGUF", - "Upload Audio": "", - "Upload directory": "", - "Upload files": "", + "Upload Audio": "Carica audio", + "Upload directory": "Carica directory", + "Upload files": "Carica file", "Upload Files": "Carica file", - "Upload Pipeline": "", + "Upload Pipeline": "Carica pipeline", "Upload Progress": "Avanzamento caricamento", "URL": "", "URL Mode": "Modalità URL", - "Use '#' in the prompt input to load and include your knowledge.": "", + "Use '#' in the prompt input to load and include your knowledge.": "Usa '#' nell'input del prompt per caricare e includere la tua conoscenza.", "Use Gravatar": "Usa Gravatar", - "Use groups to group your users and assign permissions.": "", + "Use groups to group your users and assign permissions.": "Usa i gruppi per raggruppare i tuoi utenti e assegnare permessi.", "Use Initials": "Usa iniziali", - "Use no proxy to fetch page contents.": "", - "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", + "Use no proxy to fetch page contents.": "Usa nessun proxy per recuperare i contenuti della pagina.", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "Usa il proxy designato dalle variabili di ambiente http_proxy e https_proxy per recuperare i contenuti della pagina.", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "utente", - "User": "", - "User location successfully retrieved.": "", - "User Webhooks": "", - "Username": "", + "User": "Utente", + "User location successfully retrieved.": "Posizione utente recuperata con successo.", + "User Webhooks": "Webhook utente", + "Username": "Nome utente", "Users": "Utenti", - "Using the default arena model with all models. Click the plus button to add custom models.": "", + "Using the default arena model with all models. Click the plus button to add custom models.": "Utilizzando il modello di arena predefinito con tutti i modelli. Fai clic sul pulsante più per aggiungere modelli personalizzati.", "Utilize": "Utilizza", "Valid time units:": "Unità di tempo valide:", - "Valves": "", - "Valves updated": "", - "Valves updated successfully": "", + "Valves": "Valvole", + "Valves updated": "Valvole aggiornate", + "Valves updated successfully": "Valvole aggiornate con successo", "variable": "variabile", "variable to have them replaced with clipboard content.": "variabile per farli sostituire con il contenuto degli appunti.", - "Verify Connection": "", - "Verify SSL Certificate": "", + "Verify Connection": "Verifica connessione", + "Verify SSL Certificate": "Verifica certificato SSL", "Version": "Versione", - "Version {{selectedVersion}} of {{totalVersions}}": "", - "View Replies": "", - "View Result from **{{NAME}}**": "", - "Visibility": "", - "Voice": "", - "Voice Input": "", - "Warning": "Avvertimento", - "Warning:": "", - "Warning: Enabling this will allow users to upload arbitrary code on the server.": "", + "Version {{selectedVersion}} of {{totalVersions}}": "Versione {{selectedVersion}} di {{totalVersions}}", + "View Replies": "Visualizza risposte", + "View Result from **{{NAME}}**": "Visualizza risultato da **{{NAME}}**", + "Visibility": "Visibilità", + "Voice": "Voce", + "Voice Input": "Input vocale", + "Warning": "Attenzione", + "Warning:": "Attenzione:", + "Warning: Enabling this will allow users to upload arbitrary code on the server.": "Attenzione: abilitando questo, gli utenti potranno caricare codice arbitrario sul server.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Attenzione: se aggiorni o cambi il tuo modello di embedding, dovrai reimportare tutti i documenti.", - "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "", + "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Attenzione: l'esecuzione di Jupyter consente l'esecuzione di codice arbitrario, comportando gravi rischi per la sicurezza: procedere con estrema cautela.", "Web": "Web", - "Web API": "", - "Web Loader Engine": "", + "Web API": "API Web", + "Web Loader Engine": "Motore di caricamento Web", "Web Search": "Ricerca sul Web", "Web Search Engine": "Motore di ricerca Web", - "Web Search in Chat": "", - "Web Search Query Generation": "", + "Web Search in Chat": "Ricerca Web in chat", + "Web Search Query Generation": "Generazione di query di ricerca Web", "Webhook URL": "URL webhook", "WebUI Settings": "Impostazioni WebUI", - "WebUI URL": "", - "WebUI will make requests to \"{{url}}\"": "", - "WebUI will make requests to \"{{url}}/api/chat\"": "", - "WebUI will make requests to \"{{url}}/chat/completions\"": "", - "What are you trying to achieve?": "", - "What are you working on?": "", + "WebUI URL": "URL WebUI", + "WebUI will make requests to \"{{url}}\"": "WebUI farà richieste a \"{{url}}\"", + "WebUI will make requests to \"{{url}}/api/chat\"": "WebUI farà richieste a \"{{url}}/api/chat\"", + "WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI farà richieste a \"{{url}}/chat/completions\"", + "What are you trying to achieve?": "Cosa stai cercando di ottenere?", + "What are you working on?": "Su cosa stai lavorando?", "What’s New in": "Novità in", - "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.": "", - "wherever you are": "", + "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.": "Quando abilitato, il modello risponderà a ciascun messaggio della chat in tempo reale, generando una risposta non appena l'utente invia un messaggio. Questa modalità è utile per le applicazioni di chat dal vivo, ma potrebbe influire sulle prestazioni su hardware più lento.", + "wherever you are": "Ovunque tu sia", "Whisper (Local)": "", - "Why?": "", - "Widescreen Mode": "", - "Won": "", - "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.": "", - "Workspace": "Area di lavoro", - "Workspace Permissions": "", - "Write": "", + "Why?": "Perché?", + "Widescreen Mode": "Modalità widescreen", + "Won": "Vinto", + "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.": "Lavora insieme a top-k. Un valore più alto (ad esempio, 0,95) porterà a un testo più vario, mentre un valore più basso (ad esempio, 0,5) genererà un testo più focalizzato e conservativo.", + "Workspace": "Spazio di lavoro", + "Workspace Permissions": "Permessi dello spazio di lavoro", + "Write": "Scrivi", "Write a prompt suggestion (e.g. Who are you?)": "Scrivi un suggerimento per il prompt (ad esempio Chi sei?)", "Write a summary in 50 words that summarizes [topic or keyword].": "Scrivi un riassunto in 50 parole che riassume [argomento o parola chiave].", - "Write something...": "", - "Write your model template content here": "", - "Yacy Instance URL": "", - "Yacy Password": "", - "Yacy Username": "", + "Write something...": "Scrivi qualcosa...", + "Write your model template content here": "Scrivi qui il contenuto del tuo modello", + "Yacy Instance URL": "URL dell'istanza Yacy", + "Yacy Password": "Password Yacy", + "Yacy Username": "Nome utente Yacy", "Yesterday": "Ieri", "You": "Tu", - "You are currently using a trial license. Please contact support to upgrade your license.": "", - "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "", - "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "", - "You cannot upload an empty file.": "", - "You do not have permission to upload files.": "", + "You are currently using a trial license. Please contact support to upgrade your license.": "Stai attualmente utilizzando una licenza di prova. Contatta il supporto per aggiornare la tua licenza.", + "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Puoi chattare solo con un massimo di {{maxCount}} file alla volta.", + "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Puoi personalizzare le tue interazioni con LLM aggiungendo memorie tramite il pulsante 'Gestisci' qui sotto, rendendole più utili e su misura per te.", + "You cannot upload an empty file.": "Non puoi caricare un file vuoto.", + "You do not have permission to upload files.": "Non hai il permesso di caricare file.", "You have no archived conversations.": "Non hai conversazioni archiviate.", "You have shared this chat": "Hai condiviso questa chat", "You're a helpful assistant.": "Sei un assistente utile.", "You're now logged in.": "Ora hai effettuato l'accesso.", - "Your account status is currently pending activation.": "", - "Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "", + "Your account status is currently pending activation.": "Lo stato del tuo account è attualmente in attesa di attivazione.", + "Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "Il tuo intero contributo andrà direttamente allo sviluppatore del plugin; Open WebUI non prende alcuna percentuale. Tuttavia, la piattaforma di finanziamento scelta potrebbe avere le proprie commissioni.", "Youtube": "Youtube", - "Youtube Language": "", - "Youtube Proxy URL": "" + "Youtube Language": "Lingua Youtube", + "Youtube Proxy URL": "URL proxy Youtube" } diff --git a/src/lib/i18n/locales/ja-JP/translation.json b/src/lib/i18n/locales/ja-JP/translation.json index 9995aff6a..6efb6a3c9 100644 --- a/src/lib/i18n/locales/ja-JP/translation.json +++ b/src/lib/i18n/locales/ja-JP/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "リクエストモード", + "Reranking Engine": "", "Reranking Model": "モデルの再ランキング", - "Reranking model disabled": "再ランキングモデルが無効です", - "Reranking model set to \"{{reranking_model}}\"": "再ランキングモデルを \"{{reranking_model}}\" に設定しました", "Reset": "", "Reset All Models": "", "Reset Upload Directory": "アップロードディレクトリをリセット", @@ -1069,6 +1068,8 @@ "Show": "表示", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "表示", "Show your support!": "", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "STTモデル", "STT Settings": "STT設定", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "タイトル (例: ローマ帝国)", "Success": "成功", "Successfully updated.": "正常に更新されました。", diff --git a/src/lib/i18n/locales/ka-GE/translation.json b/src/lib/i18n/locales/ka-GE/translation.json index 48a68bfe9..b9772e8c4 100644 --- a/src/lib/i18n/locales/ka-GE/translation.json +++ b/src/lib/i18n/locales/ka-GE/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "ნაკადში პასუხი", "Request Mode": "მოთხოვნის რეჟიმი", + "Reranking Engine": "", "Reranking Model": "Reranking მოდელი", - "Reranking model disabled": "Reranking მოდელი გათიშულია", - "Reranking model set to \"{{reranking_model}}\"": "Reranking model set to \"{{reranking_model}}\"", "Reset": "ჩამოყრა", "Reset All Models": "", "Reset Upload Directory": "", @@ -1069,6 +1068,8 @@ "Show": "ჩვენება", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "მალსახმობების ჩვენება", "Show your support!": "", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "", "STT Settings": "STT-ის მორგება", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "სუბტიტრები (მაგ. რომის იმპერიის შესახებ)", "Success": "წარმატება", "Successfully updated.": "წარმატებით განახლდა.", diff --git a/src/lib/i18n/locales/ko-KR/translation.json b/src/lib/i18n/locales/ko-KR/translation.json index d4198d4b5..efb6c5774 100644 --- a/src/lib/i18n/locales/ko-KR/translation.json +++ b/src/lib/i18n/locales/ko-KR/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "스레드에 답글 달기", "Request Mode": "요청 모드", + "Reranking Engine": "", "Reranking Model": "Reranking 모델", - "Reranking model disabled": "Reranking 모델 비활성화", - "Reranking model set to \"{{reranking_model}}\"": "Reranking 모델을 \"{{reranking_model}}\"로 설정", "Reset": "초기화", "Reset All Models": "모든 모델 초기화", "Reset Upload Directory": "업로드 디렉토리 초기화", @@ -1069,6 +1068,8 @@ "Show": "보기", "Show \"What's New\" modal on login": "로그인시 \"새로운 기능\" 모달 보기", "Show Admin Details in Account Pending Overlay": "사용자용 계정 보류 설명창에, 관리자 상세 정보 노출", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "단축키 보기", "Show your support!": "당신의 응원을 보내주세요!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "스트림 채팅 응답", "STT Model": "STT 모델", "STT Settings": "STT 설정", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "자막 (예: 로마 황제)", "Success": "성공", "Successfully updated.": "성공적으로 업데이트되었습니다.", diff --git a/src/lib/i18n/locales/lt-LT/translation.json b/src/lib/i18n/locales/lt-LT/translation.json index 9446c6676..a4cba47ff 100644 --- a/src/lib/i18n/locales/lt-LT/translation.json +++ b/src/lib/i18n/locales/lt-LT/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "Užklausos rėžimas", + "Reranking Engine": "", "Reranking Model": "Reranking modelis", - "Reranking model disabled": "Reranking modelis neleidžiamas", - "Reranking model set to \"{{reranking_model}}\"": "Nustatytas rereanking modelis: \"{{reranking_model}}\"", "Reset": "Atkurti", "Reset All Models": "", "Reset Upload Directory": "Atkurti įkėlimų direktoiją", @@ -1069,6 +1068,8 @@ "Show": "Rodyti", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "Rodyti administratoriaus duomenis laukiant paskyros patvirtinimo", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Rodyti trumpinius", "Show your support!": "Palaikykite", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "STT modelis", "STT Settings": "STT nustatymai", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Subtitras", "Success": "Sėkmingai", "Successfully updated.": "Sėkmingai atnaujinta.", diff --git a/src/lib/i18n/locales/ms-MY/translation.json b/src/lib/i18n/locales/ms-MY/translation.json index 438df1708..7c406f41f 100644 --- a/src/lib/i18n/locales/ms-MY/translation.json +++ b/src/lib/i18n/locales/ms-MY/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "Mod Permintaan", + "Reranking Engine": "", "Reranking Model": "Model 'Reranking'", - "Reranking model disabled": "Model 'Reranking' dilumpuhkan", - "Reranking model set to \"{{reranking_model}}\"": "Model 'Reranking' ditetapkan kepada \"{{reranking_model}}\"", "Reset": "Tetapkan Semula", "Reset All Models": "", "Reset Upload Directory": "Tetapkan Semula Direktori Muat Naik", @@ -1069,6 +1068,8 @@ "Show": "Tunjukkan", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "Tunjukkan Butiran Pentadbir dalam Akaun Menunggu Tindanan", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Tunjukkan pintasan", "Show your support!": "Tunjukkan sokongan anda!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "Model STT", "STT Settings": "Tetapan STT", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Sari kata (cth tentang Kesultanan Melaka)", "Success": "Berjaya", "Successfully updated.": "Berjaya Dikemaskini", diff --git a/src/lib/i18n/locales/nb-NO/translation.json b/src/lib/i18n/locales/nb-NO/translation.json index 130fb9496..c2fbc0635 100644 --- a/src/lib/i18n/locales/nb-NO/translation.json +++ b/src/lib/i18n/locales/nb-NO/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "Gjenta straff (Ollama)", "Reply in Thread": "Svar i tråd", "Request Mode": "Forespørselsmodus", + "Reranking Engine": "", "Reranking Model": "Omrangeringsmodell", - "Reranking model disabled": "Omrangeringsmodell deaktivert", - "Reranking model set to \"{{reranking_model}}\"": "Omrangeringsmodell er angitt til \"{{reranking_model}}\"", "Reset": "Tilbakestill", "Reset All Models": "Tilbakestill alle modeller", "Reset Upload Directory": "Tilbakestill opplastingskatalog", @@ -1069,6 +1068,8 @@ "Show": "Vis", "Show \"What's New\" modal on login": "Vis \"Hva er nytt\"-modal ved innlogging", "Show Admin Details in Account Pending Overlay": "Vis administratordetaljer i ventende kontovisning", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Vis snarveier", "Show your support!": "Vis din støtte!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Strømme chat-svar", "STT Model": "STT-modell", "STT Settings": "STT-innstillinger", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Undertittel (f.eks. om romerriket)", "Success": "Suksess", "Successfully updated.": "Oppdatert.", diff --git a/src/lib/i18n/locales/nl-NL/translation.json b/src/lib/i18n/locales/nl-NL/translation.json index a2ceab8c7..5ed6f165b 100644 --- a/src/lib/i18n/locales/nl-NL/translation.json +++ b/src/lib/i18n/locales/nl-NL/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "Herhalingsstraf (Ollama)", "Reply in Thread": "Antwoord in draad", "Request Mode": "Request Modus", + "Reranking Engine": "", "Reranking Model": "Reranking Model", - "Reranking model disabled": "Reranking model uitgeschakeld", - "Reranking model set to \"{{reranking_model}}\"": "Reranking model ingesteld op \"{{reranking_model}}\"", "Reset": "Herstellen", "Reset All Models": "Herstel alle modellen", "Reset Upload Directory": "Herstel Uploadmap", @@ -1069,6 +1068,8 @@ "Show": "Toon", "Show \"What's New\" modal on login": "Toon \"Wat is nieuw\" bij inloggen", "Show Admin Details in Account Pending Overlay": "Admin-details weergeven in overlay in afwachting van account", + "Show All": "", + "Show Less": "", "Show Model": "Toon model", "Show shortcuts": "Toon snelkoppelingen", "Show your support!": "Toon je steun", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Stream chat-antwoord", "STT Model": "STT Model", "STT Settings": "STT Instellingen", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Ondertitel (bijv. over de Romeinse Empire)", "Success": "Succes", "Successfully updated.": "Succesvol bijgewerkt.", diff --git a/src/lib/i18n/locales/pa-IN/translation.json b/src/lib/i18n/locales/pa-IN/translation.json index fb03157bd..d843775f1 100644 --- a/src/lib/i18n/locales/pa-IN/translation.json +++ b/src/lib/i18n/locales/pa-IN/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "ਬੇਨਤੀ ਮੋਡ", + "Reranking Engine": "", "Reranking Model": "ਮਾਡਲ ਮੁੜ ਰੈਂਕਿੰਗ", - "Reranking model disabled": "ਮਾਡਲ ਮੁੜ ਰੈਂਕਿੰਗ ਅਯੋਗ ਕੀਤਾ ਗਿਆ", - "Reranking model set to \"{{reranking_model}}\"": "ਮਾਡਲ ਮੁੜ ਰੈਂਕਿੰਗ ਨੂੰ \"{{reranking_model}}\" 'ਤੇ ਸੈੱਟ ਕੀਤਾ ਗਿਆ", "Reset": "", "Reset All Models": "", "Reset Upload Directory": "", @@ -1069,6 +1068,8 @@ "Show": "ਦਿਖਾਓ", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "ਸ਼ਾਰਟਕਟ ਦਿਖਾਓ", "Show your support!": "", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "", "STT Settings": "STT ਸੈਟਿੰਗਾਂ", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "ਉਪਸਿਰਲੇਖ (ਉਦਾਹਰਣ ਲਈ ਰੋਮਨ ਸਾਮਰਾਜ ਬਾਰੇ)", "Success": "ਸਫਲਤਾ", "Successfully updated.": "ਸਫਲਤਾਪੂਰਵਕ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ।", diff --git a/src/lib/i18n/locales/pl-PL/translation.json b/src/lib/i18n/locales/pl-PL/translation.json index 7c99f677a..346c00f54 100644 --- a/src/lib/i18n/locales/pl-PL/translation.json +++ b/src/lib/i18n/locales/pl-PL/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "Powtórzona kara (Ollama)", "Reply in Thread": "Odpowiedz w wątku", "Request Mode": "Tryb żądania", + "Reranking Engine": "", "Reranking Model": "Poprawa rankingu modelu", - "Reranking model disabled": "Ponowny ranking modeli wyłączony", - "Reranking model set to \"{{reranking_model}}\"": "Ponowny ranking modeli ustawiony na \"{{reranking_model}}\".", "Reset": "Resetuj", "Reset All Models": "Resetuj wszystkie modele", "Reset Upload Directory": "Resetuj katalog pobierania", @@ -1069,6 +1068,8 @@ "Show": "Wyświetl", "Show \"What's New\" modal on login": "Wyświetl okno dialogowe \"What's New\" podczas logowania", "Show Admin Details in Account Pending Overlay": "Wyświetl szczegóły administratora w okienu informacyjnym o potrzebie zatwierdzenia przez administratora konta użytkownika", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Wyświetl skróty", "Show your support!": "Wyraź swoje poparcie!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Strumieniowanie odpowiedzi z czatu", "STT Model": "Model STT", "STT Settings": "Ustawienia STT", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Podtytuł (np. o Imperium Rzymskim)", "Success": "Sukces", "Successfully updated.": "Uaktualniono pomyślnie.", diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index 796a16127..0078ed9be 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "Modo de Solicitação", + "Reranking Engine": "", "Reranking Model": "Modelo de Reclassificação", - "Reranking model disabled": "Modelo de Reclassificação desativado", - "Reranking model set to \"{{reranking_model}}\"": "Modelo de Reclassificação definido como \"{{reranking_model}}\"", "Reset": "Redefinir", "Reset All Models": "", "Reset Upload Directory": "Redefinir Diretório de Upload", @@ -1069,6 +1068,8 @@ "Show": "Mostrar", "Show \"What's New\" modal on login": "Mostrar \"O que há de Novo\" no login", "Show Admin Details in Account Pending Overlay": "Mostrar Detalhes do Administrador na Sobreposição de Conta Pendentes", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Mostrar atalhos", "Show your support!": "Mostre seu apoio!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Stream Resposta do Chat", "STT Model": "Modelo STT", "STT Settings": "Configurações STT", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Subtítulo (por exemplo, sobre o Império Romano)", "Success": "Sucesso", "Successfully updated.": "Atualizado com sucesso.", diff --git a/src/lib/i18n/locales/pt-PT/translation.json b/src/lib/i18n/locales/pt-PT/translation.json index 7d5fd4c1d..7758552d4 100644 --- a/src/lib/i18n/locales/pt-PT/translation.json +++ b/src/lib/i18n/locales/pt-PT/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "Modo de Pedido", + "Reranking Engine": "", "Reranking Model": "Modelo de Reranking", - "Reranking model disabled": "Modelo de Reranking desativado", - "Reranking model set to \"{{reranking_model}}\"": "Modelo de Reranking definido como \"{{reranking_model}}\"", "Reset": "", "Reset All Models": "", "Reset Upload Directory": "Limpar Pasta de Carregamento", @@ -1069,6 +1068,8 @@ "Show": "Mostrar", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "Mostrar Detalhes do Administrador na sobreposição de Conta Pendente", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Mostrar atalhos", "Show your support!": "", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "Modelo STT", "STT Settings": "Configurações STT", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Subtítulo (ex.: sobre o Império Romano)", "Success": "Sucesso", "Successfully updated.": "Atualizado com sucesso.", diff --git a/src/lib/i18n/locales/ro-RO/translation.json b/src/lib/i18n/locales/ro-RO/translation.json index 9fc741b8a..30c95fd37 100644 --- a/src/lib/i18n/locales/ro-RO/translation.json +++ b/src/lib/i18n/locales/ro-RO/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "Mod de Cerere", + "Reranking Engine": "", "Reranking Model": "Model de Rearanjare", - "Reranking model disabled": "Modelul de Rearanjare este dezactivat", - "Reranking model set to \"{{reranking_model}}\"": "Modelul de Rearanjare setat la \"{{reranking_model}}\"", "Reset": "Resetează", "Reset All Models": "", "Reset Upload Directory": "Resetează Directorul de Încărcare", @@ -1069,6 +1068,8 @@ "Show": "Afișează", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "Afișează Detaliile Administratorului în Suprapunerea Contului În Așteptare", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Afișează scurtături", "Show your support!": "Arată-ți susținerea!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Răspuns Stream Chat", "STT Model": "Model STT", "STT Settings": "Setări STT", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Subtitlu (de ex. despre Imperiul Roman)", "Success": "Succes", "Successfully updated.": "Actualizat cu succes.", diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 2a049b9cf..74e5e53b0 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "Повторить наказание (Ollama)", "Reply in Thread": "Ответить в обсуждении", "Request Mode": "Режим запроса", + "Reranking Engine": "", "Reranking Model": "Модель реранжирования", - "Reranking model disabled": "Модель реранжирования отключена", - "Reranking model set to \"{{reranking_model}}\"": "Модель реранжирования установлена на \"{{reranking_model}}\"", "Reset": "Сбросить", "Reset All Models": "Сбросить все модели", "Reset Upload Directory": "Сбросить каталог загрузок", @@ -1069,6 +1068,8 @@ "Show": "Показать", "Show \"What's New\" modal on login": "Показывать окно «Что нового» при входе в систему", "Show Admin Details in Account Pending Overlay": "Показывать данные администратора в оверлее ожидающей учетной записи", + "Show All": "", + "Show Less": "", "Show Model": "Показать модель", "Show shortcuts": "Показать горячие клавиши", "Show your support!": "Поддержите нас!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Потоковый вывод ответа", "STT Model": "Модель распознавания речи", "STT Settings": "Настройки распознавания речи", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Подзаголовок (напр., о Римской империи)", "Success": "Успех", "Successfully updated.": "Успешно обновлено.", diff --git a/src/lib/i18n/locales/sk-SK/translation.json b/src/lib/i18n/locales/sk-SK/translation.json index 0393e1349..a22c0dc44 100644 --- a/src/lib/i18n/locales/sk-SK/translation.json +++ b/src/lib/i18n/locales/sk-SK/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "Režim žiadosti", + "Reranking Engine": "", "Reranking Model": "Model na prehodnotenie poradia", - "Reranking model disabled": "Model na prehodnotenie poradia je deaktivovaný", - "Reranking model set to \"{{reranking_model}}\"": "Model na prehodnotenie poradia nastavený na \"{{reranking_model}}\"", "Reset": "režim Reset", "Reset All Models": "", "Reset Upload Directory": "Resetovať adresár nahrávania", @@ -1069,6 +1068,8 @@ "Show": "Zobraziť", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "Zobraziť podrobnosti administrátora v prekryvnom okne s čakajúcim účtom", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Zobraziť klávesové skratky", "Show your support!": "Vyjadrite svoju podporu!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Odozva chatu Stream", "STT Model": "Model rozpoznávania reči na text (STT)", "STT Settings": "Nastavenia STT (Rozpoznávanie reči)", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Titulky (napr. o Rímskej ríši)", "Success": "Úspech", "Successfully updated.": "Úspešne aktualizované.", diff --git a/src/lib/i18n/locales/sr-RS/translation.json b/src/lib/i18n/locales/sr-RS/translation.json index b75cadcd7..1ff508437 100644 --- a/src/lib/i18n/locales/sr-RS/translation.json +++ b/src/lib/i18n/locales/sr-RS/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "Режим захтева", + "Reranking Engine": "", "Reranking Model": "Модел поновног рангирања", - "Reranking model disabled": "Модел поновног рангирања онемогућен", - "Reranking model set to \"{{reranking_model}}\"": "Модел поновног рангирања подешен на \"{{reranking_model}}\"", "Reset": "Поврати", "Reset All Models": "Поврати све моделе", "Reset Upload Directory": "", @@ -1069,6 +1068,8 @@ "Show": "Прикажи", "Show \"What's New\" modal on login": "Прикажи \"Погледај шта је ново\" прозорче при пријави", "Show Admin Details in Account Pending Overlay": "", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Прикажи пречице", "Show your support!": "", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "STT модел", "STT Settings": "STT подешавања", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Поднаслов (нпр. о Римском царству)", "Success": "Успех", "Successfully updated.": "Успешно ажурирано.", diff --git a/src/lib/i18n/locales/sv-SE/translation.json b/src/lib/i18n/locales/sv-SE/translation.json index 6565fc5f7..d8413d42f 100644 --- a/src/lib/i18n/locales/sv-SE/translation.json +++ b/src/lib/i18n/locales/sv-SE/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "Frågeläge", + "Reranking Engine": "", "Reranking Model": "Reranking modell", - "Reranking model disabled": "Reranking modell inaktiverad", - "Reranking model set to \"{{reranking_model}}\"": "Reranking modell inställd på \"{{reranking_model}}\"", "Reset": "", "Reset All Models": "", "Reset Upload Directory": "Återställ uppladdningskatalog", @@ -1069,6 +1068,8 @@ "Show": "Visa", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "Visa administratörsinformation till väntande konton", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Visa genvägar", "Show your support!": "Visa ditt stöd!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "Tal-till-text-modell", "STT Settings": "Tal-till-text-inställningar", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Undertext (t.ex. om Romerska Imperiet)", "Success": "Framgång", "Successfully updated.": "Uppdaterades framgångsrikt.", diff --git a/src/lib/i18n/locales/th-TH/translation.json b/src/lib/i18n/locales/th-TH/translation.json index 8d4fc86a6..9af6f484f 100644 --- a/src/lib/i18n/locales/th-TH/translation.json +++ b/src/lib/i18n/locales/th-TH/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "โหมดคำขอ", + "Reranking Engine": "", "Reranking Model": "จัดอันดับใหม่โมเดล", - "Reranking model disabled": "ปิดการใช้งานโมเดลการจัดอันดับใหม่", - "Reranking model set to \"{{reranking_model}}\"": "ตั้งค่าโมเดลการจัดอันดับใหม่เป็น \"{{reranking_model}}\"", "Reset": "รีเซ็ต", "Reset All Models": "", "Reset Upload Directory": "รีเซ็ตไดเร็กทอรีการอัปโหลด", @@ -1069,6 +1068,8 @@ "Show": "แสดง", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "แสดงรายละเอียดผู้ดูแลระบบในหน้าจอรอการอนุมัติบัญชี", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "แสดงทางลัด", "Show your support!": "แสดงการสนับสนุนของคุณ!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "โมเดลแปลงเสียงเป็นข้อความ", "STT Settings": "การตั้งค่าแปลงเสียงเป็นข้อความ", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "คำบรรยาย (เช่น เกี่ยวกับจักรวรรดิโรมัน)", "Success": "สำเร็จ", "Successfully updated.": "อัปเดตเรียบร้อยแล้ว", diff --git a/src/lib/i18n/locales/tk-TW/translation.json b/src/lib/i18n/locales/tk-TW/translation.json index 363afaaf7..190ce78fb 100644 --- a/src/lib/i18n/locales/tk-TW/translation.json +++ b/src/lib/i18n/locales/tk-TW/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "", + "Reranking Engine": "", "Reranking Model": "", - "Reranking model disabled": "", - "Reranking model set to \"{{reranking_model}}\"": "", "Reset": "", "Reset All Models": "", "Reset Upload Directory": "", @@ -1069,6 +1068,8 @@ "Show": "", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "", "Show your support!": "", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "", "STT Model": "", "STT Settings": "", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "", "Success": "", "Successfully updated.": "", diff --git a/src/lib/i18n/locales/tr-TR/translation.json b/src/lib/i18n/locales/tr-TR/translation.json index 1b4d25f4c..6ddfae586 100644 --- a/src/lib/i18n/locales/tr-TR/translation.json +++ b/src/lib/i18n/locales/tr-TR/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "Konuya Yanıtla", "Request Mode": "İstek Modu", + "Reranking Engine": "", "Reranking Model": "Yeniden Sıralama Modeli", - "Reranking model disabled": "Yeniden sıralama modeli devre dışı bırakıldı", - "Reranking model set to \"{{reranking_model}}\"": "Yeniden sıralama modeli \"{{reranking_model}}\" olarak ayarlandı", "Reset": "Sıfırla", "Reset All Models": "Tüm Modelleri Sıfırla", "Reset Upload Directory": "Yükleme Dizinini Sıfırla", @@ -1069,6 +1068,8 @@ "Show": "Göster", "Show \"What's New\" modal on login": "Girişte \"Yenilikler\" modalını göster", "Show Admin Details in Account Pending Overlay": "Yönetici Ayrıntılarını Hesap Bekliyor Ekranında Göster", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "Kısayolları göster", "Show your support!": "Desteğinizi gösterin!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "SAkış Sohbet Yanıtı", "STT Model": "STT Modeli", "STT Settings": "STT Ayarları", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Alt başlık (örn. Roma İmparatorluğu hakkında)", "Success": "Başarılı", "Successfully updated.": "Başarıyla güncellendi.", diff --git a/src/lib/i18n/locales/uk-UA/translation.json b/src/lib/i18n/locales/uk-UA/translation.json index 851b9cc32..4b29c3b3a 100644 --- a/src/lib/i18n/locales/uk-UA/translation.json +++ b/src/lib/i18n/locales/uk-UA/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "Штраф за повторення (Ollama)", "Reply in Thread": "Відповісти в потоці", "Request Mode": "Режим запиту", + "Reranking Engine": "", "Reranking Model": "Модель переранжування", - "Reranking model disabled": "Модель переранжування вимкнена", - "Reranking model set to \"{{reranking_model}}\"": "Модель переранжування встановлено на \"{{reranking_model}}\"", "Reset": "Скидання", "Reset All Models": "Скинути усі моделі", "Reset Upload Directory": "Скинути каталог завантажень", @@ -1069,6 +1068,8 @@ "Show": "Показати", "Show \"What's New\" modal on login": "Показати модальне вікно \"Що нового\" під час входу", "Show Admin Details in Account Pending Overlay": "Відобразити дані адміна у вікні очікування облікового запису", + "Show All": "", + "Show Less": "", "Show Model": "Показати модель", "Show shortcuts": "Показати клавіатурні скорочення", "Show your support!": "Підтримайте нас!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Відповідь стрім-чату", "STT Model": "Модель STT ", "STT Settings": "Налаштування STT", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Підзаголовок (напр., про Римську імперію)", "Success": "Успіх", "Successfully updated.": "Успішно оновлено.", diff --git a/src/lib/i18n/locales/ur-PK/translation.json b/src/lib/i18n/locales/ur-PK/translation.json index f49abcc18..8c66931ef 100644 --- a/src/lib/i18n/locales/ur-PK/translation.json +++ b/src/lib/i18n/locales/ur-PK/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "", "Reply in Thread": "", "Request Mode": "درخواست کا موڈ", + "Reranking Engine": "", "Reranking Model": "دوبارہ درجہ بندی کا ماڈل", - "Reranking model disabled": "دوبارہ درجہ بندی کا ماڈل غیر فعال کر دیا گیا", - "Reranking model set to \"{{reranking_model}}\"": "دوبارہ درجہ بندی کا ماڈل \"{{reranking_model}}\" پر مقرر کر دیا گیا ہے", "Reset": "ری سیٹ", "Reset All Models": "", "Reset Upload Directory": "اپلوڈ ڈائریکٹری کو ری سیٹ کریں", @@ -1069,6 +1068,8 @@ "Show": "دکھائیں", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "اکاؤنٹ پینڈنگ اوورلے میں ایڈمن کی تفصیلات دکھائیں", + "Show All": "", + "Show Less": "", "Show Model": "", "Show shortcuts": "شارٹ کٹ دکھائیں", "Show your support!": "اپنی حمایت دکھائیں!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "اسٹریم چیٹ جواب", "STT Model": "ایس ٹی ٹی ماڈل", "STT Settings": "ایس ٹی ٹی ترتیبات", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "ذیلی عنوان (جیسے رومن سلطنت کے بارے میں)", "Success": "کامیابی", "Successfully updated.": "کامیابی سے تازہ کاری ہو گئی", diff --git a/src/lib/i18n/locales/vi-VN/translation.json b/src/lib/i18n/locales/vi-VN/translation.json index b4a920478..05f8dd2eb 100644 --- a/src/lib/i18n/locales/vi-VN/translation.json +++ b/src/lib/i18n/locales/vi-VN/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "Hình phạt Lặp lại (Ollama)", "Reply in Thread": "Trả lời trong Luồng", "Request Mode": "Chế độ Yêu cầu", + "Reranking Engine": "", "Reranking Model": "Reranking Model", - "Reranking model disabled": "Đã tắt mô hình reranking", - "Reranking model set to \"{{reranking_model}}\"": "Reranking model được đặt thành \"{{reranking_model}}\"", "Reset": "Xóa toàn bộ", "Reset All Models": "Đặt lại Tất cả Mô hình", "Reset Upload Directory": "Xóa toàn bộ thư mục Upload", @@ -1069,6 +1068,8 @@ "Show": "Hiển thị", "Show \"What's New\" modal on login": "Hiển thị cửa sổ \"Có gì mới\" khi đăng nhập", "Show Admin Details in Account Pending Overlay": "Hiển thị thông tin của Quản trị viên trên màn hình hiển thị Tài khoản đang chờ xử lý", + "Show All": "", + "Show Less": "", "Show Model": "Hiển thị Mô hình", "Show shortcuts": "Hiển thị phím tắt", "Show your support!": "Thể hiện sự ủng hộ của bạn!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "Truyền trực tiếp Phản hồi Chat", "STT Model": "Mô hình STT", "STT Settings": "Cài đặt Nhận dạng Giọng nói", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "Phụ đề (ví dụ: về Đế chế La Mã)", "Success": "Thành công", "Successfully updated.": "Đã cập nhật thành công.", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 8c1c2d29b..d25166f1d 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -105,7 +105,7 @@ "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 update this user's role to **{{ROLE}}**?": "", + "Are you sure you want to update this user's role to **{{ROLE}}**?": "您确定要将此用户的角色更新为 **{{ROLE}}** 吗?", "Are you sure?": "是否确定?", "Arena Models": "启用竞技场匿名评价模型", "Artifacts": "Artifacts", @@ -148,7 +148,7 @@ "Bing Search V7 Subscription Key": "Bing 搜索 V7 订阅密钥", "Bocha Search API Key": "Bocha Search API 密钥", "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "为受限响应提升或惩罚特定标记。偏置值将被限制在 -100 到 100(包括两端)之间。(默认:无)", - "Both Docling OCR Engine and Language(s) must be provided or both left empty.": "", + "Both Docling OCR Engine and Language(s) must be provided or both left empty.": "必须提供 Docling OCR Engine 和语言,或者都留空。", "Brave Search API Key": "Brave Search API 密钥", "By {{name}}": "由 {{name}} 提供", "Bypass Embedding and Retrieval": "绕过嵌入和检索", @@ -159,7 +159,7 @@ "Cancel": "取消", "Capabilities": "能力", "Capture": "截图", - "Capture Audio": "", + "Capture Audio": "录制音频", "Certificate Path": "证书路径", "Change Password": "更改密码", "Channel Name": "频道名称", @@ -269,8 +269,8 @@ "Create Knowledge": "创建知识", "Create new key": "创建新密钥", "Create new secret key": "创建新安全密钥", - "Create Note": "", - "Create your first note by clicking on the plus button below.": "", + "Create Note": "创建笔记", + "Create your first note by clicking on the plus button below.": "单击下面的加号按钮创建您的第一个笔记。", "Created at": "创建于", "Created At": "创建于", "Created by": "作者", @@ -308,7 +308,7 @@ "Delete function?": "删除函数?", "Delete Message": "删除消息", "Delete message?": "删除消息?", - "Delete note?": "", + "Delete note?": "删除笔记?", "Delete prompt?": "删除提示词?", "delete this link": "此处删除这个链接", "Delete tool?": "删除工具?", @@ -364,7 +364,7 @@ "Download Database": "下载数据库", "Drag and drop a file to upload or select a file to view": "拖动文件上传或选择文件查看", "Draw": "平局", - "Drop any files here to upload": "", + "Drop any files here to upload": "将任何文件拖放到此处进行上传", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "例如 '30s','10m'。有效的时间单位是秒:'s',分:'m',时:'h'。", "e.g. \"json\" or a JSON schema": "例如 \"json\" 或一个 JSON schema", "e.g. 60": "例如 '60'", @@ -374,7 +374,7 @@ "e.g. my_filter": "例如:my_filter", "e.g. my_tools": "例如:my_tools", "e.g. Tools for performing various operations": "例如:用于执行各种操作的工具", - "e.g., 3, 4, 5 (leave blank for default)": "", + "e.g., 3, 4, 5 (leave blank for default)": "例如:3、4、5(留空为默认值)", "e.g., en-US,ja-JP (leave blank for auto-detect)": "例如,'en-US,ja-JP'(留空以便自动检测)", "e.g., westus (leave blank for eastus)": "", "Edit": "编辑", @@ -406,7 +406,7 @@ "Enabled": "启用", "Endpoint URL": "", "Enforce Temporary Chat": "强制临时聊天", - "Enhance": "", + "Enhance": "增强", "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": "输入一个关于你自己的详细信息,方便你的大语言模型记住这些内容", @@ -423,8 +423,8 @@ "Enter Chunk Size": "输入块大小 (Chunk Size)", "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "输入以逗号分隔的“token:bias_value”对(例如:5432:100, 413:-100)", "Enter description": "输入简介描述", - "Enter Docling OCR Engine": "", - "Enter Docling OCR Language(s)": "", + "Enter Docling OCR Engine": "输入 Docling OCR Engine", + "Enter Docling OCR Language(s)": "输入 Docling OCR 语言", "Enter Docling Server URL": "输入 Docling 服务器 URL", "Enter Document Intelligence Endpoint": "输入 Document Intelligence 端点", "Enter Document Intelligence Key": "输入 Document Intelligence 密钥", @@ -451,7 +451,7 @@ "Enter Model ID": "输入模型 ID", "Enter model tag (e.g. {{modelTag}})": "输入模型标签 (例如:{{modelTag}})", "Enter Mojeek Search API Key": "输入 Mojeek Search API 密钥", - "Enter New Password": "", + "Enter New Password": "输入新密码", "Enter Number of Steps (e.g. 50)": "输入步骤数 (Steps) (例如:50)", "Enter Perplexity API Key": "输入 Perplexity API 密钥", "Enter Playwright Timeout": "输入 Playwright 超时时间", @@ -488,15 +488,15 @@ "Enter Top K Reranker": "输入 Top K Reranker", "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 Yacy Password": "", - "Enter Yacy URL (e.g. http://yacy.example.com:8090)": "", - "Enter Yacy Username": "", + "Enter Yacy Password": "输入 Yacy 密码", + "Enter Yacy URL (e.g. http://yacy.example.com:8090)": "输入 Yacy URL(例如:http://yacy.example.com:8090)", + "Enter Yacy Username": "输入 Yacy 用户名", "Enter your current password": "输入当前密码", "Enter Your Email": "输入您的电子邮箱", "Enter Your Full Name": "输入您的名称", "Enter your message": "输入您的消息", "Enter your name": "输入您的名称", - "Enter Your Name": "", + "Enter Your Name": "输入你的名称", "Enter your new password": "输入新的密码", "Enter Your Password": "输入您的密码", "Enter Your Role": "输入您的权限组", @@ -505,8 +505,8 @@ "Error": "错误", "ERROR": "错误", "Error accessing Google Drive: {{error}}": "访问 Google 云端硬盘 出错: {{error}}", - "Error accessing media devices.": "", - "Error starting recording.": "", + "Error accessing media devices.": "访问媒体设备时出错。", + "Error starting recording.": "开始录制时出错。", "Error uploading file: {{error}}": "上传文件时出错: {{error}}", "Evaluations": "竞技场评估", "Exa API Key": "Exa API 密钥", @@ -545,7 +545,7 @@ "Failed to add file.": "添加文件失败。", "Failed to connect to {{URL}} OpenAPI tool server": "无法连接到 {{URL}} OpenAPI 工具服务器", "Failed to create API Key.": "无法创建 API 密钥。", - "Failed to delete note": "", + "Failed to delete note": "删除笔记失败", "Failed to fetch models": "无法获取模型", "Failed to load file content.": "无法加载文件内容。", "Failed to read clipboard contents": "无法读取剪贴板内容", @@ -603,12 +603,12 @@ "Gemini API Config": "Gemini API 配置", "Gemini API Key is required.": "需要 Gemini API 密钥。", "General": "通用", - "Generate": "", + "Generate": "生成", "Generate an image": "生成图像", "Generate Image": "生成图像", "Generate prompt pair": "生成提示对", "Generating search query": "生成搜索查询", - "Generating...": "", + "Generating...": "生成中...", "Get started": "开始使用", "Get started with {{WEBUI_NAME}}": "开始使用 {{WEBUI_NAME}}", "Global": "全局", @@ -655,7 +655,7 @@ "Import Config from JSON File": "导入 JSON 文件中的配置信息", "Import Functions": "导入函数", "Import Models": "导入模型", - "Import Notes": "", + "Import Notes": "导入笔记", "Import Presets": "导入预设", "Import Prompts": "导入提示词", "Import Tools": "导入工具", @@ -670,7 +670,7 @@ "Instant Auto-Send After Voice Transcription": "语音转录文字后即时自动发送", "Integration": "集成", "Interface": "界面", - "Invalid file content": "", + "Invalid file content": "无效的文件内容", "Invalid file format.": "无效文件格式。", "Invalid JSON schema": "无效的 JSON schema", "Invalid Tag": "无效标签", @@ -741,7 +741,7 @@ "Manage Pipelines": "管理 Pipeline", "Manage Tool Servers": "管理工具服务器", "March": "三月", - "Max Speakers": "", + "Max Speakers": "最大扬声器数量", "Max Tokens (num_predict)": "最大 Token 数量 (num_predict)", "Max Upload Count": "最大上传数量", "Max Upload Size": "最大上传大小", @@ -793,16 +793,16 @@ "Mojeek Search API Key": "Mojeek Search API 密钥", "more": "更多", "More": "更多", - "My Notes": "", + "My Notes": "我的笔记", "Name": "名称", "Name your knowledge base": "为您的知识库命名", "Native": "原生", "New Chat": "新对话", "New Folder": "新文件夹", - "New Note": "", + "New Note": "新笔记", "New Password": "新密码", "new-channel": "新频道", - "No content": "", + "No content": "没有内容", "No content found": "未发现内容", "No content found in file.": "文件中未找到内容", "No content to speak": "没有内容可朗读", @@ -817,7 +817,7 @@ "No model IDs": "没有模型 ID", "No models found": "未找到任何模型", "No models selected": "未选择任何模型", - "No Notes": "", + "No Notes": "没有笔记", "No results found": "未找到结果", "No search query generated": "未生成搜索查询", "No source available": "没有可用来源", @@ -826,7 +826,7 @@ "None": "无", "Not factually correct": "事实并非如此", "Not helpful": "无帮助", - "Note deleted successfully": "", + "Note deleted successfully": "笔记删除成功", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "注意:如果设置了最低分数,搜索只会返回分数大于或等于最低分数的文档。", "Notes": "笔记", "Notification Sound": "通知提示音", @@ -849,7 +849,7 @@ "Only alphanumeric characters and hyphens are allowed": "只允许使用英文字母,数字 (0-9) 以及连字符 (-)", "Only alphanumeric characters and hyphens are allowed in the command string.": "命令字符串中只允许使用英文字母,数字 (0-9) 以及连字符 (-)。", "Only collections can be edited, create a new knowledge base to edit/add documents.": "只能编辑文件集,创建一个新的知识库来编辑/添加文件。", - "Only markdown files are allowed": "", + "Only markdown files are allowed": "仅允许使用 markdown 文件", "Only select users and groups with permission can access": "只有具有权限的用户和组才能访问", "Oops! Looks like the URL is invalid. Please double-check and try again.": "此链接似乎为无效链接。请检查后重试。", "Oops! There are files still uploading. Please wait for the upload to complete.": "稍等!还有文件正在上传。请等待上传完成。", @@ -895,8 +895,8 @@ "Pipelines": "Pipeline", "Pipelines Not Detected": "未检测到 Pipeline", "Pipelines Valves": "Pipeline 值", - "Plain text (.md)": "", - "Plain text (.txt)": "TXT 文档 (.txt)", + "Plain text (.md)": "纯文本文档(.md)", + "Plain text (.txt)": "纯文本文档 (.txt)", "Playground": "AI 对话游乐场", "Playwright Timeout (ms)": "Playwright 超时时间 (ms)", "Playwright WebSocket URL": "Playwright WebSocket URL", @@ -938,7 +938,7 @@ "Read": "只读", "Read Aloud": "朗读", "Reasoning Effort": "推理努力", - "Record": "", + "Record": "录制", "Record voice": "录音", "Redirecting you to Open WebUI Community": "正在将您重定向到 OpenWebUI 社区", "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.": "降低生成无意义内容的概率。较高的值(如100)将产生更多样化的回答,而较低的值(如10)则更加保守。", @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "重复惩罚 (Ollama)", "Reply in Thread": "在主题中回复", "Request Mode": "请求模式", + "Reranking Engine": "", "Reranking Model": "重排模型", - "Reranking model disabled": "重排模型已禁用", - "Reranking model set to \"{{reranking_model}}\"": "重排模型设置为 \"{{reranking_model}}\"", "Reset": "重置", "Reset All Models": "重置所有模型", "Reset Upload Directory": "重置上传目录", @@ -1008,7 +1007,7 @@ "Searched {{count}} sites": "已搜索 {{count}} 个网站", "Searching \"{{searchQuery}}\"": "搜索 \"{{searchQuery}}\" 中", "Searching Knowledge for \"{{searchQuery}}\"": "检索有关 \"{{searchQuery}}\" 的知识中", - "Searching the web...": "", + "Searching the web...": "正在搜索网络...", "Searxng Query URL": "Searxng 查询 URL", "See readme.md for instructions": "查看 readme.md 以获取说明", "See what's new": "查阅最新更新内容", @@ -1069,6 +1068,8 @@ "Show": "显示", "Show \"What's New\" modal on login": "在登录时显示“更新内容”弹窗", "Show Admin Details in Account Pending Overlay": "在用户待激活界面中显示管理员邮箱等详细信息", + "Show All": "", + "Show Less": "", "Show Model": "显示模型", "Show shortcuts": "显示快捷方式", "Show your support!": "表达你的支持!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "以流式返回对话响应", "STT Model": "语音转文本模型", "STT Settings": "语音转文本设置", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "副标题(例如:关于罗马帝国的副标题)", "Success": "成功", "Successfully updated.": "成功更新。", @@ -1211,7 +1213,7 @@ "Unpin": "取消置顶", "Unravel secrets": "解开秘密", "Untagged": "无标签", - "Untitled": "", + "Untitled": "无标题", "Update": "更新", "Update and Copy Link": "更新和复制链接", "Update for the latest features and improvements.": "更新来获得最新功能与改进。", @@ -1222,7 +1224,7 @@ "Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "升级到授权计划以获得增强功能,包括自定义主题与品牌以及专属支持。", "Upload": "上传", "Upload a GGUF model": "上传一个 GGUF 模型", - "Upload Audio": "", + "Upload Audio": "上传音频", "Upload directory": "上传目录", "Upload files": "上传文件", "Upload Files": "上传文件", @@ -1296,9 +1298,9 @@ "Write a summary in 50 words that summarizes [topic or keyword].": "用 50 个字写一个总结 [主题或关键词]。", "Write something...": "单击以键入内容...", "Write your model template content here": "在此写入模型模板内容", - "Yacy Instance URL": "", - "Yacy Password": "", - "Yacy Username": "", + "Yacy Instance URL": "Yacy Instance URL", + "Yacy Password": "Yacy 密码", + "Yacy Username": "Yacy 用户名", "Yesterday": "昨天", "You": "你", "You are currently using a trial license. Please contact support to upgrade your license.": "当前为试用许可证,请联系支持人员升级许可证。", diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index 6ca49ce76..5246307c9 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -959,9 +959,8 @@ "Repeat Penalty (Ollama)": "重複懲罰 (Ollama)", "Reply in Thread": "在討論串中回覆", "Request Mode": "請求模式", + "Reranking Engine": "", "Reranking Model": "重新排序模型", - "Reranking model disabled": "已停用重新排序模型", - "Reranking model set to \"{{reranking_model}}\"": "重新排序模型已設定為 \"{{reranking_model}}\"", "Reset": "重設", "Reset All Models": "重設所有模型", "Reset Upload Directory": "重設上傳目錄", @@ -1069,6 +1068,8 @@ "Show": "顯示", "Show \"What's New\" modal on login": "登入時顯示「新功能」對話框", "Show Admin Details in Account Pending Overlay": "在帳號待審覆蓋層中顯示管理員詳細資訊", + "Show All": "", + "Show Less": "", "Show Model": "顯示模型", "Show shortcuts": "顯示快捷鍵", "Show your support!": "表達您的支持!", @@ -1092,6 +1093,7 @@ "Stream Chat Response": "串流式對話回應", "STT Model": "語音轉文字 (STT) 模型", "STT Settings": "語音轉文字 (STT) 設定", + "Stylized PDF Export": "", "Subtitle (e.g. about the Roman Empire)": "副標題(例如:關於羅馬帝國)", "Success": "成功", "Successfully updated.": "更新成功。", diff --git a/src/lib/utils/marked/katex-extension.ts b/src/lib/utils/marked/katex-extension.ts index f679a6b22..02a52b651 100644 --- a/src/lib/utils/marked/katex-extension.ts +++ b/src/lib/utils/marked/katex-extension.ts @@ -10,6 +10,10 @@ const DELIMITER_LIST = [ { left: '\\begin{equation}', right: '\\end{equation}', display: true } ]; +// Defines characters that are allowed to immediately precede or follow a math delimiter. +const ALLOWED_SURROUNDING_CHARS = + '\\s?。,、;!-\\/:-@\\[-`{-~\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}\\p{Script=Hangul}'; + // const DELIMITER_LIST = [ // { left: '$$', right: '$$', display: false }, // { left: '$', right: '$', display: false }, @@ -44,10 +48,13 @@ function generateRegexRules(delimiters) { // Math formulas can end in special characters const inlineRule = new RegExp( - `^(${inlinePatterns.join('|')})(?=[\\s?。,!-\/:-@[-\`{-~]|$)`, + `^(${inlinePatterns.join('|')})(?=[${ALLOWED_SURROUNDING_CHARS}]|$)`, + 'u' + ); + const blockRule = new RegExp( + `^(${blockPatterns.join('|')})(?=[${ALLOWED_SURROUNDING_CHARS}]|$)`, 'u' ); - const blockRule = new RegExp(`^(${blockPatterns.join('|')})(?=[\\s?。,!-\/:-@[-\`{-~]|$)`, 'u'); return { inlineRule, blockRule }; } @@ -91,7 +98,9 @@ function katexStart(src, displayMode: boolean) { // Check if the delimiter is preceded by a special character. // If it does, then it's potentially a math formula. - const f = index === 0 || indexSrc.charAt(index - 1).match(/[\s?。,!-\/:-@[-`{-~]/); + const f = + index === 0 || + indexSrc.charAt(index - 1).match(new RegExp(`[${ALLOWED_SURROUNDING_CHARS}]`, 'u')); if (f) { const possibleKatex = indexSrc.substring(index); diff --git a/src/lib/utils/onedrive-file-picker.ts b/src/lib/utils/onedrive-file-picker.ts index 180840524..7840ee869 100644 --- a/src/lib/utils/onedrive-file-picker.ts +++ b/src/lib/utils/onedrive-file-picker.ts @@ -6,6 +6,7 @@ class OneDriveConfig { private static instance: OneDriveConfig; private clientId: string = ''; private sharepointUrl: string = ''; + private sharepointTenantId: string = ''; private msalInstance: PublicClientApplication | null = null; private currentAuthorityType: 'personal' | 'organizations' = 'personal'; @@ -48,6 +49,7 @@ class OneDriveConfig { const newClientId = config.onedrive?.client_id; const newSharepointUrl = config.onedrive?.sharepoint_url; + const newSharepointTenantId = config.onedrive?.sharepoint_tenant_id; if (!newClientId) { throw new Error('OneDrive configuration is incomplete'); @@ -55,6 +57,7 @@ class OneDriveConfig { this.clientId = newClientId; this.sharepointUrl = newSharepointUrl; + this.sharepointTenantId = newSharepointTenantId; } public async getMsalInstance( @@ -64,7 +67,9 @@ class OneDriveConfig { if (!this.msalInstance) { const authorityEndpoint = - this.currentAuthorityType === 'organizations' ? 'common' : 'consumers'; + this.currentAuthorityType === 'organizations' + ? this.sharepointTenantId || 'common' + : 'consumers'; const msalParams = { auth: { authority: `https://login.microsoftonline.com/${authorityEndpoint}`, @@ -89,6 +94,10 @@ class OneDriveConfig { return this.sharepointUrl; } + public getSharepointTenantId(): string { + return this.sharepointTenantId; + } + public getBaseUrl(): string { if (this.currentAuthorityType === 'organizations') { if (!this.sharepointUrl || this.sharepointUrl === '') { diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 04debfac5..31bb6e884 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -48,7 +48,6 @@ import NotificationToast from '$lib/components/NotificationToast.svelte'; import AppSidebar from '$lib/components/app/AppSidebar.svelte'; import { chatCompletion } from '$lib/apis/openai'; - import { setupSocket } from '$lib/utils/websocket'; setContext('i18n', i18n); @@ -59,6 +58,53 @@ const BREAKPOINT = 768; + const setupSocket = async (enableWebsocket) => { + const _socket = io(`${WEBUI_BASE_URL}` || undefined, { + reconnection: true, + reconnectionDelay: 1000, + reconnectionDelayMax: 5000, + randomizationFactor: 0.5, + path: '/ws/socket.io', + transports: enableWebsocket ? ['websocket'] : ['polling', 'websocket'], + auth: { token: localStorage.token } + }); + + await socket.set(_socket); + + _socket.on('connect_error', (err) => { + console.log('connect_error', err); + }); + + _socket.on('connect', () => { + console.log('connected', _socket.id); + }); + + _socket.on('reconnect_attempt', (attempt) => { + console.log('reconnect_attempt', attempt); + }); + + _socket.on('reconnect_failed', () => { + console.log('reconnect_failed'); + }); + + _socket.on('disconnect', (reason, details) => { + console.log(`Socket ${_socket.id} disconnected due to ${reason}`); + if (details) { + console.log('Additional details:', details); + } + }); + + _socket.on('user-list', (data) => { + console.log('user-list', data); + activeUserIds.set(data.user_ids); + }); + + _socket.on('usage', (data) => { + console.log('usage', data); + USAGE_POOL.set(data['models']); + }); + }; + const executePythonAsWorker = async (id, code, cb) => { let result = null; let stdout = null; @@ -515,6 +561,8 @@ await WEBUI_NAME.set(backendConfig.name); if ($config) { + await setupSocket($config.features?.enable_websocket ?? true); + const currentUrl = `${window.location.pathname}${window.location.search}`; const encodedUrl = encodeURIComponent(currentUrl); @@ -526,7 +574,6 @@ }); if (sessionUser) { - await setupSocket($config.features?.enable_websocket ?? true); // Save Session User to Store $socket.emit('user-join', { auth: { token: sessionUser.token } }); diff --git a/src/routes/auth/+page.svelte b/src/routes/auth/+page.svelte index fc7e4c53a..019b713b1 100644 --- a/src/routes/auth/+page.svelte +++ b/src/routes/auth/+page.svelte @@ -12,7 +12,6 @@ import { WEBUI_NAME, config, user, socket } from '$lib/stores'; import { generateInitialsImage, canvasPixelTest } from '$lib/utils'; - import { setupSocket } from '$lib/utils/websocket'; import Spinner from '$lib/components/common/Spinner.svelte'; import OnBoarding from '$lib/components/OnBoarding.svelte'; @@ -42,10 +41,6 @@ if (sessionUser.token) { localStorage.token = sessionUser.token; } - if (!$socket) { - await setupSocket($config.features?.enable_websocket ?? true); - } - $socket.emit('user-join', { auth: { token: sessionUser.token } }); await user.set(sessionUser); await config.set(await getBackendConfig()); @@ -188,7 +183,7 @@ crossorigin="anonymous" src="{WEBUI_BASE_URL}/static/splash.png" class=" w-6 rounded-full" - alt="logo" + alt="" />
@@ -235,7 +230,7 @@
{#if $config?.onboarding ?? false} -
+
ⓘ {$WEBUI_NAME} {$i18n.t( 'does not make any external connections, and your data stays securely on your locally hosted server.' @@ -248,10 +243,13 @@
{#if mode === 'signup'}
-
{$i18n.t('Name')}
+ -
{$i18n.t('Username')}
+
{:else}
-
{$i18n.t('Email')}
+ -
{$i18n.t('Password')}
- +