diff --git a/webapp/src/components/LogCenterPage.tsx b/webapp/src/components/LogCenterPage.tsx index 95ed56f..cf693cf 100644 --- a/webapp/src/components/LogCenterPage.tsx +++ b/webapp/src/components/LogCenterPage.tsx @@ -129,6 +129,10 @@ function formatReason(reason: string): string { return translatedOrHumanized(keyFor('txt_log_reason_', reason), reason); } +function formatTargetType(type: string): string { + return translatedOrHumanized(keyFor('txt_log_target_type_', type), type); +} + function formatTime(value: string): string { const date = new Date(value); return Number.isNaN(date.getTime()) ? value : date.toLocaleString(); @@ -148,11 +152,16 @@ function formatMetaValueForKey(key: string, value: unknown): string { return translatedOrHumanized(keyFor('txt_log_trigger_', value), value); } if (key === 'type' && typeof value === 'string') { - return translatedOrHumanized(keyFor('txt_log_target_type_', value), value); + return formatTargetType(value); } return formatMetaValue(value); } +function formatLogTarget(log: AuditLogEntry, metadata: Record): string { + const targetEmail = typeof metadata.targetEmail === 'string' ? metadata.targetEmail : ''; + return log.targetUserEmail || targetEmail || log.targetId || (log.targetType ? formatTargetType(log.targetType) : t('txt_dash')); +} + function iconForCategory(category: AuditLogCategory) { if (category === 'auth') return ; if (category === 'security') return ; @@ -550,7 +559,7 @@ export default function LogCenterPage(props: LogCenterPageProps) {
{t('txt_time')}{formatTime(selectedLog.createdAt)}
{t('txt_log_category')}{t(`txt_log_category_${selectedCategory}`)}
{t('txt_actor')}{selectedLog.actorEmail || selectedLog.actorUserId || t('txt_dash')}
-
{t('txt_target')}{selectedLog.targetUserEmail || String(selectedMetadata.targetEmail || '') || selectedLog.targetId || selectedLog.targetType || t('txt_dash')}
+
{t('txt_target')}{formatLogTarget(selectedLog, selectedMetadata)}

{t('txt_metadata')}

diff --git a/webapp/src/lib/i18n/locales/en.ts b/webapp/src/lib/i18n/locales/en.ts index 42f96fb..457aef6 100644 --- a/webapp/src/lib/i18n/locales/en.ts +++ b/webapp/src/lib/i18n/locales/en.ts @@ -1014,6 +1014,8 @@ const en: Record = { "txt_totp_qr_scanned": "TOTP value added.", "txt_totp_qr_not_found": "No QR code found in that image.", "txt_totp_qr_scan_failed": "Failed to scan QR code.", + "txt_totp_qr_invalid_image_type": "Choose an image file.", + "txt_totp_qr_image_too_large": "Choose an image smaller than 8 MB.", "txt_totp_qr_unsupported": "This browser does not support QR scanning. Try Chrome or Edge, or paste the TOTP link or secret manually.", "txt_totp_qr_camera_unavailable": "Camera is unavailable. Check browser permission, or choose an image.", "txt_totp_qr_choose_image": "Choose image", @@ -1125,6 +1127,12 @@ const en: Record = { "txt_import_invalid_password_protected_file": "Invalid password-protected export file.", "txt_import_decrypt_failed": "Failed to decrypt import file.", "txt_import_empty_zip_archive": "Empty zip archive.", + "txt_import_zip_too_large": "ZIP archive is too large. Maximum size is {size} MiB.", + "txt_import_file_too_large": "Import file is too large. Maximum size is {size} MiB.", + "txt_import_zip_too_many_files": "ZIP archive contains too many files.", + "txt_import_zip_entry_too_large": "ZIP archive contains a file larger than {size} MiB.", + "txt_import_zip_expands_too_large": "ZIP archive expands beyond the current import limit of {size} MiB.", + "txt_import_zip_unsafe_file_name": "ZIP archive contains an unsafe file name.", "txt_import_no_json_found_in_zip": "No importable JSON data found in zip archive.", "txt_import_data_json_not_found": "data.json not found in zip archive.", "txt_import_zip_password_required": "ZIP password is required.", @@ -1219,11 +1227,18 @@ const en: Record = { "txt_log_action_account_api_key_create": "Create API key", "txt_log_action_account_api_key_rotate": "Rotate API key", "txt_log_action_account_keys_update": "Update account keys", + "txt_log_action_account_passkey_create": "Create login passkey", + "txt_log_action_account_passkey_delete": "Delete login passkey", + "txt_log_action_account_passkey_encryption_enable": "Enable passkey vault unlock", "txt_log_action_account_profile_update": "Update account profile", "txt_log_action_account_totp_disable": "Disable two-step login", "txt_log_action_account_totp_enable": "Enable two-step login", "txt_log_action_account_totp_recover": "Recover two-step login", "txt_log_action_account_verify_devices_update": "Update device verification", + "txt_log_action_account_webauthn_2fa_delete": "Delete passkey two-step login key", + "txt_log_action_account_webauthn_2fa_enable": "Enable passkey two-step login", + "txt_log_action_account_yubikey_enable": "Update YubiKey OTP settings", + "txt_log_action_admin_audit_clear": "Clear audit logs", "txt_log_action_admin_audit_settings_update": "Update log retention settings", "txt_log_action_admin_backup_export": "Export backup", "txt_log_action_admin_backup_import": "Import backup", @@ -1246,6 +1261,8 @@ const en: Record = { "txt_log_action_auth_login_failed_bad_password": "Login failed: bad password", "txt_log_action_auth_login_failed_user_inactive": "Login failed: inactive account", "txt_log_action_auth_login_success": "Login succeeded", + "txt_log_action_auth_passkey_login_failed": "Passkey login failed", + "txt_log_action_auth_passkey_login_success": "Passkey login succeeded", "txt_log_action_auth_refresh_failed": "Refresh login failed: {reason}", "txt_log_action_cipher_delete_permanent": "Permanently delete vault item", "txt_log_action_cipher_delete_permanent_bulk": "Permanently delete vault items", @@ -1296,6 +1313,7 @@ const en: Record = { "txt_log_meta_method": "Request method", "txt_log_meta_path": "Request path", "txt_log_meta_provider": "Provider", + "txt_log_meta_prf_status": "PRF status", "txt_log_meta_prune_error": "Cleanup error", "txt_log_meta_pruned_file_count": "Cleaned files", "txt_log_meta_raw": "Raw data", @@ -1331,6 +1349,7 @@ const en: Record = { "txt_log_reason_user_inactive": "User inactive", "txt_log_reason_user_missing": "User missing", "txt_log_target_type_attachment": "Attachment", + "txt_log_target_type_account_passkey": "Login passkey", "txt_log_target_type_audit_log": "Log", "txt_log_target_type_backup": "Backup", "txt_log_target_type_cipher": "Vault item", diff --git a/webapp/src/lib/i18n/locales/es.ts b/webapp/src/lib/i18n/locales/es.ts index 7aba510..ea5091b 100644 --- a/webapp/src/lib/i18n/locales/es.ts +++ b/webapp/src/lib/i18n/locales/es.ts @@ -1014,6 +1014,8 @@ const es: Record = { "txt_totp_qr_scanned": "Valor TOTP agregado.", "txt_totp_qr_not_found": "No se encontró ningún código QR en esa imagen.", "txt_totp_qr_scan_failed": "No se pudo escanear el código QR.", + "txt_totp_qr_invalid_image_type": "Elija un archivo de imagen.", + "txt_totp_qr_image_too_large": "Elija una imagen de menos de 8 MB.", "txt_totp_qr_unsupported": "Este navegador no admite escaneo QR. Pruebe Chrome o Edge, o pegue manualmente el enlace o secreto TOTP.", "txt_totp_qr_camera_unavailable": "La cámara no está disponible. Revise el permiso del navegador o elija una imagen.", "txt_totp_qr_choose_image": "Elegir imagen", @@ -1125,6 +1127,12 @@ const es: Record = { "txt_import_invalid_password_protected_file": "Archivo de exportación protegido con contraseña no válido.", "txt_import_decrypt_failed": "Error al descifrar el archivo de importación.", "txt_import_empty_zip_archive": "El archivo ZIP está vacío.", + "txt_import_zip_too_large": "El archivo ZIP es demasiado grande. El tamaño máximo es {size} MiB.", + "txt_import_file_too_large": "El archivo de importación es demasiado grande. El tamaño máximo es {size} MiB.", + "txt_import_zip_too_many_files": "El archivo ZIP contiene demasiados archivos.", + "txt_import_zip_entry_too_large": "El archivo ZIP contiene un archivo mayor que {size} MiB.", + "txt_import_zip_expands_too_large": "El archivo ZIP se descomprime por encima del límite actual de importación de {size} MiB.", + "txt_import_zip_unsafe_file_name": "El archivo ZIP contiene un nombre de archivo no seguro.", "txt_import_no_json_found_in_zip": "No se encontraron datos JSON importables en el archivo zip.", "txt_import_data_json_not_found": "No se encontró data.json en el archivo ZIP.", "txt_import_zip_password_required": "La contraseña ZIP es obligatoria.", @@ -1216,133 +1224,144 @@ const es: Record = { "txt_log_level_info": "Info", "txt_log_level_security": "Seguridad", "txt_log_level_warn": "Aviso", - "txt_log_action_account_api_key_create": "Create API key", - "txt_log_action_account_api_key_rotate": "Rotate API key", - "txt_log_action_account_keys_update": "Update account keys", - "txt_log_action_account_profile_update": "Update account profile", - "txt_log_action_account_totp_disable": "Disable two-step login", - "txt_log_action_account_totp_enable": "Enable two-step login", - "txt_log_action_account_totp_recover": "Recover two-step login", - "txt_log_action_account_verify_devices_update": "Update device verification", - "txt_log_action_admin_audit_settings_update": "Update log retention settings", - "txt_log_action_admin_backup_export": "Export backup", - "txt_log_action_admin_backup_import": "Import backup", - "txt_log_action_admin_backup_remote_delete": "Delete remote backup", - "txt_log_action_admin_backup_remote_manual": "Manual remote backup succeeded", - "txt_log_action_admin_backup_remote_manual_failed": "Manual remote backup failed", - "txt_log_action_admin_backup_remote_scheduled": "Scheduled remote backup succeeded", - "txt_log_action_admin_backup_remote_scheduled_failed": "Scheduled remote backup failed", - "txt_log_action_admin_backup_settings_repair": "Repair backup settings", - "txt_log_action_admin_backup_settings_update": "Update backup settings", - "txt_log_action_admin_invite_create": "Create invite", - "txt_log_action_admin_invite_delete": "Delete invite", - "txt_log_action_admin_invite_delete_all": "Clear invites", - "txt_log_action_admin_invite_delete_invalid": "Delete invalid invites", - "txt_log_action_admin_invite_revoke": "Revoke invite", - "txt_log_action_admin_user_delete": "Delete user", - "txt_log_action_admin_user_status": "Change user status", - "txt_log_action_attachment_delete": "Delete attachment", - "txt_log_action_auth_login_failed_bad_api_key": "Login failed: bad API key", - "txt_log_action_auth_login_failed_bad_password": "Login failed: bad password", - "txt_log_action_auth_login_failed_user_inactive": "Login failed: inactive account", - "txt_log_action_auth_login_success": "Login succeeded", - "txt_log_action_auth_refresh_failed": "Refresh login failed: {reason}", - "txt_log_action_cipher_delete_permanent": "Permanently delete vault item", - "txt_log_action_cipher_delete_permanent_bulk": "Permanently delete vault items", - "txt_log_action_cipher_delete_soft": "Move vault item to trash", - "txt_log_action_cipher_delete_soft_bulk": "Move vault items to trash", - "txt_log_action_device_deactivate": "Deactivate device", - "txt_log_action_device_delete": "Delete device", - "txt_log_action_device_delete_all": "Delete all devices", - "txt_log_action_device_name_update": "Update device name", - "txt_log_action_device_trust_permanent": "Trust device permanently", - "txt_log_action_device_trust_revoke": "Revoke device trust", - "txt_log_action_device_trust_revoke_batch": "Revoke device trust in bulk", - "txt_log_action_folder_delete": "Delete folder", - "txt_log_action_folder_delete_bulk": "Delete folders", - "txt_log_action_send_auth_remove": "Remove Send authentication", - "txt_log_action_send_delete": "Delete Send", - "txt_log_action_send_delete_bulk": "Delete Sends", - "txt_log_action_send_password_remove": "Remove Send password", - "txt_log_action_user_password_change": "Change master password", - "txt_log_action_user_register_first_admin": "Register first admin", - "txt_log_action_user_register_invite": "Register by invite", - "txt_log_meta_attachments": "Attachments", + "txt_log_action_account_api_key_create": "Crear clave de API", + "txt_log_action_account_api_key_rotate": "Rotar clave de API", + "txt_log_action_account_keys_update": "Actualizar claves de cuenta", + "txt_log_action_account_passkey_create": "Crear passkey de inicio de sesión", + "txt_log_action_account_passkey_delete": "Eliminar passkey de inicio de sesión", + "txt_log_action_account_passkey_encryption_enable": "Activar desbloqueo de la bóveda con passkey", + "txt_log_action_account_profile_update": "Actualizar perfil de cuenta", + "txt_log_action_account_totp_disable": "Desactivar verificación en dos pasos", + "txt_log_action_account_totp_enable": "Activar verificación en dos pasos", + "txt_log_action_account_totp_recover": "Recuperar verificación en dos pasos", + "txt_log_action_account_verify_devices_update": "Actualizar verificación de dispositivos", + "txt_log_action_account_webauthn_2fa_delete": "Eliminar clave de verificación en dos pasos con passkey", + "txt_log_action_account_webauthn_2fa_enable": "Activar verificación en dos pasos con passkey", + "txt_log_action_account_yubikey_enable": "Actualizar configuración de YubiKey OTP", + "txt_log_action_admin_audit_clear": "Borrar registros de auditoría", + "txt_log_action_admin_audit_settings_update": "Actualizar retención de registros", + "txt_log_action_admin_backup_export": "Exportar copia de seguridad", + "txt_log_action_admin_backup_import": "Importar copia de seguridad", + "txt_log_action_admin_backup_remote_delete": "Eliminar copia remota", + "txt_log_action_admin_backup_remote_manual": "Copia remota manual completada", + "txt_log_action_admin_backup_remote_manual_failed": "Error en copia remota manual", + "txt_log_action_admin_backup_remote_scheduled": "Copia remota programada completada", + "txt_log_action_admin_backup_remote_scheduled_failed": "Error en copia remota programada", + "txt_log_action_admin_backup_settings_repair": "Reparar configuración de copias", + "txt_log_action_admin_backup_settings_update": "Actualizar configuración de copias", + "txt_log_action_admin_invite_create": "Crear invitación", + "txt_log_action_admin_invite_delete": "Eliminar invitación", + "txt_log_action_admin_invite_delete_all": "Borrar invitaciones", + "txt_log_action_admin_invite_delete_invalid": "Eliminar invitaciones no válidas", + "txt_log_action_admin_invite_revoke": "Revocar invitación", + "txt_log_action_admin_user_delete": "Eliminar usuario", + "txt_log_action_admin_user_status": "Cambiar estado del usuario", + "txt_log_action_attachment_delete": "Eliminar adjunto", + "txt_log_action_auth_login_failed_bad_api_key": "Inicio de sesión fallido: clave de API incorrecta", + "txt_log_action_auth_login_failed_bad_password": "Inicio de sesión fallido: contraseña incorrecta", + "txt_log_action_auth_login_failed_user_inactive": "Inicio de sesión fallido: cuenta inactiva", + "txt_log_action_auth_login_success": "Inicio de sesión correcto", + "txt_log_action_auth_passkey_login_failed": "Error de inicio de sesión con passkey", + "txt_log_action_auth_passkey_login_success": "Inicio de sesión con passkey correcto", + "txt_log_action_auth_refresh_failed": "Error al renovar inicio de sesión: {reason}", + "txt_log_action_cipher_delete_permanent": "Eliminar elemento de bóveda permanentemente", + "txt_log_action_cipher_delete_permanent_bulk": "Eliminar elementos de bóveda permanentemente", + "txt_log_action_cipher_delete_soft": "Mover elemento de bóveda a la papelera", + "txt_log_action_cipher_delete_soft_bulk": "Mover elementos de bóveda a la papelera", + "txt_log_action_device_deactivate": "Desactivar dispositivo", + "txt_log_action_device_delete": "Eliminar dispositivo", + "txt_log_action_device_delete_all": "Eliminar todos los dispositivos", + "txt_log_action_device_name_update": "Actualizar nombre del dispositivo", + "txt_log_action_device_trust_permanent": "Confiar permanentemente en el dispositivo", + "txt_log_action_device_trust_revoke": "Revocar confianza del dispositivo", + "txt_log_action_device_trust_revoke_batch": "Revocar confianza de dispositivos en lote", + "txt_log_action_folder_delete": "Eliminar carpeta", + "txt_log_action_folder_delete_bulk": "Eliminar carpetas", + "txt_log_action_send_auth_remove": "Quitar autenticación de Send", + "txt_log_action_send_delete": "Eliminar Send", + "txt_log_action_send_delete_bulk": "Eliminar Sends", + "txt_log_action_send_password_remove": "Quitar contraseña de Send", + "txt_log_action_user_password_change": "Cambiar contraseña maestra", + "txt_log_action_user_register_first_admin": "Registrar primer administrador", + "txt_log_action_user_register_invite": "Registrarse por invitación", + "txt_log_meta_attachments": "Adjuntos", "txt_log_meta_bytes": "Bytes", - "txt_log_meta_changed": "Changed fields", - "txt_log_meta_checksum_mismatch_accepted": "Accepted checksum mismatch", - "txt_log_meta_cipher_id": "Vault item ID", - "txt_log_meta_ciphers": "Vault items", - "txt_log_meta_compat": "Compatibility", - "txt_log_meta_compressed_bytes": "Compressed bytes", - "txt_log_meta_count": "Count", - "txt_log_meta_deleted": "Deleted count", - "txt_log_meta_destination_count": "Destination count", - "txt_log_meta_destination_id": "Destination ID", - "txt_log_meta_destination_name": "Destination name", - "txt_log_meta_destination_type": "Destination type", - "txt_log_meta_device_identifier": "Device ID", - "txt_log_meta_device_type": "Device type", + "txt_log_meta_changed": "Campos modificados", + "txt_log_meta_checksum_mismatch_accepted": "Desajuste de checksum aceptado", + "txt_log_meta_cipher_id": "ID del elemento de bóveda", + "txt_log_meta_ciphers": "Elementos de bóveda", + "txt_log_meta_compat": "Compatibilidad", + "txt_log_meta_compressed_bytes": "Bytes comprimidos", + "txt_log_meta_count": "Cantidad", + "txt_log_meta_deleted": "Cantidad eliminada", + "txt_log_meta_destination_count": "Cantidad de destinos", + "txt_log_meta_destination_id": "ID de destino", + "txt_log_meta_destination_name": "Nombre de destino", + "txt_log_meta_destination_type": "Tipo de destino", + "txt_log_meta_device_identifier": "ID del dispositivo", + "txt_log_meta_device_type": "Tipo de dispositivo", "txt_log_meta_email": "Email", "txt_log_meta_error": "Error", - "txt_log_meta_expires_in_hours": "Expires in hours", - "txt_log_meta_file_bytes": "File bytes", - "txt_log_meta_file_name": "File name", - "txt_log_meta_folder_id": "Folder ID", - "txt_log_meta_grant_type": "Login method", - "txt_log_meta_includes_attachments": "Includes attachments", - "txt_log_meta_ip": "IP address", - "txt_log_meta_max_entries": "Entry limit", - "txt_log_meta_method": "Request method", - "txt_log_meta_path": "Request path", - "txt_log_meta_provider": "Provider", - "txt_log_meta_prune_error": "Cleanup error", - "txt_log_meta_pruned_file_count": "Cleaned files", - "txt_log_meta_raw": "Raw data", - "txt_log_meta_reason": "Reason", - "txt_log_meta_remote_path": "Remote path", - "txt_log_meta_removed": "Removed count", - "txt_log_meta_removed_devices": "Removed devices", - "txt_log_meta_removed_sessions": "Removed sessions", - "txt_log_meta_removed_trusted": "Trust removals", - "txt_log_meta_replace_existing": "Replace existing data", - "txt_log_meta_requested": "Requested count", - "txt_log_meta_requested_count": "Requested count", - "txt_log_meta_retention_days": "Retention days", - "txt_log_meta_scheduled_destination_count": "Scheduled destinations", - "txt_log_meta_size": "Size", - "txt_log_meta_skipped_attachments": "Skipped attachments", - "txt_log_meta_skipped_reason": "Skip reason", - "txt_log_meta_status": "Status", - "txt_log_meta_target_email": "Target email", - "txt_log_meta_trigger": "Trigger", - "txt_log_meta_type": "Type", - "txt_log_meta_updated": "Updated count", - "txt_log_meta_upload_verification_attempts": "Upload verification attempts", - "txt_log_meta_user_agent": "Browser/client", - "txt_log_meta_users": "Users", - "txt_log_meta_verify_devices": "Verify devices", - "txt_log_meta_web_session": "Web session", - "txt_log_reason_bad_api_key": "Bad API key", - "txt_log_reason_bad_password": "Bad password", - "txt_log_reason_device_missing": "Device missing", - "txt_log_reason_device_session_mismatch": "Device session mismatch", - "txt_log_reason_token_not_found_or_expired": "Token missing or expired", - "txt_log_reason_user_inactive": "User inactive", - "txt_log_reason_user_missing": "User missing", - "txt_log_target_type_attachment": "Attachment", - "txt_log_target_type_audit_log": "Log", - "txt_log_target_type_backup": "Backup", - "txt_log_target_type_cipher": "Vault item", - "txt_log_target_type_device": "Device", - "txt_log_target_type_folder": "Folder", - "txt_log_target_type_invite": "Invite", - "txt_log_target_type_refresh_token": "Refresh token", + "txt_log_meta_expires_in_hours": "Caduca en horas", + "txt_log_meta_file_bytes": "Bytes del archivo", + "txt_log_meta_file_name": "Nombre del archivo", + "txt_log_meta_folder_id": "ID de carpeta", + "txt_log_meta_grant_type": "Método de inicio de sesión", + "txt_log_meta_includes_attachments": "Incluye adjuntos", + "txt_log_meta_ip": "Dirección IP", + "txt_log_meta_max_entries": "Límite de entradas", + "txt_log_meta_method": "Método de solicitud", + "txt_log_meta_path": "Ruta de solicitud", + "txt_log_meta_provider": "Proveedor", + "txt_log_meta_prf_status": "Estado de PRF", + "txt_log_meta_prune_error": "Error de limpieza", + "txt_log_meta_pruned_file_count": "Archivos limpiados", + "txt_log_meta_raw": "Datos sin procesar", + "txt_log_meta_reason": "Motivo", + "txt_log_meta_remote_path": "Ruta remota", + "txt_log_meta_removed": "Cantidad quitada", + "txt_log_meta_removed_devices": "Dispositivos quitados", + "txt_log_meta_removed_sessions": "Sesiones quitadas", + "txt_log_meta_removed_trusted": "Confianzas revocadas", + "txt_log_meta_replace_existing": "Reemplazar datos existentes", + "txt_log_meta_requested": "Cantidad solicitada", + "txt_log_meta_requested_count": "Cantidad solicitada", + "txt_log_meta_retention_days": "Días de retención", + "txt_log_meta_scheduled_destination_count": "Destinos programados", + "txt_log_meta_size": "Tamaño", + "txt_log_meta_skipped_attachments": "Adjuntos omitidos", + "txt_log_meta_skipped_reason": "Motivo de omisión", + "txt_log_meta_status": "Estado", + "txt_log_meta_target_email": "Correo del destino", + "txt_log_meta_trigger": "Disparador", + "txt_log_meta_type": "Tipo", + "txt_log_meta_updated": "Cantidad actualizada", + "txt_log_meta_upload_verification_attempts": "Intentos de verificación de subida", + "txt_log_meta_user_agent": "Navegador/cliente", + "txt_log_meta_users": "Usuarios", + "txt_log_meta_verify_devices": "Verificar dispositivos", + "txt_log_meta_web_session": "Sesión web", + "txt_log_reason_bad_api_key": "Clave de API incorrecta", + "txt_log_reason_bad_password": "Contraseña incorrecta", + "txt_log_reason_device_missing": "Dispositivo no encontrado", + "txt_log_reason_device_session_mismatch": "La sesión no coincide con el dispositivo", + "txt_log_reason_token_not_found_or_expired": "Token no encontrado o caducado", + "txt_log_reason_user_inactive": "Usuario inactivo", + "txt_log_reason_user_missing": "Usuario no encontrado", + "txt_log_target_type_attachment": "Adjunto", + "txt_log_target_type_account_passkey": "Passkey de inicio de sesión", + "txt_log_target_type_audit_log": "Registro", + "txt_log_target_type_backup": "Copia de seguridad", + "txt_log_target_type_cipher": "Elemento de bóveda", + "txt_log_target_type_device": "Dispositivo", + "txt_log_target_type_folder": "Carpeta", + "txt_log_target_type_invite": "Invitación", + "txt_log_target_type_refresh_token": "Token de renovación", "txt_log_target_type_send": "Send", - "txt_log_target_type_user": "User", + "txt_log_target_type_user": "Usuario", "txt_log_trigger_manual": "Manual", - "txt_log_trigger_remote": "Remote", - "txt_log_trigger_scheduled": "Scheduled", + "txt_log_trigger_remote": "Remoto", + "txt_log_trigger_scheduled": "Programado", "txt_log_max_1000": "Hasta 1000 entradas", "txt_log_max_5000": "Hasta 5000 entradas", "txt_log_max_10000": "Hasta 10 000 entradas", diff --git a/webapp/src/lib/i18n/locales/ru.ts b/webapp/src/lib/i18n/locales/ru.ts index 8713177..aa07e7f 100644 --- a/webapp/src/lib/i18n/locales/ru.ts +++ b/webapp/src/lib/i18n/locales/ru.ts @@ -1014,6 +1014,8 @@ const ru: Record = { "txt_totp_qr_scanned": "Значение TOTP добавлено.", "txt_totp_qr_not_found": "QR-код на этом изображении не найден.", "txt_totp_qr_scan_failed": "Не удалось отсканировать QR-код.", + "txt_totp_qr_invalid_image_type": "Выберите файл изображения.", + "txt_totp_qr_image_too_large": "Выберите изображение меньше 8 МБ.", "txt_totp_qr_unsupported": "Этот браузер не поддерживает сканирование QR. Попробуйте Chrome или Edge либо вставьте ссылку или секрет TOTP вручную.", "txt_totp_qr_camera_unavailable": "Камера недоступна. Проверьте разрешение браузера или выберите изображение.", "txt_totp_qr_choose_image": "Выбрать изображение", @@ -1125,6 +1127,12 @@ const ru: Record = { "txt_import_invalid_password_protected_file": "Неверный файл экспорта, защищенный паролем.", "txt_import_decrypt_failed": "Не удалось расшифровать файл импорта.", "txt_import_empty_zip_archive": "Пустой zip-архив.", + "txt_import_zip_too_large": "ZIP-архив слишком большой. Максимальный размер: {size} MiB.", + "txt_import_file_too_large": "Файл импорта слишком большой. Максимальный размер: {size} MiB.", + "txt_import_zip_too_many_files": "ZIP-архив содержит слишком много файлов.", + "txt_import_zip_entry_too_large": "ZIP-архив содержит файл больше {size} MiB.", + "txt_import_zip_expands_too_large": "ZIP-архив распаковывается за текущий лимит импорта {size} MiB.", + "txt_import_zip_unsafe_file_name": "ZIP-архив содержит небезопасное имя файла.", "txt_import_no_json_found_in_zip": "В zip-архиве не найдены импортируемые данные JSON.", "txt_import_data_json_not_found": "data.json не найден в zip-архиве.", "txt_import_zip_password_required": "Требуется пароль ZIP.", @@ -1216,133 +1224,144 @@ const ru: Record = { "txt_log_level_info": "Инфо", "txt_log_level_security": "Безопасность", "txt_log_level_warn": "Предупреждение", - "txt_log_action_account_api_key_create": "Create API key", - "txt_log_action_account_api_key_rotate": "Rotate API key", - "txt_log_action_account_keys_update": "Update account keys", - "txt_log_action_account_profile_update": "Update account profile", - "txt_log_action_account_totp_disable": "Disable two-step login", - "txt_log_action_account_totp_enable": "Enable two-step login", - "txt_log_action_account_totp_recover": "Recover two-step login", - "txt_log_action_account_verify_devices_update": "Update device verification", - "txt_log_action_admin_audit_settings_update": "Update log retention settings", - "txt_log_action_admin_backup_export": "Export backup", - "txt_log_action_admin_backup_import": "Import backup", - "txt_log_action_admin_backup_remote_delete": "Delete remote backup", - "txt_log_action_admin_backup_remote_manual": "Manual remote backup succeeded", - "txt_log_action_admin_backup_remote_manual_failed": "Manual remote backup failed", - "txt_log_action_admin_backup_remote_scheduled": "Scheduled remote backup succeeded", - "txt_log_action_admin_backup_remote_scheduled_failed": "Scheduled remote backup failed", - "txt_log_action_admin_backup_settings_repair": "Repair backup settings", - "txt_log_action_admin_backup_settings_update": "Update backup settings", - "txt_log_action_admin_invite_create": "Create invite", - "txt_log_action_admin_invite_delete": "Delete invite", - "txt_log_action_admin_invite_delete_all": "Clear invites", - "txt_log_action_admin_invite_delete_invalid": "Delete invalid invites", - "txt_log_action_admin_invite_revoke": "Revoke invite", - "txt_log_action_admin_user_delete": "Delete user", - "txt_log_action_admin_user_status": "Change user status", - "txt_log_action_attachment_delete": "Delete attachment", - "txt_log_action_auth_login_failed_bad_api_key": "Login failed: bad API key", - "txt_log_action_auth_login_failed_bad_password": "Login failed: bad password", - "txt_log_action_auth_login_failed_user_inactive": "Login failed: inactive account", - "txt_log_action_auth_login_success": "Login succeeded", - "txt_log_action_auth_refresh_failed": "Refresh login failed: {reason}", - "txt_log_action_cipher_delete_permanent": "Permanently delete vault item", - "txt_log_action_cipher_delete_permanent_bulk": "Permanently delete vault items", - "txt_log_action_cipher_delete_soft": "Move vault item to trash", - "txt_log_action_cipher_delete_soft_bulk": "Move vault items to trash", - "txt_log_action_device_deactivate": "Deactivate device", - "txt_log_action_device_delete": "Delete device", - "txt_log_action_device_delete_all": "Delete all devices", - "txt_log_action_device_name_update": "Update device name", - "txt_log_action_device_trust_permanent": "Trust device permanently", - "txt_log_action_device_trust_revoke": "Revoke device trust", - "txt_log_action_device_trust_revoke_batch": "Revoke device trust in bulk", - "txt_log_action_folder_delete": "Delete folder", - "txt_log_action_folder_delete_bulk": "Delete folders", - "txt_log_action_send_auth_remove": "Remove Send authentication", - "txt_log_action_send_delete": "Delete Send", - "txt_log_action_send_delete_bulk": "Delete Sends", - "txt_log_action_send_password_remove": "Remove Send password", - "txt_log_action_user_password_change": "Change master password", - "txt_log_action_user_register_first_admin": "Register first admin", - "txt_log_action_user_register_invite": "Register by invite", - "txt_log_meta_attachments": "Attachments", + "txt_log_action_account_api_key_create": "Создание API-ключа", + "txt_log_action_account_api_key_rotate": "Ротация API-ключа", + "txt_log_action_account_keys_update": "Обновление ключей учетной записи", + "txt_log_action_account_passkey_create": "Создание ключа входа", + "txt_log_action_account_passkey_delete": "Удаление ключа входа", + "txt_log_action_account_passkey_encryption_enable": "Включение разблокировки хранилища ключом доступа", + "txt_log_action_account_profile_update": "Обновление профиля учетной записи", + "txt_log_action_account_totp_disable": "Отключение двухфакторной проверки", + "txt_log_action_account_totp_enable": "Включение двухфакторной проверки", + "txt_log_action_account_totp_recover": "Восстановление двухфакторной проверки", + "txt_log_action_account_verify_devices_update": "Обновление проверки устройств", + "txt_log_action_account_webauthn_2fa_delete": "Удаление ключа двухфакторной проверки", + "txt_log_action_account_webauthn_2fa_enable": "Включение двухфакторной проверки ключом доступа", + "txt_log_action_account_yubikey_enable": "Обновление настроек YubiKey OTP", + "txt_log_action_admin_audit_clear": "Очистка журнала аудита", + "txt_log_action_admin_audit_settings_update": "Обновление хранения журналов", + "txt_log_action_admin_backup_export": "Экспорт резервной копии", + "txt_log_action_admin_backup_import": "Импорт резервной копии", + "txt_log_action_admin_backup_remote_delete": "Удаление удаленной резервной копии", + "txt_log_action_admin_backup_remote_manual": "Ручное удаленное резервное копирование выполнено", + "txt_log_action_admin_backup_remote_manual_failed": "Ошибка ручного удаленного резервного копирования", + "txt_log_action_admin_backup_remote_scheduled": "Запланированное удаленное резервное копирование выполнено", + "txt_log_action_admin_backup_remote_scheduled_failed": "Ошибка запланированного удаленного резервного копирования", + "txt_log_action_admin_backup_settings_repair": "Восстановление настроек резервного копирования", + "txt_log_action_admin_backup_settings_update": "Обновление настроек резервного копирования", + "txt_log_action_admin_invite_create": "Создание приглашения", + "txt_log_action_admin_invite_delete": "Удаление приглашения", + "txt_log_action_admin_invite_delete_all": "Очистка приглашений", + "txt_log_action_admin_invite_delete_invalid": "Удаление недействительных приглашений", + "txt_log_action_admin_invite_revoke": "Отзыв приглашения", + "txt_log_action_admin_user_delete": "Удаление пользователя", + "txt_log_action_admin_user_status": "Изменение статуса пользователя", + "txt_log_action_attachment_delete": "Удаление вложения", + "txt_log_action_auth_login_failed_bad_api_key": "Ошибка входа: неверный API-ключ", + "txt_log_action_auth_login_failed_bad_password": "Ошибка входа: неверный пароль", + "txt_log_action_auth_login_failed_user_inactive": "Ошибка входа: учетная запись неактивна", + "txt_log_action_auth_login_success": "Вход выполнен", + "txt_log_action_auth_passkey_login_failed": "Ошибка входа по ключу доступа", + "txt_log_action_auth_passkey_login_success": "Вход по ключу доступа выполнен", + "txt_log_action_auth_refresh_failed": "Не удалось обновить вход: {reason}", + "txt_log_action_cipher_delete_permanent": "Окончательное удаление элемента хранилища", + "txt_log_action_cipher_delete_permanent_bulk": "Окончательное удаление элементов хранилища", + "txt_log_action_cipher_delete_soft": "Перемещение элемента хранилища в корзину", + "txt_log_action_cipher_delete_soft_bulk": "Перемещение элементов хранилища в корзину", + "txt_log_action_device_deactivate": "Деактивация устройства", + "txt_log_action_device_delete": "Удаление устройства", + "txt_log_action_device_delete_all": "Удаление всех устройств", + "txt_log_action_device_name_update": "Обновление имени устройства", + "txt_log_action_device_trust_permanent": "Постоянное доверие устройству", + "txt_log_action_device_trust_revoke": "Отзыв доверия устройству", + "txt_log_action_device_trust_revoke_batch": "Массовый отзыв доверия устройствам", + "txt_log_action_folder_delete": "Удаление папки", + "txt_log_action_folder_delete_bulk": "Удаление папок", + "txt_log_action_send_auth_remove": "Удаление проверки Send", + "txt_log_action_send_delete": "Удаление Send", + "txt_log_action_send_delete_bulk": "Удаление Send", + "txt_log_action_send_password_remove": "Удаление пароля Send", + "txt_log_action_user_password_change": "Изменение мастер-пароля", + "txt_log_action_user_register_first_admin": "Регистрация первого администратора", + "txt_log_action_user_register_invite": "Регистрация по приглашению", + "txt_log_meta_attachments": "Вложения", "txt_log_meta_bytes": "Bytes", - "txt_log_meta_changed": "Changed fields", - "txt_log_meta_checksum_mismatch_accepted": "Accepted checksum mismatch", - "txt_log_meta_cipher_id": "Vault item ID", - "txt_log_meta_ciphers": "Vault items", - "txt_log_meta_compat": "Compatibility", - "txt_log_meta_compressed_bytes": "Compressed bytes", - "txt_log_meta_count": "Count", - "txt_log_meta_deleted": "Deleted count", - "txt_log_meta_destination_count": "Destination count", - "txt_log_meta_destination_id": "Destination ID", - "txt_log_meta_destination_name": "Destination name", - "txt_log_meta_destination_type": "Destination type", - "txt_log_meta_device_identifier": "Device ID", - "txt_log_meta_device_type": "Device type", + "txt_log_meta_changed": "Измененные поля", + "txt_log_meta_checksum_mismatch_accepted": "Принято несовпадение контрольной суммы", + "txt_log_meta_cipher_id": "ID элемента хранилища", + "txt_log_meta_ciphers": "Элементы хранилища", + "txt_log_meta_compat": "Совместимость", + "txt_log_meta_compressed_bytes": "Байт после сжатия", + "txt_log_meta_count": "Количество", + "txt_log_meta_deleted": "Удалено", + "txt_log_meta_destination_count": "Количество назначений", + "txt_log_meta_destination_id": "ID назначения", + "txt_log_meta_destination_name": "Имя назначения", + "txt_log_meta_destination_type": "Тип назначения", + "txt_log_meta_device_identifier": "ID устройства", + "txt_log_meta_device_type": "Тип устройства", "txt_log_meta_email": "Email", - "txt_log_meta_error": "Error", - "txt_log_meta_expires_in_hours": "Expires in hours", - "txt_log_meta_file_bytes": "File bytes", - "txt_log_meta_file_name": "File name", - "txt_log_meta_folder_id": "Folder ID", - "txt_log_meta_grant_type": "Login method", - "txt_log_meta_includes_attachments": "Includes attachments", - "txt_log_meta_ip": "IP address", - "txt_log_meta_max_entries": "Entry limit", - "txt_log_meta_method": "Request method", - "txt_log_meta_path": "Request path", - "txt_log_meta_provider": "Provider", - "txt_log_meta_prune_error": "Cleanup error", - "txt_log_meta_pruned_file_count": "Cleaned files", - "txt_log_meta_raw": "Raw data", - "txt_log_meta_reason": "Reason", - "txt_log_meta_remote_path": "Remote path", - "txt_log_meta_removed": "Removed count", - "txt_log_meta_removed_devices": "Removed devices", - "txt_log_meta_removed_sessions": "Removed sessions", - "txt_log_meta_removed_trusted": "Trust removals", - "txt_log_meta_replace_existing": "Replace existing data", - "txt_log_meta_requested": "Requested count", - "txt_log_meta_requested_count": "Requested count", - "txt_log_meta_retention_days": "Retention days", - "txt_log_meta_scheduled_destination_count": "Scheduled destinations", - "txt_log_meta_size": "Size", - "txt_log_meta_skipped_attachments": "Skipped attachments", - "txt_log_meta_skipped_reason": "Skip reason", - "txt_log_meta_status": "Status", - "txt_log_meta_target_email": "Target email", - "txt_log_meta_trigger": "Trigger", - "txt_log_meta_type": "Type", - "txt_log_meta_updated": "Updated count", - "txt_log_meta_upload_verification_attempts": "Upload verification attempts", - "txt_log_meta_user_agent": "Browser/client", - "txt_log_meta_users": "Users", - "txt_log_meta_verify_devices": "Verify devices", - "txt_log_meta_web_session": "Web session", - "txt_log_reason_bad_api_key": "Bad API key", - "txt_log_reason_bad_password": "Bad password", - "txt_log_reason_device_missing": "Device missing", - "txt_log_reason_device_session_mismatch": "Device session mismatch", - "txt_log_reason_token_not_found_or_expired": "Token missing or expired", - "txt_log_reason_user_inactive": "User inactive", - "txt_log_reason_user_missing": "User missing", - "txt_log_target_type_attachment": "Attachment", - "txt_log_target_type_audit_log": "Log", - "txt_log_target_type_backup": "Backup", - "txt_log_target_type_cipher": "Vault item", - "txt_log_target_type_device": "Device", - "txt_log_target_type_folder": "Folder", - "txt_log_target_type_invite": "Invite", - "txt_log_target_type_refresh_token": "Refresh token", + "txt_log_meta_error": "Ошибка", + "txt_log_meta_expires_in_hours": "Истекает через часов", + "txt_log_meta_file_bytes": "Байт файла", + "txt_log_meta_file_name": "Имя файла", + "txt_log_meta_folder_id": "ID папки", + "txt_log_meta_grant_type": "Способ входа", + "txt_log_meta_includes_attachments": "Включает вложения", + "txt_log_meta_ip": "IP-адрес", + "txt_log_meta_max_entries": "Лимит записей", + "txt_log_meta_method": "Метод запроса", + "txt_log_meta_path": "Путь запроса", + "txt_log_meta_provider": "Поставщик", + "txt_log_meta_prf_status": "Статус PRF", + "txt_log_meta_prune_error": "Ошибка очистки", + "txt_log_meta_pruned_file_count": "Очищено файлов", + "txt_log_meta_raw": "Исходные данные", + "txt_log_meta_reason": "Причина", + "txt_log_meta_remote_path": "Удаленный путь", + "txt_log_meta_removed": "Удалено", + "txt_log_meta_removed_devices": "Удалено устройств", + "txt_log_meta_removed_sessions": "Удалено сессий", + "txt_log_meta_removed_trusted": "Отозвано доверий", + "txt_log_meta_replace_existing": "Заменить существующие данные", + "txt_log_meta_requested": "Запрошено", + "txt_log_meta_requested_count": "Запрошено", + "txt_log_meta_retention_days": "Дней хранения", + "txt_log_meta_scheduled_destination_count": "Запланированные назначения", + "txt_log_meta_size": "Размер", + "txt_log_meta_skipped_attachments": "Пропущенные вложения", + "txt_log_meta_skipped_reason": "Причина пропуска", + "txt_log_meta_status": "Статус", + "txt_log_meta_target_email": "Email цели", + "txt_log_meta_trigger": "Триггер", + "txt_log_meta_type": "Тип", + "txt_log_meta_updated": "Обновлено", + "txt_log_meta_upload_verification_attempts": "Попытки проверки загрузки", + "txt_log_meta_user_agent": "Браузер/клиент", + "txt_log_meta_users": "Пользователи", + "txt_log_meta_verify_devices": "Проверка устройств", + "txt_log_meta_web_session": "Веб-сессия", + "txt_log_reason_bad_api_key": "Неверный API-ключ", + "txt_log_reason_bad_password": "Неверный пароль", + "txt_log_reason_device_missing": "Устройство не найдено", + "txt_log_reason_device_session_mismatch": "Сессия не соответствует устройству", + "txt_log_reason_token_not_found_or_expired": "Токен отсутствует или истек", + "txt_log_reason_user_inactive": "Пользователь неактивен", + "txt_log_reason_user_missing": "Пользователь не найден", + "txt_log_target_type_attachment": "Вложение", + "txt_log_target_type_account_passkey": "Ключ входа", + "txt_log_target_type_audit_log": "Журнал", + "txt_log_target_type_backup": "Резервная копия", + "txt_log_target_type_cipher": "Элемент хранилища", + "txt_log_target_type_device": "Устройство", + "txt_log_target_type_folder": "Папка", + "txt_log_target_type_invite": "Приглашение", + "txt_log_target_type_refresh_token": "Токен обновления", "txt_log_target_type_send": "Send", - "txt_log_target_type_user": "User", - "txt_log_trigger_manual": "Manual", - "txt_log_trigger_remote": "Remote", - "txt_log_trigger_scheduled": "Scheduled", + "txt_log_target_type_user": "Пользователь", + "txt_log_trigger_manual": "Вручную", + "txt_log_trigger_remote": "Удаленно", + "txt_log_trigger_scheduled": "По расписанию", "txt_log_max_1000": "До 1 000 записей", "txt_log_max_5000": "До 5 000 записей", "txt_log_max_10000": "До 10 000 записей", diff --git a/webapp/src/lib/i18n/locales/zh-CN.ts b/webapp/src/lib/i18n/locales/zh-CN.ts index caa3b19..893b5dc 100644 --- a/webapp/src/lib/i18n/locales/zh-CN.ts +++ b/webapp/src/lib/i18n/locales/zh-CN.ts @@ -1014,6 +1014,8 @@ const zhCN: Record = { "txt_totp_qr_scanned": "TOTP 内容已填入。", "txt_totp_qr_not_found": "这张图片里没有识别到二维码。", "txt_totp_qr_scan_failed": "二维码扫描失败。", + "txt_totp_qr_invalid_image_type": "请选择图片文件。", + "txt_totp_qr_image_too_large": "请选择小于 8 MB 的图片。", "txt_totp_qr_unsupported": "当前浏览器不支持二维码扫描。可尝试 Chrome 或 Edge,或手动粘贴 TOTP 链接/密钥。", "txt_totp_qr_camera_unavailable": "无法使用摄像头。请检查浏览器权限,或选择图片。", "txt_totp_qr_choose_image": "选择图片", @@ -1125,6 +1127,12 @@ const zhCN: Record = { "txt_import_invalid_password_protected_file": "密码保护导出文件格式无效。", "txt_import_decrypt_failed": "导入文件解密失败。", "txt_import_empty_zip_archive": "ZIP 压缩包为空。", + "txt_import_zip_too_large": "ZIP 压缩包过大,最大允许 {size} MiB。", + "txt_import_file_too_large": "导入文件过大,最大允许 {size} MiB。", + "txt_import_zip_too_many_files": "ZIP 压缩包内文件过多。", + "txt_import_zip_entry_too_large": "ZIP 压缩包内存在超过 {size} MiB 的文件。", + "txt_import_zip_expands_too_large": "ZIP 解压后超过当前导入限制 {size} MiB。", + "txt_import_zip_unsafe_file_name": "ZIP 压缩包包含不安全的文件名。", "txt_import_no_json_found_in_zip": "ZIP 内未找到可导入的 JSON 数据。", "txt_import_data_json_not_found": "ZIP 内未找到 data.json。", "txt_import_zip_password_required": "该 ZIP 需要密码。", @@ -1219,11 +1227,18 @@ const zhCN: Record = { "txt_log_action_account_api_key_create": "创建 API 密钥", "txt_log_action_account_api_key_rotate": "轮换 API 密钥", "txt_log_action_account_keys_update": "更新账户密钥", + "txt_log_action_account_passkey_create": "创建登录通行密钥", + "txt_log_action_account_passkey_delete": "删除登录通行密钥", + "txt_log_action_account_passkey_encryption_enable": "开启通行密钥解锁密码库", "txt_log_action_account_profile_update": "更新账户资料", "txt_log_action_account_totp_disable": "关闭两步验证", "txt_log_action_account_totp_enable": "开启两步验证", "txt_log_action_account_totp_recover": "恢复两步验证", "txt_log_action_account_verify_devices_update": "更新设备验证设置", + "txt_log_action_account_webauthn_2fa_delete": "删除通行密钥两步验证密钥", + "txt_log_action_account_webauthn_2fa_enable": "开启通行密钥两步验证", + "txt_log_action_account_yubikey_enable": "更新 YubiKey OTP 设置", + "txt_log_action_admin_audit_clear": "清空审计日志", "txt_log_action_admin_audit_settings_update": "更新日志保留设置", "txt_log_action_admin_backup_export": "导出备份", "txt_log_action_admin_backup_import": "导入备份", @@ -1246,6 +1261,8 @@ const zhCN: Record = { "txt_log_action_auth_login_failed_bad_password": "密码错误登录失败", "txt_log_action_auth_login_failed_user_inactive": "账号停用登录失败", "txt_log_action_auth_login_success": "登录成功", + "txt_log_action_auth_passkey_login_failed": "通行密钥登录失败", + "txt_log_action_auth_passkey_login_success": "通行密钥登录成功", "txt_log_action_auth_refresh_failed": "刷新登录失败:{reason}", "txt_log_action_cipher_delete_permanent": "永久删除密码项", "txt_log_action_cipher_delete_permanent_bulk": "批量永久删除密码项", @@ -1296,6 +1313,7 @@ const zhCN: Record = { "txt_log_meta_method": "请求方法", "txt_log_meta_path": "请求路径", "txt_log_meta_provider": "服务提供方", + "txt_log_meta_prf_status": "PRF 状态", "txt_log_meta_prune_error": "清理错误", "txt_log_meta_pruned_file_count": "已清理文件数", "txt_log_meta_raw": "原始数据", @@ -1331,6 +1349,7 @@ const zhCN: Record = { "txt_log_reason_user_inactive": "用户未启用", "txt_log_reason_user_missing": "用户不存在", "txt_log_target_type_attachment": "附件", + "txt_log_target_type_account_passkey": "登录通行密钥", "txt_log_target_type_audit_log": "日志", "txt_log_target_type_backup": "备份", "txt_log_target_type_cipher": "密码项", diff --git a/webapp/src/lib/i18n/locales/zh-TW.ts b/webapp/src/lib/i18n/locales/zh-TW.ts index a1157b8..4cd6b76 100644 --- a/webapp/src/lib/i18n/locales/zh-TW.ts +++ b/webapp/src/lib/i18n/locales/zh-TW.ts @@ -1014,6 +1014,8 @@ const zhTW: Record = { "txt_totp_qr_scanned": "TOTP 內容已填入。", "txt_totp_qr_not_found": "這張圖片裡沒有識別到二維碼。", "txt_totp_qr_scan_failed": "二維碼掃描失敗。", + "txt_totp_qr_invalid_image_type": "請選擇圖片檔案。", + "txt_totp_qr_image_too_large": "請選擇小於 8 MB 的圖片。", "txt_totp_qr_unsupported": "目前瀏覽器不支援二維碼掃描。可嘗試 Chrome 或 Edge,或手動貼上 TOTP 連結/密鑰。", "txt_totp_qr_camera_unavailable": "無法使用攝影機。請檢查瀏覽器權限,或選擇圖片。", "txt_totp_qr_choose_image": "選擇圖片", @@ -1125,6 +1127,12 @@ const zhTW: Record = { "txt_import_invalid_password_protected_file": "密碼保護導出文件格式無效。", "txt_import_decrypt_failed": "導入文件解密失敗。", "txt_import_empty_zip_archive": "ZIP 壓縮包為空。", + "txt_import_zip_too_large": "ZIP 壓縮包過大,最大允許 {size} MiB。", + "txt_import_file_too_large": "導入文件過大,最大允許 {size} MiB。", + "txt_import_zip_too_many_files": "ZIP 壓縮包內文件過多。", + "txt_import_zip_entry_too_large": "ZIP 壓縮包內存在超過 {size} MiB 的文件。", + "txt_import_zip_expands_too_large": "ZIP 解壓後超過目前導入限制 {size} MiB。", + "txt_import_zip_unsafe_file_name": "ZIP 壓縮包包含不安全的文件名。", "txt_import_no_json_found_in_zip": "ZIP 內未找到可導入的 JSON 數據。", "txt_import_data_json_not_found": "ZIP 內未找到 data.json。", "txt_import_zip_password_required": "該 ZIP 需要密碼。", @@ -1219,11 +1227,18 @@ const zhTW: Record = { "txt_log_action_account_api_key_create": "建立 API 金鑰", "txt_log_action_account_api_key_rotate": "輪換 API 金鑰", "txt_log_action_account_keys_update": "更新帳戶金鑰", + "txt_log_action_account_passkey_create": "建立登入通行密鑰", + "txt_log_action_account_passkey_delete": "刪除登入通行密鑰", + "txt_log_action_account_passkey_encryption_enable": "開啟通行密鑰解鎖密碼庫", "txt_log_action_account_profile_update": "更新帳戶資料", "txt_log_action_account_totp_disable": "關閉兩步驟登入", "txt_log_action_account_totp_enable": "開啟兩步驟登入", "txt_log_action_account_totp_recover": "復原兩步驟登入", "txt_log_action_account_verify_devices_update": "更新裝置驗證設定", + "txt_log_action_account_webauthn_2fa_delete": "刪除通行密鑰兩步驟驗證密鑰", + "txt_log_action_account_webauthn_2fa_enable": "開啟通行密鑰兩步驟驗證", + "txt_log_action_account_yubikey_enable": "更新 YubiKey OTP 設定", + "txt_log_action_admin_audit_clear": "清空稽核日誌", "txt_log_action_admin_audit_settings_update": "更新日誌保留設定", "txt_log_action_admin_backup_export": "匯出備份", "txt_log_action_admin_backup_import": "匯入備份", @@ -1246,6 +1261,8 @@ const zhTW: Record = { "txt_log_action_auth_login_failed_bad_password": "密碼錯誤登入失敗", "txt_log_action_auth_login_failed_user_inactive": "帳號停用登入失敗", "txt_log_action_auth_login_success": "登入成功", + "txt_log_action_auth_passkey_login_failed": "通行密鑰登入失敗", + "txt_log_action_auth_passkey_login_success": "通行密鑰登入成功", "txt_log_action_auth_refresh_failed": "刷新登入失敗:{reason}", "txt_log_action_cipher_delete_permanent": "永久刪除密碼項", "txt_log_action_cipher_delete_permanent_bulk": "批次永久刪除密碼項", @@ -1296,6 +1313,7 @@ const zhTW: Record = { "txt_log_meta_method": "請求方法", "txt_log_meta_path": "請求路徑", "txt_log_meta_provider": "服務提供方", + "txt_log_meta_prf_status": "PRF 狀態", "txt_log_meta_prune_error": "清理錯誤", "txt_log_meta_pruned_file_count": "已清理檔案數", "txt_log_meta_raw": "原始資料", @@ -1331,6 +1349,7 @@ const zhTW: Record = { "txt_log_reason_user_inactive": "使用者未啟用", "txt_log_reason_user_missing": "使用者不存在", "txt_log_target_type_attachment": "附件", + "txt_log_target_type_account_passkey": "登入通行密鑰", "txt_log_target_type_audit_log": "日誌", "txt_log_target_type_backup": "備份", "txt_log_target_type_cipher": "密碼項",