Files
opensourcepos/app/Language/es-ES/Config.php
Ollama 8da4aff262 fix(security): prevent command injection in sendmail path configuration
Add validation for the mailpath POST parameter to prevent command injection
attacks. The path is validated to only allow alphanumeric characters,
underscores, dashes, forward slashes, and dots.

- Required mailpath when protocol is "sendmail"
- Validates format for all non-empty mailpath values
- Blocks common injection vectors: ; | & ` $() spaces newlines
- Added mailpath_invalid translation to all 43 language files
- Simplified validation logic to avoid redundant conditions

Files changed:
- app/Controllers/Config.php: Add regex validation with protocol check
- app/Language/*/Config.php: Add mailpath_invalid error message (43 languages)
- tests/Controllers/ConfigTest.php: Unit tests for validation
2026-04-06 18:37:07 +00:00

333 lines
27 KiB
PHP

<?php
return [
"address" => "Dirección del Comercio",
"address_required" => "Dirección del Comercio es requerida.",
"all_set" => "¡Todos los permisos de archivo están configurados correctamente!",
"allow_duplicate_barcodes" => "Permitir código barras duplicados",
"apostrophe" => "apostrofe",
"backup_button" => "Respaldo",
"backup_database" => "Respaldo de Base de Datos",
"barcode" => "Código Barras",
"barcode_company" => "Nombre del Comercio",
"barcode_configuration" => "Configuración de Código de Barras",
"barcode_content" => "Contenido de Código de Barras",
"barcode_first_row" => "Fila 1",
"barcode_font" => "Fuente",
"barcode_formats" => "Formato entrada",
"barcode_generate_if_empty" => "Generar si esta vacio.",
"barcode_height" => "Alto (px)",
"barcode_id" => "Id/Artículo",
"barcode_info" => "Información de Configuración de Código de Barras",
"barcode_layout" => "Diseño Código de Barras",
"barcode_name" => "Nombre",
"barcode_number" => "UPC/EAN/ISBN",
"barcode_number_in_row" => "Número en la línea",
"barcode_page_cellspacing" => "Mostrar espacios de celdas de página.",
"barcode_page_width" => "Mostrar ancho de página",
"barcode_price" => "Precio",
"barcode_second_row" => "Fila 2",
"barcode_third_row" => "Fila 3",
"barcode_tooltip" => "Cuidado: esta característica puede causar duplicados ser importados o creados, No lo use si no quiere códigos de barras duplicadas.",
"barcode_type" => "Tipo de Código de Barra",
"barcode_width" => "Ancho (px)",
"bottom" => "Abajo",
"cash_button" => "Botones de Efectivo Rápido",
"cash_button_1" => "Botón 1",
"cash_button_2" => "Botón 2",
"cash_button_3" => "Botón 3",
"cash_button_4" => "Botón 4",
"cash_button_5" => "Botón 5",
"cash_button_6" => "Botón 6",
"cash_decimals" => "Decimales del Efectivo",
"cash_decimals_tooltip" => "Si los decimales del efectivo y del tipo de moneda son los mismos no habrá redondeo de los pagos en efectivo.",
"cash_rounding" => "Redondeo del Efectivo",
"category_dropdown" => "Mostrar Categoria como desplegable",
"center" => "Centro",
"change_apperance_tooltip" => "Cambiar Aspecto de OSPOS",
"comma" => "coma",
"company" => "Nombre del Comercio",
"company_avatar" => "Avatar de Empleado",
"company_change_image" => "Cambiar Imagen",
"company_logo" => "Logotipo del Comercio",
"company_remove_image" => "Quitar Imagen",
"company_required" => "Nombre del Comercio es requerido",
"company_select_image" => "Seleccionar Imagen",
"company_website_url" => "Sitio Web no es una URL estándar (http://...).",
"country_codes" => "Código de País",
"country_codes_tooltip" => "Lista de codigo de paises separado por coma para busqueda de direcciones.",
"currency_code" => "Código de Moneda",
"currency_decimals" => "Decimales del tipo de moneda",
"currency_symbol" => "Símbolo de la moneda",
"current_employee_only" => "Mostrar registro sólo del empleado actual",
"customer_reward" => "Cat. de Cliente",
"customer_reward_duplicate" => "La recompensa debe ser única.",
"customer_reward_enable" => "Activar recompenza para clientes",
"customer_reward_invalid_chars" => "El nombre de la recompenza no puede contener el carácter '_'",
"customer_reward_required" => "El nombre es un campo obligatorio",
"customer_sales_tax_support" => "Habilitar la gestión de impuestos en las ventas a clientes",
"date_or_time_format" => "Filtro de fecha y hora",
"datetimeformat" => "Formato de fecha y hora",
"decimal_point" => "Punto Decimal",
"default_barcode_font_size_number" => "Tamaño de fuente de código de barras debe ser número.",
"default_barcode_font_size_required" => "Tamaño de fuente de código de barras es requerido.",
"default_barcode_height_number" => "Alto del código de barras debe ser un número.",
"default_barcode_height_required" => "Altura del código de barras es requerido.",
"default_barcode_num_in_row_number" => "Número por fila del código de barras debe ser un número.",
"default_barcode_num_in_row_required" => "Número de código de barras predeterminado en fila es un campo obligatorio.",
"default_barcode_page_cellspacing_number" => "Espacios de celdas por página del código de barras debe ser un número.",
"default_barcode_page_cellspacing_required" => "Espacios de celdas por página del código de barras es requerido.",
"default_barcode_page_width_number" => "Ancho de página del código de barras debe ser un número.",
"default_barcode_page_width_required" => "Ancho de página del código de barras es requerido.",
"default_barcode_width_number" => "Ancho del código de barras debe ser número.",
"default_barcode_width_required" => "Ancho del código de barras es requerido.",
"default_item_columns" => "Columnas de Productos Visibles por Defecto",
"default_origin_tax_code" => "Código de impuesto por defecto",
"default_receivings_discount" => "Descuento por Defecto para Recibos",
"default_receivings_discount_number" => "El Descuento por Defecto Para Los Recibos Debe Ser Un Número.",
"default_receivings_discount_required" => "El Descuento Predeterminado para los Recibos es un campo obligatorio.",
"default_sales_discount" => "Descuento Predeterminado para Ventas",
"default_sales_discount_number" => "Descuento en ventas predeterminado debe ser un número.",
"default_sales_discount_required" => "Descuento en ventas predeterminado es requerido.",
"default_tax_category" => "Categoría de Tasa predeterminada",
"default_tax_code" => "Código de Impuesto Predeterminado",
"default_tax_jurisdiction" => "Jurisdicción de Impuesto Predeterminado",
"default_tax_name_number" => "El nombre de el impuesto debe ser letras.",
"default_tax_name_required" => "El nombre del impuesto predeterminado es requerido.",
"default_tax_rate" => "% de Impuestos Predeterminado",
"default_tax_rate_1" => "Impuesto 1",
"default_tax_rate_2" => "Impuesto 2",
"default_tax_rate_3" => "Tasa de Impuestos 3",
"default_tax_rate_number" => "El Impuesto Predeterminado debe ser un número.",
"default_tax_rate_required" => "El Impuesto Predeterminado es requerido.",
"derive_sale_quantity" => "Permitir cantidad de venta derivada",
"derive_sale_quantity_tooltip" => "Si se marca entonces se proporcionará un nuevo tipo para los artículos ordenados por cantidad extendida",
"dinner_table" => "Mesa",
"dinner_table_duplicate" => "Utilice un nombre de mesa único.",
"dinner_table_enable" => "Activar Mesa de Restaurante",
"dinner_table_invalid_chars" => "El nombre de la mesa no puede contener '_'.",
"dinner_table_required" => "La mesa es un campo obligatorio.",
"dot" => "punto",
"email" => "E-mail",
"email_configuration" => "Configuracion de correo",
"email_mailpath" => "Ruta a Sendmail",
"email_protocol" => "Protocolo",
"email_receipt_check_behaviour" => "Selector de Recibir por Correo",
"email_receipt_check_behaviour_always" => "Siempre activado",
"email_receipt_check_behaviour_last" => "Recordar ultima vez",
"email_receipt_check_behaviour_never" => "Siempre desactivado",
"email_smtp_crypto" => "Encriptado SMTP",
"email_smtp_host" => "Servidor SMTP",
"email_smtp_pass" => "Pasword SMTP",
"email_smtp_port" => "Puerto SMTP",
"email_smtp_timeout" => "Tiempo falla SMTP",
"email_smtp_user" => "Usuario SMTP",
"enable_avatar" => "Habilitar Avatar",
"enable_avatar_tooltip" => "Habilitar Avatares para que se muestren en el menú desplegable Categorías y Registrarse ",
"enable_dropdown_tooltip" => "No podrá agregar nuevas categorías si esto está marcado",
"enable_new_look" => "Habilitar nueva apariencia",
"enable_right_bar" => " Habilitar la barra lateral derecha",
"enable_right_bar_tooltip" => "Cambiar la barra lateral de izquierda a derecha ",
"enforce_privacy" => "Forzar privacidad",
"enforce_privacy_tooltip" => "Proteja la privacidad de los clientes aplicando codificación de datos en caso de que se eliminen",
"fax" => "Fax",
"file_perm" => "Hay problemas con los permisos de archivo. Por favor corrija y vuelva a recargar esta página.",
"financial_year" => "Inicio del año fiscal",
"financial_year_apr" => "1º de Abril",
"financial_year_aug" => "1º de Agosto",
"financial_year_dec" => "1º de Diciembre",
"financial_year_feb" => "1º de Febrero",
"financial_year_jan" => "1º de Enero",
"financial_year_jul" => "1º de Julio",
"financial_year_jun" => "1º de Junio",
"financial_year_mar" => "1º de Marzo",
"financial_year_may" => "1º de Mayo",
"financial_year_nov" => "1º de Noviembre",
"financial_year_oct" => "1º de Octubre",
"financial_year_sep" => "1º de Septiembre",
"floating_labels" => "Etiquetas flotantes",
"gcaptcha_enable" => "Inicio de sesión con reCAPTCHA",
"gcaptcha_secret_key" => "Llave secreta reCAPTCHA",
"gcaptcha_secret_key_required" => "reCAPTCHA Secret Key es requerida si se usa",
"gcaptcha_site_key" => "Llave del sitio reCAPTCHA",
"gcaptcha_site_key_required" => "reCAPTCHA Site Key es requerida si se usa",
"gcaptcha_tooltip" => "Proteja la página de inicio de sesión con Google reCAPTCHA, haga clic en el icono de un par de claves de API.",
"general" => "General",
"general_configuration" => "Configuración General",
"giftcard_number" => "Número de tarjeta de regalo",
"giftcard_random" => "Generar aleatoriamente",
"giftcard_series" => "Generar en serie",
"image_allowed_file_types" => "Tipos de archivos permitidos",
"image_max_height_tooltip" => "Altura máxima permitida de las cargas de imágenes en píxeles (px).",
"image_max_size_tooltip" => "Tamaño máximo de archivo permitido de cargas de imágenes en kilobytes (kb).",
"image_max_width_tooltip" => "Ancho máximo permitido de las cargas de imágenes en píxeles (px).",
"image_restrictions" => "Restricciones de carga de imágenes",
"include_hsn" => "Incluir Soporte para Códigos HSN",
"info" => "Información",
"info_configuration" => "Información del Comercio",
"input_groups" => "Introducir Grupos",
"integrations" => "Componentes Integrados",
"integrations_configuration" => "Componentes de Terceros Integrados",
"invoice" => "Factura",
"invoice_configuration" => "Parámetros de Impresión",
"invoice_default_comments" => "Comentarios predeterminados en la factura",
"invoice_email_message" => "Plantilla de Factura por Email",
"invoice_enable" => "Habilitar Facturación",
"invoice_printer" => "Impresora Facturadora",
"invoice_type" => "Tipo de Factura",
"is_readable" => "es legible, pero los permisos de lectura son incorrectos. Pongalos en 640 o 660 cargue nuevamente.",
"is_writable" => "es escribible, pero los permisos de escritura son incorrectos. Pongalos en 750 y recargue la página de nuevo.",
"item_markup" => "Marcado de Artículo",
"jsprintsetup_required" => "Advertencia!Esta funcionalidad desactivada solo funciona con el addon jsPrintSetup de FireFox instalado. Guardar de todas formas?",
"language" => "Idioma",
"last_used_invoice_number" => "Último numero de factura utilizado",
"last_used_quote_number" => "Último número de presupuesto utilizado",
"last_used_work_order_number" => "Ultimo usado sin numero",
"left" => "Izquierda",
"license" => "Licencia",
"license_configuration" => "Anuncio de Licencia",
"line_sequence" => "Secuencia de linea",
"lines_per_page" => "Líneas por página",
"lines_per_page_number" => "Líneas por página debe ser un número.",
"lines_per_page_required" => "Líneas por página es requerido.",
"locale" => "Localización",
"locale_configuration" => "Configuración de la zona local",
"locale_info" => "Informacion de la configuracion de la zona",
"location" => "Inventario",
"location_configuration" => "Ubicación de Inventario",
"location_info" => "Información de Configuración de Ubicación",
"login_form" => "Estilo del formulario de inicio de sesión",
"logout" => "Desea hacer un respaldo antes de salir? Pulsa [OK] para respaldar o [Cancelar] para salir.",
"mailchimp" => "Correo MailChimp",
"mailchimp_api_key" => "Clave API de Mailchimp",
"mailchimp_configuration" => "Configuración de Mailchimp",
"mailchimp_key_successfully" => "Clave API correcta.",
"mailchimp_key_unsuccessfully" => "Clave API incorrecta.",
"mailchimp_lists" => "Lista(s) de Mailchimp",
"mailchimp_tooltip" => "Haga clic en el icono de una clave de API.",
"message" => "Mensajes SMS",
"message_configuration" => "Configuracion del mensaje",
"msg_msg" => "Texto del mensaje guardado",
"msg_msg_placeholder" => "Si desea usar un formato de SMS guarde su mensaje aquí, en caso contrario deje en blanco.",
"msg_pwd" => "SMS-API Password",
"msg_pwd_required" => "SMS-API Password es un campo requerido",
"msg_src" => "SMS-API ID remitente",
"msg_src_required" => "SMS-API ID remitente es un campo requerido",
"msg_uid" => "SMS-API Usuario",
"msg_uid_required" => "SMS-API Usuario es un campo requerido",
"multi_pack_enabled" => "Empaquetado Múltiple por Producto",
"no_risk" => "Sin riesgos de seguridad/vulnerabilidad.",
"none" => "ninguno",
"notify_alignment" => "Posición de notificacion",
"number_format" => "Formato de número",
"number_locale" => "Localización",
"number_locale_invalid" => "Localización ingresada invalida. Revisa el link en el tooltip para encontrar informacion.",
"number_locale_required" => "Numero localizacion es un campo requerido.",
"number_locale_tooltip" => "Encontrar una zonificacion adecuada en este enlace.",
"os_timezone" => "Zona Horaria Local:",
"ospos_info" => "Información de la Instalación OSPOS",
"payment_options_order" => "Orden de opciones de pago",
"perm_risk" => "Los permisos incorrectos dejan a este software en riesgo.",
"phone" => "Teléfono comercial",
"phone_required" => "Teléfono del Comercio es requerido.",
"print_bottom_margin" => "Margen Inferior",
"print_bottom_margin_number" => "Margen Inferior debe ser un número.",
"print_bottom_margin_required" => "Margen Inferior es requerido.",
"print_delay_autoreturn" => "Regresar automaticamente a Vender",
"print_delay_autoreturn_number" => "Tiempo espera requerido para regresar a ventas.",
"print_delay_autoreturn_required" => "El tiempo espera debe ser numérico.",
"print_footer" => "Imprimir el pie de página del navegador",
"print_header" => "Imprimir el encabezado del navegador",
"print_left_margin" => "Margen Izquierdo",
"print_left_margin_number" => "Margen Izquierdo debe ser un número.",
"print_left_margin_required" => "Margen Izquierdo es requerido.",
"print_receipt_check_behaviour" => "Selección de Imprimir recibo",
"print_receipt_check_behaviour_always" => "Siempre activado",
"print_receipt_check_behaviour_last" => "Recordar la ultima vez",
"print_receipt_check_behaviour_never" => "Siempre desactivo",
"print_right_margin" => "Margen Derecho",
"print_right_margin_number" => "Margen Derecho debe ser un número.",
"print_right_margin_required" => "Margen Derecho es requerido.",
"print_silently" => "Mostrar configuracion pre- impresión",
"print_top_margin" => "Margen Superior",
"print_top_margin_number" => "Margen Superior debe ser un número.",
"print_top_margin_required" => "Margen Superior es requerido.",
"quantity_decimals" => "Decimales de Cantidades",
"quick_cash_enable" => "Activar Botones de Efectivo",
"quote_default_comments" => "Comentario inicial de cotizaciones",
"receipt" => "Recibo",
"receipt_category" => "Recibo con categoría",
"receipt_configuration" => "Parámetros de Impresión",
"receipt_default" => "Normal",
"receipt_font_size" => "Tamaño letra",
"receipt_font_size_number" => "Debe ser un numero el tamaño de letra.",
"receipt_font_size_required" => "El tamaño de letra es requerido.",
"receipt_info" => "Información de Configuración de Recibo",
"receipt_printer" => "Impresora de Ticket",
"receipt_short" => "Resumido",
"receipt_show_company_name" => "Mostrar el nombre de la empresa",
"receipt_show_description" => "Mostrar descripcion",
"receipt_show_serialnumber" => "Mostrar numero de serie",
"receipt_show_tax_ind" => "Mostrar indicador de impuestos",
"receipt_show_taxes" => "Mostrar impuestos",
"receipt_show_total_discount" => "Mostrar Descuento Total",
"receipt_template" => "Formato de recibo",
"receiving_calculate_average_price" => "Calcular Promedio de Precio. (Recepción)",
"recv_invoice_format" => "Formato de Factura de Recepción",
"register_mode_default" => "Modo de registro por defecto",
"report_an_issue" => "Informe de algún problema",
"return_policy_required" => "Política de Devolución requerida.",
"reward" => "Recompensas",
"reward_configuration" => "Configuración de recompensas",
"right" => "Derecha",
"sales_invoice_format" => "Formato de Facturas de Venta",
"sales_quote_format" => "Formato de presupuesto de las ventas",
"mailpath_invalid" => "Ruta de sendmail inválida. Solo se permiten letras, números, guiones, guiones bajos, barras y puntos.",
"saved_successfully" => "Configuración guardada satisfactoriamente.",
"saved_unsuccessfully" => "Configuración no guardada.",
"security_issue" => "Advertencia de vulnerabilidad de seguridad",
"server_notice" => "Por Favor Use la Siguiente Información para Reportar Problemas.",
"service_charge" => "Costo de Servicio",
"show_due_enable" => "Mostrar vencimientos de clientes",
"show_office_group" => "Mostrar icono oficina",
"statistics" => "Enviar estadísticas",
"statistics_tooltip" => "Envíe estadísticas para el desarrollo y mejora de funciones.",
"stock_location" => "Ubicación de Inventario",
"stock_location_duplicate" => "El nombre de inventario debe ser único.",
"stock_location_invalid_chars" => "Nombre de la Ubicación de Inventario no debe contener '_'.",
"stock_location_required" => "Número de Ubicación de Inventario es requerido.",
"suggestions_fifth_column" => "Columna 5",
"suggestions_first_column" => "Columna 1",
"suggestions_fourth_column" => "Columna 4",
"suggestions_layout" => "Sugerencias de búsqueda",
"suggestions_second_column" => "Columna 2",
"suggestions_third_column" => "Columna 3",
"system_conf" => "Sistema OSPOS",
"system_info" => "System Info",
"table" => "Mesa",
"table_configuration" => "Configuración de Mesa",
"takings_printer" => "Impresión de retenciones",
"tax" => "Impuestos",
"tax_category" => "Categoría impuesto",
"tax_category_duplicate" => "Categoría de impuesto ingresada ya existe.",
"tax_category_invalid_chars" => "Categoría de impuesto ingresada es invalida.",
"tax_category_required" => "Categoría de impuesto es requerida.",
"tax_category_used" => "La categoría de impuestos no puede borrarse, esta en uso.",
"tax_configuration" => "Configuracion Impuesto",
"tax_decimals" => "Decimales de impuestos",
"tax_id" => "Identificador del Impuesto",
"tax_included" => "Impuestos incluidos",
"theme" => "Tema",
"theme_preview" => "Vista Previa del Tema:",
"thousands_separator" => "Separador de miles",
"timezone" => "Zona Horaria",
"timezone_error" => "La zona horaria de OSPOS es diferente de tu zona horaria local.",
"top" => "Arriba",
"use_destination_based_tax" => "Usar Impuesto Basado en Destino",
"user_timezone" => "Zona Horaria OSPOS:",
"website" => "Sitio Web",
"wholesale_markup" => "Marcado al por mayor",
"work_order_enable" => "Soporte Ordenes de Trabajo",
"work_order_format" => "Formato Ordenes de trabajo",
];