feat: VivesPOS landing on Winter CMS 1.2 — theme + plugin + Dockerfile
Some checks are pending
Module sub-split / Sub-split (push) Waiting to run

- Base: wintercms/winter branch 1.2 (full framework)
- Theme vivespos: Canvas 7 + Bootstrap 5 CDN, custom CSS
- Layout: deferred GTM/GA4 tracking, JSON-LD SoftwareApplication
- Partials: hero (offline-first), features, modes (offline/nube toggle),
  screenshots, pricing (3 planes), comparison, FAQ, CTA
- Plugin VivesPOS.Site with ContactForm
- Dockerfile: PHP 8.2 Apache, port 80, healthcheck
- Added winter/wn-pages, blog, sitemap, seo plugins
- Active theme set to vivespos
This commit is contained in:
2026-08-21 19:29:00 -06:00
commit 1f72193a64
3266 changed files with 531480 additions and 0 deletions

View File

@@ -0,0 +1,99 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Client-side Language Lines
|--------------------------------------------------------------------------
|
| These are messages made available to the client browser via JavaScript.
| To compile this file run: php artisan winter:util compile lang
|
*/
'markdowneditor' => [
'formatting' => 'Formateo',
'quote' => 'Cita',
'code' => 'Código',
'header1' => 'Encabezado 1',
'header2' => 'Encabezado 2',
'header3' => 'Encabezado 3',
'header4' => 'Encabezado 4',
'header5' => 'Encabezado 5',
'header6' => 'Encabezado 6',
'bold' => 'Negrita',
'italic' => 'Cursiva',
'unorderedlist' => 'Lista Desordenada',
'orderedlist' => 'Lista Ordenada',
'video' => 'Video',
'image' => 'Imagen',
'link' => 'Vínculo',
'horizontalrule' => 'Insertar Regla Horizontal',
'fullscreen' => 'Pantalla completa',
'preview' => 'Previsualizar'
],
'mediamanager' => [
'insert_link' => "Insertar Media Vínculo",
'insert_image' => "Insertar Media Imagen",
'insert_video' => "Insertar Media Video",
'insert_audio' => "Insertar Media Audio",
'invalid_file_empty_insert' => "Por favor seleccione archivo para insertar vínculo.",
'invalid_file_single_insert' => "Por favor seleccione un solo archivo.",
'invalid_image_empty_insert' => "Por favor seleccione una imagen(es) para insertar.",
'invalid_video_empty_insert' => "Por favor seleccione un archivo de video para insertar.",
'invalid_audio_empty_insert' => "Por favor seleccione un archivo de audio para insertar.",
],
'alert' => [
'confirm_button_text' => 'OK',
'cancel_button_text' => 'Cancelar'
],
'datepicker' => [
'previousMonth' => 'Mes Anterior',
'nextMonth' => 'Mes Siguiente',
'months' => ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'],
'weekdays' => ['Domingo', 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado'],
'weekdaysShort' => ['Dom', 'Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab']
],
'filter' => [
'group' => [
'all' => 'todos'
],
'scopes' => [
'apply_button_text' => 'Aplicar',
'clear_button_text' => 'Limpiar',
],
'dates' => [
'all' => 'todas',
'filter_button_text' => 'Filtrar',
'reset_button_text' => 'Restablecer',
'date_placeholder' => 'Fecha',
'after_placeholder' => 'Desde',
'before_placeholder' => 'Hasta'
],
'numbers' => [
'all' => 'todos',
'filter_button_text' => 'Filtrar',
'reset_button_text' => 'Restablecer',
'min_placeholder' => 'Mínimo',
'max_placeholder' => 'Máximo',
'number_placeholder' => 'Número'
],
],
'eventlog' => [
'show_stacktrace' => 'Mostrar el seguimiento de la pila',
'hide_stacktrace' => 'Ocultar el seguimiento de la pila',
'tabs' => [
'formatted' => 'Formateado',
'raw' => 'Sin formato',
],
'editor' => [
'title' => 'Seleccione el editor de código fuente a usar',
'description' => 'Su entorno de sistema operativo debe estar configurado para escuchar a uno de estos esquemas de URL.',
'openWith' => 'Abrir con',
'rememberChoice' => 'Recuerde la opción seleccionada para esta sesión del navegador',
'open' => 'Abrir',
'cancel' => 'Cancelar'
]
]
];

View File

@@ -0,0 +1,374 @@
<?php
return [
'app' => [
'name' => 'Winter CMS',
'tagline' => 'Volviendo a lo básico'
],
'directory' => [
'create_fail' => 'No es posible crear el directorio: :name'
],
'file' => [
'create_fail' => 'No es posible crear el archivo: :name'
],
'page' => [
'invalid_token' => [
'label' => 'Token de seguridad invalido',
],
],
'combiner' => [
'not_found' => "El archivo combinador ':name' no se encuentra."
],
'system' => [
'name' => 'Sistema',
'menu_label' => 'Sistema',
'categories' => [
'cms' => 'CMS',
'misc' => 'Varios',
'logs' => 'Registros',
'mail' => 'Correo',
'shop' => 'Tienda',
'team' => 'Equipo',
'users' => 'Usuarios',
'system' => 'Sistema',
'social' => 'Social',
'events' => 'Eventos',
'customers' => 'Clientes',
'my_settings' => 'Mis Configuraciones',
'notifications' => 'Notificaciones'
]
],
'theme' => [
'label' => 'Tema',
'unnamed' => 'Tema sin nombre',
'name' => [
'label' => 'Nombre Tema',
'help' => 'Nombre del tema por su código único. Por ejemplo, Winter.Vanilla'
],
],
'themes' => [
'install' => 'Instalar temas',
'search' => 'buscar temas para instalar...',
'installed' => 'Temas Instalados',
'no_themes' => 'No hay temas instalados desde el mercado.',
'recommended' => 'Recomendado',
'remove_confirm' => '¿Seguro que quieres eliminar este tema?'
],
'plugin' => [
'label' => 'Plugin',
'unnamed' => 'Plugin sin nombre',
'name' => [
'label' => 'Nombre del Plugin',
'help' => 'Nombra el plugin por su código único. por ejemplo, Winter.Blog',
]
],
'plugins' => [
'manage' => 'Gestionar plugins',
'enable_or_disable' => 'Activar o desactivar',
'enable_or_disable_title' => 'Activar o Desactivar Plugins',
'install' => 'Instalar plugins',
'install_products' => 'Instalar productos',
'search' => 'buscar plugins para instalar...',
'installed' => 'Plugins Instalados',
'no_plugins' => 'No hay plugins instalados desde el mercado.',
'recommended' => 'Recomendado',
'remove' => 'Eliminar',
'refresh' => 'Recargar',
'disabled_label' => 'Desactivar',
'disabled_help' => 'Plugins que están deshabilitadas son ignorados por la aplicación.',
'frozen_label' => 'Congele actualizaciones',
'frozen_help' => 'Plugins que están congelados serán ignorados por el proceso de actualización.',
'selected_amount' => 'Plugins seleccionado: :amount',
'remove_confirm' => '¿Está seguro que quiere remover este plugin?',
'remove_success' => 'Eliminado con éxito los plugins del sistema.',
'refresh_confirm' => '¿Está seguro?',
'refresh_success' => 'Refrescado con éxito los plugins en el sistema.',
'disable_confirm' => '¿Está seguro?',
'disable_success' => 'Plugins deshabilitados con éxito.',
'enable_success' => 'Plugins activados con éxito.',
'unknown_plugin' => 'El Plugin ha sido elimina del sistema de archivos.',
],
'project' => [
'name' => 'Proyecto',
'owner_label' => 'Dueño',
'attach' => 'Adjuntar Proyecto',
'detach' => 'Separar Proyecto',
'none' => 'Ninguno',
'id' => [
'label' => 'ID del Proyecto',
'help' => 'Como encontrar el ID de tu proyecto',
'missing' => 'Especifique un ID del proyecto para usar.',
],
'detach_confirm' => '¿Está seguro de que desea separar este proyecto?',
'unbind_success' => 'Proyecto ha sido separado con éxito.',
],
'settings' => [
'menu_label' => 'Configuración',
'not_found' => 'No se encuentra la configuración especificada.',
'missing_model' => 'La página de configuración no encuentra una definición del Modelo.',
'update_success' => 'Los ajustes para :name se han actualizado correctamente.',
'return' => 'Volver a la configuración del sistema',
'search' => 'Buscar',
],
'mail' => [
'log_file' => 'Archivo Registro',
'menu_label' => 'Configuración del correo',
'menu_description' => 'Administrar la configuración de correo electrónico.',
'general' => 'General',
'method' => 'Método de correo',
'sender_name' => 'Nombre del remitente',
'sender_email' => 'Correo del remitente',
'php_mail' => 'mail PHP',
'smtp' => 'SMTP',
'smtp_address' => 'Dirección SMTP',
'smtp_authorization' => 'autorización requerida de SMTP',
'smtp_authorization_comment' => 'Utilice esta opción si el servidor SMTP requiere autorización.',
'smtp_username' => 'Nombre de usuario',
'smtp_password' => 'Contraseña',
'smtp_port' => 'Puerto SMTP',
'sendmail' => 'Sendmail',
'sendmail_path' => 'Directorio de Sendmail',
'sendmail_path_comment' => 'Por favor, especifique la ruta de acceso del programa sendmail.',
],
'mail_templates' => [
'menu_label' => 'Plantillas de Correo',
'menu_description' => 'Modificar las plantillas de correo que se envían a los usuarios y administradores, administrar diseños de correo electrónico',
'new_template' => 'Nueva plantilla',
'new_layout' => 'Nueva Disposición',
'template' => 'Plantilla',
'templates' => 'Plantillas',
'menu_layouts_label' => 'Disposición del Mail',
'layout' => 'Disposición',
'layouts' => 'Disposiciones',
'no_layout' => '-- Sin disposición --',
'name' => 'Nombre',
'name_comment' => 'Nombre único utilizado para referirse a esta plantilla',
'code' => 'Código',
'code_comment' => 'Código único utilizado para referirse a esta plantilla ',
'subject' => 'Asunto',
'subject_comment' => 'Correo asunto del mensaje',
'description' => 'Descripción',
'content_html' => 'HTML',
'content_css' => 'CSS',
'content_text' => 'Texto plano',
'test_send' => 'Enviar mensaje de prueba',
'test_success' => 'El mensaje de prueba enviado.',
'test_confirm' => 'Envio de Mensaje de prueba a :email. Continuar?',
'creating' => 'Creando Plantilla...',
'creating_layout' => 'Creando Diseño...',
'saving' => 'Salvando Plantilla...',
'saving_layout' => 'Salvando Diseño...',
'delete_confirm' => 'Borrar esta plantilla?',
'delete_layout_confirm' => 'Borrar este diseño?',
'deleting' => 'Borrando Plantilla...',
'deleting_layout' => 'Borrando Diseño...',
'sending' => 'Enviando mensaje de prueba...',
'return' => 'Volver a lista de plantillas',
'options' => 'Opciones',
'disable_auto_inline_css' => 'Deshabilitar CSS en línea automático'
],
'mail_brand' => [
'menu_label' => 'Branding de Correo',
'menu_description' => 'Modificar los colores y apariencia de las plantillas de correo.',
'page_title' => 'Personalizar apariencia del correo',
'sample_template' => [
'heading' => 'Encabezado',
'paragraph' => 'Este es un párrafo rellenado con Lorem Ipsum y un enlace. Cumque dicta <a>doloremque eaque</a>, enim error laboriosam pariatur possimus tenetur veritatis voluptas.',
'table' => [
'item' => 'Item',
'description' => 'Descripción',
'price' => 'Precio',
'centered' => 'Centrado',
'right_aligned' => 'Alineado-A-La-Derecha'
],
'buttons' => [
'primary' => 'Botón Principal',
'positive' => 'Botón Positivo',
'negative' => 'Botón Negativo',
],
'panel' => '¿Este panel es increíble o qué?',
'more' => 'Algo más de texto',
'promotion' => 'Código de cupón: WINTER',
'subcopy' => 'Este es el subcopy del correo',
'thanks' => 'Gracias'
],
'fields' => [
'_section_background' => 'Fondo',
'body_bg' => 'Fondo del cuerpo',
'content_bg' => 'Fondo del contenido',
'content_inner_bg' => 'Fondo del contenido interior',
'_section_buttons' => 'Botones',
'button_text_color' => 'Color del texto del botón',
'button_primary_bg' => 'Fondo del botón Principal',
'button_positive_bg' => 'Fondo del botón Positivo',
'button_negative_bg' => 'Fondo del botón Negativo',
'_section_type' => 'Tipografía',
'header_color' => 'Color del Enzabezado',
'heading_color' => 'Color de Encabezados',
'text_color' => 'Color del Texto',
'link_color' => 'Color del Enlace',
'footer_color' => 'Color del pie de página',
'_section_borders' => 'Bordes',
'body_border_color' => 'Color del borde del cuerpo',
'subcopy_border_color' => 'Color del borde del subcopy',
'table_border_color' => 'Color del borde de la tabla',
'_section_components' => 'Componentes',
'panel_bg' => 'Fondo del Panel',
'promotion_bg' => 'Fondo de Promoción',
'promotion_border_color' => 'Color del borde de Promoción',
]
],
'install' => [
'project_label' => 'Adjuntar al proyecto',
'plugin_label' => 'Instalar Plugin',
'theme_label' => 'Instalar Theme',
'missing_plugin_name' => 'Por favor, especifique un nombre de Plugin para instalar',
'missing_theme_name' => 'Por favor especifique un nombre de Theme a instalar.',
'install_completing' => 'Finalizó el proceso de instalación',
'install_success' => 'El plugin se ha instalado correctamente.'
],
'updates' => [
'title' => 'Administrar actualizaciones',
'name' => 'Actualizaciones de software',
'menu_label' => 'Actualizaciones',
'menu_description' => 'Actualizaciones del sistema, administrar e instalar plugins y temas.',
'return_link' => 'Volver a actualizaciones del sistema',
'check_label' => 'Chequear actualizaciones',
'retry_label' => 'Intentar nuevamente',
'plugin_name' => 'Nombre',
'plugin_code' => 'Código',
'plugin_description' => 'Descripción',
'plugin_version' => 'Versión',
'plugin_author' => 'Autor',
'plugin_not_found' => 'Plugin not found',
'core_current_build' => 'Versión actual',
'core_build' => 'Versión :build',
'core_build_help' => 'Última versión está disponible.',
'core_downloading' => 'Descargando archivos de la aplicación',
'core_extracting' => 'Descomprimiendo archivos de la aplicación',
'core_set_build' => 'Estableciendo número de build',
'plugins' => 'Plugins',
'themes' => 'Temas',
'disabled' => 'Desactivado',
'plugin_downloading' => 'Descargando plugin: :name',
'plugin_extracting' => 'Descomprimiendo plugin: :name',
'plugin_version_none' => 'Nuevo plugin',
'plugin_current_version' => 'Versión actual',
'theme_new_install' => 'Intalación de nuevo tema.',
'theme_downloading' => 'Descargando tema: :name',
'theme_extracting' => 'Descomprimiendo tema: :name',
'update_label' => 'Actualizando software',
'update_completing' => 'Finalizando el proceso de actualización',
'update_loading' => 'Cargando actualizaciones disponibles...',
'update_success' => 'El proceso de actualización se realizó exitosamente.',
'update_failed_label' => 'Actualización falló',
'force_label' => 'Forzar actualización',
'found' => [
'label' => 'Se encontraron nuevas actualizaciones!',
'help' => 'Click Actualizar software para comenzar con el proceso de actualización.',
],
'none' => [
'label' => 'No hay actualizaciones',
'help' => 'No se encontraron nuevas actualizaciones disponibles.',
],
'important_action' => [
'empty' => 'Seleccione acción',
'confirm' => 'Confirmar actualización',
'skip' => 'Saltar este plugin (sólo una vez)',
'ignore' => 'Saltar este plugin (siempre)',
],
'important_action_required' => 'Acción requerida',
'important_view_guide' => 'Ver guía de actualización',
'important_view_release_notes' => 'Ver notas de la versión',
'important_alert_text' => 'Algunas actualizaciones necesitan su atención.',
'details_title' => 'Detalles plugin',
'details_view_homepage' => 'Ver página de inicio',
'details_readme' => 'Documentación',
'details_readme_missing' => 'No hay documentación proporcionada.',
'details_changelog' => 'Registro de cambios',
'details_changelog_missing' => 'No hay registro de cambios proporcionado.',
'details_upgrades' => 'Guía de actualización',
'details_upgrades_missing' => 'No hay instrucciones de actualización proporcionadas.',
'details_licence' => 'Licencia',
'details_licence_missing' => 'No hay licencia proporcionada.',
'details_current_version' => 'Versión actual',
'details_author' => 'Autor'
],
'server' => [
'connect_error' => 'Error al conectar con el servidor.',
'response_not_found' => 'El servidor de actualización no se pudo encontrar.',
'response_invalid' => 'Respuesta no válida del servidor.',
'response_empty' => 'Respuesta vacía desde el servidor.',
'file_error' => 'El servidor no pudo entregar el paquete.',
'file_corrupt' => 'El archivo se encuentra dañado.',
],
'behavior' => [
'missing_property' => 'Clase :class debe definir la propiedad $:property utilizada por :behavior comportamiento.',
],
'config' => [
'not_found' => 'No se puede encontrar el archivo de configuración :file definido por :location.',
'required' => "Configuración utilizada en :location debe proporcionar un valor. ':property'.",
],
'zip' => [
'extract_failed' => "No se puede extraer el archivo ':file'.",
],
'event_log' => [
'hint' => 'Este registro muestra una lista de los posibles errores que se producen en la aplicación, como las excepciones y la información de depuración.',
'menu_label' => 'Registro de eventos',
'menu_description' => 'Ver los logs de registro del sistema.',
'empty_link' => 'Vaciar el registro de eventos',
'empty_loading' => 'Borrando los registros...',
'empty_success' => 'Los registros fueron borrados',
'return_link' => 'Regresar al registro de eventos',
'id' => 'ID',
'id_label' => 'ID del Evento',
'created_at' => 'Fecha y Hora',
'message' => 'Mensaje',
'level' => 'Nivel',
'preview_title' => 'Evento'
],
'request_log' => [
'hint' => 'Este registro muestra una lista de las peticiones del navegador que pueden requerir atención. Por ejemplo, si un usuario abre una página que no se puede encontrar, se crea un registro con el código de estado 404.',
'menu_label' => 'Registros de peticiones',
'menu_description' => 'Ver listado de redirecciones con errores y Paginas no encontradas (404).',
'empty_link' => 'Vaciar el registro de acceso',
'empty_loading' => 'Vaciando los registros...',
'empty_success' => 'Los registros fueron vaciados...',
'return_link' => 'Regresar al registro de peticiones',
'id' => 'ID',
'id_label' => 'ID Log',
'count' => 'Contador',
'referer' => 'Referencia',
'url' => 'URL',
'status_code' => 'Estado',
'preview_title' => 'Petición'
],
'permissions' => [
'name' => 'Sistema',
'manage_system_settings' => 'Gestionar la configuración del sistema',
'manage_software_updates' => 'Gestionar actualización de software',
'access_logs' => 'Ver registros del sistema',
'manage_mail_templates' => 'Gestionar plantillas de correo',
'manage_mail_settings' => 'Gestionar la configuración del correo',
'manage_other_administrators' => 'Gestionar otros administradores',
'manage_preferences' => 'Gestionar preferencias back-end',
'manage_editor' => 'Gestionar preferencias editor código',
'view_the_dashboard' => 'Ver el Escritorio',
'manage_branding' => 'Perzonalizar el back-end'
],
'log' => [
'menu_label' => 'Configuración de Logs',
'menu_description' => 'Especifique cuáles áreas deben realizar registros.',
'default_tab' => 'Registros',
'log_events' => 'Registrar eventos de sistema',
'log_events_comment' => 'Almacenar eventos de sistema en la base de datos además del registro de archivo.',
'log_requests' => 'Registrar malas solicitudes',
'log_requests_comment' => 'Solicitudes de navegadores que puedan requerir atención, como errores 404.',
'log_theme' => 'Registrar cambios en el tema',
'log_theme_comment' => 'Cuando se realizan cambios al tema utilizando el backend.',
],
'media' => [
'invalid_path' => "Ruta de archivo especificada no válida: ':path'.",
'folder_size_items' => 'elemento(s)',
],
];

View File

@@ -0,0 +1,99 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| such as the size rules. Feel free to tweak each of these messages.
|
*/
"accepted" => "El campo :attribute debe ser aceptado.",
"active_url" => "El campo :attribute no es una URL válida",
"after" => "El campo :attribute debe ser una fecha posterior a :date.",
"alpha" => "El campo :attribute sólo debe contener letras.",
"alpha_dash" => "El campo :attribute solo puede contener letras, numeros y barras.",
"alpha_num" => "El campo :attribute solo puede contener letras y números.",
"array" => "El campo :attribute debe ser un array.",
"before" => "El campo :attribute debe ser una fecha anterior a :date.",
"between" => [
"numeric" => "El campo :attribute debe tener estar entre :min y :max.",
"file" => "El campo :attribute debe ocupar entre :min y :max kilobytes.",
"string" => "El campo :attribute debe tener entre :min y :max caracteres.",
"array" => "El campo :attribute debe tener entre :min y :max elementos."
],
"confirmed" => "La confirmación del campo:attribute es incorrecta.",
"date" => "El campo :attribute no es una fecha válida.",
"date_format" => "El campo :attribute no tiene el formato :format.",
"different" => "Los campos :attribute y :other debe ser distintos.",
"digits" => "El campo :attribute debe tener :digits dígitos.",
"digits_between" => "El campo :attribute debe tener entre :min y :max dígitos.",
"email" => "El campo :attribute tiene un formato incorrecto.",
"exists" => "El campo :attribute es incorrecto.",
"image" => "El campo :attribute debe ser una imagen.",
"in" => "El campo :attribute es incorrecto.",
"integer" => "El campo :attribute debe ser un entero.",
"ip" => "El campo :attribute debe ser una IP válida.",
"max" => [
"numeric" => "El campo :attribute no debe ser mayor que :max.",
"file" => "El campo :attribute no debe ocupar más de :max kilobytes.",
"string" => "El campo :attribute no debe tener más de :max caracteres.",
"array" => "El campo :attribute no debe tener más de :max elementos."
],
"mimes" => "El campo :attribute debe ser un archivo del tipo: :values.",
"extensions" => "El campo :attribute debe tener una extensión de: :values.",
"min" => [
"numeric" => "El campo :attribute debe ser :min o más.",
"file" => "El campo :attribute debe ocupar :min kilobytes o más.",
"string" => "El campo :attribute debe tener :min caracteres o más.",
"array" => "El campo :attribute debe tener :min elementos o más."
],
"not_in" => "El campo :attribute es incorrecto.",
"numeric" => "El campo :attribute debe ser un número.",
"regex" => "El campo :attribute tiene un formato incorrecto.",
"required" => "El campo :attribute es obligatorio.",
"required_if" => "El campo :attribute es obligatorio si el campo :other es :value.",
"required_with" => "El campo :attribute es obligatorio cuando el campo :values está presente.",
"required_without" => "El campo :attribute es obligatorio cuando el campo :values no está presente.",
"same" => "Los campos :attribute y :other deben ser iguales.",
"size" => [
"numeric" => "El campo :attribute debe ser :size.",
"file" => "El campo :attribute debe ocupar :size kilobytes.",
"string" => "El campo :attribute debe tener :size caracteres.",
"array" => "El campo :attribute debe contener :size elementos."
],
"unique" => "El campo :attribute ya ha sido tomado.",
"url" => "El campo :attribute tiene un formato incorrecto.",
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => []
];