tududi/public/locales/es/translation.json
Chris c2e9a1aa21
feat: Add OIDC/SSO authentication support (#1008)
* feat: add OIDC/SSO database schema and models (Phase 1)

Add database foundation for OpenID Connect authentication:

Database Migrations:
- Create oidc_identities table (links users to OIDC accounts)
- Create oidc_state_nonces table (OAuth state/nonce for CSRF protection)
- Create auth_audit_log table (security event logging)
- Make password_digest nullable in users table (allow OIDC-only users)

Models:
- OIDCIdentity: Links users to external OIDC providers
- OIDCStateNonce: Temporary OAuth state management
- AuthAuditLog: Authentication event audit trail

Changes:
- Updated User model to allow null password_digest
- Added model associations in models/index.js
- All migrations tested and verified

Related to #977

* feat: add OIDC core services (Phase 2)

- Install openid-client@^6.2.0 for OIDC protocol support
- Implement providerConfig.js for loading providers from .env
  - Support single provider or numbered providers (OIDC_PROVIDER_1_*, etc.)
  - Auto-provision and admin email domain configuration
  - Provider caching for performance
- Implement stateManager.js for OAuth state/nonce management
  - CSRF protection with 10-minute TTL
  - One-time use state consumption
  - Automatic cleanup of expired states
- Implement auditService.js for authentication event logging
  - Track login success/failure, logout, OIDC linking/unlinking
  - Store IP address, user agent, and metadata
  - Support for event queries and retention cleanup
- Add comprehensive unit tests (60 tests, all passing)
  - providerConfig: 36 tests for env parsing and validation
  - stateManager: 12 tests for state lifecycle and security
  - auditService: 12 tests for event logging and queries

Phase 2 completes the backend core services needed for OIDC authentication.

* feat: implement OIDC authentication flow (Phase 3)

Core OIDC Flow (service.js):
- Provider discovery with issuer caching
- Authorization URL generation with state/nonce
- OAuth callback handling and token exchange
- ID token validation using openid-client
- Token refresh functionality

JIT User Provisioning (provisioningService.js):
- Auto-create users from OIDC claims
- Link existing email accounts to OIDC identities
- Admin role assignment based on email domain rules
- Automatic username generation from email
- Transaction-safe identity creation

Identity Management (oidcIdentityService.js):
- List user's linked OIDC identities
- Link additional providers to existing accounts
- Unlink identities with safety checks
- Prevent unlinking last auth method
- Update identity claims on login

HTTP Layer (controller.js + routes.js):
- GET /api/oidc/providers - List configured providers
- GET /api/oidc/auth/:slug - Initiate OIDC flow
- GET /api/oidc/callback/:slug - Handle OAuth callback
- POST /api/oidc/link/:slug - Link provider to current user
- DELETE /api/oidc/unlink/:id - Unlink identity
- GET /api/oidc/identities - Get user's identities

Integration:
- Register OIDC routes in Express app (public + authenticated)
- Update auth service to reject password login for OIDC-only users
- Audit logging for all OIDC operations
- Session creation on successful authentication

Security:
- State/nonce CSRF protection
- One-time use state consumption
- Transaction-safe user provisioning
- Foreign key constraints enforced

* feat: implement OIDC frontend login flow (Phase 4)

- Created OIDCProviderButtons component for SSO login options
- Created OIDCCallback component for OAuth callback handling
- Updated Login page to fetch and display OIDC providers
- Added /auth/callback/:provider route to App.tsx
- Added i18n translations for OIDC UI elements
- Downgraded openid-client to v5.7.0 (CommonJS compatibility)
- Fixed linting issues in backend OIDC modules

Phase 4 completes the frontend login flow for OIDC/SSO authentication.
Users can now see configured SSO providers on the login page.

* feat: implement OIDC account linking UI (Phase 5)

Add Connected Accounts section to Profile Security tab allowing users to:
- View linked OIDC provider accounts
- Link new SSO providers to their account
- Unlink OIDC identities with validation
- Prevent unlinking last authentication method

Backend changes:
- Add has_password virtual field to User model
- Include has_password in profile API response
- Track whether user has password set for validation

Frontend changes:
- Create oidcService for OIDC API operations
- Create ConnectedAccounts component with link/unlink flows
- Add confirmation dialog before unlinking accounts
- Validate that users cannot unlink their last auth method
- Show warning if user has no password set
- Integrate Connected Accounts into SecurityTab

User experience:
- View all linked SSO provider accounts with email and link date
- Link additional providers via "Link Provider" buttons
- Unlink with two-step confirmation to prevent accidents
- Clear error messages when unlinking would leave no auth method
- Warning message suggesting password setup for OIDC-only users

Fixes #977

* feat: complete OIDC documentation and UI improvements (Phase 6)

This commit completes Phase 6 of the OIDC/SSO implementation with comprehensive
documentation, bug fixes, and UI reorganization.

Documentation:
- Add comprehensive user guide at docs/10-oidc-sso.md with:
  - Setup guides for 6 major providers (Google, Okta, Keycloak, Authentik, PocketID, Azure AD)
  - Configuration examples for single and multiple providers
  - User features documentation (login, account linking, management)
  - Advanced topics (auto-provisioning, admin role assignment, hybrid auth)
  - Comprehensive troubleshooting section
  - Security considerations and best practices
- Update README.md with OIDC/SSO section and quick setup examples

Internationalization:
- Add i18n support to OIDCProviderButtons component
- Add translation keys for all OIDC UI text
- Update English translations with "sign_in_with" key

Bug Fixes:
- Fix oidcService.ts to correctly unwrap API responses
  - Backend returns {providers: [...]} and {identities: [...]}
  - Frontend was expecting plain arrays, causing "map is not a function" error
- Fix initiateOIDCLink to properly handle POST response

UI Improvements:
- Move OIDC/SSO to dedicated tab in profile settings
  - Create new OIDCTab component with green LinkIcon
  - Remove ConnectedAccounts from SecurityTab
  - Add OIDC tab between Security and API Keys tabs
  - Update ProfileSettings with new tab configuration
- Security tab now focuses solely on password management

Testing:
- All linting passes
- All tests pass (82 suites, 1223 tests)

Related to #977

* feat: add OIDC/SSO translations for all 24 languages

Add i18n support for OIDC/SSO features across all supported languages:
- "Sign in with {{provider}}" button text
- "OIDC/SSO" tab label in profile settings
- OIDC authentication flow messages

Translations added for: Arabic, Bulgarian, Danish, German, Greek, Spanish,
Finnish, French, Indonesian, Italian, Japanese, Korean, Dutch, Norwegian,
Polish, Portuguese, Romanian, Russian, Slovenian, Swedish, Turkish,
Ukrainian, Vietnamese, and Chinese.

* fix: resolve 13 CodeQL security alerts

This commit addresses critical security vulnerabilities identified by CodeQL scanning:

**Security Configuration (2 fixes)**
- Fix insecure Helmet configuration - enable CSP and HSTS in production
- Fix clear text cookie transmission - enable secure cookies in production

**Path Injection (3 fixes)**
- Add path validation in users/controller.js to prevent arbitrary file deletion
- Add path validation in users/service.js for avatar operations
- Add path sanitization in attachment-utils.js deleteFileFromDisk function

**Cross-Site Scripting (1 fix)**
- Fix XSS vulnerability in GeneralTab.tsx avatar URL handling
- Add URL sanitization to prevent javascript: protocol attacks

**URL Security (2 fixes)**
- Fix double escaping in url/service.js HTML entity decoding
- Fix incomplete URL sanitization for YouTube domain validation

**Denial of Service (1 fix)**
- Add loop bound protection in inboxProcessingService.js (10k char limit)

**Rate Limiting (3 fixes)**
- Add rate limiting to auth routes (register, verify-email)
- Add rate limiting to task attachment upload/delete endpoints
- Add rate limiting to user avatar upload/delete endpoints

**GitHub Actions Security (1 fix)**
- Add explicit read-only permissions to CI workflow

Note: CSRF middleware (#10) requires frontend changes and is tracked separately.

Relates to PR #1008

* fix: allow test files in path validation for tests

* fix: format long condition in attachment-utils for Prettier compliance

Break the path validation condition across multiple lines to meet Prettier formatting requirements and fix CI linting failure.

* fix: resolve CodeQL security alerts

- Add rate limiting to OIDC authentication routes using authLimiter and authenticatedApiLimiter
- Implement CSRF protection middleware using csrf-sync (skips for API tokens and test environment)
- Add CSRF token endpoint at /api/csrf-token
- Fix incomplete URL scheme validation in GeneralTab to block all dangerous schemes (javascript:, data:, vbscript:, file:)

This addresses 5 high-severity CodeQL security vulnerabilities:
- Missing rate limiting on OIDC auth routes
- Missing CSRF middleware protection
- Incomplete URL sanitization in avatar handling

All 1223 tests passing.

* fix: implement CSRF protection with lusca for CodeQL compliance

Add CSRF protection using lusca.csrf (CodeQL's recommended library) to
protect session-based authentication while supporting hybrid auth patterns.

Implementation:
- Pre-check middleware marks exempt requests (test env, Bearer tokens)
- Lusca CSRF middleware applied with exemption flag check
- Session-based requests require valid x-csrf-token header
- Bearer token requests exempt (don't use cookies)
- Test environment exempt for test execution

This addresses CodeQL security alert js/missing-token-validation while
maintaining support for both cookie-based and token-based authentication.

Related: #977 (OIDC/SSO authentication feature)
2026-04-13 12:17:35 +03:00

1389 lines
64 KiB
JSON

{
"common": {
"loading": "Cargando...",
"save": "Guardar",
"cancel": "Cancelar",
"delete": "Eliminar",
"edit": "Editar",
"create": "Crear",
"submit": "Enviar",
"close": "Cerrar",
"back": "Atrás",
"next": "Siguiente",
"completed": "Completado",
"error": "Error",
"success": "Éxito",
"appLoading": "Cargando aplicación... Por favor espere.",
"area": "Área",
"status": "Estado",
"saving": "Guardando...",
"none": "Ninguno",
"settings": "Configuraciones",
"discardChanges": "¿Descartar cambios?",
"discardChangesMessage": "Tienes cambios no guardados. ¿Estás seguro de que quieres descartarlos?",
"no": "No, seguir editando",
"yesDiscard": "Sí, descartar",
"uploading": "Subiendo...",
"refresh": "Actualizar",
"unlinking": "Desvinculando..."
},
"sidebar": {
"dashboard": "Tablero",
"projects": "Proyectos",
"tasks": "Tareas",
"calendar": "Calendario",
"notes": "Notas",
"settings": "Ajustes",
"areas": "Áreas",
"tags": "Etiquetas",
"today": "Hoy",
"total": "Total",
"upcoming": "Próximamente",
"nextActions": "Próximas Acciones",
"inbox": "Bandeja de Entrada",
"completed": "Completadas",
"allTasks": "Todas las Tareas",
"addAreaAriaLabel": "Agregar Área",
"addAreaTitle": "Agregar Área",
"addTagAriaLabel": "Agregar Etiqueta",
"addTagTitle": "Agregar Etiqueta",
"addInboxAriaLabel": "Agregar elemento de bandeja de entrada",
"addInboxTitle": "Agregar elemento de bandeja de entrada",
"addProjectAriaLabel": "Agregar proyecto",
"addProjectTitle": "Agregar proyecto",
"addNoteAriaLabel": "Agregar nota",
"addNoteTitle": "Agregar nota",
"createNew": "Crear nuevo",
"views": "Vistas",
"unpinView": "Desanclar vista",
"pinView": "Anclar vista"
},
"navigation": {
"home": "Inicio",
"dashboard": "Tablero",
"profile": "Perfil",
"profileSettings": "Configuración de Perfil",
"settings": "Ajustes",
"about": "Acerca de",
"logout": "Cerrar Sesión",
"backupRestore": "Copia de seguridad y restauración"
},
"settings": {
"todayPageSettings": "Configuración de Página Hoy",
"showDailyQuote": "Mostrar Cita Diaria",
"showMetrics": "Mostrar Métricas",
"showProductivity": "Mostrar Información de Productividad",
"showIntelligence": "Mostrar Sugerencias Inteligentes",
"showNextTaskSuggestion": "Sugerencia de Próxima Tarea",
"showSuggestions": "Mostrar Sugeridas",
"showDueToday": "Mostrar Tareas que Vencen Hoy",
"showCompleted": "Mostrar Tareas Completadas"
},
"dashboard": {
"overview": "Resumen",
"sameAsYesterday": "Igual que ayer",
"betterThanYesterday": "{{percentage}}% más que ayer",
"worseThanYesterday": "{{percentage}}% menos que ayer",
"sameAsAverage": "Igual que el promedio",
"betterThanAverage": "{{percentage}}% más que el promedio",
"worseThanAverage": "{{percentage}}% menos que el promedio",
"metrics": "Métricas",
"showMetrics": "Mostrar Métricas",
"hideMetrics": "Ocultar Métricas",
"insights": "Perspectivas",
"showInsights": "Mostrar Perspectivas",
"hideInsights": "Ocultar Perspectivas",
"intelligence": "Inteligencia",
"showIntelligence": "Mostrar Sugerencias de Inteligencia",
"hideIntelligence": "Ocultar Sugerencias de Inteligencia",
"completed": "Completado",
"showCompleted": "Mostrar Tareas Completadas",
"hideCompleted": "Ocultar Tareas Completadas"
},
"auth": {
"login": "Iniciar Sesión",
"register": "Registrarse",
"forgotPassword": "Olvidé mi Contraseña",
"email": "Correo Electrónico",
"password": "Contraseña",
"confirmPassword": "Confirmar Contraseña",
"username": "Nombre de Usuario",
"signup": "Registrarse",
"signin": "Iniciar Sesión",
"signout": "Cerrar Sesión",
"resetPassword": "Restablecer Contraseña",
"newPassword": "Nueva Contraseña",
"rememberMe": "Recordarme",
"loginSuccess": "Inicio de Sesión Exitoso",
"loginFailed": "Error al Iniciar Sesión",
"logoutSuccess": "Cierre de Sesión Exitoso",
"or_continue_with_email": "O continuar con el correo electrónico",
"sign_in_with": "Iniciar sesión con {{provider}}",
"oidc": {
"completing_signin": "Completando el inicio de sesión...",
"authenticating_with_provider": "Autenticando con el proveedor. Por favor, espere..."
}
},
"profile": {
"title": "Configuración de Perfil",
"appearance": "Apariencia",
"language": "Idioma",
"timezone": "Zona Horaria",
"theme": "Tema",
"english": "Inglés",
"spanish": "Español",
"greek": "Griego",
"ukrainian": "Ucraniano",
"deutsch": "Alemán",
"japanese": "Japonés",
"italian": "Italiano",
"languagePreference": "Preferencia de Idioma",
"personalInfo": "Información Personal",
"notifications": "Notificaciones",
"saveChanges": "Guardar Cambios",
"successMessage": "¡Perfil actualizado con éxito!",
"errorMessage": "Error al actualizar el perfil",
"taskIntelligence": "Inteligencia de Tareas",
"taskIntelligenceDescription": "Recibe sugerencias útiles para hacer los nombres de tus tareas más descriptivos y accionables.",
"enableTaskIntelligence": "Habilitar Asistente de Inteligencia de Tareas",
"enableTaskSummary": "Habilitar Resúmenes de Tareas",
"autoSuggestNextActions": "Auto-Sugerir Próximas Acciones",
"autoSuggestNextActionsDescription": "Al crear un proyecto, solicitar automáticamente la próxima acción física a realizar.",
"enableAutoSuggestNextActions": "Habilitar Avisos de Próximas Acciones",
"productivityFeatures": "Funciones de Productividad",
"pomodoroDescription": "Habilitar el temporizador Pomodoro en la barra de navegación para sesiones de trabajo enfocado.",
"enablePomodoro": "Habilitar Temporizador Pomodoro",
"productivityAssistant": "Asistente de Productividad",
"productivityAssistantDescription": "Mostrar información de productividad que ayude a identificar proyectos estancados, tareas vagas y mejoras en el flujo de trabajo en tu página de Hoy.",
"enableProductivityAssistant": "Habilitar Información de Productividad",
"nextTaskSuggestion": "Sugerencia de Próxima Tarea",
"nextTaskSuggestionDescription": "Sugerir automáticamente la mejor próxima tarea en la que trabajar cuando no tengas nada en progreso, priorizando tareas que vencen hoy, luego tareas sugeridas de tu página de Hoy.",
"enableNextTaskSuggestion": "Habilitar Sugerencias de Próxima Tarea",
"nextActionPrompt": "¿Cuál es la próxima acción física para este proyecto?",
"nextActionPlaceholder": "ej., Llamar al cliente para programar reunión, Investigar competidores en línea, Crear carpeta del proyecto...",
"addNextAction": "Agregar Próxima Acción",
"skipNextAction": "Omitir por ahora",
"nextActionHint": "Piensa en el paso más pequeño y concreto que puedes tomar ahora mismo para hacer avanzar este proyecto.",
"tabs": {
"general": "General",
"security": "Seguridad",
"productivity": "Productividad",
"telegram": "Telegram",
"ai": "Funciones IA",
"notifications": "Preferencias de Notificación",
"oidc": "OIDC/SSO"
},
"security": "Configuración de Seguridad",
"changePassword": "Cambiar Contraseña",
"currentPassword": "Contraseña Actual",
"newPassword": "Nueva Contraseña",
"confirmPassword": "Confirmar Nueva Contraseña",
"enterCurrentPassword": "Ingrese su contraseña actual",
"enterNewPassword": "Ingrese su nueva contraseña",
"confirmNewPassword": "Confirme su nueva contraseña",
"currentPasswordRequired": "La contraseña actual es obligatoria",
"newPasswordRequired": "La nueva contraseña es obligatoria",
"passwordTooShort": "La contraseña debe tener al menos 6 caracteres",
"passwordMismatch": "Las contraseñas no coinciden",
"passwordChangeError": "Error al cambiar la contraseña",
"passwordChangeSuccess": "¡Contraseña cambiada exitosamente!",
"changingPassword": "Cambiando contraseña...",
"accountSettings": "Cuenta y Preferencias",
"botSetup": "Configuración del Bot",
"pollingNote": "El sondeo verifica periódicamente nuevos mensajes de Telegram y los agrega a tu bandeja de entrada.",
"pollingDescription": "El sondeo verifica periódicamente nuevos mensajes de Telegram y los agrega a tu bandeja de entrada.",
"startPolling": "Iniciar Sondeo",
"stopPolling": "Detener Sondeo",
"startPollingLower": "iniciar sondeo",
"stopPollingLower": "detener sondeo",
"openTelegram": "Abrir en Telegram",
"openInTelegram": "abrir en telegram",
"setupTelegram": "Configurar Telegram",
"setupTelegramLower": "configurar telegram",
"passwordChangeNote": "Los cambios de contraseña se guardarán cuando hagas clic en \"Guardar Cambios\" en la parte inferior del formulario.",
"passwordChangeOptional": "Deja los campos de contraseña vacíos para actualizar otras configuraciones sin cambiar tu contraseña.",
"settings": "Configuraciones de Perfil",
"lightMode": "Modo Claro",
"darkMode": "Modo Oscuro",
"light": "Claro",
"dark": "Oscuro",
"languageChangedNote": "Los cambios de idioma se aplican inmediatamente",
"languageChanging": "Cambiando idioma...",
"telegramIntegration": "Integración de Telegram",
"telegramDescription": "Conecta tu cuenta de tududi a un bot de Telegram para agregar elementos a tu bandeja de entrada a través de mensajes de Telegram.",
"telegramBotToken": "Token del Bot de Telegram",
"telegramTokenDescription": "Crea un bot con @BotFather en Telegram y pega el token aquí.",
"telegramConnected": "¡Tu cuenta de Telegram está conectada! Envía mensajes a tu bot para agregar elementos a tu bandeja de entrada de tududi.",
"settingUp": "Configurando...",
"telegramSetupSuccess": "Bot de Telegram \"{{botName}}\" configurado exitosamente!",
"telegramSetupFailed": "Falló la configuración del bot de Telegram.",
"invalidTelegramToken": "Formato de token del bot de Telegram inválido.",
"telegramInstructions": "Ve a https://t.me/{{botUsername}} y comienza a chatear con tu bot para conectarlo a tu cuenta de tududi.",
"botConfigured": "¡Bot configurado exitosamente!",
"botUsername": "Nombre de Usuario del Bot:",
"pollingStatus": "Estado de Sondeo:",
"pollingActive": "Activo - Recibiendo mensajes",
"pollingInactive": "Inactivo - No recibiendo mensajes",
"pollingStarted": "Sondeo de Telegram iniciado",
"pollingStopped": "Sondeo de Telegram detenido",
"pollingError": "Error al gestionar el sondeo de Telegram",
"startPollingFailed": "Falló al iniciar el sondeo",
"stopPollingFailed": "Falló al detener el sondeo",
"testTelegramMessage": "Probar Telegram",
"testMessageSent": "¡Mensaje de prueba enviado exitosamente!",
"testMessageFailed": "Falló al enviar el mensaje de prueba.",
"testMessageError": "Error al enviar el mensaje de prueba.",
"taskSummaryNotifications": "Notificaciones de Resumen de Tareas",
"taskSummaryDescription": "Reciba resúmenes regulares de sus tareas a través de Telegram. Esta función requiere que la integración de Telegram esté configurada.",
"enableTaskSummaries": "Habilitar Resúmenes de Tareas",
"summaryFrequency": "Frecuencia de resumen",
"summaryFrequencyDescription": "Elija con qué frecuencia desea recibir resúmenes de tareas",
"sendTestSummary": "Enviar resumen de prueba",
"frequency": {
"1h": "1 hora",
"2h": "2 horas",
"4h": "4 horas",
"8h": "8 horas",
"12h": "12 horas",
"daily": "1 día",
"weekly": "1 semana"
},
"frequencyHelp": "Elija con qué frecuencia desea recibir resúmenes de tareas",
"french": "Francés",
"russian": "Ruso",
"turkish": "Turco",
"korean": "Coreano",
"vietnamese": "Vietnamita",
"arabic": "Árabe",
"dutch": "Holandés",
"romanian": "Rumano",
"chinese": "Chino",
"portuguese": "Portugués",
"indonesian": "Indonesio",
"bulgarian": "Búlgaro",
"danish": "Danés",
"finnish": "Finlandés",
"norwegian": "Noruego",
"polish": "Polaco",
"slovenian": "Esloveno",
"swedish": "Sueco",
"firstDayOfWeek": "Primer día de la semana",
"name": "Nombre",
"surname": "Apellido",
"enterName": "Introduce tu nombre",
"enterSurname": "Introduce tu apellido",
"avatar": "Profile Photo",
"uploadAvatar": "Upload Photo",
"removeAvatar": "Remove Avatar",
"avatarDescription": "Upload a profile photo (max 5MB)",
"avatarUploadError": "Please upload an image file",
"avatarSizeError": "Image must be smaller than 5MB",
"avatarUploadSuccess": "Avatar uploaded successfully!",
"avatarRemoveSuccess": "Avatar removed successfully!",
"avatarUploadFailed": "Failed to upload avatar",
"avatarRemoveFailed": "Failed to remove avatar",
"notificationsDescription": "Elige cómo deseas ser notificado sobre eventos importantes.",
"aiFeatures": "Funciones de IA",
"keyboardShortcuts": "Atajos de teclado",
"shortcuts": {
"enableShortcuts": "Habilitar atajos de teclado",
"enableDescription": "Activar o desactivar atajos de teclado globalmente.",
"duplicateWarning": "Atajos duplicados detectados:",
"pressKeys": "Presiona teclas...",
"duplicateWith": "Conflictos con {{action}}",
"record": "Grabar",
"resetToDefaults": "Restablecer a los valores predeterminados",
"info": "Los atajos de teclado te ayudan a navegar rápidamente. Los cambios se guardan cuando haces clic en \"Guardar cambios\" en la parte inferior de la página. Los atajos están deshabilitados al escribir en campos de texto.",
"actions": {
"inbox": "Crear nuevo elemento de bandeja de entrada",
"task": "Crear nueva tarea",
"project": "Crear nuevo proyecto",
"note": "Crear nueva nota",
"area": "Crear nueva área",
"tag": "Crear nueva etiqueta"
}
},
"connectedAccounts": {
"title": "Cuentas Conectadas",
"description": "Vincula cuentas externas para iniciar sesión con proveedores de SSO.",
"link": "Vincular {{provider}}",
"unlink": "Desvincular",
"confirmUnlink": "Confirmar Desvinculación",
"linkedOn": "Vinculado el {{date}}",
"cannotUnlinkLast": "No se puede desvincular su último método de autenticación. Por favor, establezca una contraseña primero.",
"noPasswordWarning": "No tiene ninguna contraseña establecida. Considere establecer una para tener un método de inicio de sesión alternativo."
}
},
"errors": {
"required": "Este campo es obligatorio",
"invalidEmail": "Por favor, introduce un correo electrónico válido",
"passwordMismatch": "Las contraseñas no coinciden",
"somethingWentWrong": "Algo salió mal, por favor intenta de nuevo",
"taskFetch": "Error al obtener tareas.",
"projectFetch": "Error al obtener proyectos.",
"taskCreate": "Error al crear la tarea.",
"taskUpdate": "Error al actualizar la tarea.",
"taskDelete": "Error al eliminar la tarea.",
"noteTitleRequired": "El título de la nota es obligatorio.",
"failedToLoadTags": "Error al cargar las etiquetas disponibles.",
"failedToSaveNote": "Error al guardar la nota.",
"projectCreationFailed": "Error al crear el proyecto.",
"projectNameRequired": "El nombre del proyecto es obligatorio.",
"projectSaveFailed": "Error al guardar el proyecto.",
"minLength": "La longitud mínima es de {{length}} caracteres",
"maxLength": "La longitud máxima es de {{length}} caracteres",
"serverError": "Error del servidor, por favor intente de nuevo más tarde",
"networkError": "Error de red, por favor verifique su conexión",
"areaNameRequired": "Se requiere el nombre del área.",
"failedToSaveArea": "No se pudo guardar el área.",
"tagNameRequired": "Se requiere el nombre de la etiqueta.",
"failedToSaveTag": "No se pudo guardar la etiqueta.",
"projectImageTooLarge": "La imagen es demasiado grande. Por favor, elige un archivo de menos de 10MB.",
"projectImageUpload": "Error al subir la imagen. Por favor, intenta con un archivo más pequeño o un formato diferente.",
"bannerSaveFailed": "Error al guardar el banner"
},
"dropdown": {
"createNew": "Crear Nuevo",
"task": "Tarea",
"project": "Proyecto",
"note": "Nota",
"area": "Área",
"inbox": "Bandeja de entrada",
"tag": "Etiqueta"
},
"tasks": {
"title": "Tareas",
"today": "Hoy",
"total": "Total",
"backlog": "Pendientes",
"inProgress": "En Progreso",
"overdue": "Vencidas",
"planned": "Planificadas",
"dueToday": "Vence Hoy",
"stale": "Atrasados",
"suggested": "Sugeridos",
"completedToday": "Completadas",
"noTasksAvailable": "No hay tareas disponibles para hoy.",
"searchPlaceholder": "Buscar tareas...",
"addNewTask": "Añadir Nueva Tarea",
"myPlanToday": "Mi Plan para Hoy",
"noPlanToday": "Aún no hay tareas planificadas para hoy",
"addToPlanHint": "Usa los iconos + junto a las tareas sugeridas para añadirlas a tu plan de hoy",
"blankSlateHint": "Comience creando una nueva tarea o cambiando sus filtros.",
"addToToday": "Añadir al plan de hoy",
"removeFromToday": "Eliminar del plan de hoy",
"weeklyCompletions": "Progreso Semanal",
"taskCompleted": "tarea completada",
"tasksCompleted": "tareas completadas",
"metrics": "Métricas",
"setInProgress": "Establecer en progreso",
"setNotStarted": "Establecer como no iniciado",
"showSubtasks": "Mostrar subtareas",
"hideSubtasks": "Ocultar subtareas",
"edit": "Editar tarea",
"delete": "Eliminar tarea",
"sortTasks": "Ordenar tareas",
"sortBy": "Ordenar por",
"direction": "Dirección",
"ascending": "Ascendente",
"descending": "Descendente",
"groupBy": "Agrupar por",
"groupByProject": "Proyecto",
"grouping": {
"none": "Ninguno"
},
"show": "Mostrar",
"all": "Todos",
"completedOnly": "Solo completadas",
"notCompleted": "No completadas",
"noProject": "Sin proyecto",
"unknownProject": "Proyecto desconocido",
"tasks": "tareas",
"showingItems": "Mostrando {{current}} de {{total}} tareas",
"open": "Abrir",
"completed": "Completado",
"noCompletedTasksToday": "No hay tareas completadas hoy.",
"markAsDone": "Mark as done",
"notStarted": "No Iniciado",
"done": "Hecho"
},
"timeline": {
"activityTimeline": "Línea de Tiempo de Actividad",
"showActivityTimeline": "Mostrar Línea de Tiempo de Actividad",
"hideActivityTimeline": "Ocultar Línea de Tiempo de Actividad",
"hideTimeline": "Ocultar Línea de Tiempo",
"failedToLoad": "Error al cargar la línea de tiempo",
"events": {
"taskCreated": "Tarea creada",
"statusChanged": "Estado cambiado",
"priorityChanged": "Prioridad cambiada",
"dueDateChanged": "Fecha de vencimiento cambiada",
"deferUntilChanged": "Defer date changed",
"nameUpdated": "Nombre actualizado",
"descriptionUpdated": "Descripción actualizada",
"noteUpdated": "Nota actualizada",
"projectChanged": "Proyecto cambiado",
"tagsUpdated": "Etiquetas actualizadas",
"taskArchived": "Tarea archivada",
"todayFlagChanged": "Bandera de Hoy Cambiada",
"status": "Estado",
"priority": "Prioridad",
"dueDate": "Fecha de vencimiento",
"deferUntil": "Defer until",
"none": "Ninguno",
"recurrenceEndDateChanged": "Fecha de finalización de la recurrencia cambiada",
"recurrenceEndDate": "Fecha de finalización de la recurrencia",
"recurrence_type_changed": "Tipo de recurrencia cambiado",
"recurrence_interval_changed": "Intervalo de recurrencia cambiado",
"completionBasedChanged": "Recurrencia basada en la finalización cambiada",
"projectIdChanged": "Asignado a un proyecto",
"recurrenceType": "Tipo de recurrencia",
"recurrenceTypeChanged": "Tipo de recurrencia cambiado",
"recurrence_weekday_changed": "Día de la semana de recurrencia cambiado",
"recurrence_month_day_changed": "Día del mes de recurrencia cambiado",
"recurrence_week_of_month_changed": "Semana del mes de recurrencia cambiada"
},
"justNow": "Justo ahora",
"minutesAgo": "{{minutes}}m hace",
"hoursAgo": "{{hours}}h hace",
"daysAgo": "{{days}}d hace",
"loadingTimeline": "Cargando línea de tiempo...",
"timelineWillAppear": "La línea de tiempo aparecerá después de guardar",
"noActivity": "Sin actividad aún"
},
"projects": {
"loading": "Cargando proyectos...",
"error": "Error al cargar proyectos",
"searchPlaceholder": "Buscar proyectos...",
"title": "Proyectos",
"noProjectsFound": "No se encontraron proyectos",
"cardViewAriaLabel": "Vista de Tarjetas",
"listViewAriaLabel": "Vista de Lista",
"active": "Activos",
"inactive": "Inactivos",
"metrics": "Proyectos",
"filters": {
"active": "Activos",
"inactive": "Inactivos",
"all": "Todos",
"allAreas": "Todas las áreas",
"notCompleted": "No Completados"
},
"selectState": "Seleccionar Estado",
"state": "Estado del Proyecto",
"showMetrics": "Mostrar métricas",
"hideMetrics": "Ocultar métricas",
"progress": "Progreso",
"taskMomentum": "Impulso de tareas",
"activeTasks": "Tareas activas",
"dueSchedule": "Cronograma de vencimientos",
"next14Days": "Próximos 14 días",
"noUpcomingDue": "No hay vencimientos en los próximos 14 días.",
"peakDay": "Pico",
"none": "Ninguno",
"next3days": "Próximos 3 días",
"nextWeek": "Próximos 7 días",
"recentCompletion": "Finalización reciente",
"last7And30": "Últimos 7 y 30 días",
"weeklyPace": "Ritmo semanal",
"prevWeekCompleted": "{{count}} semana anterior",
"vsPrevWeek": "vs semana anterior",
"monthlyCompletion": "Finalizaciones de 30 días",
"last30Days": "Últimos 30 días",
"nextUp": "Siguiente mejor acción",
"focusTask": "Tarea más impactante",
"focusHint": "Mueve esta tarea a en progreso y hoy",
"noNextAction": "Todo despejado: no hay tareas pendientes."
},
"projectItem": {
"edit": "Editar",
"delete": "Eliminar",
"completion": "Finalización",
"completionPercentage": "{{percentage}}% completado",
"toggleDropdownMenu": "Alternar menú desplegable",
"projectInitials": "Iniciales del proyecto",
"share": "Compartir",
"sharedProject": "Compartido con el equipo",
"noDueDate": "Sin fecha de vencimiento",
"dueToday": "Vence hoy",
"dueIn": "Vence en {{count}} {{unit}}",
"overdue": "Vencido hace {{count}} {{unit}}",
"day": "día",
"days": "días",
"sharedUser": "Usuario compartido",
"moreSharedUsers": "+{{count}} usuarios más"
},
"sort": {
"due_date": "Fecha de Vencimiento",
"name": "Nombre",
"priority": "Prioridad",
"status": "Estado",
"created_at": "Fecha de Creación"
},
"nextTask": {
"suggestion": "Como no hay nada en progreso, ¿qué tal empezar con",
"suggestionTodayPlan": "Como no hay nada en progreso, ¿qué tal empezar con esta tarea de tu plan de hoy",
"suggestionDueToday": "Como no hay nada en progreso, ¿qué tal empezar con esta tarea que vence hoy",
"suggestionSuggested": "Como no hay nada en progreso, ¿qué tal empezar con esta tarea sugerida",
"letsDoIt": "¡Sí, hagámoslo!",
"starting": "Iniciando...",
"startedSuccessfully": "¡Tarea iniciada exitosamente!",
"giveMeSomethingElse": "Dame algo más"
},
"modals": {
"confirmDelete": "¿Estás seguro que deseas eliminar?",
"taskCreation": "Crear Nueva Tarea",
"taskEdit": "Editar Tarea",
"noteCreation": "Crear Nueva Nota",
"noteEdit": "Editar Nota",
"updateNote": "Actualizar Nota",
"createNote": "Crear Nota",
"submitting": "Enviando...",
"createProject": "Crear Proyecto",
"updateProject": "Actualizar Proyecto",
"deleteProject": {
"title": "Eliminar Proyecto",
"message": "¿Estás seguro de que quieres eliminar el proyecto \"{{projectName}}\"?"
},
"deleteTask": {
"title": "Eliminar Tarea",
"confirmation": "¿Está seguro de que desea eliminar esta tarea? Esta acción no se puede deshacer."
},
"areaCreation": "Crear Nueva Área",
"areaEdit": "Editar Área",
"updateArea": "Actualizar Área",
"createArea": "Crear Área",
"updateTag": "Actualizar Etiqueta",
"createTag": "Crear Etiqueta",
"deleteTag": {
"title": "Eliminar Etiqueta",
"message": "¿Está seguro de que desea eliminar la etiqueta \"{{tagName}}\"?"
},
"deleteArea": {
"title": "Eliminar Área",
"message": "¿Está seguro de que desea eliminar el área \"{{areaName}}\"?"
},
"deleteNote": {
"title": "Eliminar Nota",
"message": "¿Está seguro de que desea eliminar la nota \"{{noteTitle}}\"?"
}
},
"forms": {
"title": "Título",
"description": "Descripción",
"dueDate": "Fecha de Vencimiento",
"deferUntil": "Defer until",
"priority": "Prioridad",
"status": "Estado",
"assignedTo": "Asignado a",
"category": "Categoría",
"tags": "Etiquetas",
"required": "Este campo es obligatorio",
"optional": "Opcional",
"noteTitle": "Título de la Nota",
"noteContent": "Contenido de la Nota",
"noteTitlePlaceholder": "Ingresar título de la nota",
"noteContentPlaceholder": "Ingresar contenido de la nota",
"areaName": "Nombre del Área",
"areaDescription": "Descripción del Área",
"areaNamePlaceholder": "Ingrese nombre del área",
"areaDescriptionPlaceholder": "Ingrese descripción del área",
"tagName": "Nombre de Etiqueta",
"tagNamePlaceholder": "Ingrese nombre de etiqueta",
"tagInputPlaceholder": "Escriba para agregar etiqueta",
"createTagOption": "+ Crear \"{{tagName}}\"",
"removeTagAriaLabel": "Eliminar etiqueta {{tagName}}",
"task": {
"namePlaceholder": "Agregar nombre de tarea",
"statusAndOptions": "Estado y Opciones",
"recurrence": "Recurrencia",
"labels": {
"tags": "Etiquetas",
"project": "Proyecto",
"status": "Estado",
"priority": "Prioridad",
"dueDate": "Fecha de Vencimiento",
"deferUntil": "Aplazar hasta",
"note": "Nota",
"recurrenceType": "Repetir",
"recurrenceInterval": "Cada",
"weekday": "En día",
"monthDay": "Día del mes",
"weekOfMonth": "Semana del mes",
"recurrenceEndDate": "Fecha de fin (opcional)",
"completionBased": "Repetir después de completar",
"repeatOn": "Repetir en"
},
"projectSearchPlaceholder": "Buscar o crear un proyecto...",
"noMatchingProjects": "No hay proyectos coincidentes",
"creatingProject": "Creando...",
"createProject": "+ Crear",
"recurrenceSettings": "Configuración de Recurrencia",
"completionBasedHelp": "Si está marcado, la siguiente tarea se creará basándose en la fecha de finalización en lugar de la fecha de vencimiento",
"dueDatePlaceholder": "Seleccionar fecha de vencimiento",
"endDatePlaceholder": "Seleccionar fecha de finalización",
"nameHelper": {
"title": "¡Hazlo más descriptivo!",
"suggestion": "Intenta agregar más detalles como \"Llamar al dentista para programar una cita de limpieza\" en lugar de simplemente \"Llamar al dentista\"",
"short": "¡Hazlo más descriptivo!",
"noVerb": "¡Añade un verbo de acción!",
"vague": "¡Sé más específico!"
},
"suggestions": {
"short": "Intenta ser más específico sobre lo que necesita hacerse",
"noVerb": "¿Qué acción específica necesitas tomar? Intenta comenzar con un verbo.",
"vague": "Intenta comenzar con un verbo de acción como \"Llamar\", \"Escribir\", \"Programar\", o \"Investigar\""
},
"selectAtLeastOneDay": "Por favor, selecciona al menos un día",
"deferUntilPlaceholder": "Seleccione la fecha y hora hasta la cual aplazar"
},
"projectDescriptionPlaceholder": "Ingrese la descripción del proyecto"
},
"dateFormats": {
"long": "EEEE, d 'de' MMMM 'de' yyyy",
"short": "d MMM yyyy",
"monthYear": "MMMM 'de' yyyy",
"dayMonth": "d 'de' MMMM",
"time": "H:mm",
"dateTime": "d MMM yyyy, H:mm",
"todayHeader": "dddd, d 'de' MMMM 'de' yyyy"
},
"taskViews": {
"project": {
"withName": "Actualmente estás viendo todas las tareas asociadas con el proyecto \"{{projectName}}\". Puedes organizar tareas dentro de este proyecto, establecer su prioridad y seguir su finalización. Utiliza este espacio para centrarte en las tareas que pertenecen específicamente a este proyecto.",
"noName": "Estás viendo tareas para un proyecto específico. Utiliza este espacio para gestionar y seguir las tareas asociadas a este proyecto."
},
"today": "Estas son las tareas que vencen hoy o tareas que has programado para atención inmediata. Usa esta vista para concentrarte en lo que debe completarse hoy. Marca tareas como completadas, actualiza su estado o ajusta sus fechas de vencimiento si es necesario.",
"total": "Total",
"inbox": "La bandeja de entrada es donde viven todas las tareas sin categorizar. Las tareas que no han sido asignadas a un proyecto o no tienen una fecha de vencimiento aparecerán aquí. Esta es tu área para \"volcar ideas\" donde puedes anotar rápidamente tareas y organizarlas más tarde.",
"next": "Esta vista muestra todas las tareas que son accionables en un futuro cercano. Estas tareas están listas para ser trabajadas a continuación y no tienen plazos a largo plazo. Es un buen lugar para concentrarte cuando buscas hacer un progreso rápido en las tareas.",
"upcoming": "Esta vista destaca las tareas programadas para la próxima semana. Te ayuda a prepararte y adelantarte a los plazos, dándote una visión general del trabajo que necesitas abordar en el futuro cercano. Las tareas con fechas de vencimiento dentro de los próximos 7 días aparecerán aquí.",
"someday": "La vista \"Algún día\" es para tareas que no son urgentes y no tienen una fecha de vencimiento específica. Estas son tareas que tal vez quieras hacer en algún momento, pero no son una prioridad ahora mismo. Utiliza esta sección para realizar un seguimiento de ideas u objetivos a largo plazo.",
"completed": "Aquí puedes ver todas las tareas que has completado. Es una excelente manera de revisar tus logros y reflexionar sobre el trabajo que has terminado. También puedes encontrar tareas que pueden necesitar ser desarchivadas o referenciadas en el futuro.",
"allTasks": "Estás viendo todas las tareas. Esto incluye tareas de diferentes proyectos, tareas sin fechas de vencimiento específicas y tareas con diferentes niveles de prioridad. Utiliza esta vista para una mirada general a todo en tu lista de pendientes."
},
"priority": {
"low": "Baja",
"medium": "Media",
"high": "Alta",
"none": "Ninguno"
},
"status": {
"notStarted": "No Iniciado",
"inProgress": "En Progreso",
"done": "Completado",
"archived": "Archivado",
"unknown": "Desconocido",
"telegramConnected": "Telegram conectado y sondeando",
"telegramConnectionProblem": "Problema de conexión de Telegram",
"completed": "Completado",
"waiting": "Esperando"
},
"project": {
"name": "Nombre del Proyecto",
"projectImage": "Imagen del Proyecto",
"uploadImageHint": "Sube una imagen para tu proyecto (máx. 10MB)",
"browseImage": "Examinar Imagen",
"noNotes": "No hay notas para este proyecto.",
"deleteProject": "Eliminar Proyecto",
"showCompleted": "Mostrar Completados",
"createSuccess": "¡Proyecto creado exitosamente!",
"createdAndAssigned": "Proyecto creado y asignado",
"createError": "Error al crear el proyecto",
"viewProject": "Ir al proyecto",
"editProject": "Editar proyecto",
"editBanner": "Editar banner del proyecto",
"currentBanner": "Banner actual",
"choosePreset": "Elige un banner preestablecido:",
"orUploadOwn": "O sube el tuyo propio:"
},
"task": {
"labels": {
"tags": "Etiquetas",
"project": "Proyecto",
"status": "Estado",
"priority": "Prioridad",
"dueDate": "Fecha de Vencimiento",
"deferUntil": "Defer until",
"note": "Nota"
},
"create": "Crear",
"addTaskName": "Agregar nombre de tarea",
"createSuccess": "Tarea creada exitosamente",
"createError": "Error al crear tarea",
"saveAsTask": "Guardar como Tarea",
"suggestions": {
"short": "Trata de ser más específico acerca de lo que necesita hacerse",
"noVerb": "¿Qué acción específica necesita realizar? Intente comenzar con un verbo.",
"vague": "Intenta comenzar con un verbo de acción como \"Llamar\", \"Escribir\", \"Programar\" o \"Investigar\""
},
"nameHelper": {
"title": "¡Hazlo más descriptivo!",
"suggestion": "Intenta agregar más detalles como \"Llamar al dentista para programar cita de limpieza\" en lugar de solo \"Llamar dentista\""
},
"updateSuccess": "Tarea actualizada con éxito",
"updateError": "Error al actualizar la tarea",
"deleteSuccess": "Tarea eliminada con éxito",
"deleteError": "Error al eliminar la tarea",
"startedSuccessfully": "¡Tarea iniciada con éxito!",
"created": "Tarea",
"createdSuccessfully": "creada con éxito!",
"updated": "Tarea",
"updatedSuccessfully": "actualizada con éxito!",
"deleted": "Tarea",
"deletedSuccessfully": "eliminada con éxito!",
"overdueAlert": "Esta tarea estaba en tu plan ayer y no se completó.",
"overdueYesterday": "Considera priorizar esta tarea o dividirla en pasos más pequeños.",
"overdueMultipleDays": "Esta tarea ha sido pospuesta {{count}} veces.",
"content": "Contenido",
"noNotes": "No se ha añadido contenido aún",
"subtasks": "Subtareas",
"noSubtasks": "No hay subtareas aún",
"recentActivity": "Actividad Reciente",
"noActivityYet": "No hay actividad aún",
"thisTask": "Esta tarea",
"is": "es",
"and": "y",
"dueOn": "vencida",
"inProject": "del proyecto",
"lowPriority": "baja prioridad",
"mediumPriority": "prioridad media",
"highPriority": "alta prioridad",
"inDays": "en {{count}} días",
"daysAgo": "{{count}} días atrás",
"tagsUpdated": "Etiquetas actualizadas con éxito",
"tagsUpdateError": "Error al actualizar las etiquetas",
"recurrenceUpdated": "Recurrencia actualizada con éxito",
"recurrenceUpdateError": "Error al actualizar la recurrencia",
"dueDateUpdated": "Fecha de vencimiento actualizada con éxito",
"dueDateUpdateError": "Error al actualizar la fecha de vencimiento",
"titleUpdated": "Título de la tarea actualizado con éxito",
"titleUpdateError": "Error al actualizar el título de la tarea",
"contentUpdated": "Contenido de la tarea actualizado con éxito",
"contentUpdateError": "Error al actualizar el contenido de la tarea",
"subtasksUpdated": "Subtareas actualizadas con éxito",
"subtasksUpdateError": "Error al actualizar las subtareas",
"projectUpdated": "Proyecto actualizado con éxito",
"projectUpdateError": "Error al actualizar el proyecto",
"projectCleared": "Proyecto limpiado con éxito",
"projectClearError": "Error al limpiar el proyecto",
"priorityUpdated": "Prioridad actualizada con éxito",
"priorityUpdateError": "Error al actualizar la prioridad",
"status": {
"notStarted": "no iniciado",
"inProgress": "en progreso",
"done": "completado",
"archived": "archivado",
"unknown": "en curso",
"waiting": "Esperando",
"setAsDone": "Marcar como hecho",
"planned": "Planificado",
"cancelled": "Cancelado"
},
"noSubtasksClickToAdd": "No hay subtareas aún, haz clic para agregar",
"project": "Proyecto",
"noProject": "Sin proyecto - Haz clic para asignar",
"tags": "Etiquetas",
"noTags": "Sin etiquetas",
"priority": "Prioridad",
"dueDate": "Fecha de vencimiento",
"deferUntil": "Aplazar hasta",
"recurringSetup": "Configuración recurrente",
"notRecurring": "Esta tarea aún no es recurrente.",
"clickToEditTitle": "Haz clic para editar el título",
"clickToEditContent": "Haz clic para editar el contenido",
"clickToAddContent": "Haz clic para agregar contenido",
"clickToEditSubtasks": "Haz clic para editar subtareas",
"clickToAddOrEditSubtasks": "Haz clic para agregar o editar subtareas",
"contentPlaceholder": "Agrega contenido aquí... (Markdown soportado)",
"contentEditHint": "Presiona Cmd/Ctrl+Enter para guardar, Esc para cancelar",
"noContentPreview": "No hay contenido para previsualizar. Cambia a modo de edición para agregar contenido.",
"deleteConfirmTitle": "Eliminar Tarea",
"deleteConfirmMessage": "¿Estás seguro de que deseas eliminar esta tarea? Esta acción no se puede deshacer.",
"noMoreIterations": "No hay más iteraciones programadas",
"nextOccurrences": "Próximas Ocurrencias",
"nextOccurrencesAfterThis": "Próximas Ocurrencias Después de Esto",
"noDueDate": "Sin fecha de vencimiento",
"instanceOf": "Esta es una instancia de una tarea recurrente",
"parentTask": "Tarea principal",
"includingToday": "incluyendo hoy",
"has": "tiene",
"fromProject": "del proyecto",
"noDeferUntil": "No aplazar hasta",
"deferUntilUpdated": "Aplazar hasta que se actualice correctamente",
"deferUntilUpdateError": "Error al actualizar el aplazamiento",
"showOverdueWarning": "Mostrar advertencia de vencimiento",
"dueDateInPastWarning": "Advertencia: Estás estableciendo una fecha de vencimiento en el pasado",
"overview": "Resumen",
"schedule": "Programar",
"attachments": "Adjuntos",
"attachmentsComingSoon": "Función de adjuntos próximamente",
"activity": "Actividad",
"lastUpdatedAt": "Última actualización en",
"statusUpdated": "Estado actualizado con éxito",
"statusUpdateError": "Error al actualizar el estado",
"updatedAt": "Actualizado en",
"upcoming": "próximo"
},
"dateIndicators": {
"today": "HOY",
"total": "Total",
"tomorrow": "MAÑANA",
"yesterday": "AYER",
"nextWeek": "la próxima semana",
"nextMonth": "el próximo mes"
},
"inbox": {
"title": "Bandeja de Entrada",
"empty": "Su bandeja de entrada está vacía",
"emptyDescription": "Capture rápidamente pensamientos e ideas usando el icono ⚡ en la barra superior o el botón + en la barra lateral",
"description": "La bandeja de entrada es donde se encuentran todas las tareas sin categorizar. Las tareas que no han sido asignadas a un proyecto o no tienen fecha de vencimiento aparecerán aquí. Esta es tu área de 'volcado mental' donde puedes anotar rápidamente tareas y organizarlas más tarde.",
"captureThought": "Capture su pensamiento...",
"saveToInbox": "Guardar en Bandeja de Entrada",
"itemAdded": "Elemento agregado a la bandeja de entrada",
"itemProcessed": "Elemento procesado",
"itemDeleted": "Elemento eliminado",
"itemUpdated": "Elemento actualizado",
"newTelegramItem": "Nuevo elemento de Telegram: {{content}}",
"newItem": "Nuevo elemento agregado a la bandeja de entrada: {{content}}",
"multipleNewItems": "{{count}} elementos más agregados",
"loadError": "Error al cargar elementos de la bandeja de entrada",
"addError": "Error al agregar elemento a la bandeja de entrada",
"processError": "Error al procesar elemento de la bandeja de entrada",
"deleteError": "Error al eliminar elemento de la bandeja de entrada",
"updateError": "Error al actualizar elemento de la bandeja de entrada",
"contentRequired": "El contenido no puede estar vacío",
"createTask": "Crear tarea",
"createProject": "Crear proyecto",
"createNote": "Crear nota",
"convertTo": "Convertir a",
"unprocessedItems": "Tiene {{count}} elemento(s) en su bandeja de entrada",
"processNow": "Procesar ahora",
"deleteConfirmTitle": "Eliminar Elemento",
"deleteConfirmMessage": "¿Está seguro de que desea eliminar este elemento de la bandeja de entrada? Esta acción no se puede deshacer.",
"loadMoreError": "Error al cargar más elementos",
"loading": "Cargando...",
"loadMore": "Cargar más elementos de la bandeja de entrada",
"showingItems": "Mostrando {{current}} de {{total}} elementos"
},
"areas": {
"title": "Áreas",
"noAreasFound": "No se encontraron áreas",
"editAreaAriaLabel": "Editar área {{name}}",
"editAreaTitle": "Editar área {{name}}",
"deleteAreaAriaLabel": "Eliminar área {{name}}",
"deleteAreaTitle": "Eliminar área {{name}}",
"addArea": "Agregar Área",
"loading": "Cargando detalles del área...",
"error": "Error al cargar detalles del área.",
"notFound": "Área no encontrada.",
"details": "Detalles del Área",
"viewProjects": "Ver Proyectos en {{name}}"
},
"notes": {
"loading": "Cargando notas...",
"error": "Error al cargar notas",
"searchPlaceholder": "Buscar notas...",
"noNotesFound": "No se encontraron notas",
"title": "Notas",
"deleteNoteAriaLabel": "Eliminar nota {{noteTitle}}",
"deleteNoteTitle": "Eliminar nota {{noteTitle}}",
"editNoteAriaLabel": "Editar nota {{noteTitle}}",
"editNoteTitle": "Editar nota {{noteTitle}}"
},
"tags": {
"loading": "Cargando etiquetas...",
"searchPlaceholder": "Buscar etiquetas...",
"title": "Etiquetas",
"noTagsFound": "No se encontraron etiquetas",
"editTagAriaLabel": "Editar etiqueta {{tagName}}",
"editTagTitle": "Editar etiqueta {{tagName}}",
"deleteTagAriaLabel": "Eliminar etiqueta {{tagName}}",
"deleteTagTitle": "Eliminar etiqueta {{tagName}}",
"error": "Error al obtener etiqueta.",
"notFound": "Etiqueta no encontrada.",
"details": "Detalles de la Etiqueta",
"name": "Nombre",
"status": "Estado",
"active": "Activa",
"inactive": "Inactiva",
"viewTasksWithTag": "Ver tareas con esta etiqueta",
"typeToAdd": "Escriba para agregar una etiqueta",
"noItemsWithTag": "No se encontraron elementos con esta etiqueta"
},
"note": {
"title": "Título",
"content": "Contenido",
"titlePlaceholder": "Ingrese título de la nota",
"contentPlaceholder": "Ingrese contenido de la nota",
"project": "Proyecto Relacionado (Opcional)",
"createSuccess": "Nota creada exitosamente",
"createError": "Error al crear nota"
},
"success": {
"noteUpdated": "¡Nota actualizada con éxito!",
"noteCreated": "¡Nota creada con éxito!",
"areaUpdated": "¡Área actualizada con éxito!",
"areaCreated": "¡Área creada con éxito!",
"tagUpdated": "¡Etiqueta actualizada con éxito!",
"tagCreated": "¡Etiqueta creada con éxito!",
"projectCreated": "¡Proyecto creado con éxito!",
"projectDeleted": "¡Proyecto eliminado con éxito!",
"taskCreated": "¡Tarea creada con éxito!",
"taskUpdated": "¡Tarea actualizada con éxito!",
"taskDeleted": "¡Tarea eliminada con éxito!",
"nextActionAdded": "¡Próxima acción agregada con éxito!",
"noteDeleted": "¡Nota eliminada con éxito!",
"bannerUpdated": "¡Banner actualizado con éxito!"
},
"recurrence": {
"none": "Ninguna",
"daily": "Diariamente",
"weekly": "Semanalmente",
"monthly": "Mensualmente",
"monthlyWeekday": "Mensualmente en día de semana",
"monthlyLastDay": "Mensualmente el último día",
"firstWeek": "Primera semana",
"secondWeek": "Segunda semana",
"thirdWeek": "Tercera semana",
"fourthWeek": "Cuarta semana",
"lastWeek": "Última semana",
"days": "días",
"loadingParentSettings": "Cargando configuraciones de recurrencia de tarea principal...",
"recurringTaskInstance": "Instancia de tarea recurrente",
"inheritedSettingsMessage": "Esta tarea fue generada a partir de una tarea recurrente. La configuración de recurrencia que se muestra a continuación se hereda de la tarea original y no se puede editar aquí.",
"cancelEdit": "Cancelar Edición",
"editParentRecurrence": "Editar Recurrencia Principal",
"parentEditWarning": "⚠️ Estás editando la configuración de recurrencia de la tarea principal. Los cambios afectarán a todas las instancias futuras de esta tarea recurrente."
},
"weekdays": {
"monday": "Lun",
"tuesday": "Mar",
"wednesday": "Mié",
"thursday": "Jue",
"friday": "Vie",
"saturday": "Sáb",
"sunday": "Dom"
},
"pomodoro": {
"play": "Reproducir",
"pause": "Pausar",
"reset": "Reiniciar",
"close": "Cerrar",
"complete": "¡Pomodoro Completado!",
"completeMessage": "¡Excelente trabajo! Hora de tomar un descanso.",
"done": "Hecho"
},
"calendar": {
"month": "Mes",
"week": "Semana",
"day": "Día",
"today": "Hoy",
"total": "Total",
"addEvent": "Agregar Evento",
"weekView": "Vista Semanal",
"dayView": "Vista Diaria",
"loadingTasks": "Cargando tareas...",
"noEvents": "No hay eventos para este día",
"moreEvents": "más",
"googleIntegration": "Integración de Google Calendar",
"googleDescription": "Conecta tu Google Calendar para sincronizar eventos y verlos junto con tus tareas.",
"googleStatus": "Estado",
"notConnected": "No Conectado",
"connected": "Conectado",
"connectGoogle": "Conectar Google Calendar",
"disconnectGoogle": "Desconectar Google Calendar",
"connecting": "Conectando...",
"connectionError": "Error al conectar con Google Calendar. Inténtalo de nuevo.",
"disconnectionError": "Error al desconectar de Google Calendar. Inténtalo de nuevo.",
"taskDetails": "Detalles de la Tarea",
"editTask": "Editar Tarea",
"goToTasks": "Ir a Tareas",
"close": "Cerrar",
"title": "Título",
"status": "Estado",
"dueDate": "Fecha de Vencimiento",
"deferUntil": "Defer until",
"priority": "Prioridad",
"project": "Proyecto",
"area": "Área",
"description": "Descripción",
"created": "Creado",
"completed": "Completado",
"pending": "Pendiente",
"high": "Alta",
"medium": "Media",
"low": "Baja",
"time": "Tiempo",
"allDay": "Todo el día"
},
"productivity": {
"stalledProjects": "Proyectos Estancados",
"stalledProjectsDesc": "Estos proyectos no tienen tareas o acciones",
"needsNextAction": "Proyectos Necesitan Próxima Acción",
"needsNextActionDesc": "Estos proyectos han completado tareas pero no tienen próxima acción",
"tasksAreProjects": "Tareas que Parecen Proyectos",
"tasksAreProjectsDesc": "Estas tareas podrían necesitar ser desglosadas",
"vagueTasks": "Tareas sin Acción Clara",
"vagueTasksDesc": "Estas tareas necesitan verbos de acción más claros",
"staleTasks": "Tareas Obsoletas",
"staleTasksDesc": "Tareas no actualizadas en {{days}} días",
"stuckProjects": "Proyectos Atascados",
"stuckProjectsDesc": "Proyectos no actualizados recientemente",
"reviewItems": "Haga clic para revisar y mejorar su flujo de trabajo",
"suggestion": "Haga clic en cualquier elemento de arriba para abrirlo y hacer mejoras.",
"issuesFound_one": "1 problema de productividad necesita atención",
"issuesFound_other": "{{count}} problemas de productividad necesitan atención"
},
"pages": {
"notFound": {
"title": "404 - Página No Encontrada",
"message": "La página que estás buscando no existe."
}
},
"navbar": {
"appName": "tududi",
"quickInboxCapture": "Captura Rápida de Bandeja de Entrada",
"userMenu": "Menú de Usuario",
"collapseSidebar": "Colapsar Barra Lateral",
"expandSidebar": "Expandir Barra Lateral"
},
"upload": {
"uploading": "Subiendo..."
},
"searchPlaceholders": {
"searchProjects": "Buscar proyectos...",
"searchTags": "Buscar etiquetas...",
"searchTasks": "Buscar tareas..."
},
"ariaLabels": {
"hideInfo": "Ocultar información",
"aboutTasks": "Acerca de las Tareas",
"hideSearch": "Ocultar búsqueda",
"searchTasks": "Buscar Tareas",
"aboutInbox": "Acerca de la Bandeja de Entrada",
"collapseInfoPanel": "Colapsar panel de información",
"showTasksInformation": "Mostrar información de tareas",
"collapseSearchPanel": "Colapsar panel de búsqueda",
"showSearchInput": "Mostrar entrada de búsqueda",
"showInboxInformation": "Mostrar información de la bandeja de entrada"
},
"api": {
"errors": {
"authenticationRequired": "Se requiere autenticación",
"userNotFound": "Usuario no encontrado",
"authenticationError": "Error de autenticación",
"internalServerError": "Error interno del servidor",
"invalidLoginParameters": "Parámetros de inicio de sesión inválidos.",
"invalidCredentials": "Credenciales inválidas",
"couldNotLogout": "No se pudo cerrar sesión",
"loggedOutSuccessfully": "Cierre de sesión exitoso",
"contentRequired": "Se requiere contenido",
"inboxItemNotFound": "Elemento de la bandeja de entrada no encontrado.",
"inboxItemDeleted": "Elemento de la bandeja de entrada eliminado con éxito",
"contentRequiredString": "Se requiere contenido y debe ser una cadena",
"problemCreatingInboxItem": "Hubo un problema al crear el elemento de la bandeja de entrada.",
"problemUpdatingInboxItem": "Hubo un problema al actualizar el elemento de la bandeja de entrada.",
"problemDeletingInboxItem": "Hubo un problema al eliminar el elemento de la bandeja de entrada.",
"problemProcessingInboxItem": "Hubo un problema al procesar el elemento de la bandeja de entrada.",
"invalidOrderColumn": "Columna de orden inválida especificada.",
"taskNotFound": "Tarea no encontrada.",
"taskNameRequired": "Se requiere el nombre de la tarea.",
"invalidProject": "Proyecto inválido.",
"unableToUpdateTask": "No se puede actualizar la tarea.",
"taskDeleted": "Tarea eliminada con éxito.",
"failedToGenerateRecurringTasks": "Error al generar tareas recurrentes.",
"failedToUpdateTodayFlag": "Error al actualizar la bandera de tarea de hoy.",
"noImageProvided": "No se proporcionó ningún archivo de imagen.",
"failedToUploadImage": "Error al subir la imagen.",
"projectNotFound": "Proyecto no encontrado.",
"projectNameRequired": "Se requiere el nombre del proyecto.",
"projectDeleted": "Proyecto eliminado con éxito.",
"noteNotFound": "Nota no encontrada.",
"noteDeleted": "Nota eliminada con éxito.",
"profileNotFound": "Perfil no encontrado.",
"passwordTooShort": "La contraseña debe tener al menos 6 caracteres.",
"currentPasswordIncorrect": "La contraseña actual es incorrecta.",
"failedToUpdateProfile": "Error al actualizar el perfil.",
"passwordChangeRequired": "Se requiere la contraseña actual y la nueva contraseña",
"passwordChangedSuccessfully": "Contraseña cambiada con éxito",
"failedToUpdateTaskSummary": "Error al actualizar la configuración del resumen de la tarea.",
"frequencyRequired": "La frecuencia es obligatoria.",
"invalidFrequency": "Valor de frecuencia no válido.",
"failedToStartTelegramPolling": "Error al iniciar la consulta de Telegram.",
"failedToStopTelegramPolling": "Error al detener la consulta de Telegram.",
"invalidTelegramTokenFormat": "Formato de token de bot de Telegram no válido.",
"invalidBotToken": "Token de bot no válido o bot no accesible.",
"chatIdRequired": "Se requiere el ID de chat.",
"areaNotFound": "Área no encontrada o no pertenece al usuario actual.",
"areaNameRequired": "Se requiere el nombre del área.",
"tagNotFound": "Etiqueta no encontrada",
"tagNameRequired": "Se requiere el nombre de la etiqueta",
"tagDeleted": "Etiqueta eliminada con éxito",
"demoModeGoogleCalendar": "Modo de demostración: integración de Google Calendar simulada",
"failedToGenerateAuthUrl": "Error al generar la URL de autorización",
"authCodeNotProvided": "Código de autorización no proporcionado",
"failedToCheckCalendarStatus": "Error al verificar el estado del calendario",
"failedToFetchCalendarEvents": "Error al obtener eventos del calendario",
"googleCalendarDisconnected": "Google Calendar desconectado",
"failedToDisconnectCalendar": "Error al desconectar el calendario",
"urlParameterRequired": "Se requiere el parámetro de URL",
"couldNotExtractMetadata": "No se pudo extraer los metadatos",
"textParameterRequired": "Se requiere el parámetro de texto",
"notFound": "No encontrado",
"resourceNotFound": "No se pudo encontrar el recurso solicitado."
}
},
"telegram": {
"welcomeMessage": "🎉 ¡Bienvenido a tududi!\n\n¡Tu bot personal de gestión de tareas está ahora conectado y listo para ayudar!\n\n📝 Simplemente envíame cualquier mensaje y lo agregaré a tu bandeja de entrada de tududi como un elemento.\n\n✨ Comandos:\n• /help - Mostrar información de ayuda\n• /start - Mostrar mensaje de bienvenida\n• Simplemente escribe cualquier texto - Agrégalo como un elemento de bandeja de entrada\n\n¡Vamos a organizarnos! 🚀",
"helpMessage": "📋 Ayuda del Bot tududi\n\nEnvíame cualquier mensaje de texto y lo agregaré a tu bandeja de entrada de tududi como un elemento de bandeja de entrada.\n\nComandos:\n/start - Mensaje de bienvenida\n/help - Mostrar este mensaje de ayuda\n\n¡Simplemente escribe tu elemento y yo me encargaré del resto!",
"commandProcessed": "Comando procesado con éxito",
"messageProcessed": "Mensaje procesado con éxito",
"failedToAddToInbox": "❌ Error al agregar a la bandeja de entrada: {{error}}"
},
"about": {
"title": "Acerca de",
"version": "Versión",
"description": "Gestión de tareas autohospedada con organización jerárquica, soporte multilingüe e integración con Telegram. Construido con amor para los entusiastas de la productividad.",
"madeWithLove": "Hecho con amor",
"appreciation": "¡Gracias por usar tududi! Su apoyo ayuda a mantener este proyecto vivo y en crecimiento. Si lo encuentra útil, considere apoyar el desarrollo.",
"supportDevelopment": "Apoyar el Desarrollo",
"community": "Comunidad",
"viewOnGitHub": "Ver en GitHub",
"license": "Licenciado para uso personal",
"builtBy": "Construido por"
},
"weekdaysFull": {
"sunday": "Domingo",
"monday": "Lunes",
"tuesday": "Martes",
"wednesday": "Miércoles",
"thursday": "Jueves",
"friday": "Viernes",
"saturday": "Sábado"
},
"admin": {
"manageUsers": "Gestionar usuarios",
"userManagement": "Gestión de usuarios",
"addUser": "Agregar usuario",
"remove": "Eliminar",
"email": "Correo electrónico",
"created": "Creado",
"role": "Rol",
"loadingUsers": "Cargando usuarios...",
"noUsers": "No hay usuarios",
"admin": "administrador",
"user": "usuario",
"password": "Contraseña",
"name": "Nombre",
"surname": "Apellido",
"authenticationRequired": "Autenticación requerida",
"forbidden": "Prohibido",
"failedToLoadUsers": "Error al cargar usuarios",
"emailAlreadyExists": "El correo electrónico ya existe",
"failedToCreateUser": "Error al crear usuario",
"badRequest": "Solicitud incorrecta",
"userNotFound": "Usuario no encontrado",
"failedToDeleteUser": "Error al eliminar usuario",
"editUser": "Editar usuario",
"actions": "Acciones",
"passwordOptional": "Dejar en blanco para mantener el actual",
"failedToUpdateUser": "Error al actualizar el usuario",
"confirmDelete": "¿Está seguro de que desea eliminar este usuario?",
"deleteUser": "Eliminar usuario",
"confirmDeleteUser": "¿Está seguro de que desea eliminar {{email}}? Esta acción no se puede deshacer."
},
"shares": {
"shareProject": "Compartir proyecto",
"targetUser": "Seleccionar usuario",
"selectUserPlaceholder": "Selecciona un usuario...",
"permission": "Permiso",
"readOnly": "Solo lectura",
"readWrite": "Lectura y escritura",
"owner": "Propietario",
"share": "Compartir",
"revoke": "Revocar",
"currentShares": "Usuarios con acceso",
"noShares": "Aún no compartido",
"noAvailableUsers": "No hay usuarios disponibles para compartir",
"shared": "Compartido",
"sharedWithTeam": "Compartido con el equipo"
},
"views": {
"title": "Vistas Inteligentes",
"loading": "Cargando vistas...",
"searchPlaceholder": "Buscar vistas...",
"noViewsFound": "No se encontraron vistas. Crea una vista realizando una búsqueda y haciendo clic en \"Guardar como Vista Inteligente\".",
"deleteView": "Eliminar Vista",
"confirmDelete": "¿Estás seguro de que deseas eliminar la vista \"{{viewName}}\"?",
"pinView": "Anclar vista",
"unpinView": "Desanclar vista",
"searchCriteria": "Criterios de Búsqueda",
"entityTypes": "Tipos de Entidad",
"searchText": "Texto de Búsqueda",
"priority": "Prioridad",
"dueDate": "Fecha de Vencimiento",
"deferUntil": "Defer until",
"noCriteriaSet": "No se han establecido criterios específicos",
"priorityLabel": "Prioridad:",
"dueLabel": "Vence:",
"tags": "Etiquetas",
"recurring": "Recurrente"
},
"search": {
"placeholder": "Buscar tareas, proyectos, notas...",
"searchingFor": "Estás buscando",
"allItems": "todos los elementos",
"containingText": ", que contiene el texto",
"withPriority": ", con",
"priority": "prioridad",
"due": ", vencido",
"taggedWith": ", etiquetado con",
"and": "y",
"criteria": "Criterios de Búsqueda",
"metadataFilters": "Filtros de Metadatos",
"priorityFilter": "Prioridad",
"dueFilter": "Vencido",
"tagsFilter": "Etiquetas",
"saveAsSmartView": "Guardar como Vista Inteligente",
"viewName": "Nombre de la Vista",
"viewNameRequired": "El nombre de la vista es obligatorio",
"viewNamePlaceholder": "Ingresa el nombre de la vista",
"failedToSave": "Error al guardar la vista. Por favor, inténtalo de nuevo.",
"cancel": "Cancelar",
"saving": "Guardando...",
"saveView": "Guardar Vista",
"startTyping": "Comienza a escribir para buscar o seleccionar filtros arriba",
"noResults": "No se encontraron resultados",
"entityTypes": {
"task": "tarea",
"project": "proyecto",
"area": "área",
"note": "nota"
},
"thatAre": ", que son",
"extras": "Extras",
"recurringFilter": {
"label": "Recurrente",
"recurring": "plantillas recurrentes",
"nonRecurring": "no recurrente",
"instances": "instancias recurrentes"
},
"deferUntilFilter": "Aplazar hasta",
"deferUntil": ", aplazar hasta",
"extrasFilter": {
"isRecurring": "es Recurrente",
"isOverdue": "está Vencido",
"hasContent": "tiene Contenido",
"isDeferred": "está Diferido",
"hasTags": "tiene Etiquetas",
"isAssignedToProject": "está Asignado al Proyecto"
}
},
"subtasks": {
"placeholder": "Agregar una subtarea..."
},
"backup": {
"restore": "Restaurar",
"download": "Descargar",
"downloadSuccess": "¡Copia de seguridad descargada con éxito!",
"downloadError": "Error al descargar la copia de seguridad",
"confirmRestore": "Restaurar copia de seguridad",
"confirmRestoreMessage": "¿Está seguro de que desea restaurar esta copia de seguridad? Esto fusionará los datos respaldados con sus datos actuales.",
"restoreSuccess": "¡Copia de seguridad restaurada con éxito! Creado: {{tasks}} tareas, {{projects}} proyectos, {{notes}} notas",
"restoreError": "Error al restaurar la copia de seguridad",
"confirmDelete": "Eliminar copia de seguridad",
"confirmDeleteMessage": "¿Está seguro de que desea eliminar esta copia de seguridad? Esta acción no se puede deshacer.",
"deleteSuccess": "¡Copia de seguridad eliminada con éxito!",
"deleteError": "Error al eliminar la copia de seguridad",
"importTitle": "Importar desde archivo",
"importDescription": "Suba un archivo de copia de seguridad para restaurar sus datos. Sus datos existentes se preservarán y se agregarán nuevos elementos de la copia de seguridad.",
"importNote": "Importante:",
"importNoteDescription": "La importación fusionará los datos con sus elementos existentes. Los elementos duplicados (mismo UID) serán omitidos.",
"selectFile": "Seleccionar archivo de copia de seguridad",
"clickToUpload": "Haga clic para buscar archivos",
"restoreBackup": "Restaurar copia de seguridad",
"importing": "Importando...",
"importSuccess": "¡Copia de seguridad importada con éxito! Creado: {{tasks}} tareas, {{projects}} proyectos, {{notes}} notas",
"importError": "Error al importar la copia de seguridad",
"backupContents": "Contenido de la copia de seguridad:",
"validationError": "El archivo seleccionado no es una copia de seguridad válida",
"validationErrors": "Errores de validación:",
"versionIncompatible": "Versión incompatible",
"backupVersion": "Versión de la copia de seguridad",
"title": "Copia de seguridad y restauración",
"description": "Crea copias de seguridad o restaura desde copias de seguridad anteriores. Tus últimas 5 copias de seguridad se guardan automáticamente.",
"createBackup": "Crear copia de seguridad",
"importFromFile": "Importar desde archivo",
"createNewBackup": "Crear nueva copia de seguridad",
"createDescription": "Crea una nueva copia de seguridad de todos tus datos. Las copias de seguridad se guardan en el servidor y puedes restaurarlas más tarde.",
"createBackupNow": "Crear copia de seguridad ahora",
"creating": "Creando copia de seguridad...",
"exportSuccess": "¡Copia de seguridad creada con éxito!",
"exportError": "Error al crear la copia de seguridad",
"savedBackups": "Copias de seguridad guardadas",
"noBackups": "No se encontraron copias de seguridad. Crea tu primera copia de seguridad arriba.",
"createdAt": "Creado",
"version": "Versión",
"currentVersion": "Versión actual",
"size": "Tamaño",
"contents": "Contenido",
"actions": "Acciones",
"restoreButton": "Restaurar"
},
"notifications": {
"table": {
"type": "Tipo de Notificación"
},
"channels": {
"inApp": "En la aplicación",
"email": "Correo Electrónico",
"push": "Push",
"telegram": "Telegram"
},
"types": {
"dueTasks": "Tareas Vencidas",
"overdueTasks": "Tareas Atrasadas",
"deferUntil": "Aplazar Hasta",
"dueProjects": "Proyectos Vencidos",
"overdueProjects": "Proyectos Atrasados"
},
"descriptions": {
"dueTasks": "Tareas que vencen en 24 horas",
"overdueTasks": "Tareas que han pasado su fecha de vencimiento",
"deferUntil": "Tareas que ahora están disponibles para trabajar",
"dueProjects": "Proyectos que vencen en 24 horas",
"overdueProjects": "Proyectos que han pasado su fecha de vencimiento"
},
"telegram": {
"notConfigured": {
"title": "Telegram No Configurado:",
"message": "Para recibir notificaciones de Telegram, por favor configura tu bot de Telegram en la pestaña de Telegram."
}
},
"test": {
"title": "Notificaciones de Prueba",
"description": "Envía una notificación de prueba para ver cómo aparece en la aplicación y en los canales habilitados (Telegram, etc.)",
"send": "Enviar prueba",
"sending": "Enviando..."
},
"info": {
"title": "Nota:",
"message": "Las notificaciones por correo electrónico y Push llegarán pronto. Las notificaciones en la aplicación y de Telegram están disponibles actualmente."
}
},
"projectStatus": {
"not_started": "No Iniciado",
"not_started_desc": "Capturado pero aún no iniciado",
"planned": "Planificado",
"planned_desc": "Definido y listo para comenzar",
"in_progress": "En Progreso",
"in_progress_desc": "Trabajo activo en curso",
"waiting": "Esperando",
"waiting_desc": "Esperando entrada externa",
"done": "Completado",
"done_desc": "Terminado y hecho",
"cancelled": "Cancelado",
"cancelled_desc": "No se completará"
}
}