Presupuestador_web/client/src/locales/es.json
David Arranz bc34a073ad feat: implement MariaDB integration testing suite and related fixtures
- Updated `capitulos-esquema.md` to reflect the current state of models and integration testing setup.
- Added `jest.mariadb.config.js` for MariaDB specific test configurations.
- Introduced `mariadb.fixture.mock.ts` to handle isolated MariaDB connections for testing.
- Created integration tests for quote chapters in `quoteChapters.mariadb.test.ts` to validate business logic against MariaDB.
- Implemented `mariadbSafety.test.ts` to ensure safety checks and error handling during integration tests.
- Added `useChapterCollapse.ts` hook for managing chapter collapse animations in the client.
- Introduced `empty.tsx` components for consistent empty state UI across the application.
- Updated `jest.config.js` to ignore MariaDB test files in the standard test run.
- Enhanced `package.json` with a new script for running MariaDB tests.
2026-10-19 16:38:44 +02:00

646 lines
24 KiB
JSON

{
"translation": {
"app_update": {
"available": "Hay una nueva versión disponible.",
"load_error": "No se ha podido cargar una parte de la aplicación. Recarga para volver a intentarlo.",
"save_first": "Guarda los cambios pendientes antes de recargar.",
"reload": "Recargar"
},
"common": {
"required": "obligatorio",
"cancel": "Cancelar",
"no": "No",
"yes": "Sí",
"save": "Guardar",
"save_close": "Guardar y Cerrar",
"discard": "Descartar",
"hide": "Ocultar",
"back": "Volver",
"upload": "Cargar",
"continue": "Continuar",
"close": "Cerrar",
"more": "More",
"pagination": "Paginación",
"breadcrumb": "Migas de pan",
"previous": "Anterior",
"next": "Siguiente",
"more_pages": "Más páginas",
"previous_slide": "Diapositiva anterior",
"next_slide": "Diapositiva siguiente",
"add": "Añadir",
"submit": "Enviar",
"download": "Descargar",
"help": "Ayuda",
"select_all": "Seleccionar todo",
"select_row": "Seleccionar fila",
"sort_asc": "Asc",
"sort_asc_description": "En order ascendente. Click para ordenar descendentemente.",
"sort_desc": "Desc",
"sort_desc_description": "En orden descendente. Click para ordenar ascendentemente.",
"sort_none_description": "Sin orden. Click para ordenar ascendentemente.",
"rows_selected": "{{count}} fila(s) seleccionadas.",
"rows_selected_of_total": "{{count}} de {{total}} fila(s) seleccionadas.",
"rows_per_page": "Filas por página",
"num_page_of_total": "Página {{count}} de {{total}}",
"go_to_first_page": "Ir a la primera página",
"go_to_prev_page": "Ir a la página anterior",
"go_to_next_page": "Ir a la página siguiente",
"go_to_last_page": "Ir a la última página",
"error": "Error",
"actions": "Acciones",
"open_menu": "Abrir el menú",
"duplicate_row": "Duplicar",
"duplicate_selected_rows": "Duplicar",
"duplicate_selected_rows_tooltip": "Duplica las fila(s) seleccionadas(s)",
"append_empty_row": "Añadir fila",
"append_empty_row_tooltip": "Añadir una fila vacía",
"append_article": "Añadir artículo",
"append_article_tooltip": "Elegir un artículo del catálogo y añadirlo",
"append_block": "Añadir bloque de texto",
"append_block_tooltip": "Elegir un bloque de texto y añadirlo",
"move_row": "Mover fila",
"remove_row": "Eliminar",
"remove_selected_rows": "Eliminar",
"remove_selected_rows_tooltip": "Elimina las fila(s) seleccionadas(s)",
"reset_selected_rows": "Quitar selection",
"reset_selected_rows_tooltip": "Dejar de seleccionar la(s) fila(s)",
"insert_row_above": "Insertar fila encima",
"insert_row_below": "Insertar fila debajo",
"pick_date": "Elige una fecha",
"today": "Hoy",
"required_field": "Este campo es obligatorio",
"edit": "Editar",
"remove": "Eliminar",
"archive": "Archivar",
"duplicate": "Duplicar",
"disable_preview": "Ocultar vista previa",
"enable_preview": "Mostrar vista previa",
"filter": {
"reset_filter": "Quitar el filtro",
"badget_remove_tooltip": "Quitar este término del filtro",
"input_placeholder": "Escribe aquí para filtrar...",
"button_add_term": "Añadir término al filtro",
"button_add_term_tooltip": "Añadir término al filtro (o pulsa Enter)",
"help_text": "Presiona Enter o haz clic en el botón + para añadir un término al filtro. Usa múltiples términos para una búsqueda más amplia."
},
"company": "Compañía",
"phone": "Teléfono",
"name": "Nombre",
"identifier": "Identificador",
"confirmation": "Confirmación",
"product_image": "Imagen del producto"
},
"components": {
"loading_indicator": {
"title": "Cargando..."
},
"loading_overlay": {
"title": "Cargando...",
"subtitle": "Esto puede tardar unos segundos. Por favor, no cierre esta página."
},
"error_overlay": {
"title": "Se ha producido un error",
"go_home": "Ir al inicio"
},
"empty_state": {
"title": "Esto está muy vacío",
"subtitle": "Empieza solicitando la carga del catálogo",
"button": "Solicitar carga del catálogo"
},
"data_table": {
"columns": "Columnas",
"no_results": "No se han encontrado resultados.",
"clear_filters": "Limpiar filtros",
"selected_count": "{{count}} seleccionados"
},
"sortable_data_table": {
"snooze": "Posponer",
"snooze_until": "Posponer hasta",
"later_today": "Más tarde hoy",
"tomorrow": "Mañana",
"this_weekend": "Este fin de semana",
"next_week": "La próxima semana",
"reply": "Responder",
"reply_all": "Responder a todos",
"forward": "Reenviar"
}
},
"hooks": {
"use_unsaved_changes_notifier": {
"title": "Se han detectado cambios",
"subtitle": "Atención, hay cambios pendientes de guardar en esta página.\nSi continúa, perderá los cambios.",
"confirm_text": "Continuar",
"cancel_text": "No continuar"
}
},
"main_menu": {
"toggle_navigation": "Alternar el menú de navegación",
"settings": "Ajustes",
"catalog": "Catálogo",
"quotes": "Cotizaciones",
"search_placeholder": "Buscar productos, cotizaciones, etc...",
"user": {
"user_menu": "Menú del usuario",
"my_account": "Mi cuenta",
"profile": "Perfil",
"settings": "Ajustes",
"support": "Soporte",
"logout": "Salir"
},
"logout_dialog": {
"title": "Salir de la cuenta",
"description": "¿Desea salir de su cuenta?",
"confirm_label": "Salir",
"cancel_label": "Cancelar"
}
},
"login_page": {
"title": "Presupuestador para distribuidores",
"description": "Introduzca su dirección de correo electrónico y contraseña para acceder",
"email_label": "Email",
"email_placeholder": "micorreo@ejemplo.com",
"password_label": "Contraseña",
"forgotten_password": "¿Has olvidado tu contraseña?",
"become_dealer": "¿Quieres ser distribuidor de Uecko?",
"contact_us": "Contacta con nosotros",
"login": "Entrar",
"invalid_credentials": "El correo electrónico o la contraseña no son correctos.",
"validation": {
"email_required": "El correo electrónico es obligatorio.",
"email_invalid": "Introduce un correo electrónico válido.",
"password_required": "La contraseña es obligatoria.",
"password_min": "La contraseña debe tener al menos {{count}} caracteres.",
"password_alphanum": "La contraseña solo puede contener letras y números."
}
},
"dashboard": {
"welcome": "Bienvenido"
},
"catalog": {
"list": {
"title": "Catálogo de artículos",
"empty_state": {
"subtitle": "Empieza cargando los artículos del catálogo"
},
"columns": {
"description": "Descripción",
"points": "Puntos",
"retail_price": "PVP",
"quantity": "Cantidad"
}
}
},
"quotes": {
"list": {
"title": "Cotizaciones",
"subtitle": "",
"tabs_title": "Estados",
"select_status": "Seleccionar estado",
"preview_aria": "Mostrar vista previa de la cotización",
"empty_state": {
"subtitle": "Empieza creando alguna cotización"
},
"status_help": {
"title": "Ayuda sobre el estado de las cotizaciones",
"intro": "El estado de una cotización indica su posición actual en el proceso de negocio.",
"possible": "Los estados posibles son:",
"outro": "Utiliza estos estados para hacer un seguimiento eficiente de tus cotizaciones y optimizar tu proceso de ventas. El estado Archivado ayuda a conservar el historial sin interferir con las cotizaciones activas."
},
"tabs": {
"all": "Todas",
"draft": "Borradores",
"ready": "Preparados",
"delivered": "Entregado",
"accepted": "Aceptados",
"rejected": "Rechazados",
"archived": "Archivados"
},
"columns": {
"date": "Fecha",
"date_sent": "Enviado a Uecko",
"reference": "Referencia",
"status": "Estado",
"customer_reference": "Ref. cliente",
"customer_information": "Cliente",
"total_price": "Imp. total"
},
"resume": {
"title": "Cotización",
"tabs": {
"resume": "Resumen",
"preview": "Previsualización"
},
"quote_information": "Información",
"customer_information": "Cliente",
"price_information": "Importes",
"select_quote": "Selecciona una cotización"
}
},
"notifications": {
"created": "Cotización creada",
"saved": "Cotización guardada",
"saving": "Guardando cotización"
},
"pdf_generation": {
"title": "Generando PDF",
"error": "Error al generar el PDF",
"progress": "Progreso: {{percentage}}%",
"elapsed": "Tiempo transcurrido: {{elapsed}} segundos",
"remaining": "Tiempo estimado restante: {{estimatedTime}} segundos",
"cancel": "Cancelar generación"
},
"create": {
"title": "Nueva cotización",
"form_groups": {
"general": {
"title": "Datos generales",
"desc": "Datos generales y cliente al que va la cotización"
},
"status": {
"title": "Estado",
"desc": "Estado de la cotización"
},
"documents": {
"title": "Documentos",
"desc": "Añada adjuntar con su cotización documentos como fotos, planos, croquis, etc.",
"images": "Imágenes"
}
}
},
"edit": {
"title": "Cotización",
"buttons": {
"save_quote": "Guardar cotización"
}
},
"duplicate_action": {
"toast_success": "Cotización duplicada"
},
"downloading_dialog": {
"title": "Descargando cotización",
"description": "Espere mientras se genera la cotización y se descarga en formato PDF...",
"progress": {
"label": "La descarga está {{status}}",
"status_in_progress": "en marcha",
"status_stopped": "parada"
},
"cancel_button": "Cancelar la descarga",
"toast_success": "Cotización descargada",
"error": "No se ha podido descargar el presupuesto. Vuelve a intentarlo."
},
"catalog_picker_dialog": {
"title": "Seleccionar artículos del catálogo",
"description": "Para rellenar su cotización, puede añadir artículos del catálogo.",
"toast_article_added": "Artículo del catálogo añadido:"
},
"blocks_picker_dialog": {
"title": "Selecctionar bloques de texto",
"description": "Para ayudar a rellenar la cotización, puede añadir bloques de texto predefinidos de esta lista.",
"toast_article_added": "Bloque de texto añadido:"
},
"quote_sent_to_editor": {
"trigger_button": "Enviar a Uecko",
"title": "Enviar la cotización a Uecko",
"description": "¿Desea enviar esta cotización a Uecko? Esta acción no se puede deshacer.",
"toast_status_changed": "Cotización enviada a Uecko"
},
"quote_status_editor": {
"trigger_button": "Cambiar el estado",
"title": "Cambiar el estado de la cotización",
"status": {
"draft": {
"title": "Borrador",
"description": "La cotización está en fase inicial de creación."
},
"ready": {
"title": "Preparado",
"description": "La cotización está completo y listo para ser entregado al cliente."
},
"delivered": {
"title": "Entregado",
"description": "La cotización ha sido enviado al cliente y se espera su respuesta."
},
"accepted": {
"title": "Aceptado",
"description": "El cliente ha aprobado la cotización."
},
"rejected": {
"title": "Rechazado",
"description": "El cliente no ha aceptado la cotización."
},
"archived": {
"title": "Archivado",
"description": "La cotización se ha guardado para referencia futura."
}
},
"submit_button": "Cambiar estado",
"toast_status_changed": "Estado de la cotización cambiado a: {{newStatus}}"
},
"discount_column": {
"label": "Mostrar columna descuento",
"description": "Muestra u oculta la columna de descuento en las líneas.",
"confirmation": {
"title": "Ocultar descuentos de línea",
"description": "Hay líneas con descuento aplicado. Ocultar la columna no eliminará esos descuentos: seguirán afectando al importe de la cotización, pero dejarán de mostrarse en las líneas y en el PDF.",
"confirm": "Ocultar columna"
}
},
"additional_currency": {
"title": "Moneda adicional",
"description": "Muestra el total del presupuesto en otra moneda de forma opcional.",
"enabled": "Mostrar en otra moneda",
"currency": "Moneda",
"date": "Fecha de cambio",
"rate": "Tipo de cambio (1 EUR = …)",
"refresh": "Refrescar cambio",
"total": "Total en {{code}}"
},
"inline_row_actions": {
"delete_confirmation": {
"title": "Eliminar fila",
"description": "¿Seguro que quieres eliminar esta fila? Esta acción no se puede deshacer.",
"confirm": "Eliminar fila"
}
},
"status": {
"draft": "Borrador",
"ready": "Preparado",
"delivered": "Entregado",
"accepted": "Aceptado",
"rejected": "Rechazado",
"archived": "Archivado"
},
"form_fields": {
"date": {
"label": "Fecha",
"desc": "Fecha de esta cotización",
"placeholder": ""
},
"reference": {
"label": "Referencia",
"desc": "Referencia para esta cotización",
"placeholder": ""
},
"lang_code": {
"label": "Idioma del documento",
"desc": "Idioma utilizado para generar el presupuesto en PDF",
"placeholder": "",
"options": {
"es": "Español",
"en": "Inglés",
"fr": "Francés"
}
},
"currency_code": {
"label": "Moneda",
"desc": "Moneda de la cotización",
"placeholder": ""
},
"customer_reference": {
"label": "Referencia del cliente",
"desc": "Referencia para el cliente de esta cotización",
"placeholder": ""
},
"customer_information": {
"label": "Datos del cliente",
"desc": "Recomensación: escriba el nombre del cliente en la primera línea, la direccion en la segunda y el código postal y ciudad en la tercera.",
"placeholder": "Nombre y apellidos\nCalle y número\nCódigo postal y ciudad..."
},
"payment_method": {
"label": "Forma de pago",
"placeholder": "",
"desc": "Forma de pago que se utilizará en esta cotización"
},
"notes": {
"label": "Notas",
"placeholder": "",
"desc": "Notas a incluir en la cotización"
},
"validity": {
"label": "Validez de la cotización",
"placeholder": "",
"desc": "Validez de la cotización"
},
"subtotal_price": {
"label": "Importe neto",
"placeholder": "",
"desc": "Subtotal del presupuesto"
},
"discount": {
"label": "Descuento (%)",
"placeholder": "",
"desc": "Porcentaje de descuento"
},
"discount_value": {
"label": "Descuento ({{value}}%)",
"placeholder": "",
"desc": "Porcentaje de descuento"
},
"discount_price": {
"label": "Imp. descuento",
"placeholder": "",
"desc": "Importe del descuento"
},
"before_tax_price": {
"label": "Base imponible",
"placeholder": "",
"desc": "Base imponible"
},
"tax": {
"label": "Impuesto (%)",
"placeholder": "",
"desc": "Porcentaje de impuesto"
},
"tax_value": {
"label": "{{label}} ({{value}}%)",
"placeholder": "",
"desc": "Porcentaje de impuesto"
},
"tax_price": {
"label": "Imp. impuesto",
"placeholder": "",
"desc": "Importe del impuesto"
},
"total_price": {
"label": "Imp. total",
"placeholder": "",
"desc": "Importe total"
},
"items": {
"quantity": {
"label": "Cantidad",
"placeholder": "",
"desc": ""
},
"description": {
"label": "Descripción",
"placeholder": "",
"desc": ""
},
"unit_price": {
"label": "Imp. unitario",
"placeholder": "",
"desc": "Importe unitario del artículo"
},
"subtotal_price": {
"label": "Subtotal",
"placeholder": "",
"desc": ""
},
"discount": {
"label": "Dto (%)",
"placeholder": "",
"desc": "Porcentaje de descuento"
},
"total_price": {
"label": "Imp. total",
"placeholder": "",
"desc": "Importe total con el descuento ya aplicado"
}
}
},
"chapters": {
"add": "Añadir capítulo",
"create_description": "Al crear el primer capítulo se agruparán todos los detalles existentes.",
"description": "Descripción",
"title": "Título del capítulo {{number}}",
"title_required": "La descripción del capítulo es obligatoria.",
"select": "Seleccionar capítulo {{number}}",
"move": "Mover capítulo {{number}}",
"collapse": "Plegar capítulo {{number}}",
"expand": "Desplegar capítulo {{number}}",
"duplicate": "Duplicar capítulo {{number}}",
"remove": "Eliminar capítulo {{number}}",
"subtotal": "Subtotal capítulo {{number}}. {{description}}",
"empty_title": "Este capítulo no tiene detalles",
"empty": "Añade una fila, artículos o un bloque de texto, o arrastra detalles aquí.",
"select_details": "Seleccionar los detalles del capítulo {{number}}",
"show_amounts": "Mostrar importes de los detalles en el PDF",
"mixed_selection": "Para mover la selección, selecciona solo capítulos o solo detalles.",
"drag_instructions": "Pulsa espacio para iniciar el movimiento, usa las flechas arriba y abajo y vuelve a pulsar espacio para soltar. Escape cancela.",
"drag_start": "Movimiento iniciado.",
"drag_over": "Destino de movimiento actualizado.",
"drag_end": "Movimiento finalizado.",
"drag_cancel": "Movimiento cancelado.",
"delete_title": "Eliminar selección",
"delete_description": "La selección afecta a {{chapters}} capítulos y {{details}} detalles. Puedes eliminar el contenido o conservarlo cuando se quite un capítulo.",
"destination": "Capítulo de destino",
"transfer": "Trasladar y conservar detalles",
"ungroup": "Quitar todos los capítulos",
"ungroup_keep": "Quitar capítulos y conservar detalles",
"delete_content": "Eliminar contenido seleccionado",
"ungroup_description": "Se quitarán todos los capítulos. Se conservarán los detalles, sus importes y su orden."
}
},
"settings": {
"edit": {
"title": "Ajustes",
"tabs": {
"profile": "Ajustes de perfil",
"quotes": "Ajustes para cotizaciones",
"legal": "Ajustes legales"
}
},
"form_fields": {
"language": {
"label": "Idioma",
"placeholder": "Selecciona un idioma",
"desc": "Idioma preferido para la interfaz",
"options": {
"es": "Español",
"en": "Inglés",
"fr": "Francés"
}
},
"logo": {
"label": "Logotipo",
"desc": "Este logotipo aparecerá en las propuestas exportadas en PDF",
"requirements": "Se permiten ficheros JPG o PNG. Las dimensiones del logotipo deben ser 200x100 píxeles o proporcionales.",
"upload": "Subir logotipo",
"invalid_format": "Sólo se permiten ficheros JPG o PNG",
"invalid_dimensions": "Las dimensiones del logotipo deben ser 200x100 píxeles o proporcionales."
},
"contact_information": {
"label": "Información de contacto",
"placeholder": "",
"desc": "Esta información de contacto aparecerá en las cotizaciones que entregue a sus clientes."
},
"default_tax": {
"label": "Impuesto por defecto (%)",
"placeholder": "",
"desc": "Porcentaje de impuesto por defecto en las cotizaciones"
},
"default_tax_label": {
"placeholder": "% IVA",
"desc": "Nombre o etiqueta que se mostrará junto al impuesto"
},
"default_show_line_discount_column": {
"label": "Mostrar columna descuento por defecto",
"desc": "Los nuevos presupuestos mostrarán inicialmente la columna de descuento en las líneas. Podrás cambiar esta opción posteriormente en cada presupuesto."
},
"default_legal_terms": {
"label": "Cláusulas legales",
"placeholder": "",
"desc": "Texto de texto legal que desee incluir en todas las cotizaciones nuevas"
},
"default_payment_method": {
"label": "Forma de pago",
"placeholder": "",
"desc": "Texto para la forma de pago que se utilizará en las cotizaciones nuevas"
},
"default_notes": {
"label": "Notas",
"placeholder": "",
"desc": "Notas a incluir en todas las cotizaciones nuevas"
},
"default_quote_validity": {
"label": "Validez por defecto",
"placeholder": "",
"desc": "Texto para indicar el tiempo de validez de la cotización"
}
},
"notifications": {
"saved": "Ajustes guardados",
"saving": "Guardando ajustes"
}
},
"support": {
"modal": {
"title": "Enviar una incidencia",
"subtitle": "Utiliza este formulario para informar sobre cualquier problema que hayas encontrado mientras usabas la aplicación. Nuestro equipo de desarrollo revisará tu incidencia y tratará de resolverla.",
"open": "Abrir ventana de soporte",
"placeholder": "Describe la incidencia aquí...",
"submit": "Enviar incidencia",
"validation": {
"empty": "Debe escribir algo antes de enviar",
"min": "El texto es demasiado corto. Debe tener al menos 10 caracteres",
"max": "El texto es demasiado largo.",
"required": "La descripción es requerida"
},
"notifications": {
"sent_title": "Incidencia enviada",
"sent_description": "La incidencia se ha enviado correctamente",
"error_title": "Error en el envío",
"error_description": "No se ha podido enviar la incidencia correctamente. Por favor, inténtalo de nuevo."
},
"cancel_confirmation": {
"title": "¿Estás seguro de que quieres cancelar?",
"description": "Has escrito texto en el campo de descripción. Si cierras la ventana, perderás los cambios no guardados.",
"back": "Volver al formulario",
"confirm": "Sí, cerrar"
}
},
"form_fields": {}
},
"app": {
"title": "Presupuestador Uecko",
"javascript_required": "Necesitas activar JavaScript para utilizar esta aplicación."
},
"error_page": {
"title": "Página no encontrada",
"description": "La página que buscas no existe o se ha movido.",
"go_home": "Ir al inicio"
}
}
}