From 7e224e4a536b07ec008613f06592e34050e7067c Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 13 Feb 2026 18:26:03 -0600 Subject: [PATCH 01/59] refac --- backend/open_webui/models/oauth_sessions.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/models/oauth_sessions.py b/backend/open_webui/models/oauth_sessions.py index f7ee5cceb8..538937483f 100644 --- a/backend/open_webui/models/oauth_sessions.py +++ b/backend/open_webui/models/oauth_sessions.py @@ -102,7 +102,7 @@ def _decrypt_token(self, token: str): decrypted = self.fernet.decrypt(token.encode()).decode() return json.loads(decrypted) except Exception as e: - log.error(f"Error decrypting tokens: {e}") + log.error(f"Error decrypting tokens: {type(e).__name__}: {e}") raise def create_session( @@ -209,8 +209,15 @@ def get_sessions_by_user_id( results = [] for session in sessions: - session.token = self._decrypt_token(session.token) - results.append(OAuthSessionModel.model_validate(session)) + try: + session.token = self._decrypt_token(session.token) + results.append(OAuthSessionModel.model_validate(session)) + except Exception as e: + log.warning( + f"Skipping OAuth session {session.id} due to decryption failure, deleting corrupted session: {type(e).__name__}: {e}" + ) + db.query(OAuthSession).filter_by(id=session.id).delete() + db.commit() return results From 393c0071dc612c5ac982fb37dfc0288cb9911439 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 14 Feb 2026 19:22:17 -0600 Subject: [PATCH 02/59] refac: manual skill invocation --- backend/open_webui/utils/middleware.py | 33 +++++++++++++++++--------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 3354889e7e..2879433269 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -2136,11 +2136,11 @@ async def process_chat_payload(request, form_data, user, metadata, model): tool_ids = form_data.pop("tool_ids", None) files = form_data.pop("files", None) - # Skills: inject manifest only — model uses view_skill tool to load full content on-demand - user_skill_ids = form_data.pop("skill_ids", None) or [] - model_skill_ids = model.get("info", {}).get("meta", {}).get("skillIds", []) + # Skills + user_skill_ids = set(form_data.pop("skill_ids", None) or []) + model_skill_ids = set(model.get("info", {}).get("meta", {}).get("skillIds", [])) - all_skill_ids = list(set(user_skill_ids + model_skill_ids)) + all_skill_ids = user_skill_ids | model_skill_ids available_skills = [] if all_skill_ids: from open_webui.models.skills import Skills as SkillsModel @@ -2156,13 +2156,24 @@ async def process_chat_payload(request, form_data, user, metadata, model): and s.is_active ] - if available_skills: - manifest = "\n" - for skill in available_skills: - manifest += f"\n{skill.name}\n{skill.description or ''}\n\n" - manifest += "" + skill_descriptions = "" + for skill in available_skills: + if skill.id in user_skill_ids: + # User-selected: inject full content + form_data["messages"] = add_or_update_system_message( + f"\n{skill.content}\n", + form_data["messages"], + append=True, + ) + else: + # Model-attached: name+description only + skill_descriptions += f"\n{skill.name}\n{skill.description or ''}\n\n" + + if skill_descriptions: form_data["messages"] = add_or_update_system_message( - manifest, form_data["messages"], append=True + f"\n{skill_descriptions}", + form_data["messages"], + append=True, ) prompt = get_last_user_message(form_data["messages"]) @@ -2399,7 +2410,7 @@ async def tool_function(**kwargs): { **extra_params, "__event_emitter__": event_emitter, - "__skill_ids__": [s.id for s in available_skills], + "__skill_ids__": [s.id for s in available_skills if s.id not in user_skill_ids], }, features, model, From 9a2595f0706d0c9d809ae7746001cf799f98db1d Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 14 Feb 2026 22:26:03 -0600 Subject: [PATCH 03/59] fix: task models issue --- src/lib/components/admin/Settings/Interface.svelte | 4 ++-- src/lib/components/admin/Settings/Models.svelte | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/components/admin/Settings/Interface.svelte b/src/lib/components/admin/Settings/Interface.svelte index acd5fbf67c..397306d902 100644 --- a/src/lib/components/admin/Settings/Interface.svelte +++ b/src/lib/components/admin/Settings/Interface.svelte @@ -152,7 +152,7 @@ if (taskConfig.TASK_MODEL) { const model = models.find((m) => m.id === taskConfig.TASK_MODEL); if (model) { - if (model?.access_control !== null) { + if (model?.access_grants && !model.access_grants.some((g) => g.principal_type === 'user' && g.principal_id === '*' && g.permission === 'read')) { toast.error( $i18n.t( 'This model is not publicly available. Please select another model.' @@ -187,7 +187,7 @@ if (taskConfig.TASK_MODEL_EXTERNAL) { const model = models.find((m) => m.id === taskConfig.TASK_MODEL_EXTERNAL); if (model) { - if (model?.access_control !== null) { + if (model?.access_grants && !model.access_grants.some((g) => g.principal_type === 'user' && g.principal_id === '*' && g.permission === 'read')) { toast.error( $i18n.t( 'This model is not publicly available. Please select another model.' diff --git a/src/lib/components/admin/Settings/Models.svelte b/src/lib/components/admin/Settings/Models.svelte index 2762d3a112..9270db5c6c 100644 --- a/src/lib/components/admin/Settings/Models.svelte +++ b/src/lib/components/admin/Settings/Models.svelte @@ -160,7 +160,7 @@ name: model.name, base_model_id: null, params: {}, - access_control: {}, + access_grants: [], ...model }).catch((error) => { return null; @@ -188,7 +188,7 @@ base_model_id: null, meta: {}, params: {}, - access_control: {}, + access_grants: [], is_active: model.is_active }).catch((error) => { return null; From ce51c481b856fef2571351f39130724973e8cd71 Mon Sep 17 00:00:00 2001 From: _00_ <131402327+rgaricano@users.noreply.github.com> Date: Sun, 15 Feb 2026 23:05:45 +0100 Subject: [PATCH 04/59] upd:i18n: Spanish Translation Update v.0.8.0 (#21427) ### Spanish Translation Update v.0.8.0 - Added new strings --- src/lib/i18n/locales/es-ES/translation.json | 260 ++++++++++---------- 1 file changed, 130 insertions(+), 130 deletions(-) diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index 1e4e43ac47..73b979dd32 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -35,7 +35,7 @@ "Accept Autocomplete Generation\nJump to Prompt Variable": "Aceptar Generar Autocompletado\nIr a la Configuración de este Indicador", "Access": "Acceso", "Access Control": "Control de Acceso", - "Access List": "", + "Access List": "Lista de Acceso", "Accessible to all users": "Accesible para todos los usuarios", "Account": "Cuenta", "Account Activation Pending": "Activación de cuenta Pendiente", @@ -53,8 +53,8 @@ "Add a model ID": "Añadir un ID de modelo", "Add a short description about what this model does": "Añadir una breve descripción sobre lo que hace este modelo", "Add a tag": "Añadir una etiqueta", - "Add a tag...": "", - "Add Access": "", + "Add a tag...": "Añadir una etiqueta...", + "Add Access": "Añador Acceso", "Add Arena Model": "Añadir modelo a la Arena", "Add Connection": "Añadir Conexión", "Add Content": "Añadir Contenido", @@ -63,13 +63,13 @@ "Add Custom Prompt": "Añadir Indicador Personalizado", "Add Details": "Añadir Detalles", "Add Files": "Añadir Archivos", - "Add Image": "", + "Add Image": "Añadir Imagen", "Add Member": "Añadir Miembro", "Add Members": "Añadir Miembros", "Add Memory": "Añadir Memoria", "Add Model": "Añadir Modelo", "Add Reaction": "Añadir Reacción", - "Add tag": "", + "Add tag": "Añadir Etiqueta", "Add Tag": "Añadir etiqueta", "Add text content": "Añade contenido de texto", "Add User": "Añadir Usuario", @@ -94,7 +94,7 @@ "All": "Todos", "All chats have been unarchived.": "Todos los chats han sido desarchivados", "All models deleted successfully": "Todos los modelos borrados correctamente", - "All Users": "", + "All Users": "Todos los Usuarios", "Allow Call": "Permitir Llamada", "Allow Chat Controls": "Permitir Controles del Chat", "Allow Chat Delete": "Permitir Borrar Chat", @@ -145,7 +145,7 @@ "API Keys": "Claves AI", "API Mode": "Modo de API", "API Timeout": "API Timeout", - "API Type": "", + "API Type": "Tipo de API", "API Version": "Versión API", "API Version is required": "La Versión API es requerida", "Application DN": "Aplicacion DN", @@ -153,18 +153,18 @@ "applies to all users with the \"user\" role": "se aplica a todos los usuarios con el rol \"user\" ", "April": "Abril", "Archive": "Archivar", - "Archive All": "", + "Archive All": "Arcbhivar Todos", "Archive All Chats": "Archivar Todos los Chats", "Archived Chats": "Chats archivados", "archived-chat-export": "exportar chats archivados", - "Are you sure you want to archive all chats? This action cannot be undone.": "", - "Are you sure you want to clear all memories? This action cannot be undone.": "¿Segur@ de que quieres borrar todas las memorias? (¡esta acción NO se puede deshacer!)", - "Are you sure you want to delete \"{{NAME}}\"?": "¿Segur@ de que quieres eliminar \"{{NAME}}\"?", - "Are you sure you want to delete all chats? This action cannot be undone.": "", - "Are you sure you want to delete this channel?": "¿Segur@ de que quieres eliminar este canal?", - "Are you sure you want to delete this message?": "¿Segur@ de que quieres eliminar este mensaje? ", - "Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "", - "Are you sure you want to unarchive all archived chats?": "¿Segur@ de que quieres desarchivar todos los chats archivados?", + "Are you sure you want to archive all chats? This action cannot be undone.": "¿Seguro que quieres archivar todos los chats? Esta acción no se puede deshacer.", + "Are you sure you want to clear all memories? This action cannot be undone.": "¿Seguro de que quieres borrar todas las memorias? (¡esta acción NO se puede deshacer!)", + "Are you sure you want to delete \"{{NAME}}\"?": "¿Seguro de que quieres eliminar \"{{NAME}}\"?", + "Are you sure you want to delete all chats? This action cannot be undone.": "¿Seguro que quieres borrar todos los chats? Esta acción no se puede deshacer.", + "Are you sure you want to delete this channel?": "¿Seguro de que quieres eliminar este canal?", + "Are you sure you want to delete this message?": "¿Seguro de que quieres eliminar este mensaje? ", + "Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "¿Seguro que desea eliminar esta versión? Las versiones secundarias se vincularán a la versión principal de esta.", + "Are you sure you want to unarchive all archived chats?": "¿Seguro de que quieres desarchivar todos los chats archivados?", "Arena Models": "Arena de Modelos", "Artifacts": "Artefactos", "Asc": "Asc", @@ -224,7 +224,7 @@ "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Impulsando o penalizando tokens específicos para respuestas restringidas. Los valores de sesgo se limitarán entre -100 y 100 (inclusive). (Por defecto: ninguno)", "Brave": "Brave", "Brave Search API Key": "Clave API de Brave Search", - "Browse and query knowledge bases": "", + "Browse and query knowledge bases": "Explorar y consultar bases de conocimiento", "Builtin Tools": "Herramientas Integradas", "Bullet List": "Lista de Viñetas", "Button ID": "ID del Botón", @@ -241,7 +241,7 @@ "Camera": "Cámara", "Cancel": "Cancelar", "Cannot create an empty note.": "No se puede crear una nota vacía.", - "Cannot delete the production version": "", + "Cannot delete the production version": "No se puede borrar la versión de producción", "Capabilities": "Capacidades", "Capture": "Captura", "Capture Audio": "Capturar Audio", @@ -261,19 +261,19 @@ "Chat": "Chat", "Chat Background Image": "Imágen de Fondo del Chat", "Chat Bubble UI": "Interfaz del Chat en Burbuja", - "Chat Completions": "", + "Chat Completions": "Completación del Chat", "Chat Controls": "Controles del Chat", "Chat Conversation": "Conversación del Chat", "Chat direction": "Dirección del Chat", - "Chat exported successfully": "", - "Chat History": "", + "Chat exported successfully": "Chat exportado correctmente", + "Chat History": "Historial del Chat", "Chat ID": "ID del Chat", "Chat moved successfully": "Chat movido correctamente", "Chat Overview": "Vista General del Chat", "Chat Permissions": "Permisos del Chat", "Chat Tags Auto-Generation": "AutoGeneración de Etiquetas de Chat", - "Chat unshared successfully.": "", - "chats": "", + "Chat unshared successfully.": "Chat descompartido correctamente", + "chats": "chats", "Chats": "Chats", "Check Again": "Verifica de nuevo", "Check for updates": "Buscar actualizaciones", @@ -302,7 +302,7 @@ "Click here to upload a workflow.json file.": "Pulsa aquí para subir un archivo workflow.json", "click here.": "Pulsa aquí.", "Click on the user role button to change a user's role.": "Pulsa en el botón rol de usuario para cambiar su rol.", - "Click to copy ID": "", + "Click to copy ID": "Pulsa para copiar ID", "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permisos de escritura del portapapeles denegado. Por favor, comprueba la configuración de tu navegador para otorgar el permiso necesario.", "Clone": "Clonar", "Clone Chat": "Clonar Chat", @@ -338,11 +338,11 @@ "ComfyUI Workflow": "Flujo de Trabajo de ComfyUI", "ComfyUI Workflow Nodes": "Nodos del Flujo de Trabajo de ComfyUI", "Comma separated Node Ids (e.g. 1 or 1,2)": "IDs de Nodo separados por comas (ej. 1 o 1,2)", - "command": "", + "command": "comando", "Command": "Comando", "Comment": "Comentario", - "Commit Message": "", - "Community Reviews": "", + "Commit Message": "Corregir Mensaje", + "Community Reviews": "Revisiones de la Comunidad", "Completions": "Cumplimientos", "Compress Images in Channels": "Comprimir Imágenes en Canales", "Concurrent Requests": "Número de Solicitudes Concurrentes", @@ -385,8 +385,8 @@ "Copy Last Response": "Copiar la última Respuesta", "Copy link": "Copiar Enlace", "Copy Link": "Copiar enlace", - "Copy Prompt": "", - "Copy Share Link": "", + "Copy Prompt": "Copiar Indicador", + "Copy Share Link": "Copiar Enlace Compartido", "Copy to clipboard": "Copia a portapapeles", "Copy URL": "Copiar URL", "Copying to clipboard was successful!": "¡La copia al portapapeles se ha realizado correctamente!", @@ -453,13 +453,13 @@ "Default User Role": "Rol predeterminado de los nuevos usuarios", "Delete": "Borrar", "Delete a model": "Borrar un modelo", - "Delete All": "", + "Delete All": "Borrar Todo", "Delete All Chats": "Borrar todos los chats", "Delete all contents inside this folder": "Borrar todo el contenido de esta carpeta", "Delete All Models": "Borrar todos los modelos", "Delete Chat": "Borrar Chat", "Delete chat?": "¿Borrar el chat?", - "Delete File": "", + "Delete File": "Borrar Fichero", "Delete folder?": "¿Borrar carpeta?", "Delete function?": "Borrar la función?", "Delete Message": "Borrar mensaje", @@ -467,20 +467,20 @@ "Delete Model": "Borrar Modelo", "Delete note?": "¿Borrar nota?", "Delete prompt?": "¿Borrar el indicador?", - "Delete skill?": "", + "Delete skill?": "¿Borrar habilidades?", "delete this link": "Borrar este enlace", "Delete tool?": "¿Borrar la herramienta?", "Delete User": "Borrar Usuario", - "Delete Version": "", + "Delete Version": "Borrar Versión", "Deleted": "Borrado", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} Borrado", "Deleted {{name}}": "{{nombre}} Borrado", "Deleted User": "Usuario Borrado", "Deployment names are required for Azure OpenAI": "Azure OpenAI requiere nombres de implementación", "Desc": "Desc", - "Describe the edit...": "", - "Describe the image...": "", - "Describe what changed...": "", + "Describe the edit...": "Describe la edición...", + "Describe the image...": "Describe la Imagen...", + "Describe what changed...": "Describe lo cambiado...", "Describe your knowledge base and objectives": "Describe tu Base de Conocimientos y sus objetivos", "Description": "Descripción", "Detect Artifacts Automatically": "Detectar Artefactos Automáticamente", @@ -492,7 +492,7 @@ "Direct Message": "Mensaje Directo", "Direct Tool Servers": "Servidores de Herramientas Directos", "Directory selection was cancelled": "La selección de directorio ha sido cancelada", - "Disable All": "", + "Disable All": "Deshabilitar Todo", "Disable Code Interpreter": "Deshabilitar Interprete de Código", "Disable Image Extraction": "Deshabilitar Extracción de Imágenes", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Desabilita la extracción de imágenes del pdf. Si está habilitado Usar LLM las imágenes se capturan automáticamente. Por defecto el valor es Falso (las imágenes se extraen).", @@ -552,15 +552,15 @@ "e.g. A filter to remove profanity from text": "p.ej. Un filtro para eliminar malas palabras del texto", "e.g. about the Roman Empire": "p.ej. sobre el imperio romano", "e.g. alloy, echo, shimmer": "p.ej. aleación, eco, brillo", - "e.g. Code Review Guidelines": "", - "e.g. code-review-guidelines": "", + "e.g. Code Review Guidelines": "p.ej. Directrices de Revisión de Código", + "e.g. code-review-guidelines": "p.ej. directrices-revisión-código", "e.g. en": "p.ej. es", "e.g. My Filter": "p.ej. Mi Filtro", "e.g. My Tools": "p.ej. Mis Herramientas", "e.g. my_filter": "p.ej. mi_filtro", "e.g. my_tools": "p.ej. mis_herramientas", "e.g. pdf, docx, txt": "p.ej. pdf, docx, txt ...", - "e.g. Step-by-step instructions for code reviews": "", + "e.g. Step-by-step instructions for code reviews": "p.ej. Unstruciones paso a paso para revisión de código", "e.g. Tell me a fun fact": "p.ej. Dime algo divertido", "e.g. Tell me a fun fact about the Roman Empire": "p.ej. Dime algo divertido sobre el imperio romano", "e.g. Tools for performing various operations": "p.ej. Herramientas para realizar diversas operaciones", @@ -577,7 +577,7 @@ "Edit Image": "Editar Imagen", "Edit Last Message": "Editar Último Mensaje", "Edit Memory": "Editar Memoria", - "Edit Prompt": "", + "Edit Prompt": "Editar Indicador", "Edit User": "Editar Usuario", "Edit User Group": "Editar Grupo de Usuarios", "Edit workflow.json content": "Editar el contenido de workflow.json", @@ -592,15 +592,15 @@ "Embedding Batch Size": "Tamaño del Lote de Incrustación", "Embedding Model": "Modelo de Incrustación", "Embedding Model Engine": "Motor del Modelo de Incrustación", - "Enable All": "", - "Enable API Keys": "Activar Claves API", + "Enable All": "Habilitar Todo", + "Enable API Keys": "Habilitar Claves API", "Enable autocomplete generation for chat messages": "Habilitar generación de autocompletado para mensajes de chat", "Enable Code Execution": "Habilitar Ejecución de Código", "Enable Code Interpreter": "Habilitar Interprete de Código", "Enable Community Sharing": "Habilitar Compartir con la Comunidad", "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.": "Habilitar bloqueo de memoria (mlock) para prevenir que los datos del modelo se intercambien fuera de la RAM. Esta opción bloquea el conjunto de páginas de trabajo del modelo en RAM, asegurando que no se intercambiarán fuera a disco. Esto puede ayudar a mantener el rendimiento evitando fallos de página y asegurando un acceso rápido a los datos.", "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.": "Habilitar Mapeado de Memoria (mmap) para cargar datos del modelo. Esta opción permite al sistema usar el almacenamiento del disco como una extensión de la RAM al tratar los archivos en disco como si estuvieran en la RAM. Esto puede mejorar el rendimiento del modelo al permitir un acceso más rápido a los datos. Sin embargo, puede no funcionar correctamente con todos los sistemas y puede consumir una cantidad significativa de espacio en disco.", - "Enable Message Queue": "", + "Enable Message Queue": "Habilitar Cola de Mensajes", "Enable Message Rating": "Habilitar Calificación de los Mensajes", "Enable Mirostat sampling for controlling perplexity.": "Algoritmo de decodificación de texto neuronal que controla activamente el proceso generativo para mantener la perplejidad del texto generado en un valor deseado. Previene las trampas de aburrimiento (por excesivas repeticiones) y de incoherencia (por generación de excesivo texto).", "Enable New Sign Ups": "Habilitar Registros de Nuevos Usuarios", @@ -699,7 +699,7 @@ "Enter server host": "Ingresar host del servidor", "Enter server label": "Ingresar etiqueta del servidor", "Enter server port": "Ingresar puerto del servidor", - "Enter skill instructions in markdown...": "", + "Enter skill instructions in markdown...": "Ingresar instrucciones de la habilidad en markdown...", "Enter Sougou Search API sID": "Ingresar Sougou Search API sID", "Enter Sougou Search API SK": "Ingresar Sougou Search API SK", "Enter stop sequence": "Ingresar secuencia de parada", @@ -722,8 +722,8 @@ "Enter Yacy Password": "Ingresar Contraseña de Yacy", "Enter Yacy URL (e.g. http://yacy.example.com:8090)": "Ingresar URL de Yacy (p.ej. http://yacy.ejemplo.com:8090)", "Enter Yacy Username": "Ingresar Nombre de Usuario de Yacy", - "Enter Yandex Web Search API Key": "", - "Enter Yandex Web Search URL": "", + "Enter Yandex Web Search API Key": "Ingresar API de la Busqueda Web de Yandex", + "Enter Yandex Web Search URL": "Ingresar URL de la Busqueda Wev de Yandex", "Enter your code here...": "Introduce tu código aquí...", "Enter your current password": "Ingresa tu contraseña actual", "Enter Your Email": "Ingresa tu correo electrónico", @@ -757,7 +757,7 @@ "Example: sAMAccountName or uid or userPrincipalName": "Ejemplo: sAMNombreCuenta o uid o userNombrePrincipal", "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "Excedido el número de accesos de usuarios en tu licencia. Por favor, contacta con soporte para aumentar el número de accesos.", "Exclude": "Excluir", - "Execute code": "", + "Execute code": "Ejecuar código", "Execute code for analysis": "Ejecutar código para análisis", "Executing **{{NAME}}**...": "Ejecutando **{{NAME}}**...", "Expand": "Expandir", @@ -792,7 +792,7 @@ "Failed to copy link": "Fallo al copiar enlace", "Failed to create API Key.": "Fallo al crear la Clave API.", "Failed to delete note": "Fallo al eliminar nota", - "Failed to download image": "", + "Failed to download image": "Fallo al descargar imagen", "Failed to extract content from the file: {{error}}": "Fallo al extraer el contenido del archivo: {{error}}", "Failed to extract content from the file.": "Fallo al extraer el contenido del archivo.", "Failed to fetch models": "Fallo al obtener los modelos", @@ -810,7 +810,7 @@ "Failed to save connections": "Fallo al guardar las conexiones", "Failed to save conversation": "Fallo al guardar la conversación", "Failed to save models configuration": "Fallo al guardar la configuración de los modelos", - "Failed to unshare chat.": "", + "Failed to unshare chat.": "Fallo al descompartir chat.", "Failed to update settings": "Fallo al actualizar los ajustes", "Failed to update status": "Fallo al actualizar el estado", "Failed to upload file.": "Fallo al subir el archivo.", @@ -818,7 +818,7 @@ "Features Permissions": "Permisos de las Características", "February": "Febrero", "Feedback": "Opinión", - "Feedback Activity": "", + "Feedback Activity": "Actividad de las Opiniones", "Feedback deleted successfully": "Opinión eliminada correctamente", "Feedback Details": "Detalle de la Opinión", "Feedback History": "Historia de la Opiniones", @@ -828,7 +828,7 @@ "File added successfully.": "Archivo añadido correctamente.", "File content updated successfully.": "Contenido del archivo actualizado correctamente.", "File Context": "Contexto del Archivo", - "File deleted successfully.": "", + "File deleted successfully.": "Archivo borrado correctamente.", "File Mode": "Modo de Archivo", "File not found.": "Archivo no encontrado.", "File removed successfully.": "Archivo eliminado correctamente.", @@ -836,7 +836,7 @@ "File Upload": "Subir Archivo", "File uploaded successfully": "Archivo subido correctamente", "File uploaded!": "¡Archivo subido!", - "Filename": "", + "Filename": "Nombre del Archivo", "Files": "Archivos", "Filter": "Filtro", "Filter is now globally disabled": "El filtro ahora está desactivado globalmente", @@ -862,7 +862,7 @@ "Follow Up Generation Prompt": "Seguimiento de la Generación del Indicador", "Follow-Up Auto-Generation": "Seguimiento Auto-Generación", "Followed instructions perfectly": "Siguió las instrucciones perfectamente", - "for placeholders": "", + "for placeholders": "para marcadores de posición", "Force OCR": "Forzar OCR", "Force OCR on all pages of the PDF. This can lead to worse results if you have good text in your PDFs. Defaults to False.": "Forzar OCR en todas las páginas del PDF. Puede empeorar el resultado en PDFs que ya tengan una buena capa de texto. El valor predeterminado es desactivado (no forzar)", "Forge new paths": "Forjar nuevos caminos", @@ -897,13 +897,13 @@ "General": "General", "Generate": "Generar", "Generate an image": "Generar una imagen", - "Generate and edit images": "", + "Generate and edit images": "Generar y editar imágenes", "Generate Message Pair": "Generar Par de Mensajes", "Generated Image": "Imagen Generada", - "Generated images will appear here": "", + "Generated images will appear here": "Las imágenes generdas aparecerán aquí", "Generating search query": "Generando consulta de búsqueda", "Generating...": "Generando", - "Get current time and perform date/time calculations": "", + "Get current time and perform date/time calculations": "Obtener la hora actual y realizar cálculos de fecha y hora", "Get information on {{name}} in the UI": "Obtener información sobre {{name}} en la IU", "Get started": "Empezar", "Get started with {{WEBUI_NAME}}": "Empezar con {{WEBUI_NAME}}", @@ -934,16 +934,16 @@ "Height": "Altura", "Hello, {{name}}": "Hola, {{name}}", "Help": "Ayuda", - "Help the community discover great models": "", + "Help the community discover great models": "Ayuda a la comunidad a descubrir grandes modelos", "Hex Color": "Color Hex", "Hex Color - Leave empty for default color": "Color Hex - Deja vacío para el color predeterminado", - "Hidden": "", + "Hidden": "Oculto", "Hide": "Esconder", "Hide from Sidebar": "Ocultar Panel Lateral", "Hide Model": "Ocultar Modelo", "High": "Alto", "High Contrast Mode": "Modo Alto Contraste", - "History": "", + "History": "Historial", "Home": "Inicio", "Host": "Host", "How can I help you today?": "¿Cómo puedo ayudarte hoy?", @@ -955,7 +955,7 @@ "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.": "Aseguro que he leído y entiendo las implicaciones de mi acción. Soy consciente de los riesgos asociados con la ejecución de código arbitrario y he verificado la confiabilidad de la fuente.", "ID": "ID", "ID cannot contain \":\" or \"|\" characters": "ID no puede contener los caracteres \":\" o \"|\"", - "ID copied to clipboard": "", + "ID copied to clipboard": "ID copiado al portapapeles", "iframe Sandbox Allow Forms": "iframe Sandbox Allow Forms", "iframe Sandbox Allow Same Origin": "iframe Sandbox Allow Same Origin", "Ignite curiosity": "Encender la curiosidad", @@ -984,7 +984,7 @@ "Import successful": "Importación realizada correctamente", "Import Tools": "Importar Herramientas", "Important Update": "Actualización importante", - "Inactive": "", + "Inactive": "Inactivo", "Include": "Incluir", "Include `--api-auth` flag when running stable-diffusion-webui": "Incluir el señalizador `--api-auth` al ejecutar stable-diffusion-webui", "Include `--api` flag when running stable-diffusion-webui": "Incluir el señalizador `--api` al ejecutar stable-diffusion-webui", @@ -1066,15 +1066,15 @@ "Learn More": "Saber Más", "Learn more about OpenAPI tool servers.": "Saber más sobre los servidores de herramientas OpenAPI", "Learn more about Voxtral transcription.": "Saber más sobre la transcripción con Voxtral", - "Leave a public review for {{modelName}}": "", - "Leave empty for no compression": "Lejar vacío para no compresión", + "Leave a public review for {{modelName}}": "Dejar revisión pública de {{modelName}}", + "Leave empty for no compression": "Dejar vacío para no compresión", "Leave empty for unlimited": "Dejar vacío para ilimitado", "Leave empty to include all models from \"{{url}}\" endpoint": "Dejar vacío para incluir todos los modelos desde el endpoint \"{{url}}\"", "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "Dejar vacío para incluir todos los modelos desde el endpoint \"{{url}}/api/tags\"", "Leave empty to include all models from \"{{url}}/models\" endpoint": "Dejar vacío para incluir todos los modelos desde el endpoint \"{{url}}/models\"", "Leave empty to include all models or select specific models": "Dejar vacío para incluir todos los modelos o Seleccionar modelos específicos", "Leave empty to use first admin user": "Dejar vacío para utilizar el primer usuario administrador", - "Leave empty to use the default config, or enter a valid json (see https://yandex.cloud/en/docs/search-api/api-ref/WebSearch/search#yandex.cloud.searchapi.v2.WebSearchRequest)": "", + "Leave empty to use the default config, or enter a valid json (see https://yandex.cloud/en/docs/search-api/api-ref/WebSearch/search#yandex.cloud.searchapi.v2.WebSearchRequest)": "Déjelo vacío para usar la configuración predeterminada o ingresa un json válido (consulta https://yandex.cloud/en/docs/search-api/api-ref/WebSearch/search#yandex.cloud.searchapi.v2.WebSearchRequest)", "Leave empty to use the default model (voxtral-mini-latest).": "Dejar vacío para usar el modo predeterminado (voxtral-mini-latest).", "Leave empty to use the default prompt, or enter a custom prompt": "Dejar vacío para usar el indicador predeterminado, o Ingresar un indicador personalizado", "Leave model field empty to use the default model.": "Dejar vacío el campo modelo para usar el modelo predeterminado.", @@ -1086,7 +1086,7 @@ "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "Limitar consultas de búsqueda simultáneas. 0 = ilimitado (predeterminado). Establécerlo en 1 para ejecución secuencial (recomendado para API con límites de velocidad estrictos, como la versión gratuita de Brave).", "List": "Lista", "Listening...": "Escuchando...", - "Live": "", + "Live": "En Directo", "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "Los LLMs pueden cometer errores. Verifica la información importante.", "Loader": "Cargador", @@ -1105,7 +1105,7 @@ "Male": "Hombre", "Manage": "Gestionar", "Manage Direct Connections": "Gestionar Conexiones Directas", - "Manage Files": "", + "Manage Files": "Gestionar Archivos", "Manage Models": "Gestionar Modelos", "Manage Ollama": "Gestionar Ollama", "Manage Ollama API Connections": "Gestionar Conexiones API de Ollama", @@ -1128,7 +1128,7 @@ "MCP support is experimental and its specification changes often, which can lead to incompatibilities. OpenAPI specification support is directly maintained by the Open WebUI team, making it the more reliable option for compatibility.": "El soporte de MCP es experimental y su especificación cambia con frecuencia, lo que puede generar incompatibilidades. El equipo de Open WebUI mantiene directamente la compatibilidad con la especificación OpenAPI, lo que la convierte en la opción más fiable para la compatibilidad.", "Medium": "Medio", "Member removed successfully": "Miembro removido correctamente", - "members": "", + "members": "miembros", "Members": "Miembros", "Members added successfully": "Miembros añadidos correctamente", "Memories": "Memorias", @@ -1142,10 +1142,10 @@ "Merged Response": "Respuesta combinada", "Message": "Mensaje", "Message counts and response timestamps": "Recuento de mensajes y marcas de tiempo de la respuesta", - "Message counts are based on assistant responses.": "", + "Message counts are based on assistant responses.": "El recuento de mensajes está basado en las respuestas del asistente", "Message rating should be enabled to use this feature": "Para usar esta función debe estar habilitada la calificación de mensajes", - "messages": "", - "Messages": "", + "messages": "mensajes", + "Messages": "Mensajes", "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Los mensajes que envíe después de la creación del enlace no se compartirán. Los usuarios con la URL del enlace podrán ver el chat compartido.", "Microsoft OneDrive": "Microsoft OneDrive", "Microsoft OneDrive (personal)": "Microsoft OneDrive (personal)", @@ -1178,14 +1178,14 @@ "Model name already exists, please choose a different one": "Ese nombre de modelo ya existe, por favor elige otro diferente", "Model Name is required.": "El Nombre de Modelo es requerido", "Model names and usage frequency": "Nombres de modelos y frecuencia de uso", - "Model not found": "", + "Model not found": "Modelo no encontrado", "Model not selected": "Modelo no seleccionado", "Model Params": "Paráms Modelo", "Model Permissions": "Permisos Modelo", "Model responses or outputs": "Respuestas del modelo o salidas", "Model unloaded successfully": "Modelo descargado correctamente", "Model updated successfully": "Modelo actualizado correctamente", - "Model Usage": "", + "Model Usage": "Uso del Modelo", "Model(s) do not support file upload": "Modelo/s no soportan subida de archivos", "Modelfile Content": "Contenido del Modelfile", "Models": "Modelos", @@ -1198,7 +1198,7 @@ "Mojeek Search API Key": "Clave API de Mojeek Search", "More": "Más", "More Concise": "Más Conciso", - "More options": "", + "More options": "Más Opciones", "More Options": "Más Opciones", "Move": "Mover", "Name": "Nombre", @@ -1215,13 +1215,13 @@ "New Note": "Nueva Nota", "New Password": "Nueva Contraseña", "New Prompt": "Nuevo Indicador", - "New Skill": "", + "New Skill": "Nueva Habilidad", "New Temporary Chat": "Nuevo Chat Temporal", "New Tool": "Nueva Herramienta", "New Webhook": "Nuevo Webhook", "new-channel": "nuevo-canal", "Next message": "Siguiente mensaje", - "No access grants. Private to you.": "", + "No access grants. Private to you.": "Sin acceso concedido. Privado para tí.", "No activity data": "Sin datos de actividad", "No authentication": "Sin Autentificación", "No chats found": "No se encontró ningún chat", @@ -1231,16 +1231,16 @@ "No content found": "No se encontró contenido", "No content to speak": "No hay contenido para hablar", "No conversation to save": "No hay conversación para guardar", - "No data": "", - "No data found": "", + "No data": "Sin datos", + "No data found": "No se encontró ningún dato", "No distance available": "No hay distancia disponible", "No expiration can pose security risks.": "No expiración puede poner la seguridad en riesgo.", "No feedback found": "No se encontró ninguna opinión", "No file selected": "No se seleccionó archivo", - "No files found": "", + "No files found": "No se encontraron archivos", "No files in this knowledge base.": "Ningún archivo en esta base de conocimiento.", "No functions found": "No se encontraron funciones", - "No history available": "", + "No history available": "No hay historial disponible", "No HTML, CSS, or JavaScript content found.": "No se encontró contenido HTML, CSS, o JavaScript.", "No inference engine with management support found": "No se encontró un motor de inferencia que soporte gestión", "No knowledge bases found.": "No se encontraron bases de conocimiento", @@ -1257,7 +1257,7 @@ "No results": "No se encontraron resultados", "No results found": "No se encontraron resultados", "No search query generated": "No se generó ninguna consulta de búsqueda", - "No skills found": "", + "No skills found": "No se encontraron habilidades", "No source available": "No hay fuente disponible", "No sources found": "No se han encontrado fuentes", "No suggestion prompts": "Sin prompts sugeridos", @@ -1316,7 +1316,7 @@ "Open modal to configure connection": "Abrir modal para configurar la conexión", "Open Modal To Manage Floating Quick Actions": "Abrir Modal para Gestionar Acciones Rápidas Flotantes", "Open Modal To Manage Image Compression": "Abrir Modal para Gestionar Compresión de Imagen", - "Open Model Selector": "", + "Open Model Selector": "Avrir Selector de Modelos", "Open Settings": "Abrir Configuración", "Open Sidebar": "Abrir Barra Lateral", "Open User Profile Menu": "Abrir Menu de Perfiles de Usuario", @@ -1336,7 +1336,7 @@ "OpenAPI": "OpenAPI", "OpenAPI Spec": "Especif. OpenAPI", "openapi.json URL or Path": "URL o Ruta a openapi.json", - "optional": "", + "optional": "opcional", "Optional": "Opcional", "or": "o", "Ordered List": "Lista Ordenada", @@ -1347,8 +1347,8 @@ "Output Format": "Formato de Salida", "Overview": "Vista General", "page": "página", - "Page": "", - "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", + "Page": "Página", + "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "El modo Página crea un documento por página. El modo Individual combina todas las páginas en un solo documento para una mejor segmentación entre páginas.", "Paginate": "Paginar", "Parameters": "Parámetros", "Parent message not found": "Mensaje padre no encontrado", @@ -1358,7 +1358,7 @@ "Paste Large Text as File": "Pegar el Texto Largo como Archivo", "PDF document (.pdf)": "Documento PDF (.pdf)", "PDF Extract Images (OCR)": "Extraer imágenes del PDF (OCR)", - "PDF Loader Mode": "", + "PDF Loader Mode": "Modo de Carga del PDF", "pending": "pendiente", "Pending": "Pendiente", "Pending User Overlay Content": "Contenido de la SobreCapa Usuario Pendiente", @@ -1418,13 +1418,13 @@ "Previous message": "Mensaje anterior", "Private": "Privado", "Private conversation between selected users": "Conversación privada entre l@s usuari@s seleccionados", - "Production version updated": "", + "Production version updated": "Versión de Producción actualizada", "Profile": "Perfil", "Prompt": "Indicador", "Prompt Autocompletion": "Autocompletado del Indicador", "Prompt Content": "Contenido del Indicador", "Prompt created successfully": "Indicador creado exitosamente", - "Prompt Name": "", + "Prompt Name": "Nombre del Indicador", "Prompt updated successfully": "Indicador actualizado correctamente", "Prompts": "Indicadores", "Prompts Access": "Acceso a Indicadores", @@ -1496,7 +1496,7 @@ "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Las notificaciones de respuesta no pueden activarse ya que los permisos del sitio web han sido denegados. Por favor, comprueba la configuración de tu navegador para otorgar el permiso necesario.", "Response splitting": "Particionado de Respuesta", "Response Watermark": "Marca de Agua en Respuesta", - "Responses": "", + "Responses": "Respuestas", "Result": "Resultado", "RESULT": "Resultado", "Retrieval": "Recuperación", @@ -1524,13 +1524,13 @@ "Search": "Buscar", "Search a model": "Buscar un Modelo", "Search all emojis": "Buscar todos los emojis", - "Search and manage user memories": "", - "Search and view user chat history": "", + "Search and manage user memories": "Buscar y gestionar memorias del usuario", + "Search and view user chat history": "Buscr y ver historial de los chat del usuario", "Search Base": "Busqueda Base", - "Search channels and channel messages": "", + "Search channels and channel messages": "Buscar canales y mensajes del canal", "Search Chats": "Buscar Chats", "Search Collection": "Buscar Colección", - "Search Files": "", + "Search Files": "Buscar archivos", "Search Filters": "Buscar Filtros", "search for archived chats": "buscar chats archivados", "search for folders": "buscar carpetas", @@ -1545,11 +1545,11 @@ "Search options": "Opciones de Búsqueda", "Search Prompts": "Buscar Indicadores", "Search Result Count": "Número de resultados de la búsqueda", - "Search Skills": "", + "Search Skills": "Buscar Habilidades", "Search the internet": "Buscar en internet", - "Search the web and fetch URLs": "", + "Search the web and fetch URLs": "Buscar en la web y obtener URLs", "Search Tools": "Buscar Herramientas", - "Search, view, and manage user notes": "", + "Search, view, and manage user notes": "Buscar, ver y gestionar notas del usuario", "SearchApi API Key": "Clave API de SearchApi", "SearchApi Engine": "Motor SearchApi", "Searched {{count}} sites": "{{count}} sitios buscados", @@ -1584,7 +1584,7 @@ "Select an embedding model engine": "Seleccionar un motor de modelos de incrustación", "Select an engine": "Seleccionar un motor", "Select an Ollama instance": "Seleccionar una instancia de Ollama", - "Select an option": "", + "Select an option": "Seleccionar una opción", "Select an output format": "Seleccionar un formato de salida", "Select dtype": "Seleccionar dtype", "Select Engine": "Seleccionar Motor", @@ -1598,7 +1598,7 @@ "Send": "Enviar", "Send a Message": "Enviar un Mensaje", "Send message": "Enviar Mensaje", - "Send now": "", + "Send now": "Enviar ahora", "Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "Envia en la solicitud de transmisión la opción: `{ include_usage: true }`.\nSi se activa, los proveedores que soporten esta función devolverán en la respuesta información de uso de los token.", "September": "Septiembre", "SerpApi API Key": "Clave API de SerpApi", @@ -1609,7 +1609,7 @@ "Server connection verified": "Conexión al servidor verificada", "Session": "Sesión", "Set as default": "Establecer como Predeterminado", - "Set as Production": "", + "Set as Production": "Establecer como Producción", "Set embedding model": "Establecer Modelo de Incrustación", "Set embedding model (e.g. {{model}})": "Establecer Modelo para Incrustación (p.ej. {{model}})", "Set reranking model (e.g. {{model}})": "Establecer Modelo para Reclasificación (p.ej. {{model}})", @@ -1630,10 +1630,10 @@ "Settings saved successfully!": "¡Ajustes guardados correctamente!", "Share": "Compartir", "Share Chat": "Compartir Chat", - "Share link copied to clipboard.": "", + "Share link copied to clipboard.": "Enlace Compartido copiado al portapapeles", "Share to Open WebUI Community": "Compartir con la Comunidad Open-WebUI", "Share your background and interests": "Compartir tus antecedentes e intereses", - "Shared Chats": "", + "Shared Chats": "Chats Compartidos", "Shared with you": "Compartido contigo", "Sharing Permissions": "Permisos al Compartir", "Show": "Mostrar", @@ -1646,7 +1646,7 @@ "Show Shortcuts": "Mostrar Atajos de Teclado", "Show your support!": "¡Muestra tu apoyo!", "Showcased creativity": "Creatividad exhibida", - "Showing all messages (user + assistant) per user.": "", + "Showing all messages (user + assistant) per user.": "Mostrando todos los mensajes (usuario y asistente) del usuario.", "Sign in": "Iniciar Sesión", "Sign in to {{WEBUI_NAME}}": "Iniciar Sesión en {{WEBUI_NAME}}", "Sign in to {{WEBUI_NAME}} with LDAP": "Iniciar Sesión en {{WEBUI_NAME}} con LDAP", @@ -1655,17 +1655,17 @@ "Sign up to {{WEBUI_NAME}}": "Crear una Cuenta en {{WEBUI_NAME}}", "Significantly improves accuracy by using an LLM to enhance tables, forms, inline math, and layout detection. Will increase latency. Defaults to False.": "Mejora significativamente la precisión al usar un LLM para optimizar tablas, formularios, cálculos en línea y la detección de diseño. Aumentará la latencia. El valor predeterminado es Falso.", "Signing in to {{WEBUI_NAME}}": "Iniciando Sesión en {{WEBUI_NAME}}", - "Single": "", + "Single": "Individual", "Sink List": "Plegar Lista", "sk-1234": "sk-1234", - "Skill created successfully": "", - "Skill deleted successfully": "", - "Skill Description": "", - "Skill ID": "", - "Skill Name": "", - "Skill updated successfully": "", - "Skills": "", - "Skills Access": "", + "Skill created successfully": "Habilidad creada correctamente", + "Skill deleted successfully": "Habilidad borrada correctamente", + "Skill Description": "Descripción de la Habilidad", + "Skill ID": "ID de la Habilidad", + "Skill Name": "Nombre de la Habilidad", + "Skill updated successfully": "Habilidad actualiada correctamente", + "Skills": "Habilidades", + "Skills Access": "Acceso a Habilidades", "Skip Cache": "Evitar Caché", "Skip the cache and re-run the inference. Defaults to False.": "Evitar caché y reiniciar la interfaz. Valor predeterminado Falso", "Something went wrong :/": "Algo ha ido mal :/", @@ -1772,7 +1772,7 @@ "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Este canal fue creado el {{createdAt}}. Este es el comienzo del canal {{channelName}}.", "This chat won't appear in history and your messages will not be saved.": "Este chat no aparecerá en el historial y los mensajes no se guardarán.", "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Esto garantiza que sus valiosas conversaciones se guardan de forma segura en tu base de datos del servidor trasero (backend). ¡Gracias!", - "This feature is currently experimental and may not work as expected.": "", + "This feature is currently experimental and may not work as expected.": "Acualmente esta característica es experimental y puede no funcionar como se espera.", "This feature is experimental and may be modified or discontinued without notice.": "Esta característica es experimental y podría ser modificada o discontinuada sin previo aviso.", "This is a default user permission and will remain enabled.": "Este es un permiso predeterminado y se mantentrá activo ", "This is an experimental feature, it may not function as expected and is subject to change at any time.": "Esta es una característica experimental, por lo que puede no funcionar como se esperaba y está sujeta a cambios en cualquier momento.", @@ -1793,11 +1793,11 @@ "Thought for {{DURATION}} seconds": "Pensando durante {{DURATION}} segundos", "Thought for less than a second": "Pensando durante menos de un segundo", "Thread": "Hilo", - "Thumbs up/down ratings from users on model responses": "", + "Thumbs up/down ratings from users on model responses": "Calificación (pulgares arriba/abajo) de los usuarios en las respuestas del modelo", "Tika": "Tika", "Tika Server URL required.": "URL del Servidor Tika necesaria", "Tiktoken": "Tiktoken", - "Time & Calculation": "", + "Time & Calculation": "Tiempo y Cálculo", "Timeout": "TimeOut", "Title": "Título", "Title Auto-Generation": "AutoGeneración de Títulos", @@ -1810,7 +1810,7 @@ "To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Para acceder a WebUI, por favor contacte con Admins. Los administradores pueden gestionar los estados de los usuarios esde el panel de administración.", "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Para adjuntar la base de conocimientos aquí, primero añadirla a \"Conocimiento\" en el área de trabajo.", "To learn more about available endpoints, visit our documentation.": "Para aprender más sobre los endpoints disponibles, visite nuestra documentación.", - "To select skills here, add them to the \"Skills\" workspace first.": "", + "To select skills here, add them to the \"Skills\" workspace first.": "Para seleccionar habilidades aquí, primero añadelas a \"Habilidades\" en el áreas de trabajo.", "To select toolkits here, add them to the \"Tools\" workspace first.": "Para seleccionar herramientas aquí, primero añadelas a \"Herramientas\" en el área de trabajo.", "Toast notifications for new updates": "Notificaciones emergentes para nuevas actualizaciones", "Today": "Hoy", @@ -1818,9 +1818,9 @@ "Toggle Sidebar": "Des/Plegar la Barra Lateral", "Toggle whether current connection is active.": "Alternar si la conexión actual está activa", "Token": "Token", - "Token counts are estimates and may not reflect actual API usage": "", - "tokens": "", - "Tokens": "", + "Token counts are estimates and may not reflect actual API usage": "El recuento de tokens es estimado y puede diferir del uso real de la API", + "tokens": "tokens", + "Tokens": "Tokens", "Too verbose": "Demasiado detallado", "Tool created successfully": "Herramienta creada correctamente", "Tool deleted successfully": "Herramienta eliminada correctamente", @@ -1864,7 +1864,7 @@ "Unlock mysteries": "Desbloquear misterios", "Unpin": "Desfijar", "Unravel secrets": "Desentrañar secretos", - "Unshare Chat": "", + "Unshare Chat": "Descompartir Chat", "Unsupported file type.": "Tipo de archivo no soportado", "Untagged": "Sin Etiqueta", "Untitled": "Sin Título", @@ -1893,7 +1893,7 @@ "URL is required": "La URL es requerida", "URL Mode": "Modo URL", "Usage": "Uso", - "Use": "", + "Use": "Usar", "Use '#' in the prompt input to load and include your knowledge.": "Utilizar '#' en el indicador para cargar e incluir tu conocimiento.", "Use /v1/chat/completions endpoint instead of /v1/audio/transcriptions for potentially better accuracy.": "Usar el endpoint /v1/chat/completions en vez de /v1/audio/transcriptions para una (posible) mayor precisión.", "Use Chat Completions API": "Usar Chat Completions", @@ -1903,7 +1903,7 @@ "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "Usar el proxy asignado en las variables del entorno http_proxy y/o https_proxy para extraer contenido", "user": "usuario", "User": "Usuario", - "User Activity": "", + "User Activity": "Actividad del Usuario", "User Groups": "Grupos de Usuarios", "User location successfully retrieved.": "Ubicación de usuario obtenida correctamente.", "User menu": "Menu de Usuario", @@ -1928,11 +1928,11 @@ "Verify SSL Certificate": "Verificar Certificado SSL", "Version": "Versión", "Version {{selectedVersion}} of {{totalVersions}}": "Versión {{selectedVersion}} de {{totalVersions}}", - "Version deleted": "", + "Version deleted": "Versión eliminada", "View Replies": "Ver Respuestas", "View Result from **{{NAME}}**": "Ver Resultado desde **{{NAME}}**", "Visibility": "Visibilidad", - "Visible": "", + "Visible": "Visible", "Visible to all users": "Visible para todos los usuarios", "Vision": "Visión", "Voice": "Voz", @@ -1988,9 +1988,9 @@ "Yacy Username": "Usuario de Yacy", "Yahoo": "Yahoo", "Yandex": "Yandex", - "Yandex Web Search API Key": "", - "Yandex Web Search config": "", - "Yandex Web Search URL": "", + "Yandex Web Search API Key": "Clave API de la Búsqueda Web de Yandex", + "Yandex Web Search config": "Confoguración de la Búsqueda Web de Yantex", + "Yandex Web Search URL": "URL de la Búsqueda Web de Yandex", "Yesterday": "Ayer", "Yesterday at {{LOCALIZED_TIME}}": "Ayer a las {{LOCALIZED_TIME}}", "You": "Tu", @@ -2000,15 +2000,15 @@ "You cannot upload an empty file.": "No puedes subir un archivo vacío.", "You do not have permission to edit this model": "No tienes permiso para editar este modelo", "You do not have permission to edit this prompt.": "No tienes permiso para editar este indicador", - "You do not have permission to edit this skill.": "", - "You do not have permission to edit this tool": "", - "You do not have permission to make this public": "", + "You do not have permission to edit this skill.": "No tienes permiso para editar esta habilidad", + "You do not have permission to edit this tool": "No tienes permiso para editar esta herramienta", + "You do not have permission to make this public": "No tienes permiso para hacer público esto", "You do not have permission to send messages in this channel.": "No tienes permiso para enviar mensajes en este canal", "You do not have permission to send messages in this thread.": "No tienes permiso para enviar mensajes en este hilo", "You do not have permission to upload files to this knowledge base.": "No tienes permiso para subir archivos a esta base de conocimiento.", "You do not have permission to upload files.": "No tienes permiso para subir archivos.", "You have no archived conversations.": "No tienes conversaciones archivadas.", - "You have no shared conversations.": "", + "You have no shared conversations.": "No tienes conversaciones compartidas", "You have shared this chat": "Has compartido esta conversación", "You're a helpful assistant.": "Eres un asistente atento, amable y servicial.", "You're now logged in.": "Has iniciado sesión.", From f2aca781c87244cffc130aa2722e700c19a81d66 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 15 Feb 2026 16:14:47 -0600 Subject: [PATCH 05/59] refac: tool message handling --- backend/open_webui/utils/middleware.py | 34 ++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 2879433269..bff0626a90 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -1918,6 +1918,27 @@ async def convert_url_images_to_base64(form_data): return form_data +def load_messages_from_db( + chat_id: str, message_id: str +) -> Optional[list[dict]]: + """ + Load the message chain from DB up to message_id, + keeping only LLM-relevant fields (role, content, output). + """ + messages_map = Chats.get_messages_map_by_chat_id(chat_id) + if not messages_map: + return None + + db_messages = get_message_list(messages_map, message_id) + if not db_messages: + return None + + return [ + {k: v for k, v in msg.items() if k in ("role", "content", "output")} + for msg in db_messages + ] + + def process_messages_with_output(messages: list[dict]) -> list[dict]: """ Process messages with OR-aligned output items for LLM consumption. @@ -1950,6 +1971,19 @@ async def process_chat_payload(request, form_data, user, metadata, model): form_data = apply_params_to_form_data(form_data, model) log.debug(f"form_data: {form_data}") + # Load messages from DB when available — DB preserves structured 'output' items + # which the frontend strips, causing tool calls to be merged into content. + chat_id = metadata.get("chat_id") + parent_message_id = metadata.get("parent_message_id") + + if chat_id and parent_message_id and not chat_id.startswith("local:"): + db_messages = load_messages_from_db(chat_id, parent_message_id) + if db_messages: + system_message = get_system_message(form_data.get("messages", [])) + form_data["messages"] = ( + [system_message, *db_messages] if system_message else db_messages + ) + # Process messages with OR-aligned output items for clean LLM messages form_data["messages"] = process_messages_with_output(form_data.get("messages", [])) From 58e923fe008ed94e814093e52b0f2466a9f33c20 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 15 Feb 2026 23:43:50 +0100 Subject: [PATCH 06/59] Update translation.json (#21441) --- src/lib/i18n/locales/de-DE/translation.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index 71757a09f5..fc2ffd4687 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -273,7 +273,7 @@ "Chat Permissions": "Chat-Berechtigungen", "Chat Tags Auto-Generation": "Automatische Chat-Tag-Generierung", "Chat unshared successfully.": "Chat-Freigabe erfolgreich aufgehoben", - "chats": "", + "chats": "Chats", "Chats": "Chats", "Check Again": "Erneut prüfen", "Check for updates": "Nach Updates suchen", @@ -1654,7 +1654,7 @@ "Sign up to {{WEBUI_NAME}}": "Bei {{WEBUI_NAME}} registrieren", "Significantly improves accuracy by using an LLM to enhance tables, forms, inline math, and layout detection. Will increase latency. Defaults to False.": "Verbessert die Genauigkeit erheblich, indem ein LLM zur Optimierung von Tabellen, Formularen, mathematischen Formeln und Layout-Erkennung genutzt wird. Erhöht die Latenz. Standardmäßig deaktiviert.", "Signing in to {{WEBUI_NAME}}": "Anmeldung bei {{WEBUI_NAME}}...", - "Single": "", + "Single": "Einzeln", "Sink List": "Sink-Liste", "sk-1234": "sk-1234", "Skill created successfully": "Skill erfolgreich erstellt", @@ -1664,7 +1664,7 @@ "Skill Name": "Skill Name", "Skill updated successfully": "Skill erfolgreich aktualisiert", "Skills": "Skills", - "Skills Access": "", + "Skills Access": "Skills Zugang", "Skip Cache": "Cache überspringen", "Skip the cache and re-run the inference. Defaults to False.": "Cache überspringen und die Inferenz erneut ausführen. Standardmäßig deaktiviert.", "Something went wrong :/": "Etwas ist schiefgelaufen :/", @@ -1818,7 +1818,7 @@ "Toggle whether current connection is active.": "Umschalten, ob die aktuelle Verbindung aktiv ist.", "Token": "Token", "Token counts are estimates and may not reflect actual API usage": "Token-Anzahlen sind Schätzwerte und entsprechen möglicherweise nicht der tatsächlichen API-Nutzung.", - "tokens": "", + "tokens": "Token", "Tokens": "Token", "Too verbose": "Zu ausführlich", "Tool created successfully": "Werkzeug erfolgreich erstellt", @@ -1892,7 +1892,7 @@ "URL is required": "URL ist erforderlich", "URL Mode": "URL-Modus", "Usage": "Nutzung", - "Use": "", + "Use": "Nutze", "Use '#' in the prompt input to load and include your knowledge.": "Verwenden Sie '#' in der Prompt-Eingabe, um Ihr Wissen zu laden und einzubeziehen.", "Use /v1/chat/completions endpoint instead of /v1/audio/transcriptions for potentially better accuracy.": "Verwenden Sie den Endpunkt /v1/chat/completions statt /v1/audio/transcriptions für potenziell bessere Genauigkeit.", "Use Chat Completions API": "Chat Completions API verwenden", From f1a1e64d2e9ad953b2bc2a9543e9a308b7c669c8 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 15 Feb 2026 17:20:49 -0600 Subject: [PATCH 07/59] refac: explicit toggle builtin tools --- backend/open_webui/utils/tools.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backend/open_webui/utils/tools.py b/backend/open_webui/utils/tools.py index cb43cf4ef4..70b8bd3e1d 100644 --- a/backend/open_webui/utils/tools.py +++ b/backend/open_webui/utils/tools.py @@ -471,6 +471,7 @@ def is_builtin_tool_enabled(category: str) -> bool: is_builtin_tool_enabled("web_search") and getattr(request.app.state.config, "ENABLE_WEB_SEARCH", False) and get_model_capability("web_search") + and features.get("web_search") ): builtin_functions.extend([search_web, fetch_url]) @@ -479,12 +480,14 @@ def is_builtin_tool_enabled(category: str) -> bool: is_builtin_tool_enabled("image_generation") and getattr(request.app.state.config, "ENABLE_IMAGE_GENERATION", False) and get_model_capability("image_generation") + and features.get("image_generation") ): builtin_functions.append(generate_image) if ( is_builtin_tool_enabled("image_generation") and getattr(request.app.state.config, "ENABLE_IMAGE_EDIT", False) and get_model_capability("image_generation") + and features.get("image_generation") ): builtin_functions.append(edit_image) @@ -493,6 +496,7 @@ def is_builtin_tool_enabled(category: str) -> bool: is_builtin_tool_enabled("code_interpreter") and getattr(request.app.state.config, "ENABLE_CODE_INTERPRETER", True) and get_model_capability("code_interpreter") + and features.get("code_interpreter") ): builtin_functions.append(execute_code) From f20cc6d7e6da493eb75ca1618f5cbd068fa57684 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 15 Feb 2026 17:29:55 -0600 Subject: [PATCH 08/59] refac Co-Authored-By: SpootyMcSpoot <6732450+spootymcspoot@users.noreply.github.com> --- backend/open_webui/main.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index c7163a580d..cdd6a65173 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -517,6 +517,7 @@ process_chat_payload, process_chat_response, ) +from open_webui.utils.tools import set_tool_servers from open_webui.utils.auth import ( get_license_data, @@ -656,6 +657,32 @@ async def lifespan(app: FastAPI): None, ) + # Pre-fetch tool server specs so the first request doesn't pay the latency cost + if len(app.state.config.TOOL_SERVER_CONNECTIONS) > 0: + log.info("Initializing tool servers...") + try: + mock_request = Request( + { + "type": "http", + "asgi.version": "3.0", + "asgi.spec_version": "2.0", + "method": "GET", + "path": "/internal", + "query_string": b"", + "headers": Headers({}).raw, + "client": ("127.0.0.1", 12345), + "server": ("127.0.0.1", 80), + "scheme": "http", + "app": app, + } + ) + await set_tool_servers(mock_request) + log.info( + f"Initialized {len(app.state.TOOL_SERVERS)} tool server(s)" + ) + except Exception as e: + log.warning(f"Failed to initialize tool servers at startup: {e}") + yield if hasattr(app.state, "redis_task_command_listener"): From e1b3e7252c1896c04d498547908f0fce111434e1 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 15 Feb 2026 17:53:20 -0600 Subject: [PATCH 09/59] enh: preview image in file modal --- .../components/common/FileItemModal.svelte | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/lib/components/common/FileItemModal.svelte b/src/lib/components/common/FileItemModal.svelte index e34c904585..dd8896c289 100644 --- a/src/lib/components/common/FileItemModal.svelte +++ b/src/lib/components/common/FileItemModal.svelte @@ -30,6 +30,7 @@ let isPDF = false; let isAudio = false; + let isImage = false; let isExcel = false; let selectedTab = ''; @@ -79,6 +80,18 @@ (item?.name && item?.name.toLowerCase().endsWith('.m4a')) || (item?.name && item?.name.toLowerCase().endsWith('.webm')); + $: isImage = + (item?.meta?.content_type ?? '').startsWith('image/') || + (item?.name && + (item.name.toLowerCase().endsWith('.png') || + item.name.toLowerCase().endsWith('.jpg') || + item.name.toLowerCase().endsWith('.jpeg') || + item.name.toLowerCase().endsWith('.gif') || + item.name.toLowerCase().endsWith('.webp') || + item.name.toLowerCase().endsWith('.svg') || + item.name.toLowerCase().endsWith('.bmp') || + item.name.toLowerCase().endsWith('.ico'))); + $: isExcel = item?.meta?.content_type === 'application/vnd.ms-excel' || item?.meta?.content_type === @@ -341,7 +354,16 @@ {/if} - {#if selectedTab === ''} + {#if isImage} +
+ {item?.name +
+ {:else if selectedTab === ''} {#if item?.file?.data}
{(item?.file?.data?.content ?? '').trim() || 'No content'} From 319d3e8856539cd74df812ac58b5fbf6660275cf Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 15 Feb 2026 17:55:59 -0600 Subject: [PATCH 10/59] refac --- backend/open_webui/routers/audio.py | 15 ++++++------ backend/open_webui/routers/pipelines.py | 31 +++++++++++++------------ 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/backend/open_webui/routers/audio.py b/backend/open_webui/routers/audio.py index 139b64f7cf..01a857a2b6 100644 --- a/backend/open_webui/routers/audio.py +++ b/backend/open_webui/routers/audio.py @@ -639,13 +639,14 @@ def transcription_handler(request, file_path, metadata, user=None): if user and ENABLE_FORWARD_USER_INFO_HEADERS: headers = include_user_info_headers(headers, user) - r = requests.post( - url=f"{request.app.state.config.STT_OPENAI_API_BASE_URL}/audio/transcriptions", - headers=headers, - files={"file": (filename, open(file_path, "rb"))}, - data=payload, - timeout=AIOHTTP_CLIENT_TIMEOUT, - ) + with open(file_path, "rb") as audio_file: + r = requests.post( + url=f"{request.app.state.config.STT_OPENAI_API_BASE_URL}/audio/transcriptions", + headers=headers, + files={"file": (filename, audio_file)}, + data=payload, + timeout=AIOHTTP_CLIENT_TIMEOUT, + ) if r.status_code == 200: # Successful transcription diff --git a/backend/open_webui/routers/pipelines.py b/backend/open_webui/routers/pipelines.py index 20fcd75eec..ebedd3027d 100644 --- a/backend/open_webui/routers/pipelines.py +++ b/backend/open_webui/routers/pipelines.py @@ -228,22 +228,23 @@ async def upload_pipeline( headers = {"Authorization": f"Bearer {key}"} async with aiohttp.ClientSession(trust_env=True) as session: - form_data = aiohttp.FormData() - form_data.add_field( - "file", - open(file_path, "rb"), - filename=filename, - content_type="application/octet-stream", - ) + with open(file_path, "rb") as f: + form_data = aiohttp.FormData() + form_data.add_field( + "file", + f, + filename=filename, + content_type="application/octet-stream", + ) - async with session.post( - f"{url}/pipelines/upload", - headers=headers, - data=form_data, - ssl=AIOHTTP_CLIENT_SESSION_SSL, - ) as response: - response.raise_for_status() - data = await response.json() + async with session.post( + f"{url}/pipelines/upload", + headers=headers, + data=form_data, + ssl=AIOHTTP_CLIENT_SESSION_SSL, + ) as response: + response.raise_for_status() + data = await response.json() return {**data} except Exception as e: From 911eecac85e333852d1407876cbd8f2402d54b0b Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 15 Feb 2026 18:10:18 -0600 Subject: [PATCH 11/59] fix: disabled mcp display issue Co-Authored-By: Dario Ruellan <6965667+druellan@users.noreply.github.com> --- backend/open_webui/routers/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/routers/tools.py b/backend/open_webui/routers/tools.py index 6657b34462..d489f9b643 100644 --- a/backend/open_webui/routers/tools.py +++ b/backend/open_webui/routers/tools.py @@ -107,7 +107,7 @@ async def get_tools( # MCP Tool Servers for server in request.app.state.config.TOOL_SERVER_CONNECTIONS: - if server.get("type", "openapi") == "mcp": + if server.get("type", "openapi") == "mcp" and server.get("config", {}).get("enable"): server_id = server.get("info", {}).get("id") auth_type = server.get("auth_type", "none") From b780d5c5561c72a65d668359a788970eae0b25ce Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 15 Feb 2026 18:41:16 -0600 Subject: [PATCH 12/59] refac --- backend/open_webui/main.py | 2 + backend/open_webui/socket/main.py | 92 ++++++++++++++++++++++++------ backend/open_webui/socket/utils.py | 34 +++++++++++ 3 files changed, 110 insertions(+), 18 deletions(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index cdd6a65173..3a14ade8bc 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -64,6 +64,7 @@ MODELS, app as socket_app, periodic_usage_pool_cleanup, + periodic_session_pool_cleanup, get_event_emitter, get_models_in_use, ) @@ -635,6 +636,7 @@ async def lifespan(app: FastAPI): limiter.total_tokens = THREAD_POOL_SIZE asyncio.create_task(periodic_usage_pool_cleanup()) + asyncio.create_task(periodic_session_pool_cleanup()) if app.state.config.ENABLE_BASE_MODELS_CACHE: await get_all_models( diff --git a/backend/open_webui/socket/main.py b/backend/open_webui/socket/main.py index b43c56b4e6..78df66b8dc 100644 --- a/backend/open_webui/socket/main.py +++ b/backend/open_webui/socket/main.py @@ -99,6 +99,7 @@ # Timeout duration in seconds TIMEOUT_DURATION = 3 +SESSION_POOL_TIMEOUT = 120 # seconds without heartbeat before session is reaped # Dictionary to maintain the user pool @@ -147,6 +148,17 @@ aquire_func = clean_up_lock.aquire_lock renew_func = clean_up_lock.renew_lock release_func = clean_up_lock.release_lock + + session_cleanup_lock = RedisLock( + redis_url=WEBSOCKET_REDIS_URL, + lock_name=f"{REDIS_KEY_PREFIX}:session_cleanup_lock", + timeout_secs=WEBSOCKET_REDIS_LOCK_TIMEOUT, + redis_sentinels=redis_sentinels, + redis_cluster=WEBSOCKET_REDIS_CLUSTER, + ) + session_aquire_func = session_cleanup_lock.aquire_lock + session_renew_func = session_cleanup_lock.renew_lock + session_release_func = session_cleanup_lock.release_lock else: MODELS = {} @@ -154,6 +166,7 @@ USAGE_POOL = {} aquire_func = release_func = renew_func = lambda: True + session_aquire_func = session_release_func = session_renew_func = lambda: True YDOC_MANAGER = YdocManager( @@ -162,6 +175,31 @@ ) +async def periodic_session_pool_cleanup(): + """Reap orphaned SESSION_POOL entries that missed heartbeats (e.g. crashed instance).""" + if not session_aquire_func(): + log.debug("Session cleanup lock held by another node. Skipping.") + return + + try: + while True: + if not session_renew_func(): + log.error("Unable to renew session cleanup lock. Exiting.") + return + + now = int(time.time()) + for sid in list(SESSION_POOL.keys()): + entry = SESSION_POOL.get(sid) + if entry and now - entry.get("last_seen_at", 0) > SESSION_POOL_TIMEOUT: + log.warning( + f"Reaping orphaned session {sid} (user {entry.get('id')})" + ) + del SESSION_POOL[sid] + await asyncio.sleep(SESSION_POOL_TIMEOUT) + finally: + session_release_func() + + async def periodic_usage_pool_cleanup(): max_retries = 2 retry_delay = random.uniform( @@ -313,15 +351,18 @@ async def connect(sid, environ, auth): user = Users.get_user_by_id(data["id"]) if user: - SESSION_POOL[sid] = user.model_dump( - exclude=[ - "profile_image_url", - "profile_banner_image_url", - "date_of_birth", - "bio", - "gender", - ] - ) + SESSION_POOL[sid] = { + **user.model_dump( + exclude=[ + "profile_image_url", + "profile_banner_image_url", + "date_of_birth", + "bio", + "gender", + ] + ), + "last_seen_at": int(time.time()), + } await sio.enter_room(sid, f"user:{user.id}") @@ -340,15 +381,18 @@ async def user_join(sid, data): if not user: return - SESSION_POOL[sid] = user.model_dump( - exclude=[ - "profile_image_url", - "profile_banner_image_url", - "date_of_birth", - "bio", - "gender", - ] - ) + SESSION_POOL[sid] = { + **user.model_dump( + exclude=[ + "profile_image_url", + "profile_banner_image_url", + "date_of_birth", + "bio", + "gender", + ] + ), + "last_seen_at": int(time.time()), + } await sio.enter_room(sid, f"user:{user.id}") @@ -366,6 +410,7 @@ async def user_join(sid, data): async def heartbeat(sid, data): user = SESSION_POOL.get(sid) if user: + SESSION_POOL[sid] = {**user, "last_seen_at": int(time.time())} Users.update_last_active_by_id(user["id"]) @@ -709,6 +754,17 @@ async def disconnect(sid): if sid in SESSION_POOL: user = SESSION_POOL[sid] del SESSION_POOL[sid] + + # Clean up USAGE_POOL entries for this session + for model_id in list(USAGE_POOL.keys()): + connections = USAGE_POOL.get(model_id) + if connections and sid in connections: + del connections[sid] + if not connections: + del USAGE_POOL[model_id] + else: + USAGE_POOL[model_id] = connections + await YDOC_MANAGER.remove_user_from_all_documents(sid) else: pass diff --git a/backend/open_webui/socket/utils.py b/backend/open_webui/socket/utils.py index 327348626a..c33af2e71d 100644 --- a/backend/open_webui/socket/utils.py +++ b/backend/open_webui/socket/utils.py @@ -118,6 +118,8 @@ def setdefault(self, key, default=None): class YdocManager: + COMPACTION_THRESHOLD = 500 + def __init__( self, redis=None, @@ -133,10 +135,42 @@ async def append_to_updates(self, document_id: str, update: bytes): if self._redis: redis_key = f"{self._redis_key_prefix}:{document_id}:updates" await self._redis.rpush(redis_key, json.dumps(list(update))) + list_len = await self._redis.llen(redis_key) + if list_len >= self.COMPACTION_THRESHOLD: + await self._compact_updates_redis(document_id) else: if document_id not in self._updates: self._updates[document_id] = [] self._updates[document_id].append(update) + if len(self._updates[document_id]) >= self.COMPACTION_THRESHOLD: + self._compact_updates_memory(document_id) + + async def _compact_updates_redis(self, document_id: str): + """Rolling compaction: squash oldest half into one snapshot.""" + redis_key = f"{self._redis_key_prefix}:{document_id}:updates" + all_updates = await self._redis.lrange(redis_key, 0, -1) + if len(all_updates) <= 1: + return + mid = len(all_updates) // 2 + ydoc = Y.Doc() + for raw in all_updates[:mid]: + ydoc.apply_update(bytes(json.loads(raw))) + snapshot = json.dumps(list(ydoc.get_update())) + pipe = self._redis.pipeline() + pipe.delete(redis_key) + pipe.rpush(redis_key, snapshot, *all_updates[mid:]) + await pipe.execute() + + def _compact_updates_memory(self, document_id: str): + """Rolling compaction: squash oldest half into one snapshot.""" + updates = self._updates.get(document_id, []) + if len(updates) <= 1: + return + mid = len(updates) // 2 + ydoc = Y.Doc() + for update in updates[:mid]: + ydoc.apply_update(bytes(update)) + self._updates[document_id] = [ydoc.get_update()] + updates[mid:] async def get_updates(self, document_id: str) -> List[bytes]: document_id = document_id.replace(":", "_") From 4a0d8939954d599c82dc059e10216d3d12310dc8 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 15 Feb 2026 19:03:08 -0600 Subject: [PATCH 13/59] refac --- backend/open_webui/utils/models.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/utils/models.py b/backend/open_webui/utils/models.py index 8bef1591bb..f27a2c761a 100644 --- a/backend/open_webui/utils/models.py +++ b/backend/open_webui/utils/models.py @@ -290,6 +290,18 @@ def get_function_module_by_id(function_id): function_module, _, _ = get_function_module_from_cache(request, function_id) return function_module + # Batch-prefetch all needed function IDs to avoid N+1 queries + all_function_ids = set() + for model in models: + all_function_ids.update(model.get("action_ids", [])) + all_function_ids.update(model.get("filter_ids", [])) + all_function_ids.update(global_action_ids) + all_function_ids.update(global_filter_ids) + + functions_by_id = { + f.id: f for f in Functions.get_functions_by_ids(list(all_function_ids)) + } + for model in models: action_ids = [ action_id @@ -304,7 +316,7 @@ def get_function_module_by_id(function_id): model["actions"] = [] for action_id in action_ids: - action_function = Functions.get_function_by_id(action_id) + action_function = functions_by_id.get(action_id) if action_function is None: raise Exception(f"Action not found: {action_id}") @@ -315,7 +327,7 @@ def get_function_module_by_id(function_id): model["filters"] = [] for filter_id in filter_ids: - filter_function = Functions.get_function_by_id(filter_id) + filter_function = functions_by_id.get(filter_id) if filter_function is None: raise Exception(f"Filter not found: {filter_id}") From 3ae4c618e1736cb95710c0e83dd7b01bbd568043 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 15 Feb 2026 19:07:53 -0600 Subject: [PATCH 14/59] refac --- backend/open_webui/utils/models.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/backend/open_webui/utils/models.py b/backend/open_webui/utils/models.py index f27a2c761a..86ba292c51 100644 --- a/backend/open_webui/utils/models.py +++ b/backend/open_webui/utils/models.py @@ -286,11 +286,7 @@ def get_filter_items_from_module(function, module): } ] - def get_function_module_by_id(function_id): - function_module, _, _ = get_function_module_from_cache(request, function_id) - return function_module - - # Batch-prefetch all needed function IDs to avoid N+1 queries + # Batch-prefetch all needed function records to avoid N+1 queries all_function_ids = set() for model in models: all_function_ids.update(model.get("action_ids", [])) @@ -302,6 +298,12 @@ def get_function_module_by_id(function_id): f.id: f for f in Functions.get_functions_by_ids(list(all_function_ids)) } + # Pre-warm the function module cache once per unique function ID. + # This ensures each function's DB freshness check runs exactly once, + # not once per (model × function) pair. + for function_id in all_function_ids: + get_function_module_from_cache(request, function_id) + for model in models: action_ids = [ action_id @@ -320,7 +322,7 @@ def get_function_module_by_id(function_id): if action_function is None: raise Exception(f"Action not found: {action_id}") - function_module = get_function_module_by_id(action_id) + function_module = request.app.state.FUNCTIONS.get(action_id) model["actions"].extend( get_action_items_from_module(action_function, function_module) ) @@ -331,7 +333,7 @@ def get_function_module_by_id(function_id): if filter_function is None: raise Exception(f"Filter not found: {filter_id}") - function_module = get_function_module_by_id(filter_id) + function_module = request.app.state.FUNCTIONS.get(filter_id) if getattr(function_module, "toggle", None): model["filters"].extend( From 24179cde2f9e004ab5db38a323998ad6fb992ad4 Mon Sep 17 00:00:00 2001 From: Varun Chawla <34209028+veeceey@users.noreply.github.com> Date: Sun, 15 Feb 2026 17:09:41 -0800 Subject: [PATCH 15/59] fix: preserve trailing slash in MCP server URLs (#21212) Stop trimming trailing slashes from MCP server URLs on save. Some MCP servers (e.g. Bitrix24) require a trailing slash; removing it triggers a 301 redirect that drops Authorization headers, resulting in 400 errors. The trailing-slash trim is now skipped when the connection type is 'mcp', while OpenAPI connections continue to have it stripped as before. Fixes open-webui#21179 --- src/lib/components/AddToolServerModal.svelte | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lib/components/AddToolServerModal.svelte b/src/lib/components/AddToolServerModal.svelte index 5b64b692a7..555d8ff8e3 100644 --- a/src/lib/components/AddToolServerModal.svelte +++ b/src/lib/components/AddToolServerModal.svelte @@ -250,8 +250,12 @@ const submitHandler = async () => { loading = true; - // remove trailing slash from url - url = url.replace(/\/$/, ''); + // remove trailing slash from url for non-MCP connections + // MCP servers may require a trailing slash; stripping it can cause + // 301 redirects that lose auth headers (see #21179) + if (type !== 'mcp') { + url = url.replace(/\/$/, ''); + } if (id.includes(':') || id.includes('|')) { toast.error($i18n.t('ID cannot contain ":" or "|" characters')); loading = false; From 7a7d902238e4b067c3a5be0387420d4e66c171fc Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 15 Feb 2026 19:32:22 -0600 Subject: [PATCH 16/59] refac --- backend/open_webui/utils/middleware.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index bff0626a90..630ab608c6 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -2158,14 +2158,17 @@ async def process_chat_payload(request, form_data, user, metadata, model): ) if "code_interpreter" in features and features["code_interpreter"]: - form_data["messages"] = add_or_update_user_message( - ( - request.app.state.config.CODE_INTERPRETER_PROMPT_TEMPLATE - if request.app.state.config.CODE_INTERPRETER_PROMPT_TEMPLATE != "" - else DEFAULT_CODE_INTERPRETER_PROMPT - ), - form_data["messages"], - ) + # Skip XML-tag prompt injection when native FC is enabled — + # execute_code will be injected as a builtin tool instead + if metadata.get("params", {}).get("function_calling") != "native": + form_data["messages"] = add_or_update_user_message( + ( + request.app.state.config.CODE_INTERPRETER_PROMPT_TEMPLATE + if request.app.state.config.CODE_INTERPRETER_PROMPT_TEMPLATE != "" + else DEFAULT_CODE_INTERPRETER_PROMPT + ), + form_data["messages"], + ) tool_ids = form_data.pop("tool_ids", None) files = form_data.pop("files", None) From e10e7d056e2902580036b99e37259bf071a45450 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Mon, 16 Feb 2026 02:33:20 +0100 Subject: [PATCH 17/59] chore: changelog (#21424) * changelog: oauth session error handling * changelog: task model selector validation fix * changelog: skill content handling * changelog: add Spanish and German translations * changelog: move skill content to Added section * changelog: tool call, validation fixes * changelog: tool call message preservation links * changelog: update per-model tool toggles entry with per-conversation chat toggle feature * changelog: tool-server, startup, initialization * changelog: remove empty Changed section * changelog: fix duplicate Fixed section * changelog: revert old entry, add new entry to 0.8.2 * changelog: move built-in tool toggles to Added section * changelog: update date to 2026-02-16 * changelog: resource handle cleanup, file descriptors, leak fix * changelog: image preview, file modal, modal enhancement --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 01bdde5f3c..303d3e2053 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.8.2] - 2026-02-16 + +### Added + +- 🧠 **Skill content handling.** User-selected skills now have their full content injected into the chat, while model-attached skills only display name and description in the available skills list. This allows users to override skill behavior while model-attached skills remain flexible. [Commit](https://github.com/open-webui/open-webui/commit/393c0071dc612c5ac982fb37dfc0288cb9911439) +- ⚙️ **Chat toggles now control built-in tools.** Users can now disable web search, image generation, and code execution on a per-conversation basis, even when those tools are enabled as builtin tools on the model. [#20641](https://github.com/open-webui/open-webui/issues/20641), [#21318](https://github.com/open-webui/open-webui/discussions/21318), [Commit](https://github.com/open-webui/open-webui/commit/c46ef3b63bcc1e2e9adbdd18fab82c4bbe33ff6c), [Commit](https://github.com/open-webui/open-webui/commit/f1a1e64d2e9ad953b2bc2a9543e9a308b7c669c8) +- 🖼️ **Image preview in file modal.** Images uploaded to chats can now be previewed directly in the file management modal, making it easier to identify and manage image files. [#21413](https://github.com/open-webui/open-webui/issues/21413), [Commit](https://github.com/open-webui/open-webui/commit/e1b3e7252c1896c04d498547908f0fce111434e1) +- 🌐 **Translation updates.** Translations for Spanish and German were enhanced and expanded. + +### Fixed + +- 🔐 **OAuth session error handling.** Corrupted OAuth sessions are now gracefully handled and automatically cleaned up instead of causing errors. [Commit](https://github.com/open-webui/open-webui/commit/7e224e4a536b07ec008613f06592e34050e7067c) +- 🐛 **Task model selector validation.** The task model selector in admin settings now correctly accepts models based on the new access grants system instead of rejecting all models with an incorrect error. [Commit](https://github.com/open-webui/open-webui/commit/9a2595f0706d0c9d809ae7746001cf799f98db1d) +- 🔗 **Tool call message preservation.** Models no longer hallucinate tool outputs in multi-turn conversations because tool call history is now properly preserved instead of being merged into assistant messages. [#21098](https://github.com/open-webui/open-webui/discussions/21098), [#20600](https://github.com/open-webui/open-webui/issues/20600), [Commit](https://github.com/open-webui/open-webui/commit/f2aca781c87244cffc130aa2722e700c19a81d66) +- 🔧 **Tool server startup initialization.** External tool servers configured via the "TOOL_SERVER_CONNECTIONS" environment variable now initialize automatically on startup, eliminating the need to manually visit the Admin Panel and save for tools to become available. This enables proper GitOps and containerized deployments. [#18140](https://github.com/open-webui/open-webui/issues/18140), [#20914](https://github.com/open-webui/open-webui/pull/20914), [Commit](https://github.com/open-webui/open-webui/commit/f20cc6d7e6da493eb75ca1618f5cbd068fa57684) +- ♻️ **Resource handle cleanup.** File handles are now properly closed during audio transcription and pipeline uploads, preventing resource leaks that could cause system instability over time. [#21411](https://github.com/open-webui/open-webui/issues/21411) + ## [0.8.1] - 2026-02-14 ### Added From d215e46315d5a88d1496b17414e5fd6ca3e5885e Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 15 Feb 2026 22:49:56 -0600 Subject: [PATCH 18/59] refac: styling --- .../components/chat/Messages/CodeBlock.svelte | 18 ++-- .../components/common/ToolCallDisplay.svelte | 82 ++++++++++++------- 2 files changed, 61 insertions(+), 39 deletions(-) diff --git a/src/lib/components/chat/Messages/CodeBlock.svelte b/src/lib/components/chat/Messages/CodeBlock.svelte index c236671f5f..e11e4c3557 100644 --- a/src/lib/components/chat/Messages/CodeBlock.svelte +++ b/src/lib/components/chat/Messages/CodeBlock.svelte @@ -417,13 +417,13 @@
{#if ['mermaid', 'vega', 'vega-lite'].includes(lang)} {#if renderHTML} @@ -441,13 +441,13 @@ {/if} {:else}
{lang}
From 33308022f0f1d87baaeeb7c71cf5b88e774030f1 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 15 Feb 2026 23:57:40 -0600 Subject: [PATCH 23/59] refac --- backend/open_webui/models/groups.py | 67 ++++++++++++++++++----------- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/backend/open_webui/models/groups.py b/backend/open_webui/models/groups.py index 8fe720ecc6..a32f36f008 100644 --- a/backend/open_webui/models/groups.py +++ b/backend/open_webui/models/groups.py @@ -164,7 +164,10 @@ def get_all_groups(self, db: Optional[Session] = None) -> list[GroupModel]: def get_groups(self, filter, db: Optional[Session] = None) -> list[GroupResponse]: with get_db_context(db) as db: - query = db.query(Group) + member_count = func.count(GroupMember.user_id).label("member_count") + query = db.query(Group, member_count).outerjoin( + GroupMember, GroupMember.group_id == Group.id + ) if filter: if "query" in filter: @@ -179,9 +182,6 @@ def get_groups(self, filter, db: Optional[Session] = None) -> list[GroupResponse json_share_lower = func.lower(json_share_str) if share_value: - # Groups open to anyone: data is null, config.share is null, or share is true - # Use case-insensitive string comparison to handle variations like "True", "TRUE" - # Handle potential JSON boolean to string casting issues by checking for both string 'true' and boolean equivalence if possible, anyone_can_share = or_( Group.data.is_(None), json_share_str.is_(None), @@ -190,7 +190,6 @@ def get_groups(self, filter, db: Optional[Session] = None) -> list[GroupResponse ) if member_id: - # Also include member-only groups where user is a member member_groups_select = select(GroupMember.group_id).where( GroupMember.user_id == member_id ) @@ -211,21 +210,28 @@ def get_groups(self, filter, db: Optional[Session] = None) -> list[GroupResponse else: # Only apply member_id filter when share filter is NOT present if "member_id" in filter: - query = query.join( - GroupMember, GroupMember.group_id == Group.id - ).filter(GroupMember.user_id == filter["member_id"]) + query = query.filter( + Group.id.in_( + select(GroupMember.group_id).where( + GroupMember.user_id == filter["member_id"] + ) + ) + ) + + results = ( + query.group_by(Group.id) + .order_by(Group.updated_at.desc()) + .all() + ) - groups = query.order_by(Group.updated_at.desc()).all() - group_ids = [group.id for group in groups] - member_counts = self.get_group_member_counts_by_ids(group_ids, db=db) return [ GroupResponse.model_validate( { **GroupModel.model_validate(group).model_dump(), - "member_count": member_counts.get(group.id, 0), + "member_count": count or 0, } ) - for group in groups + for group, count in results ] def search_groups( @@ -242,31 +248,42 @@ def search_groups( if "query" in filter: query = query.filter(Group.name.ilike(f"%{filter['query']}%")) if "member_id" in filter: - query = query.join( - GroupMember, GroupMember.group_id == Group.id - ).filter(GroupMember.user_id == filter["member_id"]) + query = query.filter( + Group.id.in_( + select(GroupMember.group_id).where( + GroupMember.user_id == filter["member_id"] + ) + ) + ) if "share" in filter: - # 'share' is stored in data JSON, support both sqlite and postgres share_value = filter["share"] - print("Filtering by share:", share_value) query = query.filter( Group.data.op("->>")("share") == str(share_value) ) total = query.count() - query = query.order_by(Group.updated_at.desc()) - groups = query.offset(skip).limit(limit).all() - group_ids = [group.id for group in groups] - member_counts = self.get_group_member_counts_by_ids(group_ids, db=db) + + member_count = func.count(GroupMember.user_id).label("member_count") + results = ( + query.add_columns(member_count) + .outerjoin(GroupMember, GroupMember.group_id == Group.id) + .group_by(Group.id) + .order_by(Group.updated_at.desc()) + .offset(skip) + .limit(limit) + .all() + ) return { "items": [ GroupResponse.model_validate( - **GroupModel.model_validate(group).model_dump(), - member_count=member_counts.get(group.id, 0), + { + **GroupModel.model_validate(group).model_dump(), + "member_count": count or 0, + } ) - for group in groups + for group, count in results ], "total": total, } From c748c3ede71ea599dff3f45b2cb084c7697940d2 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 16 Feb 2026 00:41:36 -0600 Subject: [PATCH 24/59] refac --- backend/open_webui/models/chats.py | 88 ++++++++++++++++++----------- backend/open_webui/models/tags.py | 40 +++++++++++++ backend/open_webui/routers/chats.py | 36 +++++------- 3 files changed, 107 insertions(+), 57 deletions(-) diff --git a/backend/open_webui/models/chats.py b/backend/open_webui/models/chats.py index 7ae9f7a38b..2553e4306d 100644 --- a/backend/open_webui/models/chats.py +++ b/backend/open_webui/models/chats.py @@ -431,22 +431,31 @@ def update_chat_title_by_id(self, id: str, title: str) -> Optional[ChatModel]: def update_chat_tags_by_id( self, id: str, tags: list[str], user ) -> Optional[ChatModel]: - chat = self.get_chat_by_id(id) - if chat is None: - return None + with get_db_context() as db: + chat = db.get(Chat, id) + if chat is None: + return None - self.delete_all_tags_by_id_and_user_id(id, user.id) + old_tags = chat.meta.get("tags", []) + new_tags = [t for t in tags if t.replace(" ", "_").lower() != "none"] + new_tag_ids = [t.replace(" ", "_").lower() for t in new_tags] - for tag in chat.meta.get("tags", []): - if self.count_chats_by_tag_name_and_user_id(tag, user.id) == 0: - Tags.delete_tag_by_name_and_user_id(tag, user.id) + # Single meta update + chat.meta = {**chat.meta, "tags": new_tag_ids} + db.commit() + db.refresh(chat) + + # Batch-create any missing tag rows + Tags.ensure_tags_exist(new_tags, user.id, db=db) - for tag_name in tags: - if tag_name.lower() == "none": - continue + # Clean up orphaned old tags in one query + removed = set(old_tags) - set(new_tag_ids) + if removed: + self.delete_orphan_tags_for_user( + list(removed), user.id, db=db + ) - self.add_chat_tag_by_id_and_user_id_and_tag_name(id, user.id, tag_name) - return self.get_chat_by_id(id) + return ChatModel.model_validate(chat) def get_chat_title_by_id(self, id: str) -> Optional[str]: chat = self.get_chat_by_id(id) @@ -1267,8 +1276,8 @@ def get_chat_tags_by_id_and_user_id( ) -> list[TagModel]: with get_db_context(db) as db: chat = db.get(Chat, id) - tags = chat.meta.get("tags", []) - return [Tags.get_tag_by_name_and_user_id(tag, user_id) for tag in tags] + tag_ids = chat.meta.get("tags", []) + return Tags.get_tags_by_ids_and_user_id(tag_ids, user_id, db=db) def get_chat_list_by_user_id_and_tag_name( self, @@ -1309,20 +1318,16 @@ def get_chat_list_by_user_id_and_tag_name( def add_chat_tag_by_id_and_user_id_and_tag_name( self, id: str, user_id: str, tag_name: str, db: Optional[Session] = None ) -> Optional[ChatModel]: - tag = Tags.get_tag_by_name_and_user_id(tag_name, user_id) - if tag is None: - tag = Tags.insert_new_tag(tag_name, user_id) + tag_id = tag_name.replace(" ", "_").lower() + Tags.ensure_tags_exist([tag_name], user_id, db=db) try: with get_db_context(db) as db: chat = db.get(Chat, id) - - tag_id = tag.id if tag_id not in chat.meta.get("tags", []): chat.meta = { **chat.meta, "tags": list(set(chat.meta.get("tags", []) + [tag_id])), } - db.commit() db.refresh(chat) return ChatModel.model_validate(chat) @@ -1332,40 +1337,55 @@ def add_chat_tag_by_id_and_user_id_and_tag_name( def count_chats_by_tag_name_and_user_id( self, tag_name: str, user_id: str, db: Optional[Session] = None ) -> int: - with get_db_context(db) as db: # Assuming `get_db()` returns a session object + with get_db_context(db) as db: query = db.query(Chat).filter_by(user_id=user_id, archived=False) - - # Normalize the tag_name for consistency tag_id = tag_name.replace(" ", "_").lower() if db.bind.dialect.name == "sqlite": - # SQLite JSON1 support for querying the tags inside the `meta` JSON field query = query.filter( text( - f"EXISTS (SELECT 1 FROM json_each(Chat.meta, '$.tags') WHERE json_each.value = :tag_id)" + "EXISTS (SELECT 1 FROM json_each(Chat.meta, '$.tags') WHERE json_each.value = :tag_id)" ) ).params(tag_id=tag_id) - elif db.bind.dialect.name == "postgresql": - # PostgreSQL JSONB support for querying the tags inside the `meta` JSON field query = query.filter( text( "EXISTS (SELECT 1 FROM json_array_elements_text(Chat.meta->'tags') elem WHERE elem = :tag_id)" ) ).params(tag_id=tag_id) - else: raise NotImplementedError( f"Unsupported dialect: {db.bind.dialect.name}" ) - # Get the count of matching records - count = query.count() - - # Debugging output for inspection - log.info(f"Count of chats for tag '{tag_name}': {count}") + return query.count() - return count + def delete_orphan_tags_for_user( + self, + tag_ids: list[str], + user_id: str, + threshold: int = 0, + db: Optional[Session] = None, + ) -> None: + """Delete tag rows from *tag_ids* that appear in at most *threshold* + non-archived chats for *user_id*. One query to find orphans, one to + delete them. + + Use threshold=0 after a tag is already removed from a chat's meta. + Use threshold=1 when the chat itself is about to be deleted (the + referencing chat still exists at query time). + """ + if not tag_ids: + return + with get_db_context(db) as db: + orphans = [] + for tag_id in tag_ids: + count = self.count_chats_by_tag_name_and_user_id( + tag_id, user_id, db=db + ) + if count <= threshold: + orphans.append(tag_id) + Tags.delete_tags_by_ids_and_user_id(orphans, user_id, db=db) def count_chats_by_folder_id_and_user_id( self, folder_id: str, user_id: str, db: Optional[Session] = None diff --git a/backend/open_webui/models/tags.py b/backend/open_webui/models/tags.py index 64cb559547..ef6ad1ded7 100644 --- a/backend/open_webui/models/tags.py +++ b/backend/open_webui/models/tags.py @@ -115,5 +115,45 @@ def delete_tag_by_name_and_user_id( log.error(f"delete_tag: {e}") return False + def delete_tags_by_ids_and_user_id( + self, ids: list[str], user_id: str, db: Optional[Session] = None + ) -> bool: + """Delete all tags whose id is in *ids* for the given user, in one query.""" + if not ids: + return True + try: + with get_db_context(db) as db: + db.query(Tag).filter( + Tag.id.in_(ids), Tag.user_id == user_id + ).delete(synchronize_session=False) + db.commit() + return True + except Exception as e: + log.error(f"delete_tags_by_ids: {e}") + return False + + def ensure_tags_exist( + self, names: list[str], user_id: str, db: Optional[Session] = None + ) -> None: + """Create tag rows for any *names* that don't already exist for *user_id*.""" + if not names: + return + ids = [n.replace(" ", "_").lower() for n in names] + with get_db_context(db) as db: + existing = { + t.id + for t in db.query(Tag.id) + .filter(Tag.id.in_(ids), Tag.user_id == user_id) + .all() + } + new_tags = [ + Tag(id=tag_id, name=name, user_id=user_id) + for tag_id, name in zip(ids, names) + if tag_id not in existing + ] + if new_tags: + db.add_all(new_tags) + db.commit() + Tags = TagTable() diff --git a/backend/open_webui/routers/chats.py b/backend/open_webui/routers/chats.py index e03cdc7ba9..69e47123f0 100644 --- a/backend/open_webui/routers/chats.py +++ b/backend/open_webui/routers/chats.py @@ -1131,9 +1131,9 @@ async def delete_chat_by_id( status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND, ) - for tag in chat.meta.get("tags", []): - if Chats.count_chats_by_tag_name_and_user_id(tag, user.id, db=db) == 1: - Tags.delete_tag_by_name_and_user_id(tag, user.id, db=db) + Chats.delete_orphan_tags_for_user( + chat.meta.get("tags", []), user.id, threshold=1, db=db + ) result = Chats.delete_chat_by_id(id, db=db) @@ -1153,9 +1153,9 @@ async def delete_chat_by_id( status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND, ) - for tag in chat.meta.get("tags", []): - if Chats.count_chats_by_tag_name_and_user_id(tag, user.id, db=db) == 1: - Tags.delete_tag_by_name_and_user_id(tag, user.id, db=db) + Chats.delete_orphan_tags_for_user( + chat.meta.get("tags", []), user.id, threshold=1, db=db + ) result = Chats.delete_chat_by_id_and_user_id(id, user.id, db=db) return result @@ -1317,21 +1317,13 @@ async def archive_chat_by_id( if chat: chat = Chats.toggle_chat_archive_by_id(id, db=db) - # Delete tags if chat is archived + tag_ids = chat.meta.get("tags", []) if chat.archived: - for tag_id in chat.meta.get("tags", []): - if ( - Chats.count_chats_by_tag_name_and_user_id(tag_id, user.id, db=db) - == 0 - ): - log.debug(f"deleting tag: {tag_id}") - Tags.delete_tag_by_name_and_user_id(tag_id, user.id, db=db) + # Archived chats are excluded from count — clean up orphans + Chats.delete_orphan_tags_for_user(tag_ids, user.id, db=db) else: - for tag_id in chat.meta.get("tags", []): - tag = Tags.get_tag_by_name_and_user_id(tag_id, user.id, db=db) - if tag is None: - log.debug(f"inserting tag: {tag_id}") - tag = Tags.insert_new_tag(tag_id, user.id, db=db) + # Unarchived — ensure tag rows exist + Tags.ensure_tags_exist(tag_ids, user.id, db=db) return ChatResponse(**chat.model_dump()) else: @@ -1537,11 +1529,9 @@ async def delete_all_tags_by_id( ): chat = Chats.get_chat_by_id_and_user_id(id, user.id, db=db) if chat: + old_tags = chat.meta.get("tags", []) Chats.delete_all_tags_by_id_and_user_id(id, user.id, db=db) - - for tag in chat.meta.get("tags", []): - if Chats.count_chats_by_tag_name_and_user_id(tag, user.id, db=db) == 0: - Tags.delete_tag_by_name_and_user_id(tag, user.id, db=db) + Chats.delete_orphan_tags_for_user(old_tags, user.id, db=db) return True else: From 09dc28df1edea36fc14e06f1251aaf1705d563b4 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 16 Feb 2026 00:43:32 -0600 Subject: [PATCH 25/59] chore: format --- backend/open_webui/main.py | 4 +--- backend/open_webui/models/chats.py | 8 ++------ backend/open_webui/models/groups.py | 6 +----- backend/open_webui/models/tags.py | 6 +++--- backend/open_webui/routers/tools.py | 4 +++- backend/open_webui/utils/middleware.py | 13 ++++++------ .../admin/Settings/Interface.svelte | 20 +++++++++++++++++-- src/lib/i18n/locales/ar-BH/translation.json | 3 +++ src/lib/i18n/locales/ar/translation.json | 3 +++ src/lib/i18n/locales/bg-BG/translation.json | 3 +++ src/lib/i18n/locales/bn-BD/translation.json | 3 +++ src/lib/i18n/locales/bo-TB/translation.json | 3 +++ src/lib/i18n/locales/bs-BA/translation.json | 3 +++ src/lib/i18n/locales/ca-ES/translation.json | 3 +++ src/lib/i18n/locales/ceb-PH/translation.json | 3 +++ src/lib/i18n/locales/cs-CZ/translation.json | 3 +++ src/lib/i18n/locales/da-DK/translation.json | 3 +++ src/lib/i18n/locales/de-DE/translation.json | 3 +++ src/lib/i18n/locales/dg-DG/translation.json | 3 +++ src/lib/i18n/locales/el-GR/translation.json | 3 +++ src/lib/i18n/locales/en-GB/translation.json | 3 +++ src/lib/i18n/locales/en-US/translation.json | 3 +++ src/lib/i18n/locales/es-ES/translation.json | 3 +++ src/lib/i18n/locales/et-EE/translation.json | 3 +++ src/lib/i18n/locales/eu-ES/translation.json | 3 +++ src/lib/i18n/locales/fa-IR/translation.json | 3 +++ src/lib/i18n/locales/fi-FI/translation.json | 3 +++ src/lib/i18n/locales/fr-CA/translation.json | 3 +++ src/lib/i18n/locales/fr-FR/translation.json | 3 +++ src/lib/i18n/locales/gl-ES/translation.json | 3 +++ src/lib/i18n/locales/he-IL/translation.json | 3 +++ src/lib/i18n/locales/hi-IN/translation.json | 3 +++ src/lib/i18n/locales/hr-HR/translation.json | 3 +++ src/lib/i18n/locales/hu-HU/translation.json | 3 +++ src/lib/i18n/locales/id-ID/translation.json | 3 +++ src/lib/i18n/locales/ie-GA/translation.json | 3 +++ src/lib/i18n/locales/it-IT/translation.json | 3 +++ src/lib/i18n/locales/ja-JP/translation.json | 3 +++ src/lib/i18n/locales/ka-GE/translation.json | 3 +++ src/lib/i18n/locales/kab-DZ/translation.json | 3 +++ src/lib/i18n/locales/ko-KR/translation.json | 3 +++ src/lib/i18n/locales/lt-LT/translation.json | 3 +++ src/lib/i18n/locales/lv-LV/translation.json | 3 +++ src/lib/i18n/locales/ms-MY/translation.json | 3 +++ src/lib/i18n/locales/nb-NO/translation.json | 3 +++ src/lib/i18n/locales/nl-NL/translation.json | 3 +++ src/lib/i18n/locales/pa-IN/translation.json | 3 +++ src/lib/i18n/locales/pl-PL/translation.json | 3 +++ src/lib/i18n/locales/pt-BR/translation.json | 3 +++ src/lib/i18n/locales/pt-PT/translation.json | 3 +++ src/lib/i18n/locales/ro-RO/translation.json | 3 +++ src/lib/i18n/locales/ru-RU/translation.json | 3 +++ src/lib/i18n/locales/sk-SK/translation.json | 3 +++ src/lib/i18n/locales/sr-RS/translation.json | 3 +++ src/lib/i18n/locales/sv-SE/translation.json | 3 +++ src/lib/i18n/locales/th-TH/translation.json | 3 +++ src/lib/i18n/locales/tk-TM/translation.json | 3 +++ src/lib/i18n/locales/tr-TR/translation.json | 3 +++ src/lib/i18n/locales/ug-CN/translation.json | 3 +++ src/lib/i18n/locales/uk-UA/translation.json | 3 +++ src/lib/i18n/locales/ur-PK/translation.json | 3 +++ .../i18n/locales/uz-Cyrl-UZ/translation.json | 3 +++ .../i18n/locales/uz-Latn-Uz/translation.json | 3 +++ src/lib/i18n/locales/vi-VN/translation.json | 3 +++ src/lib/i18n/locales/zh-CN/translation.json | 3 +++ src/lib/i18n/locales/zh-TW/translation.json | 3 +++ 66 files changed, 212 insertions(+), 26 deletions(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 3a14ade8bc..b1b754724e 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -679,9 +679,7 @@ async def lifespan(app: FastAPI): } ) await set_tool_servers(mock_request) - log.info( - f"Initialized {len(app.state.TOOL_SERVERS)} tool server(s)" - ) + log.info(f"Initialized {len(app.state.TOOL_SERVERS)} tool server(s)") except Exception as e: log.warning(f"Failed to initialize tool servers at startup: {e}") diff --git a/backend/open_webui/models/chats.py b/backend/open_webui/models/chats.py index 2553e4306d..1418abd62d 100644 --- a/backend/open_webui/models/chats.py +++ b/backend/open_webui/models/chats.py @@ -451,9 +451,7 @@ def update_chat_tags_by_id( # Clean up orphaned old tags in one query removed = set(old_tags) - set(new_tag_ids) if removed: - self.delete_orphan_tags_for_user( - list(removed), user.id, db=db - ) + self.delete_orphan_tags_for_user(list(removed), user.id, db=db) return ChatModel.model_validate(chat) @@ -1380,9 +1378,7 @@ def delete_orphan_tags_for_user( with get_db_context(db) as db: orphans = [] for tag_id in tag_ids: - count = self.count_chats_by_tag_name_and_user_id( - tag_id, user_id, db=db - ) + count = self.count_chats_by_tag_name_and_user_id(tag_id, user_id, db=db) if count <= threshold: orphans.append(tag_id) Tags.delete_tags_by_ids_and_user_id(orphans, user_id, db=db) diff --git a/backend/open_webui/models/groups.py b/backend/open_webui/models/groups.py index a32f36f008..bb3a9347be 100644 --- a/backend/open_webui/models/groups.py +++ b/backend/open_webui/models/groups.py @@ -218,11 +218,7 @@ def get_groups(self, filter, db: Optional[Session] = None) -> list[GroupResponse ) ) - results = ( - query.group_by(Group.id) - .order_by(Group.updated_at.desc()) - .all() - ) + results = query.group_by(Group.id).order_by(Group.updated_at.desc()).all() return [ GroupResponse.model_validate( diff --git a/backend/open_webui/models/tags.py b/backend/open_webui/models/tags.py index ef6ad1ded7..147bb394d5 100644 --- a/backend/open_webui/models/tags.py +++ b/backend/open_webui/models/tags.py @@ -123,9 +123,9 @@ def delete_tags_by_ids_and_user_id( return True try: with get_db_context(db) as db: - db.query(Tag).filter( - Tag.id.in_(ids), Tag.user_id == user_id - ).delete(synchronize_session=False) + db.query(Tag).filter(Tag.id.in_(ids), Tag.user_id == user_id).delete( + synchronize_session=False + ) db.commit() return True except Exception as e: diff --git a/backend/open_webui/routers/tools.py b/backend/open_webui/routers/tools.py index d489f9b643..fab5039909 100644 --- a/backend/open_webui/routers/tools.py +++ b/backend/open_webui/routers/tools.py @@ -107,7 +107,9 @@ async def get_tools( # MCP Tool Servers for server in request.app.state.config.TOOL_SERVER_CONNECTIONS: - if server.get("type", "openapi") == "mcp" and server.get("config", {}).get("enable"): + if server.get("type", "openapi") == "mcp" and server.get("config", {}).get( + "enable" + ): server_id = server.get("info", {}).get("id") auth_type = server.get("auth_type", "none") diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 630ab608c6..7ab7537de2 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -1918,9 +1918,7 @@ async def convert_url_images_to_base64(form_data): return form_data -def load_messages_from_db( - chat_id: str, message_id: str -) -> Optional[list[dict]]: +def load_messages_from_db(chat_id: str, message_id: str) -> Optional[list[dict]]: """ Load the message chain from DB up to message_id, keeping only LLM-relevant fields (role, content, output). @@ -2164,7 +2162,8 @@ async def process_chat_payload(request, form_data, user, metadata, model): form_data["messages"] = add_or_update_user_message( ( request.app.state.config.CODE_INTERPRETER_PROMPT_TEMPLATE - if request.app.state.config.CODE_INTERPRETER_PROMPT_TEMPLATE != "" + if request.app.state.config.CODE_INTERPRETER_PROMPT_TEMPLATE + != "" else DEFAULT_CODE_INTERPRETER_PROMPT ), form_data["messages"], @@ -2198,7 +2197,7 @@ async def process_chat_payload(request, form_data, user, metadata, model): if skill.id in user_skill_ids: # User-selected: inject full content form_data["messages"] = add_or_update_system_message( - f"\n{skill.content}\n", + f'\n{skill.content}\n', form_data["messages"], append=True, ) @@ -2447,7 +2446,9 @@ async def tool_function(**kwargs): { **extra_params, "__event_emitter__": event_emitter, - "__skill_ids__": [s.id for s in available_skills if s.id not in user_skill_ids], + "__skill_ids__": [ + s.id for s in available_skills if s.id not in user_skill_ids + ], }, features, model, diff --git a/src/lib/components/admin/Settings/Interface.svelte b/src/lib/components/admin/Settings/Interface.svelte index 397306d902..cf1becbaef 100644 --- a/src/lib/components/admin/Settings/Interface.svelte +++ b/src/lib/components/admin/Settings/Interface.svelte @@ -152,7 +152,15 @@ if (taskConfig.TASK_MODEL) { const model = models.find((m) => m.id === taskConfig.TASK_MODEL); if (model) { - if (model?.access_grants && !model.access_grants.some((g) => g.principal_type === 'user' && g.principal_id === '*' && g.permission === 'read')) { + if ( + model?.access_grants && + !model.access_grants.some( + (g) => + g.principal_type === 'user' && + g.principal_id === '*' && + g.permission === 'read' + ) + ) { toast.error( $i18n.t( 'This model is not publicly available. Please select another model.' @@ -187,7 +195,15 @@ if (taskConfig.TASK_MODEL_EXTERNAL) { const model = models.find((m) => m.id === taskConfig.TASK_MODEL_EXTERNAL); if (model) { - if (model?.access_grants && !model.access_grants.some((g) => g.principal_type === 'user' && g.principal_id === '*' && g.permission === 'read')) { + if ( + model?.access_grants && + !model.access_grants.some( + (g) => + g.principal_type === 'user' && + g.principal_id === '*' && + g.permission === 'read' + ) + ) { toast.error( $i18n.t( 'This model is not publicly available. Please select another model.' diff --git a/src/lib/i18n/locales/ar-BH/translation.json b/src/lib/i18n/locales/ar-BH/translation.json index 83d4b7db0e..fe8c51199c 100644 --- a/src/lib/i18n/locales/ar-BH/translation.json +++ b/src/lib/i18n/locales/ar-BH/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "آخر", + "Output": "", "OUTPUT": "", "Output format": "", "Output Format": "", @@ -1669,6 +1670,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/ar/translation.json b/src/lib/i18n/locales/ar/translation.json index fdb000d57e..43eb1ef2d4 100644 --- a/src/lib/i18n/locales/ar/translation.json +++ b/src/lib/i18n/locales/ar/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "تنظيم المستخدمين الخاصين بك", "Other": "آخر", + "Output": "", "OUTPUT": "الإخراج", "Output format": "تنسيق الإخراج", "Output Format": "", @@ -1669,6 +1670,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/bg-BG/translation.json b/src/lib/i18n/locales/bg-BG/translation.json index 0ff9d74c37..7f751ed383 100644 --- a/src/lib/i18n/locales/bg-BG/translation.json +++ b/src/lib/i18n/locales/bg-BG/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "Организирайте вашите потребители", "Other": "Друго", + "Output": "", "OUTPUT": "ИЗХОД", "Output format": "Изходен формат", "Output Format": "", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/bn-BD/translation.json b/src/lib/i18n/locales/bn-BD/translation.json index a930a7e4c1..7c4e83e9f2 100644 --- a/src/lib/i18n/locales/bn-BD/translation.json +++ b/src/lib/i18n/locales/bn-BD/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "অন্যান্য", + "Output": "", "OUTPUT": "", "Output format": "", "Output Format": "", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/bo-TB/translation.json b/src/lib/i18n/locales/bo-TB/translation.json index c16183bd75..c2bc732d2a 100644 --- a/src/lib/i18n/locales/bo-TB/translation.json +++ b/src/lib/i18n/locales/bo-TB/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "ཁྱེད་ཀྱི་བེད་སྤྱོད་མཁན་སྒྲིག་འཛུགས།", "Other": "གཞན།", + "Output": "", "OUTPUT": "ཐོན་འབྲས།", "Output format": "ཐོན་འབྲས་ཀྱི་བཀོད་པ།", "Output Format": "", @@ -1664,6 +1665,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/bs-BA/translation.json b/src/lib/i18n/locales/bs-BA/translation.json index 7373590753..af14140e40 100644 --- a/src/lib/i18n/locales/bs-BA/translation.json +++ b/src/lib/i18n/locales/bs-BA/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "Ostalo", + "Output": "", "OUTPUT": "", "Output format": "", "Output Format": "", @@ -1666,6 +1667,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index a9af1bbfa9..80a52fce94 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "Llista ordenada", "Organize your users": "Organitza els teus usuaris", "Other": "Altres", + "Output": "", "OUTPUT": "SORTIDA", "Output format": "Format de sortida", "Output Format": "Format de sortida", @@ -1666,6 +1667,8 @@ "Skill updated successfully": "Habilitat actualitzada correctament", "Skills": "Habilitats", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Ometre la memòria cau", "Skip the cache and re-run the inference. Defaults to False.": "Omet la memòria cai i torna a executar la inferència. Per defecte és Fals.", "Something went wrong :/": "Quelcom no ha anat bé", diff --git a/src/lib/i18n/locales/ceb-PH/translation.json b/src/lib/i18n/locales/ceb-PH/translation.json index fa2754afc7..52df723518 100644 --- a/src/lib/i18n/locales/ceb-PH/translation.json +++ b/src/lib/i18n/locales/ceb-PH/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "", + "Output": "", "OUTPUT": "", "Output format": "", "Output Format": "", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/cs-CZ/translation.json b/src/lib/i18n/locales/cs-CZ/translation.json index c4d6edb64d..6450f56cdb 100644 --- a/src/lib/i18n/locales/cs-CZ/translation.json +++ b/src/lib/i18n/locales/cs-CZ/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "Číslovaný seznam", "Organize your users": "Uspořádejte své uživatele", "Other": "Jiné", + "Output": "", "OUTPUT": "VÝSTUP", "Output format": "Formát výstupu", "Output Format": "Formát výstupu", @@ -1667,6 +1668,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Přeskočit mezipaměť", "Skip the cache and re-run the inference. Defaults to False.": "Přeskočit mezipaměť a znovu spustit inferenci. Výchozí hodnota je False.", "Something went wrong :/": "Něco se pokazilo :/", diff --git a/src/lib/i18n/locales/da-DK/translation.json b/src/lib/i18n/locales/da-DK/translation.json index 562b4a7400..ca28cd413e 100644 --- a/src/lib/i18n/locales/da-DK/translation.json +++ b/src/lib/i18n/locales/da-DK/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "Nummereret liste", "Organize your users": "Organiser dine brugere", "Other": "Andet", + "Output": "", "OUTPUT": "OUTPUT", "Output format": "Outputformat", "Output Format": "Output format", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Spring cache over", "Skip the cache and re-run the inference. Defaults to False.": "Spring cachen over og kør inferensen igen. Standard er falsk.", "Something went wrong :/": "Noget gik galt :/", diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index fc2ffd4687..3405a4add1 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "Nummerierte Liste", "Organize your users": "Organisieren Sie Ihre Benutzer", "Other": "Andere", + "Output": "", "OUTPUT": "AUSGABE", "Output format": "Ausgabeformat", "Output Format": "Ausgabeformat", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "Skill erfolgreich aktualisiert", "Skills": "Skills", "Skills Access": "Skills Zugang", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Cache überspringen", "Skip the cache and re-run the inference. Defaults to False.": "Cache überspringen und die Inferenz erneut ausführen. Standardmäßig deaktiviert.", "Something went wrong :/": "Etwas ist schiefgelaufen :/", diff --git a/src/lib/i18n/locales/dg-DG/translation.json b/src/lib/i18n/locales/dg-DG/translation.json index 55c6b6a4f7..bafcc7a760 100644 --- a/src/lib/i18n/locales/dg-DG/translation.json +++ b/src/lib/i18n/locales/dg-DG/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "", + "Output": "", "OUTPUT": "", "Output format": "", "Output Format": "", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/el-GR/translation.json b/src/lib/i18n/locales/el-GR/translation.json index 00ccf22822..4ac9878e61 100644 --- a/src/lib/i18n/locales/el-GR/translation.json +++ b/src/lib/i18n/locales/el-GR/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "Οργανώστε τους χρήστες σας", "Other": "Άλλο", + "Output": "", "OUTPUT": "ΕΞΟΔΟΣ", "Output format": "Μορφή εξόδου", "Output Format": "Μορφή Εξόδου", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/en-GB/translation.json b/src/lib/i18n/locales/en-GB/translation.json index 9e6e209bc8..6231963516 100644 --- a/src/lib/i18n/locales/en-GB/translation.json +++ b/src/lib/i18n/locales/en-GB/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "Organise your users", "Other": "", + "Output": "", "OUTPUT": "", "Output format": "", "Output Format": "", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index f4c2768d5d..b6aa646895 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "", + "Output": "", "OUTPUT": "", "Output format": "", "Output Format": "", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index 73b979dd32..7594c8b515 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "Lista Ordenada", "Organize your users": "Organiza tus usuarios", "Other": "Otro", + "Output": "", "OUTPUT": "SALIDA", "Output format": "Formato de salida", "Output Format": "Formato de Salida", @@ -1666,6 +1667,8 @@ "Skill updated successfully": "Habilidad actualiada correctamente", "Skills": "Habilidades", "Skills Access": "Acceso a Habilidades", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Evitar Caché", "Skip the cache and re-run the inference. Defaults to False.": "Evitar caché y reiniciar la interfaz. Valor predeterminado Falso", "Something went wrong :/": "Algo ha ido mal :/", diff --git a/src/lib/i18n/locales/et-EE/translation.json b/src/lib/i18n/locales/et-EE/translation.json index cef8481d21..a0b6b73fd1 100644 --- a/src/lib/i18n/locales/et-EE/translation.json +++ b/src/lib/i18n/locales/et-EE/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "Ordered List", "Organize your users": "Korraldage oma kasutajad", "Other": "Muu", + "Output": "", "OUTPUT": "VÄLJUND", "Output format": "Väljundformaat", "Output Format": "Output Format", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Skip Vahemälu", "Skip the cache and re-run the inference. Defaults to False.": "Skip the vahemälu ja re-run the inference. Defaults kuni False.", "Something went wrong :/": "Something went wrong :/", diff --git a/src/lib/i18n/locales/eu-ES/translation.json b/src/lib/i18n/locales/eu-ES/translation.json index 65db2d2e7b..f93da7afde 100644 --- a/src/lib/i18n/locales/eu-ES/translation.json +++ b/src/lib/i18n/locales/eu-ES/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "Antolatu zure erabiltzaileak", "Other": "Bestelakoa", + "Output": "", "OUTPUT": "IRTEERA", "Output format": "Irteera formatua", "Output Format": "", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/fa-IR/translation.json b/src/lib/i18n/locales/fa-IR/translation.json index eb3efc026a..89584d0d3f 100644 --- a/src/lib/i18n/locales/fa-IR/translation.json +++ b/src/lib/i18n/locales/fa-IR/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "لیست شماره\u200cگذاری شده", "Organize your users": "کاربران خود را سازماندهی کنید", "Other": "دیگر", + "Output": "", "OUTPUT": "خروجی", "Output format": "قالب خروجی", "Output Format": "قالب خروجی", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "رد کردن کش", "Skip the cache and re-run the inference. Defaults to False.": "کش را رد کرده و استنتاج را مجدداً اجرا کنید. پیش\u200cفرض: False.", "Something went wrong :/": "مشکلی پیش آمد :/", diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index 251ee6998c..2b87bb67bc 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "Järjestetty lista", "Organize your users": "Järjestä käyttäjäsi", "Other": "Muu", + "Output": "", "OUTPUT": "TULOSTE", "Output format": "Tulosteen muoto", "Output Format": "Tulosteen muoto", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Ohita välimuisti", "Skip the cache and re-run the inference. Defaults to False.": "Ohita välimuisti ja suorita päätelmä uudelleen. Oletusarvo ei käytössä.", "Something went wrong :/": "Jokin meni pieleen :/", diff --git a/src/lib/i18n/locales/fr-CA/translation.json b/src/lib/i18n/locales/fr-CA/translation.json index 812f3366ce..959a3d68e0 100644 --- a/src/lib/i18n/locales/fr-CA/translation.json +++ b/src/lib/i18n/locales/fr-CA/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "Organisez vos utilisateurs", "Other": "Autre", + "Output": "", "OUTPUT": "SORTIE", "Output format": "Format de sortie", "Output Format": "Format de sortie", @@ -1666,6 +1667,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Ne pas utiliser le cache", "Skip the cache and re-run the inference. Defaults to False.": "Ne pas utiliser le cache et re executer l'inférence. Par defaut à False", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/fr-FR/translation.json b/src/lib/i18n/locales/fr-FR/translation.json index e7348aa095..73f82d4ed0 100644 --- a/src/lib/i18n/locales/fr-FR/translation.json +++ b/src/lib/i18n/locales/fr-FR/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "Liste ordonnéee", "Organize your users": "Organisez vos utilisateurs", "Other": "Autre", + "Output": "", "OUTPUT": "SORTIE", "Output format": "Format de sortie", "Output Format": "Format de sortie", @@ -1666,6 +1667,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Ne pas utiliser le cache", "Skip the cache and re-run the inference. Defaults to False.": "Ne pas utiliser le cache et re executer l'inférence. Par defaut à False", "Something went wrong :/": "Quelque chose s'est mal passé :/", diff --git a/src/lib/i18n/locales/gl-ES/translation.json b/src/lib/i18n/locales/gl-ES/translation.json index 53b0f58ed7..35626a356c 100644 --- a/src/lib/i18n/locales/gl-ES/translation.json +++ b/src/lib/i18n/locales/gl-ES/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "Organiza os teus usuarios", "Other": "Outro", + "Output": "", "OUTPUT": "SAIDA", "Output format": "Formato de saida", "Output Format": "", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/he-IL/translation.json b/src/lib/i18n/locales/he-IL/translation.json index e045b41464..9de508d0f1 100644 --- a/src/lib/i18n/locales/he-IL/translation.json +++ b/src/lib/i18n/locales/he-IL/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "אחר", + "Output": "", "OUTPUT": "", "Output format": "", "Output Format": "", @@ -1666,6 +1667,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/hi-IN/translation.json b/src/lib/i18n/locales/hi-IN/translation.json index ef48c95b5d..4c2a00af8b 100644 --- a/src/lib/i18n/locales/hi-IN/translation.json +++ b/src/lib/i18n/locales/hi-IN/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "अन्य", + "Output": "", "OUTPUT": "", "Output format": "", "Output Format": "", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/hr-HR/translation.json b/src/lib/i18n/locales/hr-HR/translation.json index b8a25b325c..d2b5e7287d 100644 --- a/src/lib/i18n/locales/hr-HR/translation.json +++ b/src/lib/i18n/locales/hr-HR/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "Ostalo", + "Output": "", "OUTPUT": "", "Output format": "", "Output Format": "", @@ -1666,6 +1667,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/hu-HU/translation.json b/src/lib/i18n/locales/hu-HU/translation.json index 2d24d868ea..a4cc3ae450 100644 --- a/src/lib/i18n/locales/hu-HU/translation.json +++ b/src/lib/i18n/locales/hu-HU/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "Szervezd meg a felhasználóidat", "Other": "Egyéb", + "Output": "", "OUTPUT": "KIMENET", "Output format": "Kimeneti formátum", "Output Format": "", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/id-ID/translation.json b/src/lib/i18n/locales/id-ID/translation.json index 8bac5d6d7c..2befb985a4 100644 --- a/src/lib/i18n/locales/id-ID/translation.json +++ b/src/lib/i18n/locales/id-ID/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "Lainnya", + "Output": "", "OUTPUT": "", "Output format": "", "Output Format": "", @@ -1664,6 +1665,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/ie-GA/translation.json b/src/lib/i18n/locales/ie-GA/translation.json index d811a5919f..8d2ba37ef8 100644 --- a/src/lib/i18n/locales/ie-GA/translation.json +++ b/src/lib/i18n/locales/ie-GA/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "Liosta Ordaithe", "Organize your users": "Eagraigh do chuid úsáideoirí", "Other": "Eile", + "Output": "", "OUTPUT": "ASCHUR", "Output format": "Formáid aschuir", "Output Format": "Formáid Aschuir", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Seachain an Taisce", "Skip the cache and re-run the inference. Defaults to False.": "Seachain an taisce agus athrith an tátal. Réamhshocrú Bréagach.", "Something went wrong :/": "Chuaigh rud éigin mícheart :/", diff --git a/src/lib/i18n/locales/it-IT/translation.json b/src/lib/i18n/locales/it-IT/translation.json index 2fbf5b7093..a6cbd67dd0 100644 --- a/src/lib/i18n/locales/it-IT/translation.json +++ b/src/lib/i18n/locales/it-IT/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "Organizza i tuoi utenti", "Other": "Altro", + "Output": "", "OUTPUT": "OUTPUT", "Output format": "Formato di output", "Output Format": "Formato output", @@ -1666,6 +1667,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Salta cache", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/ja-JP/translation.json b/src/lib/i18n/locales/ja-JP/translation.json index b0c2f2dd26..51fc7d974a 100644 --- a/src/lib/i18n/locales/ja-JP/translation.json +++ b/src/lib/i18n/locales/ja-JP/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "順序つきリスト", "Organize your users": "ユーザーを整理する", "Other": "その他", + "Output": "", "OUTPUT": "出力", "Output format": "出力形式", "Output Format": "出力形式", @@ -1664,6 +1665,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "キャッシュをスキップする", "Skip the cache and re-run the inference. Defaults to False.": "キャッシュをスキップし、推論を再実行します。デフォルトでは無効。", "Something went wrong :/": "何らかの問題が発生しました", diff --git a/src/lib/i18n/locales/ka-GE/translation.json b/src/lib/i18n/locales/ka-GE/translation.json index 0a57724dc3..6885be0b32 100644 --- a/src/lib/i18n/locales/ka-GE/translation.json +++ b/src/lib/i18n/locales/ka-GE/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "დალაგებული სია", "Organize your users": "დააორგანიზეთ თქვენი მომხმარებლები", "Other": "სხვა", + "Output": "", "OUTPUT": "გამოტანა", "Output format": "გამოტანის ფორმატი", "Output Format": "გამოტანის ფორმატი", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "კეშის გამოტოვება", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "რაღაც ცუდადაა :/", diff --git a/src/lib/i18n/locales/kab-DZ/translation.json b/src/lib/i18n/locales/kab-DZ/translation.json index 2a08a9cb9f..d0d63b183e 100644 --- a/src/lib/i18n/locales/kab-DZ/translation.json +++ b/src/lib/i18n/locales/kab-DZ/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "Tabdart n usmizwer", "Organize your users": "Sefrek iseqdacen-ik·im", "Other": "Wayeḍ", + "Output": "", "OUTPUT": "TUFFƔA", "Output format": "Amasal n tuffɣa", "Output Format": "Amasal n tuffɣa", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Ur sseqdac ara tuffirt", "Skip the cache and re-run the inference. Defaults to False.": "Seqcer aṭaksi-nni, tɛawdeḍ-as assefreg. Imezwura ɣer False.", "Something went wrong :/": "Yella wayen ur neddi ara :/", diff --git a/src/lib/i18n/locales/ko-KR/translation.json b/src/lib/i18n/locales/ko-KR/translation.json index ee0431685f..04e4150840 100644 --- a/src/lib/i18n/locales/ko-KR/translation.json +++ b/src/lib/i18n/locales/ko-KR/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "번호 목록", "Organize your users": "사용자 관리", "Other": "기타", + "Output": "", "OUTPUT": "출력", "Output format": "출력 형식", "Output Format": "출력 형식", @@ -1664,6 +1665,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "캐시 무시", "Skip the cache and re-run the inference. Defaults to False.": "캐시를 무시하고 추론을 다시 실행합니다. 기본값은 False입니다.", "Something went wrong :/": "무언가 잘못 되었습니다 :/", diff --git a/src/lib/i18n/locales/lt-LT/translation.json b/src/lib/i18n/locales/lt-LT/translation.json index 281166e28d..7ec79601ec 100644 --- a/src/lib/i18n/locales/lt-LT/translation.json +++ b/src/lib/i18n/locales/lt-LT/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "Kita", + "Output": "", "OUTPUT": "", "Output format": "", "Output Format": "", @@ -1667,6 +1668,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/lv-LV/translation.json b/src/lib/i18n/locales/lv-LV/translation.json index 1c3a43fdd7..f60911158f 100644 --- a/src/lib/i18n/locales/lv-LV/translation.json +++ b/src/lib/i18n/locales/lv-LV/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "Numurēts saraksts", "Organize your users": "Organizējiet savus lietotājus", "Other": "Cits", + "Output": "", "OUTPUT": "IZVADE", "Output format": "Izvades formāts", "Output Format": "Izvades formāts", @@ -1666,6 +1667,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Izlaist kešatmiņu", "Skip the cache and re-run the inference. Defaults to False.": "Izlaist kešatmiņu un atkārtoti palaist secinājumu. Noklusējums ir False.", "Something went wrong :/": "Kaut kas nogāja greizi :/", diff --git a/src/lib/i18n/locales/ms-MY/translation.json b/src/lib/i18n/locales/ms-MY/translation.json index beaa5d3d4e..b593856d81 100644 --- a/src/lib/i18n/locales/ms-MY/translation.json +++ b/src/lib/i18n/locales/ms-MY/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "Lain-lain", + "Output": "", "OUTPUT": "", "Output format": "", "Output Format": "", @@ -1664,6 +1665,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/nb-NO/translation.json b/src/lib/i18n/locales/nb-NO/translation.json index fd734b32b1..c4f2f1022e 100644 --- a/src/lib/i18n/locales/nb-NO/translation.json +++ b/src/lib/i18n/locales/nb-NO/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "Organisere brukerne dine", "Other": "Annet", + "Output": "", "OUTPUT": "UTDATA", "Output format": "Format på utdata", "Output Format": "", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/nl-NL/translation.json b/src/lib/i18n/locales/nl-NL/translation.json index 0e9820b1c0..6089c0ebd6 100644 --- a/src/lib/i18n/locales/nl-NL/translation.json +++ b/src/lib/i18n/locales/nl-NL/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "Orden je gebruikers", "Other": "Andere", + "Output": "", "OUTPUT": "UITVOER", "Output format": "Uitvoerformaat", "Output Format": "", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/pa-IN/translation.json b/src/lib/i18n/locales/pa-IN/translation.json index b5d96143a5..88978d8894 100644 --- a/src/lib/i18n/locales/pa-IN/translation.json +++ b/src/lib/i18n/locales/pa-IN/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "ਹੋਰ", + "Output": "", "OUTPUT": "", "Output format": "", "Output Format": "", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/pl-PL/translation.json b/src/lib/i18n/locales/pl-PL/translation.json index 53649bfa08..be784b2149 100644 --- a/src/lib/i18n/locales/pl-PL/translation.json +++ b/src/lib/i18n/locales/pl-PL/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "Lista numerowana", "Organize your users": "Organizuj użytkowników", "Other": "Inne", + "Output": "", "OUTPUT": "WYNIK", "Output format": "Format wyjściowy", "Output Format": "Format wyjściowy", @@ -1667,6 +1668,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Pomiń Cache", "Skip the cache and re-run the inference. Defaults to False.": "Pomiń pamięć podręczną i uruchom wnioskowanie ponownie. Domyślnie Fałsz.", "Something went wrong :/": "Coś poszło nie tak :/", diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index e83ab7b1f7..bb3431fdd4 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "Lista ordenada", "Organize your users": "Organizar seus usuários", "Other": "Outro", + "Output": "", "OUTPUT": "SAÍDA", "Output format": "Formato de saída", "Output Format": "Formato de Saída", @@ -1666,6 +1667,8 @@ "Skill updated successfully": "Habilidade atualizada com sucesso", "Skills": "Habilidades", "Skills Access": "Acesso a habilidades", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Pular cache", "Skip the cache and re-run the inference. Defaults to False.": "Ignore o cache e execute a inferência novamente. O padrão é Falso.", "Something went wrong :/": "Algo deu errado :/", diff --git a/src/lib/i18n/locales/pt-PT/translation.json b/src/lib/i18n/locales/pt-PT/translation.json index bc6492443c..f32f941e3c 100644 --- a/src/lib/i18n/locales/pt-PT/translation.json +++ b/src/lib/i18n/locales/pt-PT/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "Outro", + "Output": "", "OUTPUT": "", "Output format": "", "Output Format": "", @@ -1666,6 +1667,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/ro-RO/translation.json b/src/lib/i18n/locales/ro-RO/translation.json index 0deda6e8fb..282b3cda26 100644 --- a/src/lib/i18n/locales/ro-RO/translation.json +++ b/src/lib/i18n/locales/ro-RO/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "Altele", + "Output": "", "OUTPUT": "Output rezultatat", "Output format": "Formatul de ieșire", "Output Format": "", @@ -1666,6 +1667,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 4ff6610587..3f3d302ba4 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "Нумерованный список", "Organize your users": "Организуйте своих пользователей", "Other": "Прочее", + "Output": "", "OUTPUT": "ВЫВОД", "Output format": "Формат вывода", "Output Format": "Формат Вывода", @@ -1667,6 +1668,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Пропустить кэширование", "Skip the cache and re-run the inference. Defaults to False.": "Пропустить кэширование и перезапустить вывод. По умолчанию установлено значение Выкл.", "Something went wrong :/": "Что-то пошло не так :/", diff --git a/src/lib/i18n/locales/sk-SK/translation.json b/src/lib/i18n/locales/sk-SK/translation.json index 740b54a9e7..2793b59bb2 100644 --- a/src/lib/i18n/locales/sk-SK/translation.json +++ b/src/lib/i18n/locales/sk-SK/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "Iné", + "Output": "", "OUTPUT": "VÝSTUP", "Output format": "Formát výstupu", "Output Format": "", @@ -1667,6 +1668,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/sr-RS/translation.json b/src/lib/i18n/locales/sr-RS/translation.json index 28fbaf210d..1c0c79a9a0 100644 --- a/src/lib/i18n/locales/sr-RS/translation.json +++ b/src/lib/i18n/locales/sr-RS/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "Организујте ваше кориснике", "Other": "Остало", + "Output": "", "OUTPUT": "ИЗЛАЗ", "Output format": "Формат излаза", "Output Format": "", @@ -1666,6 +1667,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/sv-SE/translation.json b/src/lib/i18n/locales/sv-SE/translation.json index b38a4df5b4..60fca40a71 100644 --- a/src/lib/i18n/locales/sv-SE/translation.json +++ b/src/lib/i18n/locales/sv-SE/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "Numrerad lista", "Organize your users": "Organisera dina användare", "Other": "Andra", + "Output": "", "OUTPUT": "UTDATA", "Output format": "Utdataformat", "Output Format": "Utdataformat", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Hoppa över cache", "Skip the cache and re-run the inference. Defaults to False.": "Hoppa över cacheminnet och kör inferensen igen. Standardvärdet är False.", "Something went wrong :/": "Något gick fel :/", diff --git a/src/lib/i18n/locales/th-TH/translation.json b/src/lib/i18n/locales/th-TH/translation.json index a203b66186..f40af7d752 100644 --- a/src/lib/i18n/locales/th-TH/translation.json +++ b/src/lib/i18n/locales/th-TH/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "รายการมีลำดับ", "Organize your users": "จัดการผู้ใช้ของคุณ", "Other": "อื่น ๆ", + "Output": "", "OUTPUT": "เอาต์พุต", "Output format": "รูปแบบผลลัพธ์", "Output Format": "รูปแบบผลลัพธ์", @@ -1664,6 +1665,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "ข้ามแคช", "Skip the cache and re-run the inference. Defaults to False.": "ข้ามแคชและรันการอนุมานใหม่อีกครั้ง ค่าเริ่มต้นคือ False", "Something went wrong :/": "มีบางอย่างผิดพลาด :/", diff --git a/src/lib/i18n/locales/tk-TM/translation.json b/src/lib/i18n/locales/tk-TM/translation.json index 230622ae9e..19631f3662 100644 --- a/src/lib/i18n/locales/tk-TM/translation.json +++ b/src/lib/i18n/locales/tk-TM/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "Başga", + "Output": "", "OUTPUT": "", "Output format": "", "Output Format": "", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/tr-TR/translation.json b/src/lib/i18n/locales/tr-TR/translation.json index 8327ff5493..2c951da626 100644 --- a/src/lib/i18n/locales/tr-TR/translation.json +++ b/src/lib/i18n/locales/tr-TR/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "Kullanıcılarınızı düzenleyin", "Other": "Diğer", + "Output": "", "OUTPUT": "ÇIKTI", "Output format": "Çıktı formatı", "Output Format": "", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/ug-CN/translation.json b/src/lib/i18n/locales/ug-CN/translation.json index aa6a3f5d2a..7f3c1de226 100644 --- a/src/lib/i18n/locales/ug-CN/translation.json +++ b/src/lib/i18n/locales/ug-CN/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "ئىشلەتكۈچىلەرنى تەشكىللەڭ", "Other": "باشقا", + "Output": "", "OUTPUT": "چىقىرىش", "Output format": "چىقىرىش قېلىپى", "Output Format": "چىقىرىش فورماتى", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "غەملەكتىن ئۆتۈپ كېتىش", "Skip the cache and re-run the inference. Defaults to False.": "غەملەكتىن ئۆتۈپ، يەكۈننى قايتا ئىجرا قىلىش. كۆڭۈلدىكىچە چەكلەنگەن", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/uk-UA/translation.json b/src/lib/i18n/locales/uk-UA/translation.json index 9535d07a83..c64a9bbbe9 100644 --- a/src/lib/i18n/locales/uk-UA/translation.json +++ b/src/lib/i18n/locales/uk-UA/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "Організуйте своїх користувачів", "Other": "Інше", + "Output": "", "OUTPUT": "ВИХІД", "Output format": "Формат відповіді", "Output Format": "", @@ -1667,6 +1668,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/ur-PK/translation.json b/src/lib/i18n/locales/ur-PK/translation.json index 717e77cb90..8924cfdadf 100644 --- a/src/lib/i18n/locales/ur-PK/translation.json +++ b/src/lib/i18n/locales/ur-PK/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "", "Other": "دیگر", + "Output": "", "OUTPUT": "آؤٹ پٹ", "Output format": "آؤٹ پٹ فارمیٹ", "Output Format": "", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/uz-Cyrl-UZ/translation.json b/src/lib/i18n/locales/uz-Cyrl-UZ/translation.json index 3840d6cd21..4f4ed83a75 100644 --- a/src/lib/i18n/locales/uz-Cyrl-UZ/translation.json +++ b/src/lib/i18n/locales/uz-Cyrl-UZ/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "Фойдаланувчиларингизни тартибга солинг", "Other": "Бошқа", + "Output": "", "OUTPUT": "Чиқиш", "Output format": "Чиқиш формати", "Output Format": "Чиқиш формати", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Кешни ўтказиб юбориш", "Skip the cache and re-run the inference. Defaults to False.": "Кешни ўтказиб юборинг ва хулосани қайта ишга туширинг. Бирламчи параметрлар Фалсе.", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/uz-Latn-Uz/translation.json b/src/lib/i18n/locales/uz-Latn-Uz/translation.json index b88871a447..0cab416e7f 100644 --- a/src/lib/i18n/locales/uz-Latn-Uz/translation.json +++ b/src/lib/i18n/locales/uz-Latn-Uz/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "Foydalanuvchilaringizni tartibga soling", "Other": "Boshqa", + "Output": "", "OUTPUT": "Chiqish", "Output format": "Chiqish formati", "Output Format": "Chiqish formati", @@ -1665,6 +1666,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "Keshni o'tkazib yuborish", "Skip the cache and re-run the inference. Defaults to False.": "Keshni o'tkazib yuboring va xulosani qayta ishga tushiring. Birlamchi parametrlar False.", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/vi-VN/translation.json b/src/lib/i18n/locales/vi-VN/translation.json index 8706be826a..72812f10dd 100644 --- a/src/lib/i18n/locales/vi-VN/translation.json +++ b/src/lib/i18n/locales/vi-VN/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "", "Organize your users": "Tổ chức người dùng của bạn", "Other": "Khác", + "Output": "", "OUTPUT": "ĐẦU RA", "Output format": "Định dạng đầu ra", "Output Format": "", @@ -1664,6 +1665,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", "Something went wrong :/": "", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index fa0f8ed9e8..cc2f4f945e 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "有序列表", "Organize your users": "组织用户", "Other": "其他", + "Output": "", "OUTPUT": "输出", "Output format": "输出格式", "Output Format": "输出格式", @@ -1664,6 +1665,8 @@ "Skill updated successfully": "技能更新成功", "Skills": "技能", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "跳过缓存", "Skip the cache and re-run the inference. Defaults to False.": "跳过缓存并重新执行推理。默认为关闭", "Something went wrong :/": "发生错误", diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index b7665f334c..1b7a4e35dd 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -1342,6 +1342,7 @@ "Ordered List": "有序清單", "Organize your users": "組織您的使用者", "Other": "其他", + "Output": "", "OUTPUT": "輸出", "Output format": "輸出格式", "Output Format": "輸出格式", @@ -1664,6 +1665,8 @@ "Skill updated successfully": "", "Skills": "", "Skills Access": "", + "Skills Public Sharing": "", + "Skills Sharing": "", "Skip Cache": "略過快取", "Skip the cache and re-run the inference. Defaults to False.": "略過快取並重新執行推理。預設為 False。", "Something went wrong :/": "發生錯誤 :/", From f4e99c80f6225f371c2f012d28632deecf8afea4 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 16 Feb 2026 00:53:01 -0600 Subject: [PATCH 26/59] refac: "tool_calls" finish reason support --- backend/open_webui/utils/misc.py | 2 +- backend/open_webui/utils/response.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/utils/misc.py b/backend/open_webui/utils/misc.py index 13539ca9d0..a63d425ff5 100644 --- a/backend/open_webui/utils/misc.py +++ b/backend/open_webui/utils/misc.py @@ -447,7 +447,7 @@ def openai_chat_completion_message_template( **({"tool_calls": tool_calls} if tool_calls else {}), } - template["choices"][0]["finish_reason"] = "stop" + template["choices"][0]["finish_reason"] = "tool_calls" if tool_calls else "stop" if usage: template["usage"] = usage diff --git a/backend/open_webui/utils/response.py b/backend/open_webui/utils/response.py index 9d1920651e..5a4028f11b 100644 --- a/backend/open_webui/utils/response.py +++ b/backend/open_webui/utils/response.py @@ -166,6 +166,9 @@ async def convert_streaming_response_ollama_to_openai(ollama_streaming_response) model, message_content, reasoning_content, openai_tool_calls, usage ) + if done and openai_tool_calls: + data["choices"][0]["finish_reason"] = "tool_calls" + line = f"data: {json.dumps(data)}\n\n" yield line From 6d17de6c6715eee59bad9f9c7c862c89c4e7fb6c Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 16 Feb 2026 00:53:36 -0600 Subject: [PATCH 27/59] chore: bump --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index b837771419..6588fbed7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "open-webui", - "version": "0.8.1", + "version": "0.8.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "open-webui", - "version": "0.8.1", + "version": "0.8.2", "dependencies": { "@azure/msal-browser": "^4.5.0", "@codemirror/lang-javascript": "^6.2.2", diff --git a/package.json b/package.json index a6e16abfa6..7b66b5f30f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "open-webui", - "version": "0.8.1", + "version": "0.8.2", "private": true, "scripts": { "dev": "npm run pyodide:fetch && vite dev --host", From 9e85055b8b8e01b37ef35ab436963c007395ecd0 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 16 Feb 2026 00:55:23 -0600 Subject: [PATCH 28/59] doc: changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 303d3e2053..3ff3cb7229 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - 🧠 **Skill content handling.** User-selected skills now have their full content injected into the chat, while model-attached skills only display name and description in the available skills list. This allows users to override skill behavior while model-attached skills remain flexible. [Commit](https://github.com/open-webui/open-webui/commit/393c0071dc612c5ac982fb37dfc0288cb9911439) - ⚙️ **Chat toggles now control built-in tools.** Users can now disable web search, image generation, and code execution on a per-conversation basis, even when those tools are enabled as builtin tools on the model. [#20641](https://github.com/open-webui/open-webui/issues/20641), [#21318](https://github.com/open-webui/open-webui/discussions/21318), [Commit](https://github.com/open-webui/open-webui/commit/c46ef3b63bcc1e2e9adbdd18fab82c4bbe33ff6c), [Commit](https://github.com/open-webui/open-webui/commit/f1a1e64d2e9ad953b2bc2a9543e9a308b7c669c8) - 🖼️ **Image preview in file modal.** Images uploaded to chats can now be previewed directly in the file management modal, making it easier to identify and manage image files. [#21413](https://github.com/open-webui/open-webui/issues/21413), [Commit](https://github.com/open-webui/open-webui/commit/e1b3e7252c1896c04d498547908f0fce111434e1) +- 🏷️ **Batch tag operations.** Tag creation, deletion, and orphan cleanup for chats now use batch database queries instead of per-tag loops, significantly reducing database round trips when updating, archiving, or deleting chats with multiple tags. [Commit](https://github.com/open-webui/open-webui/commit/c748c3ede) +- 💨 **Faster group list loading.** Group lists and search results now load with a single database query that joins member counts, replacing the previous pattern of fetching groups first and then counting members in a separate batch query. [Commit](https://github.com/open-webui/open-webui/commit/33308022f) +- 🔐 **Skills sharing permissions.** Administrators can now control skills sharing and public sharing permissions per-group, matching the existing capabilities for tools, knowledge, and prompts. [Commit](https://github.com/open-webui/open-webui/commit/88401e91c) - 🌐 **Translation updates.** Translations for Spanish and German were enhanced and expanded. ### Fixed @@ -21,6 +24,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - 🔗 **Tool call message preservation.** Models no longer hallucinate tool outputs in multi-turn conversations because tool call history is now properly preserved instead of being merged into assistant messages. [#21098](https://github.com/open-webui/open-webui/discussions/21098), [#20600](https://github.com/open-webui/open-webui/issues/20600), [Commit](https://github.com/open-webui/open-webui/commit/f2aca781c87244cffc130aa2722e700c19a81d66) - 🔧 **Tool server startup initialization.** External tool servers configured via the "TOOL_SERVER_CONNECTIONS" environment variable now initialize automatically on startup, eliminating the need to manually visit the Admin Panel and save for tools to become available. This enables proper GitOps and containerized deployments. [#18140](https://github.com/open-webui/open-webui/issues/18140), [#20914](https://github.com/open-webui/open-webui/pull/20914), [Commit](https://github.com/open-webui/open-webui/commit/f20cc6d7e6da493eb75ca1618f5cbd068fa57684) - ♻️ **Resource handle cleanup.** File handles are now properly closed during audio transcription and pipeline uploads, preventing resource leaks that could cause system instability over time. [#21411](https://github.com/open-webui/open-webui/issues/21411) +- ⌨️ **Strikethrough shortcut conflict fix.** Pressing Ctrl+Shift+S to toggle the sidebar no longer causes text to become struck through in the chat input, by disabling the TipTap Strike extension's default keyboard shortcut when rich text mode is off. [Commit](https://github.com/open-webui/open-webui/commit/38ae91ae2) +- 🔧 **Tool call finish_reason fix.** API responses now correctly set finish_reason to "tool_calls" instead of "stop" when tool calls are present, fixing an issue where external API clients (such as OpenCode) would halt prematurely after tool execution when routing Ollama models through the Open WebUI API. [#20896](https://github.com/open-webui/open-webui/issues/20896) ## [0.8.1] - 2026-02-14 From c26e8110af269d869b240ca76be811593df94e65 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 16 Feb 2026 01:23:56 -0600 Subject: [PATCH 29/59] enh: renderMarkdownInPreviews --- .../Messages/Citations/CitationModal.svelte | 48 +++++++++++++----- .../components/chat/Settings/Interface.svelte | 21 ++++++++ .../components/common/FileItemModal.svelte | 49 ++++++++++++++++--- src/lib/stores/index.ts | 1 + 4 files changed, 100 insertions(+), 19 deletions(-) diff --git a/src/lib/components/chat/Messages/Citations/CitationModal.svelte b/src/lib/components/chat/Messages/Citations/CitationModal.svelte index a90abd2590..5c18399353 100644 --- a/src/lib/components/chat/Messages/Citations/CitationModal.svelte +++ b/src/lib/components/chat/Messages/Citations/CitationModal.svelte @@ -2,6 +2,7 @@ import { getContext, onMount, tick } from 'svelte'; import Modal from '$lib/components/common/Modal.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte'; + import Markdown from '$lib/components/chat/Messages/Markdown.svelte'; import { WEBUI_API_BASE_URL } from '$lib/constants'; import { settings } from '$lib/stores'; @@ -10,6 +11,9 @@ const i18n = getContext('i18n'); + const CONTENT_PREVIEW_LIMIT = 10000; + let expandedDocs: Set = new Set(); + export let show = false; export let citation; export let showPercentage = false; @@ -35,6 +39,7 @@ } $: if (citation) { + expandedDocs = new Set(); mergedDocuments = citation.document?.map((c, i) => { return { source: citation.source, @@ -206,20 +211,37 @@
{#if document.metadata?.html} - - {:else} -
{document.document
-										.trim()
-										.replace(/\n\n+/g, '\n\n')}
+ + {:else} + {@const rawContent = document.document.trim().replace(/\n\n+/g, '\n\n')} + {@const isTruncated = ($settings?.renderMarkdownInPreviews ?? true) && rawContent.length > CONTENT_PREVIEW_LIMIT && !expandedDocs.has(documentIdx)} + {#if $settings?.renderMarkdownInPreviews ?? true} +
+ +
+ {#if isTruncated} + {/if} + {:else} +
{rawContent}
+ {/if} + {/if}
{/each} diff --git a/src/lib/components/chat/Settings/Interface.svelte b/src/lib/components/chat/Settings/Interface.svelte index 5af1ae8c3d..ee242fb735 100644 --- a/src/lib/components/chat/Settings/Interface.svelte +++ b/src/lib/components/chat/Settings/Interface.svelte @@ -70,6 +70,7 @@ let chatFadeStreamingText = true; let collapseCodeBlocks = false; let expandDetails = false; + let renderMarkdownInPreviews = true; let showChatTitleInTab = true; let showFloatingActionButtons = true; @@ -232,6 +233,7 @@ collapseCodeBlocks = $settings?.collapseCodeBlocks ?? false; expandDetails = $settings?.expandDetails ?? false; + renderMarkdownInPreviews = $settings?.renderMarkdownInPreviews ?? true; landingPageMode = $settings?.landingPageMode ?? ''; chatBubble = $settings?.chatBubble ?? true; @@ -964,6 +966,25 @@
+
+
+
+ {$i18n.t('Render Markdown in Previews')} +
+ +
+ { + saveSettings({ renderMarkdownInPreviews }); + }} + /> +
+
+
+
diff --git a/src/lib/components/common/FileItemModal.svelte b/src/lib/components/common/FileItemModal.svelte index dd8896c289..ba0408961f 100644 --- a/src/lib/components/common/FileItemModal.svelte +++ b/src/lib/components/common/FileItemModal.svelte @@ -6,6 +6,7 @@ import { formatFileSize, getLineCount } from '$lib/utils'; import { WEBUI_API_BASE_URL } from '$lib/constants'; + import { settings } from '$lib/stores'; import { getKnowledgeById } from '$lib/apis/knowledge'; import { getFileById, getFileContentById } from '$lib/apis/files'; @@ -14,6 +15,9 @@ const i18n = getContext('i18n'); + const CONTENT_PREVIEW_LIMIT = 10000; + let expandedContent = false; + import Modal from './Modal.svelte'; import XMark from '../icons/XMark.svelte'; import Switch from './Switch.svelte'; @@ -147,6 +151,7 @@ const loadContent = async () => { selectedTab = ''; + expandedContent = false; if (item?.type === 'collection') { loading = true; @@ -365,13 +370,45 @@
{:else if selectedTab === ''} {#if item?.file?.data} -
- {(item?.file?.data?.content ?? '').trim() || 'No content'} -
+ {@const rawContent = (item?.file?.data?.content ?? '').trim() || 'No content'} + {@const isTruncated = ($settings?.renderMarkdownInPreviews ?? true) && rawContent.length > CONTENT_PREVIEW_LIMIT && !expandedContent} + {#if $settings?.renderMarkdownInPreviews ?? true} +
+ +
+ {#if isTruncated} + + {/if} + {:else} +
+ {rawContent} +
+ {/if} {:else if item?.content} -
- {(item?.content ?? '').trim() || 'No content'} -
+ {@const rawContent = (item?.content ?? '').trim() || 'No content'} + {@const isTruncated = ($settings?.renderMarkdownInPreviews ?? true) && rawContent.length > CONTENT_PREVIEW_LIMIT && !expandedContent} + {#if $settings?.renderMarkdownInPreviews ?? true} +
+ +
+ {#if isTruncated} + + {/if} + {:else} +
+ {rawContent} +
+ {/if} {/if} {:else if selectedTab === 'preview'} {#if isAudio} diff --git a/src/lib/stores/index.ts b/src/lib/stores/index.ts index 7a77fc0f64..5bde46b4a6 100644 --- a/src/lib/stores/index.ts +++ b/src/lib/stores/index.ts @@ -205,6 +205,7 @@ type Settings = { splitLargeDeltas?: boolean; chatDirection?: 'LTR' | 'RTL' | 'auto'; ctrlEnterToSend?: boolean; + renderMarkdownInPreviews?: boolean; system?: string; seed?: number; From 5fda814669e904509e66118e0e450aab4d137c02 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 16 Feb 2026 01:25:40 -0600 Subject: [PATCH 30/59] doc: changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ff3cb7229..15afc1685e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - 🏷️ **Batch tag operations.** Tag creation, deletion, and orphan cleanup for chats now use batch database queries instead of per-tag loops, significantly reducing database round trips when updating, archiving, or deleting chats with multiple tags. [Commit](https://github.com/open-webui/open-webui/commit/c748c3ede) - 💨 **Faster group list loading.** Group lists and search results now load with a single database query that joins member counts, replacing the previous pattern of fetching groups first and then counting members in a separate batch query. [Commit](https://github.com/open-webui/open-webui/commit/33308022f) - 🔐 **Skills sharing permissions.** Administrators can now control skills sharing and public sharing permissions per-group, matching the existing capabilities for tools, knowledge, and prompts. [Commit](https://github.com/open-webui/open-webui/commit/88401e91c) +- ⚡ **Long content truncation in preview modals.** Citation and file content modals now truncate markdown-rendered content at 10,000 characters with a "Show all" expansion button, preventing UI jank when previewing very large documents. - 🌐 **Translation updates.** Translations for Spanish and German were enhanced and expanded. ### Fixed From ef04a704ce6e1292b4831ffbeee179a9aadb2b9d Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 16 Feb 2026 01:26:29 -0600 Subject: [PATCH 31/59] chore: format --- .../Messages/Citations/CitationModal.svelte | 70 +++++++++++-------- .../components/common/FileItemModal.svelte | 44 +++++++++--- src/lib/i18n/locales/ar-BH/translation.json | 2 + src/lib/i18n/locales/ar/translation.json | 2 + src/lib/i18n/locales/bg-BG/translation.json | 2 + src/lib/i18n/locales/bn-BD/translation.json | 2 + src/lib/i18n/locales/bo-TB/translation.json | 2 + src/lib/i18n/locales/bs-BA/translation.json | 2 + src/lib/i18n/locales/ca-ES/translation.json | 2 + src/lib/i18n/locales/ceb-PH/translation.json | 2 + src/lib/i18n/locales/cs-CZ/translation.json | 2 + src/lib/i18n/locales/da-DK/translation.json | 2 + src/lib/i18n/locales/de-DE/translation.json | 2 + src/lib/i18n/locales/dg-DG/translation.json | 2 + src/lib/i18n/locales/el-GR/translation.json | 2 + src/lib/i18n/locales/en-GB/translation.json | 2 + src/lib/i18n/locales/en-US/translation.json | 2 + src/lib/i18n/locales/es-ES/translation.json | 2 + src/lib/i18n/locales/et-EE/translation.json | 2 + src/lib/i18n/locales/eu-ES/translation.json | 2 + src/lib/i18n/locales/fa-IR/translation.json | 2 + src/lib/i18n/locales/fi-FI/translation.json | 2 + src/lib/i18n/locales/fr-CA/translation.json | 2 + src/lib/i18n/locales/fr-FR/translation.json | 2 + src/lib/i18n/locales/gl-ES/translation.json | 2 + src/lib/i18n/locales/he-IL/translation.json | 2 + src/lib/i18n/locales/hi-IN/translation.json | 2 + src/lib/i18n/locales/hr-HR/translation.json | 2 + src/lib/i18n/locales/hu-HU/translation.json | 2 + src/lib/i18n/locales/id-ID/translation.json | 2 + src/lib/i18n/locales/ie-GA/translation.json | 2 + src/lib/i18n/locales/it-IT/translation.json | 2 + src/lib/i18n/locales/ja-JP/translation.json | 2 + src/lib/i18n/locales/ka-GE/translation.json | 2 + src/lib/i18n/locales/kab-DZ/translation.json | 2 + src/lib/i18n/locales/ko-KR/translation.json | 2 + src/lib/i18n/locales/lt-LT/translation.json | 2 + src/lib/i18n/locales/lv-LV/translation.json | 2 + src/lib/i18n/locales/ms-MY/translation.json | 2 + src/lib/i18n/locales/nb-NO/translation.json | 2 + src/lib/i18n/locales/nl-NL/translation.json | 2 + src/lib/i18n/locales/pa-IN/translation.json | 2 + src/lib/i18n/locales/pl-PL/translation.json | 2 + src/lib/i18n/locales/pt-BR/translation.json | 2 + src/lib/i18n/locales/pt-PT/translation.json | 2 + src/lib/i18n/locales/ro-RO/translation.json | 2 + src/lib/i18n/locales/ru-RU/translation.json | 2 + src/lib/i18n/locales/sk-SK/translation.json | 2 + src/lib/i18n/locales/sr-RS/translation.json | 2 + src/lib/i18n/locales/sv-SE/translation.json | 2 + src/lib/i18n/locales/th-TH/translation.json | 2 + src/lib/i18n/locales/tk-TM/translation.json | 2 + src/lib/i18n/locales/tr-TR/translation.json | 2 + src/lib/i18n/locales/ug-CN/translation.json | 2 + src/lib/i18n/locales/uk-UA/translation.json | 2 + src/lib/i18n/locales/ur-PK/translation.json | 2 + .../i18n/locales/uz-Cyrl-UZ/translation.json | 2 + .../i18n/locales/uz-Latn-Uz/translation.json | 2 + src/lib/i18n/locales/vi-VN/translation.json | 2 + src/lib/i18n/locales/zh-CN/translation.json | 2 + src/lib/i18n/locales/zh-TW/translation.json | 2 + 61 files changed, 192 insertions(+), 40 deletions(-) diff --git a/src/lib/components/chat/Messages/Citations/CitationModal.svelte b/src/lib/components/chat/Messages/Citations/CitationModal.svelte index 5c18399353..3907b103cd 100644 --- a/src/lib/components/chat/Messages/Citations/CitationModal.svelte +++ b/src/lib/components/chat/Messages/Citations/CitationModal.svelte @@ -211,37 +211,47 @@
{#if document.metadata?.html} - - {:else} - {@const rawContent = document.document.trim().replace(/\n\n+/g, '\n\n')} - {@const isTruncated = ($settings?.renderMarkdownInPreviews ?? true) && rawContent.length > CONTENT_PREVIEW_LIMIT && !expandedDocs.has(documentIdx)} - {#if $settings?.renderMarkdownInPreviews ?? true} -
- -
- {#if isTruncated} - + + {:else} + {@const rawContent = document.document.trim().replace(/\n\n+/g, '\n\n')} + {@const isTruncated = + ($settings?.renderMarkdownInPreviews ?? true) && + rawContent.length > CONTENT_PREVIEW_LIMIT && + !expandedDocs.has(documentIdx)} + {#if $settings?.renderMarkdownInPreviews ?? true} +
+ +
+ {#if isTruncated} + + {/if} + {:else} +
{rawContent}
+ {/if} {/if} - {:else} -
{rawContent}
- {/if} - {/if}
{/each} diff --git a/src/lib/components/common/FileItemModal.svelte b/src/lib/components/common/FileItemModal.svelte index ba0408961f..74f033fd82 100644 --- a/src/lib/components/common/FileItemModal.svelte +++ b/src/lib/components/common/FileItemModal.svelte @@ -371,17 +371,29 @@ {:else if selectedTab === ''} {#if item?.file?.data} {@const rawContent = (item?.file?.data?.content ?? '').trim() || 'No content'} - {@const isTruncated = ($settings?.renderMarkdownInPreviews ?? true) && rawContent.length > CONTENT_PREVIEW_LIMIT && !expandedContent} + {@const isTruncated = + ($settings?.renderMarkdownInPreviews ?? true) && + rawContent.length > CONTENT_PREVIEW_LIMIT && + !expandedContent} {#if $settings?.renderMarkdownInPreviews ?? true} -
- +
+
{#if isTruncated} {/if} {:else} @@ -391,17 +403,29 @@ {/if} {:else if item?.content} {@const rawContent = (item?.content ?? '').trim() || 'No content'} - {@const isTruncated = ($settings?.renderMarkdownInPreviews ?? true) && rawContent.length > CONTENT_PREVIEW_LIMIT && !expandedContent} + {@const isTruncated = + ($settings?.renderMarkdownInPreviews ?? true) && + rawContent.length > CONTENT_PREVIEW_LIMIT && + !expandedContent} {#if $settings?.renderMarkdownInPreviews ?? true} -
- +
+
{#if isTruncated} {/if} {:else} diff --git a/src/lib/i18n/locales/ar-BH/translation.json b/src/lib/i18n/locales/ar-BH/translation.json index fe8c51199c..8fb2e250f1 100644 --- a/src/lib/i18n/locales/ar-BH/translation.json +++ b/src/lib/i18n/locales/ar-BH/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "حذف الموديل", "Rename": "إعادة تسمية", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1643,6 +1644,7 @@ "Show": "عرض", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/ar/translation.json b/src/lib/i18n/locales/ar/translation.json index 43eb1ef2d4..bd6ab547ec 100644 --- a/src/lib/i18n/locales/ar/translation.json +++ b/src/lib/i18n/locales/ar/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "حذف الموديل", "Rename": "إعادة تسمية", + "Render Markdown in Previews": "", "Reorder Models": "إعادة ترتيب النماذج", "Reply": "", "Reply in Thread": "الرد داخل سلسلة الرسائل", @@ -1643,6 +1644,7 @@ "Show": "عرض", "Show \"What's New\" modal on login": "عرض نافذة \"ما الجديد\" عند تسجيل الدخول", "Show Admin Details in Account Pending Overlay": "عرض تفاصيل المشرف في نافذة \"الحساب قيد الانتظار\"", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/bg-BG/translation.json b/src/lib/i18n/locales/bg-BG/translation.json index 7f751ed383..cf1063c1d0 100644 --- a/src/lib/i18n/locales/bg-BG/translation.json +++ b/src/lib/i18n/locales/bg-BG/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Изтриване на модела", "Rename": "Преименуване", + "Render Markdown in Previews": "", "Reorder Models": "Преорганизиране на моделите", "Reply": "", "Reply in Thread": "Отговори в тред", @@ -1639,6 +1640,7 @@ "Show": "Покажи", "Show \"What's New\" modal on login": "Покажи модалния прозорец \"Какво е ново\" при вписване", "Show Admin Details in Account Pending Overlay": "Покажи детайлите на администратора в наслагването на изчакващ акаунт", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/bn-BD/translation.json b/src/lib/i18n/locales/bn-BD/translation.json index 7c4e83e9f2..72e2cdd2cf 100644 --- a/src/lib/i18n/locales/bn-BD/translation.json +++ b/src/lib/i18n/locales/bn-BD/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "মডেল রিমুভ করুন", "Rename": "রেনেম", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1639,6 +1640,7 @@ "Show": "দেখান", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/bo-TB/translation.json b/src/lib/i18n/locales/bo-TB/translation.json index c2bc732d2a..343e64bba9 100644 --- a/src/lib/i18n/locales/bo-TB/translation.json +++ b/src/lib/i18n/locales/bo-TB/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "དཔེ་དབྱིབས་འདོར་བ།", "Rename": "མིང་བསྐྱར་འདོགས།", + "Render Markdown in Previews": "", "Reorder Models": "དཔེ་དབྱིབས་བསྐྱར་སྒྲིག", "Reply": "", "Reply in Thread": "བརྗོད་གཞིའི་ནང་ལན་འདེབས།", @@ -1638,6 +1639,7 @@ "Show": "སྟོན་པ།", "Show \"What's New\" modal on login": "ནང་འཛུལ་སྐབས་ \"གསར་པ་ཅི་ཡོད\" modal སྟོན་པ།", "Show Admin Details in Account Pending Overlay": "རྩིས་ཁྲ་སྒུག་བཞིན་པའི་གཏོགས་ངོས་སུ་དོ་དམ་པའི་ཞིབ་ཕྲ་སྟོན་པ།", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/bs-BA/translation.json b/src/lib/i18n/locales/bs-BA/translation.json index af14140e40..95cd1a9c2a 100644 --- a/src/lib/i18n/locales/bs-BA/translation.json +++ b/src/lib/i18n/locales/bs-BA/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Ukloni model", "Rename": "Preimenuj", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1640,6 +1641,7 @@ "Show": "Pokaži", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index 80a52fce94..a3a7c5117b 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Eliminar imatge", "Remove Model": "Eliminar el model", "Rename": "Canviar el nom", + "Render Markdown in Previews": "", "Reorder Models": "Reordenar els models", "Reply": "Respondre", "Reply in Thread": "Respondre al fil", @@ -1640,6 +1641,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "Mostra els arxius", "Show Formatting Toolbar": "Mostrar la barra de format", "Show image preview": "Mostrar la previsualització de la imatge", diff --git a/src/lib/i18n/locales/ceb-PH/translation.json b/src/lib/i18n/locales/ceb-PH/translation.json index 52df723518..14c1cd4f4b 100644 --- a/src/lib/i18n/locales/ceb-PH/translation.json +++ b/src/lib/i18n/locales/ceb-PH/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "", "Rename": "", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1639,6 +1640,7 @@ "Show": "Pagpakita", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/cs-CZ/translation.json b/src/lib/i18n/locales/cs-CZ/translation.json index 6450f56cdb..749d2c0207 100644 --- a/src/lib/i18n/locales/cs-CZ/translation.json +++ b/src/lib/i18n/locales/cs-CZ/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Odebrat obrázek", "Remove Model": "Odebrat model", "Rename": "Přejmenovat", + "Render Markdown in Previews": "", "Reorder Models": "Změnit pořadí modelů", "Reply": "", "Reply in Thread": "Odpovědět ve vlákně", @@ -1641,6 +1642,7 @@ "Show": "Zobrazit", "Show \"What's New\" modal on login": "Zobrazit okno \"Co je nového\" při přihlášení", "Show Admin Details in Account Pending Overlay": "Zobrazit podrobnosti administrátora v překryvné vrstvě čekajícího účtu", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "Zobrazit panel nástrojů pro formátování", "Show image preview": "Zobrazit náhled obrázku", diff --git a/src/lib/i18n/locales/da-DK/translation.json b/src/lib/i18n/locales/da-DK/translation.json index ca28cd413e..0c7c92776b 100644 --- a/src/lib/i18n/locales/da-DK/translation.json +++ b/src/lib/i18n/locales/da-DK/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Fjern billede", "Remove Model": "Fjern model", "Rename": "Omdøb", + "Render Markdown in Previews": "", "Reorder Models": "Omarranger modeller", "Reply": "Svar", "Reply in Thread": "Svar i tråd", @@ -1639,6 +1640,7 @@ "Show": "Vis", "Show \"What's New\" modal on login": "Vis \"Hvad er nyt\" modal ved login", "Show Admin Details in Account Pending Overlay": "Vis administratordetaljer i overlay for ventende konto", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "Vis formateringsværktøjslinjen", "Show image preview": "Vis billedforhåndsvisning", diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index 3405a4add1..2d4e8b1203 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Bild entfernen", "Remove Model": "Modell entfernen", "Rename": "Umbenennen", + "Render Markdown in Previews": "", "Reorder Models": "Modelle neu anordnen", "Reply": "Antworten", "Reply in Thread": "Im Thread antworten", @@ -1639,6 +1640,7 @@ "Show": "Anzeigen", "Show \"What's New\" modal on login": "\"Was gibt's Neues\"-Fenster beim Anmelden anzeigen", "Show Admin Details in Account Pending Overlay": "Admin-Details im 'Konto ausstehend'-Overlay anzeigen", + "Show all ({{COUNT}} characters)": "", "Show Files": "Dateien anzeigen", "Show Formatting Toolbar": "Formatierungsleiste anzeigen", "Show image preview": "Bildvorschau anzeigen", diff --git a/src/lib/i18n/locales/dg-DG/translation.json b/src/lib/i18n/locales/dg-DG/translation.json index bafcc7a760..2b1ef3cdd7 100644 --- a/src/lib/i18n/locales/dg-DG/translation.json +++ b/src/lib/i18n/locales/dg-DG/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "", "Rename": "", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1639,6 +1640,7 @@ "Show": "Show much show", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/el-GR/translation.json b/src/lib/i18n/locales/el-GR/translation.json index 4ac9878e61..056ca9c411 100644 --- a/src/lib/i18n/locales/el-GR/translation.json +++ b/src/lib/i18n/locales/el-GR/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Αφαίρεση εικόνας", "Remove Model": "Αφαίρεση Μοντέλου", "Rename": "Μετονομασία", + "Render Markdown in Previews": "", "Reorder Models": "Επαναταξινόμηση Μοντέλων", "Reply": "Απάντηση", "Reply in Thread": "Απάντηση στο Νήμα Συζήτησης", @@ -1639,6 +1640,7 @@ "Show": "Εμφάνιση", "Show \"What's New\" modal on login": "Εμφάνιση του παράθυρου \"Τι νέο υπάρχει\" κατά την είσοδο", "Show Admin Details in Account Pending Overlay": "Εμφάνιση Λεπτομερειών Διαχειριστή στο Υπέρθεση Εκκρεμής Λογαριασμού", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/en-GB/translation.json b/src/lib/i18n/locales/en-GB/translation.json index 6231963516..f80c10dd8f 100644 --- a/src/lib/i18n/locales/en-GB/translation.json +++ b/src/lib/i18n/locales/en-GB/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "", "Rename": "", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1639,6 +1640,7 @@ "Show": "", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index b6aa646895..c3696f48ce 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "", "Rename": "", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1639,6 +1640,7 @@ "Show": "", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index 7594c8b515..d401f1544d 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Eliminar imagen", "Remove Model": "Eliminar Modelo", "Rename": "Renombrar", + "Render Markdown in Previews": "", "Reorder Models": "Reordenar Modelos", "Reply": "Responder", "Reply in Thread": "Responder en Hilo", @@ -1640,6 +1641,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "Mostrar Archivos", "Show Formatting Toolbar": "Mostrar barra de herramientas de Formateo", "Show image preview": "Mostrar previsualización de imagen", diff --git a/src/lib/i18n/locales/et-EE/translation.json b/src/lib/i18n/locales/et-EE/translation.json index a0b6b73fd1..48fb8acaf1 100644 --- a/src/lib/i18n/locales/et-EE/translation.json +++ b/src/lib/i18n/locales/et-EE/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Eemalda pilt", "Remove Model": "Eemalda mudel", "Rename": "Nimeta ümber", + "Render Markdown in Previews": "", "Reorder Models": "Muuda mudelite järjekorda", "Reply": "Reply", "Reply in Thread": "Vasta lõimes", @@ -1639,6 +1640,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "Kuva Formatting Toolbar", "Show image preview": "Kuva pilt preview", diff --git a/src/lib/i18n/locales/eu-ES/translation.json b/src/lib/i18n/locales/eu-ES/translation.json index f93da7afde..3f3a9f89b5 100644 --- a/src/lib/i18n/locales/eu-ES/translation.json +++ b/src/lib/i18n/locales/eu-ES/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Kendu modeloa", "Rename": "Berrizendatu", + "Render Markdown in Previews": "", "Reorder Models": "Berrantolatu modeloak", "Reply": "", "Reply in Thread": "", @@ -1639,6 +1640,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/fa-IR/translation.json b/src/lib/i18n/locales/fa-IR/translation.json index 89584d0d3f..20c457476c 100644 --- a/src/lib/i18n/locales/fa-IR/translation.json +++ b/src/lib/i18n/locales/fa-IR/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "حذف تصویر", "Remove Model": "حذف مدل", "Rename": "تغییر نام", + "Render Markdown in Previews": "", "Reorder Models": "ترتیب مجدد مدل\u200cها", "Reply": "پاسخ", "Reply in Thread": "پاسخ در رشته", @@ -1639,6 +1640,7 @@ "Show": "نمایش", "Show \"What's New\" modal on login": "نمایش مودال \"موارد جدید\" هنگام ورود", "Show Admin Details in Account Pending Overlay": "نمایش جزئیات مدیر در پوشش حساب در انتظار", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "نمایش نوار ابزار قالب\u200cبندی", "Show image preview": "نمایش پیش\u200cنمایش تصویر", diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index 2b87bb67bc..8f13d4fe31 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Poista kuva", "Remove Model": "Poista malli", "Rename": "Nimeä uudelleen", + "Render Markdown in Previews": "", "Reorder Models": "Uudelleenjärjestä malleja", "Reply": "Vastaa", "Reply in Thread": "Vastaa ketjussa", @@ -1639,6 +1640,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "Näytä tiedostot", "Show Formatting Toolbar": "Näytä muotoilupalkki", "Show image preview": "Näytä kuvan esikatselu", diff --git a/src/lib/i18n/locales/fr-CA/translation.json b/src/lib/i18n/locales/fr-CA/translation.json index 959a3d68e0..40e1e49217 100644 --- a/src/lib/i18n/locales/fr-CA/translation.json +++ b/src/lib/i18n/locales/fr-CA/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Retirer l'image", "Remove Model": "Retirer le modèle", "Rename": "Renommer", + "Render Markdown in Previews": "", "Reorder Models": "Réorganiser les modèles", "Reply": "", "Reply in Thread": "Répondre dans le fil de discussion", @@ -1640,6 +1641,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "Afficher l'aperçu de l'image", diff --git a/src/lib/i18n/locales/fr-FR/translation.json b/src/lib/i18n/locales/fr-FR/translation.json index 73f82d4ed0..2bd4a1e538 100644 --- a/src/lib/i18n/locales/fr-FR/translation.json +++ b/src/lib/i18n/locales/fr-FR/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Retirer l'image", "Remove Model": "Retirer le modèle", "Rename": "Renommer", + "Render Markdown in Previews": "", "Reorder Models": "Réorganiser les modèles", "Reply": "", "Reply in Thread": "Répondre dans le fil de discussion", @@ -1640,6 +1641,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "Afficher la barre d'outils de formatage", "Show image preview": "Afficher l'aperçu de l'image", diff --git a/src/lib/i18n/locales/gl-ES/translation.json b/src/lib/i18n/locales/gl-ES/translation.json index 35626a356c..186a004c56 100644 --- a/src/lib/i18n/locales/gl-ES/translation.json +++ b/src/lib/i18n/locales/gl-ES/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Eliminar modelo", "Rename": "Renombrar", + "Render Markdown in Previews": "", "Reorder Models": "Reordenar modelos", "Reply": "", "Reply in Thread": "Responder no hilo", @@ -1639,6 +1640,7 @@ "Show": "Mostrar", "Show \"What's New\" modal on login": "Mostrar modal \"Qué hay de novo\" al iniciar sesión", "Show Admin Details in Account Pending Overlay": "Mostrar detalles de administración na capa de espera da conta", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/he-IL/translation.json b/src/lib/i18n/locales/he-IL/translation.json index 9de508d0f1..f5c25492db 100644 --- a/src/lib/i18n/locales/he-IL/translation.json +++ b/src/lib/i18n/locales/he-IL/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "הסר מודל", "Rename": "שנה שם", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1640,6 +1641,7 @@ "Show": "הצג", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/hi-IN/translation.json b/src/lib/i18n/locales/hi-IN/translation.json index 4c2a00af8b..cf7ceabf71 100644 --- a/src/lib/i18n/locales/hi-IN/translation.json +++ b/src/lib/i18n/locales/hi-IN/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "मोडेल हटाएँ", "Rename": "नाम बदलें", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1639,6 +1640,7 @@ "Show": "दिखाओ", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/hr-HR/translation.json b/src/lib/i18n/locales/hr-HR/translation.json index d2b5e7287d..8fee9156f5 100644 --- a/src/lib/i18n/locales/hr-HR/translation.json +++ b/src/lib/i18n/locales/hr-HR/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Ukloni model", "Rename": "Preimenuj", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1640,6 +1641,7 @@ "Show": "Pokaži", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/hu-HU/translation.json b/src/lib/i18n/locales/hu-HU/translation.json index a4cc3ae450..6d7590df87 100644 --- a/src/lib/i18n/locales/hu-HU/translation.json +++ b/src/lib/i18n/locales/hu-HU/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Modell eltávolítása", "Rename": "Átnevezés", + "Render Markdown in Previews": "", "Reorder Models": "Modellek átrendezése", "Reply": "", "Reply in Thread": "Válasz szálban", @@ -1639,6 +1640,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/id-ID/translation.json b/src/lib/i18n/locales/id-ID/translation.json index 2befb985a4..4de14dad37 100644 --- a/src/lib/i18n/locales/id-ID/translation.json +++ b/src/lib/i18n/locales/id-ID/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Hapus Model", "Rename": "Ganti nama", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1638,6 +1639,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/ie-GA/translation.json b/src/lib/i18n/locales/ie-GA/translation.json index 8d2ba37ef8..9b8cd16c99 100644 --- a/src/lib/i18n/locales/ie-GA/translation.json +++ b/src/lib/i18n/locales/ie-GA/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Bain íomhá", "Remove Model": "Bain an tSamhail", "Rename": "Athainmnigh", + "Render Markdown in Previews": "", "Reorder Models": "Athordú na Samhlacha", "Reply": "Freagra", "Reply in Thread": "Freagra i Snáithe", @@ -1639,6 +1640,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "Taispeáin Comhaid", "Show Formatting Toolbar": "Taispeáin Barra Uirlisí Formáidithe", "Show image preview": "Taispeáin réamhamharc íomhá", diff --git a/src/lib/i18n/locales/it-IT/translation.json b/src/lib/i18n/locales/it-IT/translation.json index a6cbd67dd0..b63d3502f3 100644 --- a/src/lib/i18n/locales/it-IT/translation.json +++ b/src/lib/i18n/locales/it-IT/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Rimuovi Modello", "Rename": "Rinomina", + "Render Markdown in Previews": "", "Reorder Models": "Riordina Modelli", "Reply": "", "Reply in Thread": "Rispondi nel thread", @@ -1640,6 +1641,7 @@ "Show": "Mostra", "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 ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/ja-JP/translation.json b/src/lib/i18n/locales/ja-JP/translation.json index 51fc7d974a..962526fd52 100644 --- a/src/lib/i18n/locales/ja-JP/translation.json +++ b/src/lib/i18n/locales/ja-JP/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "画像を削除", "Remove Model": "モデルを削除", "Rename": "名前を変更", + "Render Markdown in Previews": "", "Reorder Models": "モデルを並べ替え", "Reply": "", "Reply in Thread": "スレッドで返信", @@ -1638,6 +1639,7 @@ "Show": "表示", "Show \"What's New\" modal on login": "ログイン時に更新内容モーダルを表示", "Show Admin Details in Account Pending Overlay": "アカウント保留中の管理者詳細を表示", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "フォーマットツールバーを表示", "Show image preview": "画像のプレビューを表示", diff --git a/src/lib/i18n/locales/ka-GE/translation.json b/src/lib/i18n/locales/ka-GE/translation.json index 6885be0b32..979ddaae83 100644 --- a/src/lib/i18n/locales/ka-GE/translation.json +++ b/src/lib/i18n/locales/ka-GE/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "სურათის წაშლა", "Remove Model": "მოდელის წაშლა", "Rename": "სახელის გადარქმევა", + "Render Markdown in Previews": "", "Reorder Models": "მოდელების გადალაგება", "Reply": "პასუხი", "Reply in Thread": "ნაკადში პასუხი", @@ -1639,6 +1640,7 @@ "Show": "ჩვენება", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "დაფორმატების პანელის ჩვენება", "Show image preview": "გამოსახულების გადახედვის ჩვენება", diff --git a/src/lib/i18n/locales/kab-DZ/translation.json b/src/lib/i18n/locales/kab-DZ/translation.json index d0d63b183e..340125e557 100644 --- a/src/lib/i18n/locales/kab-DZ/translation.json +++ b/src/lib/i18n/locales/kab-DZ/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Kkes tugna", "Remove Model": "Kkes tamudemt", "Rename": "Snifel isem", + "Render Markdown in Previews": "", "Reorder Models": "Ales n umizwer n tmudmiwin", "Reply": "Tiririt", "Reply in Thread": "Err deg udiwenni", @@ -1639,6 +1640,7 @@ "Show": "Sken-d", "Show \"What's New\" modal on login": "Sken-d \"D acu i d askar amaynut\" deg uɣmis", "Show Admin Details in Account Pending Overlay": "", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "Skan amsal n ufeggag n yifecka", "Show image preview": "Sken taskant n tugna", diff --git a/src/lib/i18n/locales/ko-KR/translation.json b/src/lib/i18n/locales/ko-KR/translation.json index 04e4150840..ca881eb781 100644 --- a/src/lib/i18n/locales/ko-KR/translation.json +++ b/src/lib/i18n/locales/ko-KR/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "이미지 삭제", "Remove Model": "모델 삭제", "Rename": "이름 변경", + "Render Markdown in Previews": "", "Reorder Models": "모델 재정렬", "Reply": "답장", "Reply in Thread": "스레드로 답장하기", @@ -1638,6 +1639,7 @@ "Show": "보기", "Show \"What's New\" modal on login": "로그인시 \"새로운 기능\" 모달 보기", "Show Admin Details in Account Pending Overlay": "사용자용 계정 보류 설명창에, 관리자 상세 정보 노출", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "서식 툴바 표시", "Show image preview": "이미지 미리보기", diff --git a/src/lib/i18n/locales/lt-LT/translation.json b/src/lib/i18n/locales/lt-LT/translation.json index 7ec79601ec..1c0ce79e83 100644 --- a/src/lib/i18n/locales/lt-LT/translation.json +++ b/src/lib/i18n/locales/lt-LT/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Pašalinti modelį", "Rename": "Pervadinti", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1641,6 +1642,7 @@ "Show": "Rodyti", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "Rodyti administratoriaus duomenis laukiant paskyros patvirtinimo", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/lv-LV/translation.json b/src/lib/i18n/locales/lv-LV/translation.json index f60911158f..5a4696c61c 100644 --- a/src/lib/i18n/locales/lv-LV/translation.json +++ b/src/lib/i18n/locales/lv-LV/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Noņemt attēlu", "Remove Model": "Noņemt modeli", "Rename": "Pārdēvēt", + "Render Markdown in Previews": "", "Reorder Models": "Pārkārtot modeļus", "Reply": "Atbildēt", "Reply in Thread": "Atbildēt pavedienā", @@ -1640,6 +1641,7 @@ "Show": "Rādīt", "Show \"What's New\" modal on login": "Rādīt \"Kas jauns\" logu pie pieteikšanās", "Show Admin Details in Account Pending Overlay": "Rādīt administratora detaļas konta gaidīšanas pārklājumā", + "Show all ({{COUNT}} characters)": "", "Show Files": "Rādīt failus", "Show Formatting Toolbar": "Rādīt formatēšanas rīkjoslu", "Show image preview": "Rādīt attēla priekšskatījumu", diff --git a/src/lib/i18n/locales/ms-MY/translation.json b/src/lib/i18n/locales/ms-MY/translation.json index b593856d81..d253acd1f0 100644 --- a/src/lib/i18n/locales/ms-MY/translation.json +++ b/src/lib/i18n/locales/ms-MY/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Hapuskan Model", "Rename": "Namakan Semula", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1638,6 +1639,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/nb-NO/translation.json b/src/lib/i18n/locales/nb-NO/translation.json index c4f2f1022e..0e7471167c 100644 --- a/src/lib/i18n/locales/nb-NO/translation.json +++ b/src/lib/i18n/locales/nb-NO/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Fjern modell", "Rename": "Gi nytt navn", + "Render Markdown in Previews": "", "Reorder Models": "Sorter modeller på nytt", "Reply": "", "Reply in Thread": "Svar i tråd", @@ -1639,6 +1640,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/nl-NL/translation.json b/src/lib/i18n/locales/nl-NL/translation.json index 6089c0ebd6..fee2d29d8b 100644 --- a/src/lib/i18n/locales/nl-NL/translation.json +++ b/src/lib/i18n/locales/nl-NL/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Verwijder model", "Rename": "Hernoemen", + "Render Markdown in Previews": "", "Reorder Models": "Herschik modellen", "Reply": "", "Reply in Thread": "Antwoord in draad", @@ -1639,6 +1640,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/pa-IN/translation.json b/src/lib/i18n/locales/pa-IN/translation.json index 88978d8894..f341c2054c 100644 --- a/src/lib/i18n/locales/pa-IN/translation.json +++ b/src/lib/i18n/locales/pa-IN/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "ਮਾਡਲ ਹਟਾਓ", "Rename": "ਨਾਮ ਬਦਲੋ", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1639,6 +1640,7 @@ "Show": "ਦਿਖਾਓ", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/pl-PL/translation.json b/src/lib/i18n/locales/pl-PL/translation.json index be784b2149..d5ad239ed4 100644 --- a/src/lib/i18n/locales/pl-PL/translation.json +++ b/src/lib/i18n/locales/pl-PL/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Usuń obraz", "Remove Model": "Usuń model", "Rename": "Zmień nazwę", + "Render Markdown in Previews": "", "Reorder Models": "Zmień kolejność modeli", "Reply": "Odpowiedz", "Reply in Thread": "Odpowiedz w wątku", @@ -1641,6 +1642,7 @@ "Show": "Pokaż", "Show \"What's New\" modal on login": "Pokaż okno \"Co nowego\" przy logowaniu", "Show Admin Details in Account Pending Overlay": "Pokaż dane admina na ekranie oczekiwania", + "Show all ({{COUNT}} characters)": "", "Show Files": "Pokaż pliki", "Show Formatting Toolbar": "Pokaż pasek formatowania", "Show image preview": "Pokaż podgląd obrazu", diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index bb3431fdd4..68fc69110e 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Remover imagem", "Remove Model": "Remover Modelo", "Rename": "Renomear", + "Render Markdown in Previews": "", "Reorder Models": "Reordenar modelos", "Reply": "Responder", "Reply in Thread": "Responder no tópico", @@ -1640,6 +1641,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "Mostrar arquivos", "Show Formatting Toolbar": "Mostrar barra de ferramentas de formatação", "Show image preview": "Mostrar pré-visualização da imagem", diff --git a/src/lib/i18n/locales/pt-PT/translation.json b/src/lib/i18n/locales/pt-PT/translation.json index f32f941e3c..e45392bada 100644 --- a/src/lib/i18n/locales/pt-PT/translation.json +++ b/src/lib/i18n/locales/pt-PT/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Remover Modelo", "Rename": "Renomear", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1640,6 +1641,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/ro-RO/translation.json b/src/lib/i18n/locales/ro-RO/translation.json index 282b3cda26..a9540cbbaa 100644 --- a/src/lib/i18n/locales/ro-RO/translation.json +++ b/src/lib/i18n/locales/ro-RO/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Înlătură Modelul", "Rename": "Redenumește", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1640,6 +1641,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 3f3d302ba4..79b0e0d347 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Удалить изображение", "Remove Model": "Удалить модель", "Rename": "Переименовать", + "Render Markdown in Previews": "", "Reorder Models": "Изменение порядка моделей", "Reply": "", "Reply in Thread": "Ответить в обсуждении", @@ -1641,6 +1642,7 @@ "Show": "Показать", "Show \"What's New\" modal on login": "Показывать окно «Что нового» при входе в систему", "Show Admin Details in Account Pending Overlay": "Показывать данные администратора в оверлее ожидающей учетной записи", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "Показать панель форматирования", "Show image preview": "Показать предварительный просмотр изображения", diff --git a/src/lib/i18n/locales/sk-SK/translation.json b/src/lib/i18n/locales/sk-SK/translation.json index 2793b59bb2..d85be4a0e7 100644 --- a/src/lib/i18n/locales/sk-SK/translation.json +++ b/src/lib/i18n/locales/sk-SK/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Odstrániť model", "Rename": "Premenovať", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1641,6 +1642,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/sr-RS/translation.json b/src/lib/i18n/locales/sr-RS/translation.json index 1c0c79a9a0..dde9534020 100644 --- a/src/lib/i18n/locales/sr-RS/translation.json +++ b/src/lib/i18n/locales/sr-RS/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Уклони модел", "Rename": "Преименуј", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1640,6 +1641,7 @@ "Show": "Прикажи", "Show \"What's New\" modal on login": "Прикажи \"Погледај шта је ново\" прозорче при пријави", "Show Admin Details in Account Pending Overlay": "", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/sv-SE/translation.json b/src/lib/i18n/locales/sv-SE/translation.json index 60fca40a71..71a596fdaa 100644 --- a/src/lib/i18n/locales/sv-SE/translation.json +++ b/src/lib/i18n/locales/sv-SE/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "Ta bort bild", "Remove Model": "Ta bort modell", "Rename": "Byt namn", + "Render Markdown in Previews": "", "Reorder Models": "Omordna modeller", "Reply": "Svara", "Reply in Thread": "Svara i tråd", @@ -1639,6 +1640,7 @@ "Show": "Visa", "Show \"What's New\" modal on login": "Visa \"Vad är nytt\"-modalen vid inloggning", "Show Admin Details in Account Pending Overlay": "Visa administratörsinformation till väntande konton", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "Visa verktygsfält för textformatering", "Show image preview": "Visa förhandsvisning av bild", diff --git a/src/lib/i18n/locales/th-TH/translation.json b/src/lib/i18n/locales/th-TH/translation.json index f40af7d752..a92f47aae9 100644 --- a/src/lib/i18n/locales/th-TH/translation.json +++ b/src/lib/i18n/locales/th-TH/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "ลบรูปภาพ", "Remove Model": "ลบโมเดล", "Rename": "เปลี่ยนชื่อ", + "Render Markdown in Previews": "", "Reorder Models": "จัดลำดับโมเดลใหม่", "Reply": "ตอบกลับ", "Reply in Thread": "ตอบกลับในเธรด", @@ -1638,6 +1639,7 @@ "Show": "แสดง", "Show \"What's New\" modal on login": "แสดงหน้าต่าง \"มีอะไรใหม่\" เมื่อเข้าสู่ระบบ", "Show Admin Details in Account Pending Overlay": "แสดงรายละเอียดผู้ดูแลระบบในหน้าต่างซ้อนรอการอนุมัติบัญชี", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "แสดงแถบเครื่องมือการจัดรูปแบบ", "Show image preview": "แสดงตัวอย่างรูปภาพ", diff --git a/src/lib/i18n/locales/tk-TM/translation.json b/src/lib/i18n/locales/tk-TM/translation.json index 19631f3662..ae91d6e6ab 100644 --- a/src/lib/i18n/locales/tk-TM/translation.json +++ b/src/lib/i18n/locales/tk-TM/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Modeli Aýyr", "Rename": "Adyny Üýtget", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1639,6 +1640,7 @@ "Show": "Görkez", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/tr-TR/translation.json b/src/lib/i18n/locales/tr-TR/translation.json index 2c951da626..1573099372 100644 --- a/src/lib/i18n/locales/tr-TR/translation.json +++ b/src/lib/i18n/locales/tr-TR/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Modeli Kaldır", "Rename": "Yeniden Adlandır", + "Render Markdown in Previews": "", "Reorder Models": "Modelleri Yeniden Sırala", "Reply": "", "Reply in Thread": "Konuya Yanıtla", @@ -1639,6 +1640,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/ug-CN/translation.json b/src/lib/i18n/locales/ug-CN/translation.json index 7f3c1de226..6feb7787ac 100644 --- a/src/lib/i18n/locales/ug-CN/translation.json +++ b/src/lib/i18n/locales/ug-CN/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "مودېل چىقىرىۋېتىش", "Rename": "ئات ئۆزگەرتىش", + "Render Markdown in Previews": "", "Reorder Models": "مودېللارنى قايتا تەرتىپلەش", "Reply": "", "Reply in Thread": "تارماقتا ئىنكاس قايتۇرۇش", @@ -1639,6 +1640,7 @@ "Show": "كۆرسىتىش", "Show \"What's New\" modal on login": "كىرىشتە \"يېڭىلىق\" مودىلىنى كۆرسىتىش", "Show Admin Details in Account Pending Overlay": "ھېسابات كۈتۈۋاتقان قاپلىماسىدا باشقۇرغۇچى تەپسىلاتىنى كۆرسىتىش", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/uk-UA/translation.json b/src/lib/i18n/locales/uk-UA/translation.json index c64a9bbbe9..9c189ece2b 100644 --- a/src/lib/i18n/locales/uk-UA/translation.json +++ b/src/lib/i18n/locales/uk-UA/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Видалити модель", "Rename": "Переназвати", + "Render Markdown in Previews": "", "Reorder Models": "Переставити моделі", "Reply": "", "Reply in Thread": "Відповісти в потоці", @@ -1641,6 +1642,7 @@ "Show": "Показати", "Show \"What's New\" modal on login": "Показати модальне вікно \"Що нового\" під час входу", "Show Admin Details in Account Pending Overlay": "Відобразити дані адміна у вікні очікування облікового запису", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/ur-PK/translation.json b/src/lib/i18n/locales/ur-PK/translation.json index 8924cfdadf..04c2a8f335 100644 --- a/src/lib/i18n/locales/ur-PK/translation.json +++ b/src/lib/i18n/locales/ur-PK/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "ماڈل ہٹائیں", "Rename": "تبدیل نام کریں", + "Render Markdown in Previews": "", "Reorder Models": "", "Reply": "", "Reply in Thread": "", @@ -1639,6 +1640,7 @@ "Show": "دکھائیں", "Show \"What's New\" modal on login": "", "Show Admin Details in Account Pending Overlay": "اکاؤنٹ پینڈنگ اوورلے میں ایڈمن کی تفصیلات دکھائیں", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/uz-Cyrl-UZ/translation.json b/src/lib/i18n/locales/uz-Cyrl-UZ/translation.json index 4f4ed83a75..816fbbb63e 100644 --- a/src/lib/i18n/locales/uz-Cyrl-UZ/translation.json +++ b/src/lib/i18n/locales/uz-Cyrl-UZ/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Моделни олиб ташлаш", "Rename": "Номини ўзгартириш", + "Render Markdown in Previews": "", "Reorder Models": "Моделларни қайта тартиблаш", "Reply": "", "Reply in Thread": "Мавзуда жавоб беринг", @@ -1639,6 +1640,7 @@ "Show": "Кўрсатиш", "Show \"What's New\" modal on login": "Киришда \"Янги нарсалар\" модалини кўрсатинг", "Show Admin Details in Account Pending Overlay": "Ҳисоб кутилаётган қатламда администратор маълумотларини кўрсатиш", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/uz-Latn-Uz/translation.json b/src/lib/i18n/locales/uz-Latn-Uz/translation.json index 0cab416e7f..911f3f1755 100644 --- a/src/lib/i18n/locales/uz-Latn-Uz/translation.json +++ b/src/lib/i18n/locales/uz-Latn-Uz/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Modelni olib tashlash", "Rename": "Nomini o'zgartirish", + "Render Markdown in Previews": "", "Reorder Models": "Modellarni qayta tartiblash", "Reply": "", "Reply in Thread": "Mavzuda javob bering", @@ -1639,6 +1640,7 @@ "Show": "Ko'rsatish", "Show \"What's New\" modal on login": "Kirishda \"Yangi narsalar\" modalini ko'rsating", "Show Admin Details in Account Pending Overlay": "Hisob kutilayotgan qatlamda administrator ma’lumotlarini ko‘rsatish", + "Show all ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/vi-VN/translation.json b/src/lib/i18n/locales/vi-VN/translation.json index 72812f10dd..a861a4101f 100644 --- a/src/lib/i18n/locales/vi-VN/translation.json +++ b/src/lib/i18n/locales/vi-VN/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "", "Remove Model": "Xóa model", "Rename": "Đổi tên", + "Render Markdown in Previews": "", "Reorder Models": "Sắp xếp lại Mô hình", "Reply": "", "Reply in Thread": "Trả lời trong Luồng", @@ -1638,6 +1639,7 @@ "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 ({{COUNT}} characters)": "", "Show Files": "", "Show Formatting Toolbar": "", "Show image preview": "", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index cc2f4f945e..fc378a2eff 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "移除图像", "Remove Model": "移除模型", "Rename": "重命名", + "Render Markdown in Previews": "", "Reorder Models": "重新排序模型", "Reply": "回复", "Reply in Thread": "回复主题", @@ -1638,6 +1639,7 @@ "Show": "显示", "Show \"What's New\" modal on login": "版本更新后首次登录时显示“新功能介绍”弹窗", "Show Admin Details in Account Pending Overlay": "在待激活用户的界面中显示管理员邮箱等详细信息", + "Show all ({{COUNT}} characters)": "", "Show Files": "显示文件", "Show Formatting Toolbar": "显示文本格式工具栏", "Show image preview": "显示图像预览", diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index 1b7a4e35dd..ecebabc807 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -1479,6 +1479,7 @@ "Remove image": "移除圖片", "Remove Model": "移除模型", "Rename": "重新命名", + "Render Markdown in Previews": "", "Reorder Models": "重新排序模型", "Reply": "回覆", "Reply in Thread": "在討論串中回覆", @@ -1638,6 +1639,7 @@ "Show": "顯示", "Show \"What's New\" modal on login": "登入時顯示「新功能」對話框", "Show Admin Details in Account Pending Overlay": "在帳號待審覆蓋層中顯示管理員詳細資訊", + "Show all ({{COUNT}} characters)": "", "Show Files": "顯示檔案", "Show Formatting Toolbar": "顯示文字格式工具列", "Show image preview": "顯示圖片預覽", From ca0983f76b3b668fc16de2e233e923118c8c7acc Mon Sep 17 00:00:00 2001 From: Shamil Date: Mon, 16 Feb 2026 10:27:23 +0300 Subject: [PATCH 32/59] i18n: Add missing Russian (ru-RU) translations (#21453) * i18n: add missing Russian (ru-RU) translations * i18n: add translations for API Keys and Asc keys --- src/lib/i18n/locales/ru-RU/translation.json | 148 ++++++++++---------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 79b0e0d347..d81638cd12 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -12,30 +12,30 @@ "{{COUNT}} Available Tools": "{{COUNT}} доступных инструментов", "{{COUNT}} characters": "{{COUNT}} символов", "{{COUNT}} extracted lines": "{{COUNT}} извлеченных строк", - "{{COUNT}} files": "", + "{{COUNT}} files": "{{COUNT}} файлов", "{{COUNT}} hidden lines": "{{COUNT}} скрытых строк", "{{COUNT}} Replies": "{{COUNT}} Ответов", - "{{COUNT}} Rows": "", + "{{COUNT}} Rows": "{{COUNT}} Строк", "{{COUNT}} Sources": "{{COUNT}} Источников", "{{COUNT}} words": "{{COUNT}} слов", "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "{{LOCALIZED_DATE}} в {{LOCALIZED_TIME}}", "{{model}} download has been canceled": "{{model}} загрузка была отменена", - "{{NAMES}} reacted with {{REACTION}}": "", + "{{NAMES}} reacted with {{REACTION}}": "{{NAMES}} поставили {{REACTION}}", "{{user}}'s Chats": "Чаты {{user}}'а", "{{webUIName}} Backend Required": "Необходимо подключение к серверу {{webUIName}}", "*Prompt node ID(s) are required for image generation": "ID узлов промптов обязательны для генерации изображения", "1 Source": "1 Источник", - "A collaboration channel where people join as members": "", - "A discussion channel where access is controlled by groups and permissions": "", + "A collaboration channel where people join as members": "Коллаборационный канал, где люди присоединяются как участники", + "A discussion channel where access is controlled by groups and permissions": "Обсуждение канала, где доступ контролируется группами и разрешениями", "A new version (v{{LATEST_VERSION}}) is now available.": "Новая версия (v{{LATEST_VERSION}}) теперь доступна.", - "A private conversation between you and selected users": "", + "A private conversation between you and selected users": "Приватный чат между вами и выбранными пользователями", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Модель задач используется при выполнении таких задач, как генерация заголовков для чатов и поисковых запросов в Интернете", "a user": "пользователь", "About": "О программе", - "Accept Autocomplete Generation\nJump to Prompt Variable": "", + "Accept Autocomplete Generation\nJump to Prompt Variable": "Доступ к автозаполнению\nПерейти к переменной запроса", "Access": "Доступ", "Access Control": "Контроль доступа", - "Access List": "", + "Access List": "Список доступов", "Accessible to all users": "Доступно всем пользователям", "Account": "Учетная запись", "Account Activation Pending": "Ожидание активации учетной записи", @@ -48,53 +48,53 @@ "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Активируйте эту команду, набрав \"/{{COMMAND}}\" для ввода в чате.", "Active": "Активен", "Active Users": "Активные пользователи", - "Activity": "", + "Activity": "Активность", "Add": "Добавить", "Add a model ID": "Добавить ID модели", "Add a short description about what this model does": "Добавьте краткое описание того, что делает эта модель", "Add a tag": "Добавьте тег", - "Add a tag...": "", - "Add Access": "", + "Add a tag...": "Добавить тег...", + "Add Access": "Добавить доступ", "Add Arena Model": "Добавить модель арены", "Add Connection": "Добавить соединение", "Add Content": "Добавить контент", "Add content here": "Добавить контент сюда", "Add Custom Parameter": "Добавить пользовательский параметр", - "Add Custom Prompt": "", + "Add Custom Prompt": "Добавить пользовательский запрос", "Add Details": "Добавить детали", "Add Files": "Добавить файлы", - "Add Image": "", - "Add Member": "", - "Add Members": "", + "Add Image": "Добавить изображение", + "Add Member": "Добавить участника", + "Add Members": "Добавить участников", "Add Memory": "Добавить воспоминание", "Add Model": "Добавить модель", "Add Reaction": "Добавить реакцию", - "Add tag": "", + "Add tag": "Добавить тег", "Add Tag": "Добавить тег", "Add text content": "Добавить текстовый контент", "Add User": "Добавить пользователя", "Add User Group": "Добавить группу пользователей", - "Add webpage": "", + "Add webpage": "Добавить веб-страницу", "Additional Config": "Дополнительные настройки", "Additional configuration options for marker. This should be a JSON string with key-value pairs. For example, '{\"key\": \"value\"}'. Supported keys include: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level": "Дополнительные настройки для marker. Это должна быть строка JSON с ключами и значениями. Например, '{\"key\": \"value\"}'. Поддерживаемые ключи включают: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level", - "Additional Parameters": "", + "Additional Parameters": "Дополнительные параметры", "Adds filenames, titles, sections, and snippets into the BM25 text to improve lexical recall.": "", "Adjusting these settings will apply changes universally to all users.": "Изменения в этих настройках будут применены для всех пользователей.", "admin": "админ", "Admin": "Админ", - "Admin Contact Email": "", + "Admin Contact Email": "Адрес электронной почты администратора", "Admin Panel": "Панель администратора", "Admin Settings": "Настройки администратора", "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Администраторы всегда имеют доступ ко всем инструментам; пользователям нужны инструменты, назначенные для каждой модели в рабочем пространстве.", "Advanced Parameters": "Расширенные параметры", - "Advanced parameters for MinerU parsing (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)": "", + "Advanced parameters for MinerU parsing (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)": "Дополнительные параметры для анализа MinerU (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)", "Advanced Params": "Расширенные параметры", - "After updating or changing the embedding model, you must reindex the knowledge base for the changes to take effect. You can do this using the \"Reindex\" button below.": "", + "After updating or changing the embedding model, you must reindex the knowledge base for the changes to take effect. You can do this using the \"Reindex\" button below.": "После обновления или изменения модели встраивания необходимо пересоздать базу знаний для применения изменений. Вы можете это сделать, используя кнопку \"Пересоздать\" ниже.", "AI": "AI", "All": "Все", - "All chats have been unarchived.": "", + "All chats have been unarchived.": "Все чаты были разархивированы.", "All models deleted successfully": "Все модели успешно удалены", - "All Users": "", + "All Users": "Все пользователи", "Allow Call": "Разрешить звонки", "Allow Chat Controls": "Разрешить управление чатом", "Allow Chat Delete": "Разрешить удаление чата", @@ -135,17 +135,17 @@ "and {{COUNT}} more": "и еще {{COUNT}}", "and create a new shared link.": "и создайте новую общую ссылку.", "Android": "Android", - "Anyone": "", + "Anyone": "Кому угодно", "API Base URL": "Базовый адрес API", "API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "Базовый URL API для сервиса Datalab Marker. По умолчанию: https://www.datalab.to/api/v1/marker", "API Key": "Ключ API", "API Key created.": "Ключ API создан.", "API Key Endpoint Restrictions": "Ограничения на энд-поинт API", "API keys": "Ключи API", - "API Keys": "", + "API Keys": "Ключи API", "API Mode": "", "API Timeout": "", - "API Type": "", + "API Type": "тип API", "API Version": "Версия API", "API Version is required": "Обязательна версия API", "Application DN": "DN приложения", @@ -153,21 +153,21 @@ "applies to all users with the \"user\" role": "применяется ко всем пользователям с ролью «пользователь»", "April": "Апрель", "Archive": "Архив", - "Archive All": "", + "Archive All": "Архивировать все", "Archive All Chats": "Архивировать все чаты", "Archived Chats": "Архив чатов", "archived-chat-export": "экспорт-архивного-чата", "Are you sure you want to archive all chats? This action cannot be undone.": "", "Are you sure you want to clear all memories? This action cannot be undone.": "Вы уверены, что хотите удалить все воспоминания? Это действие невозможно отменить.", - "Are you sure you want to delete \"{{NAME}}\"?": "", - "Are you sure you want to delete all chats? This action cannot be undone.": "", + "Are you sure you want to delete \"{{NAME}}\"?": "Вы уверены, что хотите удалить \"{{NAME}}\"?", + "Are you sure you want to delete all chats? 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 delete this version? Child versions will be relinked to this version's parent.": "", "Are you sure you want to unarchive all archived chats?": "Вы уверены, что хотите разархивировать все заархивированные чаты?", "Arena Models": "Арена моделей", "Artifacts": "Артефакты", - "Asc": "", + "Asc": "По возрастанию", "Ask": "Спросить", "Ask a question": "Задать вопрос", "Assistant": "Ассистент", @@ -185,7 +185,7 @@ "Authenticate": "Аутентификация", "Authentication": "Аутентификация", "Auto": "Автоматически", - "Auto (Random)": "", + "Auto (Random)": "Автоматически (случайно)", "Auto-Copy Response to Clipboard": "Автоматическое копирование ответа в буфер обмена", "Auto-playback response": "Автоматическое воспроизведение ответа", "Autocomplete Generation": "Генерация автозаполнения", @@ -224,13 +224,13 @@ "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Увеличение или отмена определенных токенов за ограниченные ответы. Значения смещения будут находиться в диапазоне от -100 до 100 (включительно). (По умолчанию: ничего)", "Brave": "", "Brave Search API Key": "Ключ API поиска Brave", - "Browse and query knowledge bases": "", - "Builtin Tools": "", + "Browse and query knowledge bases": "Обзор и запрос баз знаний", + "Builtin Tools": "Встроенные инструменты", "Bullet List": "Маркированный список", "Button ID": "ID кнопки", "Button Label": "Подпись кнопки", "Button Prompt": "Промпт кнопки", - "by {{name}}": "", + "by {{name}}": "от {{name}}", "By {{name}}": "От {{name}}", "Bypass Embedding and Retrieval": "Обход встраивания и извлечения данных", "Bypass Web Loader": "Обход веб-загрузчика", @@ -240,8 +240,8 @@ "Call feature is not supported when using Web STT engine": "Функция вызова не поддерживается при использовании Web STT (распознавание речи) движка", "Camera": "Камера", "Cancel": "Отменить", - "Cannot create an empty note.": "", - "Cannot delete the production version": "", + "Cannot create an empty note.": "Нельзя создать пустую заметку.", + "Cannot delete the production version": "Нельзя удалить версию в производстве.", "Capabilities": "Возможности", "Capture": "Захват", "Capture Audio": "Захват аудио", @@ -251,8 +251,8 @@ "Channel deleted successfully": "Канал успешно удалён", "Channel Name": "Название канала", "Channel name cannot be empty.": "Название канала не может быть пустым.", - "Channel name must be less than 128 characters": "", - "Channel Type": "", + "Channel name must be less than 128 characters": "Канал не может содержать более 128 символов", + "Channel Type": "Тип канала", "Channel updated successfully": "Канал успешно обновлён", "Channels": "Каналы", "Character": "Символ", @@ -265,15 +265,15 @@ "Chat Controls": "Управление чатом", "Chat Conversation": "Обсуждение в чате", "Chat direction": "Направление чата", - "Chat exported successfully": "", - "Chat History": "", + "Chat exported successfully": "Чат успешно экспортирован", + "Chat History": "История чата", "Chat ID": "ID чата", "Chat moved successfully": "Чат успешно перемещён", "Chat Overview": "Обзор чата", "Chat Permissions": "Разрешения для чата", "Chat Tags Auto-Generation": "Автогенерация тегов чата", - "Chat unshared successfully.": "", - "chats": "", + "Chat unshared successfully.": "Чат успешно разделяется", + "chats": "чаты", "Chats": "Чаты", "Check Again": "Перепроверьте ещё раз", "Check for updates": "Проверить обновления", @@ -282,13 +282,13 @@ "Chunk Min Size Target": "", "Chunk Overlap": "Перекрытие фрагментов", "Chunk Size": "Размер фрагмента", - "Chunks smaller than this threshold will be merged with neighboring chunks when possible. Set to 0 to disable merging.": "", + "Chunks smaller than this threshold will be merged with neighboring chunks when possible. Set to 0 to disable merging.": "Чанки меньшего размера будут объединены с соседними чанками при возможности. Установите 0 для отключения объединения.", "Ciphers": "Шифры", "Citation": "Цитирование", "Citations": "Цитаты", "Clear memory": "Очистить воспоминания", "Clear Memory": "Очистить память", - "Clear status": "", + "Clear status": "Очистить статус", "click here": "кликните сюда", "Click here for filter guides.": "Нажмите здесь, чтобы просмотреть руководства по фильтрам.", "Click here for help.": "Нажмите здесь для получения помощи.", @@ -302,7 +302,7 @@ "Click here to upload a workflow.json file.": "Нажмите здесь, чтобы загрузить файл workflow.json.", "click here.": "нажмите здесь.", "Click on the user role button to change a user's role.": "Нажмите кнопку роли пользователя, чтобы изменить роль пользователя.", - "Click to copy ID": "", + "Click to copy ID": "Нажмите, чтобы скопировать ID", "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "В разрешении на запись в буфер обмена отказано. Пожалуйста, проверьте настройки своего браузера, чтобы предоставить необходимый доступ.", "Clone": "Клонировать", "Clone Chat": "Клонировать чат", @@ -311,7 +311,7 @@ "Close Banner": "Закрыть баннер", "Close Configure Connection Modal": "Закрыть модальное окно настройки соединения", "Close modal": "Закрыть окно", - "Close Modal": "", + "Close Modal": "Закрыть модальное окно", "Close settings modal": "Закрыть окно настроек", "Close Sidebar": "Закрыть боковую панель", "cloud": "", @@ -329,7 +329,7 @@ "Collaboration channel where people join as members": "", "Collapse": "Свернуть", "Collection": "Коллекция", - "Collections": "", + "Collections": "Коллекции", "Color": "Цвет", "ComfyUI": "ComfyUI", "ComfyUI API Key": "ComfyUI ключ API", @@ -338,10 +338,10 @@ "ComfyUI Workflow": "Рабочий процесс ComfyUI", "ComfyUI Workflow Nodes": "Узлы рабочего процесса ComfyUI", "Comma separated Node Ids (e.g. 1 or 1,2)": "ID узлов через запятую (напр., 1 или 1,2)", - "command": "", + "command": "команда", "Command": "Команда", "Comment": "Комментарий", - "Commit Message": "", + "Commit Message": "Добавить сообщение", "Community Reviews": "", "Completions": "Завершения", "Compress Images in Channels": "Сжимать изображения в каналах", @@ -365,7 +365,7 @@ "Contact Admin for WebUI Access": "Обратитесь к администратору для получения доступа к WebUI", "Content": "Содержание", "Content Extraction Engine": "Механизм извлечения контента", - "Content lengths (character counts only)": "", + "Content lengths (character counts only)": "Длина контента (только количество символов)", "Continue Response": "Продолжить ответ", "Continue with {{provider}}": "Продолжить с {{provider}}", "Continue with Email": "Продолжить с Email", @@ -381,38 +381,38 @@ "Copied to clipboard": "Скопировано в буфер обмена", "Copy": "Копировать", "Copy Formatted Text": "Копировать форматированный текст", - "Copy Last Code Block": "", - "Copy Last Response": "", + "Copy Last Code Block": "Копировать последний блок кода", + "Copy Last Response": "Копировать последний ответ", "Copy link": "Скопировать ссылку", "Copy Link": "Копировать ссылку", - "Copy Prompt": "", - "Copy Share Link": "", + "Copy Prompt": "Копировать запрос", + "Copy Share Link": "Копировать ссылку для обмена", "Copy to clipboard": "Скопировать в буфер обмена", - "Copy URL": "", + "Copy URL": "Копировать ссылку", "Copying to clipboard was successful!": "Копирование в буфер обмена прошло успешно!", "CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS должен быть должным образом настроен провайдером, чтобы разрешать запросы из Open WebUI.", "Create": "Создать", "Create a knowledge base": "Создайте базу знаний", "Create a model": "Создание модели", - "Create a new note": "", + "Create a new note": "Создать новую заметку", "Create Account": "Создать аккаунт", "Create Admin Account": "Создать аккаунт Администратора", "Create Channel": "Создать канал", "Create Folder": "Создать папку", "Create Group": "Создать группу", - "Create Image": "", + "Create Image": "Создать изображение", "Create Knowledge": "Создать знание", - "Create Model": "", + "Create Model": "Создать модель", "Create new key": "Создать новый ключ", "Create new secret key": "Создать новый секретный ключ", - "Create note": "", + "Create note": "Создать заметку", "Create Note": "Создать заметку", "Create your first note by clicking on the plus button below.": "Создайте свою первую заметку, нажав на кнопку плюс ниже.", "Created at": "Создан(а)", "Created At": "Создано", "Created by": "Создано", - "Created by you": "", - "Created on {{date}}": "", + "Created by you": "Создано вами", + "Created on {{date}}": "Создано {{date}}", "CSV Import": "Импорт CSV", "Ctrl+Enter to Send": "Ctrl+Enter чтобы отправить", "Current Model": "Текущая модель", @@ -438,14 +438,14 @@ "Default description enabled": "Описание по умолчанию включено", "Default Features": "Функции по умолчанию", "Default Filters": "Фильтры по умолчанию", - "Default Group": "", + "Default Group": "Дефолтная группа", "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": "Модель по умолчанию", "Default model updated": "Модель по умолчанию обновлена", "Default Models": "Модели по умолчанию", "Default permissions": "Разрешения по умолчанию", "Default permissions updated successfully": "Разрешения по умолчанию успешно обновлены.", - "Default Pinned Models": "", + "Default Pinned Models": "Дефолтные закрепленные модели", "Default Prompt Suggestions": "Предложения промптов по умолчанию", "Default to 389 or 636 if TLS is enabled": "По умолчанию 389 или 636, если TLS включен.", "Default to ALL": "По умолчанию ВСЕ", @@ -453,34 +453,34 @@ "Default User Role": "Роль пользователя по умолчанию", "Delete": "Удалить", "Delete a model": "Удалить модель", - "Delete All": "", + "Delete All": "Удалить ВСЕ", "Delete All Chats": "Удалить ВСЕ Чаты", - "Delete all contents inside this folder": "", + "Delete all contents inside this folder": "Удалить все содержимое внутри этой папки", "Delete All Models": "Удалить ВСЕ Модели", "Delete Chat": "Удалить Чат", "Delete chat?": "Удалить чат?", - "Delete File": "", + "Delete File": "Удалить файл", "Delete folder?": "Удалить папку?", "Delete function?": "Удалить функцию?", "Delete Message": "Удалить сообщение", "Delete message?": "Удалить сообщение?", - "Delete Model": "", + "Delete Model": "Удалить модель", "Delete note?": "Удалить заметку?", "Delete prompt?": "Удалить промпт?", - "Delete skill?": "", + "Delete skill?": "Удалить навык?", "delete this link": "удалить эту ссылку", "Delete tool?": "Удалить этот инструмент?", "Delete User": "Удалить Пользователя", - "Delete Version": "", - "Deleted": "", + "Delete Version": "Удалить версию", + "Deleted": "Удалено", "Deleted {{deleteModelTag}}": "Удалено {{deleteModelTag}}", "Deleted {{name}}": "Удалено {{name}}", "Deleted User": "Удалённый пользователь", "Deployment names are required for Azure OpenAI": "Для Azure OpenAI требуются названия развертываний", - "Desc": "", - "Describe the edit...": "", - "Describe the image...": "", - "Describe what changed...": "", + "Desc": "Описание", + "Describe the edit...": "Опишите изменения...", + "Describe the image...": "Опишите изображение...", + "Describe what changed...": "Опишите изменения...", "Describe your knowledge base and objectives": "Опишите свою базу знаний и цели", "Description": "Описание", "Detect Artifacts Automatically": "Автоматическое обнаружение артефактов", From 15b5f97f89fe83eddc2f826dd7922c25d467f878 Mon Sep 17 00:00:00 2001 From: Algorithm5838 <108630393+Algorithm5838@users.noreply.github.com> Date: Mon, 16 Feb 2026 10:33:51 +0300 Subject: [PATCH 33/59] fix: prevent scroll jump when editing large messages (#21402) Save and restore scroll positions around textarea auto-resize to avoid layout shifts. Use preventScroll on focus. --- .../chat/Messages/ResponseMessage.svelte | 10 ++++++++++ .../components/chat/Messages/UserMessage.svelte | 16 ++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index 47c1b51422..ae55ca3495 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -365,8 +365,13 @@ await tick(); + const messagesContainer = document.getElementById('messages-container'); + const savedScrollTop = messagesContainer?.scrollTop; + editTextAreaElement.style.height = ''; editTextAreaElement.style.height = `${editTextAreaElement.scrollHeight}px`; + + if (messagesContainer) messagesContainer.scrollTop = savedScrollTop; }; const editMessageConfirmHandler = async () => { @@ -697,8 +702,13 @@ class=" bg-transparent outline-hidden w-full resize-none" bind:value={editedContent} on:input={(e) => { + const messagesContainer = document.getElementById('messages-container'); + const savedScrollTop = messagesContainer?.scrollTop; + e.target.style.height = ''; e.target.style.height = `${e.target.scrollHeight}px`; + + if (messagesContainer) messagesContainer.scrollTop = savedScrollTop; }} on:keydown={(e) => { if (e.key === 'Escape') { diff --git a/src/lib/components/chat/Messages/UserMessage.svelte b/src/lib/components/chat/Messages/UserMessage.svelte index 417c6737f6..f21d91bfbc 100644 --- a/src/lib/components/chat/Messages/UserMessage.svelte +++ b/src/lib/components/chat/Messages/UserMessage.svelte @@ -50,6 +50,7 @@ let editedFiles = []; let messageEditTextAreaElement: HTMLTextAreaElement; + let editScrollContainer: HTMLDivElement; let message = JSON.parse(JSON.stringify(history.messages[messageId])); $: if (history.messages) { @@ -73,10 +74,14 @@ await tick(); if (messageEditTextAreaElement) { + const messagesContainer = document.getElementById('messages-container'); + const savedScrollTop = messagesContainer?.scrollTop; + messageEditTextAreaElement.style.height = ''; messageEditTextAreaElement.style.height = `${messageEditTextAreaElement.scrollHeight}px`; - messageEditTextAreaElement?.focus(); + if (messagesContainer) messagesContainer.scrollTop = savedScrollTop; + messageEditTextAreaElement?.focus({ preventScroll: true }); } }; @@ -283,15 +288,22 @@
{/if} -
+