cd3733b459
Implement 4-phase external storage backends architecture: Phase 1 - Foundation: - BlobStorageBackend trait (application/ports/blob_storage_ports.rs) - LocalBlobBackend: extracted all tokio::fs ops from DedupService - S3BlobBackend: AWS SDK with custom endpoint support (MinIO, R2, B2) - DedupService refactored to use Arc<dyn BlobStorageBackend> Phase 2 - Admin Panel: - StorageSettingsService with DB persistence + env override - Storage tab in admin panel (backend selector, S3 form, provider presets) - GET/PUT/POST endpoints for storage settings + connection test - i18n keys (en/es) and BEM CSS Phase 3 - Migration: - MigrationBlobBackend decorator (dual-read: target-first + source fallback) - Background migration job with parallel transfers + progress tracking - Migration UI (progress bar, ETA, pause/resume/verify/complete) - 6 admin API endpoints for migration lifecycle Phase 4 - Enterprise Extras: - CachedBlobBackend: LRU disk cache for remote backends - EncryptedBlobBackend: AES-256-GCM at-rest encryption - AzureBlobBackend: Azure Blob Storage support - RetryBlobBackend: exponential backoff for transient errors - Decorator composition in DI: retry → encryption → cache All 223 tests passing, clippy clean, fmt verified.
675 lines
29 KiB
JSON
675 lines
29 KiB
JSON
{
|
||
"app": {
|
||
"title": "OxiCloud",
|
||
"description": "Sistema de almacenamiento en la nube minimalista"
|
||
},
|
||
"nav": {
|
||
"files": "Archivos",
|
||
"shared": "Compartidos",
|
||
"recent": "Recientes",
|
||
"favorites": "Favoritos",
|
||
"photos": "Fotos",
|
||
"music": "Música",
|
||
"trash": "Papelera"
|
||
},
|
||
"photos": {
|
||
"empty_state": "Aún no hay fotos",
|
||
"empty_hint": "Sube imágenes o videos para verlos aquí",
|
||
"items_selected": "seleccionados",
|
||
"view_daily": "Día",
|
||
"view_monthly": "Mes",
|
||
"view_yearly": "Año"
|
||
},
|
||
"music": {
|
||
"create_playlist": "Crear Lista",
|
||
"playlists": "Listas",
|
||
"no_playlists": "Sin listas aún",
|
||
"empty_hint": "Crea tu primera lista para empezar a organizar tu música",
|
||
"select_playlist": "Selecciona una lista",
|
||
"select_hint": "Elige una lista de la barra lateral o crea una nueva",
|
||
"add_tracks": "Añadir Pistas",
|
||
"no_tracks": "No hay pistas en esta lista",
|
||
"unknown_artist": "Artista Desconocido",
|
||
"unknown_title": "Desconocido",
|
||
"confirm_delete": "¿Eliminar esta lista?",
|
||
"playlist_name": "Nombre de la lista",
|
||
"create": "Crear",
|
||
"delete": "Eliminar",
|
||
"share": "Compartir",
|
||
"edit": "Editar",
|
||
"play_all": "Reproducir Todo",
|
||
"shuffle": "Aleatorio",
|
||
"repeat": "Repetir",
|
||
"repeat_one": "Repetir Una",
|
||
"queue": "Cola",
|
||
"queue_empty": "Cola vacía",
|
||
"not_playing": "No reproduciendo",
|
||
"play": "Reproducir",
|
||
"pause": "Pausar",
|
||
"previous": "Anterior",
|
||
"next": "Siguiente",
|
||
"volume": "Volumen",
|
||
"mute": "Silenciar",
|
||
"unmute": "Activar sonido",
|
||
"title": "Título",
|
||
"artist": "Artista",
|
||
"album": "Álbum",
|
||
"tracks": "pistas",
|
||
"add": "Añadir",
|
||
"added": "¡Añadido!",
|
||
"added_to_playlist": "añadido a la lista",
|
||
"add_to_playlist": "Añadir a playlist",
|
||
"load_error": "Error al cargar listas",
|
||
"add_error": "No se pudieron añadir las pistas",
|
||
"no_playlists_yet": "No hay listas aún. ¡Crea una primero!",
|
||
"selected_files": "Seleccionados:",
|
||
"share_with_user": "ID de usuario o email",
|
||
"playback_error": "Error de reproducción",
|
||
"error": "Error",
|
||
"remove": "Eliminar",
|
||
"track_removed": "Pista eliminada",
|
||
"manage_shares": "Gestionar compartidos",
|
||
"no_shares": "Sin compartidos aún",
|
||
"remove_share": "Eliminar compartido",
|
||
"can_write": "Puede editar",
|
||
"read_only": "Solo lectura",
|
||
"public": "Pública",
|
||
"private": "Privada",
|
||
"toggle_public": "Visibilidad",
|
||
"make_public": "Hacer pública",
|
||
"make_private": "Hacer privada",
|
||
"set_cover": "Establecer portada",
|
||
"cover_updated": "Portada actualizada",
|
||
"search_audio": "Buscar archivos de audio…",
|
||
"no_audio_files": "No se encontraron archivos de audio",
|
||
"selected": "seleccionados",
|
||
"loading": "Cargando…",
|
||
"search_error": "No se pudieron cargar los archivos de audio",
|
||
"adding": "Añadiendo…"
|
||
},
|
||
"share": {
|
||
"dialogTitle": "Compartir Enlace",
|
||
"linkLabel": "Enlace compartido:",
|
||
"copyLink": "Copiar",
|
||
"permissions": "Permisos:",
|
||
"permissionRead": "Lectura",
|
||
"permissionWrite": "Escritura",
|
||
"permissionReshare": "Recompartir",
|
||
"password": "Protección con contraseña:",
|
||
"generatePassword": "Generar",
|
||
"expiration": "Fecha de caducidad:",
|
||
"update": "Actualizar compartido",
|
||
"remove": "Eliminar compartido",
|
||
"notifyTitle": "Enviar notificación",
|
||
"notifyEmailLabel": "Dirección de correo:",
|
||
"notifyMessageLabel": "Mensaje (opcional):",
|
||
"notifySend": "Enviar notificación",
|
||
"shareWithOthers": "Compartir con otros",
|
||
"sharePublicly": "Compartir públicamente",
|
||
"shareSettings": "Configuración de compartido",
|
||
"shareCopied": "Enlace copiado al portapapeles",
|
||
"shareCreated": "Enlace compartido creado correctamente",
|
||
"shareUpdated": "Configuración de compartido actualizada",
|
||
"shareRemoved": "Compartido eliminado correctamente"
|
||
},
|
||
"share_dialogTitle": "Compartir Enlace",
|
||
"share_linkLabel": "Enlace compartido:",
|
||
"share_copyLink": "Copiar",
|
||
"share_permissions": "Permisos:",
|
||
"share_permissionRead": "Lectura",
|
||
"share_permissionWrite": "Escritura",
|
||
"share_permissionReshare": "Recompartir",
|
||
"share_password": "Protección con contraseña:",
|
||
"share_generatePassword": "Generar",
|
||
"share_expiration": "Fecha de caducidad:",
|
||
"share_update": "Actualizar compartido",
|
||
"share_remove": "Eliminar compartido",
|
||
"share_notifyTitle": "Enviar notificación",
|
||
"share_notifyEmailLabel": "Dirección de correo:",
|
||
"share_notifyMessageLabel": "Mensaje (opcional):",
|
||
"share_notifySend": "Enviar notificación",
|
||
"shared": {
|
||
"backToFiles": "Volver a Archivos",
|
||
"pageTitle": "Recursos Compartidos",
|
||
"pageDescription": "Administra tus archivos y carpetas compartidos",
|
||
"filterType": "Tipo:",
|
||
"filterAll": "Todos",
|
||
"filterFiles": "Archivos",
|
||
"filterFolders": "Carpetas",
|
||
"sortBy": "Ordenar por:",
|
||
"sortByName": "Nombre",
|
||
"sortByDate": "Fecha compartido",
|
||
"sortByExpiration": "Caducidad",
|
||
"search": "Buscar",
|
||
"colName": "Nombre",
|
||
"colType": "Tipo",
|
||
"colDateShared": "Fecha compartido",
|
||
"colExpiration": "Caducidad",
|
||
"colPermissions": "Permisos",
|
||
"colPassword": "Contraseña",
|
||
"colActions": "Acciones",
|
||
"emptyStateTitle": "Aún no hay recursos compartidos",
|
||
"emptyStateDesc": "Cuando compartas archivos o carpetas, aparecerán aquí",
|
||
"goToFiles": "Ir a Archivos",
|
||
"typeFile": "Archivo",
|
||
"typeFolder": "Carpeta",
|
||
"noExpiration": "Sin caducidad",
|
||
"hasPassword": "Sí",
|
||
"noPassword": "No",
|
||
"editShare": "Editar compartido",
|
||
"notifyShare": "Notificar a alguien",
|
||
"copyLink": "Copiar enlace",
|
||
"removeShare": "Eliminar compartido",
|
||
"linkCopied": "¡Enlace copiado al portapapeles!",
|
||
"linkCopyFailed": "Error al copiar el enlace",
|
||
"itemUpdated": "Configuración de compartido actualizada",
|
||
"itemRemoved": "Compartido eliminado correctamente",
|
||
"invalidEmail": "Por favor, introduce una dirección de correo válida",
|
||
"notificationSent": "Notificación enviada correctamente",
|
||
"notificationFailed": "Error al enviar la notificación",
|
||
"shared_backToFiles": "Volver a Archivos",
|
||
"shared_pageTitle": "Recursos Compartidos",
|
||
"shared_pageDescription": "Administra tus archivos y carpetas compartidos",
|
||
"shared_filterType": "Tipo:",
|
||
"shared_filterAll": "Todos",
|
||
"shared_filterFiles": "Archivos",
|
||
"shared_filterFolders": "Carpetas",
|
||
"shared_sortBy": "Ordenar por:",
|
||
"shared_sortByName": "Nombre",
|
||
"shared_sortByDate": "Fecha compartido",
|
||
"shared_sortByExpiration": "Caducidad",
|
||
"shared_search": "Buscar",
|
||
"shared_colName": "Nombre",
|
||
"shared_colType": "Tipo",
|
||
"shared_colDateShared": "Fecha compartido",
|
||
"shared_colExpiration": "Caducidad",
|
||
"shared_colPermissions": "Permisos",
|
||
"shared_colPassword": "Contraseña",
|
||
"shared_colActions": "Acciones",
|
||
"shared_emptyStateTitle": "Aún no hay recursos compartidos",
|
||
"shared_emptyStateDesc": "Cuando compartas archivos o carpetas, aparecerán aquí",
|
||
"shared_goToFiles": "Ir a Archivos",
|
||
"shared_typeFile": "Archivo",
|
||
"shared_typeFolder": "Carpeta",
|
||
"shared_noExpiration": "Sin caducidad",
|
||
"shared_hasPassword": "Sí",
|
||
"shared_noPassword": "No",
|
||
"shared_editShare": "Editar compartido",
|
||
"shared_notifyShare": "Notificar a alguien",
|
||
"shared_copyLink": "Copiar enlace",
|
||
"shared_removeShare": "Eliminar compartido",
|
||
"shared_linkCopied": "¡Enlace copiado al portapapeles!",
|
||
"shared_linkCopyFailed": "Error al copiar el enlace",
|
||
"shared_itemUpdated": "Configuración de compartido actualizada",
|
||
"shared_itemRemoved": "Compartido eliminado correctamente",
|
||
"shared_invalidEmail": "Por favor, introduce una dirección de correo válida",
|
||
"shared_notificationSent": "Notificación enviada correctamente",
|
||
"shared_notificationFailed": "Error al enviar la notificación"
|
||
},
|
||
"actions": {
|
||
"search": "Buscar archivos...",
|
||
"new_folder": "Nueva carpeta",
|
||
"upload": "Subir",
|
||
"upload_files": "Subir archivos",
|
||
"upload_folder": "Subir carpeta",
|
||
"upload.uploading": "Subiendo...",
|
||
"upload.complete": "{count} / {total} subidos",
|
||
"upload.files": "archivos",
|
||
"rename": "Renombrar",
|
||
"move": "Mover a...",
|
||
"move_to": "Mover a",
|
||
"delete": "Eliminar",
|
||
"download": "Descargar",
|
||
"view": "Ver",
|
||
"cancel": "Cancelar",
|
||
"confirm": "Confirmar",
|
||
"share": "Compartir",
|
||
"favorite": "Añadir a favoritos",
|
||
"unfavorite": "Quitar de favoritos",
|
||
"copy": "Copiar",
|
||
"notify": "Notificar",
|
||
"send": "Enviar",
|
||
"clear_recent": "Limpiar recientes",
|
||
"logout": "Cerrar sesión",
|
||
"create": "Crear",
|
||
"search_btn": "Buscar",
|
||
"close": "Cerrar",
|
||
"delete_permanently": "Eliminar permanentemente",
|
||
"empty_trash": "Vaciar papelera"
|
||
},
|
||
"user_menu": {
|
||
"appearance": "Apariencia",
|
||
"about": "Acerca de OxiCloud",
|
||
"about_description": "Plataforma de almacenamiento en la nube creada con Rust y Arquitectura Limpia. Rápida, segura y privada.",
|
||
"admin_panel": "Panel de administración",
|
||
"profile": "Mi perfil",
|
||
"role_user": "Usuario"
|
||
},
|
||
"files": {
|
||
"name": "Nombre",
|
||
"type": "Tipo",
|
||
"size": "Tamaño",
|
||
"modified": "Modificado",
|
||
"no_files": "No hay archivos en esta carpeta",
|
||
"empty_hint": "Sube archivos o crea carpetas para comenzar",
|
||
"loading": "Cargando archivos…",
|
||
"view_grid": "Vista de cuadrícula",
|
||
"view_list": "Vista de lista",
|
||
"file_types": {
|
||
"document": "Documento",
|
||
"image": "Imagen",
|
||
"video": "Video",
|
||
"audio": "Audio",
|
||
"pdf": "PDF",
|
||
"text": "Texto",
|
||
"folder": "Carpeta",
|
||
"spreadsheet": "Hoja de cálculo",
|
||
"presentation": "Presentación",
|
||
"archive": "Archivo comprimido",
|
||
"installer": "Instalador",
|
||
"code": "Código"
|
||
}
|
||
},
|
||
"dialogs": {
|
||
"rename_folder": "Renombrar carpeta",
|
||
"rename_file": "Renombrar archivo",
|
||
"new_name": "Nuevo nombre",
|
||
"new_folder_title": "Nueva carpeta",
|
||
"folder_name": "Nombre de la carpeta",
|
||
"folder_placeholder": "Mi carpeta",
|
||
"rename_title": "Renombrar",
|
||
"move_file": "Mover archivo",
|
||
"move_folder": "Mover carpeta",
|
||
"select_destination": "Selecciona la carpeta destino:",
|
||
"select_this_folder": "Seleccionar esta carpeta",
|
||
"go_to_parent": ".. (carpeta superior)",
|
||
"no_subfolders": "Sin subcarpetas",
|
||
"root": "Raíz",
|
||
"delete_confirmation": "¿Estás seguro de que quieres eliminar",
|
||
"and_contents": "y todo su contenido",
|
||
"no_undo": "Esta acción no se puede deshacer",
|
||
"confirm_title": "Confirmar acción",
|
||
"confirm_delete": "Mover a papelera",
|
||
"confirm_delete_file": "¿Estás seguro de que quieres mover a la papelera el archivo \"{{name}}\"?",
|
||
"confirm_delete_folder": "¿Estás seguro de que quieres mover a la papelera la carpeta \"{{name}}\" y todo su contenido?",
|
||
"confirm_permanent_delete": "Eliminar permanentemente",
|
||
"confirm_permanent_delete_msg": "¿Estás seguro de que quieres eliminar permanentemente este elemento? Esta acción no se puede deshacer.",
|
||
"confirm_empty_trash": "Vaciar papelera",
|
||
"confirm_delete_share": "Eliminar enlace compartido",
|
||
"confirm_delete_share_msg": "¿Estás seguro de que quieres eliminar este enlace compartido?",
|
||
"share_file": "Compartir Archivo",
|
||
"share_folder": "Compartir Carpeta",
|
||
"existing_shares": "Compartidos Existentes",
|
||
"share_options": "Opciones de Compartición",
|
||
"password": "Contraseña",
|
||
"expiration": "Caducidad",
|
||
"permissions": "Permisos",
|
||
"generated_link": "Enlace Generado",
|
||
"notify": "Enviar Notificación",
|
||
"recipient": "Destinatario",
|
||
"message": "Mensaje"
|
||
},
|
||
"dropzone": {
|
||
"drag_files": "Arrastra archivos aquí o haz clic para seleccionar",
|
||
"drop_files": "Suelta los archivos para subirlos"
|
||
},
|
||
"permissions": {
|
||
"read": "Lectura",
|
||
"write": "Escritura",
|
||
"reshare": "Recompartir"
|
||
},
|
||
"errors": {
|
||
"file_not_found": "Archivo no encontrado",
|
||
"folder_not_found": "Carpeta no encontrada",
|
||
"delete_error": "Error al eliminar",
|
||
"upload_error": "Error al subir el archivo",
|
||
"rename_error": "Error al renombrar",
|
||
"move_error": "Error al mover",
|
||
"empty_name": "El nombre no puede estar vacío",
|
||
"name_exists": "Ya existe un archivo o carpeta con ese nombre",
|
||
"generic_error": "Ha ocurrido un error"
|
||
},
|
||
"breadcrumb": {
|
||
"home": "Inicio"
|
||
},
|
||
"trash": {
|
||
"empty_trash": "Vaciar papelera",
|
||
"empty_state": "La papelera está vacía",
|
||
"original_location": "Ubicación original",
|
||
"deleted_date": "Fecha de eliminación",
|
||
"actions": "Acciones",
|
||
"restore": "Restaurar",
|
||
"delete_permanently": "Eliminar permanentemente",
|
||
"empty_confirm": "¿Estás seguro de que quieres vaciar la papelera? Esta acción eliminará permanentemente todos los elementos."
|
||
},
|
||
"auth": {
|
||
"login_title": "Iniciar sesión",
|
||
"username": "Usuario",
|
||
"username_placeholder": "Ingresa tu nombre de usuario",
|
||
"password": "Contraseña",
|
||
"password_placeholder": "Ingresa tu contraseña",
|
||
"login_button": "Iniciar sesión",
|
||
"no_account": "¿No tienes cuenta?",
|
||
"register": "Regístrate",
|
||
"admin_setup": "¿Primera vez?",
|
||
"setup": "Configurar administrador",
|
||
"register_title": "Crear cuenta",
|
||
"email": "Email",
|
||
"email_placeholder": "Ingresa tu email",
|
||
"confirm_password": "Confirmar contraseña",
|
||
"confirm_password_placeholder": "Confirma tu contraseña",
|
||
"register_button": "Crear cuenta",
|
||
"have_account": "¿Ya tienes cuenta?",
|
||
"login": "Iniciar sesión",
|
||
"setup_title": "Configuración inicial",
|
||
"setup_step1": "Admin",
|
||
"setup_step2": "Sistema",
|
||
"setup_step3": "Completado",
|
||
"admin_username": "Usuario administrador",
|
||
"admin_email": "Email administrador",
|
||
"admin_password": "Contraseña administrador",
|
||
"create_admin": "Crear administrador",
|
||
"back_to_login": "¿Ya está configurado?",
|
||
"admin_success": "¡Cuenta de administrador creada con éxito! Ahora puedes iniciar sesión.",
|
||
"account_success": "¡Cuenta creada con éxito! Ahora puedes iniciar sesión.",
|
||
"passwords_mismatch": "Las contraseñas no coinciden",
|
||
"admin_create_error": "Error al crear cuenta de administrador",
|
||
"or": "o",
|
||
"sso_login": "Iniciar sesión con SSO",
|
||
"sso_login_provider": "Iniciar sesión con {{provider}}"
|
||
},
|
||
"storage": {
|
||
"title": "Almacenamiento",
|
||
"calculating": "Calculando...",
|
||
"used": "{{percentage}}% usado ({{used}} / {{total}})"
|
||
},
|
||
"viewer": {
|
||
"unsupported_file": "Este tipo de archivo no se puede previsualizar.",
|
||
"download_file": "Descargar archivo",
|
||
"zoom_in": "Acercar",
|
||
"zoom_out": "Alejar",
|
||
"zoom_reset": "Restablecer zoom"
|
||
},
|
||
"language_selector": {
|
||
"title": "¡Bienvenido!",
|
||
"subtitle": "Selecciona tu idioma para continuar",
|
||
"continue": "Continuar",
|
||
"languages": {
|
||
"en": "English",
|
||
"es": "Español",
|
||
"zh": "中文",
|
||
"fa": "فارسی",
|
||
"fr": "Français",
|
||
"de": "Deutsch",
|
||
"pt": "Português",
|
||
"ar": "العربية",
|
||
"hi": "हिन्दी",
|
||
"it": "Italiano",
|
||
"ja": "日本語",
|
||
"ko": "한국어",
|
||
"nl": "Nederlands",
|
||
"ru": "Русский"
|
||
}
|
||
},
|
||
"favorites": {
|
||
"empty_state": "Aún no hay favoritos",
|
||
"empty_hint": "Marca archivos o carpetas con estrella para añadirlos a favoritos",
|
||
"add": "Añadir a favoritos",
|
||
"remove": "Quitar de favoritos",
|
||
"added_title": "Añadido a favoritos",
|
||
"added_msg": "añadido a favoritos",
|
||
"removed_title": "Quitado de favoritos",
|
||
"removed_msg": "quitado de favoritos"
|
||
},
|
||
"recent": {
|
||
"title": "Recientes",
|
||
"clear": "Limpiar recientes",
|
||
"accessed": "Accedido",
|
||
"empty_state": "No hay archivos recientes",
|
||
"empty_hint": "Los archivos que abras aparecerán aquí"
|
||
},
|
||
"notifications": {
|
||
"file_renamed": "Archivo renombrado",
|
||
"file_renamed_to": "Archivo renombrado a \"{{name}}\"",
|
||
"folder_renamed": "Carpeta renombrada",
|
||
"folder_renamed_to": "Carpeta renombrada a \"{{name}}\"",
|
||
"file_uploaded": "Archivo subido",
|
||
"file_deleted": "Archivo movido a papelera",
|
||
"folder_deleted": "Carpeta movida a papelera",
|
||
"item_deleted_permanently": "Elemento eliminado permanentemente",
|
||
"trash_emptied": "Papelera vaciada correctamente",
|
||
"title": "Notificaciones",
|
||
"empty": "Sin notificaciones"
|
||
},
|
||
"batch": {
|
||
"one_selected": "1 elemento seleccionado",
|
||
"n_selected": "{{count}} elementos seleccionados",
|
||
"confirm_delete": "¿Estás seguro de que quieres mover {{count}} elementos a la papelera?",
|
||
"move_title": "Mover {{count}} elemento(s)",
|
||
"add_favorites": "Añadir a favoritos",
|
||
"move_copy": "Mover o copiar"
|
||
},
|
||
"admin": {
|
||
"page_title": "Panel de Administración",
|
||
"back_to_app": "Volver a OxiCloud",
|
||
"loading": "Cargando…",
|
||
"access_denied": "Acceso Denegado",
|
||
"access_denied_desc": "Se requieren privilegios de administrador para acceder a este panel.",
|
||
"sign_in": "Iniciar sesión",
|
||
"tab_dashboard": "Panel",
|
||
"tab_users": "Usuarios",
|
||
"tab_oidc": "SSO / OIDC",
|
||
"total_users": "Usuarios Totales",
|
||
"active_users": "Usuarios Activos",
|
||
"admins": "Administradores",
|
||
"version": "Versión",
|
||
"storage_overview": "Resumen de Almacenamiento",
|
||
"used": "Usado",
|
||
"total_quota": "Cuota Total",
|
||
"usage_pct": "Uso %",
|
||
"users_over_80": "Usuarios >80% cuota",
|
||
"users_over_quota": "Usuarios sobre cuota",
|
||
"system": "Sistema",
|
||
"auth_label": "Auth",
|
||
"oidc_label": "OIDC",
|
||
"quotas_label": "Cuotas",
|
||
"enabled": "Habilitado",
|
||
"disabled": "Deshabilitado",
|
||
"active": "Activo",
|
||
"off": "Inactivo",
|
||
"allow_registration": "Permitir registro público",
|
||
"registration_warning": "El registro público está deshabilitado. Solo los administradores pueden crear nuevos usuarios.",
|
||
"user_management": "Gestión de Usuarios",
|
||
"create_user": "Crear Usuario",
|
||
"col_user": "Usuario",
|
||
"col_role": "Rol",
|
||
"col_auth": "Auth",
|
||
"col_status": "Estado",
|
||
"col_storage": "Almacenamiento",
|
||
"col_last_login": "Último Acceso",
|
||
"col_actions": "Acciones",
|
||
"loading_users": "Cargando usuarios…",
|
||
"failed_load_users": "Error al cargar usuarios",
|
||
"no_users_found": "No se encontraron usuarios",
|
||
"showing_users": "Mostrando {{from}}-{{to}} de {{total}}",
|
||
"prev": "Anterior",
|
||
"next": "Siguiente",
|
||
"inactive": "Inactivo",
|
||
"you_badge": "(tú)",
|
||
"local": "Local",
|
||
"never": "Nunca",
|
||
"just_now": "Ahora mismo",
|
||
"minutes_ago": "hace {{n}}m",
|
||
"hours_ago": "hace {{n}}h",
|
||
"days_ago": "hace {{n}}d",
|
||
"edit_quota_title": "Editar cuota",
|
||
"reset_password_title": "Restablecer contraseña",
|
||
"toggle_role_title": "Cambiar rol",
|
||
"deactivate_title": "Desactivar",
|
||
"activate_title": "Activar",
|
||
"delete_title": "Eliminar",
|
||
"sso_title": "Inicio de Sesión Único (OIDC / SSO)",
|
||
"enable_sso": "Habilitar autenticación SSO",
|
||
"provider_name": "Nombre del Proveedor",
|
||
"issuer_url": "URL del Emisor",
|
||
"issuer_url_hint": "URL del emisor OpenID Connect de tu proveedor de identidad",
|
||
"auto_discover": "Auto-descubrir",
|
||
"discovering": "Descubriendo…",
|
||
"client_id": "Client ID",
|
||
"client_secret": "Client Secret",
|
||
"client_secret_placeholder": "Dejar vacío para mantener el valor actual",
|
||
"secret_configured": "Ya hay un client secret configurado",
|
||
"callback_url": "URL de Callback",
|
||
"callback_url_hint": "(registrar en tu IdP)",
|
||
"advanced_settings": "Configuración Avanzada",
|
||
"scopes": "Scopes",
|
||
"auto_provision": "Auto-provisionar usuarios en el primer inicio de sesión",
|
||
"admin_groups": "Grupos de Admin",
|
||
"admin_groups_hint": "Nombres de grupos OIDC separados por comas que mapean al rol de admin",
|
||
"disable_password": "Desactivar inicio de sesión con contraseña (solo OIDC)",
|
||
"password_warning": "¡Esto impedirá TODOS los inicios de sesión con contraseña!",
|
||
"test_btn": "Probar",
|
||
"save_btn": "Guardar",
|
||
"saving": "Guardando…",
|
||
"settings_saved": "Configuración guardada — OIDC ahora está {{status}}",
|
||
"quota_modal_title": "Actualizar Cuota de Almacenamiento",
|
||
"quota_user_label": "Usuario:",
|
||
"new_quota": "Nueva Cuota",
|
||
"quota_unlimited_hint": "Establecer 0 para ilimitado",
|
||
"cancel": "Cancelar",
|
||
"create_user_title": "Crear Nuevo Usuario",
|
||
"username_label": "Nombre de usuario",
|
||
"username_placeholder": "juanperez",
|
||
"username_hint": "3–32 caracteres",
|
||
"password_label": "Contraseña",
|
||
"password_placeholder": "Mín 8 caracteres",
|
||
"email_label": "Correo",
|
||
"email_optional": "(opcional)",
|
||
"email_placeholder": "usuario@ejemplo.com (auto-generado si vacío)",
|
||
"role_label": "Rol",
|
||
"role_user": "Usuario",
|
||
"role_admin": "Admin",
|
||
"quota_label": "Cuota",
|
||
"creating": "Creando…",
|
||
"reset_pw_title": "Restablecer Contraseña",
|
||
"new_password_label": "Nueva Contraseña",
|
||
"resetting": "Restableciendo…",
|
||
"reset_btn": "Restablecer",
|
||
"confirm_role_change": "¿Cambiar rol a {{role}}?",
|
||
"confirm_deactivate": "¿Estás seguro de que quieres desactivar este usuario?",
|
||
"confirm_activate": "¿Estás seguro de que quieres activar este usuario?",
|
||
"confirm_delete_user": "¿ELIMINAR usuario \"{{name}}\"? ¡Esto no se puede deshacer!",
|
||
"confirm_action": "Confirmar Acción",
|
||
"confirm_yes": "Confirmar",
|
||
"confirm_no": "Cancelar",
|
||
"error_username_short": "El nombre de usuario debe tener al menos 3 caracteres",
|
||
"error_password_short": "La contraseña debe tener al menos 8 caracteres",
|
||
"error_generic": "Error",
|
||
"error_network": "Error de red: {{message}}",
|
||
"error_create_user": "Error al crear usuario",
|
||
"tab_storage": "Almacenamiento",
|
||
"storage_title": "Backend de Almacenamiento",
|
||
"storage_current_backend": "Backend Activo",
|
||
"storage_total_blobs": "Total de Blobs",
|
||
"storage_total_size": "Tamaño Total",
|
||
"storage_dedup_ratio": "Ratio de Dedup",
|
||
"storage_backend": "Tipo de Backend",
|
||
"storage_local": "Sistema de Archivos Local",
|
||
"storage_s3": "Compatible con S3",
|
||
"storage_provider_preset": "Proveedor Preconfigurado",
|
||
"storage_preset_custom": "Personalizado",
|
||
"storage_endpoint_url": "URL del Endpoint",
|
||
"storage_endpoint_hint": "Dejar vacío para usar Amazon S3 por defecto",
|
||
"storage_bucket": "Bucket",
|
||
"storage_region": "Región",
|
||
"storage_access_key": "Access Key ID",
|
||
"storage_secret_key": "Secret Access Key",
|
||
"storage_secret_configured": "Ya hay una clave secreta configurada",
|
||
"storage_key_placeholder": "Dejar vacío para mantener el valor actual",
|
||
"storage_path_style": "Forzar Path Style",
|
||
"storage_path_style_hint": "Requerido para MinIO y algunos proveedores compatibles con S3",
|
||
"storage_test_connection": "Probar Conexión",
|
||
"storage_test_success": "Conexión exitosa",
|
||
"storage_test_failure": "Conexión fallida",
|
||
"storage_save": "Guardar",
|
||
"storage_saved": "Configuración de almacenamiento guardada correctamente",
|
||
"storage_migration": "Migración de Backend",
|
||
"storage_migration_coming_soon": "La migración de backend estará disponible en una futura actualización.",
|
||
"migration_status_label": "Estado:",
|
||
"migration_start": "Iniciar Migración",
|
||
"migration_pause": "Pausar",
|
||
"migration_resume": "Reanudar",
|
||
"migration_verify": "Verificar Integridad",
|
||
"migration_complete": "Finalizar",
|
||
"migration_started": "Migración iniciada",
|
||
"migration_paused_msg": "Migración pausada",
|
||
"migration_resumed_msg": "Migración reanudada",
|
||
"migration_completed_msg": "Migración finalizada. Reinicia el servidor para usar el nuevo backend.",
|
||
"migration_verifying": "Verificando…",
|
||
"migration_verify_passed": "Verificación exitosa",
|
||
"migration_verify_failed": "Verificación fallida",
|
||
"migration_failed_blobs": "blobs fallidos",
|
||
"testing": "Probando…"
|
||
},
|
||
"profile": {
|
||
"page_title": "Perfil",
|
||
"back_to_app": "Volver a OxiCloud",
|
||
"loading": "Cargando…",
|
||
"not_authenticated": "No Autenticado",
|
||
"not_authenticated_desc": "Inicia sesión para ver tu perfil.",
|
||
"sign_in": "Iniciar sesión",
|
||
"role_admin": "Administrador",
|
||
"role_user": "Usuario",
|
||
"account_details": "Detalles de la Cuenta",
|
||
"username": "Nombre de usuario",
|
||
"email": "Correo electrónico",
|
||
"role": "Rol",
|
||
"last_login": "Último acceso",
|
||
"storage": "Almacenamiento",
|
||
"used": "Usado",
|
||
"quota": "Cuota",
|
||
"usage": "Uso",
|
||
"unlimited": "Ilimitado",
|
||
"app_passwords": "Contraseñas de Aplicación",
|
||
"app_pw_desc": "Genera contraseñas para clientes WebDAV, CalDAV y CardDAV. Cada contraseña se muestra solo una vez.",
|
||
"app_pw_label_placeholder": "Etiqueta (ej. Thunderbird, macOS)",
|
||
"generate": "Generar",
|
||
"generating": "Generando…",
|
||
"new_password_for": "Nueva contraseña para",
|
||
"copy_warning": "Copia esta contraseña ahora. No podrás verla de nuevo.",
|
||
"copy_to_clipboard": "Copiar al portapapeles",
|
||
"col_label": "Etiqueta",
|
||
"col_created": "Creado",
|
||
"col_last_used": "Último uso",
|
||
"col_status": "Estado",
|
||
"active": "Activa",
|
||
"revoked": "Revocada",
|
||
"revoke_title": "Revocar",
|
||
"no_app_passwords": "Aún no hay contraseñas de aplicación.",
|
||
"client_sessions": "Sesiones de cliente",
|
||
"client_sessions_desc": "Generadas automáticamente al conectar un cliente compatible con Nextcloud.",
|
||
"col_client": "Cliente",
|
||
"never": "Nunca",
|
||
"just_now": "Ahora mismo",
|
||
"minutes_ago": "hace {{n}} min",
|
||
"hours_ago": "hace {{n}}h",
|
||
"days_ago": "hace {{n}} días",
|
||
"change_password": "Cambiar Contraseña",
|
||
"current_password": "Contraseña Actual",
|
||
"new_password": "Nueva Contraseña",
|
||
"min_8_chars": "Al menos 8 caracteres",
|
||
"confirm_password": "Confirmar Nueva Contraseña",
|
||
"update_password": "Actualizar Contraseña",
|
||
"updating": "Actualizando…",
|
||
"password_updated": "Contraseña actualizada correctamente",
|
||
"passwords_no_match": "Las contraseñas no coinciden",
|
||
"password_too_short": "La contraseña debe tener al menos 8 caracteres",
|
||
"password_change_failed": "Error al cambiar la contraseña",
|
||
"error_network": "Error de red: {{message}}",
|
||
"error_label_required": "Introduce una etiqueta",
|
||
"error_create_pw": "Error al crear contraseña de aplicación",
|
||
"confirm_revoke": "¿Revocar contraseña \"{{label}}\"? Los clientes que la usen dejarán de funcionar.",
|
||
"error_revoke": "Error al revocar contraseña"
|
||
}
|
||
}
|