trypost/lang/es/settings.php
Paulo Castellano aa7ca8ae21 refactor: notification preferences, header slots, calendar layout, UI polish
Notification preferences:
- Create notification_preferences table (post_published, post_failed,
  account_disconnected booleans per user)
- NotificationPreferenceController with firstOrCreate on first visit
- SendNotification job respects email preferences before sending
- Settings page with toggle switches, i18n in 3 languages
- 8 new tests for preferences (controller + wantsEmailFor + job integration)

Post published notification:
- PostPublished mail + maizzle template
- Notify owner on successful publish via SendNotification job
- PostPublished type added to notification enum

Header & Layout:
- Rename AppSidebarHeader to AppHeader with left/center/right slots
- showSidebarTrigger prop to hide sidebar toggle
- Calendar: controls in header (left: nav, center: date, right: tabs + new post)
- Fixed header with scrollable content (flex h-screen pattern)
- fullWidth pages use overflow-y-auto (fixes month view scroll)

UI improvements:
- Action buttons moved to header-right: posts, hashtags, labels
- Settings breadcrumbs: "Settings > Profile" pattern
- Calendar: remove duplicate New Post button from day view
- Remove size="sm" from Schedule/Publish buttons
- Remove bg-background from header (inherits from SidebarInset)
- Add Cancel button to labels and hashtags create/edit dialogs
- Add common.cancel i18n key
- Clean up orphaned Calendar breadcrumbs
- Fix SocialAccountsGrid buttons to use shadcn Button ghost

All 753 tests passing.
2026-03-30 18:18:17 -03:00

206 lines
8.6 KiB
PHP

<?php
return [
'title' => 'Configuración',
'description' => 'Administra tu perfil y configuración de la cuenta',
'nav' => [
'profile' => 'Perfil',
'password' => 'Contraseña',
'workspace' => 'Workspace',
'members' => 'Miembros',
'notifications' => 'Notificaciones',
'billing' => 'Facturación',
],
'notifications' => [
'title' => 'Preferencias de notificaciones',
'heading' => 'Notificaciones por correo',
'description' => 'Elige qué notificaciones por correo deseas recibir',
'post_published' => 'Post publicado',
'post_published_description' => 'Recibir un correo cuando tu post se publique correctamente',
'post_failed' => 'Post fallido',
'post_failed_description' => 'Recibir un correo cuando tu post falle al publicar',
'account_disconnected' => 'Cuenta desconectada',
'account_disconnected_description' => 'Recibir un correo cuando una cuenta social se desconecte',
'save' => 'Guardar preferencias',
],
'profile' => [
'title' => 'Configuración del perfil',
'photo_heading' => 'Foto de perfil',
'photo_description' => 'Sube una foto de perfil',
'heading' => 'Información del perfil',
'description' => 'Actualiza tu nombre y correo electrónico',
'avatar' => 'Avatar',
'name' => 'Nombre',
'name_placeholder' => 'Nombre completo',
'email' => 'Correo electrónico',
'email_placeholder' => 'Correo electrónico',
'email_unverified' => 'Tu correo electrónico no ha sido verificado.',
'resend_verification' => 'Haz clic aquí para reenviar el correo de verificación.',
'verification_sent' => 'Se ha enviado un nuevo enlace de verificación a tu correo electrónico.',
'save' => 'Guardar',
],
'password' => [
'title' => 'Configuración de contraseña',
'heading' => 'Actualizar contraseña',
'description' => 'Asegúrate de que tu cuenta use una contraseña larga y aleatoria para mantenerte seguro',
'current_password' => 'Contraseña actual',
'current_password_placeholder' => 'Contraseña actual',
'new_password' => 'Nueva contraseña',
'new_password_placeholder' => 'Nueva contraseña',
'confirm_password' => 'Confirmar contraseña',
'confirm_password_placeholder' => 'Confirmar contraseña',
'save' => 'Guardar contraseña',
],
'delete_account' => [
'heading' => 'Eliminar cuenta',
'description' => 'Elimina tu cuenta y todos sus recursos',
'warning' => 'Advertencia',
'warning_message' => 'Procede con precaución, esta acción no se puede deshacer.',
'button' => 'Eliminar cuenta',
'modal_title' => '¿Estás seguro de que deseas eliminar tu cuenta?',
'modal_description' => 'Una vez eliminada tu cuenta, todos sus recursos y datos también se eliminarán permanentemente. Introduce tu contraseña para confirmar que deseas eliminar permanentemente tu cuenta.',
'password' => 'Contraseña',
'password_placeholder' => 'Contraseña',
'cancel' => 'Cancelar',
'confirm' => 'Eliminar cuenta',
],
'workspace' => [
'title' => 'Configuración del workspace',
'logo_heading' => 'Logo del workspace',
'logo_description' => 'Sube un logo para tu workspace',
'heading' => 'Nombre del workspace',
'description' => 'Actualiza el nombre y zona horaria del workspace',
'members_heading' => 'Miembros',
'members_description' => 'Administra miembros e invitaciones del workspace',
'name' => 'Nombre',
'name_placeholder' => 'Mi Workspace',
'timezone' => 'Zona horaria',
'save' => 'Guardar',
],
'members' => [
'title' => 'Miembros',
'heading' => 'Miembros del equipo',
'description' => 'Administra miembros e invitaciones de este workspace',
'cancel' => 'Cancelar',
'remove' => 'Eliminar',
'make_admin' => 'Hacer administrador',
'make_member' => 'Hacer miembro',
'invite' => [
'title' => 'Invitar miembro',
'description' => 'Envía una invitación por correo para agregar colaboradores',
'email' => 'Correo electrónico',
'email_placeholder' => 'colaborador@email.com',
'role' => 'Rol',
'role_placeholder' => 'Selecciona un rol',
'submit' => 'Enviar invitación',
],
'pending' => [
'title' => 'Invitaciones pendientes',
'description' => 'Invitaciones en espera de aceptación',
'empty' => 'No hay invitaciones pendientes',
],
'list' => [
'title' => 'Miembros',
'description' => 'Personas con acceso a este workspace',
'empty' => 'No hay miembros además del propietario',
],
'remove_modal' => [
'title' => 'Eliminar miembro',
'description' => '¿Estás seguro de que deseas eliminar a este miembro del workspace? Perderá acceso a todos los recursos del workspace.',
'action' => 'Eliminar miembro',
],
'cancel_invite_modal' => [
'title' => 'Cancelar invitación',
'description' => '¿Estás seguro de que deseas cancelar esta invitación?',
'action' => 'Cancelar invitación',
],
'roles' => [
'owner' => 'Propietario',
'admin' => 'Administrador',
'member' => 'Miembro',
],
'flash' => [
'invite_sent' => '¡Invitación enviada correctamente!',
'invite_deleted' => 'Invitación eliminada.',
'member_removed' => '¡Miembro eliminado correctamente!',
'role_updated' => 'Rol del miembro actualizado.',
'wrong_email' => 'Esta invitación es para otro correo electrónico.',
'already_member' => 'Ya eres miembro de este workspace.',
'invite_accepted' => '¡Bienvenido! Ahora eres miembro del workspace.',
'invite_declined' => 'Invitación rechazada.',
],
],
'flash' => [
'profile_updated' => '¡Perfil actualizado correctamente!',
'language_updated' => '¡Idioma actualizado correctamente!',
'password_updated' => '¡Contraseña actualizada correctamente!',
'workspace_updated' => '¡Configuración actualizada correctamente!',
'photo_updated' => '¡Foto actualizada correctamente!',
'photo_deleted' => '¡Foto eliminada correctamente!',
'logo_updated' => '¡Logo subido correctamente!',
'logo_deleted' => '¡Logo eliminado correctamente!',
'notifications_updated' => '¡Preferencias de notificaciones actualizadas!',
],
'api_keys' => [
'title' => 'Claves API',
'page_title' => 'Claves API',
'heading' => 'Claves API',
'description' => 'Administra claves API para acceso programático a tu workspace.',
'create' => 'Crear clave API',
'copy' => 'Copiar',
'new_token_message' => 'Tu nueva clave API ha sido creada. Cópiala ahora — no podrás verla de nuevo.',
'table' => [
'name' => 'Nombre',
'key' => 'Clave',
'status' => 'Estado',
'expires' => 'Expira',
'last_used' => 'Último uso',
'never' => 'Nunca',
],
'actions' => [
'copy_id' => 'Copiar ID de clave API',
'copy_id_success' => 'ID de clave API copiado',
'delete' => 'Eliminar',
],
'empty' => [
'title' => 'No hay claves API',
'description' => 'Crea una clave API para acceder a tu workspace programáticamente.',
],
'delete_modal' => [
'title' => 'Eliminar clave API',
'description' => '¿Estás seguro de que deseas eliminar esta clave API? Las aplicaciones que la usen perderán acceso inmediatamente.',
'action' => 'Eliminar clave API',
],
'create_dialog' => [
'title' => 'Crear clave API',
'description' => 'Crea una nueva clave API para acceso programático a tu workspace.',
'name' => 'Nombre',
'name_placeholder' => 'ej. Clave API de Producción',
'expires' => 'Fecha de expiración (opcional)',
'expires_placeholder' => 'Sin expiración',
'submit' => 'Crear',
'cancel' => 'Cancelar',
],
'flash' => [
'created' => '¡Clave API creada correctamente!',
'deleted' => '¡Clave API eliminada correctamente!',
],
],
];