en la indicación arriba.',
+ learnMore: 'Aprender más',
+ editModal: {
+ title: 'Editar Nombres de Roles de Conversación',
+ userPrefix: 'Prefijo de Usuario',
+ assistantPrefix: 'Prefijo de Asistente',
+ },
+ },
+ toolbox: {
+ title: 'CAJA DE HERRAMIENTAS',
+ },
+ moderation: {
+ title: 'Moderación de contenido',
+ description: 'Asegura la salida del modelo utilizando API de moderación o manteniendo una lista de palabras sensibles.',
+ allEnabled: 'Contenido de ENTRADA/SALIDA Habilitado',
+ inputEnabled: 'Contenido de ENTRADA Habilitado',
+ outputEnabled: 'Contenido de SALIDA Habilitado',
+ modal: {
+ title: 'Configuración de moderación de contenido',
+ provider: {
+ title: 'Proveedor',
+ openai: 'Moderación de OpenAI',
+ openaiTip: {
+ prefix: 'La Moderación de OpenAI requiere una clave API de OpenAI configurada en la ',
+ suffix: '.',
+ },
+ keywords: 'Palabras clave',
+ },
+ keywords: {
+ tip: 'Una por línea, separadas por saltos de línea. Hasta 100 caracteres por línea.',
+ placeholder: 'Una por línea, separadas por saltos de línea',
+ line: 'Línea',
+ },
+ content: {
+ input: 'Moderar Contenido de ENTRADA',
+ output: 'Moderar Contenido de SALIDA',
+ preset: 'Respuestas predefinidas',
+ placeholder: 'Contenido de respuestas predefinidas aquí',
+ condition: 'Moderar Contenido de ENTRADA y SALIDA habilitado al menos uno',
+ fromApi: 'Las respuestas predefinidas son devueltas por la API',
+ errorMessage: 'Las respuestas predefinidas no pueden estar vacías',
+ supportMarkdown: 'Markdown soportado',
+ },
+ openaiNotConfig: {
+ before: 'La Moderación de OpenAI requiere una clave API de OpenAI configurada en la',
+ after: '',
+ },
+ },
+ },
+ },
+ automatic: {
+ title: 'Orquestación automatizada de aplicaciones',
+ description: 'Describe tu escenario, Dify orquestará una aplicación para ti.',
+ intendedAudience: '¿Quién es el público objetivo?',
+ intendedAudiencePlaceHolder: 'p.ej. Estudiante',
+ solveProblem: '¿Qué problemas esperan que la IA pueda resolver para ellos?',
+ solveProblemPlaceHolder: 'p.ej. Extraer ideas y resumir información de informes y artículos largos',
+ generate: 'Generar',
+ audiencesRequired: 'Audiencia requerida',
+ problemRequired: 'Problema requerido',
+ resTitle: 'Hemos orquestado la siguiente aplicación para ti.',
+ apply: 'Aplicar esta orquestación',
+ noData: 'Describe tu caso de uso a la izquierda, la vista previa de la orquestación se mostrará aquí.',
+ loading: 'Orquestando la aplicación para ti...',
+ overwriteTitle: '¿Sobrescribir configuración existente?',
+ overwriteMessage: 'Aplicar esta orquestación sobrescribirá la configuración existente.',
+ },
+ resetConfig: {
+ title: '¿Confirmar restablecimiento?',
+ message: 'Restablecer descarta cambios, restaurando la última configuración publicada.',
+ },
+ errorMessage: {
+ nameOfKeyRequired: 'nombre de la clave: {{key}} requerido',
+ valueOfVarRequired: 'el valor de {{key}} no puede estar vacío',
+ queryRequired: 'Se requiere texto de solicitud.',
+ waitForResponse: 'Por favor espera la respuesta al mensaje anterior para completar.',
+ waitForBatchResponse: 'Por favor espera la respuesta a la tarea por lotes para completar.',
+ notSelectModel: 'Por favor elige un modelo',
+ waitForImgUpload: 'Por favor espera a que la imagen se cargue',
+ },
+ chatSubTitle: 'Instrucciones',
+ completionSubTitle: 'Prefijo de la Indicación',
+ promptTip: 'Las indicaciones guían las respuestas de la IA con instrucciones y restricciones. Inserta variables como {{input}}. Esta indicación no será visible para los usuarios.',
+ formattingChangedTitle: 'Formato cambiado',
+ formattingChangedText: 'Modificar el formato restablecerá el área de depuración, ¿estás seguro?',
+ variableTitle: 'Variables',
+ variableTip: 'Los usuarios completan las variables en un formulario, reemplazando automáticamente las variables en la indicación.',
+ notSetVar: 'Las variables permiten a los usuarios introducir palabras de indicación u observaciones de apertura al completar formularios. Puedes intentar ingresar "{{input}}" en las palabras de indicación.',
+ autoAddVar: 'Variables no definidas referenciadas en la pre-indicación, ¿quieres agregarlas en el formulario de entrada del usuario?',
+ variableTable: {
+ key: 'Clave de Variable',
+ name: 'Nombre del Campo de Entrada del Usuario',
+ optional: 'Opcional',
+ type: 'Tipo de Entrada',
+ action: 'Acciones',
+ typeString: 'Cadena',
+ typeSelect: 'Seleccionar',
+ },
+ varKeyError: {
+ canNoBeEmpty: 'La clave de la variable no puede estar vacía',
+ tooLong: 'Clave de la variable: {{key}} demasiado larga. No puede tener más de 30 caracteres',
+ notValid: 'Clave de la variable: {{key}} no es válida. Solo puede contener letras, números y guiones bajos',
+ notStartWithNumber: 'Clave de la variable: {{key}} no puede comenzar con un número',
+ keyAlreadyExists: 'Clave de la variable: {{key}} ya existe',
+ },
+ otherError: {
+ promptNoBeEmpty: 'La indicación no puede estar vacía',
+ historyNoBeEmpty: 'El historial de conversaciones debe establecerse en la indicación',
+ queryNoBeEmpty: 'La consulta debe establecerse en la indicación',
+ },
+ variableConig: {
+ 'addModalTitle': 'Agregar Campo de Entrada',
+ 'editModalTitle': 'Editar Campo de Entrada',
+ 'description': 'Configuración para la variable {{varName}}',
+ 'fieldType': 'Tipo de campo',
+ 'string': 'Texto corto',
+ 'text-input': 'Texto corto',
+ 'paragraph': 'Párrafo',
+ 'select': 'Seleccionar',
+ 'number': 'Número',
+ 'notSet': 'No configurado, intenta escribir {{input}} en la indicación de prefijo',
+ 'stringTitle': 'Opciones de cuadro de texto de formulario',
+ 'maxLength': 'Longitud máxima',
+ 'options': 'Opciones',
+ 'addOption': 'Agregar opción',
+ 'apiBasedVar': 'Variable basada en API',
+ 'varName': 'Nombre de la Variable',
+ 'labelName': 'Nombre de la Etiqueta',
+ 'inputPlaceholder': 'Por favor ingresa',
+ 'content': 'Contenido',
+ 'required': 'Requerido',
+ 'errorMsg': {
+ varNameRequired: 'Nombre de la variable es requerido',
+ labelNameRequired: 'Nombre de la etiqueta es requerido',
+ varNameCanBeRepeat: 'El nombre de la variable no puede repetirse',
+ atLeastOneOption: 'Se requiere al menos una opción',
+ optionRepeat: 'Hay opciones repetidas',
+ },
+ },
+ vision: {
+ name: 'Visión',
+ description: 'Habilitar Visión permitirá al modelo recibir imágenes y responder preguntas sobre ellas.',
+ settings: 'Configuraciones',
+ visionSettings: {
+ title: 'Configuraciones de Visión',
+ resolution: 'Resolución',
+ resolutionTooltip: `Baja resolución permitirá que el modelo reciba una versión de baja resolución de 512 x 512 de la imagen, y represente la imagen con un presupuesto de 65 tokens. Esto permite que la API devuelva respuestas más rápidas y consuma menos tokens de entrada para casos de uso que no requieren alta detalle.
+ \n
+ Alta resolución permitirá primero que el modelo vea la imagen de baja resolución y luego crea recortes detallados de las imágenes de entrada como cuadrados de 512px basados en el tamaño de la imagen de entrada. Cada uno de los recortes detallados usa el doble del presupuesto de tokens para un total de 129 tokens.`,
+ high: 'Alta',
+ low: 'Baja',
+ uploadMethod: 'Método de carga',
+ both: 'Ambos',
+ localUpload: 'Carga Local',
+ url: 'URL',
+ uploadLimit: 'Límite de carga',
+ },
+ },
+ voice: {
+ name: 'Voz',
+ defaultDisplay: 'Voz Predeterminada',
+ description: 'Configuraciones de voz a texto',
+ settings: 'Configuraciones',
+ voiceSettings: {
+ title: 'Configuraciones de Voz',
+ language: 'Idioma',
+ resolutionTooltip: 'Soporte de idioma para voz a texto.',
+ voice: 'Voz',
+ },
+ },
+ openingStatement: {
+ title: 'Apertura de Conversación',
+ add: 'Agregar',
+ writeOpener: 'Escribir apertura',
+ placeholder: 'Escribe tu mensaje de apertura aquí, puedes usar variables, intenta escribir {{variable}}.',
+ openingQuestion: 'Preguntas de Apertura',
+ noDataPlaceHolder: 'Iniciar la conversación con el usuario puede ayudar a la IA a establecer una conexión más cercana con ellos en aplicaciones de conversación.',
+ varTip: 'Puedes usar variables, intenta escribir {{variable}}',
+ tooShort: 'Se requieren al menos 20 palabras en la indicación inicial para generar una apertura de conversación.',
+ notIncludeKey: 'La indicación inicial no incluye la variable: {{key}}. Por favor agrégala a la indicación inicial.',
+ },
+ modelConfig: {
+ model: 'Modelo',
+ setTone: 'Establecer tono de respuestas',
+ title: 'Modelo y Parámetros',
+ modeType: {
+ chat: 'Chat',
+ completion: 'Completar',
+ },
+ },
+ inputs: {
+ title: 'Depurar y Previsualizar',
+ noPrompt: 'Intenta escribir alguna indicación en la entrada de pre-indicación',
+ userInputField: 'Campo de Entrada del Usuario',
+ noVar: 'Completa el valor de la variable, que se reemplazará automáticamente en la palabra de indicación cada vez que se inicie una nueva sesión.',
+ chatVarTip: 'Completa el valor de la variable, que se reemplazará automáticamente en la palabra de indicación cada vez que se inicie una nueva sesión',
+ completionVarTip: 'Completa el valor de la variable, que se reemplazará automáticamente en las palabras de indicación cada vez que se envíe una pregunta.',
+ previewTitle: 'Vista previa de la indicación',
+ queryTitle: 'Contenido de la consulta',
+ queryPlaceholder: 'Por favor ingresa el texto de la solicitud.',
+ run: 'EJECUTAR',
+ },
+ result: 'Texto de salida',
+ datasetConfig: {
+ settingTitle: 'Configuraciones de Recuperación',
+ knowledgeTip: 'Haz clic en el botón “+” para agregar conocimiento',
+ retrieveOneWay: {
+ title: 'Recuperación N-a-1',
+ description: 'Basado en la intención del usuario y las descripciones de Conocimiento, el Agente selecciona autónomamente el mejor Conocimiento para consultar. Ideal para aplicaciones con Conocimiento limitado y distintivo.',
+ },
+ retrieveMultiWay: {
+ title: 'Recuperación Multi-camino',
+ description: 'Basado en la intención del usuario, consulta a través de todo el Conocimiento, recupera texto relevante de múltiples fuentes y selecciona los mejores resultados que coinciden con la consulta del usuario después de reordenar. Se requiere configuración de la API del modelo de Reordenar.',
+ },
+ rerankModelRequired: 'Se requiere modelo de Reordenar',
+ params: 'Parámetros',
+ top_k: 'Top K',
+ top_kTip: 'Usado para filtrar fragmentos que son más similares a las preguntas del usuario. El sistema también ajustará dinámicamente el valor de Top K, de acuerdo con los max_tokens del modelo seleccionado.',
+ score_threshold: 'Umbral de Puntuación',
+ score_thresholdTip: 'Usado para establecer el umbral de similitud para la filtración de fragmentos.',
+ retrieveChangeTip: 'Modificar el modo de índice y el modo de recuperación puede afectar las aplicaciones asociadas con este Conocimiento.',
+ },
+ debugAsSingleModel: 'Depurar como Modelo Único',
+ debugAsMultipleModel: 'Depurar como Múltiples Modelos',
+ duplicateModel: 'Duplicar',
+ publishAs: 'Publicar como',
+ assistantType: {
+ name: 'Tipo de Asistente',
+ chatAssistant: {
+ name: 'Asistente Básico',
+ description: 'Construye un asistente basado en chat usando un Modelo de Lenguaje Grande',
+ },
+ agentAssistant: {
+ name: 'Asistente Agente',
+ description: 'Construye un Agente inteligente que puede elegir herramientas autónomamente para completar tareas',
+ },
+ },
+ agent: {
+ agentMode: 'Modo Agente',
+ agentModeDes: 'Establecer el tipo de modo de inferencia para el agente',
+ agentModeType: {
+ ReACT: 'ReAct',
+ functionCall: 'Llamada de Función',
+ },
+ setting: {
+ name: 'Configuraciones del Agente',
+ description: 'Las configuraciones del Asistente Agente permiten establecer el modo del agente y funciones avanzadas como indicaciones integradas, disponibles solo en el tipo Agente.',
+ maximumIterations: {
+ name: 'Iteraciones Máximas',
+ description: 'Limitar el número de iteraciones que un asistente agente puede ejecutar',
+ },
+ },
+ buildInPrompt: 'Indicación Integrada',
+ firstPrompt: 'Primera Indicación',
+ nextIteration: 'Próxima Iteración',
+ promptPlaceholder: 'Escribe tu indicación aquí',
+ tools: {
+ name: 'Herramientas',
+ description: 'El uso de herramientas puede extender las capacidades del LLM, como buscar en internet o realizar cálculos científicos',
+ enabled: 'Habilitado',
+ },
+ },
+}
+
+export default translation
diff --git a/web/i18n/es-ES/app-log.ts b/web/i18n/es-ES/app-log.ts
new file mode 100644
index 00000000000000..2a6c9f57dacf5a
--- /dev/null
+++ b/web/i18n/es-ES/app-log.ts
@@ -0,0 +1,91 @@
+const translation = {
+ title: 'Registros',
+ description: 'Los registros registran el estado de ejecución de la aplicación, incluyendo las entradas de usuario y las respuestas de la IA.',
+ dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+ table: {
+ header: {
+ time: 'Tiempo',
+ endUser: 'Usuario Final',
+ input: 'Entrada',
+ output: 'Salida',
+ summary: 'Título',
+ messageCount: 'Cantidad de Mensajes',
+ userRate: 'Tasa de Usuario',
+ adminRate: 'Tasa de Op.',
+ startTime: 'HORA DE INICIO',
+ status: 'ESTADO',
+ runtime: 'TIEMPO DE EJECUCIÓN',
+ tokens: 'TOKENS',
+ user: 'USUARIO FINAL',
+ version: 'VERSIÓN',
+ },
+ pagination: {
+ previous: 'Anterior',
+ next: 'Siguiente',
+ },
+ empty: {
+ noChat: 'Aún no hay conversación',
+ noOutput: 'Sin salida',
+ element: {
+ title: '¿Hay alguien ahí?',
+ content: 'Observa y anota las interacciones entre los usuarios finales y las aplicaciones de IA aquí para mejorar continuamente la precisión de la IA. Puedes probar compartiendo o probando la aplicación web tú mismo, y luego regresar a esta página.',
+ },
+ },
+ },
+ detail: {
+ time: 'Tiempo',
+ conversationId: 'ID de Conversación',
+ promptTemplate: 'Plantilla de Indicación',
+ promptTemplateBeforeChat: 'Plantilla de Indicación Antes de la Conversación · Como Mensaje del Sistema',
+ annotationTip: 'Mejoras Marcadas por {{user}}',
+ timeConsuming: '',
+ second: 's',
+ tokenCost: 'Tokens gastados',
+ loading: 'cargando',
+ operation: {
+ like: 'me gusta',
+ dislike: 'no me gusta',
+ addAnnotation: 'Agregar Mejora',
+ editAnnotation: 'Editar Mejora',
+ annotationPlaceholder: 'Ingresa la respuesta esperada que deseas que la IA responda, lo cual se puede utilizar para el ajuste del modelo y la mejora continua de la calidad de generación de texto en el futuro.',
+ },
+ variables: 'Variables',
+ uploadImages: 'Imágenes Cargadas',
+ },
+ filter: {
+ period: {
+ today: 'Hoy',
+ last7days: 'Últimos 7 Días',
+ last4weeks: 'Últimas 4 semanas',
+ last3months: 'Últimos 3 meses',
+ last12months: 'Últimos 12 meses',
+ monthToDate: 'Mes hasta la fecha',
+ quarterToDate: 'Trimestre hasta la fecha',
+ yearToDate: 'Año hasta la fecha',
+ allTime: 'Todo el tiempo',
+ },
+ annotation: {
+ all: 'Todos',
+ annotated: 'Mejoras Anotadas ({{count}} elementos)',
+ not_annotated: 'No Anotadas',
+ },
+ },
+ workflowTitle: 'Registros de Flujo de Trabajo',
+ workflowSubtitle: 'El registro registró la operación de Automate.',
+ runDetail: {
+ title: 'Registro de Conversación',
+ workflowTitle: 'Detalle del Registro',
+ },
+ promptLog: 'Registro de Indicación',
+ agentLog: 'Registro de Agente',
+ viewLog: 'Ver Registro',
+ agentLogDetail: {
+ agentMode: 'Modo de Agente',
+ toolUsed: 'Herramienta Utilizada',
+ iterations: 'Iteraciones',
+ iteration: 'Iteración',
+ finalProcessing: 'Procesamiento Final',
+ },
+}
+
+export default translation
diff --git a/web/i18n/es-ES/app-overview.ts b/web/i18n/es-ES/app-overview.ts
new file mode 100644
index 00000000000000..f3aaf1f737ce04
--- /dev/null
+++ b/web/i18n/es-ES/app-overview.ts
@@ -0,0 +1,156 @@
+const translation = {
+ welcome: {
+ firstStepTip: 'Para comenzar,',
+ enterKeyTip: 'ingresa tu clave de API de OpenAI a continuación',
+ getKeyTip: 'Obtén tu clave de API desde el panel de control de OpenAI',
+ placeholder: 'Tu clave de API de OpenAI (ej. sk-xxxx)',
+ },
+ apiKeyInfo: {
+ cloud: {
+ trial: {
+ title: 'Estás utilizando la cuota de prueba de {{providerName}}.',
+ description: 'La cuota de prueba se proporciona para su uso de prueba. Antes de que se agoten las llamadas de la cuota de prueba, configure su propio proveedor de modelos o compre cuota adicional.',
+ },
+ exhausted: {
+ title: 'Tu cuota de prueba se ha agotado, por favor configura tu APIKey.',
+ description: 'Tu cuota de prueba se ha agotado. Por favor, configure su propio proveedor de modelos o compre cuota adicional.',
+ },
+ },
+ selfHost: {
+ title: {
+ row1: 'Para comenzar,',
+ row2: 'configura primero tu proveedor de modelos.',
+ },
+ },
+ callTimes: 'Veces llamadas',
+ usedToken: 'Token utilizados',
+ setAPIBtn: 'Ir a configurar proveedor de modelos',
+ tryCloud: 'O prueba la versión en la nube de Dify con una cotización gratuita',
+ },
+ overview: {
+ title: 'Resumen',
+ appInfo: {
+ explanation: 'Aplicación web de IA lista para usar',
+ accessibleAddress: 'URL pública',
+ preview: 'Vista previa',
+ regenerate: 'Regenerar',
+ regenerateNotice: '¿Deseas regenerar la URL pública?',
+ preUseReminder: 'Por favor, habilita la aplicación web antes de continuar.',
+ settings: {
+ entry: 'Configuración',
+ title: 'Configuración de la aplicación web',
+ webName: 'Nombre de la aplicación web',
+ webDesc: 'Descripción de la aplicación web',
+ webDescTip: 'Este texto se mostrará en el lado del cliente, proporcionando una guía básica sobre cómo usar la aplicación',
+ webDescPlaceholder: 'Ingresa la descripción de la aplicación web',
+ language: 'Idioma',
+ workflow: {
+ title: 'Pasos del flujo de trabajo',
+ show: 'Mostrar',
+ hide: 'Ocultar',
+ },
+ chatColorTheme: 'Tema de color del chat',
+ chatColorThemeDesc: 'Establece el tema de color del chatbot',
+ chatColorThemeInverted: 'Invertido',
+ invalidHexMessage: 'Valor hexadecimal no válido',
+ more: {
+ entry: 'Mostrar más configuraciones',
+ copyright: 'Derechos de autor',
+ copyRightPlaceholder: 'Ingresa el nombre del autor o la organización',
+ privacyPolicy: 'Política de privacidad',
+ privacyPolicyPlaceholder: 'Ingresa el enlace de la política de privacidad',
+ privacyPolicyTip: 'Ayuda a los visitantes a comprender los datos que recopila la aplicación, consulta la Política de privacidad de Dify.',
+ customDisclaimer: 'Descargo de responsabilidad personalizado',
+ customDisclaimerPlaceholder: 'Ingresa el texto de descargo de responsabilidad personalizado',
+ customDisclaimerTip: 'El texto de descargo de responsabilidad personalizado se mostrará en el lado del cliente, proporcionando información adicional sobre la aplicación',
+ },
+ },
+ embedded: {
+ entry: 'Incrustado',
+ title: 'Incrustar en el sitio web',
+ explanation: 'Elige la forma de incrustar la aplicación de chat en tu sitio web',
+ iframe: 'Para agregar la aplicación de chat en cualquier lugar de tu sitio web, agrega este iframe a tu código HTML.',
+ scripts: 'Para agregar una aplicación de chat en la esquina inferior derecha de tu sitio web, agrega este código a tu HTML.',
+ chromePlugin: 'Instalar la extensión de Chrome de Dify Chatbot',
+ copied: 'Copiado',
+ copy: 'Copiar',
+ },
+ qrcode: {
+ title: 'Código QR para compartir',
+ scan: 'Escanear para compartir la aplicación',
+ download: 'Descargar código QR',
+ },
+ customize: {
+ way: 'forma',
+ entry: 'Personalizar',
+ title: 'Personalizar la aplicación web de IA',
+ explanation: 'Puedes personalizar el frontend de la aplicación web para adaptarlo a tus necesidades y estilo.',
+ way1: {
+ name: 'Bifurca el código del cliente, modifícalo y despliégalo en Vercel (recomendado)',
+ step1: 'Bifurca el código del cliente y modifícalo',
+ step1Tip: 'Haz clic aquí para bifurcar el código fuente en tu cuenta de GitHub y modificar el código',
+ step1Operation: 'Dify-WebClient',
+ step2: 'Despliégalo en Vercel',
+ step2Tip: 'Haz clic aquí para importar el repositorio en Vercel y desplegarlo',
+ step2Operation: 'Importar repositorio',
+ step3: 'Configura las variables de entorno',
+ step3Tip: 'Agrega las siguientes variables de entorno en Vercel',
+ },
+ way2: {
+ name: 'Escribe código del lado del cliente para llamar a la API y despliégalo en un servidor',
+ operation: 'Documentación',
+ },
+ },
+ },
+ apiInfo: {
+ title: 'API del servicio backend',
+ explanation: 'Fácilmente integrable en tu aplicación',
+ accessibleAddress: 'Punto de conexión de la API del servicio',
+ doc: 'Referencia de la API',
+ },
+ status: {
+ running: 'En servicio',
+ disable: 'Deshabilitar',
+ },
+ },
+ analysis: {
+ title: 'Análisis',
+ ms: 'ms',
+ tokenPS: 'Token/s',
+ totalMessages: {
+ title: 'Mensajes totales',
+ explanation: 'Recuento diario de interacciones de IA; excluye la ingeniería/depuración de prompts.',
+ },
+ activeUsers: {
+ title: 'Usuarios activos',
+ explanation: 'Usuarios únicos que interactúan en preguntas y respuestas con IA; excluye la ingeniería/depuración de prompts.',
+ },
+ tokenUsage: {
+ title: 'Uso de tokens',
+ explanation: 'Refleja el uso diario de tokens del modelo de lenguaje para la aplicación, útil para el control de costos.',
+ consumed: 'Consumidos',
+ },
+ avgSessionInteractions: {
+ title: 'Interacciones promedio por sesión',
+ explanation: 'Recuento continuo de comunicación usuario-IA; para aplicaciones basadas en conversaciones.',
+ },
+ avgUserInteractions: {
+ title: 'Interacciones promedio por usuario',
+ explanation: 'Refleja la frecuencia de uso diario de los usuarios. Esta métrica refleja la fidelidad del usuario.',
+ },
+ userSatisfactionRate: {
+ title: 'Tasa de satisfacción del usuario',
+ explanation: 'El número de likes por cada 1,000 mensajes. Esto indica la proporción de respuestas con las que los usuarios están muy satisfechos.',
+ },
+ avgResponseTime: {
+ title: 'Tiempo promedio de respuesta',
+ explanation: 'Tiempo (ms) que tarda la IA en procesar/responder; para aplicaciones basadas en texto.',
+ },
+ tps: {
+ title: 'Velocidad de salida de tokens',
+ explanation: 'Mide el rendimiento del LLM. Cuenta la velocidad de salida de tokens del LLM desde el inicio de la solicitud hasta la finalización de la salida.',
+ },
+ },
+}
+
+export default translation
diff --git a/web/i18n/es-ES/app.ts b/web/i18n/es-ES/app.ts
new file mode 100644
index 00000000000000..82359b40b0bd26
--- /dev/null
+++ b/web/i18n/es-ES/app.ts
@@ -0,0 +1,126 @@
+const translation = {
+ createApp: 'CREAR APP',
+ types: {
+ all: 'Todos',
+ chatbot: 'Chatbot',
+ agent: 'Agente',
+ workflow: 'Flujo de trabajo',
+ completion: 'Finalización',
+ },
+ duplicate: 'Duplicar',
+ duplicateTitle: 'Duplicar App',
+ export: 'Exportar DSL',
+ exportFailed: 'Error al exportar DSL.',
+ importDSL: 'Importar archivo DSL',
+ createFromConfigFile: 'Crear desde archivo DSL',
+ deleteAppConfirmTitle: '¿Eliminar esta app?',
+ deleteAppConfirmContent:
+ 'Eliminar la app es irreversible. Los usuarios ya no podrán acceder a tu app y todas las configuraciones y registros de prompts se eliminarán permanentemente.',
+ appDeleted: 'App eliminada',
+ appDeleteFailed: 'Error al eliminar app',
+ join: 'Únete a la comunidad',
+ communityIntro:
+ 'Discute con miembros del equipo, colaboradores y desarrolladores en diferentes canales.',
+ roadmap: 'Ver nuestro plan de desarrollo',
+ newApp: {
+ startFromBlank: 'Crear desde cero',
+ startFromTemplate: 'Crear desde plantilla',
+ captionAppType: '¿Qué tipo de app quieres crear?',
+ chatbotDescription: 'Crea una aplicación basada en chat. Esta app utiliza un formato de pregunta y respuesta, permitiendo múltiples rondas de conversación continua.',
+ completionDescription: 'Crea una aplicación que genera texto de alta calidad basado en prompts, como la generación de artículos, resúmenes, traducciones y más.',
+ completionWarning: 'Este tipo de app ya no será compatible.',
+ agentDescription: 'Crea un Agente inteligente que puede elegir herramientas de forma autónoma para completar tareas',
+ workflowDescription: 'Crea una aplicación que genera texto de alta calidad basado en flujos de trabajo con un alto grado de personalización. Es adecuado para usuarios experimentados.',
+ workflowWarning: 'Actualmente en beta',
+ chatbotType: 'Método de orquestación del Chatbot',
+ basic: 'Básico',
+ basicTip: 'Para principiantes, se puede cambiar a Chatflow más adelante',
+ basicFor: 'PARA PRINCIPIANTES',
+ basicDescription: 'La Orquestación Básica permite la orquestación de una app de Chatbot utilizando configuraciones simples, sin la capacidad de modificar los prompts incorporados. Es adecuado para principiantes.',
+ advanced: 'Chatflow',
+ advancedFor: 'Para usuarios avanzados',
+ advancedDescription: 'La Orquestación de Flujo de Trabajo orquesta Chatbots en forma de flujos de trabajo, ofreciendo un alto grado de personalización, incluida la capacidad de editar los prompts incorporados. Es adecuado para usuarios experimentados.',
+ captionName: 'Icono y nombre de la app',
+ appNamePlaceholder: 'Asigna un nombre a tu app',
+ captionDescription: 'Descripción',
+ appDescriptionPlaceholder: 'Ingresa la descripción de la app',
+ useTemplate: 'Usar esta plantilla',
+ previewDemo: 'Vista previa de demostración',
+ chatApp: 'Asistente',
+ chatAppIntro:
+ 'Quiero construir una aplicación basada en chat. Esta app utiliza un formato de pregunta y respuesta, permitiendo múltiples rondas de conversación continua.',
+ agentAssistant: 'Nuevo Asistente de Agente',
+ completeApp: 'Generador de Texto',
+ completeAppIntro:
+ 'Quiero crear una aplicación que genera texto de alta calidad basado en prompts, como la generación de artículos, resúmenes, traducciones y más.',
+ showTemplates: 'Quiero elegir una plantilla',
+ hideTemplates: 'Volver a la selección de modo',
+ Create: 'Crear',
+ Cancel: 'Cancelar',
+ nameNotEmpty: 'El nombre no puede estar vacío',
+ appTemplateNotSelected: 'Por favor, selecciona una plantilla',
+ appTypeRequired: 'Por favor, selecciona un tipo de app',
+ appCreated: 'App creada',
+ appCreateFailed: 'Error al crear app',
+ },
+ editApp: 'Editar información',
+ editAppTitle: 'Editar información de la app',
+ editDone: 'Información de la app actualizada',
+ editFailed: 'Error al actualizar información de la app',
+ emoji: {
+ ok: 'OK',
+ cancel: 'Cancelar',
+ },
+ switch: 'Cambiar a Orquestación de Flujo de Trabajo',
+ switchTipStart: 'Se creará una nueva copia de la app para ti y la nueva copia cambiará a Orquestación de Flujo de Trabajo. La nueva copia no permitirá',
+ switchTip: 'volver',
+ switchTipEnd: ' a la Orquestación Básica.',
+ switchLabel: 'La copia de la app a crear',
+ removeOriginal: 'Eliminar la app original',
+ switchStart: 'Iniciar cambio',
+ typeSelector: {
+ all: 'Todos los tipos',
+ chatbot: 'Chatbot',
+ agent: 'Agente',
+ workflow: 'Flujo de trabajo',
+ completion: 'Finalización',
+ },
+ tracing: {
+ title: 'Rastreo del rendimiento de la app',
+ description: 'Configuración de un proveedor de LLMOps de terceros y rastreo del rendimiento de la app.',
+ config: 'Configurar',
+ collapse: 'Contraer',
+ expand: 'Expandir',
+ tracing: 'Rastreo',
+ disabled: 'Deshabilitado',
+ disabledTip: 'Por favor, configura el proveedor primero',
+ enabled: 'En servicio',
+ tracingDescription: 'Captura el contexto completo de la ejecución de la app, incluyendo llamadas LLM, contexto, prompts, solicitudes HTTP y más, en una plataforma de rastreo de terceros.',
+ configProviderTitle: {
+ configured: 'Configurado',
+ notConfigured: 'Configurar proveedor para habilitar el rastreo',
+ moreProvider: 'Más proveedores',
+ },
+ langsmith: {
+ title: 'LangSmith',
+ description: 'Una plataforma de desarrollo todo en uno para cada paso del ciclo de vida de la aplicación impulsada por LLM.',
+ },
+ langfuse: {
+ title: 'Langfuse',
+ description: 'Rastrea, evalúa, gestiona prompts y métricas para depurar y mejorar tu aplicación LLM.',
+ },
+ inUse: 'En uso',
+ configProvider: {
+ title: 'Configurar ',
+ placeholder: 'Ingresa tu {{key}}',
+ project: 'Proyecto',
+ publicKey: 'Clave pública',
+ secretKey: 'Clave secreta',
+ viewDocsLink: 'Ver documentación de {{key}}',
+ removeConfirmTitle: '¿Eliminar la configuración de {{key}}?',
+ removeConfirmContent: 'La configuración actual está en uso, eliminarla desactivará la función de rastreo.',
+ },
+ },
+}
+
+export default translation
diff --git a/web/i18n/es-ES/billing.ts b/web/i18n/es-ES/billing.ts
new file mode 100644
index 00000000000000..8dcee420f5d912
--- /dev/null
+++ b/web/i18n/es-ES/billing.ts
@@ -0,0 +1,118 @@
+const translation = {
+ currentPlan: 'Plan Actual',
+ upgradeBtn: {
+ plain: 'Actualizar Plan',
+ encourage: 'Actualizar Ahora',
+ encourageShort: 'Actualizar',
+ },
+ viewBilling: 'Administrar facturación y suscripciones',
+ buyPermissionDeniedTip: 'Por favor, contacta al administrador de tu empresa para suscribirte',
+ plansCommon: {
+ title: 'Elige un plan que sea adecuado para ti',
+ yearlyTip: '¡Obtén 2 meses gratis al suscribirte anualmente!',
+ mostPopular: 'Más Popular',
+ planRange: {
+ monthly: 'Mensual',
+ yearly: 'Anual',
+ },
+ month: 'mes',
+ year: 'año',
+ save: 'Ahorra ',
+ free: 'Gratis',
+ currentPlan: 'Plan Actual',
+ contractSales: 'Contactar ventas',
+ contractOwner: 'Contactar al administrador del equipo',
+ startForFree: 'Empezar gratis',
+ getStartedWith: 'Empezar con ',
+ contactSales: 'Contactar Ventas',
+ talkToSales: 'Hablar con Ventas',
+ modelProviders: 'Proveedores de Modelos',
+ teamMembers: 'Miembros del Equipo',
+ annotationQuota: 'Cuota de Anotación',
+ buildApps: 'Crear Aplicaciones',
+ vectorSpace: 'Espacio Vectorial',
+ vectorSpaceBillingTooltip: 'Cada 1MB puede almacenar aproximadamente 1.2 millones de caracteres de datos vectorizados (estimado utilizando OpenAI Embeddings, varía según los modelos).',
+ vectorSpaceTooltip: 'El Espacio Vectorial es el sistema de memoria a largo plazo necesario para que los LLMs comprendan tus datos.',
+ documentsUploadQuota: 'Cuota de Carga de Documentos',
+ documentProcessingPriority: 'Prioridad de Procesamiento de Documentos',
+ documentProcessingPriorityTip: 'Para una mayor prioridad de procesamiento de documentos, por favor actualiza tu plan.',
+ documentProcessingPriorityUpgrade: 'Procesa más datos con mayor precisión y velocidad.',
+ priority: {
+ 'standard': 'Estándar',
+ 'priority': 'Prioridad',
+ 'top-priority': 'Prioridad Máxima',
+ },
+ logsHistory: 'Historial de Registros',
+ customTools: 'Herramientas Personalizadas',
+ unavailable: 'No disponible',
+ days: 'días',
+ unlimited: 'Ilimitado',
+ support: 'Soporte',
+ supportItems: {
+ communityForums: 'Foros Comunitarios',
+ emailSupport: 'Soporte por Correo Electrónico',
+ priorityEmail: 'Soporte Prioritario por Correo Electrónico y Chat',
+ logoChange: 'Cambio de Logotipo',
+ SSOAuthentication: 'Autenticación SSO',
+ personalizedSupport: 'Soporte Personalizado',
+ dedicatedAPISupport: 'Soporte API Dedicado',
+ customIntegration: 'Integración y Soporte Personalizado',
+ ragAPIRequest: 'Solicitudes API RAG',
+ bulkUpload: 'Carga Masiva de Documentos',
+ agentMode: 'Modo Agente',
+ workflow: 'Flujo de Trabajo',
+ llmLoadingBalancing: 'Balanceo de Carga LLM',
+ llmLoadingBalancingTooltip: 'Agrega múltiples claves API a los modelos, evitando efectivamente los límites de velocidad de API.',
+ },
+ comingSoon: 'Próximamente',
+ member: 'Miembro',
+ memberAfter: 'Miembro',
+ messageRequest: {
+ title: 'Créditos de Mensajes',
+ tooltip: 'Cuotas de invocación de mensajes para varios planes utilizando modelos de OpenAI (excepto gpt4). Los mensajes que excedan el límite utilizarán tu clave API de OpenAI.',
+ },
+ annotatedResponse: {
+ title: 'Límites de Cuota de Anotación',
+ tooltip: 'Edición manual y anotación de respuestas proporciona habilidades de respuesta a preguntas personalizadas y de alta calidad para aplicaciones (aplicable solo en aplicaciones de chat).',
+ },
+ ragAPIRequestTooltip: 'Se refiere al número de llamadas API que invocan solo las capacidades de procesamiento de base de conocimientos de Dify.',
+ receiptInfo: 'Solo el propietario del equipo y el administrador del equipo pueden suscribirse y ver la información de facturación.',
+ },
+ plans: {
+ sandbox: {
+ name: 'Sandbox',
+ description: 'Prueba gratuita de 200 veces GPT',
+ includesTitle: 'Incluye:',
+ },
+ professional: {
+ name: 'Profesional',
+ description: 'Para individuos y pequeños equipos que desean desbloquear más poder de manera asequible.',
+ includesTitle: 'Todo en el plan gratuito, más:',
+ },
+ team: {
+ name: 'Equipo',
+ description: 'Colabora sin límites y disfruta de un rendimiento de primera categoría.',
+ includesTitle: 'Todo en el plan Profesional, más:',
+ },
+ enterprise: {
+ name: 'Empresa',
+ description: 'Obtén capacidades completas y soporte para sistemas críticos a gran escala.',
+ includesTitle: 'Todo en el plan Equipo, más:',
+ },
+ },
+ vectorSpace: {
+ fullTip: 'El Espacio Vectorial está lleno.',
+ fullSolution: 'Actualiza tu plan para obtener más espacio.',
+ },
+ apps: {
+ fullTipLine1: 'Actualiza tu plan para',
+ fullTipLine2: 'crear más aplicaciones.',
+ },
+ annotatedResponse: {
+ fullTipLine1: 'Actualiza tu plan para',
+ fullTipLine2: 'anotar más conversaciones.',
+ quotaTitle: 'Cuota de Respuesta Anotada',
+ },
+}
+
+export default translation
diff --git a/web/i18n/es-ES/common.ts b/web/i18n/es-ES/common.ts
new file mode 100644
index 00000000000000..e60c5441a79b06
--- /dev/null
+++ b/web/i18n/es-ES/common.ts
@@ -0,0 +1,571 @@
+const translation = {
+ api: {
+ success: 'Éxito',
+ actionSuccess: 'Acción exitosa',
+ saved: 'Guardado',
+ create: 'Creado',
+ remove: 'Eliminado',
+ },
+ operation: {
+ create: 'Crear',
+ confirm: 'Confirmar',
+ cancel: 'Cancelar',
+ clear: 'Limpiar',
+ save: 'Guardar',
+ saveAndEnable: 'Guardar y habilitar',
+ edit: 'Editar',
+ add: 'Agregar',
+ added: 'Agregado',
+ refresh: 'Reiniciar',
+ reset: 'Restablecer',
+ search: 'Buscar',
+ change: 'Cambiar',
+ remove: 'Eliminar',
+ send: 'Enviar',
+ copy: 'Copiar',
+ lineBreak: 'Salto de línea',
+ sure: 'Estoy seguro',
+ download: 'Descargar',
+ delete: 'Eliminar',
+ settings: 'Configuraciones',
+ setup: 'Configurar',
+ getForFree: 'Obtener gratis',
+ reload: 'Recargar',
+ ok: 'OK',
+ log: 'Registro',
+ learnMore: 'Aprender más',
+ params: 'Parámetros',
+ duplicate: 'Duplicar',
+ rename: 'Renombrar',
+ },
+ errorMsg: {
+ fieldRequired: '{{field}} es requerido',
+ urlError: 'la URL debe comenzar con http:// o https://',
+ },
+ placeholder: {
+ input: 'Por favor ingresa',
+ select: 'Por favor selecciona',
+ },
+ voice: {
+ language: {
+ zhHans: 'Chino',
+ zhHant: 'Chino Tradicional',
+ enUS: 'Inglés',
+ deDE: 'Alemán',
+ frFR: 'Francés',
+ esES: 'Español',
+ itIT: 'Italiano',
+ thTH: 'Tailandés',
+ idID: 'Indonesio',
+ jaJP: 'Japonés',
+ koKR: 'Coreano',
+ ptBR: 'Portugués',
+ ruRU: 'Ruso',
+ ukUA: 'Ucraniano',
+ viVN: 'Vietnamita',
+ plPL: 'Polaco',
+ },
+ },
+ unit: {
+ char: 'caracteres',
+ },
+ actionMsg: {
+ noModification: 'No hay modificaciones en este momento.',
+ modifiedSuccessfully: 'Modificado exitosamente',
+ modifiedUnsuccessfully: 'Modificación no exitosa',
+ copySuccessfully: 'Copiado exitosamente',
+ paySucceeded: 'Pago exitoso',
+ payCancelled: 'Pago cancelado',
+ generatedSuccessfully: 'Generado exitosamente',
+ generatedUnsuccessfully: 'Generación no exitosa',
+ },
+ model: {
+ params: {
+ temperature: 'Temperatura',
+ temperatureTip:
+ 'Controla la aleatoriedad: Reducir resulta en completaciones menos aleatorias. A medida que la temperatura se acerca a cero, el modelo se vuelve determinista y repetitivo.',
+ top_p: 'Top P',
+ top_pTip:
+ 'Controla la diversidad mediante el muestreo de núcleo: 0.5 significa que se consideran la mitad de todas las opciones ponderadas por probabilidad.',
+ presence_penalty: 'Penalización por presencia',
+ presence_penaltyTip:
+ 'Cuánto penalizar los nuevos tokens según si aparecen en el texto hasta ahora.\nAumenta la probabilidad del modelo de hablar sobre nuevos temas.',
+ frequency_penalty: 'Penalización por frecuencia',
+ frequency_penaltyTip:
+ 'Cuánto penalizar los nuevos tokens según su frecuencia existente en el texto hasta ahora.\nDisminuye la probabilidad del modelo de repetir la misma línea literalmente.',
+ max_tokens: 'Tokens máximos',
+ max_tokensTip:
+ 'Se usa para limitar la longitud máxima de la respuesta, en tokens. \nValores más grandes pueden limitar el espacio disponible para palabras de indicación, registros de chat y Conocimiento. \nSe recomienda configurarlo por debajo de dos tercios\ngpt-4-1106-preview, gpt-4-vision-preview tokens máximos (entrada 128k salida 4k)',
+ maxTokenSettingTip: 'Tu configuración de tokens máximos es alta, lo que puede limitar el espacio para indicaciones, consultas y datos. Considera configurarlo por debajo de 2/3.',
+ setToCurrentModelMaxTokenTip: 'Tokens máximos actualizados al 80% del máximo de tokens del modelo actual {{maxToken}}.',
+ stop_sequences: 'Secuencias de parada',
+ stop_sequencesTip: 'Hasta cuatro secuencias donde la API dejará de generar más tokens. El texto devuelto no contendrá la secuencia de parada.',
+ stop_sequencesPlaceholder: 'Ingresa la secuencia y presiona Tab',
+ },
+ tone: {
+ Creative: 'Creativo',
+ Balanced: 'Equilibrado',
+ Precise: 'Preciso',
+ Custom: 'Personalizado',
+ },
+ addMoreModel: 'Ir a configuraciones para agregar más modelos',
+ },
+ menus: {
+ status: 'beta',
+ explore: 'Explorar',
+ apps: 'Estudio',
+ plugins: 'Plugins',
+ pluginsTips: 'Integrar plugins de terceros o crear Plugins AI compatibles con ChatGPT.',
+ datasets: 'Conocimiento',
+ datasetsTips: 'PRÓXIMAMENTE: Importa tus propios datos de texto o escribe datos en tiempo real a través de Webhook para la mejora del contexto LLM.',
+ newApp: 'Nueva App',
+ newDataset: 'Crear Conocimiento',
+ tools: 'Herramientas',
+ },
+ userProfile: {
+ settings: 'Configuraciones',
+ workspace: 'Espacio de trabajo',
+ createWorkspace: 'Crear espacio de trabajo',
+ helpCenter: 'Ayuda',
+ roadmapAndFeedback: 'Comentarios',
+ community: 'Comunidad',
+ about: 'Acerca de',
+ logout: 'Cerrar sesión',
+ },
+ settings: {
+ accountGroup: 'CUENTA',
+ workplaceGroup: 'ESPACIO DE TRABAJO',
+ account: 'Mi cuenta',
+ members: 'Miembros',
+ billing: 'Facturación',
+ integrations: 'Integraciones',
+ language: 'Idioma',
+ provider: 'Proveedor de Modelo',
+ dataSource: 'Fuente de Datos',
+ plugin: 'Plugins',
+ apiBasedExtension: 'Extensión basada en API',
+ },
+ account: {
+ avatar: 'Avatar',
+ name: 'Nombre',
+ email: 'Correo electrónico',
+ password: 'Contraseña',
+ passwordTip: 'Puedes establecer una contraseña permanente si no deseas usar códigos de inicio de sesión temporales',
+ setPassword: 'Establecer una contraseña',
+ resetPassword: 'Restablecer contraseña',
+ currentPassword: 'Contraseña actual',
+ newPassword: 'Nueva contraseña',
+ confirmPassword: 'Confirmar contraseña',
+ notEqual: 'Las dos contraseñas son diferentes.',
+ langGeniusAccount: 'Cuenta Dify',
+ langGeniusAccountTip: 'Tu cuenta Dify y los datos de usuario asociados.',
+ editName: 'Editar Nombre',
+ showAppLength: 'Mostrar {{length}} apps',
+ delete: 'Eliminar cuenta',
+ deleteTip: 'Eliminar tu cuenta borrará permanentemente todos tus datos y no se podrán recuperar.',
+ deleteConfirmTip: 'Para confirmar, por favor envía lo siguiente desde tu correo electrónico registrado a ',
+ },
+ members: {
+ team: 'Equipo',
+ invite: 'Agregar',
+ name: 'NOMBRE',
+ lastActive: 'ÚLTIMA ACTIVIDAD',
+ role: 'ROLES',
+ pending: 'Pendiente...',
+ owner: 'Propietario',
+ admin: 'Administrador',
+ adminTip: 'Puede crear aplicaciones y administrar configuraciones del equipo',
+ normal: 'Normal',
+ normalTip: 'Solo puede usar aplicaciones, no puede crear aplicaciones',
+ builder: 'Constructor',
+ builderTip: 'Puede crear y editar sus propias aplicaciones',
+ editor: 'Editor',
+ editorTip: 'Puede crear y editar aplicaciones',
+ datasetOperator: 'Administrador de Conocimiento',
+ datasetOperatorTip: 'Solo puede administrar la base de conocimiento',
+ inviteTeamMember: 'Agregar miembro del equipo',
+ inviteTeamMemberTip: 'Pueden acceder a tus datos del equipo directamente después de iniciar sesión.',
+ email: 'Correo electrónico',
+ emailInvalid: 'Formato de correo electrónico inválido',
+ emailPlaceholder: 'Por favor ingresa correos electrónicos',
+ sendInvite: 'Enviar invitación',
+ invitedAsRole: 'Invitado como usuario {{role}}',
+ invitationSent: 'Invitación enviada',
+ invitationSentTip: 'Invitación enviada, y pueden iniciar sesión en Dify para acceder a tus datos del equipo.',
+ invitationLink: 'Enlace de invitación',
+ failedinvitationEmails: 'Los siguientes usuarios no fueron invitados exitosamente',
+ ok: 'OK',
+ removeFromTeam: 'Eliminar del equipo',
+ removeFromTeamTip: 'Se eliminará el acceso al equipo',
+ setAdmin: 'Establecer como administrador',
+ setMember: 'Establecer como miembro ordinario',
+ setBuilder: 'Establecer como constructor',
+ setEditor: 'Establecer como editor',
+ disinvite: 'Cancelar la invitación',
+ deleteMember: 'Eliminar miembro',
+ you: '(Tú)',
+ },
+ integrations: {
+ connected: 'Conectado',
+ google: 'Google',
+ googleAccount: 'Iniciar sesión con cuenta de Google',
+ github: 'GitHub',
+ githubAccount: 'Iniciar sesión con cuenta de GitHub',
+ connect: 'Conectar',
+ },
+ language: {
+ displayLanguage: 'Idioma de visualización',
+ timezone: 'Zona horaria',
+ },
+ provider: {
+ apiKey: 'Clave API',
+ enterYourKey: 'Ingresa tu clave API aquí',
+ invalidKey: 'Clave API de OpenAI inválida',
+ validatedError: 'Validación fallida: ',
+ validating: 'Validando clave...',
+ saveFailed: 'Error al guardar la clave API',
+ apiKeyExceedBill: 'Esta CLAVE API no tiene cuota disponible, por favor lee',
+ addKey: 'Agregar Clave',
+ comingSoon: 'Próximamente',
+ editKey: 'Editar',
+ invalidApiKey: 'Clave API inválida',
+ azure: {
+ apiBase: 'Base API',
+ apiBasePlaceholder: 'La URL base de la API de tu Endpoint de Azure OpenAI.',
+ apiKey: 'Clave API',
+ apiKeyPlaceholder: 'Ingresa tu clave API aquí',
+ helpTip: 'Aprender sobre el Servicio Azure OpenAI',
+ },
+ openaiHosted: {
+ openaiHosted: 'OpenAI Hospedado',
+ onTrial: 'EN PRUEBA',
+ exhausted: 'CUOTA AGOTADA',
+ desc: 'El servicio de hospedaje OpenAI proporcionado por Dify te permite usar modelos como GPT-3.5. Antes de que se agote tu cuota de prueba, necesitas configurar otros proveedores de modelos.',
+ callTimes: 'Tiempos de llamada',
+ usedUp: 'Cuota de prueba agotada. Agrega tu propio proveedor de modelos.',
+ useYourModel: 'Actualmente usando tu propio proveedor de modelos.',
+ close: 'Cerrar',
+ },
+ anthropicHosted: {
+ anthropicHosted: 'Claude de Anthropíc',
+ onTrial: 'EN PRUEBA',
+ exhausted: 'CUOTA AGOTADA',
+ desc: 'Modelo poderoso, que se destaca en una amplia gama de tareas, desde diálogos sofisticados y generación de contenido creativo hasta instrucciones detalladas.',
+ callTimes: 'Tiempos de llamada',
+ usedUp: 'Cuota de prueba agotada. Agrega tu propio proveedor de modelos.',
+ useYourModel: 'Actualmente usando tu propio proveedor de modelos.',
+ close: 'Cerrar',
+ },
+ anthropic: {
+ using: 'La capacidad de incrustación está usando',
+ enableTip: 'Para habilitar el modelo de Anthropíc, primero necesitas vincularte al Servicio OpenAI o Azure OpenAI.',
+ notEnabled: 'No habilitado',
+ keyFrom: 'Obtén tu clave API de Anthropíc',
+ },
+ encrypted: {
+ front: 'Tu CLAVE API será encriptada y almacenada usando',
+ back: ' tecnología.',
+ },
+ },
+ modelProvider: {
+ notConfigured: 'El modelo del sistema aún no ha sido completamente configurado, y algunas funciones pueden no estar disponibles.',
+ systemModelSettings: 'Configuraciones del Modelo del Sistema',
+ systemModelSettingsLink: '¿Por qué es necesario configurar un modelo del sistema?',
+ selectModel: 'Selecciona tu modelo',
+ setupModelFirst: 'Por favor configura tu modelo primero',
+ systemReasoningModel: {
+ key: 'Modelo de Razonamiento del Sistema',
+ tip: 'Establece el modelo de inferencia predeterminado para ser usado en la creación de aplicaciones, así como características como la generación de nombres de diálogo y sugerencias de la próxima pregunta también usarán el modelo de inferencia predeterminado.',
+ },
+ embeddingModel: {
+ key: 'Modelo de Incrustación',
+ tip: 'Establece el modelo predeterminado para el procesamiento de incrustación de documentos del Conocimiento, tanto la recuperación como la importación del Conocimiento utilizan este modelo de Incrustación para el procesamiento de vectorización. Cambiarlo causará que la dimensión del vector entre el Conocimiento importado y la pregunta sea inconsistente, resultando en fallos en la recuperación. Para evitar fallos en la recuperación, por favor no cambies este modelo a voluntad.',
+ required: 'El Modelo de Incrustación es requerido',
+ },
+ speechToTextModel: {
+ key: 'Modelo de Voz a Texto',
+ tip: 'Establece el modelo predeterminado para la entrada de voz a texto en la conversación.',
+ },
+ ttsModel: {
+ key: 'Modelo de Texto a Voz',
+ tip: 'Establece el modelo predeterminado para la entrada de texto a voz en la conversación.',
+ },
+ rerankModel: {
+ key: 'Modelo de Reordenar',
+ tip: 'El modelo de reordenar reordenará la lista de documentos candidatos basada en la coincidencia semántica con la consulta del usuario, mejorando los resultados de clasificación semántica',
+ },
+ apiKey: 'CLAVE API',
+ quota: 'Cuota',
+ searchModel: 'Modelo de búsqueda',
+ noModelFound: 'No se encontró modelo para {{model}}',
+ models: 'Modelos',
+ showMoreModelProvider: 'Mostrar más proveedores de modelos',
+ selector: {
+ tip: 'Este modelo ha sido eliminado. Por favor agrega un modelo o selecciona otro modelo.',
+ emptyTip: 'No hay modelos disponibles',
+ emptySetting: 'Por favor ve a configuraciones para configurar',
+ rerankTip: 'Por favor configura el modelo de Reordenar',
+ },
+ card: {
+ quota: 'CUOTA',
+ onTrial: 'En prueba',
+ paid: 'Pagado',
+ quotaExhausted: 'Cuota agotada',
+ callTimes: 'Tiempos de llamada',
+ tokens: 'Tokens',
+ buyQuota: 'Comprar Cuota',
+ priorityUse: 'Uso prioritario',
+ removeKey: 'Eliminar CLAVE API',
+ tip: 'Se dará prioridad al uso de la cuota pagada. La cuota de prueba se utilizará después de que se agote la cuota pagada.',
+ },
+ item: {
+ deleteDesc: '{{modelName}} se está utilizando como modelo de razonamiento del sistema. Algunas funciones no estarán disponibles después de la eliminación. Por favor confirma.',
+ freeQuota: 'CUOTA GRATUITA',
+ },
+ addApiKey: 'Agrega tu CLAVE API',
+ invalidApiKey: 'Clave API inválida',
+ encrypted: {
+ front: 'Tu CLAVE API será encriptada y almacenada usando',
+ back: ' tecnología.',
+ },
+ freeQuota: {
+ howToEarn: 'Cómo ganar',
+ },
+ addMoreModelProvider: 'AGREGAR MÁS PROVEEDORES DE MODELOS',
+ addModel: 'Agregar Modelo',
+ modelsNum: '{{num}} Modelos',
+ showModels: 'Mostrar Modelos',
+ showModelsNum: 'Mostrar {{num}} Modelos',
+ collapse: 'Colapsar',
+ config: 'Configurar',
+ modelAndParameters: 'Modelo y Parámetros',
+ model: 'Modelo',
+ featureSupported: '{{feature}} soportado',
+ callTimes: 'Tiempos de llamada',
+ credits: 'Créditos de Mensaje',
+ buyQuota: 'Comprar Cuota',
+ getFreeTokens: 'Obtener Tokens gratis',
+ priorityUsing: 'Uso prioritario',
+ deprecated: 'Desaprobado',
+ confirmDelete: '¿Confirmar eliminación?',
+ quotaTip: 'Tokens gratuitos restantes disponibles',
+ loadPresets: 'Cargar Presets',
+ parameters: 'PARÁMETROS',
+ loadBalancing: 'Balanceo de carga',
+ loadBalancingDescription: 'Reduce la presión con múltiples conjuntos de credenciales.',
+ loadBalancingHeadline: 'Balanceo de Carga',
+ configLoadBalancing: 'Configurar Balanceo de Carga',
+ modelHasBeenDeprecated: 'Este modelo ha sido desaprobado',
+ providerManaged: 'Gestionado por el proveedor',
+ providerManagedDescription: 'Usa el único conjunto de credenciales proporcionado por el proveedor del modelo.',
+ defaultConfig: 'Configuración Predeterminada',
+ apiKeyStatusNormal: 'El estado de la CLAVE API es normal',
+ apiKeyRateLimit: 'Se alcanzó el límite de velocidad, disponible después de {{seconds}}s',
+ addConfig: 'Agregar Configuración',
+ editConfig: 'Editar Configuración',
+ loadBalancingLeastKeyWarning: 'Para habilitar el balanceo de carga se deben habilitar al menos 2 claves.',
+ loadBalancingInfo: 'Por defecto, el balanceo de carga usa la estrategia Round-robin. Si se activa el límite de velocidad, se aplicará un período de enfriamiento de 1 minuto.',
+ upgradeForLoadBalancing: 'Actualiza tu plan para habilitar el Balanceo de Carga.',
+ },
+ dataSource: {
+ add: 'Agregar una fuente de datos',
+ connect: 'Conectar',
+ configure: 'Configurar',
+ notion: {
+ title: 'Notion',
+ description: 'Usando Notion como fuente de datos para el Conocimiento.',
+ connectedWorkspace: 'Espacio de trabajo conectado',
+ addWorkspace: 'Agregar espacio de trabajo',
+ connected: 'Conectado',
+ disconnected: 'Desconectado',
+ changeAuthorizedPages: 'Cambiar páginas autorizadas',
+ pagesAuthorized: 'Páginas autorizadas',
+ sync: 'Sincronizar',
+ remove: 'Eliminar',
+ selector: {
+ pageSelected: 'Páginas seleccionadas',
+ searchPages: 'Buscar páginas...',
+ noSearchResult: 'No hay resultados de búsqueda',
+ addPages: 'Agregar páginas',
+ preview: 'VISTA PREVIA',
+ },
+ },
+ website: {
+ title: 'Sitio web',
+ description: 'Importar contenido de sitios web usando un rastreador web.',
+ with: 'Con',
+ configuredCrawlers: 'Rastreadores configurados',
+ active: 'Activo',
+ inactive: 'Inactivo',
+ },
+ },
+ plugin: {
+ serpapi: {
+ apiKey: 'Clave API',
+ apiKeyPlaceholder: 'Ingresa tu clave API',
+ keyFrom: 'Obtén tu clave API de SerpAPI en la página de cuenta de SerpAPI',
+ },
+ },
+ apiBasedExtension: {
+ title: 'Las extensiones basadas en API proporcionan una gestión centralizada de API, simplificando la configuración para su fácil uso en las aplicaciones de Dify.',
+ link: 'Aprende cómo desarrollar tu propia Extensión API.',
+ linkUrl: 'https://docs.dify.ai/features/extension/api_based_extension',
+ add: 'Agregar Extensión API',
+ selector: {
+ title: 'Extensión API',
+ placeholder: 'Por favor selecciona extensión API',
+ manage: 'Gestionar Extensión API',
+ },
+ modal: {
+ title: 'Agregar Extensión API',
+ editTitle: 'Editar Extensión API',
+ name: {
+ title: 'Nombre',
+ placeholder: 'Por favor ingresa el nombre',
+ },
+ apiEndpoint: {
+ title: 'Punto final de la API',
+ placeholder: 'Por favor ingresa el punto final de la API',
+ },
+ apiKey: {
+ title: 'Clave API',
+ placeholder: 'Por favor ingresa la clave API',
+ lengthError: 'La longitud de la clave API no puede ser menor a 5 caracteres',
+ },
+ },
+ type: 'Tipo',
+ },
+ about: {
+ changeLog: 'Registro de cambios',
+ updateNow: 'Actualizar ahora',
+ nowAvailable: 'Dify {{version}} ya está disponible.',
+ latestAvailable: 'Dify {{version}} es la última versión disponible.',
+ },
+ appMenus: {
+ overview: 'Monitoreo',
+ promptEng: 'Orquestar',
+ apiAccess: 'Acceso API',
+ logAndAnn: 'Registros y Anuncios',
+ logs: 'Registros',
+ },
+ environment: {
+ testing: 'PRUEBAS',
+ development: 'DESARROLLO',
+ },
+ appModes: {
+ completionApp: 'Generador de Texto',
+ chatApp: 'Aplicación de Chat',
+ },
+ datasetMenus: {
+ documents: 'Documentos',
+ hitTesting: 'Pruebas de Recuperación',
+ settings: 'Configuraciones',
+ emptyTip: 'El Conocimiento no ha sido asociado, por favor ve a la aplicación o plugin para completar la asociación.',
+ viewDoc: 'Ver documentación',
+ relatedApp: 'aplicaciones vinculadas',
+ },
+ voiceInput: {
+ speaking: 'Habla ahora...',
+ converting: 'Convirtiendo a texto...',
+ notAllow: 'micrófono no autorizado',
+ },
+ modelName: {
+ 'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+ 'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+ 'gpt-4': 'GPT-4',
+ 'gpt-4-32k': 'GPT-4-32K',
+ 'text-davinci-003': 'Text-Davinci-003',
+ 'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+ 'whisper-1': 'Whisper-1',
+ 'claude-instant-1': 'Claude-Instant',
+ 'claude-2': 'Claude-2',
+ },
+ chat: {
+ renameConversation: 'Renombrar Conversación',
+ conversationName: 'Nombre de la conversación',
+ conversationNamePlaceholder: 'Por favor ingresa el nombre de la conversación',
+ conversationNameCanNotEmpty: 'Nombre de la conversación requerido',
+ citation: {
+ title: 'CITAS',
+ linkToDataset: 'Enlace al Conocimiento',
+ characters: 'Caracteres:',
+ hitCount: 'Conteo de recuperaciones:',
+ vectorHash: 'Hash de vector:',
+ hitScore: 'Puntuación de recuperación:',
+ },
+ },
+ promptEditor: {
+ placeholder: 'Escribe tu palabra de indicación aquí, ingresa \'{\' para insertar una variable, ingresa \'/\' para insertar un bloque de contenido de indicación',
+ context: {
+ item: {
+ title: 'Contexto',
+ desc: 'Insertar plantilla de contexto',
+ },
+ modal: {
+ title: '{{num}} Conocimiento en Contexto',
+ add: 'Agregar Contexto ',
+ footer: 'Puedes gestionar contextos en la sección de Contexto abajo.',
+ },
+ },
+ history: {
+ item: {
+ title: 'Historial de Conversación',
+ desc: 'Insertar plantilla de mensaje histórico',
+ },
+ modal: {
+ title: 'EJEMPLO',
+ user: 'Hola',
+ assistant: '¡Hola! ¿Cómo puedo asistirte hoy?',
+ edit: 'Editar Nombres de Roles de Conversación',
+ },
+ },
+ variable: {
+ item: {
+ title: 'Variables y Herramientas Externas',
+ desc: 'Insertar Variables y Herramientas Externas',
+ },
+ outputToolDisabledItem: {
+ title: 'Variables',
+ desc: 'Insertar Variables',
+ },
+ modal: {
+ add: 'Nueva variable',
+ addTool: 'Nueva herramienta',
+ },
+ },
+ query: {
+ item: {
+ title: 'Consulta',
+ desc: 'Insertar plantilla de consulta del usuario',
+ },
+ },
+ existed: 'Ya existe en la indicación',
+ },
+ imageUploader: {
+ uploadFromComputer: 'Cargar desde la Computadora',
+ uploadFromComputerReadError: 'Lectura de imagen fallida, por favor intenta nuevamente.',
+ uploadFromComputerUploadError: 'Carga de imagen fallida, por favor carga nuevamente.',
+ uploadFromComputerLimit: 'Las imágenes cargadas no pueden exceder {{size}} MB',
+ pasteImageLink: 'Pegar enlace de imagen',
+ pasteImageLinkInputPlaceholder: 'Pega el enlace de imagen aquí',
+ pasteImageLinkInvalid: 'Enlace de imagen inválido',
+ imageUpload: 'Carga de Imagen',
+ },
+ tag: {
+ placeholder: 'Todas las Etiquetas',
+ addNew: 'Agregar nueva etiqueta',
+ noTag: 'Sin etiquetas',
+ noTagYet: 'Aún sin etiquetas',
+ addTag: 'Agregar etiquetas',
+ editTag: 'Editar etiquetas',
+ manageTags: 'Gestionar Etiquetas',
+ selectorPlaceholder: 'Escribe para buscar o crear',
+ create: 'Crear',
+ delete: 'Eliminar etiqueta',
+ deleteTip: 'La etiqueta se está utilizando, ¿eliminarla?',
+ created: 'Etiqueta creada exitosamente',
+ failed: 'Creación de etiqueta fallida',
+ },
+}
+
+export default translation
diff --git a/web/i18n/es-ES/custom.ts b/web/i18n/es-ES/custom.ts
new file mode 100644
index 00000000000000..0dd65125891352
--- /dev/null
+++ b/web/i18n/es-ES/custom.ts
@@ -0,0 +1,30 @@
+const translation = {
+ custom: 'Personalización',
+ upgradeTip: {
+ prefix: 'Actualiza tu plan para',
+ suffix: 'personalizar tu marca.',
+ },
+ webapp: {
+ title: 'Personalizar marca de WebApp',
+ removeBrand: 'Eliminar Powered by Dify',
+ changeLogo: 'Cambiar Imagen de Marca Powered by',
+ changeLogoTip: 'Formato SVG o PNG con un tamaño mínimo de 40x40px',
+ },
+ app: {
+ title: 'Personalizar encabezado de la aplicación',
+ changeLogoTip: 'Formato SVG o PNG con un tamaño mínimo de 80x80px',
+ },
+ upload: 'Subir',
+ uploading: 'Subiendo',
+ uploadedFail: 'Error al subir la imagen, por favor vuelve a intentar.',
+ change: 'Cambiar',
+ apply: 'Aplicar',
+ restore: 'Restaurar valores predeterminados',
+ customize: {
+ contactUs: ' contáctanos ',
+ prefix: 'Para personalizar el logotipo de la marca dentro de la aplicación, por favor',
+ suffix: 'para actualizar a la edición Enterprise.',
+ },
+}
+
+export default translation
diff --git a/web/i18n/es-ES/dataset-creation.ts b/web/i18n/es-ES/dataset-creation.ts
new file mode 100644
index 00000000000000..f8ef14f89b1730
--- /dev/null
+++ b/web/i18n/es-ES/dataset-creation.ts
@@ -0,0 +1,161 @@
+const translation = {
+ steps: {
+ header: {
+ creation: 'Crear conocimiento',
+ update: 'Agregar datos',
+ },
+ one: 'Elegir fuente de datos',
+ two: 'Preprocesamiento y limpieza de texto',
+ three: 'Ejecutar y finalizar',
+ },
+ error: {
+ unavailable: 'Este conocimiento no está disponible',
+ },
+ firecrawl: {
+ configFirecrawl: 'Configurar 🔥Firecrawl',
+ apiKeyPlaceholder: 'Clave de API de firecrawl.dev',
+ getApiKeyLinkText: 'Obtener tu clave de API de firecrawl.dev',
+ },
+ stepOne: {
+ filePreview: 'Vista previa del archivo',
+ pagePreview: 'Vista previa de la página',
+ dataSourceType: {
+ file: 'Importar desde archivo',
+ notion: 'Sincronizar desde Notion',
+ web: 'Sincronizar desde sitio web',
+ },
+ uploader: {
+ title: 'Cargar archivo',
+ button: 'Arrastra y suelta el archivo, o',
+ browse: 'Buscar',
+ tip: 'Soporta {{supportTypes}}. Máximo {{size}}MB cada uno.',
+ validation: {
+ typeError: 'Tipo de archivo no soportado',
+ size: 'Archivo demasiado grande. El máximo es {{size}}MB',
+ count: 'No se admiten varios archivos',
+ filesNumber: 'Has alcanzado el límite de carga por lotes de {{filesNumber}}.',
+ },
+ cancel: 'Cancelar',
+ change: 'Cambiar',
+ failed: 'Error al cargar',
+ },
+ notionSyncTitle: 'Notion no está conectado',
+ notionSyncTip: 'Para sincronizar con Notion, primero se debe establecer la conexión con Notion.',
+ connect: 'Ir a conectar',
+ button: 'Siguiente',
+ emptyDatasetCreation: 'Quiero crear un conocimiento vacío',
+ modal: {
+ title: 'Crear un conocimiento vacío',
+ tip: 'Un conocimiento vacío no contendrá documentos y podrás cargar documentos en cualquier momento.',
+ input: 'Nombre del conocimiento',
+ placeholder: 'Por favor ingresa',
+ nameNotEmpty: 'El nombre no puede estar vacío',
+ nameLengthInvaild: 'El nombre debe tener entre 1 y 40 caracteres',
+ cancelButton: 'Cancelar',
+ confirmButton: 'Crear',
+ failed: 'Error al crear',
+ },
+ website: {
+ fireCrawlNotConfigured: 'Firecrawl no está configurado',
+ fireCrawlNotConfiguredDescription: 'Configura Firecrawl con la clave de API para poder utilizarlo.',
+ configure: 'Configurar',
+ run: 'Ejecutar',
+ firecrawlTitle: 'Extraer contenido web con 🔥Firecrawl',
+ firecrawlDoc: 'Documentación de Firecrawl',
+ firecrawlDocLink: 'https://docs.dify.ai/guides/knowledge-base/sync_from_website',
+ options: 'Opciones',
+ crawlSubPage: 'Rastrear subpáginas',
+ limit: 'Límite',
+ maxDepth: 'Profundidad máxima',
+ excludePaths: 'Excluir rutas',
+ includeOnlyPaths: 'Incluir solo rutas',
+ extractOnlyMainContent: 'Extraer solo el contenido principal (sin encabezados, navegación, pies de página, etc.)',
+ exceptionErrorTitle: 'Se produjo una excepción al ejecutar el trabajo de Firecrawl:',
+ unknownError: 'Error desconocido',
+ totalPageScraped: 'Total de páginas extraídas:',
+ selectAll: 'Seleccionar todo',
+ resetAll: 'Restablecer todo',
+ scrapTimeInfo: 'Se extrajeron {{total}} páginas en total en {{time}}s',
+ preview: 'Vista previa',
+ maxDepthTooltip: 'Profundidad máxima para rastrear en relación con la URL ingresada. La profundidad 0 solo extrae la página de la URL ingresada, la profundidad 1 extrae la URL y todo lo después de la URL ingresada + una /, y así sucesivamente.',
+ },
+ },
+ stepTwo: {
+ segmentation: 'Configuración de fragmentos',
+ auto: 'Automático',
+ autoDescription: 'Configura automáticamente las reglas de fragmentación y preprocesamiento. Se recomienda seleccionar esto para usuarios no familiarizados.',
+ custom: 'Personalizado',
+ customDescription: 'Personaliza las reglas de fragmentación, longitud de fragmentos y reglas de preprocesamiento, etc.',
+ separator: 'Identificador de segmento',
+ separatorPlaceholder: 'Por ejemplo, salto de línea (\\\\n) o separador especial (como "***")',
+ maxLength: 'Longitud máxima del fragmento',
+ overlap: 'Superposición de fragmentos',
+ overlapTip: 'Configurar la superposición de fragmentos puede mantener la relevancia semántica entre ellos, mejorando el efecto de recuperación. Se recomienda configurar el 10%-25% del tamaño máximo del fragmento.',
+ overlapCheck: 'La superposición de fragmentos no debe ser mayor que la longitud máxima del fragmento',
+ rules: 'Reglas de preprocesamiento de texto',
+ removeExtraSpaces: 'Reemplazar espacios, saltos de línea y tabulaciones consecutivas',
+ removeUrlEmails: 'Eliminar todas las URL y direcciones de correo electrónico',
+ removeStopwords: 'Eliminar palabras vacías como "un", "una", "el"',
+ preview: 'Confirmar y vista previa',
+ reset: 'Restablecer',
+ indexMode: 'Modo de índice',
+ qualified: 'Alta calidad',
+ recommend: 'Recomendado',
+ qualifiedTip: 'Llama a la interfaz de incrustación del sistema por defecto para proporcionar una mayor precisión cuando los usuarios realizan consultas.',
+ warning: 'Por favor, configura primero la clave de API del proveedor del modelo.',
+ click: 'Ir a configuración',
+ economical: 'Económico',
+ economicalTip: 'Utiliza motores de vector sin conexión, índices de palabras clave, etc. para reducir la precisión sin gastar tokens',
+ QATitle: 'Segmentación en formato de pregunta y respuesta',
+ QATip: 'Habilitar esta opción consumirá más tokens',
+ QALanguage: 'Segmentar usando',
+ emstimateCost: 'Estimación',
+ emstimateSegment: 'Fragmentos estimados',
+ segmentCount: 'fragmentos',
+ calculating: 'Calculando...',
+ fileSource: 'Preprocesar documentos',
+ notionSource: 'Preprocesar páginas',
+ websiteSource: 'Preprocesar sitio web',
+ other: 'y otros ',
+ fileUnit: ' archivos',
+ notionUnit: ' páginas',
+ webpageUnit: ' páginas',
+ previousStep: 'Paso anterior',
+ nextStep: 'Guardar y procesar',
+ save: 'Guardar y procesar',
+ cancel: 'Cancelar',
+ sideTipTitle: '¿Por qué fragmentar y preprocesar?',
+ sideTipP1: 'Al procesar datos de texto, la fragmentación y la limpieza son dos pasos de preprocesamiento importantes.',
+ sideTipP2: 'La segmentación divide el texto largo en párrafos para que los modelos puedan entenderlo mejor. Esto mejora la calidad y relevancia de los resultados del modelo.',
+ sideTipP3: 'La limpieza elimina caracteres y formatos innecesarios, haciendo que el conocimiento sea más limpio y fácil de analizar.',
+ sideTipP4: 'Una fragmentación y limpieza adecuadas mejoran el rendimiento del modelo, proporcionando resultados más precisos y valiosos.',
+ previewTitle: 'Vista previa',
+ previewTitleButton: 'Vista previa',
+ previewButton: 'Cambiar a formato de pregunta y respuesta',
+ previewSwitchTipStart: 'La vista previa actual del fragmento está en formato de texto, cambiar a una vista previa en formato de pregunta y respuesta',
+ previewSwitchTipEnd: ' consumirá tokens adicionales',
+ characters: 'caracteres',
+ indexSettedTip: 'Para cambiar el método de índice, por favor ve a la ',
+ retrivalSettedTip: 'Para cambiar el método de índice, por favor ve a la ',
+ datasetSettingLink: 'configuración del conocimiento.',
+ },
+ stepThree: {
+ creationTitle: '🎉 Conocimiento creado',
+ creationContent: 'Hemos asignado automáticamente un nombre al conocimiento, puedes modificarlo en cualquier momento',
+ label: 'Nombre del conocimiento',
+ additionTitle: '🎉 Documento cargado',
+ additionP1: 'El documento se ha cargado en el conocimiento',
+ additionP2: ', puedes encontrarlo en la lista de documentos del conocimiento.',
+ stop: 'Detener procesamiento',
+ resume: 'Reanudar procesamiento',
+ navTo: 'Ir al documento',
+ sideTipTitle: '¿Qué sigue?',
+ sideTipContent: 'Después de que el documento termine de indexarse, el conocimiento se puede integrar en la aplicación como contexto. Puedes encontrar la configuración de contexto en la página de orquestación de indicaciones. También puedes crearlo como un plugin de indexación ChatGPT independiente para su lanzamiento.',
+ modelTitle: '¿Estás seguro de detener la incrustación?',
+ modelContent: 'Si necesitas reanudar el procesamiento más tarde, continuarás desde donde lo dejaste.',
+ modelButtonConfirm: 'Confirmar',
+ modelButtonCancel: 'Cancelar',
+ },
+}
+
+export default translation
diff --git a/web/i18n/es-ES/dataset-documents.ts b/web/i18n/es-ES/dataset-documents.ts
new file mode 100644
index 00000000000000..6a5191ce536db2
--- /dev/null
+++ b/web/i18n/es-ES/dataset-documents.ts
@@ -0,0 +1,352 @@
+const translation = {
+ list: {
+ title: 'Documentos',
+ desc: 'Aquí se muestran todos los archivos del Conocimiento, y todo el Conocimiento se puede vincular a citas de Dify o indexarse a través del complemento de Chat.',
+ addFile: 'Agregar archivo',
+ addPages: 'Agregar páginas',
+ addUrl: 'Agregar URL',
+ table: {
+ header: {
+ fileName: 'NOMBRE DEL ARCHIVO',
+ words: 'PALABRAS',
+ hitCount: 'CANTIDAD DE RECUPERACIÓN',
+ uploadTime: 'TIEMPO DE CARGA',
+ status: 'ESTADO',
+ action: 'ACCIÓN',
+ },
+ rename: 'Renombrar',
+ name: 'Nombre',
+ },
+ action: {
+ uploadFile: 'Subir nuevo archivo',
+ settings: 'Configuración de segmento',
+ addButton: 'Agregar fragmento',
+ add: 'Agregar un fragmento',
+ batchAdd: 'Agregar en lotes',
+ archive: 'Archivar',
+ unarchive: 'Desarchivar',
+ delete: 'Eliminar',
+ enableWarning: 'El archivo archivado no puede habilitarse',
+ sync: 'Sincronizar',
+ },
+ index: {
+ enable: 'Habilitar',
+ disable: 'Deshabilitar',
+ all: 'Todos',
+ enableTip: 'El archivo se puede indexar',
+ disableTip: 'El archivo no se puede indexar',
+ },
+ status: {
+ queuing: 'En cola',
+ indexing: 'Indexando',
+ paused: 'Pausado',
+ error: 'Error',
+ available: 'Disponible',
+ enabled: 'Habilitado',
+ disabled: 'Deshabilitado',
+ archived: 'Archivado',
+ },
+ empty: {
+ title: 'Aún no hay documentación',
+ upload: {
+ tip: 'Puedes subir archivos, sincronizar desde el sitio web o desde aplicaciones web como Notion, GitHub, etc.',
+ },
+ sync: {
+ tip: 'Dify descargará periódicamente archivos desde tu Notion y completará el procesamiento.',
+ },
+ },
+ delete: {
+ title: '¿Seguro que deseas eliminar?',
+ content: 'Si necesitas reanudar el procesamiento más tarde, continuarás desde donde lo dejaste.',
+ },
+ batchModal: {
+ title: 'Agregar fragmentos en lotes',
+ csvUploadTitle: 'Arrastra y suelta tu archivo CSV aquí, o ',
+ browse: 'navega',
+ tip: 'El archivo CSV debe cumplir con la siguiente estructura:',
+ question: 'pregunta',
+ answer: 'respuesta',
+ contentTitle: 'contenido del fragmento',
+ content: 'contenido',
+ template: 'Descarga la plantilla aquí',
+ cancel: 'Cancelar',
+ run: 'Ejecutar en lotes',
+ runError: 'Error al ejecutar en lotes',
+ processing: 'Procesamiento en lotes',
+ completed: 'Importación completada',
+ error: 'Error de importación',
+ ok: 'Aceptar',
+ },
+ },
+ metadata: {
+ title: 'Metadatos',
+ desc: 'Etiquetar metadatos para documentos permite que la IA acceda a ellos de manera oportuna y expone la fuente de referencias para los usuarios.',
+ dateTimeFormat: 'MMMM D, YYYY hh:mm A',
+ docTypeSelectTitle: 'Por favor, selecciona un tipo de documento',
+ docTypeChangeTitle: 'Cambiar tipo de documento',
+ docTypeSelectWarning:
+ 'Si se cambia el tipo de documento, los metadatos ahora llenos ya no se conservarán.',
+ firstMetaAction: 'Vamos D',
+ placeholder: {
+ add: 'Agregar ',
+ select: 'Seleccionar ',
+ },
+ source: {
+ upload_file: 'Subir archivo',
+ notion: 'Sincronizar desde Notion',
+ github: 'Sincronizar desde GitHub',
+ },
+ type: {
+ book: 'Libro',
+ webPage: 'Página Web',
+ paper: 'Artículo',
+ socialMediaPost: 'Publicación en Redes Sociales',
+ personalDocument: 'Documento Personal',
+ businessDocument: 'Documento de Negocios',
+ IMChat: 'Chat IM',
+ wikipediaEntry: 'Entrada de Wikipedia',
+ notion: 'Sincronizar desde Notion',
+ github: 'Sincronizar desde GitHub',
+ technicalParameters: 'Parámetros Técnicos',
+ },
+ field: {
+ processRule: {
+ processDoc: 'Procesar documento',
+ segmentRule: 'Regla de segmentación',
+ segmentLength: 'Longitud de fragmentos',
+ processClean: 'Limpieza de texto procesado',
+ },
+ book: {
+ title: 'Título',
+ language: 'Idioma',
+ author: 'Autor',
+ publisher: 'Editorial',
+ publicationDate: 'Fecha de publicación',
+ ISBN: 'ISBN',
+ category: 'Categoría',
+ },
+ webPage: {
+ title: 'Título',
+ url: 'URL',
+ language: 'Idioma',
+ authorPublisher: 'Autor/Editorial',
+ publishDate: 'Fecha de publicación',
+ topicsKeywords: 'Temas/Palabras clave',
+ description: 'Descripción',
+ },
+ paper: {
+ title: 'Título',
+ language: 'Idioma',
+ author: 'Autor',
+ publishDate: 'Fecha de publicación',
+ journalConferenceName: 'Nombre de la revista/conferencia',
+ volumeIssuePage: 'Volumen/Número/Página',
+ DOI: 'DOI',
+ topicsKeywords: 'Temas/Palabras clave',
+ abstract: 'Resumen',
+ },
+ socialMediaPost: {
+ platform: 'Plataforma',
+ authorUsername: 'Autor/Nombre de usuario',
+ publishDate: 'Fecha de publicación',
+ postURL: 'URL de la publicación',
+ topicsTags: 'Temas/Etiquetas',
+ },
+ personalDocument: {
+ title: 'Título',
+ author: 'Autor',
+ creationDate: 'Fecha de creación',
+ lastModifiedDate: 'Última fecha de modificación',
+ documentType: 'Tipo de documento',
+ tagsCategory: 'Etiquetas/Categoría',
+ },
+ businessDocument: {
+ title: 'Título',
+ author: 'Autor',
+ creationDate: 'Fecha de creación',
+ lastModifiedDate: 'Última fecha de modificación',
+ documentType: 'Tipo de documento',
+ departmentTeam: 'Departamento/Equipo',
+ },
+ IMChat: {
+ chatPlatform: 'Plataforma de chat',
+ chatPartiesGroupName: 'Partes de chat/Nombre del grupo',
+ participants: 'Participantes',
+ startDate: 'Fecha de inicio',
+ endDate: 'Fecha de fin',
+ topicsKeywords: 'Temas/Palabras clave',
+ fileType: 'Tipo de archivo',
+ },
+ wikipediaEntry: {
+ title: 'Título',
+ language: 'Idioma',
+ webpageURL: 'URL de la página web',
+ editorContributor: 'Editor/Contribuidor',
+ lastEditDate: 'Última fecha de edición',
+ summaryIntroduction: 'Resumen/Introducción',
+ },
+ notion: {
+ title: 'Título',
+ language: 'Idioma',
+ author: 'Autor',
+ createdTime: 'Fecha de creación',
+ lastModifiedTime: 'Última fecha de modificación',
+ url: 'URL',
+ tag: 'Etiqueta',
+ description: 'Descripción',
+ },
+ github: {
+ repoName: 'Nombre del repositorio',
+ repoDesc: 'Descripción del repositorio',
+ repoOwner: 'Propietario del repositorio',
+ fileName: 'Nombre del archivo',
+ filePath: 'Ruta del archivo',
+ programmingLang: 'Lenguaje de programación',
+ url: 'URL',
+ license: 'Licencia',
+ lastCommitTime: 'Última hora de compromiso',
+ lastCommitAuthor: 'Último autor del compromiso',
+ },
+ originInfo: {
+ originalFilename: 'Nombre de archivo original',
+ originalFileSize: 'Tamaño de archivo original',
+ uploadDate: 'Fecha de carga',
+ lastUpdateDate: 'Última fecha de actualización',
+ source: 'Fuente',
+ },
+ technicalParameters: {
+ segmentSpecification: 'Especificación de fragmentos',
+ segmentLength: 'Longitud de fragmentos',
+ avgParagraphLength: 'Longitud promedio del párrafo',
+ paragraphs: 'Párrafos',
+ hitCount: 'Cantidad de recuperación',
+ embeddingTime: 'Tiempo de incrustación',
+ embeddedSpend: 'Gasto incrustado',
+ },
+ },
+ languageMap: {
+ zh: 'Chino',
+ en: 'Inglés',
+ es: 'Español',
+ fr: 'Francés',
+ de: 'Alemán',
+ ja: 'Japonés',
+ ko: 'Coreano',
+ ru: 'Ruso',
+ ar: 'Árabe',
+ pt: 'Portugués',
+ it: 'Italiano',
+ nl: 'Holandés',
+ pl: 'Polaco',
+ sv: 'Sueco',
+ tr: 'Turco',
+ he: 'Hebreo',
+ hi: 'Hindi',
+ da: 'Danés',
+ fi: 'Finlandés',
+ no: 'Noruego',
+ hu: 'Húngaro',
+ el: 'Griego',
+ cs: 'Checo',
+ th: 'Tailandés',
+ id: 'Indonesio',
+ },
+ categoryMap: {
+ book: {
+ fiction: 'Ficción',
+ biography: 'Biografía',
+ history: 'Historia',
+ science: 'Ciencia',
+ technology: 'Tecnología',
+ education: 'Educación',
+ philosophy: 'Filosofía',
+ religion: 'Religión',
+ socialSciences: 'Ciencias Sociales',
+ art: 'Arte',
+ travel: 'Viaje',
+ health: 'Salud',
+ selfHelp: 'Autoayuda',
+ businessEconomics: 'Negocios y Economía',
+ cooking: 'Cocina',
+ childrenYoungAdults: 'Niños y Jóvenes Adultos',
+ comicsGraphicNovels: 'Cómics y Novelas Gráficas',
+ poetry: 'Poesía',
+ drama: 'Drama',
+ other: 'Otros',
+ },
+ personalDoc: {
+ notes: 'Notas',
+ blogDraft: 'Borrador de blog',
+ diary: 'Diario',
+ researchReport: 'Informe de investigación',
+ bookExcerpt: 'Extracto de libro',
+ schedule: 'Horario',
+ list: 'Lista',
+ projectOverview: 'Visión general del proyecto',
+ photoCollection: 'Colección de fotos',
+ creativeWriting: 'Escritura creativa',
+ codeSnippet: 'Fragmento de código',
+ designDraft: 'Borrador de diseño',
+ personalResume: 'Currículum personal',
+ other: 'Otros',
+ },
+ businessDoc: {
+ meetingMinutes: 'Minutos de reunión',
+ researchReport: 'Informe de investigación',
+ proposal: 'Propuesta',
+ employeeHandbook: 'Manual del empleado',
+ trainingMaterials: 'Materiales de capacitación',
+ requirementsDocument: 'Documento de requisitos',
+ designDocument: 'Documento de diseño',
+ productSpecification: 'Especificación del producto',
+ financialReport: 'Informe financiero',
+ marketAnalysis: 'Análisis de mercado',
+ projectPlan: 'Plan de proyecto',
+ teamStructure: 'Estructura del equipo',
+ policiesProcedures: 'Políticas y procedimientos',
+ contractsAgreements: 'Contratos y acuerdos',
+ emailCorrespondence: 'Correspondencia por correo electrónico',
+ other: 'Otros',
+ },
+ },
+ },
+ embedding: {
+ processing: 'Procesando incrustación...',
+ paused: 'Incrustación pausada',
+ completed: 'Incrustación completada',
+ error: 'Error de incrustación',
+ docName: 'Preprocesamiento del documento',
+ mode: 'Regla de segmentación',
+ segmentLength: 'Longitud de fragmentos',
+ textCleaning: 'Definición de texto y limpieza previa',
+ segments: 'Párrafos',
+ highQuality: 'Modo de alta calidad',
+ economy: 'Modo económico',
+ estimate: 'Consumo estimado',
+ stop: 'Detener procesamiento',
+ resume: 'Reanudar procesamiento',
+ automatic: 'Automático',
+ custom: 'Personalizado',
+ previewTip: 'La vista previa del párrafo estará disponible después de que se complete la incrustación',
+ },
+ segment: {
+ paragraphs: 'Párrafos',
+ keywords: 'Palabras clave',
+ addKeyWord: 'Agregar palabra clave',
+ keywordError: 'La longitud máxima de la palabra clave es 20',
+ characters: 'caracteres',
+ hitCount: 'Cantidad de recuperación',
+ vectorHash: 'Hash de vector: ',
+ questionPlaceholder: 'agregar pregunta aquí',
+ questionEmpty: 'La pregunta no puede estar vacía',
+ answerPlaceholder: 'agregar respuesta aquí',
+ answerEmpty: 'La respuesta no puede estar vacía',
+ contentPlaceholder: 'agregar contenido aquí',
+ contentEmpty: 'El contenido no puede estar vacío',
+ newTextSegment: 'Nuevo segmento de texto',
+ newQaSegment: 'Nuevo segmento de preguntas y respuestas',
+ delete: '¿Eliminar este fragmento?',
+ },
+}
+
+export default translation
diff --git a/web/i18n/es-ES/dataset-hit-testing.ts b/web/i18n/es-ES/dataset-hit-testing.ts
new file mode 100644
index 00000000000000..4ebdd03b9d7e4c
--- /dev/null
+++ b/web/i18n/es-ES/dataset-hit-testing.ts
@@ -0,0 +1,28 @@
+const translation = {
+ title: 'Prueba de recuperación',
+ desc: 'Prueba del efecto de impacto del conocimiento basado en el texto de consulta proporcionado.',
+ dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+ recents: 'Recientes',
+ table: {
+ header: {
+ source: 'Fuente',
+ text: 'Texto',
+ time: 'Tiempo',
+ },
+ },
+ input: {
+ title: 'Texto fuente',
+ placeholder: 'Por favor ingrese un texto, se recomienda una oración declarativa corta.',
+ countWarning: 'Hasta 200 caracteres.',
+ indexWarning: 'Solo conocimiento de alta calidad.',
+ testing: 'Prueba',
+ },
+ hit: {
+ title: 'PÁRRAFOS DE RECUPERACIÓN',
+ emptyTip: 'Los resultados de la prueba de recuperación se mostrarán aquí',
+ },
+ noRecentTip: 'No hay resultados de consulta recientes aquí',
+ viewChart: 'Ver GRÁFICO VECTORIAL',
+}
+
+export default translation
diff --git a/web/i18n/es-ES/dataset-settings.ts b/web/i18n/es-ES/dataset-settings.ts
new file mode 100644
index 00000000000000..984b3783769a89
--- /dev/null
+++ b/web/i18n/es-ES/dataset-settings.ts
@@ -0,0 +1,35 @@
+const translation = {
+ title: 'Configuración del conjunto de datos',
+ desc: 'Aquí puedes modificar las propiedades y los métodos de trabajo del conjunto de datos.',
+ form: {
+ name: 'Nombre del conjunto de datos',
+ namePlaceholder: 'Por favor ingresa el nombre del conjunto de datos',
+ nameError: 'El nombre no puede estar vacío',
+ desc: 'Descripción del conjunto de datos',
+ descInfo: 'Por favor escribe una descripción textual clara para delinear el contenido del conjunto de datos. Esta descripción se utilizará como base para la coincidencia al seleccionar entre múltiples conjuntos de datos para la inferencia.',
+ descPlaceholder: 'Describe lo que hay en este conjunto de datos. Una descripción detallada permite que la IA acceda al contenido del conjunto de datos de manera oportuna. Si está vacío, Dify utilizará la estrategia de coincidencia predeterminada.',
+ descWrite: 'Aprende cómo escribir una buena descripción del conjunto de datos.',
+ permissions: 'Permisos',
+ permissionsOnlyMe: 'Solo yo',
+ permissionsAllMember: 'Todos los miembros del equipo',
+ permissionsInvitedMembers: 'Miembros del equipo invitados',
+ me: '(Tú)',
+ indexMethod: 'Método de indexación',
+ indexMethodHighQuality: 'Alta calidad',
+ indexMethodHighQualityTip: 'Llama al modelo de incrustación para procesar y proporcionar una mayor precisión cuando los usuarios realizan consultas.',
+ indexMethodEconomy: 'Económico',
+ indexMethodEconomyTip: 'Utiliza motores de vectores sin conexión, índices de palabras clave, etc. para reducir la precisión sin gastar tokens.',
+ embeddingModel: 'Modelo de incrustación',
+ embeddingModelTip: 'Cambia el modelo de incrustación, por favor ve a ',
+ embeddingModelTipLink: 'Configuración',
+ retrievalSetting: {
+ title: 'Configuración de recuperación',
+ learnMore: 'Aprende más',
+ description: ' sobre el método de recuperación.',
+ longDescription: ' sobre el método de recuperación, puedes cambiar esto en cualquier momento en la configuración del conjunto de datos.',
+ },
+ save: 'Guardar',
+ },
+}
+
+export default translation
diff --git a/web/i18n/es-ES/dataset.ts b/web/i18n/es-ES/dataset.ts
new file mode 100644
index 00000000000000..307187b60554f1
--- /dev/null
+++ b/web/i18n/es-ES/dataset.ts
@@ -0,0 +1,50 @@
+const translation = {
+ knowledge: 'Conocimiento',
+ documentCount: ' documentos',
+ wordCount: ' mil palabras',
+ appCount: ' aplicaciones vinculadas',
+ createDataset: 'Crear Conocimiento',
+ createDatasetIntro: 'Importa tus propios datos de texto o escribe datos en tiempo real a través de Webhook para mejorar el contexto de LLM.',
+ deleteDatasetConfirmTitle: '¿Eliminar este Conocimiento?',
+ deleteDatasetConfirmContent:
+ 'Eliminar el Conocimiento es irreversible. Los usuarios ya no podrán acceder a tu Conocimiento y todas las configuraciones y registros de las sugerencias se eliminarán permanentemente.',
+ datasetUsedByApp: 'El conocimiento está siendo utilizado por algunas aplicaciones. Las aplicaciones ya no podrán utilizar este Conocimiento y todas las configuraciones y registros de las sugerencias se eliminarán permanentemente.',
+ datasetDeleted: 'Conocimiento eliminado',
+ datasetDeleteFailed: 'Error al eliminar el Conocimiento',
+ didYouKnow: '¿Sabías?',
+ intro1: 'El Conocimiento se puede integrar en la aplicación Dify ',
+ intro2: 'como contexto',
+ intro3: ',',
+ intro4: 'o ',
+ intro5: 'se puede crear',
+ intro6: ' como un complemento independiente de ChatGPT para publicar',
+ unavailable: 'No disponible',
+ unavailableTip: 'El modelo de incrustación no está disponible, es necesario configurar el modelo de incrustación predeterminado',
+ datasets: 'CONOCIMIENTO',
+ datasetsApi: 'ACCESO A LA API',
+ retrieval: {
+ semantic_search: {
+ title: 'Búsqueda Vectorial',
+ description: 'Genera incrustaciones de consulta y busca el fragmento de texto más similar a su representación vectorial.',
+ },
+ full_text_search: {
+ title: 'Búsqueda de Texto Completo',
+ description: 'Indexa todos los términos del documento, lo que permite a los usuarios buscar cualquier término y recuperar el fragmento de texto relevante que contiene esos términos.',
+ },
+ hybrid_search: {
+ title: 'Búsqueda Híbrida',
+ description: 'Ejecuta búsquedas de texto completo y búsquedas vectoriales simultáneamente, reordena para seleccionar la mejor coincidencia para la consulta del usuario. Es necesaria la configuración de las API del modelo de reordenamiento.',
+ recommend: 'Recomendar',
+ },
+ invertedIndex: {
+ title: 'Índice Invertido',
+ description: 'El Índice Invertido es una estructura utilizada para la recuperación eficiente. Organizado por términos, cada término apunta a documentos o páginas web que lo contienen.',
+ },
+ change: 'Cambiar',
+ changeRetrievalMethod: 'Cambiar método de recuperación',
+ },
+ docsFailedNotice: 'no se pudieron indexar los documentos',
+ retry: 'Reintentar',
+}
+
+export default translation
diff --git a/web/i18n/es-ES/explore.ts b/web/i18n/es-ES/explore.ts
new file mode 100644
index 00000000000000..5f85d423629bf0
--- /dev/null
+++ b/web/i18n/es-ES/explore.ts
@@ -0,0 +1,41 @@
+const translation = {
+ title: 'Explorar',
+ sidebar: {
+ discovery: 'Descubrimiento',
+ chat: 'Chat',
+ workspace: 'Espacio de trabajo',
+ action: {
+ pin: 'Anclar',
+ unpin: 'Desanclar',
+ rename: 'Renombrar',
+ delete: 'Eliminar',
+ },
+ delete: {
+ title: 'Eliminar aplicación',
+ content: '¿Estás seguro de que quieres eliminar esta aplicación?',
+ },
+ },
+ apps: {
+ title: 'Explorar aplicaciones de Dify',
+ description: 'Utiliza estas aplicaciones de plantilla al instante o personaliza tus propias aplicaciones basadas en las plantillas.',
+ allCategories: 'Recomendado',
+ },
+ appCard: {
+ addToWorkspace: 'Agregar al espacio de trabajo',
+ customize: 'Personalizar',
+ },
+ appCustomize: {
+ title: 'Crear aplicación a partir de {{name}}',
+ subTitle: 'Icono y nombre de la aplicación',
+ nameRequired: 'El nombre de la aplicación es obligatorio',
+ },
+ category: {
+ Assistant: 'Asistente',
+ Writing: 'Escritura',
+ Translate: 'Traducción',
+ Programming: 'Programación',
+ HR: 'Recursos Humanos',
+ },
+}
+
+export default translation
diff --git a/web/i18n/es-ES/layout.ts b/web/i18n/es-ES/layout.ts
new file mode 100644
index 00000000000000..928649474b4dcd
--- /dev/null
+++ b/web/i18n/es-ES/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/web/i18n/es-ES/login.ts b/web/i18n/es-ES/login.ts
new file mode 100644
index 00000000000000..dc12cfc32ffe6b
--- /dev/null
+++ b/web/i18n/es-ES/login.ts
@@ -0,0 +1,75 @@
+const translation = {
+ pageTitle: '¡Hola, vamos a empezar!👋',
+ welcome: 'Bienvenido a Dify, por favor inicia sesión para continuar.',
+ email: 'Correo electrónico',
+ emailPlaceholder: 'Tu correo electrónico',
+ password: 'Contraseña',
+ passwordPlaceholder: 'Tu contraseña',
+ name: 'Nombre de usuario',
+ namePlaceholder: 'Tu nombre de usuario',
+ forget: '¿Olvidaste tu contraseña?',
+ signBtn: 'Iniciar sesión',
+ sso: 'Continuar con SSO',
+ installBtn: 'Configurar',
+ setAdminAccount: 'Configurando una cuenta de administrador',
+ setAdminAccountDesc: 'Privilegios máximos para la cuenta de administrador, que se puede utilizar para crear aplicaciones y administrar proveedores de LLM, etc.',
+ createAndSignIn: 'Crear e iniciar sesión',
+ oneMoreStep: 'Un paso más',
+ createSample: 'Con esta información, crearemos una aplicación de muestra para ti',
+ invitationCode: 'Código de invitación',
+ invitationCodePlaceholder: 'Tu código de invitación',
+ interfaceLanguage: 'Idioma de interfaz',
+ timezone: 'Zona horaria',
+ go: 'Ir a Dify',
+ sendUsMail: 'Envíanos un correo electrónico con tu presentación y nosotros nos encargaremos de la solicitud de invitación.',
+ acceptPP: 'He leído y acepto la política de privacidad',
+ reset: 'Por favor, ejecuta el siguiente comando para restablecer tu contraseña',
+ withGitHub: 'Continuar con GitHub',
+ withGoogle: 'Continuar con Google',
+ rightTitle: 'Desbloquea todo el potencial de LLM',
+ rightDesc: 'Construye de manera sencilla aplicaciones de IA visualmente cautivadoras, operables y mejorables.',
+ tos: 'Términos de servicio',
+ pp: 'Política de privacidad',
+ tosDesc: 'Al registrarte, aceptas nuestros',
+ goToInit: 'Si no has inicializado la cuenta, por favor ve a la página de inicialización',
+ donthave: '¿No tienes?',
+ invalidInvitationCode: 'Código de invitación inválido',
+ accountAlreadyInited: 'La cuenta ya está inicializada',
+ forgotPassword: '¿Olvidaste tu contraseña?',
+ resetLinkSent: 'Enlace de restablecimiento enviado',
+ sendResetLink: 'Enviar enlace de restablecimiento',
+ backToSignIn: 'Volver a iniciar sesión',
+ forgotPasswordDesc: 'Por favor, ingresa tu dirección de correo electrónico para restablecer tu contraseña. Te enviaremos un correo electrónico con instrucciones sobre cómo restablecer tu contraseña.',
+ checkEmailForResetLink: 'Por favor, revisa tu correo electrónico para encontrar un enlace para restablecer tu contraseña. Si no aparece en unos minutos, asegúrate de revisar tu carpeta de spam.',
+ passwordChanged: 'Inicia sesión ahora',
+ changePassword: 'Cambiar contraseña',
+ changePasswordTip: 'Por favor, ingresa una nueva contraseña para tu cuenta',
+ invalidToken: 'Token inválido o expirado',
+ confirmPassword: 'Confirmar contraseña',
+ confirmPasswordPlaceholder: 'Confirma tu nueva contraseña',
+ passwordChangedTip: 'Tu contraseña se ha cambiado correctamente',
+ error: {
+ emailEmpty: 'Se requiere una dirección de correo electrónico',
+ emailInValid: 'Por favor, ingresa una dirección de correo electrónico válida',
+ nameEmpty: 'Se requiere un nombre',
+ passwordEmpty: 'Se requiere una contraseña',
+ passwordLengthInValid: 'La contraseña debe tener al menos 8 caracteres',
+ passwordInvalid: 'La contraseña debe contener letras y números, y tener una longitud mayor a 8',
+ },
+ license: {
+ tip: 'Antes de comenzar con Dify Community Edition, lee la',
+ link: 'Licencia de código abierto de GitHub',
+ },
+ join: 'Unirse',
+ joinTipStart: 'Te invita a unirte al equipo de',
+ joinTipEnd: 'en Dify',
+ invalid: 'El enlace ha expirado',
+ explore: 'Explorar Dify',
+ activatedTipStart: 'Te has unido al equipo de',
+ activatedTipEnd: '',
+ activated: 'Inicia sesión ahora',
+ adminInitPassword: 'Contraseña de inicialización de administrador',
+ validate: 'Validar',
+}
+
+export default translation
diff --git a/web/i18n/es-ES/register.ts b/web/i18n/es-ES/register.ts
new file mode 100644
index 00000000000000..928649474b4dcd
--- /dev/null
+++ b/web/i18n/es-ES/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/web/i18n/es-ES/run-log.ts b/web/i18n/es-ES/run-log.ts
new file mode 100644
index 00000000000000..134764e60d0d0a
--- /dev/null
+++ b/web/i18n/es-ES/run-log.ts
@@ -0,0 +1,29 @@
+const translation = {
+ input: 'ENTRADA',
+ result: 'RESULTADO',
+ detail: 'DETALLE',
+ tracing: 'TRAZADO',
+ resultPanel: {
+ status: 'ESTADO',
+ time: 'TIEMPO TRANSCURRIDO',
+ tokens: 'TOTAL DE TOKENS',
+ },
+ meta: {
+ title: 'METADATOS',
+ status: 'Estado',
+ version: 'Versión',
+ executor: 'Ejecutor',
+ startTime: 'Hora de inicio',
+ time: 'Tiempo transcurrido',
+ tokens: 'Total de tokens',
+ steps: 'Pasos de ejecución',
+ },
+ resultEmpty: {
+ title: 'Esta ejecución solo produce formato JSON,',
+ tipLeft: 'por favor ve al ',
+ link: 'panel de detalle',
+ tipRight: ' para verlo.',
+ },
+}
+
+export default translation
diff --git a/web/i18n/es-ES/share-app.ts b/web/i18n/es-ES/share-app.ts
new file mode 100644
index 00000000000000..ad242df478958f
--- /dev/null
+++ b/web/i18n/es-ES/share-app.ts
@@ -0,0 +1,74 @@
+const translation = {
+ common: {
+ welcome: 'Bienvenido/a al uso',
+ appUnavailable: 'La aplicación no está disponible',
+ appUnkonwError: 'La aplicación no está disponible',
+ },
+ chat: {
+ newChat: 'Nuevo chat',
+ pinnedTitle: 'Fijados',
+ unpinnedTitle: 'Chats',
+ newChatDefaultName: 'Nueva conversación',
+ resetChat: 'Reiniciar conversación',
+ powerBy: 'Desarrollado por',
+ prompt: 'Indicación',
+ privatePromptConfigTitle: 'Configuración de la conversación',
+ publicPromptConfigTitle: 'Indicación inicial',
+ configStatusDes: 'Antes de comenzar, puedes modificar la configuración de la conversación',
+ configDisabled:
+ 'Se han utilizado las configuraciones de la sesión anterior para esta sesión.',
+ startChat: 'Iniciar chat',
+ privacyPolicyLeft:
+ 'Por favor, lee la ',
+ privacyPolicyMiddle:
+ 'política de privacidad',
+ privacyPolicyRight:
+ ' proporcionada por el desarrollador de la aplicación.',
+ deleteConversation: {
+ title: 'Eliminar conversación',
+ content: '¿Estás seguro/a de que quieres eliminar esta conversación?',
+ },
+ tryToSolve: 'Intentar resolver',
+ temporarySystemIssue: 'Lo sentimos, hay un problema temporal del sistema.',
+ },
+ generation: {
+ tabs: {
+ create: 'Ejecutar una vez',
+ batch: 'Ejecutar en lote',
+ saved: 'Guardado',
+ },
+ savedNoData: {
+ title: '¡Aún no has guardado ningún resultado!',
+ description: 'Comienza a generar contenido y encuentra tus resultados guardados aquí.',
+ startCreateContent: 'Comenzar a crear contenido',
+ },
+ title: 'Completado por IA',
+ queryTitle: 'Contenido de la consulta',
+ completionResult: 'Resultado del completado',
+ queryPlaceholder: 'Escribe tu contenido de consulta...',
+ run: 'Ejecutar',
+ copy: 'Copiar',
+ resultTitle: 'Completado por IA',
+ noData: 'La IA te dará lo que deseas aquí.',
+ csvUploadTitle: 'Arrastra y suelta tu archivo CSV aquí, o ',
+ browse: 'navega',
+ csvStructureTitle: 'El archivo CSV debe cumplir con la siguiente estructura:',
+ downloadTemplate: 'Descarga la plantilla aquí',
+ field: 'Campo',
+ batchFailed: {
+ info: '{{num}} ejecuciones fallidas',
+ retry: 'Reintentar',
+ outputPlaceholder: 'Sin contenido de salida',
+ },
+ errorMsg: {
+ empty: 'Por favor, ingresa contenido en el archivo cargado.',
+ fileStructNotMatch: 'El archivo CSV cargado no coincide con la estructura.',
+ emptyLine: 'La fila {{rowIndex}} está vacía',
+ invalidLine: 'Fila {{rowIndex}}: el valor de {{varName}} no puede estar vacío',
+ moreThanMaxLengthLine: 'Fila {{rowIndex}}: el valor de {{varName}} no puede tener más de {{maxLength}} caracteres',
+ atLeastOne: 'Por favor, ingresa al menos una fila en el archivo cargado.',
+ },
+ },
+}
+
+export default translation
diff --git a/web/i18n/es-ES/tools.ts b/web/i18n/es-ES/tools.ts
new file mode 100644
index 00000000000000..546591f1aabf13
--- /dev/null
+++ b/web/i18n/es-ES/tools.ts
@@ -0,0 +1,153 @@
+const translation = {
+ title: 'Herramientas',
+ createCustomTool: 'Crear Herramienta Personalizada',
+ customToolTip: 'Aprende más sobre las herramientas personalizadas de Dify',
+ type: {
+ all: 'Todas',
+ builtIn: 'Incorporadas',
+ custom: 'Personalizadas',
+ workflow: 'Flujo de Trabajo',
+ },
+ contribute: {
+ line1: 'Estoy interesado en ',
+ line2: 'contribuir herramientas a Dify.',
+ viewGuide: 'Ver la guía',
+ },
+ author: 'Por',
+ auth: {
+ unauthorized: 'Para Autorizar',
+ authorized: 'Autorizado',
+ setup: 'Configurar la autorización para usar',
+ setupModalTitle: 'Configurar Autorización',
+ setupModalTitleDescription: 'Después de configurar las credenciales, todos los miembros dentro del espacio de trabajo pueden usar esta herramienta al orquestar aplicaciones.',
+ },
+ includeToolNum: '{{num}} herramientas incluidas',
+ addTool: 'Agregar Herramienta',
+ addToolModal: {
+ type: 'tipo',
+ category: 'categoría',
+ add: 'agregar',
+ added: 'agregada',
+ manageInTools: 'Administrar en Herramientas',
+ emptyTitle: 'No hay herramientas de flujo de trabajo disponibles',
+ emptyTip: 'Ir a "Flujo de Trabajo -> Publicar como Herramienta"',
+ },
+ createTool: {
+ title: 'Crear Herramienta Personalizada',
+ editAction: 'Configurar',
+ editTitle: 'Editar Herramienta Personalizada',
+ name: 'Nombre',
+ toolNamePlaceHolder: 'Ingresa el nombre de la herramienta',
+ nameForToolCall: 'Nombre de llamada de la herramienta',
+ nameForToolCallPlaceHolder: 'Utilizado para el reconocimiento automático, como getCurrentWeather, list_pets',
+ nameForToolCallTip: 'Solo soporta números, letras y guiones bajos.',
+ description: 'Descripción',
+ descriptionPlaceholder: 'Breve descripción del propósito de la herramienta, por ejemplo, obtener la temperatura de una ubicación específica.',
+ schema: 'Esquema',
+ schemaPlaceHolder: 'Ingresa tu esquema OpenAPI aquí',
+ viewSchemaSpec: 'Ver la Especificación OpenAPI-Swagger',
+ importFromUrl: 'Importar desde URL',
+ importFromUrlPlaceHolder: 'https://...',
+ urlError: 'Por favor, ingresa una URL válida',
+ examples: 'Ejemplos',
+ exampleOptions: {
+ json: 'Clima (JSON)',
+ yaml: 'Tienda de Mascotas (YAML)',
+ blankTemplate: 'Plantilla en Blanco',
+ },
+ availableTools: {
+ title: 'Herramientas Disponibles',
+ name: 'Nombre',
+ description: 'Descripción',
+ method: 'Método',
+ path: 'Ruta',
+ action: 'Acciones',
+ test: 'Probar',
+ },
+ authMethod: {
+ title: 'Método de Autorización',
+ type: 'Tipo de Autorización',
+ keyTooltip: 'Clave del encabezado HTTP, puedes dejarla como "Authorization" si no tienes idea de qué es o configurarla con un valor personalizado',
+ types: {
+ none: 'Ninguno',
+ api_key: 'Clave API',
+ apiKeyPlaceholder: 'Nombre del encabezado HTTP para la Clave API',
+ apiValuePlaceholder: 'Ingresa la Clave API',
+ },
+ key: 'Clave',
+ value: 'Valor',
+ },
+ authHeaderPrefix: {
+ title: 'Tipo de Autenticación',
+ types: {
+ basic: 'Básica',
+ bearer: 'Bearer',
+ custom: 'Personalizada',
+ },
+ },
+ privacyPolicy: 'Política de Privacidad',
+ privacyPolicyPlaceholder: 'Por favor, ingresa la política de privacidad',
+ toolInput: {
+ title: 'Entrada de la Herramienta',
+ name: 'Nombre',
+ required: 'Requerido',
+ method: 'Método',
+ methodSetting: 'Configuración',
+ methodSettingTip: 'El usuario completa la configuración de la herramienta',
+ methodParameter: 'Parámetro',
+ methodParameterTip: 'LLM completa durante la inferencia',
+ label: 'Etiquetas',
+ labelPlaceholder: 'Elige etiquetas (opcional)',
+ description: 'Descripción',
+ descriptionPlaceholder: 'Descripción del significado del parámetro',
+ },
+ customDisclaimer: 'Descargo de responsabilidad personalizado',
+ customDisclaimerPlaceholder: 'Por favor, ingresa el descargo de responsabilidad personalizado',
+ confirmTitle: '¿Confirmar para guardar?',
+ confirmTip: 'Las aplicaciones que usen esta herramienta se verán afectadas',
+ deleteToolConfirmTitle: '¿Eliminar esta Herramienta?',
+ deleteToolConfirmContent: 'Eliminar la herramienta es irreversible. Los usuarios ya no podrán acceder a tu herramienta.',
+ },
+ test: {
+ title: 'Probar',
+ parametersValue: 'Parámetros y Valor',
+ parameters: 'Parámetros',
+ value: 'Valor',
+ testResult: 'Resultados de la Prueba',
+ testResultPlaceholder: 'El resultado de la prueba se mostrará aquí',
+ },
+ thought: {
+ using: 'Usando',
+ used: 'Usado',
+ requestTitle: 'Solicitud a',
+ responseTitle: 'Respuesta de',
+ },
+ setBuiltInTools: {
+ info: 'Información',
+ setting: 'Ajuste',
+ toolDescription: 'Descripción de la herramienta',
+ parameters: 'parámetros',
+ string: 'cadena',
+ number: 'número',
+ required: 'Requerido',
+ infoAndSetting: 'Información y Ajustes',
+ },
+ noCustomTool: {
+ title: '¡Sin herramientas personalizadas!',
+ content: 'Agrega y administra tus herramientas personalizadas aquí para construir aplicaciones de inteligencia artificial.',
+ createTool: 'Crear Herramienta',
+ },
+ noSearchRes: {
+ title: '¡Lo sentimos, no hay resultados!',
+ content: 'No encontramos herramientas que coincidan con tu búsqueda.',
+ reset: 'Restablecer Búsqueda',
+ },
+ builtInPromptTitle: 'Aviso',
+ toolRemoved: 'Herramienta eliminada',
+ notAuthorized: 'Herramienta no autorizada',
+ howToGet: 'Cómo obtener',
+ openInStudio: 'Abrir en Studio',
+ toolNameUsageTip: 'Nombre de llamada de la herramienta para razonamiento y promoción de agentes',
+}
+
+export default translation
diff --git a/web/i18n/es-ES/workflow.ts b/web/i18n/es-ES/workflow.ts
new file mode 100644
index 00000000000000..5db18939fe3121
--- /dev/null
+++ b/web/i18n/es-ES/workflow.ts
@@ -0,0 +1,476 @@
+const translation = {
+ common: {
+ undo: 'Deshacer',
+ redo: 'Rehacer',
+ editing: 'Editando',
+ autoSaved: 'Guardado automático',
+ unpublished: 'No publicado',
+ published: 'Publicado',
+ publish: 'Publicar',
+ update: 'Actualizar',
+ run: 'Ejecutar',
+ running: 'Ejecutando',
+ inRunMode: 'En modo de ejecución',
+ inPreview: 'En vista previa',
+ inPreviewMode: 'En modo de vista previa',
+ preview: 'Vista previa',
+ viewRunHistory: 'Ver historial de ejecución',
+ runHistory: 'Historial de ejecución',
+ goBackToEdit: 'Volver al editor',
+ conversationLog: 'Registro de conversación',
+ features: 'Funcionalidades',
+ debugAndPreview: 'Depurar y previsualizar',
+ restart: 'Reiniciar',
+ currentDraft: 'Borrador actual',
+ currentDraftUnpublished: 'Borrador actual no publicado',
+ latestPublished: 'Último publicado',
+ publishedAt: 'Publicado el',
+ restore: 'Restaurar',
+ runApp: 'Ejecutar aplicación',
+ batchRunApp: 'Ejecutar aplicación en lote',
+ accessAPIReference: 'Acceder a la referencia de la API',
+ embedIntoSite: 'Insertar en el sitio',
+ addTitle: 'Agregar título...',
+ addDescription: 'Agregar descripción...',
+ noVar: 'Sin variable',
+ searchVar: 'Buscar variable',
+ variableNamePlaceholder: 'Nombre de la variable',
+ setVarValuePlaceholder: 'Establecer variable',
+ needConnecttip: 'Este paso no está conectado a nada',
+ maxTreeDepth: 'Límite máximo de {{depth}} nodos por rama',
+ needEndNode: 'Debe agregarse el bloque de Fin',
+ needAnswerNode: 'Debe agregarse el bloque de Respuesta',
+ workflowProcess: 'Proceso de flujo de trabajo',
+ notRunning: 'Aún no se está ejecutando',
+ previewPlaceholder: 'Ingrese contenido en el cuadro de abajo para comenzar a depurar el Chatbot',
+ effectVarConfirm: {
+ title: 'Eliminar variable',
+ content: 'La variable se utiliza en otros nodos. ¿Aún quieres eliminarla?',
+ },
+ insertVarTip: 'Presiona la tecla \'/\' para insertar rápidamente',
+ processData: 'Procesar datos',
+ input: 'Entrada',
+ output: 'Salida',
+ jinjaEditorPlaceholder: 'Escribe \'/\' o \'{\' para insertar una variable',
+ viewOnly: 'Solo vista',
+ showRunHistory: 'Mostrar historial de ejecución',
+ enableJinja: 'Habilitar soporte de plantillas Jinja',
+ learnMore: 'Más información',
+ copy: 'Copiar',
+ duplicate: 'Duplicar',
+ addBlock: 'Agregar bloque',
+ pasteHere: 'Pegar aquí',
+ pointerMode: 'Modo puntero',
+ handMode: 'Modo mano',
+ model: 'Modelo',
+ workflowAsTool: 'Flujo de trabajo como herramienta',
+ configureRequired: 'Configuración requerida',
+ configure: 'Configurar',
+ manageInTools: 'Administrar en Herramientas',
+ workflowAsToolTip: 'Se requiere la reconfiguración de la herramienta después de la actualización del flujo de trabajo.',
+ viewDetailInTracingPanel: 'Ver detalles',
+ syncingData: 'Sincronizando datos, solo unos segundos.',
+ importDSL: 'Importar DSL',
+ importDSLTip: 'El borrador actual se sobrescribirá. Exporta el flujo de trabajo como respaldo antes de importar.',
+ backupCurrentDraft: 'Respaldar borrador actual',
+ chooseDSL: 'Elegir archivo DSL (yml)',
+ overwriteAndImport: 'Sobrescribir e importar',
+ importFailure: 'Error al importar',
+ importSuccess: 'Importación exitosa',
+ },
+ changeHistory: {
+ title: 'Historial de cambios',
+ placeholder: 'Aún no has realizado cambios',
+ clearHistory: 'Borrar historial',
+ hint: 'Sugerencia',
+ hintText: 'Tus acciones de edición se registran en un historial de cambios, que se almacena en tu dispositivo durante esta sesión. Este historial se borrará cuando salgas del editor.',
+ stepBackward_one: '{{count}} paso hacia atrás',
+ stepBackward_other: '{{count}} pasos hacia atrás',
+ stepForward_one: '{{count}} paso hacia adelante',
+ stepForward_other: '{{count}} pasos hacia adelante',
+ sessionStart: 'Inicio de sesión',
+ currentState: 'Estado actual',
+ nodeTitleChange: 'Se cambió el título del bloque',
+ nodeDescriptionChange: 'Se cambió la descripción del bloque',
+ nodeDragStop: 'Bloque movido',
+ nodeChange: 'Bloque cambiado',
+ nodeConnect: 'Bloque conectado',
+ nodePaste: 'Bloque pegado',
+ nodeDelete: 'Bloque eliminado',
+ nodeAdd: 'Bloque agregado',
+ nodeResize: 'Bloque redimensionado',
+ noteAdd: 'Nota agregada',
+ noteChange: 'Nota cambiada',
+ noteDelete: 'Nota eliminada',
+ edgeDelete: 'Bloque desconectado',
+ },
+ errorMsg: {
+ fieldRequired: 'Se requiere {{field}}',
+ authRequired: 'Se requiere autorización',
+ invalidJson: '{{field}} no es un JSON válido',
+ fields: {
+ variable: 'Nombre de la variable',
+ variableValue: 'Valor de la variable',
+ code: 'Código',
+ model: 'Modelo',
+ rerankModel: 'Modelo de reordenamiento',
+ },
+ invalidVariable: 'Variable no válida',
+ },
+ singleRun: {
+ testRun: 'Ejecución de prueba',
+ startRun: 'Iniciar ejecución',
+ running: 'Ejecutando',
+ testRunIteration: 'Iteración de ejecución de prueba',
+ back: 'Atrás',
+ iteration: 'Iteración',
+ },
+ tabs: {
+ 'searchBlock': 'Buscar bloque',
+ 'blocks': 'Bloques',
+ 'tools': 'Herramientas',
+ 'allTool': 'Todos',
+ 'builtInTool': 'Incorporadas',
+ 'customTool': 'Personalizadas',
+ 'workflowTool': 'Flujo de trabajo',
+ 'question-understand': 'Entender pregunta',
+ 'logic': 'Lógica',
+ 'transform': 'Transformar',
+ 'utilities': 'Utilidades',
+ 'noResult': 'No se encontraron coincidencias',
+ },
+ blocks: {
+ 'start': 'Inicio',
+ 'end': 'Fin',
+ 'answer': 'Respuesta',
+ 'llm': 'LLM',
+ 'knowledge-retrieval': 'Recuperación de conocimiento',
+ 'question-classifier': 'Clasificador de preguntas',
+ 'if-else': 'SI/SINO',
+ 'code': 'Código',
+ 'template-transform': 'Plantilla',
+ 'http-request': 'Solicitud HTTP',
+ 'variable-assigner': 'Asignador de variables',
+ 'variable-aggregator': 'Agregador de variables',
+ 'iteration-start': 'Inicio de iteración',
+ 'iteration': 'Iteración',
+ 'parameter-extractor': 'Extractor de parámetros',
+ },
+ blocksAbout: {
+ 'start': 'Define los parámetros iniciales para iniciar un flujo de trabajo',
+ 'end': 'Define el final y el tipo de resultado de un flujo de trabajo',
+ 'answer': 'Define el contenido de respuesta de una conversación de chat',
+ 'llm': 'Invoca modelos de lenguaje grandes para responder preguntas o procesar lenguaje natural',
+ 'knowledge-retrieval': 'Te permite consultar contenido de texto relacionado con las preguntas de los usuarios desde el conocimiento',
+ 'question-classifier': 'Define las condiciones de clasificación de las preguntas de los usuarios, LLM puede definir cómo progresa la conversación en función de la descripción de clasificación',
+ 'if-else': 'Te permite dividir el flujo de trabajo en dos ramas basadas en condiciones SI/SINO',
+ 'code': 'Ejecuta un fragmento de código Python o NodeJS para implementar lógica personalizada',
+ 'template-transform': 'Convierte datos en una cadena utilizando la sintaxis de plantillas Jinja',
+ 'http-request': 'Permite enviar solicitudes al servidor a través del protocolo HTTP',
+ 'variable-assigner': 'Agrega variables de múltiples ramas en una sola variable para configurar de manera unificada los nodos descendentes.',
+ 'variable-aggregator': 'Agrega variables de múltiples ramas en una sola variable para configurar de manera unificada los nodos descendentes.',
+ 'iteration': 'Realiza múltiples pasos en un objeto de lista hasta que se generen todos los resultados.',
+ 'parameter-extractor': 'Utiliza LLM para extraer parámetros estructurados del lenguaje natural para invocaciones de herramientas o solicitudes HTTP.',
+ },
+ operator: {
+ zoomIn: 'Acercar',
+ zoomOut: 'Alejar',
+ zoomTo50: 'Zoom al 50%',
+ zoomTo100: 'Zoom al 100%',
+ zoomToFit: 'Ajustar al tamaño',
+ },
+ panel: {
+ userInputField: 'Campo de entrada del usuario',
+ changeBlock: 'Cambiar bloque',
+ helpLink: 'Enlace de ayuda',
+ about: 'Acerca de',
+ createdBy: 'Creado por ',
+ nextStep: 'Siguiente paso',
+ addNextStep: 'Agregar el siguiente bloque en este flujo de trabajo',
+ selectNextStep: 'Seleccionar siguiente bloque',
+ runThisStep: 'Ejecutar este paso',
+ checklist: 'Lista de verificación',
+ checklistTip: 'Asegúrate de resolver todos los problemas antes de publicar',
+ checklistResolved: 'Se resolvieron todos los problemas',
+ organizeBlocks: 'Organizar bloques',
+ change: 'Cambiar',
+ },
+ nodes: {
+ common: {
+ outputVars: 'Variables de salida',
+ insertVarTip: 'Insertar variable',
+ memory: {
+ memory: 'Memoria',
+ memoryTip: 'Configuración de memoria de chat',
+ windowSize: 'Tamaño de ventana',
+ conversationRoleName: 'Nombre del rol de conversación',
+ user: 'Prefijo de usuario',
+ assistant: 'Prefijo de asistente',
+ },
+ memories: {
+ title: 'Memorias',
+ tip: 'Memoria de chat',
+ builtIn: 'Incorporada',
+ },
+ },
+ start: {
+ required: 'requerido',
+ inputField: 'Campo de entrada',
+ builtInVar: 'Variables incorporadas',
+ outputVars: {
+ query: 'Entrada del usuario',
+ memories: {
+ des: 'Historial de conversación',
+ type: 'tipo de mensaje',
+ content: 'contenido del mensaje',
+ },
+ files: 'Lista de archivos',
+ },
+ noVarTip: 'Establece las entradas que se pueden utilizar en el flujo de trabajo',
+ },
+ end: {
+ outputs: 'Salidas',
+ output: {
+ type: 'tipo de salida',
+ variable: 'variable de salida',
+ },
+ type: {
+ 'none': 'Ninguno',
+ 'plain-text': 'Texto sin formato',
+ 'structured': 'Estructurado',
+ },
+ },
+ answer: {
+ answer: 'Respuesta',
+ outputVars: 'Variables de salida',
+ },
+ llm: {
+ model: 'modelo',
+ variables: 'variables',
+ context: 'contexto',
+ contextTooltip: 'Puedes importar el conocimiento como contexto',
+ notSetContextInPromptTip: 'Para habilitar la función de contexto, completa la variable de contexto en PROMPT.',
+ prompt: 'indicación',
+ roleDescription: {
+ system: 'Proporciona instrucciones generales para la conversación',
+ user: 'Proporciona instrucciones, consultas o cualquier entrada basada en texto al modelo',
+ assistant: 'Las respuestas del modelo basadas en los mensajes del usuario',
+ },
+ addMessage: 'Agregar mensaje',
+ vision: 'visión',
+ files: 'Archivos',
+ resolution: {
+ name: 'Resolución',
+ high: 'Alta',
+ low: 'Baja',
+ },
+ outputVars: {
+ output: 'Generar contenido',
+ usage: 'Información de uso del modelo',
+ },
+ singleRun: {
+ variable: 'Variable',
+ },
+ sysQueryInUser: 'se requiere sys.query en el mensaje del usuario',
+ },
+ knowledgeRetrieval: {
+ queryVariable: 'Variable de consulta',
+ knowledge: 'Conocimiento',
+ outputVars: {
+ output: 'Datos segmentados de recuperación',
+ content: 'Contenido segmentado',
+ title: 'Título segmentado',
+ icon: 'Ícono segmentado',
+ url: 'URL segmentada',
+ metadata: 'Metadatos adicionales',
+ },
+ },
+ http: {
+ inputVars: 'Variables de entrada',
+ api: 'API',
+ apiPlaceholder: 'Ingresa la URL, escribe \'/\' para insertar una variable',
+ notStartWithHttp: 'La API debe comenzar con http:// o https://',
+ key: 'Clave',
+ value: 'Valor',
+ bulkEdit: 'Edición masiva',
+ keyValueEdit: 'Edición clave-valor',
+ headers: 'Encabezados',
+ params: 'Parámetros',
+ body: 'Cuerpo',
+ outputVars: {
+ body: 'Contenido de la respuesta',
+ statusCode: 'Código de estado de la respuesta',
+ headers: 'Lista de encabezados de respuesta en formato JSON',
+ files: 'Lista de archivos',
+ },
+ authorization: {
+ 'authorization': 'Autorización',
+ 'authorizationType': 'Tipo de autorización',
+ 'no-auth': 'Ninguna',
+ 'api-key': 'Clave de API',
+ 'auth-type': 'Tipo de autenticación',
+ 'basic': 'Básica',
+ 'bearer': 'Bearer',
+ 'custom': 'Personalizada',
+ 'api-key-title': 'Clave de API',
+ 'header': 'Encabezado',
+ },
+ insertVarPlaceholder: 'escribe \'/\' para insertar una variable',
+ timeout: {
+ title: 'Tiempo de espera',
+ connectLabel: 'Tiempo de espera de conexión',
+ connectPlaceholder: 'Ingresa el tiempo de espera de conexión en segundos',
+ readLabel: 'Tiempo de espera de lectura',
+ readPlaceholder: 'Ingresa el tiempo de espera de lectura en segundos',
+ writeLabel: 'Tiempo de espera de escritura',
+ writePlaceholder: 'Ingresa el tiempo de espera de escritura en segundos',
+ },
+ },
+ code: {
+ inputVars: 'Variables de entrada',
+ outputVars: 'Variables de salida',
+ advancedDependencies: 'Dependencias avanzadas',
+ advancedDependenciesTip: 'Agrega algunas dependencias precargadas que consumen más tiempo o no son incorporadas por defecto aquí',
+ searchDependencies: 'Buscar dependencias',
+ },
+ templateTransform: {
+ inputVars: 'Variables de entrada',
+ code: 'Código',
+ codeSupportTip: 'Solo admite Jinja2',
+ outputVars: {
+ output: 'Contenido transformado',
+ },
+ },
+ ifElse: {
+ if: 'Si',
+ else: 'Sino',
+ elseDescription: 'Se utiliza para definir la lógica que se debe ejecutar cuando no se cumple la condición del si.',
+ and: 'y',
+ or: 'o',
+ operator: 'Operador',
+ notSetVariable: 'Por favor, establece primero la variable',
+ comparisonOperator: {
+ 'contains': 'contiene',
+ 'not contains': 'no contiene',
+ 'start with': 'comienza con',
+ 'end with': 'termina con',
+ 'is': 'es',
+ 'is not': 'no es',
+ 'empty': 'está vacío',
+ 'not empty': 'no está vacío',
+ 'null': 'es nulo',
+ 'not null': 'no es nulo',
+ },
+ enterValue: 'Ingresa un valor',
+ addCondition: 'Agregar condición',
+ conditionNotSetup: 'Condición NO configurada',
+ },
+ variableAssigner: {
+ title: 'Asignar variables',
+ outputType: 'Tipo de salida',
+ varNotSet: 'Variable no establecida',
+ noVarTip: 'Agrega las variables que se asignarán',
+ type: {
+ string: 'Cadena',
+ number: 'Número',
+ object: 'Objeto',
+ array: 'Arreglo',
+ },
+ aggregationGroup: 'Grupo de agregación',
+ aggregationGroupTip: 'Al habilitar esta función, el agregador de variables puede agregar múltiples conjuntos de variables.',
+ addGroup: 'Agregar grupo',
+ outputVars: {
+ varDescribe: 'Salida de {{groupName}}',
+ },
+ setAssignVariable: 'Establecer variable asignada',
+ },
+ tool: {
+ toAuthorize: 'Para autorizar',
+ inputVars: 'Variables de entrada',
+ outputVars: {
+ text: 'Contenido generado por la herramienta',
+ files: {
+ title: 'Archivos generados por la herramienta',
+ type: 'Tipo de soporte. Ahora solo admite imágenes',
+ transfer_method: 'Método de transferencia. El valor es remote_url o local_file',
+ url: 'URL de la imagen',
+ upload_file_id: 'ID de archivo cargado',
+ },
+ json: 'JSON generado por la herramienta',
+ },
+ },
+ questionClassifiers: {
+ model: 'modelo',
+ inputVars: 'Variables de entrada',
+ outputVars: {
+ className: 'Nombre de la clase',
+ },
+ class: 'Clase',
+ classNamePlaceholder: 'Escribe el nombre de tu clase',
+ advancedSetting: 'Configuración avanzada',
+ topicName: 'Nombre del tema',
+ topicPlaceholder: 'Escribe el nombre de tu tema',
+ addClass: 'Agregar clase',
+ instruction: 'Instrucción',
+ instructionTip: 'Input additional instructions to help the question classifier better understand how to categorize questions.',
+ instructionPlaceholder: 'Write your instruction',
+ },
+ parameterExtractor: {
+ inputVar: 'Variable de entrada',
+ extractParameters: 'Extraer parámetros',
+ importFromTool: 'Importar desde herramientas',
+ addExtractParameter: 'Agregar parámetro de extracción',
+ addExtractParameterContent: {
+ name: 'Nombre',
+ namePlaceholder: 'Nombre del parámetro de extracción',
+ type: 'Tipo',
+ typePlaceholder: 'Tipo de parámetro de extracción',
+ description: 'Descripción',
+ descriptionPlaceholder: 'Descripción del parámetro de extracción',
+ required: 'Requerido',
+ requiredContent: 'El campo requerido se utiliza solo como referencia para la inferencia del modelo, y no para la validación obligatoria de la salida del parámetro.',
+ },
+ extractParametersNotSet: 'Parámetros de extracción no configurados',
+ instruction: 'Instrucción',
+ instructionTip: 'Ingrese instrucciones adicionales para ayudar al extractor de parámetros a entender cómo extraer parámetros.',
+ advancedSetting: 'Configuración avanzada',
+ reasoningMode: 'Modo de razonamiento',
+ reasoningModeTip: 'Puede elegir el modo de razonamiento apropiado basado en la capacidad del modelo para responder a instrucciones para llamadas de funciones o indicaciones.',
+ isSuccess: 'Es éxito. En caso de éxito el valor es 1, en caso de fallo el valor es 0.',
+ errorReason: 'Motivo del error',
+ },
+ iteration: {
+ deleteTitle: '¿Eliminar nodo de iteración?',
+ deleteDesc: 'Eliminar el nodo de iteración eliminará todos los nodos secundarios',
+ input: 'Entrada',
+ output: 'Variables de salida',
+ iteration_one: '{{count}} Iteración',
+ iteration_other: '{{count}} Iteraciones',
+ currentIteration: 'Iteración actual',
+ },
+ note: {
+ addNote: 'Agregar nota',
+ editor: {
+ placeholder: 'Escribe tu nota...',
+ small: 'Pequeño',
+ medium: 'Mediano',
+ large: 'Grande',
+ bold: 'Negrita',
+ italic: 'Itálica',
+ strikethrough: 'Tachado',
+ link: 'Enlace',
+ openLink: 'Abrir',
+ unlink: 'Quitar enlace',
+ enterUrl: 'Introducir URL...',
+ invalidUrl: 'URL inválida',
+ bulletList: 'Lista de viñetas',
+ showAuthor: 'Mostrar autor',
+ },
+ },
+ tracing: {
+ stopBy: 'Detenido por {{user}}',
+ },
+ },
+}
+
+export default translation
diff --git a/web/i18n/fr-FR/login.ts b/web/i18n/fr-FR/login.ts
index 71cc15f61a6a61..c905320b223a4c 100644
--- a/web/i18n/fr-FR/login.ts
+++ b/web/i18n/fr-FR/login.ts
@@ -34,6 +34,19 @@ const translation = {
donthave: 'Vous n\'avez pas ?',
invalidInvitationCode: 'Code d\'invitation invalide',
accountAlreadyInited: 'Compte déjà initialisé',
+ forgotPassword: 'Mot de passe oublié?',
+ resetLinkSent: 'Lien de réinitialisation envoyé',
+ sendResetLink: 'Envoyer le lien de réinitialisation',
+ backToSignIn: 'Retour à la connexion',
+ forgotPasswordDesc: 'Veuillez entrer votre adresse e-mail pour réinitialiser votre mot de passe. Nous vous enverrons un e-mail avec des instructions sur la réinitialisation de votre mot de passe.',
+ checkEmailForResetLink: 'Veuillez vérifier votre e-mail pour un lien de réinitialisation de votre mot de passe. S\'il n\'apparaît pas dans quelques minutes, assurez-vous de vérifier votre dossier de spam.',
+ passwordChanged: 'Connectez-vous maintenant',
+ changePassword: 'Changer le mot de passe',
+ changePasswordTip: 'Veuillez entrer un nouveau mot de passe pour votre compte',
+ invalidToken: 'Token invalide ou expiré',
+ confirmPassword: 'Confirmez le mot de passe',
+ confirmPasswordPlaceholder: 'Confirmez votre nouveau mot de passe',
+ passwordChangedTip: 'Votre mot de passe a été changé avec succès',
error: {
emailEmpty: 'Une adresse e-mail est requise',
emailInValid: 'Veuillez entrer une adresse email valide',
diff --git a/web/i18n/hi-IN/login.ts b/web/i18n/hi-IN/login.ts
index 06edd2c0888944..3ecba9a1861281 100644
--- a/web/i18n/hi-IN/login.ts
+++ b/web/i18n/hi-IN/login.ts
@@ -39,6 +39,19 @@ const translation = {
donthave: 'नहीं है?',
invalidInvitationCode: 'अवैध निमंत्रण कोड',
accountAlreadyInited: 'खाता पहले से प्रारंभ किया गया है',
+ forgotPassword: 'क्या आपने अपना पासवर्ड भूल गए हैं?',
+ resetLinkSent: 'रीसेट लिंक भेजी गई',
+ sendResetLink: 'रीसेट लिंक भेजें',
+ backToSignIn: 'साइन इन पर वापस जाएं',
+ forgotPasswordDesc: 'कृपया अपना ईमेल पता दर्ज करें ताकि हम आपको अपना पासवर्ड रीसेट करने के निर्देशों के साथ एक ईमेल भेज सकें।',
+ checkEmailForResetLink: 'कृपया अपना पासवर्ड रीसेट करने के लिए लिंक के लिए अपना ईमेल चेक करें। अगर यह कुछ मिनटों के भीतर नहीं आता है, तो कृपया अपना स्पैम फोल्डर भी चेक करें।',
+ passwordChanged: 'अब साइन इन करें',
+ changePassword: 'पासवर्ड बदलें',
+ changePasswordTip: 'कृपया अपने खाते के लिए नया पासवर्ड दर्ज करें',
+ invalidToken: 'अमान्य या समाप्त टोकन',
+ confirmPassword: 'पासवर्ड की पुष्टि करें',
+ confirmPasswordPlaceholder: 'अपना नया पासवर्ड पुष्टि करें',
+ passwordChangedTip: 'आपका पासवर्ड सफलतापूर्वक बदल दिया गया है',
error: {
emailEmpty: 'ईमेल पता आवश्यक है',
emailInValid: 'कृपया एक मान्य ईमेल पता दर्ज करें',
diff --git a/web/i18n/ja-JP/login.ts b/web/i18n/ja-JP/login.ts
index ef87dd3df6d8a2..4015bf448d4e2c 100644
--- a/web/i18n/ja-JP/login.ts
+++ b/web/i18n/ja-JP/login.ts
@@ -34,6 +34,19 @@ const translation = {
donthave: 'お持ちでない場合',
invalidInvitationCode: '無効な招待コード',
accountAlreadyInited: 'アカウントは既に初期化されています',
+ forgotPassword: 'パスワードを忘れましたか?',
+ resetLinkSent: 'リセットリンクが送信されました',
+ sendResetLink: 'リセットリンクを送信',
+ backToSignIn: 'サインインに戻る',
+ forgotPasswordDesc: 'パスワードをリセットするためにメールアドレスを入力してください。パスワードのリセット方法に関する指示が記載されたメールを送信します。',
+ checkEmailForResetLink: 'パスワードリセットリンクを確認するためにメールを確認してください。数分以内に表示されない場合は、スパムフォルダーを確認してください。',
+ passwordChanged: '今すぐサインイン',
+ changePassword: 'パスワードを変更する',
+ changePasswordTip: 'アカウントの新しいパスワードを入力してください',
+ invalidToken: '無効または期限切れのトークン',
+ confirmPassword: 'パスワードを確認',
+ confirmPasswordPlaceholder: '新しいパスワードを確認してください',
+ passwordChangedTip: 'パスワードが正常に変更されました',
error: {
emailEmpty: 'メールアドレスは必須です',
emailInValid: '有効なメールアドレスを入力してください',
diff --git a/web/i18n/ko-KR/login.ts b/web/i18n/ko-KR/login.ts
index ee0867d1dbc1b8..01d1f538fe8496 100644
--- a/web/i18n/ko-KR/login.ts
+++ b/web/i18n/ko-KR/login.ts
@@ -34,6 +34,19 @@ const translation = {
donthave: '계정이 없으신가요?',
invalidInvitationCode: '유효하지 않은 초대 코드입니다.',
accountAlreadyInited: '계정은 이미 초기화되었습니다.',
+ forgotPassword: '비밀번호를 잊으셨나요?',
+ resetLinkSent: '재설정 링크가 전송되었습니다',
+ sendResetLink: '재설정 링크 보내기',
+ backToSignIn: '로그인으로 돌아가기',
+ forgotPasswordDesc: '비밀번호를 재설정하려면 이메일 주소를 입력하세요. 비밀번호 재설정 방법에 대한 이메일을 보내드리겠습니다.',
+ checkEmailForResetLink: '비밀번호 재설정 링크를 확인하려면 이메일을 확인하세요. 몇 분 내에 나타나지 않으면 스팸 폴더를 확인하세요.',
+ passwordChanged: '지금 로그인',
+ changePassword: '비밀번호 변경',
+ changePasswordTip: '계정의 새 비밀번호를 입력하세요',
+ invalidToken: '유효하지 않거나 만료된 토큰',
+ confirmPassword: '비밀번호 확인',
+ confirmPasswordPlaceholder: '새 비밀번호를 확인하세요',
+ passwordChangedTip: '비밀번호가 성공적으로 변경되었습니다',
error: {
emailEmpty: '이메일 주소를 입력하세요.',
emailInValid: '유효한 이메일 주소를 입력하세요.',
diff --git a/web/i18n/languages.json b/web/i18n/languages.json
index 1017344471ed91..d93d163db04c2b 100644
--- a/web/i18n/languages.json
+++ b/web/i18n/languages.json
@@ -33,7 +33,7 @@
"name": "Español (España)",
"prompt_name": "Spanish",
"example": "Saluton, Dify!",
- "supported": false
+ "supported": true
},
{
"value": "fr-FR",
diff --git a/web/i18n/pl-PL/login.ts b/web/i18n/pl-PL/login.ts
index b629ee598ac191..075b79b91384fc 100644
--- a/web/i18n/pl-PL/login.ts
+++ b/web/i18n/pl-PL/login.ts
@@ -39,6 +39,19 @@ const translation = {
donthave: 'Nie masz?',
invalidInvitationCode: 'Niewłaściwy kod zaproszenia',
accountAlreadyInited: 'Konto już zainicjowane',
+ forgotPassword: 'Zapomniałeś hasła?',
+ resetLinkSent: 'Link resetujący został wysłany',
+ sendResetLink: 'Wyślij link resetujący',
+ backToSignIn: 'Powrót do logowania',
+ forgotPasswordDesc: 'Proszę podać swój adres e-mail, aby zresetować hasło. Wyślemy Ci e-mail z instrukcjami, jak zresetować hasło.',
+ checkEmailForResetLink: 'Proszę sprawdzić swój e-mail w poszukiwaniu linku do resetowania hasła. Jeśli nie pojawi się w ciągu kilku minut, sprawdź folder spam.',
+ passwordChanged: 'Zaloguj się teraz',
+ changePassword: 'Zmień hasło',
+ changePasswordTip: 'Wprowadź nowe hasło do swojego konta',
+ invalidToken: 'Nieprawidłowy lub wygasły token',
+ confirmPassword: 'Potwierdź hasło',
+ confirmPasswordPlaceholder: 'Potwierdź nowe hasło',
+ passwordChangedTip: 'Twoje hasło zostało pomyślnie zmienione',
error: {
emailEmpty: 'Adres e-mail jest wymagany',
emailInValid: 'Proszę wpisać prawidłowy adres e-mail',
diff --git a/web/i18n/pt-BR/login.ts b/web/i18n/pt-BR/login.ts
index 722c7eecf2898e..88312778c38dae 100644
--- a/web/i18n/pt-BR/login.ts
+++ b/web/i18n/pt-BR/login.ts
@@ -34,6 +34,19 @@ const translation = {
donthave: 'Não tem?',
invalidInvitationCode: 'Código de convite inválido',
accountAlreadyInited: 'Conta já iniciada',
+ forgotPassword: 'Esqueceu sua senha?',
+ resetLinkSent: 'Link de redefinição enviado',
+ sendResetLink: 'Enviar link de redefinição',
+ backToSignIn: 'Voltar para login',
+ forgotPasswordDesc: 'Por favor, insira seu endereço de e-mail para redefinir sua senha. Enviaremos um e-mail com instruções sobre como redefinir sua senha.',
+ checkEmailForResetLink: 'Verifique seu e-mail para um link para redefinir sua senha. Se não aparecer dentro de alguns minutos, verifique sua pasta de spam.',
+ passwordChanged: 'Entre agora',
+ changePassword: 'Mudar a senha',
+ changePasswordTip: 'Por favor, insira uma nova senha para sua conta',
+ invalidToken: 'Token inválido ou expirado',
+ confirmPassword: 'Confirme a Senha',
+ confirmPasswordPlaceholder: 'Confirme sua nova senha',
+ passwordChangedTip: 'Sua senha foi alterada com sucesso',
error: {
emailEmpty: 'O endereço de e-mail é obrigatório',
emailInValid: 'Digite um endereço de e-mail válido',
diff --git a/web/i18n/ro-RO/login.ts b/web/i18n/ro-RO/login.ts
index 3f22f8d169c5e5..c8a0fad91cbcee 100644
--- a/web/i18n/ro-RO/login.ts
+++ b/web/i18n/ro-RO/login.ts
@@ -35,6 +35,19 @@ const translation = {
donthave: 'Nu ai?',
invalidInvitationCode: 'Cod de invitație invalid',
accountAlreadyInited: 'Contul este deja inițializat',
+ forgotPassword: 'Ați uitat parola?',
+ resetLinkSent: 'Link de resetare trimis',
+ sendResetLink: 'Trimiteți linkul de resetare',
+ backToSignIn: 'Înapoi la autentificare',
+ forgotPasswordDesc: 'Vă rugăm să introduceți adresa de e-mail pentru a reseta parola. Vă vom trimite un e-mail cu instrucțiuni despre cum să resetați parola.',
+ checkEmailForResetLink: 'Vă rugăm să verificați e-mailul pentru un link de resetare a parolei. Dacă nu apare în câteva minute, verificați folderul de spam.',
+ passwordChanged: 'Conectează-te acum',
+ changePassword: 'Schimbă parola',
+ changePasswordTip: 'Vă rugăm să introduceți o nouă parolă pentru contul dvs',
+ invalidToken: 'Token invalid sau expirat',
+ confirmPassword: 'Confirmă parola',
+ confirmPasswordPlaceholder: 'Confirmați noua parolă',
+ passwordChangedTip: 'Parola dvs. a fost schimbată cu succes',
error: {
emailEmpty: 'Adresa de email este obligatorie',
emailInValid: 'Te rugăm să introduci o adresă de email validă',
diff --git a/web/i18n/uk-UA/login.ts b/web/i18n/uk-UA/login.ts
index 95bb7ccfea9ca8..46de22bec204e8 100644
--- a/web/i18n/uk-UA/login.ts
+++ b/web/i18n/uk-UA/login.ts
@@ -34,6 +34,19 @@ const translation = {
donthave: 'Не маєте?',
invalidInvitationCode: 'Недійсний код запрошення',
accountAlreadyInited: 'Обліковий запис уже ініціалізовано',
+ forgotPassword: 'Забули пароль?',
+ resetLinkSent: 'Посилання для скидання надіслано',
+ sendResetLink: 'Надіслати посилання для скидання',
+ backToSignIn: 'Повернутися до входу',
+ forgotPasswordDesc: 'Будь ласка, введіть свою електронну адресу, щоб скинути пароль. Ми надішлемо вам електронного листа з інструкціями щодо скидання пароля.',
+ checkEmailForResetLink: 'Будь ласка, перевірте свою електронну пошту на наявність посилання для скидання пароля. Якщо протягом кількох хвилин не з’явиться, перевірте папку зі спамом.',
+ passwordChanged: 'Увійдіть зараз',
+ changePassword: 'Змінити пароль',
+ changePasswordTip: 'Будь ласка, введіть новий пароль для свого облікового запису',
+ invalidToken: 'Недійсний або прострочений токен',
+ confirmPassword: 'Підтвердити пароль',
+ confirmPasswordPlaceholder: 'Підтвердьте новий пароль',
+ passwordChangedTip: 'Ваш пароль було успішно змінено',
error: {
emailEmpty: 'Адреса електронної пошти обов\'язкова',
emailInValid: 'Введіть дійсну адресу електронної пошти',
diff --git a/web/i18n/vi-VN/login.ts b/web/i18n/vi-VN/login.ts
index b8ae56a01756fd..1fd3e55dfe1b32 100644
--- a/web/i18n/vi-VN/login.ts
+++ b/web/i18n/vi-VN/login.ts
@@ -34,6 +34,19 @@ const translation = {
donthave: 'Chưa có?',
invalidInvitationCode: 'Mã mời không hợp lệ',
accountAlreadyInited: 'Tài khoản đã được khởi tạo',
+ forgotPassword: 'Quên mật khẩu?',
+ resetLinkSent: 'Đã gửi liên kết đặt lại mật khẩu',
+ sendResetLink: 'Gửi liên kết đặt lại mật khẩu',
+ backToSignIn: 'Quay lại đăng nhập',
+ forgotPasswordDesc: 'Vui lòng nhập địa chỉ email của bạn để đặt lại mật khẩu. Chúng tôi sẽ gửi cho bạn một email với hướng dẫn về cách đặt lại mật khẩu.',
+ checkEmailForResetLink: 'Vui lòng kiểm tra email của bạn để nhận liên kết đặt lại mật khẩu. Nếu không thấy trong vài phút, hãy kiểm tra thư mục spam.',
+ passwordChanged: 'Đăng nhập ngay',
+ changePassword: 'Đổi mật khẩu',
+ changePasswordTip: 'Vui lòng nhập mật khẩu mới cho tài khoản của bạn',
+ invalidToken: 'Mã thông báo không hợp lệ hoặc đã hết hạn',
+ confirmPassword: 'Xác nhận mật khẩu',
+ confirmPasswordPlaceholder: 'Xác nhận mật khẩu mới của bạn',
+ passwordChangedTip: 'Mật khẩu của bạn đã được thay đổi thành công',
error: {
emailEmpty: 'Địa chỉ Email là bắt buộc',
emailInValid: 'Vui lòng nhập một địa chỉ email hợp lệ',
diff --git a/web/i18n/zh-Hans/login.ts b/web/i18n/zh-Hans/login.ts
index 10c5ee44976c48..5ac9b9fcb42a88 100644
--- a/web/i18n/zh-Hans/login.ts
+++ b/web/i18n/zh-Hans/login.ts
@@ -34,6 +34,19 @@ const translation = {
donthave: '还没有邀请码?',
invalidInvitationCode: '无效的邀请码',
accountAlreadyInited: '账户已经初始化',
+ forgotPassword: '忘记密码?',
+ resetLinkSent: '重置链接已发送',
+ sendResetLink: '发送重置链接',
+ backToSignIn: '返回登录',
+ forgotPasswordDesc: '请输入您的电子邮件地址以重置密码。我们将向您发送一封电子邮件,包含如何重置密码的说明。',
+ checkEmailForResetLink: '请检查您的电子邮件以获取重置密码的链接。如果几分钟内没有收到,请检查您的垃圾邮件文件夹。',
+ passwordChanged: '立即登录',
+ changePassword: '更改密码',
+ changePasswordTip: '请输入您的新密码',
+ invalidToken: '无效或已过期的令牌',
+ confirmPassword: '确认密码',
+ confirmPasswordPlaceholder: '确认您的新密码',
+ passwordChangedTip: '您的密码已成功更改',
error: {
emailEmpty: '邮箱不能为空',
emailInValid: '请输入有效的邮箱地址',
diff --git a/web/i18n/zh-Hans/workflow.ts b/web/i18n/zh-Hans/workflow.ts
index fe38904e5b7b60..a71b22c8e0720b 100644
--- a/web/i18n/zh-Hans/workflow.ts
+++ b/web/i18n/zh-Hans/workflow.ts
@@ -396,6 +396,7 @@ const translation = {
url: '图片链接',
upload_file_id: '上传文件ID',
},
+ json: '工具生成的json',
},
},
questionClassifiers: {
diff --git a/web/i18n/zh-Hant/login.ts b/web/i18n/zh-Hant/login.ts
index 3b8a986fd01e20..cce869f38a38c4 100644
--- a/web/i18n/zh-Hant/login.ts
+++ b/web/i18n/zh-Hant/login.ts
@@ -34,6 +34,19 @@ const translation = {
donthave: '還沒有邀請碼?',
invalidInvitationCode: '無效的邀請碼',
accountAlreadyInited: '賬戶已經初始化',
+ forgotPassword: '忘記密碼?',
+ resetLinkSent: '重設連結已發送',
+ sendResetLink: '發送重設連結',
+ backToSignIn: '返回登錄',
+ forgotPasswordDesc: '請輸入您的電子郵件地址以重設密碼。我們將向您發送一封電子郵件,說明如何重設密碼。',
+ checkEmailForResetLink: '請檢查您的電子郵件以獲取重設密碼的連結。如果幾分鐘內沒有收到,請檢查您的垃圾郵件文件夾。',
+ passwordChanged: '立即登入',
+ changePassword: '更改密碼',
+ changePasswordTip: '請輸入您的新密碼',
+ invalidToken: '無效或已過期的令牌',
+ confirmPassword: '確認密碼',
+ confirmPasswordPlaceholder: '確認您的新密碼',
+ passwordChangedTip: '您的密碼已成功更改',
error: {
emailEmpty: '郵箱不能為空',
emailInValid: '請輸入有效的郵箱地址',
diff --git a/web/service/common.ts b/web/service/common.ts
index a68aeb2256391b..3fbcde2a2ab3bd 100644
--- a/web/service/common.ts
+++ b/web/service/common.ts
@@ -298,3 +298,13 @@ export const enableModel = (url: string, body: { model: string; model_type: Mode
export const disableModel = (url: string, body: { model: string; model_type: ModelTypeEnum }) =>
patch(url, { body })
+
+export const sendForgotPasswordEmail: Fetcher = ({ url, body }) =>
+ post(url, { body })
+
+export const verifyForgotPasswordToken: Fetcher = ({ url, body }) => {
+ return post(url, { body }) as Promise
+}
+
+export const changePasswordWithToken: Fetcher = ({ url, body }) =>
+ post(url, { body })