From 98b1cf0f3b194556fe62667a576586f0433aff10 Mon Sep 17 00:00:00 2001 From: Javier Casares Date: Wed, 3 Jun 2026 06:29:56 +0000 Subject: [PATCH] v1.6.0 --- changelog.txt | 39 + includes/Admin/AttachmentDetailPage.php | 107 ++- includes/Admin/AuditPage.php | 482 +++++++----- includes/Admin/MediaListTable.php | 245 +++++- includes/Admin/Settings.php | 582 ++++++++++++-- includes/Core/Activator.php | 5 +- includes/Core/Plugin.php | 2 +- includes/External/HostnameFilter.php | 186 +++++ languages/robotstxt-mediaaudit-ca.mo | Bin 20806 -> 23546 bytes languages/robotstxt-mediaaudit-ca.po | 997 ++++++++++++++---------- languages/robotstxt-mediaaudit-es_ES.mo | Bin 20618 -> 23349 bytes languages/robotstxt-mediaaudit-es_ES.po | 956 +++++++++++++---------- languages/robotstxt-mediaaudit.pot | 958 ++++++++++++++--------- readme.txt | 24 +- robotstxt-mediaaudit.php | 4 +- vendor/composer/autoload_classmap.php | 1 + vendor/composer/autoload_static.php | 1 + 17 files changed, 3122 insertions(+), 1467 deletions(-) create mode 100644 includes/External/HostnameFilter.php diff --git a/changelog.txt b/changelog.txt index 4905d32..2fd2370 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,44 @@ == Changelog == += 1.6.0 = + +_Release date: 2026-05-05_ + +**Added** + +* Settings page reorganised into four native WordPress tabs: General, API Credentials, Filters, External Scanning. Each tab saves independently via a hidden `_tab` sentinel field, preventing cross-tab data loss. +* Filters tab: two configurable hostname lists — "Alert Hostnames" (domains that should trigger a copyright-risk alert) and "Ignored Hostnames" (domains to suppress from results). Wildcard notation `*.example.com` matches the apex domain and all subdomains. +* Auto-normalization on save: scheme, path, query, fragment, port, and `www.` prefix are stripped; duplicates removed; list sorted alphabetically. +* Default filter lists seeded on first activation (idempotent — only runs when the option key does not yet exist): 60 stock-agency / press-agency alert domains, 56 social-media / CDN ignored domains. +* `HostnameFilter` utility class (`includes/External/HostnameFilter.php`): static methods `is_alert()`, `is_ignored()`, `classify()` (`alert`|`ignored`|`other`), and `has_alert_domains()`. Domain classification is request-cached. +* Dashboard stats strip: new "Alert" card showing the count of attachments that have at least one alert-domain match across all external providers. +* Audit list: "Alert" option added to the External Status filter dropdown; when selected, PHP-side filtering classifies each attachment's `top_domains` and returns only those with at least one alert domain. +* Audit list: Alert badge in the External Status column for attachments with alert-domain matches; badge label shows the count of non-ignored matching domains. +* Quick-view modal: ignored domains are now hidden entirely; alert domains are highlighted with an Alert status badge in the domain table. +* Full Report attachment detail page: external results per provider split into three labelled sections — Alert domains, Other domains, and Ignored domains. +* Unified CSV export replaces the two previous separate exports: + * "Export CSV" — all indexed attachments, one row per attachment, containing: ID, filename, URL, MIME type, file size, internal scan date, external status, has alert (Yes/No), usage count, used-in post titles, Google Vision match count, TinEye match count, PicDefense match count, alert domains, other domains, ignored domains. + * "Export CSV (Alerts only)" — same format and columns, filtered to attachments with at least one alert domain match. +* "Media Audit" top-level admin menu repositioned to appear immediately below the built-in Media menu (WordPress admin menu position 11). + +**Removed** + +* Previous "Export External Results CSV" bulk action replaced by the unified export above. + +**No schema changes:** `ROBOTSTXT_MEDIAAUDIT_DB_VERSION` remains `1.1.0`. + +**Compatibility** + +* WordPress: 6.8 - 7.0 +* PHP: 8.2 - 8.4 +* WP-CLI: 2.x + +**Tests** + +* PHP Coding Standards: WPCS 3.x / PHPCS 3.x +* PHPStan: level 9 +* PHPCompatibility: PHP 8.2 - 8.4 + = 1.5.0 = _Release date: 2026-05-05_ diff --git a/includes/Admin/AttachmentDetailPage.php b/includes/Admin/AttachmentDetailPage.php index c08b7ec..5c0e725 100644 --- a/includes/Admin/AttachmentDetailPage.php +++ b/includes/Admin/AttachmentDetailPage.php @@ -7,6 +7,8 @@ namespace MediaRightsAudit\Admin; +use MediaRightsAudit\External\HostnameFilter; + /** * Registers and renders the hidden attachment detail admin page. * @@ -231,6 +233,10 @@ class AttachmentDetailPage { /** * Fetches and renders the external scan results for a given attachment. * + * After rendering all per-provider sections, aggregates top_domains across + * all providers and passes them to render_domain_classification() for a + * consolidated view grouped by alert / other / ignored status. + * * @param int $attachment_id Attachment post ID. * * @return void @@ -241,7 +247,7 @@ class AttachmentDetailPage { // phpcs:ignore WordPress.DB.DirectDatabaseQuery $rows = $wpdb->get_results( $wpdb->prepare( - "SELECT provider, match_count, raw_response, created_at + "SELECT provider, match_count, top_domains, raw_response, created_at FROM {$wpdb->prefix}mra_external_results WHERE attachment_id = %d ORDER BY provider ASC", @@ -261,6 +267,8 @@ class AttachmentDetailPage { 'picdefense' => 'PicDefense', ); + $merged_domains = array(); + foreach ( $rows as $row ) { if ( ! is_array( $row ) ) { continue; @@ -273,6 +281,9 @@ class AttachmentDetailPage { $match_count = is_numeric( $mc_val ) ? (int) $mc_val : 0; $at_val = $row['created_at'] ?? null; $scanned_at = is_string( $at_val ) ? $at_val : ''; + $td_val = $row['top_domains'] ?? null; + $td_raw = is_string( $td_val ) ? json_decode( $td_val, true ) : null; + $domains = is_array( $td_raw ) ? $td_raw : array(); $rr_val = $row['raw_response'] ?? null; $raw = null; if ( is_string( $rr_val ) && '' !== $rr_val ) { @@ -280,6 +291,19 @@ class AttachmentDetailPage { $raw = is_array( $decoded ) ? $decoded : null; } + // Accumulate top_domains across all providers. + foreach ( $domains as $domain => $count ) { + if ( ! is_string( $domain ) ) { + continue; + } + $c = is_numeric( $count ) ? (int) $count : 0; + if ( isset( $merged_domains[ $domain ] ) ) { + $merged_domains[ $domain ] += $c; + } else { + $merged_domains[ $domain ] = $c; + } + } + echo '

'; echo esc_html( $name ); echo ' — '; @@ -311,6 +335,87 @@ class AttachmentDetailPage { } } } + + // Render consolidated domain classification section. + if ( ! empty( $merged_domains ) ) { + $this->render_domain_classification( $merged_domains ); + } + } + + /** + * Renders a domain classification summary grouped into Alert, Other, and Ignored sections. + * + * Each section is rendered only when non-empty. Alert domains are shown with + * a warning note about copyright risk. + * + * @param array $domains Map of domain => total occurrence count. + * + * @return void + */ + private function render_domain_classification( array $domains ): void { + $alert_domains = array(); + $other_domains = array(); + $ignored_domains = array(); + + foreach ( $domains as $domain => $count ) { + $classification = HostnameFilter::classify( $domain ); + if ( 'alert' === $classification ) { + $alert_domains[ $domain ] = $count; + } elseif ( 'ignored' === $classification ) { + $ignored_domains[ $domain ] = $count; + } else { + $other_domains[ $domain ] = $count; + } + } + + if ( ! empty( $alert_domains ) ) { + echo '

' . esc_html__( 'Alert Domains', 'robotstxt-mediaaudit' ) . '

'; + echo '

' . esc_html__( 'These domains are associated with copyright-protected content and may indicate a copyright risk.', 'robotstxt-mediaaudit' ) . '

'; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + foreach ( $alert_domains as $domain => $count ) { + echo ''; + echo ''; + echo ''; + echo ''; + } + echo '
' . esc_html__( 'Domain', 'robotstxt-mediaaudit' ) . '' . esc_html__( 'Occurrences', 'robotstxt-mediaaudit' ) . '
' . esc_html( $domain ) . '' . esc_html( (string) $count ) . '
'; + } + + if ( ! empty( $other_domains ) ) { + echo '

' . esc_html__( 'Other Domains', 'robotstxt-mediaaudit' ) . '

'; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + foreach ( $other_domains as $domain => $count ) { + echo ''; + echo ''; + echo ''; + echo ''; + } + echo '
' . esc_html__( 'Domain', 'robotstxt-mediaaudit' ) . '' . esc_html__( 'Occurrences', 'robotstxt-mediaaudit' ) . '
' . esc_html( $domain ) . '' . esc_html( (string) $count ) . '
'; + } + + if ( ! empty( $ignored_domains ) ) { + echo '

' . esc_html__( 'Ignored Domains', 'robotstxt-mediaaudit' ) . '

'; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + foreach ( $ignored_domains as $domain => $count ) { + echo ''; + echo ''; + echo ''; + echo ''; + } + echo '
' . esc_html__( 'Domain', 'robotstxt-mediaaudit' ) . '' . esc_html__( 'Occurrences', 'robotstxt-mediaaudit' ) . '
' . esc_html( $domain ) . '' . esc_html( (string) $count ) . '
'; + } } /** diff --git a/includes/Admin/AuditPage.php b/includes/Admin/AuditPage.php index 36070df..c66d61b 100644 --- a/includes/Admin/AuditPage.php +++ b/includes/Admin/AuditPage.php @@ -9,6 +9,7 @@ namespace MediaRightsAudit\Admin; use MediaRightsAudit\Admin\AttachmentDetailPage; use MediaRightsAudit\External\ExternalScanner; +use MediaRightsAudit\External\HostnameFilter; use MediaRightsAudit\External\ResultsConsolidator; use MediaRightsAudit\Internal\AttachmentIndexer; use MediaRightsAudit\Internal\UsageScanner; @@ -65,9 +66,9 @@ class AuditPage { $action = $this->get_current_bulk_action(); if ( 'export_csv' === $action ) { - $this->handle_export_csv(); - } elseif ( 'export_external_csv' === $action ) { - $this->handle_export_external_csv(); + $this->handle_export_csv( false ); + } elseif ( 'export_csv_alerts' === $action ) { + $this->handle_export_csv( true ); } elseif ( 'run_external_scan' === $action ) { $this->handle_run_external_scan(); } elseif ( 'purge_external_data' === $action ) { @@ -346,22 +347,51 @@ class AuditPage { $html .= ''; if ( ! empty( $domains ) ) { - $html .= ''; - $html .= ''; - $html .= ''; - $html .= ''; - $html .= ''; + $alert_domains = array(); + $other_domains = array(); + foreach ( $domains as $domain => $count ) { if ( ! is_string( $domain ) ) { continue; } - $html .= sprintf( - '', - esc_html( $domain ), - esc_html( (string) ( is_numeric( $count ) ? (int) $count : 0 ) ) - ); + $classification = HostnameFilter::classify( $domain ); + if ( 'alert' === $classification ) { + $alert_domains[ $domain ] = is_numeric( $count ) ? (int) $count : 0; + } elseif ( 'other' === $classification ) { + $other_domains[ $domain ] = is_numeric( $count ) ? (int) $count : 0; + } + // Ignored domains are skipped entirely. + } + + $visible_domains = array_merge( $alert_domains, $other_domains ); + + if ( ! empty( $visible_domains ) ) { + $html .= '
' . esc_html__( 'Domain', 'robotstxt-mediaaudit' ) . '' . esc_html__( 'Occurrences', 'robotstxt-mediaaudit' ) . '
%s%s
'; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + + foreach ( $alert_domains as $domain => $count ) { + $html .= sprintf( + '', + esc_html( $domain ), + esc_html( (string) $count ), + esc_html__( 'Alert', 'robotstxt-mediaaudit' ) + ); + } + + foreach ( $other_domains as $domain => $count ) { + $html .= sprintf( + '', + esc_html( $domain ), + esc_html( (string) $count ) + ); + } + + $html .= '
' . esc_html__( 'Domain', 'robotstxt-mediaaudit' ) . '' . esc_html__( 'Occurrences', 'robotstxt-mediaaudit' ) . '' . esc_html__( 'Status', 'robotstxt-mediaaudit' ) . '
%s%s%s
%s%s
'; } - $html .= ''; } } @@ -452,6 +482,14 @@ class AuditPage { ); } + if ( $stats['total_alert'] > 0 ) { + $this->stat_box( + $stats['total_alert'], + __( 'Alert', 'robotstxt-mediaaudit' ), + '' + ); + } + echo ''; } @@ -475,21 +513,26 @@ class AuditPage { } /** - * Outputs CSV for selected attachment IDs and terminates the request. + * Outputs the unified CSV export and terminates the request. + * + * One row per attachment. When $alerts_only is true, only attachments that + * have at least one alert domain match are included. + * + * @param bool $alerts_only When true, export only attachments with alert domains. * * @return void */ - private function handle_export_csv(): void { + private function handle_export_csv( bool $alerts_only ): void { check_admin_referer( 'bulk-mra-attachments' ); if ( ! current_user_can( 'edit_posts' ) ) { wp_die( esc_html__( 'Insufficient permissions.', 'robotstxt-mediaaudit' ) ); } - $ids = $this->collect_attachment_ids(); - $rows = $this->build_csv_rows( $ids ); - - $filename = 'media-audit-' . gmdate( 'Y-m-d' ) . '.csv'; + $ids = $this->collect_attachment_ids(); + $rows = $this->build_unified_csv_rows( $ids, $alerts_only ); + $suffix = $alerts_only ? '-alerts' : ''; + $filename = 'media-audit' . $suffix . '-' . gmdate( 'Y-m-d' ) . '.csv'; header( 'Content-Type: text/csv; charset=utf-8' ); header( 'Content-Disposition: attachment; filename="' . $filename . '"' ); @@ -511,9 +554,17 @@ class AuditPage { __( 'File URL', 'robotstxt-mediaaudit' ), __( 'MIME Type', 'robotstxt-mediaaudit' ), __( 'File Size (bytes)', 'robotstxt-mediaaudit' ), + __( 'Internal Scan Date', 'robotstxt-mediaaudit' ), __( 'External Status', 'robotstxt-mediaaudit' ), + __( 'Has Alert', 'robotstxt-mediaaudit' ), __( 'Usage Count', 'robotstxt-mediaaudit' ), - __( 'Used In (post titles)', 'robotstxt-mediaaudit' ), + __( 'Used In', 'robotstxt-mediaaudit' ), + __( 'Google Vision — Matches', 'robotstxt-mediaaudit' ), + __( 'TinEye — Matches', 'robotstxt-mediaaudit' ), + __( 'PicDefense — Matches', 'robotstxt-mediaaudit' ), + __( 'Alert Domains', 'robotstxt-mediaaudit' ), + __( 'Other Domains', 'robotstxt-mediaaudit' ), + __( 'Ignored Domains', 'robotstxt-mediaaudit' ), ) ); @@ -526,136 +577,188 @@ class AuditPage { } /** - * Outputs an external-results CSV for selected attachment IDs and terminates. + * Builds unified CSV rows (one per attachment) with internal and external data. * - * One row per attachment × provider pair. Attachments with no results still - * appear with empty provider columns. + * Columns: ID, filename, URL, MIME type, file size, internal scan date, + * external status, has alert, usage count, used-in titles, per-provider + * match counts, and classified domain lists (alert / other / ignored). * - * @return void - */ - private function handle_export_external_csv(): void { - check_admin_referer( 'bulk-mra-attachments' ); - - if ( ! current_user_can( 'edit_posts' ) ) { - wp_die( esc_html__( 'Insufficient permissions.', 'robotstxt-mediaaudit' ) ); - } - - $ids = $this->collect_attachment_ids(); - $rows = $this->build_external_csv_rows( $ids ); - - $filename = 'media-audit-external-' . gmdate( 'Y-m-d' ) . '.csv'; - - header( 'Content-Type: text/csv; charset=utf-8' ); - header( 'Content-Disposition: attachment; filename="' . $filename . '"' ); - header( 'Pragma: no-cache' ); - - $out = fopen( 'php://output', 'w' ); - if ( false === $out ) { - wp_die( esc_html__( 'Could not open output stream.', 'robotstxt-mediaaudit' ) ); - } - - fwrite( $out, "\xEF\xBB\xBF" ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fwrite - - fputcsv( - $out, - array( - __( 'Attachment ID', 'robotstxt-mediaaudit' ), - __( 'Filename', 'robotstxt-mediaaudit' ), - __( 'File URL', 'robotstxt-mediaaudit' ), - __( 'External Status', 'robotstxt-mediaaudit' ), - __( 'Last Scanned', 'robotstxt-mediaaudit' ), - __( 'Provider', 'robotstxt-mediaaudit' ), - __( 'Match Count', 'robotstxt-mediaaudit' ), - __( 'Top Domains', 'robotstxt-mediaaudit' ), - ) - ); - - foreach ( $rows as $row ) { - fputcsv( $out, $row ); - } - - fclose( $out ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fclose - exit; - } - - /** - * Builds external-results CSV rows for the given attachment IDs. + * When $ids is empty all indexed attachments are exported. When $alerts_only + * is true, only attachments with at least one alert domain match are included. * - * Each row represents one attachment × provider combination. Attachments with - * no provider results are included with empty provider columns. If $ids is - * empty, all indexed attachments are exported. - * - * @param array $ids Attachment IDs to export (empty = all). + * @param array $ids Attachment IDs to export (empty = all). + * @param bool $alerts_only Include only attachments with alert domains. * * @return array> */ - private function build_external_csv_rows( array $ids ): array { + private function build_unified_csv_rows( array $ids, bool $alerts_only ): array { global $wpdb; // phpcs:disable WordPress.DB.DirectDatabaseQuery,WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare if ( empty( $ids ) ) { - $rows = $wpdb->get_results( - "SELECT i.attachment_id, i.file_name, i.file_url, i.external_status, - i.external_scanned_at, er.provider, er.match_count, er.top_domains - FROM {$wpdb->prefix}mra_media_index i - LEFT JOIN {$wpdb->prefix}mra_external_results er ON er.attachment_id = i.attachment_id - ORDER BY i.attachment_id ASC, er.provider ASC", + $index_rows = $wpdb->get_results( + "SELECT * FROM {$wpdb->prefix}mra_media_index ORDER BY attachment_id ASC", ARRAY_A ); } else { $placeholders = implode( ',', array_fill( 0, count( $ids ), '%d' ) ); - $rows = $wpdb->get_results( + $index_rows = $wpdb->get_results( $wpdb->prepare( - "SELECT i.attachment_id, i.file_name, i.file_url, i.external_status, - i.external_scanned_at, er.provider, er.match_count, er.top_domains - FROM {$wpdb->prefix}mra_media_index i - LEFT JOIN {$wpdb->prefix}mra_external_results er ON er.attachment_id = i.attachment_id - WHERE i.attachment_id IN ({$placeholders}) - ORDER BY i.attachment_id ASC, er.provider ASC", + "SELECT * FROM {$wpdb->prefix}mra_media_index WHERE attachment_id IN ({$placeholders}) ORDER BY attachment_id ASC", ...$ids ), ARRAY_A ); } - // phpcs:enable WordPress.DB.DirectDatabaseQuery,WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare - - if ( ! $rows ) { + if ( ! is_array( $index_rows ) || empty( $index_rows ) ) { return array(); } - $output = array(); + $page_ids = array_map( + static function ( $v ): int { + return (int) $v; + }, + array_column( $index_rows, 'attachment_id' ) + ); - foreach ( $rows as $r ) { - $aid_raw = $r['attachment_id'] ?? ''; - $scanned_raw = $r['external_scanned_at'] ?? ''; - $domains_raw = $r['top_domains'] ?? ''; - $mc_raw = $r['match_count'] ?? ''; + // Fetch usages. + $usages = MediaListTable::fetch_usages( $page_ids ); + $usage_titles = array(); + foreach ( $usages as $u ) { + $aid_val = $u['attachment_id'] ?? null; + $aid = is_numeric( $aid_val ) ? (int) $aid_val : 0; + $t_raw = $u['post_title'] ?? ''; + $pid_raw = $u['post_id'] ?? null; + $title = is_string( $t_raw ) && '' !== $t_raw + ? $t_raw + : sprintf( '#%d', is_numeric( $pid_raw ) ? (int) $pid_raw : 0 ); + $usage_titles[ $aid ][] = $title; + } - $domains_decoded = is_string( $domains_raw ) && '' !== $domains_raw - ? json_decode( $domains_raw, true ) - : array(); - $domain_parts = array(); - if ( is_array( $domains_decoded ) ) { - foreach ( $domains_decoded as $d ) { - if ( is_string( $d ) ) { - $domain_parts[] = $d; + // Fetch external results (all providers) for these attachments. + $ext_placeholders = implode( ',', array_fill( 0, count( $page_ids ), '%d' ) ); + + $ext_rows = $wpdb->get_results( + $wpdb->prepare( + "SELECT attachment_id, provider, match_count, top_domains + FROM {$wpdb->prefix}mra_external_results + WHERE attachment_id IN ({$ext_placeholders})", + ...$page_ids + ), + ARRAY_A + ); + + // phpcs:enable WordPress.DB.DirectDatabaseQuery,WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare + + /** + * Per-attachment, per-provider data: match_count + merged domain→count. + * + * @var array}>> $ext_by_id + */ + $ext_by_id = array(); + + if ( is_array( $ext_rows ) ) { + foreach ( $ext_rows as $er ) { + if ( ! is_array( $er ) ) { + continue; + } + $aid_val = $er['attachment_id'] ?? null; + $eaid = is_numeric( $aid_val ) ? (int) $aid_val : 0; + $prov_val = $er['provider'] ?? null; + $provider = is_string( $prov_val ) ? $prov_val : ''; + $mc_val = $er['match_count'] ?? null; + $mc = is_numeric( $mc_val ) ? (int) $mc_val : 0; + $td_val = $er['top_domains'] ?? null; + $td = is_string( $td_val ) && '' !== $td_val ? json_decode( $td_val, true ) : null; + + if ( $eaid <= 0 || '' === $provider ) { + continue; + } + if ( ! isset( $ext_by_id[ $eaid ][ $provider ] ) ) { + $ext_by_id[ $eaid ][ $provider ] = array( + 'match_count' => 0, + 'domains' => array(), + ); + } + $ext_by_id[ $eaid ][ $provider ]['match_count'] += $mc; + + if ( is_array( $td ) ) { + foreach ( $td as $domain => $count ) { + if ( ! is_string( $domain ) ) { + continue; + } + $existing = $ext_by_id[ $eaid ][ $provider ]['domains'][ $domain ] ?? 0; + $ext_by_id[ $eaid ][ $provider ]['domains'][ $domain ] = $existing + ( is_numeric( $count ) ? (int) $count : 0 ); } } } - $domains_str = implode( '; ', $domain_parts ); + } - $output[] = array( - is_numeric( $aid_raw ) ? (string) (int) $aid_raw : '', + $known_providers = array( 'google_vision', 'tineye', 'picdefense' ); + $output = array(); + + foreach ( $index_rows as $r ) { + if ( ! is_array( $r ) ) { + continue; + } + $aid_val = $r['attachment_id'] ?? null; + $aid = is_numeric( $aid_val ) ? (int) $aid_val : 0; + + // Aggregate domains across all providers for this attachment. + $all_domains = array(); + foreach ( $known_providers as $p ) { + $p_domains = $ext_by_id[ $aid ][ $p ]['domains'] ?? array(); + foreach ( $p_domains as $domain => $count ) { + $existing = $all_domains[ $domain ] ?? 0; + $all_domains[ $domain ] = $existing + $count; + } + } + + // Classify domains. + $alert_list = array(); + $other_list = array(); + $ignored_list = array(); + foreach ( array_keys( $all_domains ) as $domain ) { + $class = HostnameFilter::classify( $domain ); + if ( 'alert' === $class ) { + $alert_list[] = $domain; + } elseif ( 'ignored' === $class ) { + $ignored_list[] = $domain; + } else { + $other_list[] = $domain; + } + } + + $has_alert = ! empty( $alert_list ); + + if ( $alerts_only && ! $has_alert ) { + continue; + } + + $row_data = array( + (string) $aid, is_string( $r['file_name'] ?? null ) ? (string) $r['file_name'] : '', is_string( $r['file_url'] ?? null ) ? (string) $r['file_url'] : '', + is_string( $r['mime_type'] ?? null ) ? (string) $r['mime_type'] : '', + is_numeric( $r['file_size'] ?? null ) ? (string) (int) $r['file_size'] : '', + is_string( $r['internal_scanned_at'] ?? null ) ? (string) $r['internal_scanned_at'] : '', is_string( $r['external_status'] ?? null ) ? (string) $r['external_status'] : '', - is_string( $scanned_raw ) ? $scanned_raw : '', - is_string( $r['provider'] ?? null ) ? (string) $r['provider'] : '', - is_numeric( $mc_raw ) ? (string) (int) $mc_raw : '', - $domains_str, + $has_alert ? __( 'Yes', 'robotstxt-mediaaudit' ) : __( 'No', 'robotstxt-mediaaudit' ), + (string) count( $usage_titles[ $aid ] ?? array() ), + implode( '; ', $usage_titles[ $aid ] ?? array() ), ); + + foreach ( $known_providers as $p ) { + $row_data[] = isset( $ext_by_id[ $aid ][ $p ] ) ? (string) $ext_by_id[ $aid ][ $p ]['match_count'] : ''; + } + + $row_data[] = implode( '; ', $alert_list ); + $row_data[] = implode( '; ', $other_list ); + $row_data[] = implode( '; ', $ignored_list ); + + $output[] = $row_data; } return $output; @@ -745,87 +848,6 @@ class AuditPage { return $ids; } - /** - * Builds CSV data rows for the given attachment IDs. - * - * If $ids is empty, exports all indexed attachments. - * - * @param array $ids Attachment IDs to export (empty = all). - * - * @return array> - */ - private function build_csv_rows( array $ids ): array { - global $wpdb; - - // phpcs:disable WordPress.DB.DirectDatabaseQuery,WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare - - if ( empty( $ids ) ) { - $index_rows = $wpdb->get_results( - "SELECT * FROM {$wpdb->prefix}mra_media_index ORDER BY attachment_id ASC", - ARRAY_A - ); - } else { - $placeholders = implode( ',', array_fill( 0, count( $ids ), '%d' ) ); - $index_rows = $wpdb->get_results( - $wpdb->prepare( - "SELECT * FROM {$wpdb->prefix}mra_media_index WHERE attachment_id IN ({$placeholders}) ORDER BY attachment_id ASC", - ...$ids - ), - ARRAY_A - ); - } - - // phpcs:enable WordPress.DB.DirectDatabaseQuery,WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare - - if ( ! $index_rows ) { - return array(); - } - - $page_ids = array_map( - static function ( $v ) { - return (int) $v; - }, - array_column( $index_rows, 'attachment_id' ) - ); - $usages = MediaListTable::fetch_usages( $page_ids ); - - $usage_titles = array(); - foreach ( $usages as $u ) { - $aid_val = $u['attachment_id'] ?? null; - $aid = is_numeric( $aid_val ) ? (int) $aid_val : 0; - $t_raw = $u['post_title'] ?? ''; - $pid_raw = $u['post_id'] ?? null; - $title = is_string( $t_raw ) && '' !== $t_raw ? $t_raw : sprintf( '#%d', is_numeric( $pid_raw ) ? (int) $pid_raw : 0 ); - - $usage_titles[ $aid ][] = $title; - } - - $output = array(); - foreach ( $index_rows as $r ) { - $aid = (int) ( $r['attachment_id'] ?? 0 ); - $titles = isset( $usage_titles[ $aid ] ) ? implode( '; ', $usage_titles[ $aid ] ) : ''; - - $fn_raw = $r['file_name'] ?? ''; - $url_raw = $r['file_url'] ?? ''; - $mt_raw = $r['mime_type'] ?? ''; - $fs_raw = $r['file_size'] ?? ''; - $es_raw = $r['external_status'] ?? ''; - - $output[] = array( - (string) $aid, - is_string( $fn_raw ) ? $fn_raw : '', - is_string( $url_raw ) ? $url_raw : '', - is_string( $mt_raw ) ? $mt_raw : '', - is_string( $fs_raw ) ? $fs_raw : '', - is_string( $es_raw ) ? $es_raw : '', - (string) count( $usage_titles[ $aid ] ?? array() ), - $titles, - ); - } - - return $output; - } - /** * Determines the active bulk action from the form submission. * @@ -844,7 +866,7 @@ class AuditPage { /** * Queries and returns dashboard statistics. * - * @return array{total_indexed: int, total_scanned: int, total_used: int, total_unused: int, total_matches: int, pending_index: int} + * @return array{total_indexed: int, total_scanned: int, total_used: int, total_unused: int, total_matches: int, total_alert: int, pending_index: int} */ private static function get_dashboard_stats(): array { global $wpdb; @@ -856,13 +878,77 @@ class AuditPage { $total_matches = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->prefix}mra_media_index WHERE external_status = 'matches'" ); // phpcs:enable WordPress.DB.DirectDatabaseQuery + $total_alert = self::get_alert_attachment_count(); + return array( 'total_indexed' => $total_indexed, 'total_scanned' => $total_scanned, 'total_used' => $total_used, 'total_unused' => max( 0, $total_indexed - $total_used ), 'total_matches' => $total_matches, + 'total_alert' => $total_alert, 'pending_index' => AttachmentIndexer::get_pending_count(), ); } + + /** + * Counts the number of unique attachments that have at least one alert domain + * in their external scan results. + * + * @return int + */ + private static function get_alert_attachment_count(): int { + global $wpdb; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $rows = $wpdb->get_results( + "SELECT attachment_id, top_domains FROM {$wpdb->prefix}mra_external_results", + ARRAY_A + ); + + if ( ! is_array( $rows ) ) { + return 0; + } + + // Group top_domains by attachment_id and check for alert domains. + $merged = array(); + + foreach ( $rows as $row ) { + if ( ! is_array( $row ) ) { + continue; + } + $aid_val = $row['attachment_id'] ?? null; + $aid = is_numeric( $aid_val ) ? (int) $aid_val : 0; + if ( $aid <= 0 ) { + continue; + } + $td_val = $row['top_domains'] ?? null; + $td_raw = is_string( $td_val ) ? json_decode( $td_val, true ) : null; + $domains = is_array( $td_raw ) ? $td_raw : array(); + + if ( ! isset( $merged[ $aid ] ) ) { + $merged[ $aid ] = array(); + } + foreach ( $domains as $domain => $count ) { + if ( ! is_string( $domain ) ) { + continue; + } + $c = is_numeric( $count ) ? (int) $count : 0; + if ( isset( $merged[ $aid ][ $domain ] ) ) { + $merged[ $aid ][ $domain ] += $c; + } else { + $merged[ $aid ][ $domain ] = $c; + } + } + } + + $alert_count = 0; + foreach ( $merged as $domains ) { + if ( HostnameFilter::has_alert_domains( $domains ) ) { + ++$alert_count; + } + } + + return $alert_count; + } } diff --git a/includes/Admin/MediaListTable.php b/includes/Admin/MediaListTable.php index ac4261a..cfcd18e 100644 --- a/includes/Admin/MediaListTable.php +++ b/includes/Admin/MediaListTable.php @@ -8,6 +8,7 @@ namespace MediaRightsAudit\Admin; use MediaRightsAudit\Admin\AttachmentDetailPage; +use MediaRightsAudit\External\HostnameFilter; if ( ! class_exists( 'WP_List_Table' ) ) { require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php'; @@ -83,7 +84,7 @@ class MediaListTable extends \WP_List_Table { 'run_external_scan' => __( 'Run External Scan', 'robotstxt-mediaaudit' ), 'purge_external_data' => __( 'Purge External Data', 'robotstxt-mediaaudit' ), 'export_csv' => __( 'Export CSV', 'robotstxt-mediaaudit' ), - 'export_external_csv' => __( 'Export External Results CSV', 'robotstxt-mediaaudit' ), + 'export_csv_alerts' => __( 'Export CSV (Alerts only)', 'robotstxt-mediaaudit' ), ); } @@ -279,6 +280,49 @@ class MediaListTable extends \WP_List_Table { $es_val = $item['external_status']; $status = is_string( $es_val ) ? $es_val : ''; + // Check for alert domains first. + $top_domains_raw = isset( $item['top_domains_data'] ) && is_array( $item['top_domains_data'] ) + ? $item['top_domains_data'] + : array(); + $top_domains_data = array(); + foreach ( $top_domains_raw as $td_key => $td_val ) { + if ( is_string( $td_key ) && is_int( $td_val ) ) { + $top_domains_data[ $td_key ] = $td_val; + } + } + $has_alert = ! empty( $top_domains_data ) && HostnameFilter::has_alert_domains( $top_domains_data ); + + if ( $has_alert ) { + $out = sprintf( + '%s', + esc_html__( 'Alert', 'robotstxt-mediaaudit' ) + ); + + // Sum counts for non-ignored domains. + $filtered_count = 0; + foreach ( $top_domains_data as $domain => $count ) { + if ( ! HostnameFilter::is_ignored( $domain ) ) { + $filtered_count += $count; + } + } + if ( $filtered_count > 0 ) { + $out .= sprintf( + ' %s', + esc_html( number_format_i18n( $filtered_count ) ) + ); + } + + $aid_val = $item['attachment_id']; + $aid = is_numeric( $aid_val ) ? (int) $aid_val : 0; + $out .= sprintf( + ' %s', + $aid, + esc_html__( 'View Results', 'robotstxt-mediaaudit' ) + ); + + return $out; + } + $labels = array( 'pending' => __( 'Pending', 'robotstxt-mediaaudit' ), 'queued' => __( 'Queued', 'robotstxt-mediaaudit' ), @@ -385,6 +429,11 @@ class MediaListTable extends \WP_List_Table { // External status filter. echo ' +

+ +

+ + +

+ +

+ is_google_vision_configured(); - $te_ok = $this->is_tineye_configured(); - $pd_ok = $this->is_picdefense_configured(); + $tab = $this->get_active_tab(); + $tabs = $this->get_tabs(); + $page_url = admin_url( 'admin.php?page=robotstxt-mediaaudit-settings' ); ?>

-
- -
    -
  • - - - - - - -
  • -
  • - - - - - - -
  • -
  • - - - - - - PicDefense -
  • -
-
+
- + + + +
audit_page, 'render' ), 'dashicons-camera', - 60 + 11 ); $this->audit_page->set_hook_suffix( $suffix ); diff --git a/includes/External/HostnameFilter.php b/includes/External/HostnameFilter.php new file mode 100644 index 0000000..e6dbcbb --- /dev/null +++ b/includes/External/HostnameFilter.php @@ -0,0 +1,186 @@ +, exclude: list}|null + */ + private static ?array $lists = null; + + /** + * Loads and returns the alert / ignored hostname lists from the plugin option. + * + * Result is cached in self::$lists for the duration of the request. + * + * @return array{include: list, exclude: list} + */ + private static function get_lists(): array { + if ( null !== self::$lists ) { + return self::$lists; + } + + $raw = get_option( 'robotstxt_mediaaudit_settings' ); + $opts = is_array( $raw ) ? $raw : array(); + + $raw_include = $opts['filter_include'] ?? array(); + $raw_exclude = $opts['filter_exclude'] ?? array(); + + $include = array(); + if ( is_array( $raw_include ) ) { + foreach ( $raw_include as $item ) { + if ( is_string( $item ) && '' !== $item ) { + $include[] = $item; + } + } + } + + $exclude = array(); + if ( is_array( $raw_exclude ) ) { + foreach ( $raw_exclude as $item ) { + if ( is_string( $item ) && '' !== $item ) { + $exclude[] = $item; + } + } + } + + self::$lists = array( + 'include' => $include, + 'exclude' => $exclude, + ); + + return self::$lists; + } + + /** + * Returns true when $domain matches a filter list entry. + * + * The $entry may carry a `*.` wildcard prefix; its base is derived by + * stripping that prefix. A match occurs when: + * - $domain equals the base exactly, OR + * - $domain ends with a dot followed by the base (subdomain match). + * + * @param string $domain Lowercase hostname to test. + * @param string $entry A list entry, possibly prefixed with `*.`. + * + * @return bool + */ + private static function matches( string $domain, string $entry ): bool { + $base = str_starts_with( $entry, '*.' ) ? substr( $entry, 2 ) : $entry; + + if ( $domain === $base ) { + return true; + } + + if ( str_ends_with( $domain, '.' . $base ) ) { + return true; + } + + return false; + } + + /** + * Returns true when the given domain matches any entry in the alert list. + * + * @param string $domain Hostname to classify (will be lower-cased internally). + * + * @return bool + */ + public static function is_alert( string $domain ): bool { + $domain = strtolower( $domain ); + $lists = self::get_lists(); + + foreach ( $lists['include'] as $entry ) { + if ( self::matches( $domain, $entry ) ) { + return true; + } + } + + return false; + } + + /** + * Returns true when the given domain matches any entry in the ignored list. + * + * @param string $domain Hostname to classify (will be lower-cased internally). + * + * @return bool + */ + public static function is_ignored( string $domain ): bool { + $domain = strtolower( $domain ); + $lists = self::get_lists(); + + foreach ( $lists['exclude'] as $entry ) { + if ( self::matches( $domain, $entry ) ) { + return true; + } + } + + return false; + } + + /** + * Classifies a domain and returns 'alert', 'ignored', or 'other'. + * + * Alert takes precedence: a domain that is in both lists is classified as + * 'alert'. + * + * @param string $domain Hostname to classify. + * + * @return string 'alert'|'ignored'|'other' + */ + public static function classify( string $domain ): string { + if ( self::is_alert( $domain ) ) { + return 'alert'; + } + + if ( self::is_ignored( $domain ) ) { + return 'ignored'; + } + + return 'other'; + } + + /** + * Returns true when at least one key in $domains is classified as alert. + * + * @param array $domains Map of domain => occurrence count. + * + * @return bool + */ + public static function has_alert_domains( array $domains ): bool { + foreach ( array_keys( $domains ) as $domain ) { + if ( self::is_alert( $domain ) ) { + return true; + } + } + + return false; + } + + /** + * Resets the internal cache so the option is re-read on the next call. + * + * Useful in tests or after the settings option has been updated. + * + * @return void + */ + public static function reset_cache(): void { + self::$lists = null; + } +} diff --git a/languages/robotstxt-mediaaudit-ca.mo b/languages/robotstxt-mediaaudit-ca.mo index 40cc51425b4186e9cbdd151ac6c67682cafd57e5..c6eaf4af48403c279f4b24bc405d671736a8d0cd 100644 GIT binary patch delta 7936 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 delta 5213 zcmZA42~<^e0>|xOs1pdnB_K;=8`j=rtzFPN2h7NzjrSk&)nmW&;S14yZ67|3qCmN zsC~`hy%rU+)o@%VaU{CFF&PeHA{wdIm`hQ{w8F2jHQvYJ81k!sGkhNztEoq&m)S9~6g0xFs2&eQ zP3c%n#~H{q=6Tczs!>y1i~8OY`JMpNcOX3HsWpZ0H z|D7llQZXIZVq3g}tcD41V~wc2Z6?m6J_psYL#P=!iJJ1Os1DvoH5e9eb)Ye7ZzP}^ zPO}~CrJyyMhMGz@Y9tGBGp%T)QGoZdpwSe!Q4VEMMwh6 zfiXA|vrz4NS5r`rHlaGO7jyAlR09uCdnA-;(FL)#NvNq#M{TBFw)v=~nvI$vkL^m- z%)EeF;wofDyr!ChcJ=$H&3D}Tz??%ha23<=7U~8u?JQI92JpZSO% z>d;+mfP*?&9UqPLIG=`UcouHKQd9?mQmu~FM}6KXmGxJl6&3185^Ak8u_4Yxjl^SH ziMr7;)TUdB5xCvEQ`*(~EgFy7OMOr?G7|gZIMn-M3u>wNc_~Cts6q9- z7MtK@jK{yDHcdpj)uF+t8%(gzOHhxm7j^x1)aE>Z8c;2|@H{%PM>jfwlTht?4^RlE zP=ibG7>>uD8P?wf8&D&dmubyRIch4`Ap6v8M0NNGUcyrtg|D)4G$Vdghd;%kcmuV! zQdx&u+Bf+WbYb%z)<}Lp-kv6`r!|$ySjc%UYA@_Y?SU#(L)EAb9!GVo);>RrtctmS z8fggAn1D@DGnRpEY2V~gP=g-S3t|K6g5CD{LF~u*3Dk%ky{x54K{YrGwU%RW2+lyw zNEK=ZYETWHLw)ZKHpYKrq@Mr!y{(bOpuP}?dQLl`zL<&H3%RHUXQ4V;jET4cgYXRu zG>lsN8cfBL7>oZzT_4%U+RQQNO{OA)0?T5ipc}WKZu}560w-HnH|&9tI1smEKDNd? zs1AlQO}six5^BWxsQ1HD*c8i99bb*Q?!|u0zY0gFh{g-35!^*J_yCV$z5doFI)=LO zMVy4+qplk=z}i%W$a0$%wl$~@{fHV!T(dn&#}jqoQNhT#LP zjuc=F=QHf{1*nEsqDHn2HN{ov#FMD0{ub5nKWsyCtY6o$sL!*!6!e9Ds9jxv+5?kO zo6wD#i3KkdxwKnMuY{z-{ApR`FE~pVV8f?8gF6^rr|CgYVDmfsE!9SZR&6ow!zk@>-u0T9Et@v z6L}|jO$`O@fqS+MhFhB?8S7Es8|z~>mf$ed64hV>JcVU=9vfnAp7s6FsOu-9IyTil zFSb7~!z4ZbODJd!cjHX-;}vW^!g_q}<0#G(MjFE;nNrjyJBp?F1F9oMd`U|)7uE18 z)C{h}7jTDNpFZ09eh+Ly`zD)0B#yP6fqgjlpgOi6wKtC0p1@GfPoXy5S=1i-4qKoj z->Pqgx^EU{VJ>PWmm;fYR-v~Gh0_!o;X~VoW2_};iMnBDbf6CH6&>Tq7eqJKp*7X9 z*uw0yA|vw8UEfT)XlBK1QzTTp#u$?-1?cbfQhDN2(jyOV$t_6UiRZTPGaaWPb>h`0E)z zAjim5@-fk&W&I1`=?rYzlc-Ip;}B8%riye`!9I@SSfa;C$0m!w|N9qF<`-As39+lq za}+L-!(<8JWf%Ab_Gj!&bR<}qWf)A>lgVmdkIsu^1&Jp$r0&S0Fqq7!tFS$Yv&gnb z>Vqi%ik!FWK7Zu1%akXOKR!}7opPi#e(Sj%O~u(qzED^EErli|r>+9qkj*5N)RN<* zgw!2#C|syJ!F}XIvXXp4enTQip#8V76Nx6%>03!sX;kl1WCAr${B)sqv4e@G{Y{jtmNv_|qFl+2tZzk!_b#a0}^U zpD)0LT zqX#XjaFuzAik)L!<(0)1<<6XO6a3+=D;>VIZDt1z%k>Y4pXS(e$Qk4dO}y*-G4U1O z-u7dBlak_n&n1=k!;?dU{nZ_}2Kx@B75L|LIp=8U%+4R?%yTU^<4a14%lTRA%q^K$ zp4e*{OLo7IDAWoUGyy6bnL%!ktK85\n" "Language-Team: Catalan \n" @@ -45,349 +45,582 @@ msgstr "" msgid "https://www.robotstxt.es/" msgstr "" -#: includes/Admin/AuditPage.php:114 -msgid "Loading…" -msgstr "S'està carregant…" - -#: includes/Admin/AuditPage.php:115 -msgid "Error loading details." -msgstr "S'ha produït un error en carregar els detalls." - -#: includes/Admin/AuditPage.php:116 includes/Admin/AuditPage.php:192 -msgid "This image is not used in any post." -msgstr "Aquesta imatge no s'utilitza en cap entrada." - -#: includes/Admin/AuditPage.php:117 includes/Admin/AuditPage.php:154 -msgid "Usage Details" -msgstr "Detalls d'ús" - -#: includes/Admin/AuditPage.php:133 includes/Admin/Settings.php:325 -#: includes/Admin/ToolsPage.php:245 +#: includes/Admin/AttachmentDetailPage.php:40 includes/Admin/AuditPage.php:135 +#: includes/Admin/Settings.php:898 includes/Admin/ToolsPage.php:253 msgid "You do not have permission to access this page." msgstr "No teniu permís per accedir a aquesta pàgina." -#: includes/Admin/AuditPage.php:140 includes/Core/Plugin.php:99 -#: includes/Core/Plugin.php:100 includes/Core/Plugin.php:113 -#: includes/Core/Plugin.php:114 includes/Privacy/DataEraser.php:33 -#: includes/Privacy/DataExporter.php:45 -msgid "Media Audit" -msgstr "Auditoria de mitjans" - -#: includes/Admin/AuditPage.php:146 -msgid "Search" -msgstr "Cerca" - -#: includes/Admin/AuditPage.php:155 -msgid "Close" -msgstr "Tanca" - -#: includes/Admin/AuditPage.php:173 includes/Admin/AuditPage.php:461 -#: includes/Admin/AuditPage.php:515 includes/Admin/AuditPage.php:648 -#: includes/Admin/AuditPage.php:680 includes/Admin/ToolsPage.php:105 -#: includes/Admin/ToolsPage.php:161 -msgid "Insufficient permissions." -msgstr "Permisos insuficients." - -#: includes/Admin/AuditPage.php:178 +#: includes/Admin/AttachmentDetailPage.php:51 +#: includes/Admin/AttachmentDetailPage.php:56 includes/Admin/AuditPage.php:180 msgid "Invalid attachment ID." msgstr "Identificador de fitxer adjunt no vàlid." -#: includes/Admin/AuditPage.php:186 -msgid "Featured Image" -msgstr "Imatge destacada" +#: includes/Admin/AttachmentDetailPage.php:64 +msgid "← Media Audit" +msgstr "← Auditoria de mitjans" -#: includes/Admin/AuditPage.php:187 -msgid "Post Content" -msgstr "Contingut de l'entrada" +#: includes/Admin/AttachmentDetailPage.php:69 +msgid "File Information" +msgstr "Informació del fitxer" -#: includes/Admin/AuditPage.php:188 -msgid "Custom Field" -msgstr "Camp personalitzat" +#: includes/Admin/AttachmentDetailPage.php:81 +#: includes/Admin/MediaListTable.php:56 +msgid "ID" +msgstr "ID" -#: includes/Admin/AuditPage.php:196 -msgid "Post" -msgstr "Entrada" +#: includes/Admin/AttachmentDetailPage.php:87 includes/Admin/AuditPage.php:553 +#: includes/Admin/MediaListTable.php:55 includes/Privacy/DataExporter.php:261 +msgid "Filename" +msgstr "Nom de fitxer" -#: includes/Admin/AuditPage.php:197 -msgid "Type" -msgstr "Tipus" +#: includes/Admin/AttachmentDetailPage.php:94 includes/Admin/AuditPage.php:554 +#: includes/Privacy/DataExporter.php:265 +msgid "File URL" +msgstr "URL del fitxer" -#: includes/Admin/AuditPage.php:198 -msgid "Context" -msgstr "Context" +#: includes/Admin/AttachmentDetailPage.php:102 includes/Admin/AuditPage.php:555 +msgid "MIME Type" +msgstr "Tipus MIME" -#: includes/Admin/AuditPage.php:199 -msgid "Status" -msgstr "Estat" +#: includes/Admin/AttachmentDetailPage.php:112 +msgid "File size" +msgstr "Mida del fitxer" -#: includes/Admin/AuditPage.php:242 +#: includes/Admin/AttachmentDetailPage.php:118 +msgid "Internal scan date" +msgstr "Data de l'exploració interna" + +#: includes/Admin/AttachmentDetailPage.php:124 includes/Admin/AuditPage.php:558 +#: includes/Admin/MediaListTable.php:59 +msgid "External Status" +msgstr "Estat extern" + +#: includes/Admin/AttachmentDetailPage.php:139 includes/Admin/AuditPage.php:244 msgid "Internal Usage" msgstr "Ús intern" -#: includes/Admin/AuditPage.php:290 +#: includes/Admin/AttachmentDetailPage.php:144 includes/Admin/AuditPage.php:188 +msgid "Featured Image" +msgstr "Imatge destacada" + +#: includes/Admin/AttachmentDetailPage.php:145 includes/Admin/AuditPage.php:189 +msgid "Post Content" +msgstr "Contingut de l'entrada" + +#: includes/Admin/AttachmentDetailPage.php:146 includes/Admin/AuditPage.php:190 +msgid "Custom Field" +msgstr "Camp personalitzat" + +#: includes/Admin/AttachmentDetailPage.php:150 +msgid "Not used in any post." +msgstr "Aquest fitxer no s'utilitza en cap entrada." + +#: includes/Admin/AttachmentDetailPage.php:154 includes/Admin/AuditPage.php:198 +msgid "Post" +msgstr "Entrada" + +#: includes/Admin/AttachmentDetailPage.php:155 includes/Admin/AuditPage.php:199 +msgid "Type" +msgstr "Tipus" + +#: includes/Admin/AttachmentDetailPage.php:156 includes/Admin/AuditPage.php:200 +msgid "Context" +msgstr "Context" + +#: includes/Admin/AttachmentDetailPage.php:157 includes/Admin/AuditPage.php:201 +#: includes/Admin/AuditPage.php:373 +msgid "Status" +msgstr "Estat" + +#: includes/Admin/AttachmentDetailPage.php:198 includes/Admin/AuditPage.php:293 msgid "External Scan Results" msgstr "Resultats de l'exploració externa" +#: includes/Admin/AttachmentDetailPage.php:260 +msgid "No external scan data available." +msgstr "No hi ha dades d'exploració externa disponibles." + #. translators: %d: number of external matches -#: includes/Admin/AuditPage.php:314 +#: includes/Admin/AttachmentDetailPage.php:313 includes/Admin/AuditPage.php:323 #, php-format msgid "%d match" msgid_plural "%d matches" msgstr[0] "%d coincidència" msgstr[1] "%d coincidències" -#: includes/Admin/AuditPage.php:319 -msgid "No matches" -msgstr "Sense coincidències" +#. translators: %s: scan date string +#: includes/Admin/AttachmentDetailPage.php:321 +#, php-format +msgid "scanned %s" +msgstr "explorat el %s" -#: includes/Admin/AuditPage.php:330 +#: includes/Admin/AttachmentDetailPage.php:372 includes/Admin/AuditPage.php:565 +msgid "Alert Domains" +msgstr "Dominis d'alerta" + +#: includes/Admin/AttachmentDetailPage.php:373 +msgid "" +"These domains are associated with copyright-protected content and may " +"indicate a copyright risk." +msgstr "" +"Aquests dominis estan associats a contingut protegit per drets d'autor i " +"poden indicar un risc de copyright." + +#: includes/Admin/AttachmentDetailPage.php:376 +#: includes/Admin/AttachmentDetailPage.php:392 +#: includes/Admin/AttachmentDetailPage.php:408 includes/Admin/AuditPage.php:371 msgid "Domain" msgstr "Domini" -#: includes/Admin/AuditPage.php:331 +#: includes/Admin/AttachmentDetailPage.php:377 +#: includes/Admin/AttachmentDetailPage.php:393 +#: includes/Admin/AttachmentDetailPage.php:409 includes/Admin/AuditPage.php:372 msgid "Occurrences" msgstr "Aparicions" -#: includes/Admin/AuditPage.php:352 +#: includes/Admin/AttachmentDetailPage.php:389 includes/Admin/AuditPage.php:566 +msgid "Other Domains" +msgstr "Altres dominis" + +#: includes/Admin/AttachmentDetailPage.php:405 includes/Admin/AuditPage.php:567 +msgid "Ignored Domains" +msgstr "Dominis ignorats" + +#: includes/Admin/AttachmentDetailPage.php:447 +msgid "Pages with this image" +msgstr "Pàgines amb aquesta imatge" + +#: includes/Admin/AttachmentDetailPage.php:449 +#: includes/Admin/AttachmentDetailPage.php:550 +#: includes/Admin/AttachmentDetailPage.php:663 +msgid "Page URL" +msgstr "URL de la pàgina" + +#: includes/Admin/AttachmentDetailPage.php:450 +msgid "Page Title" +msgstr "Títol de la pàgina" + +#: includes/Admin/AttachmentDetailPage.php:473 +msgid "Full image matches" +msgstr "Coincidències exactes d'imatge" + +#: includes/Admin/AttachmentDetailPage.php:474 +#: includes/Admin/AttachmentDetailPage.php:492 +#: includes/Admin/AttachmentDetailPage.php:551 +#: includes/Admin/AttachmentDetailPage.php:664 +msgid "Image URL" +msgstr "URL de la imatge" + +#: includes/Admin/AttachmentDetailPage.php:491 +msgid "Partial image matches" +msgstr "Coincidències parcials d'imatge" + +#: includes/Admin/AttachmentDetailPage.php:548 +msgid "Backlinks found by TinEye (sorted by crawl date, newest first)" +msgstr "" +"Backlinks trobats per TinEye (ordenats per data de rastreig, el més recent " +"primer)" + +#: includes/Admin/AttachmentDetailPage.php:552 +msgid "Crawl date" +msgstr "Data de rastreig" + +#: includes/Admin/AttachmentDetailPage.php:599 +msgid "Face detected" +msgstr "Cara detectada" + +#: includes/Admin/AttachmentDetailPage.php:602 +msgid "Logo detected" +msgstr "Logotip detectat" + +#: includes/Admin/AttachmentDetailPage.php:605 +msgid "Landmark detected" +msgstr "Monument detectat" + +#: includes/Admin/AttachmentDetailPage.php:608 +msgid "Stock image" +msgstr "Imatge de banc" + +#. translators: %s: copyright holder name +#: includes/Admin/AttachmentDetailPage.php:615 +#, php-format +msgid "EXIF copyright: %s" +msgstr "Copyright EXIF: %s" + +#: includes/Admin/AttachmentDetailPage.php:620 +msgid "Risk flags" +msgstr "Indicadors de risc" + +#: includes/Admin/AttachmentDetailPage.php:622 +msgid "No risk flags detected." +msgstr "No s'han detectat indicadors de risc." + +#: includes/Admin/AttachmentDetailPage.php:661 +msgid "Backlinks found by PicDefense" +msgstr "Backlinks trobats per PicDefense" + +#: includes/Admin/AttachmentDetailPage.php:665 +msgid "Similarity" +msgstr "Similitud" + +#: includes/Admin/AttachmentDetailPage.php:694 +msgid "Labels" +msgstr "Etiquetes" + +#: includes/Admin/AuditPage.php:116 +msgid "Loading…" +msgstr "S'està carregant…" + +#: includes/Admin/AuditPage.php:117 +msgid "Error loading details." +msgstr "S'ha produït un error en carregar els detalls." + +#: includes/Admin/AuditPage.php:118 includes/Admin/AuditPage.php:194 +msgid "This image is not used in any post." +msgstr "Aquesta imatge no s'utilitza en cap entrada." + +#: includes/Admin/AuditPage.php:119 includes/Admin/AuditPage.php:156 +msgid "Usage Details" +msgstr "Detalls d'ús" + +#: includes/Admin/AuditPage.php:142 includes/Core/Plugin.php:109 +#: includes/Core/Plugin.php:110 includes/Core/Plugin.php:123 +#: includes/Core/Plugin.php:124 includes/Privacy/DataEraser.php:33 +#: includes/Privacy/DataExporter.php:45 +msgid "Media Audit" +msgstr "Auditoria de mitjans" + +#: includes/Admin/AuditPage.php:148 +msgid "Search" +msgstr "Cerca" + +#: includes/Admin/AuditPage.php:157 +msgid "Close" +msgstr "Tanca" + +#: includes/Admin/AuditPage.php:175 includes/Admin/AuditPage.php:529 +#: includes/Admin/AuditPage.php:776 includes/Admin/AuditPage.php:808 +#: includes/Admin/ToolsPage.php:105 includes/Admin/ToolsPage.php:165 +msgid "Insufficient permissions." +msgstr "Permisos insuficients." + +#: includes/Admin/AuditPage.php:328 +msgid "No matches" +msgstr "Sense coincidències" + +#: includes/Admin/AuditPage.php:381 includes/Admin/AuditPage.php:488 +#: includes/Admin/MediaListTable.php:298 includes/Admin/MediaListTable.php:435 +msgid "Alert" +msgstr "Alerta" + +#: includes/Admin/AuditPage.php:403 msgid "Consensus Domains" msgstr "Dominis de consens" #. translators: %d: number of providers that agree -#: includes/Admin/AuditPage.php:358 +#: includes/Admin/AuditPage.php:409 #, php-format msgid "%d provider" msgid_plural "%d providers" msgstr[0] "%d proveïdor" msgstr[1] "%d proveïdors" -#: includes/Admin/AuditPage.php:390 +#: includes/Admin/AuditPage.php:419 +msgid "View full report →" +msgstr "Veure l'informe complet →" + +#: includes/Admin/AuditPage.php:445 msgid "In Index" msgstr "A l'índex" #. translators: %d: count of images not yet indexed -#: includes/Admin/AuditPage.php:394 +#: includes/Admin/AuditPage.php:449 #, php-format msgid "%d not yet indexed" msgstr "%d encara no indexades" -#: includes/Admin/AuditPage.php:397 +#: includes/Admin/AuditPage.php:452 msgid "All indexed" msgstr "Totes indexades" -#: includes/Admin/AuditPage.php:402 includes/Admin/MediaListTable.php:278 +#: includes/Admin/AuditPage.php:457 includes/Admin/MediaListTable.php:329 msgid "Scanned" msgstr "Explorades" #. translators: %d: percentage -#: includes/Admin/AuditPage.php:405 +#: includes/Admin/AuditPage.php:460 #, php-format msgid "%d%% of index" msgstr "%d%% de l'índex" -#: includes/Admin/AuditPage.php:412 +#: includes/Admin/AuditPage.php:467 msgid "Used" msgstr "Usades" -#: includes/Admin/AuditPage.php:418 includes/Admin/MediaListTable.php:203 +#: includes/Admin/AuditPage.php:473 includes/Admin/MediaListTable.php:211 msgid "Unused" msgstr "No usades" -#: includes/Admin/AuditPage.php:425 +#: includes/Admin/AuditPage.php:480 msgid "External Matches" msgstr "Coincidències externes" -#: includes/Admin/AuditPage.php:475 includes/Admin/AuditPage.php:529 +#: includes/Admin/AuditPage.php:543 msgid "Could not open output stream." msgstr "No s'ha pogut obrir el flux de sortida." -#: includes/Admin/AuditPage.php:484 includes/Admin/AuditPage.php:537 -#: includes/Privacy/DataExporter.php:257 includes/Privacy/DataExporter.php:299 +#: includes/Admin/AuditPage.php:552 includes/Privacy/DataExporter.php:257 +#: includes/Privacy/DataExporter.php:299 msgid "Attachment ID" msgstr "ID del fitxer adjunt" -#: includes/Admin/AuditPage.php:485 includes/Admin/AuditPage.php:538 -#: includes/Admin/MediaListTable.php:52 includes/Privacy/DataExporter.php:261 -msgid "Filename" -msgstr "Nom de fitxer" - -#: includes/Admin/AuditPage.php:486 includes/Admin/AuditPage.php:539 -#: includes/Privacy/DataExporter.php:265 -msgid "File URL" -msgstr "URL del fitxer" - -#: includes/Admin/AuditPage.php:487 -msgid "MIME Type" -msgstr "Tipus MIME" - -#: includes/Admin/AuditPage.php:488 +#: includes/Admin/AuditPage.php:556 msgid "File Size (bytes)" msgstr "Mida del fitxer (bytes)" -#: includes/Admin/AuditPage.php:489 includes/Admin/AuditPage.php:540 -#: includes/Admin/MediaListTable.php:56 -msgid "External Status" -msgstr "Estat extern" +#: includes/Admin/AuditPage.php:557 +msgid "Internal Scan Date" +msgstr "Data de l'escaneig intern" -#: includes/Admin/AuditPage.php:490 includes/Admin/MediaListTable.php:54 +#: includes/Admin/AuditPage.php:559 +msgid "Has Alert" +msgstr "Té alerta" + +#: includes/Admin/AuditPage.php:560 includes/Admin/MediaListTable.php:57 msgid "Usage Count" msgstr "Nombre d'usos" -#: includes/Admin/AuditPage.php:491 -msgid "Used In (post titles)" -msgstr "Usat a (títols d'entrades)" +#: includes/Admin/AuditPage.php:561 +msgid "Used In" +msgstr "Usat a" -#: includes/Admin/AuditPage.php:541 includes/Admin/MediaListTable.php:57 -msgid "Last Scanned" -msgstr "Darrera exploració" +#: includes/Admin/AuditPage.php:562 +msgid "Google Vision — Matches" +msgstr "Google Vision — Coincidències" -#: includes/Admin/AuditPage.php:542 includes/Privacy/DataExporter.php:303 -msgid "Provider" -msgstr "Proveïdor" +#: includes/Admin/AuditPage.php:563 +msgid "TinEye — Matches" +msgstr "TinEye — Coincidències" -#: includes/Admin/AuditPage.php:543 includes/Privacy/DataExporter.php:307 -msgid "Match Count" -msgstr "Nombre de coincidències" +#: includes/Admin/AuditPage.php:564 +msgid "PicDefense — Matches" +msgstr "PicDefense — Coincidències" -#: includes/Admin/AuditPage.php:544 -msgid "Top Domains" -msgstr "Dominis principals" +#: includes/Admin/AuditPage.php:748 +msgid "Yes" +msgstr "Sí" -#: includes/Admin/MediaListTable.php:51 +#: includes/Admin/AuditPage.php:748 +msgid "No" +msgstr "No" + +#: includes/Admin/MediaListTable.php:54 msgid "Thumbnail" msgstr "Miniatura" -#: includes/Admin/MediaListTable.php:53 -msgid "ID" -msgstr "ID" - -#: includes/Admin/MediaListTable.php:55 +#: includes/Admin/MediaListTable.php:58 msgid "Usages" msgstr "Usos" -#: includes/Admin/MediaListTable.php:81 +#: includes/Admin/MediaListTable.php:60 +msgid "Last Scanned" +msgstr "Darrera exploració" + +#: includes/Admin/MediaListTable.php:84 msgid "Run External Scan" msgstr "Executar exploració externa" -#: includes/Admin/MediaListTable.php:82 +#: includes/Admin/MediaListTable.php:85 msgid "Purge External Data" msgstr "Eliminar dades externes" -#: includes/Admin/MediaListTable.php:83 +#: includes/Admin/MediaListTable.php:86 msgid "Export CSV" msgstr "Exportar CSV" -#: includes/Admin/MediaListTable.php:84 -msgid "Export External Results CSV" -msgstr "Exportar CSV de resultats externs" +#: includes/Admin/MediaListTable.php:87 +msgid "Export CSV (Alerts only)" +msgstr "Exportar CSV (només alertes)" -#: includes/Admin/MediaListTable.php:168 +#: includes/Admin/MediaListTable.php:171 msgid "Edit" msgstr "Edita" -#: includes/Admin/MediaListTable.php:173 +#: includes/Admin/MediaListTable.php:176 msgid "View Details" msgstr "Visualitza els detalls" -#: includes/Admin/MediaListTable.php:239 +#: includes/Admin/MediaListTable.php:181 +msgid "Full Report" +msgstr "Informe complet" + +#: includes/Admin/MediaListTable.php:247 msgid "(no title)" msgstr "(sense títol)" #. translators: %d: number of additional usages -#: includes/Admin/MediaListTable.php:254 +#: includes/Admin/MediaListTable.php:262 #, php-format msgid "+ %d more…" msgstr "+ %d més…" -#: includes/Admin/MediaListTable.php:276 includes/Admin/ToolsPage.php:580 -#: includes/Admin/ToolsPage.php:581 includes/Admin/ToolsPage.php:582 -msgid "Pending" -msgstr "Pendent" - -#: includes/Admin/MediaListTable.php:277 -msgid "Queued" -msgstr "En cua" - -#: includes/Admin/MediaListTable.php:279 -msgid "Matches Found" -msgstr "Coincidències trobades" - -#: includes/Admin/MediaListTable.php:280 -msgid "Error" -msgstr "Error" - -#: includes/Admin/MediaListTable.php:308 +#: includes/Admin/MediaListTable.php:320 includes/Admin/MediaListTable.php:359 msgid "View Results" msgstr "Visualitza els resultats" +#: includes/Admin/MediaListTable.php:327 includes/Admin/ToolsPage.php:589 +#: includes/Admin/ToolsPage.php:590 includes/Admin/ToolsPage.php:591 +msgid "Pending" +msgstr "Pendent" + +#: includes/Admin/MediaListTable.php:328 +msgid "Queued" +msgstr "En cua" + +#: includes/Admin/MediaListTable.php:330 +msgid "Matches Found" +msgstr "Coincidències trobades" + +#: includes/Admin/MediaListTable.php:331 +msgid "Error" +msgstr "Error" + #. translators: %s: human-readable time difference, e.g. "3 days" -#: includes/Admin/MediaListTable.php:350 +#: includes/Admin/MediaListTable.php:401 #, php-format msgid "%s ago" msgstr "fa %s" -#: includes/Admin/MediaListTable.php:380 +#: includes/Admin/MediaListTable.php:431 msgid "All statuses" msgstr "Tots els estats" -#: includes/Admin/MediaListTable.php:394 +#: includes/Admin/MediaListTable.php:450 msgid "All post types" msgstr "Tots els tipus d'entrada" -#: includes/Admin/MediaListTable.php:409 +#: includes/Admin/MediaListTable.php:465 msgid "Unused only" msgstr "Només no usades" -#: includes/Admin/MediaListTable.php:412 +#: includes/Admin/MediaListTable.php:468 msgid "Filter" msgstr "Filtra" -#: includes/Admin/MediaListTable.php:422 +#: includes/Admin/MediaListTable.php:478 msgid "" "No indexed attachments found. Run wp mra scan-internal to populate the index." msgstr "" "No s'han trobat fitxers adjunts indexats. Executeu wp mra scan-internal per " "omplir l'índex." -#: includes/Admin/Settings.php:47 +#: includes/Admin/Settings.php:203 msgid "General" msgstr "General" -#: includes/Admin/Settings.php:54 -msgid "Delete data on uninstall" -msgstr "Elimina les dades en desinstal·lar" - -#: includes/Admin/Settings.php:62 +#: includes/Admin/Settings.php:204 msgid "API Credentials" msgstr "Credencials de l'API" -#: includes/Admin/Settings.php:69 -msgid "Google Cloud Vision API Key" -msgstr "Clau de l'API de Google Cloud Vision" +#: includes/Admin/Settings.php:205 +msgid "Filters" +msgstr "Filtres" -#: includes/Admin/Settings.php:77 -msgid "TinEye API Key" -msgstr "Clau de l'API de TinEye" - -#: includes/Admin/Settings.php:85 +#: includes/Admin/Settings.php:206 msgid "External Scanning" msgstr "Exploració externa" -#: includes/Admin/Settings.php:92 +#: includes/Admin/Settings.php:249 +msgid "Delete data on uninstall" +msgstr "Elimina les dades en desinstal·lar" + +#: includes/Admin/Settings.php:265 +msgid "Google Cloud Vision API Key" +msgstr "Clau de l'API de Google Cloud Vision" + +#: includes/Admin/Settings.php:273 +msgid "TinEye API Key" +msgstr "Clau de l'API de TinEye" + +#: includes/Admin/Settings.php:281 +msgid "PicDefense User ID" +msgstr "ID d'usuari PicDefense" + +#: includes/Admin/Settings.php:289 +msgid "PicDefense API Key" +msgstr "Clau API de PicDefense" + +#: includes/Admin/Settings.php:298 +msgid "Alert Hostnames" +msgstr "Hostnames d'alerta" + +#: includes/Admin/Settings.php:305 includes/Admin/Settings.php:320 +msgid "Hostnames" +msgstr "Hostnames" + +#: includes/Admin/Settings.php:313 +msgid "Ignored Hostnames" +msgstr "Hostnames ignorats" + +#: includes/Admin/Settings.php:336 msgid "Batch Size" msgstr "Mida del lot" -#: includes/Admin/Settings.php:100 +#: includes/Admin/Settings.php:344 msgid "Rate Limit (requests/min)" msgstr "Límit de velocitat (sol·licituds/min)" -#: includes/Admin/Settings.php:156 +#. translators: %s: comma-separated list of hostnames +#: includes/Admin/Settings.php:404 +#, php-format +msgid "" +"The following hostnames were removed from the exclusion list because they " +"already appear in the alert list: %s" +msgstr "" +"Els hostnames següents s'han eliminat de la llista d'exclusió perquè ja " +"apareixen a la llista d'alertes: %s" + +#: includes/Admin/Settings.php:505 +msgid "API Credentials Status" +msgstr "Estat de les credencials d'API" + +#: includes/Admin/Settings.php:513 +#: includes/External/GoogleVisionProvider.php:43 +msgid "Google Cloud Vision" +msgstr "Google Cloud Vision" + +#: includes/Admin/Settings.php:521 +msgid "TinEye" +msgstr "TinEye" + +#: includes/Admin/Settings.php:544 +msgid "" +"Matches from these hostnames are flagged as critical copyright alerts. " +"Entering example.com also covers all its subdomains." +msgstr "" +"Les coincidències d'aquests hostnames es marquen com a alertes crítiques de " +"copyright. Introduir example.com també cobreix tots els seus subdominis." + +#: includes/Admin/Settings.php:557 +msgid "" +"Matches from these hostnames are silently ignored and not counted as " +"potential copyright issues. Entering example.com also covers all its " +"subdomains. A hostname already present in the alert list cannot be added " +"here." +msgstr "" +"Les coincidències d'aquests hostnames s'ignoren silenciosament i no es " +"comptabilitzen com a possibles problemes de copyright. Introduir example.com " +"també cobreix tots els seus subdominis. Un hostname ja present a la llista " +"d'alertes no es pot afegir aquí." + +#: includes/Admin/Settings.php:578 msgid "" "Remove all plugin data (tables and options) when the plugin is uninstalled." msgstr "" "Elimina totes les dades del connector (taules i opcions) quan es " "desinstal·li el connector." -#: includes/Admin/Settings.php:159 +#: includes/Admin/Settings.php:581 msgid "" "By default, data is preserved after uninstall. Enable this only if you want " "a clean removal." @@ -395,7 +628,7 @@ msgstr "" "Per defecte, les dades es conserven després de la desinstal·lació. Activeu-" "ho només si voleu una eliminació completa." -#: includes/Admin/Settings.php:183 +#: includes/Admin/Settings.php:605 msgid "" "Required for Google Cloud Vision Web Detection. Obtain from the Google Cloud " "Console." @@ -403,27 +636,28 @@ msgstr "" "Necessari per a la detecció web de Google Cloud Vision. Obteniu-lo a Google " "Cloud Console." -#: includes/Admin/Settings.php:186 includes/Admin/Settings.php:236 +#: includes/Admin/Settings.php:608 includes/Admin/Settings.php:658 +#: includes/Admin/Settings.php:736 msgid "View pricing" msgstr "Veure tarifes" -#: includes/Admin/Settings.php:192 +#: includes/Admin/Settings.php:614 msgid "Monthly requests" msgstr "Sol·licituds mensuals" -#: includes/Admin/Settings.php:193 +#: includes/Admin/Settings.php:615 msgid "Price per 1,000" msgstr "Preu per 1.000" -#: includes/Admin/Settings.php:198 +#: includes/Admin/Settings.php:620 msgid "First 1,000" msgstr "Primeres 1.000" -#: includes/Admin/Settings.php:199 +#: includes/Admin/Settings.php:621 msgid "Free" msgstr "Gratuït" -#: includes/Admin/Settings.php:233 +#: includes/Admin/Settings.php:655 msgid "" "Required for TinEye reverse image search. Obtain from your TinEye Commercial " "account." @@ -431,36 +665,59 @@ msgstr "" "Necessari per a la cerca inversa d'imatges de TinEye. Obteniu-lo al vostre " "compte comercial de TinEye." -#: includes/Admin/Settings.php:242 +#: includes/Admin/Settings.php:664 msgid "Bundle" msgstr "Pla" -#: includes/Admin/Settings.php:243 +#: includes/Admin/Settings.php:665 msgid "Searches" msgstr "Cerques" -#: includes/Admin/Settings.php:244 +#: includes/Admin/Settings.php:666 msgid "Price" msgstr "Preu" -#: includes/Admin/Settings.php:249 +#: includes/Admin/Settings.php:671 msgid "Starter" msgstr "Inicial" -#: includes/Admin/Settings.php:254 +#: includes/Admin/Settings.php:676 msgid "Standard" msgstr "Estàndard" -#: includes/Admin/Settings.php:259 +#: includes/Admin/Settings.php:681 msgid "Professional" msgstr "Professional" -#: includes/Admin/Settings.php:288 +#: includes/Admin/Settings.php:709 +msgid "" +"Required for PicDefense copyright risk analysis. Your PicDefense account " +"user ID." +msgstr "" +"Necessari per a l'anàlisi de risc de copyright de PicDefense. Identificador " +"d'usuari del vostre compte PicDefense." + +#: includes/Admin/Settings.php:733 +msgid "" +"Required for PicDefense copyright risk analysis. Your PicDefense API key." +msgstr "" +"Necessari per a l'anàlisi de risc de copyright de PicDefense. Clau d'API de " +"PicDefense." + +#: includes/Admin/Settings.php:768 includes/Admin/Settings.php:799 +msgid "" +"One hostname per line. example.com covers all its subdomains. Explicit " +"wildcard: *.example.com." +msgstr "" +"Un hostname per línia. example.com també cobreix tots els seus subdominis. " +"Comodí explícit: *.example.com." + +#: includes/Admin/Settings.php:824 msgid "Number of images to scan per scheduled batch (1–100). Default: 10." msgstr "" "Nombre d'imatges a explorar per lot programat (1–100). Per defecte: 10." -#: includes/Admin/Settings.php:313 +#: includes/Admin/Settings.php:849 msgid "Maximum API requests per minute per provider (1–60). Default: 10." msgstr "" "Nombre màxim de sol·licituds d'API per minut per proveïdor (1–60). Per " @@ -478,23 +735,23 @@ msgstr "Aturat." msgid "An error occurred." msgstr "S'ha produït un error." -#: includes/Admin/ToolsPage.php:139 +#: includes/Admin/ToolsPage.php:143 msgid "Invalid batch type." msgstr "Tipus de lot no vàlid." -#: includes/Admin/ToolsPage.php:256 +#: includes/Admin/ToolsPage.php:264 msgid "System Status" msgstr "Estat del sistema" -#: includes/Admin/ToolsPage.php:259 +#: includes/Admin/ToolsPage.php:267 msgid "Operations" msgstr "Operacions" -#: includes/Admin/ToolsPage.php:262 +#: includes/Admin/ToolsPage.php:270 msgid "Direct scan runner" msgstr "Executor d'exploració directa" -#: includes/Admin/ToolsPage.php:264 +#: includes/Admin/ToolsPage.php:272 msgid "" "Run scan batches directly from your browser without relying on background " "jobs. Useful when WP-Cron is disabled or Action Scheduler is not running. " @@ -504,79 +761,80 @@ msgstr "" "treballs en segon pla. Útil quan WP-Cron està desactivat o Action Scheduler " "no s'està executant. Manteniu aquesta pestanya oberta mentre es processa." -#: includes/Admin/ToolsPage.php:300 +#: includes/Admin/ToolsPage.php:308 msgid "not installed" msgstr "no instal·lat" -#: includes/Admin/ToolsPage.php:358 +#: includes/Admin/ToolsPage.php:366 msgid "Internal scan scheduled." msgstr "Exploració interna programada." -#: includes/Admin/ToolsPage.php:359 +#: includes/Admin/ToolsPage.php:367 msgid "External scan scheduled." msgstr "Exploració externa programada." -#: includes/Admin/ToolsPage.php:360 +#: includes/Admin/ToolsPage.php:368 msgid "Failed scans re-queued. Background scan scheduled." -msgstr "" -"Exploracions fallides reencolades. Exploració en segon pla " -"programada." +msgstr "Exploracions fallides reencolades. Exploració en segon pla programada." -#: includes/Admin/ToolsPage.php:361 +#: includes/Admin/ToolsPage.php:369 +msgid "Provider registry synced. New scans scheduled." +msgstr "Registre de proveïdors sincronitzat. Nous escanejos programats." + +#: includes/Admin/ToolsPage.php:370 msgid "Usage data cleared. Background scan scheduled." msgstr "Dades d'ús eliminades. Exploració en segon pla programada." -#: includes/Admin/ToolsPage.php:362 +#: includes/Admin/ToolsPage.php:371 msgid "Index cleared. Fresh indexing scheduled." msgstr "Índex eliminat. Nova indexació programada." -#: includes/Admin/ToolsPage.php:363 +#: includes/Admin/ToolsPage.php:372 msgid "External scan data purged." msgstr "Dades d'exploració externa eliminades." -#: includes/Admin/ToolsPage.php:364 +#: includes/Admin/ToolsPage.php:373 msgid "All data reset. Fresh indexing scheduled." msgstr "Totes les dades restablertes. Nova indexació programada." -#: includes/Admin/ToolsPage.php:367 +#: includes/Admin/ToolsPage.php:376 msgid "Operation completed." msgstr "Operació completada." -#: includes/Admin/ToolsPage.php:411 +#: includes/Admin/ToolsPage.php:420 msgid "Database schema" msgstr "Esquema de base de dades" #. translators: %s: version number -#: includes/Admin/ToolsPage.php:417 +#: includes/Admin/ToolsPage.php:426 #, php-format msgid "v%s – up to date" msgstr "v%s – actualitzat" #. translators: 1: stored version, 2: expected version -#: includes/Admin/ToolsPage.php:423 +#: includes/Admin/ToolsPage.php:432 #, php-format msgid "Installed: %1$s — Required: %2$s" msgstr "Instal·lat: %1$s — Requerit: %2$s" -#: includes/Admin/ToolsPage.php:432 +#: includes/Admin/ToolsPage.php:441 msgid "Deactivate and reactivate the plugin to apply pending migrations." msgstr "" -"Desactiveu i reactiveu el connector per aplicar les migracions " -"pendents." +"Desactiveu i reactiveu el connector per aplicar les migracions pendents." -#: includes/Admin/ToolsPage.php:439 +#: includes/Admin/ToolsPage.php:448 msgid "Action Scheduler" msgstr "Action Scheduler" -#: includes/Admin/ToolsPage.php:442 +#: includes/Admin/ToolsPage.php:451 msgid "Available" msgstr "Disponible" -#: includes/Admin/ToolsPage.php:444 +#: includes/Admin/ToolsPage.php:453 msgid "Not available" msgstr "No disponible" -#: includes/Admin/ToolsPage.php:449 +#: includes/Admin/ToolsPage.php:458 msgid "" "Install and activate the Action Scheduler plugin. Background scanning will " "not work without it." @@ -584,19 +842,19 @@ msgstr "" "Instal·leu i activeu el connector Action Scheduler. L'exploració en segon " "pla no funcionarà sense ell." -#: includes/Admin/ToolsPage.php:456 +#: includes/Admin/ToolsPage.php:465 msgid "WP-Cron" msgstr "WP-Cron" -#: includes/Admin/ToolsPage.php:459 +#: includes/Admin/ToolsPage.php:468 msgid "Disabled (DISABLE_WP_CRON)" msgstr "Desactivat (DISABLE_WP_CRON)" -#: includes/Admin/ToolsPage.php:461 +#: includes/Admin/ToolsPage.php:470 msgid "Enabled" msgstr "Activat" -#: includes/Admin/ToolsPage.php:466 +#: includes/Admin/ToolsPage.php:475 msgid "" "Background jobs will not fire automatically. Trigger the cron externally or " "use WP-CLI:" @@ -604,155 +862,168 @@ msgstr "" "Els treballs en segon pla no s'executaran automàticament. Activeu el cron " "externament o useu WP-CLI:" -#: includes/Admin/ToolsPage.php:474 +#: includes/Admin/ToolsPage.php:483 msgid "Internal index" msgstr "Índex intern" #. translators: 1: indexed count, 2: total images -#: includes/Admin/ToolsPage.php:479 +#: includes/Admin/ToolsPage.php:488 #, php-format msgid "%1$s / %2$s images indexed" msgstr "%1$s / %2$s imatges indexades" #. translators: %s: formatted count -#: includes/Admin/ToolsPage.php:490 +#: includes/Admin/ToolsPage.php:499 #, php-format msgid "%s image not yet indexed." msgid_plural "%s images not yet indexed." msgstr[0] "%s imatge encara no indexada." msgstr[1] "%s imatges encara no indexades." -#: includes/Admin/ToolsPage.php:494 +#: includes/Admin/ToolsPage.php:503 msgid "Schedule an internal scan below." msgstr "Programeu una exploració interna a continuació." -#: includes/Admin/ToolsPage.php:502 +#: includes/Admin/ToolsPage.php:511 msgid "Usage scan" msgstr "Exploració d'ús" #. translators: 1: scanned count, 2: total indexed -#: includes/Admin/ToolsPage.php:507 +#: includes/Admin/ToolsPage.php:516 #, php-format msgid "%1$s / %2$s scanned for usage" msgstr "%1$s / %2$s explorades per a ús" #. translators: %s: formatted count -#: includes/Admin/ToolsPage.php:518 +#: includes/Admin/ToolsPage.php:527 #, php-format msgid "%s pending." msgid_plural "%s pending." msgstr[0] "%s pendent." msgstr[1] "%s pendents." -#: includes/Admin/ToolsPage.php:539 includes/Admin/ToolsPage.php:736 +#: includes/Admin/ToolsPage.php:548 includes/Admin/ToolsPage.php:752 msgid "External scan" msgstr "Exploració externa" #. translators: 1: scanned 2: matches 3: queued 4: pending 5: errors -#: includes/Admin/ToolsPage.php:544 +#: includes/Admin/ToolsPage.php:553 #, php-format msgid "%1$s scanned · %2$s matches · %3$s queued · %4$s pending · %5$s errors" msgstr "" -"%1$s explorades · %2$s coincidències · %3$s en cua · %4$s pendents · " -"%5$s errors" +"%1$s explorades · %2$s coincidències · %3$s en cua · %4$s pendents · %5$s " +"errors" -#: includes/Admin/ToolsPage.php:555 +#: includes/Admin/ToolsPage.php:564 msgid "" "Some scans failed. Check that API keys are configured correctly in Settings." msgstr "" "Algunes exploracions han fallat. Comproveu que les claus d'API estan " "configurades correctament a la Configuració." -#: includes/Admin/ToolsPage.php:557 +#: includes/Admin/ToolsPage.php:566 msgid "Schedule an external scan below to process pending items." msgstr "" "Programeu una exploració externa a continuació per processar els elements " "pendents." -#: includes/Admin/ToolsPage.php:575 +#: includes/Admin/ToolsPage.php:584 msgid "Scheduled jobs" msgstr "Treballs programats" -#: includes/Admin/ToolsPage.php:578 +#: includes/Admin/ToolsPage.php:587 msgid "Action Scheduler not available." msgstr "Action Scheduler no disponible." -#: includes/Admin/ToolsPage.php:580 +#: includes/Admin/ToolsPage.php:589 msgid "Index:" msgstr "Índex:" -#: includes/Admin/ToolsPage.php:581 +#: includes/Admin/ToolsPage.php:590 msgid "Usage:" msgstr "Ús:" -#: includes/Admin/ToolsPage.php:582 +#: includes/Admin/ToolsPage.php:591 msgid "External:" msgstr "Extern:" -#: includes/Admin/ToolsPage.php:587 +#: includes/Admin/ToolsPage.php:596 msgid "" "There is work to do but no background job is scheduled. Use the operations " "below." msgstr "" -"Hi ha feina pendent però no hi ha cap treball en segon pla programat. " -"Useu les operacions de sota." +"Hi ha feina pendent però no hi ha cap treball en segon pla programat. Useu " +"les operacions de sota." -#: includes/Admin/ToolsPage.php:589 +#: includes/Admin/ToolsPage.php:598 msgid "WP-Cron is disabled. Jobs will not fire automatically." -msgstr "" -"WP-Cron està desactivat. Els treballs no s'executaran " -"automàticament." +msgstr "WP-Cron està desactivat. Els treballs no s'executaran automàticament." -#: includes/Admin/ToolsPage.php:599 +#: includes/Admin/ToolsPage.php:608 msgid "WP-CLI commands to process scans manually:" msgstr "Comandes WP-CLI per processar exploracions manualment:" -#: includes/Admin/ToolsPage.php:616 +#: includes/Admin/ToolsPage.php:625 msgid "Schedule internal scan" msgstr "Programar exploració interna" -#: includes/Admin/ToolsPage.php:617 +#: includes/Admin/ToolsPage.php:626 msgid "" "Queue a background job to index all unindexed media files and scan their " "usage across posts, pages, and custom fields. Safe to run at any time — will " "not re-process completed work." msgstr "" "Posa en cua un treball en segon pla per indexar tots els fitxers multimèdia " -"no indexats i explorar el seu ús en entrades, pàgines i camps personalitzats. " -"Es pot executar en qualsevol moment: no reprocessarà el treball ja completat." +"no indexats i explorar el seu ús en entrades, pàgines i camps " +"personalitzats. Es pot executar en qualsevol moment: no reprocessarà el " +"treball ja completat." -#: includes/Admin/ToolsPage.php:623 +#: includes/Admin/ToolsPage.php:632 msgid "Schedule external scan" msgstr "Programar exploració externa" -#: includes/Admin/ToolsPage.php:624 +#: includes/Admin/ToolsPage.php:633 msgid "" "Mark all pending attachments as queued and launch a background reverse-image-" "search via the configured providers. Requires API keys in Settings." msgstr "" -"Marca tots els fitxers adjunts pendents com en cua i llança una cerca inversa " -"d'imatges en segon pla a través dels proveïdors configurats. Requereix claus " -"d'API a la Configuració." +"Marca tots els fitxers adjunts pendents com en cua i llança una cerca " +"inversa d'imatges en segon pla a través dels proveïdors configurats. " +"Requereix claus d'API a la Configuració." -#: includes/Admin/ToolsPage.php:630 +#: includes/Admin/ToolsPage.php:639 msgid "Requeue scan errors" msgstr "Reencolar errors d'exploració" -#: includes/Admin/ToolsPage.php:631 +#: includes/Admin/ToolsPage.php:640 msgid "" "Re-queues only the attachments that failed with an error on the last " "external scan run. Does not affect already-scanned items. Useful to retry " "after fixing API key issues." msgstr "" "Reencola només els fitxers adjunts que van fallar amb un error en l'última " -"execució de l'exploració externa. No afecta els elements ja explorats. " -"Útil per reintentar després de corregir problemes amb les claus d'API." +"execució de l'exploració externa. No afecta els elements ja explorats. Útil " +"per reintentar després de corregir problemes amb les claus d'API." -#: includes/Admin/ToolsPage.php:640 +#: includes/Admin/ToolsPage.php:646 +msgid "Sync provider registry" +msgstr "Sincronitza el registre de proveïdors" + +#: includes/Admin/ToolsPage.php:647 +msgid "" +"Creates scan entries for any newly registered external providers. Run this " +"after adding a new provider via the mra/external/providers filter. Already-" +"scanned attachments are not affected." +msgstr "" +"Crea entrades d'escaneig per als proveïdors externs registrats recentment. " +"Executa-ho després d'afegir un nou proveïdor mitjançant el filtre mra/" +"external/providers. Els fitxers ja escanejats no es veuen afectats." + +#: includes/Admin/ToolsPage.php:656 msgid "Reset usage data" msgstr "Restablir dades d'ús" -#: includes/Admin/ToolsPage.php:641 +#: includes/Admin/ToolsPage.php:657 msgid "" "Clears all usage rows and resets the usage-scan flag for every indexed " "attachment. File metadata in the index is preserved. A background usage scan " @@ -762,33 +1033,33 @@ msgstr "" "a cada fitxer adjunt indexat. Els metadades del fitxer a l'índex es " "conserven. Es programa una exploració en segon pla immediatament després." -#: includes/Admin/ToolsPage.php:643 +#: includes/Admin/ToolsPage.php:659 msgid "This will delete all usage data. Continue?" msgstr "Això eliminarà totes les dades d'ús. Voleu continuar?" -#: includes/Admin/ToolsPage.php:647 +#: includes/Admin/ToolsPage.php:663 msgid "Re-index media library" msgstr "Re-indexar la biblioteca de mitjans" -#: includes/Admin/ToolsPage.php:648 +#: includes/Admin/ToolsPage.php:664 msgid "" "Deletes all index and usage entries, then schedules a full fresh re-index. " "External scan results are not affected. Useful if many media files have been " "added or removed." msgstr "" -"Elimina totes les entrades de l'índex i d'ús, i després programa una " -"re-indexació completa. Els resultats de l'exploració externa no es veuen " +"Elimina totes les entrades de l'índex i d'ús, i després programa una re-" +"indexació completa. Els resultats de l'exploració externa no es veuen " "afectats. Útil si s'han afegit o eliminat molts fitxers multimèdia." -#: includes/Admin/ToolsPage.php:650 +#: includes/Admin/ToolsPage.php:666 msgid "This will delete all index and usage data. Continue?" msgstr "Això eliminarà totes les dades de l'índex i d'ús. Voleu continuar?" -#: includes/Admin/ToolsPage.php:654 +#: includes/Admin/ToolsPage.php:670 msgid "Purge external data" msgstr "Purgar dades externes" -#: includes/Admin/ToolsPage.php:655 +#: includes/Admin/ToolsPage.php:671 msgid "" "Deletes all external scan results and resets every attachment's external " "status to pending. Use this before switching API providers or to force a " @@ -798,17 +1069,16 @@ msgstr "" "extern de cada fitxer adjunt a pendent. Useu-ho abans de canviar de " "proveïdors d'API o per forçar una exploració completa." -#: includes/Admin/ToolsPage.php:657 +#: includes/Admin/ToolsPage.php:673 msgid "This will delete all external scan results. Continue?" msgstr "" -"Això eliminarà tots els resultats de l'exploració externa. Voleu " -"continuar?" +"Això eliminarà tots els resultats de l'exploració externa. Voleu continuar?" -#: includes/Admin/ToolsPage.php:661 +#: includes/Admin/ToolsPage.php:677 msgid "Reset all data" msgstr "Restablir totes les dades" -#: includes/Admin/ToolsPage.php:662 +#: includes/Admin/ToolsPage.php:678 msgid "" "Truncates all three plugin tables (index, usage, external results) and " "schedules a fresh indexing run. Use this to start completely from scratch." @@ -816,7 +1086,7 @@ msgstr "" "Buida les tres taules del connector (índex, ús, resultats externs) i " "programa una nova indexació. Useu-ho per començar completament des de zero." -#: includes/Admin/ToolsPage.php:664 +#: includes/Admin/ToolsPage.php:680 msgid "" "This will permanently delete ALL plugin data and cannot be undone. Are you " "absolutely sure?" @@ -824,11 +1094,11 @@ msgstr "" "Això eliminarà TOTES les dades del connector de forma permanent i no es pot " "desfer. Esteu absolutament segurs?" -#: includes/Admin/ToolsPage.php:675 +#: includes/Admin/ToolsPage.php:691 msgid "Destructive operations" msgstr "Operacions destructives" -#: includes/Admin/ToolsPage.php:678 +#: includes/Admin/ToolsPage.php:694 msgid "" "These operations permanently delete plugin data. Intended for forced " "rescans, troubleshooting, or starting fresh. A confirmation prompt will " @@ -838,11 +1108,11 @@ msgstr "" "Pensades per forçar re-exploracions, solucionar problemes o començar des de " "zero. Apareixerà una confirmació abans d'executar qualsevol acció." -#: includes/Admin/ToolsPage.php:726 +#: includes/Admin/ToolsPage.php:742 msgid "Index media files" msgstr "Indexar fitxers multimèdia" -#: includes/Admin/ToolsPage.php:727 +#: includes/Admin/ToolsPage.php:743 msgid "" "Discovers unindexed images and registers them in the plugin index. Run this " "first." @@ -850,18 +1120,18 @@ msgstr "" "Descobreix imatges no indexades i les registra a l'índex del connector. " "Executeu-ho primer." -#: includes/Admin/ToolsPage.php:731 +#: includes/Admin/ToolsPage.php:747 msgid "Scan usage" msgstr "Explorar l'ús" -#: includes/Admin/ToolsPage.php:732 +#: includes/Admin/ToolsPage.php:748 msgid "" "Checks every indexed image for usage across posts, pages, and custom fields." msgstr "" "Comprova l'ús de cada imatge indexada en entrades, pàgines i camps " "personalitzats." -#: includes/Admin/ToolsPage.php:737 +#: includes/Admin/ToolsPage.php:753 msgid "" "Sends images to external providers for reverse-image search. Requires API " "keys in Settings." @@ -869,11 +1139,11 @@ msgstr "" "Envia imatges a proveïdors externs per a la cerca inversa d'imatges. " "Requereix claus d'API a la Configuració." -#: includes/Admin/ToolsPage.php:754 +#: includes/Admin/ToolsPage.php:770 msgid "Run now" msgstr "Executa ara" -#: includes/Admin/ToolsPage.php:757 +#: includes/Admin/ToolsPage.php:773 msgid "Stop" msgstr "Atura" @@ -937,17 +1207,17 @@ msgstr "S'estan executant les exploracions externes…" msgid "External scan complete. %d attachments processed." msgstr "Exploració externa completada. %d fitxers adjunts processats." -#: includes/Core/Plugin.php:122 includes/Core/Plugin.php:123 +#: includes/Core/Plugin.php:132 includes/Core/Plugin.php:133 msgid "Tools" msgstr "Eines" -#: includes/Core/Plugin.php:135 includes/Core/Plugin.php:136 +#: includes/Core/Plugin.php:145 includes/Core/Plugin.php:146 msgid "Settings" msgstr "Configuració" -#: includes/External/GoogleVisionProvider.php:43 -msgid "Google Cloud Vision" -msgstr "Google Cloud Vision" +#: includes/Core/Plugin.php:154 +msgid "Attachment Report" +msgstr "Informe del fitxer adjunt" #: includes/Privacy/DataExporter.php:88 msgid "Media Audit – Indexed Files" @@ -969,139 +1239,26 @@ msgstr "Última exploració (interna)" msgid "Last Scanned (external)" msgstr "Última exploració (externa)" +#: includes/Privacy/DataExporter.php:303 +msgid "Provider" +msgstr "Proveïdor" + +#: includes/Privacy/DataExporter.php:307 +msgid "Match Count" +msgstr "Nombre de coincidències" + #: includes/Privacy/DataExporter.php:311 msgid "Scanned At" msgstr "Explorat el" -#: includes/Admin/ToolsPage.php:365 -msgid "Provider registry synced. New scans scheduled." -msgstr "Registre de proveïdors sincronitzat. Nous escanejos programats." +#~ msgid "Used In (post titles)" +#~ msgstr "Usat a (títols d'entrades)" -#: includes/Admin/ToolsPage.php:642 -msgid "Sync provider registry" -msgstr "Sincronitza el registre de proveïdors" +#~ msgid "Top Domains" +#~ msgstr "Dominis principals" -#: includes/Admin/ToolsPage.php:643 -msgid "Creates scan entries for any newly registered external providers. Run this after adding a new provider via the mra/external/providers filter. Already-scanned attachments are not affected." -msgstr "Crea entrades d'escaneig per als proveïdors externs registrats recentment. Executa-ho després d'afegir un nou proveïdor mitjançant el filtre mra/external/providers. Els fitxers ja escanejats no es veuen afectats." - -#: includes/Admin/AttachmentDetailPage.php -msgid "Full Report" -msgstr "Informe complet" - -#: includes/Admin/AttachmentDetailPage.php -msgid "View full report →" -msgstr "Veure l'informe complet →" - -#: includes/Core/Plugin.php -msgid "Attachment Report" -msgstr "Informe del fitxer adjunt" - -#: includes/Admin/AttachmentDetailPage.php -msgid "File Information" -msgstr "Informació del fitxer" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Pages with this image" -msgstr "Pàgines amb aquesta imatge" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Full image matches" -msgstr "Coincidències exactes d'imatge" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Partial image matches" -msgstr "Coincidències parcials d'imatge" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Backlinks found by TinEye (sorted by crawl date, newest first)" -msgstr "Backlinks trobats per TinEye (ordenats per data de rastreig, el més recent primer)" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Page URL" -msgstr "URL de la pàgina" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Crawl date" -msgstr "Data de rastreig" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Page Title" -msgstr "Títol de la pàgina" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Image URL" -msgstr "URL de la imatge" - -#: includes/Admin/AttachmentDetailPage.php -msgid "No external scan data available." -msgstr "No hi ha dades d'exploració externa disponibles." - -#: includes/Admin/AttachmentDetailPage.php -msgid "File size" -msgstr "Mida del fitxer" - -#: includes/Admin/AttachmentDetailPage.php -msgid "← Media Audit" -msgstr "← Auditoria de mitjans" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Internal scan date" -msgstr "Data de l'exploració interna" - -#: includes/Admin/AttachmentDetailPage.php -#, php-format -msgid "scanned %s" -msgstr "explorat el %s" - -#: includes/Admin/Settings.php -msgid "PicDefense User ID" -msgstr "ID d'usuari PicDefense" - -#: includes/Admin/Settings.php -msgid "PicDefense API Key" -msgstr "Clau API de PicDefense" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Face detected" -msgstr "Cara detectada" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Logo detected" -msgstr "Logotip detectat" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Landmark detected" -msgstr "Monument detectat" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Stock image" -msgstr "Imatge de banc" - -#: includes/Admin/AttachmentDetailPage.php -#, php-format -msgid "EXIF copyright: %s" -msgstr "Copyright EXIF: %s" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Similarity" -msgstr "Similitud" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Risk flags" -msgstr "Indicadors de risc" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Labels" -msgstr "Etiquetes" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Backlinks found by PicDefense" -msgstr "Backlinks trobats per PicDefense" - -#: includes/Admin/AttachmentDetailPage.php -msgid "No risk flags detected." -msgstr "No s'han detectat indicadors de risc." +#~ msgid "Export External Results CSV" +#~ msgstr "Exportar CSV de resultats externs" #~ msgid "https://robotstxt.es/plugins/media-audit/" #~ msgstr "https://robotstxt.es/plugins/media-audit/" diff --git a/languages/robotstxt-mediaaudit-es_ES.mo b/languages/robotstxt-mediaaudit-es_ES.mo index 8b307ec161b2035152c1eb938542b0c6ccc7682d..f18421837a3815adf6da162689b74eed961904ff 100644 GIT binary patch delta 7881 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 D>e$v2 delta 5224 zcmYk;d3a4{0>|<9CUHf?l1O4tZY+`5cd6PUwuqgC)*5n=X(W-Q80u1?qH4Rvw6)aG zi84yuQnXa3sxwMaYN?{rR_S=^kB*t?W2QRaU(TE7ai0A0dEax-J@0x>a_F#Y)ee{M zR%FOV!*QE5AyL(h>Ebdbytd97b1l-CMtB{Y;zJyYk@bw>$4urIr_5YzfTdUqx1t;O zVplwf_3Q7^|3Ct!Z=LEB%FXX@kLah)*xRrTTu<~K{a?BBk(h< zfj4nH-bHo1Z?rLea5Aa`ThLAWrkuhgPP~J|ux5-g0i1xrTwng1& zD87#wsE$Q24Ghl2q6XF(Q?NhsV@mn86Sv~qv~N-x8be#=K59fk%(tdInqOnEBWfy_ zp*pk*b=^7)!JVj%?Y5sEK;7>!s)OgSF@Iz#*rWz-G%#LYHK_l#l>T!S6l#anp zI1TxZ*?=0sKGYPSMqPISJL4_X5=F3))Q|^t-%c2csi^M_v-Qj-%)dr9l@nUynWzyJ z+WI`yNSC2TxCu42+mN=*K@7srQ8&JbYUl0Fcg17wHKPi{AGCu`8A#Kjs9#)S(}- z1`cfFbbKUMqdo=Ia5k>T0#pZr+BzMpj{3ZITh?ENMx0Pb5>RX16~k}_Y9x8q64Z?r zp*G!849CsZU8v1kVe6++9lnH`na9{2-R&40_HM`gtKm7EP=gCmyLJU?GroouF5c4^ zM|~pS(%LS>3Hls8_%o{EdL5k?QzB|F4L~)VfluRP-o>7@Fgdj^>8ly1vP?*Waq+mIEi{XYASc5I&=Ud@jY8VgX-8t)F%82)zCMn z8Gek~)HRt-?fwoJOZ#RJ1x=|JH6=?>Q@PI8w_M=ApcT@-6J)H)dp{{R(sn`=W zBa5*Cu0>tH8+HFvs2RG95wvgaQP9X9p>7oPv@^m8)QuXT_CgZsx-`@cMx#dL#ULz0 zUB4Q&xwazv*6hW`cpWuE|3cmGG5Vq@#P;HEKX%1w=tbT5G-?h1fqG1XdOIVijhm>) zVnaNHYT&%B-$#wSS|8{A5R2+?B5DSDp}se)5A(0WOirkQC8!x#je4=XfyeMI)D5Tg zb-uU&$5HoV6y8I1_*Z0gOng7*IiHAasBb_G^aSz>FqiRJbfx&5$7oUt|9EmD4>fh0 za18E3b?iT=O%vSTsW(F1Faaa57pj9JFdk>222h5YLBIWcuk{paDR27h1$R)p`d8E% zhNLpc>Azmf{2IucK~QHo*C#v>uyLKY~~B24-Slpz{I>8{|AyzE%`w z^Fb+U4Szz7q{d*Up=PLhGHPi?<2{^)ahNv5`8PcW^_cllFP=BigM01yv#6Q6jwA3s zw$k(8GtF7k>DEQ4HQj`6-2ipNgP4!Uu{yRJ>dZ_xoJGB_t(T)duRwkOC~DK4wC68i z4eHmhxt{-TDdb(1!S>3$I6+NB+u5tSNV^JrsrLfL)3x8BtWW;w`}2MOt9r*{LGdop=PY=*kubH zs!lwipYjFrJF-vff0n{vqP1H{N(lotQ^+=Qg6MdLXgZ5XF6lz5j$st$kmrb|xawF& zK}-B9;R&of{><-szM9wQqKljw;yWJsd;AY<;bj2gS@M{GBpi+jC+$xke6> z-xED0+TrI(JEB8xMIDPsFj+--1^X%=oj*`nLgL6#Qgx(L7(}L3ov^-x*<{lb=YuG} zL@wHMUp(>I4a%A1uTPwtO1YLZe&-!Mk`tdlaY0q_4GMKhYSjshCF_WroF*qpKB+op zQMg=H!9C;yvXp#GR+Dg2+5X$uhD4FgB$4R2O&XDwF7OPnW`4P*!$+k;hxv$^4?gq`sG3 z{^XRG)Umk!^IU-gsq2FRmjEqj diff --git a/languages/robotstxt-mediaaudit-es_ES.po b/languages/robotstxt-mediaaudit-es_ES.po index 3b58953..0618d7d 100644 --- a/languages/robotstxt-mediaaudit-es_ES.po +++ b/languages/robotstxt-mediaaudit-es_ES.po @@ -2,10 +2,10 @@ # This file is distributed under the GPL-3.0-or-later. msgid "" msgstr "" -"Project-Id-Version: Media Audit (by ROBOTSTXT) 1.5.0\n" +"Project-Id-Version: Media Audit (by ROBOTSTXT) 1.6.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/robotstxt-" "mediaaudit\n" -"POT-Creation-Date: 2026-05-02T07:36:54+00:00\n" +"POT-Creation-Date: 2026-05-05T10:39:07+00:00\n" "PO-Revision-Date: 2026-05-01 07:41+0000\n" "Last-Translator: Javier Casares \n" "Language-Team: Spanish (Spain) \n" @@ -45,349 +45,582 @@ msgstr "" msgid "https://www.robotstxt.es/" msgstr "" -#: includes/Admin/AuditPage.php:114 -msgid "Loading…" -msgstr "Cargando…" - -#: includes/Admin/AuditPage.php:115 -msgid "Error loading details." -msgstr "Error al cargar los detalles." - -#: includes/Admin/AuditPage.php:116 includes/Admin/AuditPage.php:192 -msgid "This image is not used in any post." -msgstr "Esta imagen no se usa en ninguna entrada." - -#: includes/Admin/AuditPage.php:117 includes/Admin/AuditPage.php:154 -msgid "Usage Details" -msgstr "Detalles de uso" - -#: includes/Admin/AuditPage.php:133 includes/Admin/Settings.php:325 -#: includes/Admin/ToolsPage.php:245 +#: includes/Admin/AttachmentDetailPage.php:40 includes/Admin/AuditPage.php:135 +#: includes/Admin/Settings.php:898 includes/Admin/ToolsPage.php:253 msgid "You do not have permission to access this page." msgstr "No tienes permiso para acceder a esta página." -#: includes/Admin/AuditPage.php:140 includes/Core/Plugin.php:99 -#: includes/Core/Plugin.php:100 includes/Core/Plugin.php:113 -#: includes/Core/Plugin.php:114 includes/Privacy/DataEraser.php:33 -#: includes/Privacy/DataExporter.php:45 -msgid "Media Audit" -msgstr "Auditoría de medios" - -#: includes/Admin/AuditPage.php:146 -msgid "Search" -msgstr "Buscar" - -#: includes/Admin/AuditPage.php:155 -msgid "Close" -msgstr "Cerrar" - -#: includes/Admin/AuditPage.php:173 includes/Admin/AuditPage.php:461 -#: includes/Admin/AuditPage.php:515 includes/Admin/AuditPage.php:648 -#: includes/Admin/AuditPage.php:680 includes/Admin/ToolsPage.php:105 -#: includes/Admin/ToolsPage.php:161 -msgid "Insufficient permissions." -msgstr "Permisos insuficientes." - -#: includes/Admin/AuditPage.php:178 +#: includes/Admin/AttachmentDetailPage.php:51 +#: includes/Admin/AttachmentDetailPage.php:56 includes/Admin/AuditPage.php:180 msgid "Invalid attachment ID." msgstr "ID de adjunto no válido." -#: includes/Admin/AuditPage.php:186 -msgid "Featured Image" -msgstr "Imagen destacada" +#: includes/Admin/AttachmentDetailPage.php:64 +msgid "← Media Audit" +msgstr "← Auditoría de medios" -#: includes/Admin/AuditPage.php:187 -msgid "Post Content" -msgstr "Contenido de la entrada" +#: includes/Admin/AttachmentDetailPage.php:69 +msgid "File Information" +msgstr "Información del archivo" -#: includes/Admin/AuditPage.php:188 -msgid "Custom Field" -msgstr "Campo personalizado" +#: includes/Admin/AttachmentDetailPage.php:81 +#: includes/Admin/MediaListTable.php:56 +msgid "ID" +msgstr "ID" -#: includes/Admin/AuditPage.php:196 -msgid "Post" -msgstr "Entrada" +#: includes/Admin/AttachmentDetailPage.php:87 includes/Admin/AuditPage.php:553 +#: includes/Admin/MediaListTable.php:55 includes/Privacy/DataExporter.php:261 +msgid "Filename" +msgstr "Nombre de archivo" -#: includes/Admin/AuditPage.php:197 -msgid "Type" -msgstr "Tipo" +#: includes/Admin/AttachmentDetailPage.php:94 includes/Admin/AuditPage.php:554 +#: includes/Privacy/DataExporter.php:265 +msgid "File URL" +msgstr "URL del archivo" -#: includes/Admin/AuditPage.php:198 -msgid "Context" -msgstr "Contexto" +#: includes/Admin/AttachmentDetailPage.php:102 includes/Admin/AuditPage.php:555 +msgid "MIME Type" +msgstr "Tipo MIME" -#: includes/Admin/AuditPage.php:199 -msgid "Status" -msgstr "Estado" +#: includes/Admin/AttachmentDetailPage.php:112 +msgid "File size" +msgstr "Tamaño del archivo" -#: includes/Admin/AuditPage.php:242 +#: includes/Admin/AttachmentDetailPage.php:118 +msgid "Internal scan date" +msgstr "Fecha del escaneo interno" + +#: includes/Admin/AttachmentDetailPage.php:124 includes/Admin/AuditPage.php:558 +#: includes/Admin/MediaListTable.php:59 +msgid "External Status" +msgstr "Estado externo" + +#: includes/Admin/AttachmentDetailPage.php:139 includes/Admin/AuditPage.php:244 msgid "Internal Usage" msgstr "Uso interno" -#: includes/Admin/AuditPage.php:290 +#: includes/Admin/AttachmentDetailPage.php:144 includes/Admin/AuditPage.php:188 +msgid "Featured Image" +msgstr "Imagen destacada" + +#: includes/Admin/AttachmentDetailPage.php:145 includes/Admin/AuditPage.php:189 +msgid "Post Content" +msgstr "Contenido de la entrada" + +#: includes/Admin/AttachmentDetailPage.php:146 includes/Admin/AuditPage.php:190 +msgid "Custom Field" +msgstr "Campo personalizado" + +#: includes/Admin/AttachmentDetailPage.php:150 +msgid "Not used in any post." +msgstr "Este archivo no se usa en ninguna entrada." + +#: includes/Admin/AttachmentDetailPage.php:154 includes/Admin/AuditPage.php:198 +msgid "Post" +msgstr "Entrada" + +#: includes/Admin/AttachmentDetailPage.php:155 includes/Admin/AuditPage.php:199 +msgid "Type" +msgstr "Tipo" + +#: includes/Admin/AttachmentDetailPage.php:156 includes/Admin/AuditPage.php:200 +msgid "Context" +msgstr "Contexto" + +#: includes/Admin/AttachmentDetailPage.php:157 includes/Admin/AuditPage.php:201 +#: includes/Admin/AuditPage.php:373 +msgid "Status" +msgstr "Estado" + +#: includes/Admin/AttachmentDetailPage.php:198 includes/Admin/AuditPage.php:293 msgid "External Scan Results" msgstr "Resultados del escaneo externo" +#: includes/Admin/AttachmentDetailPage.php:260 +msgid "No external scan data available." +msgstr "No hay datos de escaneo externo disponibles." + #. translators: %d: number of external matches -#: includes/Admin/AuditPage.php:314 +#: includes/Admin/AttachmentDetailPage.php:313 includes/Admin/AuditPage.php:323 #, php-format msgid "%d match" msgid_plural "%d matches" msgstr[0] "%d coincidencia" msgstr[1] "%d coincidencias" -#: includes/Admin/AuditPage.php:319 -msgid "No matches" -msgstr "Sin coincidencias" +#. translators: %s: scan date string +#: includes/Admin/AttachmentDetailPage.php:321 +#, php-format +msgid "scanned %s" +msgstr "escaneado el %s" -#: includes/Admin/AuditPage.php:330 +#: includes/Admin/AttachmentDetailPage.php:372 includes/Admin/AuditPage.php:565 +msgid "Alert Domains" +msgstr "Dominios de alerta" + +#: includes/Admin/AttachmentDetailPage.php:373 +msgid "" +"These domains are associated with copyright-protected content and may " +"indicate a copyright risk." +msgstr "" +"Estos dominios están asociados a contenido protegido por derechos de autor y " +"pueden indicar un riesgo de copyright." + +#: includes/Admin/AttachmentDetailPage.php:376 +#: includes/Admin/AttachmentDetailPage.php:392 +#: includes/Admin/AttachmentDetailPage.php:408 includes/Admin/AuditPage.php:371 msgid "Domain" msgstr "Dominio" -#: includes/Admin/AuditPage.php:331 +#: includes/Admin/AttachmentDetailPage.php:377 +#: includes/Admin/AttachmentDetailPage.php:393 +#: includes/Admin/AttachmentDetailPage.php:409 includes/Admin/AuditPage.php:372 msgid "Occurrences" msgstr "Apariciones" -#: includes/Admin/AuditPage.php:352 +#: includes/Admin/AttachmentDetailPage.php:389 includes/Admin/AuditPage.php:566 +msgid "Other Domains" +msgstr "Otros dominios" + +#: includes/Admin/AttachmentDetailPage.php:405 includes/Admin/AuditPage.php:567 +msgid "Ignored Domains" +msgstr "Dominios ignorados" + +#: includes/Admin/AttachmentDetailPage.php:447 +msgid "Pages with this image" +msgstr "Páginas con esta imagen" + +#: includes/Admin/AttachmentDetailPage.php:449 +#: includes/Admin/AttachmentDetailPage.php:550 +#: includes/Admin/AttachmentDetailPage.php:663 +msgid "Page URL" +msgstr "URL de la página" + +#: includes/Admin/AttachmentDetailPage.php:450 +msgid "Page Title" +msgstr "Título de la página" + +#: includes/Admin/AttachmentDetailPage.php:473 +msgid "Full image matches" +msgstr "Coincidencias exactas de imagen" + +#: includes/Admin/AttachmentDetailPage.php:474 +#: includes/Admin/AttachmentDetailPage.php:492 +#: includes/Admin/AttachmentDetailPage.php:551 +#: includes/Admin/AttachmentDetailPage.php:664 +msgid "Image URL" +msgstr "URL de la imagen" + +#: includes/Admin/AttachmentDetailPage.php:491 +msgid "Partial image matches" +msgstr "Coincidencias parciales de imagen" + +#: includes/Admin/AttachmentDetailPage.php:548 +msgid "Backlinks found by TinEye (sorted by crawl date, newest first)" +msgstr "" +"Backlinks encontrados por TinEye (ordenados por fecha de rastreo, más " +"reciente primero)" + +#: includes/Admin/AttachmentDetailPage.php:552 +msgid "Crawl date" +msgstr "Fecha de rastreo" + +#: includes/Admin/AttachmentDetailPage.php:599 +msgid "Face detected" +msgstr "Cara detectada" + +#: includes/Admin/AttachmentDetailPage.php:602 +msgid "Logo detected" +msgstr "Logo detectado" + +#: includes/Admin/AttachmentDetailPage.php:605 +msgid "Landmark detected" +msgstr "Monumento detectado" + +#: includes/Admin/AttachmentDetailPage.php:608 +msgid "Stock image" +msgstr "Imagen de banco" + +#. translators: %s: copyright holder name +#: includes/Admin/AttachmentDetailPage.php:615 +#, php-format +msgid "EXIF copyright: %s" +msgstr "Copyright EXIF: %s" + +#: includes/Admin/AttachmentDetailPage.php:620 +msgid "Risk flags" +msgstr "Indicadores de riesgo" + +#: includes/Admin/AttachmentDetailPage.php:622 +msgid "No risk flags detected." +msgstr "No se detectaron indicadores de riesgo." + +#: includes/Admin/AttachmentDetailPage.php:661 +msgid "Backlinks found by PicDefense" +msgstr "Backlinks encontrados por PicDefense" + +#: includes/Admin/AttachmentDetailPage.php:665 +msgid "Similarity" +msgstr "Similitud" + +#: includes/Admin/AttachmentDetailPage.php:694 +msgid "Labels" +msgstr "Etiquetas" + +#: includes/Admin/AuditPage.php:116 +msgid "Loading…" +msgstr "Cargando…" + +#: includes/Admin/AuditPage.php:117 +msgid "Error loading details." +msgstr "Error al cargar los detalles." + +#: includes/Admin/AuditPage.php:118 includes/Admin/AuditPage.php:194 +msgid "This image is not used in any post." +msgstr "Esta imagen no se usa en ninguna entrada." + +#: includes/Admin/AuditPage.php:119 includes/Admin/AuditPage.php:156 +msgid "Usage Details" +msgstr "Detalles de uso" + +#: includes/Admin/AuditPage.php:142 includes/Core/Plugin.php:109 +#: includes/Core/Plugin.php:110 includes/Core/Plugin.php:123 +#: includes/Core/Plugin.php:124 includes/Privacy/DataEraser.php:33 +#: includes/Privacy/DataExporter.php:45 +msgid "Media Audit" +msgstr "Auditoría de medios" + +#: includes/Admin/AuditPage.php:148 +msgid "Search" +msgstr "Buscar" + +#: includes/Admin/AuditPage.php:157 +msgid "Close" +msgstr "Cerrar" + +#: includes/Admin/AuditPage.php:175 includes/Admin/AuditPage.php:529 +#: includes/Admin/AuditPage.php:776 includes/Admin/AuditPage.php:808 +#: includes/Admin/ToolsPage.php:105 includes/Admin/ToolsPage.php:165 +msgid "Insufficient permissions." +msgstr "Permisos insuficientes." + +#: includes/Admin/AuditPage.php:328 +msgid "No matches" +msgstr "Sin coincidencias" + +#: includes/Admin/AuditPage.php:381 includes/Admin/AuditPage.php:488 +#: includes/Admin/MediaListTable.php:298 includes/Admin/MediaListTable.php:435 +msgid "Alert" +msgstr "Alerta" + +#: includes/Admin/AuditPage.php:403 msgid "Consensus Domains" msgstr "Dominios de consenso" #. translators: %d: number of providers that agree -#: includes/Admin/AuditPage.php:358 +#: includes/Admin/AuditPage.php:409 #, php-format msgid "%d provider" msgid_plural "%d providers" msgstr[0] "%d proveedor" msgstr[1] "%d proveedores" -#: includes/Admin/AuditPage.php:390 +#: includes/Admin/AuditPage.php:419 +msgid "View full report →" +msgstr "Ver informe completo →" + +#: includes/Admin/AuditPage.php:445 msgid "In Index" msgstr "En el índice" #. translators: %d: count of images not yet indexed -#: includes/Admin/AuditPage.php:394 +#: includes/Admin/AuditPage.php:449 #, php-format msgid "%d not yet indexed" msgstr "%d aún no indexadas" -#: includes/Admin/AuditPage.php:397 +#: includes/Admin/AuditPage.php:452 msgid "All indexed" msgstr "Todas indexadas" -#: includes/Admin/AuditPage.php:402 includes/Admin/MediaListTable.php:278 +#: includes/Admin/AuditPage.php:457 includes/Admin/MediaListTable.php:329 msgid "Scanned" msgstr "Escaneadas" #. translators: %d: percentage -#: includes/Admin/AuditPage.php:405 +#: includes/Admin/AuditPage.php:460 #, php-format msgid "%d%% of index" msgstr "%d%% del índice" -#: includes/Admin/AuditPage.php:412 +#: includes/Admin/AuditPage.php:467 msgid "Used" msgstr "Usadas" -#: includes/Admin/AuditPage.php:418 includes/Admin/MediaListTable.php:203 +#: includes/Admin/AuditPage.php:473 includes/Admin/MediaListTable.php:211 msgid "Unused" msgstr "Sin usar" -#: includes/Admin/AuditPage.php:425 +#: includes/Admin/AuditPage.php:480 msgid "External Matches" msgstr "Coincidencias externas" -#: includes/Admin/AuditPage.php:475 includes/Admin/AuditPage.php:529 +#: includes/Admin/AuditPage.php:543 msgid "Could not open output stream." msgstr "No se pudo abrir el flujo de salida." -#: includes/Admin/AuditPage.php:484 includes/Admin/AuditPage.php:537 -#: includes/Privacy/DataExporter.php:257 includes/Privacy/DataExporter.php:299 +#: includes/Admin/AuditPage.php:552 includes/Privacy/DataExporter.php:257 +#: includes/Privacy/DataExporter.php:299 msgid "Attachment ID" msgstr "ID del adjunto" -#: includes/Admin/AuditPage.php:485 includes/Admin/AuditPage.php:538 -#: includes/Admin/MediaListTable.php:52 includes/Privacy/DataExporter.php:261 -msgid "Filename" -msgstr "Nombre de archivo" - -#: includes/Admin/AuditPage.php:486 includes/Admin/AuditPage.php:539 -#: includes/Privacy/DataExporter.php:265 -msgid "File URL" -msgstr "URL del archivo" - -#: includes/Admin/AuditPage.php:487 -msgid "MIME Type" -msgstr "Tipo MIME" - -#: includes/Admin/AuditPage.php:488 +#: includes/Admin/AuditPage.php:556 msgid "File Size (bytes)" msgstr "Tamaño del archivo (bytes)" -#: includes/Admin/AuditPage.php:489 includes/Admin/AuditPage.php:540 -#: includes/Admin/MediaListTable.php:56 -msgid "External Status" -msgstr "Estado externo" +#: includes/Admin/AuditPage.php:557 +msgid "Internal Scan Date" +msgstr "Fecha del escaneo interno" -#: includes/Admin/AuditPage.php:490 includes/Admin/MediaListTable.php:54 +#: includes/Admin/AuditPage.php:559 +msgid "Has Alert" +msgstr "Tiene alerta" + +#: includes/Admin/AuditPage.php:560 includes/Admin/MediaListTable.php:57 msgid "Usage Count" msgstr "Número de usos" -#: includes/Admin/AuditPage.php:491 -msgid "Used In (post titles)" -msgstr "Usado en (títulos de entradas)" +#: includes/Admin/AuditPage.php:561 +msgid "Used In" +msgstr "Usado en" -#: includes/Admin/AuditPage.php:541 includes/Admin/MediaListTable.php:57 -msgid "Last Scanned" -msgstr "Último escaneo" +#: includes/Admin/AuditPage.php:562 +msgid "Google Vision — Matches" +msgstr "Google Vision — Coincidencias" -#: includes/Admin/AuditPage.php:542 includes/Privacy/DataExporter.php:303 -msgid "Provider" -msgstr "Proveedor" +#: includes/Admin/AuditPage.php:563 +msgid "TinEye — Matches" +msgstr "TinEye — Coincidencias" -#: includes/Admin/AuditPage.php:543 includes/Privacy/DataExporter.php:307 -msgid "Match Count" -msgstr "Número de coincidencias" +#: includes/Admin/AuditPage.php:564 +msgid "PicDefense — Matches" +msgstr "PicDefense — Coincidencias" -#: includes/Admin/AuditPage.php:544 -msgid "Top Domains" -msgstr "Dominios principales" +#: includes/Admin/AuditPage.php:748 +msgid "Yes" +msgstr "Sí" -#: includes/Admin/MediaListTable.php:51 +#: includes/Admin/AuditPage.php:748 +msgid "No" +msgstr "No" + +#: includes/Admin/MediaListTable.php:54 msgid "Thumbnail" msgstr "Miniatura" -#: includes/Admin/MediaListTable.php:53 -msgid "ID" -msgstr "ID" - -#: includes/Admin/MediaListTable.php:55 +#: includes/Admin/MediaListTable.php:58 msgid "Usages" msgstr "Usos" -#: includes/Admin/MediaListTable.php:81 +#: includes/Admin/MediaListTable.php:60 +msgid "Last Scanned" +msgstr "Último escaneo" + +#: includes/Admin/MediaListTable.php:84 msgid "Run External Scan" msgstr "Ejecutar escaneo externo" -#: includes/Admin/MediaListTable.php:82 +#: includes/Admin/MediaListTable.php:85 msgid "Purge External Data" msgstr "Purgar datos externos" -#: includes/Admin/MediaListTable.php:83 +#: includes/Admin/MediaListTable.php:86 msgid "Export CSV" msgstr "Exportar CSV" -#: includes/Admin/MediaListTable.php:84 -msgid "Export External Results CSV" -msgstr "Exportar CSV de resultados externos" +#: includes/Admin/MediaListTable.php:87 +msgid "Export CSV (Alerts only)" +msgstr "Exportar CSV (solo alertas)" -#: includes/Admin/MediaListTable.php:168 +#: includes/Admin/MediaListTable.php:171 msgid "Edit" msgstr "Editar" -#: includes/Admin/MediaListTable.php:173 +#: includes/Admin/MediaListTable.php:176 msgid "View Details" msgstr "Ver detalles" -#: includes/Admin/MediaListTable.php:239 +#: includes/Admin/MediaListTable.php:181 +msgid "Full Report" +msgstr "Informe completo" + +#: includes/Admin/MediaListTable.php:247 msgid "(no title)" msgstr "(sin título)" #. translators: %d: number of additional usages -#: includes/Admin/MediaListTable.php:254 +#: includes/Admin/MediaListTable.php:262 #, php-format msgid "+ %d more…" msgstr "+ %d más…" -#: includes/Admin/MediaListTable.php:276 includes/Admin/ToolsPage.php:580 -#: includes/Admin/ToolsPage.php:581 includes/Admin/ToolsPage.php:582 -msgid "Pending" -msgstr "Pendiente" - -#: includes/Admin/MediaListTable.php:277 -msgid "Queued" -msgstr "En cola" - -#: includes/Admin/MediaListTable.php:279 -msgid "Matches Found" -msgstr "Coincidencias encontradas" - -#: includes/Admin/MediaListTable.php:280 -msgid "Error" -msgstr "Error" - -#: includes/Admin/MediaListTable.php:308 +#: includes/Admin/MediaListTable.php:320 includes/Admin/MediaListTable.php:359 msgid "View Results" msgstr "Ver resultados" +#: includes/Admin/MediaListTable.php:327 includes/Admin/ToolsPage.php:589 +#: includes/Admin/ToolsPage.php:590 includes/Admin/ToolsPage.php:591 +msgid "Pending" +msgstr "Pendiente" + +#: includes/Admin/MediaListTable.php:328 +msgid "Queued" +msgstr "En cola" + +#: includes/Admin/MediaListTable.php:330 +msgid "Matches Found" +msgstr "Coincidencias encontradas" + +#: includes/Admin/MediaListTable.php:331 +msgid "Error" +msgstr "Error" + #. translators: %s: human-readable time difference, e.g. "3 days" -#: includes/Admin/MediaListTable.php:350 +#: includes/Admin/MediaListTable.php:401 #, php-format msgid "%s ago" msgstr "hace %s" -#: includes/Admin/MediaListTable.php:380 +#: includes/Admin/MediaListTable.php:431 msgid "All statuses" msgstr "Todos los estados" -#: includes/Admin/MediaListTable.php:394 +#: includes/Admin/MediaListTable.php:450 msgid "All post types" msgstr "Todos los tipos de entrada" -#: includes/Admin/MediaListTable.php:409 +#: includes/Admin/MediaListTable.php:465 msgid "Unused only" msgstr "Solo sin usar" -#: includes/Admin/MediaListTable.php:412 +#: includes/Admin/MediaListTable.php:468 msgid "Filter" msgstr "Filtrar" -#: includes/Admin/MediaListTable.php:422 +#: includes/Admin/MediaListTable.php:478 msgid "" "No indexed attachments found. Run wp mra scan-internal to populate the index." msgstr "" "No se encontraron adjuntos indexados. Ejecuta wp mra scan-internal para " "poblar el índice." -#: includes/Admin/Settings.php:47 +#: includes/Admin/Settings.php:203 msgid "General" msgstr "General" -#: includes/Admin/Settings.php:54 -msgid "Delete data on uninstall" -msgstr "Eliminar datos al desinstalar" - -#: includes/Admin/Settings.php:62 +#: includes/Admin/Settings.php:204 msgid "API Credentials" msgstr "Credenciales de API" -#: includes/Admin/Settings.php:69 -msgid "Google Cloud Vision API Key" -msgstr "Clave de API de Google Cloud Vision" +#: includes/Admin/Settings.php:205 +msgid "Filters" +msgstr "Filtros" -#: includes/Admin/Settings.php:77 -msgid "TinEye API Key" -msgstr "Clave de API de TinEye" - -#: includes/Admin/Settings.php:85 +#: includes/Admin/Settings.php:206 msgid "External Scanning" msgstr "Escaneo externo" -#: includes/Admin/Settings.php:92 +#: includes/Admin/Settings.php:249 +msgid "Delete data on uninstall" +msgstr "Eliminar datos al desinstalar" + +#: includes/Admin/Settings.php:265 +msgid "Google Cloud Vision API Key" +msgstr "Clave de API de Google Cloud Vision" + +#: includes/Admin/Settings.php:273 +msgid "TinEye API Key" +msgstr "Clave de API de TinEye" + +#: includes/Admin/Settings.php:281 +msgid "PicDefense User ID" +msgstr "ID de usuario PicDefense" + +#: includes/Admin/Settings.php:289 +msgid "PicDefense API Key" +msgstr "Clave API de PicDefense" + +#: includes/Admin/Settings.php:298 +msgid "Alert Hostnames" +msgstr "Hostnames de alerta" + +#: includes/Admin/Settings.php:305 includes/Admin/Settings.php:320 +msgid "Hostnames" +msgstr "Hostnames" + +#: includes/Admin/Settings.php:313 +msgid "Ignored Hostnames" +msgstr "Hostnames ignorados" + +#: includes/Admin/Settings.php:336 msgid "Batch Size" msgstr "Tamaño de lote" -#: includes/Admin/Settings.php:100 +#: includes/Admin/Settings.php:344 msgid "Rate Limit (requests/min)" msgstr "Límite de velocidad (solicitudes/min)" -#: includes/Admin/Settings.php:156 +#. translators: %s: comma-separated list of hostnames +#: includes/Admin/Settings.php:404 +#, php-format +msgid "" +"The following hostnames were removed from the exclusion list because they " +"already appear in the alert list: %s" +msgstr "" +"Los siguientes hostnames se eliminaron de la lista de exclusión porque ya " +"aparecen en la lista de alertas: %s" + +#: includes/Admin/Settings.php:505 +msgid "API Credentials Status" +msgstr "Estado de las credenciales de API" + +#: includes/Admin/Settings.php:513 +#: includes/External/GoogleVisionProvider.php:43 +msgid "Google Cloud Vision" +msgstr "Google Cloud Vision" + +#: includes/Admin/Settings.php:521 +msgid "TinEye" +msgstr "TinEye" + +#: includes/Admin/Settings.php:544 +msgid "" +"Matches from these hostnames are flagged as critical copyright alerts. " +"Entering example.com also covers all its subdomains." +msgstr "" +"Las coincidencias de estos hostnames se marcan como alertas críticas de " +"copyright. Introducir example.com también cubre todos sus subdominios." + +#: includes/Admin/Settings.php:557 +msgid "" +"Matches from these hostnames are silently ignored and not counted as " +"potential copyright issues. Entering example.com also covers all its " +"subdomains. A hostname already present in the alert list cannot be added " +"here." +msgstr "" +"Las coincidencias de estos hostnames se ignoran silenciosamente y no se " +"contabilizan como posibles problemas de copyright. Introducir example.com " +"también cubre todos sus subdominios. Un hostname ya presente en la lista de " +"alertas no puede añadirse aquí." + +#: includes/Admin/Settings.php:578 msgid "" "Remove all plugin data (tables and options) when the plugin is uninstalled." msgstr "" "Elimina todos los datos del plugin (tablas y opciones) cuando se desinstale " "el plugin." -#: includes/Admin/Settings.php:159 +#: includes/Admin/Settings.php:581 msgid "" "By default, data is preserved after uninstall. Enable this only if you want " "a clean removal." @@ -395,7 +628,7 @@ msgstr "" "Por defecto, los datos se conservan tras la desinstalación. Activa esto solo " "si deseas una eliminación completa." -#: includes/Admin/Settings.php:183 +#: includes/Admin/Settings.php:605 msgid "" "Required for Google Cloud Vision Web Detection. Obtain from the Google Cloud " "Console." @@ -403,27 +636,28 @@ msgstr "" "Necesario para la detección web de Google Cloud Vision. Obtener desde Google " "Cloud Console." -#: includes/Admin/Settings.php:186 includes/Admin/Settings.php:236 +#: includes/Admin/Settings.php:608 includes/Admin/Settings.php:658 +#: includes/Admin/Settings.php:736 msgid "View pricing" msgstr "Ver tarifas" -#: includes/Admin/Settings.php:192 +#: includes/Admin/Settings.php:614 msgid "Monthly requests" msgstr "Solicitudes mensuales" -#: includes/Admin/Settings.php:193 +#: includes/Admin/Settings.php:615 msgid "Price per 1,000" msgstr "Precio por 1.000" -#: includes/Admin/Settings.php:198 +#: includes/Admin/Settings.php:620 msgid "First 1,000" msgstr "Primeras 1.000" -#: includes/Admin/Settings.php:199 +#: includes/Admin/Settings.php:621 msgid "Free" msgstr "Gratis" -#: includes/Admin/Settings.php:233 +#: includes/Admin/Settings.php:655 msgid "" "Required for TinEye reverse image search. Obtain from your TinEye Commercial " "account." @@ -431,37 +665,60 @@ msgstr "" "Necesario para la búsqueda inversa de imágenes de TinEye. Obtener desde tu " "cuenta comercial de TinEye." -#: includes/Admin/Settings.php:242 +#: includes/Admin/Settings.php:664 msgid "Bundle" msgstr "Plan" -#: includes/Admin/Settings.php:243 +#: includes/Admin/Settings.php:665 msgid "Searches" msgstr "Búsquedas" -#: includes/Admin/Settings.php:244 +#: includes/Admin/Settings.php:666 msgid "Price" msgstr "Precio" -#: includes/Admin/Settings.php:249 +#: includes/Admin/Settings.php:671 msgid "Starter" msgstr "Inicial" -#: includes/Admin/Settings.php:254 +#: includes/Admin/Settings.php:676 msgid "Standard" msgstr "Estándar" -#: includes/Admin/Settings.php:259 +#: includes/Admin/Settings.php:681 msgid "Professional" msgstr "Profesional" -#: includes/Admin/Settings.php:288 +#: includes/Admin/Settings.php:709 +msgid "" +"Required for PicDefense copyright risk analysis. Your PicDefense account " +"user ID." +msgstr "" +"Necesario para el análisis de riesgo de copyright de PicDefense. ID de " +"usuario de tu cuenta PicDefense." + +#: includes/Admin/Settings.php:733 +msgid "" +"Required for PicDefense copyright risk analysis. Your PicDefense API key." +msgstr "" +"Necesario para el análisis de riesgo de copyright de PicDefense. Clave de " +"API de PicDefense." + +#: includes/Admin/Settings.php:768 includes/Admin/Settings.php:799 +msgid "" +"One hostname per line. example.com covers all its subdomains. Explicit " +"wildcard: *.example.com." +msgstr "" +"Un hostname por línea. example.com también cubre todos sus subdominios. " +"Comodín explícito: *.example.com." + +#: includes/Admin/Settings.php:824 msgid "Number of images to scan per scheduled batch (1–100). Default: 10." msgstr "" "Número de imágenes a escanear por lote programado (1–100). Predeterminado: " "10." -#: includes/Admin/Settings.php:313 +#: includes/Admin/Settings.php:849 msgid "Maximum API requests per minute per provider (1–60). Default: 10." msgstr "" "Máximo de solicitudes de API por minuto por proveedor (1–60). " @@ -479,23 +736,23 @@ msgstr "Detenido." msgid "An error occurred." msgstr "Se ha producido un error." -#: includes/Admin/ToolsPage.php:139 +#: includes/Admin/ToolsPage.php:143 msgid "Invalid batch type." msgstr "Tipo de lote no válido." -#: includes/Admin/ToolsPage.php:256 +#: includes/Admin/ToolsPage.php:264 msgid "System Status" msgstr "Estado del sistema" -#: includes/Admin/ToolsPage.php:259 +#: includes/Admin/ToolsPage.php:267 msgid "Operations" msgstr "Operaciones" -#: includes/Admin/ToolsPage.php:262 +#: includes/Admin/ToolsPage.php:270 msgid "Direct scan runner" msgstr "Ejecutor de escaneo directo" -#: includes/Admin/ToolsPage.php:264 +#: includes/Admin/ToolsPage.php:272 msgid "" "Run scan batches directly from your browser without relying on background " "jobs. Useful when WP-Cron is disabled or Action Scheduler is not running. " @@ -506,76 +763,80 @@ msgstr "" "Scheduler no está en ejecución. Mantén esta pestaña abierta mientras se " "procesa." -#: includes/Admin/ToolsPage.php:300 +#: includes/Admin/ToolsPage.php:308 msgid "not installed" msgstr "no instalado" -#: includes/Admin/ToolsPage.php:358 +#: includes/Admin/ToolsPage.php:366 msgid "Internal scan scheduled." msgstr "Escaneo interno programado." -#: includes/Admin/ToolsPage.php:359 +#: includes/Admin/ToolsPage.php:367 msgid "External scan scheduled." msgstr "Escaneo externo programado." -#: includes/Admin/ToolsPage.php:360 +#: includes/Admin/ToolsPage.php:368 msgid "Failed scans re-queued. Background scan scheduled." msgstr "Escaneos fallidos reencolados. Escaneo en segundo plano programado." -#: includes/Admin/ToolsPage.php:361 +#: includes/Admin/ToolsPage.php:369 +msgid "Provider registry synced. New scans scheduled." +msgstr "Registro de proveedores sincronizado. Nuevos escaneos programados." + +#: includes/Admin/ToolsPage.php:370 msgid "Usage data cleared. Background scan scheduled." msgstr "Datos de uso eliminados. Escaneo en segundo plano programado." -#: includes/Admin/ToolsPage.php:362 +#: includes/Admin/ToolsPage.php:371 msgid "Index cleared. Fresh indexing scheduled." msgstr "Índice eliminado. Re-indexación programada." -#: includes/Admin/ToolsPage.php:363 +#: includes/Admin/ToolsPage.php:372 msgid "External scan data purged." msgstr "Datos de escaneo externo eliminados." -#: includes/Admin/ToolsPage.php:364 +#: includes/Admin/ToolsPage.php:373 msgid "All data reset. Fresh indexing scheduled." msgstr "Todos los datos restablecidos. Re-indexación programada." -#: includes/Admin/ToolsPage.php:367 +#: includes/Admin/ToolsPage.php:376 msgid "Operation completed." msgstr "Operación completada." -#: includes/Admin/ToolsPage.php:411 +#: includes/Admin/ToolsPage.php:420 msgid "Database schema" msgstr "Esquema de base de datos" #. translators: %s: version number -#: includes/Admin/ToolsPage.php:417 +#: includes/Admin/ToolsPage.php:426 #, php-format msgid "v%s – up to date" msgstr "v%s – actualizado" #. translators: 1: stored version, 2: expected version -#: includes/Admin/ToolsPage.php:423 +#: includes/Admin/ToolsPage.php:432 #, php-format msgid "Installed: %1$s — Required: %2$s" msgstr "Instalado: %1$s — Requerido: %2$s" -#: includes/Admin/ToolsPage.php:432 +#: includes/Admin/ToolsPage.php:441 msgid "Deactivate and reactivate the plugin to apply pending migrations." msgstr "" "Desactiva y reactiva el plugin para aplicar las migraciones pendientes." -#: includes/Admin/ToolsPage.php:439 +#: includes/Admin/ToolsPage.php:448 msgid "Action Scheduler" msgstr "Action Scheduler" -#: includes/Admin/ToolsPage.php:442 +#: includes/Admin/ToolsPage.php:451 msgid "Available" msgstr "Disponible" -#: includes/Admin/ToolsPage.php:444 +#: includes/Admin/ToolsPage.php:453 msgid "Not available" msgstr "No disponible" -#: includes/Admin/ToolsPage.php:449 +#: includes/Admin/ToolsPage.php:458 msgid "" "Install and activate the Action Scheduler plugin. Background scanning will " "not work without it." @@ -583,19 +844,19 @@ msgstr "" "Instala y activa el plugin Action Scheduler. El escaneo en segundo plano no " "funcionará sin él." -#: includes/Admin/ToolsPage.php:456 +#: includes/Admin/ToolsPage.php:465 msgid "WP-Cron" msgstr "WP-Cron" -#: includes/Admin/ToolsPage.php:459 +#: includes/Admin/ToolsPage.php:468 msgid "Disabled (DISABLE_WP_CRON)" msgstr "Desactivado (DISABLE_WP_CRON)" -#: includes/Admin/ToolsPage.php:461 +#: includes/Admin/ToolsPage.php:470 msgid "Enabled" msgstr "Activado" -#: includes/Admin/ToolsPage.php:466 +#: includes/Admin/ToolsPage.php:475 msgid "" "Background jobs will not fire automatically. Trigger the cron externally or " "use WP-CLI:" @@ -603,91 +864,91 @@ msgstr "" "Los trabajos en segundo plano no se ejecutarán automáticamente. Activa el " "cron externamente o usa WP-CLI:" -#: includes/Admin/ToolsPage.php:474 +#: includes/Admin/ToolsPage.php:483 msgid "Internal index" msgstr "Índice interno" #. translators: 1: indexed count, 2: total images -#: includes/Admin/ToolsPage.php:479 +#: includes/Admin/ToolsPage.php:488 #, php-format msgid "%1$s / %2$s images indexed" msgstr "%1$s / %2$s imágenes indexadas" #. translators: %s: formatted count -#: includes/Admin/ToolsPage.php:490 +#: includes/Admin/ToolsPage.php:499 #, php-format msgid "%s image not yet indexed." msgid_plural "%s images not yet indexed." msgstr[0] "%s imagen aún no indexada." msgstr[1] "%s imágenes aún no indexadas." -#: includes/Admin/ToolsPage.php:494 +#: includes/Admin/ToolsPage.php:503 msgid "Schedule an internal scan below." msgstr "Programa un escaneo interno más abajo." -#: includes/Admin/ToolsPage.php:502 +#: includes/Admin/ToolsPage.php:511 msgid "Usage scan" msgstr "Escaneo de uso" #. translators: 1: scanned count, 2: total indexed -#: includes/Admin/ToolsPage.php:507 +#: includes/Admin/ToolsPage.php:516 #, php-format msgid "%1$s / %2$s scanned for usage" msgstr "%1$s / %2$s escaneadas de uso" #. translators: %s: formatted count -#: includes/Admin/ToolsPage.php:518 +#: includes/Admin/ToolsPage.php:527 #, php-format msgid "%s pending." msgid_plural "%s pending." msgstr[0] "%s pendiente." msgstr[1] "%s pendientes." -#: includes/Admin/ToolsPage.php:539 includes/Admin/ToolsPage.php:736 +#: includes/Admin/ToolsPage.php:548 includes/Admin/ToolsPage.php:752 msgid "External scan" msgstr "Escaneo externo" #. translators: 1: scanned 2: matches 3: queued 4: pending 5: errors -#: includes/Admin/ToolsPage.php:544 +#: includes/Admin/ToolsPage.php:553 #, php-format msgid "%1$s scanned · %2$s matches · %3$s queued · %4$s pending · %5$s errors" msgstr "" "%1$s escaneadas · %2$s coincidencias · %3$s en cola · %4$s pendientes · %5$s " "errores" -#: includes/Admin/ToolsPage.php:555 +#: includes/Admin/ToolsPage.php:564 msgid "" "Some scans failed. Check that API keys are configured correctly in Settings." msgstr "" "Algunos escaneos fallaron. Verifica que las claves de API están configuradas " "correctamente en Ajustes." -#: includes/Admin/ToolsPage.php:557 +#: includes/Admin/ToolsPage.php:566 msgid "Schedule an external scan below to process pending items." msgstr "" "Programa un escaneo externo más abajo para procesar los elementos pendientes." -#: includes/Admin/ToolsPage.php:575 +#: includes/Admin/ToolsPage.php:584 msgid "Scheduled jobs" msgstr "Trabajos programados" -#: includes/Admin/ToolsPage.php:578 +#: includes/Admin/ToolsPage.php:587 msgid "Action Scheduler not available." msgstr "Action Scheduler no disponible." -#: includes/Admin/ToolsPage.php:580 +#: includes/Admin/ToolsPage.php:589 msgid "Index:" msgstr "Índice:" -#: includes/Admin/ToolsPage.php:581 +#: includes/Admin/ToolsPage.php:590 msgid "Usage:" msgstr "Uso:" -#: includes/Admin/ToolsPage.php:582 +#: includes/Admin/ToolsPage.php:591 msgid "External:" msgstr "Externo:" -#: includes/Admin/ToolsPage.php:587 +#: includes/Admin/ToolsPage.php:596 msgid "" "There is work to do but no background job is scheduled. Use the operations " "below." @@ -695,20 +956,20 @@ msgstr "" "Hay trabajo pendiente pero no hay ningún trabajo en segundo plano " "programado. Usa las operaciones de abajo." -#: includes/Admin/ToolsPage.php:589 +#: includes/Admin/ToolsPage.php:598 msgid "WP-Cron is disabled. Jobs will not fire automatically." msgstr "" "WP-Cron está desactivado. Los trabajos no se ejecutarán automáticamente." -#: includes/Admin/ToolsPage.php:599 +#: includes/Admin/ToolsPage.php:608 msgid "WP-CLI commands to process scans manually:" msgstr "Comandos WP-CLI para procesar escaneos manualmente:" -#: includes/Admin/ToolsPage.php:616 +#: includes/Admin/ToolsPage.php:625 msgid "Schedule internal scan" msgstr "Programar escaneo interno" -#: includes/Admin/ToolsPage.php:617 +#: includes/Admin/ToolsPage.php:626 msgid "" "Queue a background job to index all unindexed media files and scan their " "usage across posts, pages, and custom fields. Safe to run at any time — will " @@ -719,11 +980,11 @@ msgstr "" "Es seguro ejecutarlo en cualquier momento: no reprocesará el trabajo ya " "completado." -#: includes/Admin/ToolsPage.php:623 +#: includes/Admin/ToolsPage.php:632 msgid "Schedule external scan" msgstr "Programar escaneo externo" -#: includes/Admin/ToolsPage.php:624 +#: includes/Admin/ToolsPage.php:633 msgid "" "Mark all pending attachments as queued and launch a background reverse-image-" "search via the configured providers. Requires API keys in Settings." @@ -732,11 +993,11 @@ msgstr "" "inversa de imágenes en segundo plano a través de los proveedores " "configurados. Requiere claves de API en Ajustes." -#: includes/Admin/ToolsPage.php:630 +#: includes/Admin/ToolsPage.php:639 msgid "Requeue scan errors" msgstr "Reencolar errores de escaneo" -#: includes/Admin/ToolsPage.php:631 +#: includes/Admin/ToolsPage.php:640 msgid "" "Re-queues only the attachments that failed with an error on the last " "external scan run. Does not affect already-scanned items. Useful to retry " @@ -746,11 +1007,25 @@ msgstr "" "del escaneo externo. No afecta a los elementos ya escaneados. Útil para " "reintentar después de corregir problemas con las claves de API." -#: includes/Admin/ToolsPage.php:640 +#: includes/Admin/ToolsPage.php:646 +msgid "Sync provider registry" +msgstr "Sincronizar registro de proveedores" + +#: includes/Admin/ToolsPage.php:647 +msgid "" +"Creates scan entries for any newly registered external providers. Run this " +"after adding a new provider via the mra/external/providers filter. Already-" +"scanned attachments are not affected." +msgstr "" +"Crea entradas de escaneo para los proveedores externos recién registrados. " +"Ejecútalo después de añadir un nuevo proveedor mediante el filtro mra/" +"external/providers. Los archivos ya escaneados no se ven afectados." + +#: includes/Admin/ToolsPage.php:656 msgid "Reset usage data" msgstr "Restablecer datos de uso" -#: includes/Admin/ToolsPage.php:641 +#: includes/Admin/ToolsPage.php:657 msgid "" "Clears all usage rows and resets the usage-scan flag for every indexed " "attachment. File metadata in the index is preserved. A background usage scan " @@ -760,15 +1035,15 @@ msgstr "" "para cada adjunto indexado. Los metadatos del archivo en el índice se " "conservan. Se programa un escaneo en segundo plano inmediatamente después." -#: includes/Admin/ToolsPage.php:643 +#: includes/Admin/ToolsPage.php:659 msgid "This will delete all usage data. Continue?" msgstr "Esto eliminará todos los datos de uso. ¿Continuar?" -#: includes/Admin/ToolsPage.php:647 +#: includes/Admin/ToolsPage.php:663 msgid "Re-index media library" msgstr "Re-indexar la biblioteca de medios" -#: includes/Admin/ToolsPage.php:648 +#: includes/Admin/ToolsPage.php:664 msgid "" "Deletes all index and usage entries, then schedules a full fresh re-index. " "External scan results are not affected. Useful if many media files have been " @@ -778,15 +1053,15 @@ msgstr "" "indexación completa. Los resultados del escaneo externo no se ven afectados. " "Útil si se han añadido o eliminado muchos archivos multimedia." -#: includes/Admin/ToolsPage.php:650 +#: includes/Admin/ToolsPage.php:666 msgid "This will delete all index and usage data. Continue?" msgstr "Esto eliminará todos los datos del índice y de uso. ¿Continuar?" -#: includes/Admin/ToolsPage.php:654 +#: includes/Admin/ToolsPage.php:670 msgid "Purge external data" msgstr "Purgar datos externos" -#: includes/Admin/ToolsPage.php:655 +#: includes/Admin/ToolsPage.php:671 msgid "" "Deletes all external scan results and resets every attachment's external " "status to pending. Use this before switching API providers or to force a " @@ -796,15 +1071,15 @@ msgstr "" "externo de cada adjunto a pendiente. Úsalo antes de cambiar de proveedores " "de API o para forzar un escaneo completo." -#: includes/Admin/ToolsPage.php:657 +#: includes/Admin/ToolsPage.php:673 msgid "This will delete all external scan results. Continue?" msgstr "Esto eliminará todos los resultados del escaneo externo. ¿Continuar?" -#: includes/Admin/ToolsPage.php:661 +#: includes/Admin/ToolsPage.php:677 msgid "Reset all data" msgstr "Restablecer todos los datos" -#: includes/Admin/ToolsPage.php:662 +#: includes/Admin/ToolsPage.php:678 msgid "" "Truncates all three plugin tables (index, usage, external results) and " "schedules a fresh indexing run. Use this to start completely from scratch." @@ -812,7 +1087,7 @@ msgstr "" "Vacía las tres tablas del plugin (índice, uso, resultados externos) y " "programa una nueva indexación. Úsalo para empezar completamente desde cero." -#: includes/Admin/ToolsPage.php:664 +#: includes/Admin/ToolsPage.php:680 msgid "" "This will permanently delete ALL plugin data and cannot be undone. Are you " "absolutely sure?" @@ -820,11 +1095,11 @@ msgstr "" "Esto eliminará TODOS los datos del plugin de forma permanente y no se puede " "deshacer. ¿Estás absolutamente seguro?" -#: includes/Admin/ToolsPage.php:675 +#: includes/Admin/ToolsPage.php:691 msgid "Destructive operations" msgstr "Operaciones destructivas" -#: includes/Admin/ToolsPage.php:678 +#: includes/Admin/ToolsPage.php:694 msgid "" "These operations permanently delete plugin data. Intended for forced " "rescans, troubleshooting, or starting fresh. A confirmation prompt will " @@ -834,11 +1109,11 @@ msgstr "" "para forzar re-escaneos, solucionar problemas o empezar desde cero. " "Aparecerá una confirmación antes de ejecutar cualquier acción." -#: includes/Admin/ToolsPage.php:726 +#: includes/Admin/ToolsPage.php:742 msgid "Index media files" msgstr "Indexar archivos multimedia" -#: includes/Admin/ToolsPage.php:727 +#: includes/Admin/ToolsPage.php:743 msgid "" "Discovers unindexed images and registers them in the plugin index. Run this " "first." @@ -846,18 +1121,18 @@ msgstr "" "Descubre imágenes no indexadas y las registra en el índice del plugin. " "Ejecútalo primero." -#: includes/Admin/ToolsPage.php:731 +#: includes/Admin/ToolsPage.php:747 msgid "Scan usage" msgstr "Escanear uso" -#: includes/Admin/ToolsPage.php:732 +#: includes/Admin/ToolsPage.php:748 msgid "" "Checks every indexed image for usage across posts, pages, and custom fields." msgstr "" "Comprueba el uso de cada imagen indexada en entradas, páginas y campos " "personalizados." -#: includes/Admin/ToolsPage.php:737 +#: includes/Admin/ToolsPage.php:753 msgid "" "Sends images to external providers for reverse-image search. Requires API " "keys in Settings." @@ -865,11 +1140,11 @@ msgstr "" "Envía imágenes a proveedores externos para búsqueda inversa de imágenes. " "Requiere claves de API en Ajustes." -#: includes/Admin/ToolsPage.php:754 +#: includes/Admin/ToolsPage.php:770 msgid "Run now" msgstr "Ejecutar ahora" -#: includes/Admin/ToolsPage.php:757 +#: includes/Admin/ToolsPage.php:773 msgid "Stop" msgstr "Detener" @@ -933,17 +1208,17 @@ msgstr "Ejecutando escaneos externos…" msgid "External scan complete. %d attachments processed." msgstr "Escaneo externo completo. %d adjuntos procesados." -#: includes/Core/Plugin.php:122 includes/Core/Plugin.php:123 +#: includes/Core/Plugin.php:132 includes/Core/Plugin.php:133 msgid "Tools" msgstr "Herramientas" -#: includes/Core/Plugin.php:135 includes/Core/Plugin.php:136 +#: includes/Core/Plugin.php:145 includes/Core/Plugin.php:146 msgid "Settings" msgstr "Ajustes" -#: includes/External/GoogleVisionProvider.php:43 -msgid "Google Cloud Vision" -msgstr "Google Cloud Vision" +#: includes/Core/Plugin.php:154 +msgid "Attachment Report" +msgstr "Informe del archivo adjunto" #: includes/Privacy/DataExporter.php:88 msgid "Media Audit – Indexed Files" @@ -965,139 +1240,26 @@ msgstr "Último escaneo (interno)" msgid "Last Scanned (external)" msgstr "Último escaneo (externo)" +#: includes/Privacy/DataExporter.php:303 +msgid "Provider" +msgstr "Proveedor" + +#: includes/Privacy/DataExporter.php:307 +msgid "Match Count" +msgstr "Número de coincidencias" + #: includes/Privacy/DataExporter.php:311 msgid "Scanned At" msgstr "Escaneado el" -#: includes/Admin/ToolsPage.php:365 -msgid "Provider registry synced. New scans scheduled." -msgstr "Registro de proveedores sincronizado. Nuevos escaneos programados." +#~ msgid "Used In (post titles)" +#~ msgstr "Usado en (títulos de entradas)" -#: includes/Admin/ToolsPage.php:642 -msgid "Sync provider registry" -msgstr "Sincronizar registro de proveedores" +#~ msgid "Top Domains" +#~ msgstr "Dominios principales" -#: includes/Admin/ToolsPage.php:643 -msgid "Creates scan entries for any newly registered external providers. Run this after adding a new provider via the mra/external/providers filter. Already-scanned attachments are not affected." -msgstr "Crea entradas de escaneo para los proveedores externos recién registrados. Ejecútalo después de añadir un nuevo proveedor mediante el filtro mra/external/providers. Los archivos ya escaneados no se ven afectados." - -#: includes/Admin/AttachmentDetailPage.php -msgid "Full Report" -msgstr "Informe completo" - -#: includes/Admin/AttachmentDetailPage.php -msgid "View full report →" -msgstr "Ver informe completo →" - -#: includes/Core/Plugin.php -msgid "Attachment Report" -msgstr "Informe del archivo adjunto" - -#: includes/Admin/AttachmentDetailPage.php -msgid "File Information" -msgstr "Información del archivo" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Pages with this image" -msgstr "Páginas con esta imagen" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Full image matches" -msgstr "Coincidencias exactas de imagen" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Partial image matches" -msgstr "Coincidencias parciales de imagen" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Backlinks found by TinEye (sorted by crawl date, newest first)" -msgstr "Backlinks encontrados por TinEye (ordenados por fecha de rastreo, más reciente primero)" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Page URL" -msgstr "URL de la página" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Crawl date" -msgstr "Fecha de rastreo" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Page Title" -msgstr "Título de la página" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Image URL" -msgstr "URL de la imagen" - -#: includes/Admin/AttachmentDetailPage.php -msgid "No external scan data available." -msgstr "No hay datos de escaneo externo disponibles." - -#: includes/Admin/AttachmentDetailPage.php -msgid "File size" -msgstr "Tamaño del archivo" - -#: includes/Admin/AttachmentDetailPage.php -msgid "← Media Audit" -msgstr "← Auditoría de medios" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Internal scan date" -msgstr "Fecha del escaneo interno" - -#: includes/Admin/AttachmentDetailPage.php -#, php-format -msgid "scanned %s" -msgstr "escaneado el %s" - -#: includes/Admin/Settings.php -msgid "PicDefense User ID" -msgstr "ID de usuario PicDefense" - -#: includes/Admin/Settings.php -msgid "PicDefense API Key" -msgstr "Clave API de PicDefense" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Face detected" -msgstr "Cara detectada" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Logo detected" -msgstr "Logo detectado" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Landmark detected" -msgstr "Monumento detectado" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Stock image" -msgstr "Imagen de banco" - -#: includes/Admin/AttachmentDetailPage.php -#, php-format -msgid "EXIF copyright: %s" -msgstr "Copyright EXIF: %s" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Similarity" -msgstr "Similitud" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Risk flags" -msgstr "Indicadores de riesgo" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Labels" -msgstr "Etiquetas" - -#: includes/Admin/AttachmentDetailPage.php -msgid "Backlinks found by PicDefense" -msgstr "Backlinks encontrados por PicDefense" - -#: includes/Admin/AttachmentDetailPage.php -msgid "No risk flags detected." -msgstr "No se detectaron indicadores de riesgo." +#~ msgid "Export External Results CSV" +#~ msgstr "Exportar CSV de resultados externos" #~ msgid "https://robotstxt.es/plugins/media-audit/" #~ msgstr "https://robotstxt.es/plugins/media-audit/" diff --git a/languages/robotstxt-mediaaudit.pot b/languages/robotstxt-mediaaudit.pot index 5510e77..5dc9c8b 100644 --- a/languages/robotstxt-mediaaudit.pot +++ b/languages/robotstxt-mediaaudit.pot @@ -2,14 +2,14 @@ # This file is distributed under the GPL-3.0-or-later. msgid "" msgstr "" -"Project-Id-Version: Media Audit (by ROBOTSTXT) 1.1.0\n" +"Project-Id-Version: Media Audit (by ROBOTSTXT) 1.6.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/robotstxt-mediaaudit\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2026-05-02T07:36:54+00:00\n" +"POT-Creation-Date: 2026-05-05T10:39:07+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.12.0\n" "X-Domain: robotstxt-mediaaudit\n" @@ -39,428 +39,670 @@ msgstr "" msgid "https://www.robotstxt.es/" msgstr "" -#: includes/Admin/AuditPage.php:114 -msgid "Loading…" -msgstr "" - -#: includes/Admin/AuditPage.php:115 -msgid "Error loading details." -msgstr "" - -#: includes/Admin/AuditPage.php:116 -#: includes/Admin/AuditPage.php:192 -msgid "This image is not used in any post." -msgstr "" - -#: includes/Admin/AuditPage.php:117 -#: includes/Admin/AuditPage.php:154 -msgid "Usage Details" -msgstr "" - -#: includes/Admin/AuditPage.php:133 -#: includes/Admin/Settings.php:325 -#: includes/Admin/ToolsPage.php:245 +#: includes/Admin/AttachmentDetailPage.php:40 +#: includes/Admin/AuditPage.php:135 +#: includes/Admin/Settings.php:898 +#: includes/Admin/ToolsPage.php:253 msgid "You do not have permission to access this page." msgstr "" -#: includes/Admin/AuditPage.php:140 -#: includes/Core/Plugin.php:99 -#: includes/Core/Plugin.php:100 -#: includes/Core/Plugin.php:113 -#: includes/Core/Plugin.php:114 -#: includes/Privacy/DataEraser.php:33 -#: includes/Privacy/DataExporter.php:45 -msgid "Media Audit" -msgstr "" - -#: includes/Admin/AuditPage.php:146 -msgid "Search" -msgstr "" - -#: includes/Admin/AuditPage.php:155 -msgid "Close" -msgstr "" - -#: includes/Admin/AuditPage.php:173 -#: includes/Admin/AuditPage.php:461 -#: includes/Admin/AuditPage.php:515 -#: includes/Admin/AuditPage.php:648 -#: includes/Admin/AuditPage.php:680 -#: includes/Admin/ToolsPage.php:105 -#: includes/Admin/ToolsPage.php:161 -msgid "Insufficient permissions." -msgstr "" - -#: includes/Admin/AuditPage.php:178 +#: includes/Admin/AttachmentDetailPage.php:51 +#: includes/Admin/AttachmentDetailPage.php:56 +#: includes/Admin/AuditPage.php:180 msgid "Invalid attachment ID." msgstr "" -#: includes/Admin/AuditPage.php:186 -msgid "Featured Image" +#: includes/Admin/AttachmentDetailPage.php:64 +msgid "← Media Audit" msgstr "" -#: includes/Admin/AuditPage.php:187 -msgid "Post Content" +#: includes/Admin/AttachmentDetailPage.php:69 +msgid "File Information" msgstr "" -#: includes/Admin/AuditPage.php:188 -msgid "Custom Field" +#: includes/Admin/AttachmentDetailPage.php:81 +#: includes/Admin/MediaListTable.php:56 +msgid "ID" msgstr "" -#: includes/Admin/AuditPage.php:196 -msgid "Post" +#: includes/Admin/AttachmentDetailPage.php:87 +#: includes/Admin/AuditPage.php:553 +#: includes/Admin/MediaListTable.php:55 +#: includes/Privacy/DataExporter.php:261 +msgid "Filename" msgstr "" -#: includes/Admin/AuditPage.php:197 -msgid "Type" +#: includes/Admin/AttachmentDetailPage.php:94 +#: includes/Admin/AuditPage.php:554 +#: includes/Privacy/DataExporter.php:265 +msgid "File URL" msgstr "" -#: includes/Admin/AuditPage.php:198 -msgid "Context" +#: includes/Admin/AttachmentDetailPage.php:102 +#: includes/Admin/AuditPage.php:555 +msgid "MIME Type" msgstr "" -#: includes/Admin/AuditPage.php:199 -msgid "Status" +#: includes/Admin/AttachmentDetailPage.php:112 +msgid "File size" msgstr "" -#: includes/Admin/AuditPage.php:242 +#: includes/Admin/AttachmentDetailPage.php:118 +msgid "Internal scan date" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:124 +#: includes/Admin/AuditPage.php:558 +#: includes/Admin/MediaListTable.php:59 +msgid "External Status" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:139 +#: includes/Admin/AuditPage.php:244 msgid "Internal Usage" msgstr "" -#: includes/Admin/AuditPage.php:290 +#: includes/Admin/AttachmentDetailPage.php:144 +#: includes/Admin/AuditPage.php:188 +msgid "Featured Image" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:145 +#: includes/Admin/AuditPage.php:189 +msgid "Post Content" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:146 +#: includes/Admin/AuditPage.php:190 +msgid "Custom Field" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:150 +msgid "Not used in any post." +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:154 +#: includes/Admin/AuditPage.php:198 +msgid "Post" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:155 +#: includes/Admin/AuditPage.php:199 +msgid "Type" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:156 +#: includes/Admin/AuditPage.php:200 +msgid "Context" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:157 +#: includes/Admin/AuditPage.php:201 +#: includes/Admin/AuditPage.php:373 +msgid "Status" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:198 +#: includes/Admin/AuditPage.php:293 msgid "External Scan Results" msgstr "" +#: includes/Admin/AttachmentDetailPage.php:260 +msgid "No external scan data available." +msgstr "" + #. translators: %d: number of external matches -#: includes/Admin/AuditPage.php:314 +#: includes/Admin/AttachmentDetailPage.php:313 +#: includes/Admin/AuditPage.php:323 #, php-format msgid "%d match" msgid_plural "%d matches" msgstr[0] "" msgstr[1] "" -#: includes/Admin/AuditPage.php:319 -msgid "No matches" +#. translators: %s: scan date string +#: includes/Admin/AttachmentDetailPage.php:321 +#, php-format +msgid "scanned %s" msgstr "" -#: includes/Admin/AuditPage.php:330 +#: includes/Admin/AttachmentDetailPage.php:372 +#: includes/Admin/AuditPage.php:565 +msgid "Alert Domains" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:373 +msgid "These domains are associated with copyright-protected content and may indicate a copyright risk." +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:376 +#: includes/Admin/AttachmentDetailPage.php:392 +#: includes/Admin/AttachmentDetailPage.php:408 +#: includes/Admin/AuditPage.php:371 msgid "Domain" msgstr "" -#: includes/Admin/AuditPage.php:331 +#: includes/Admin/AttachmentDetailPage.php:377 +#: includes/Admin/AttachmentDetailPage.php:393 +#: includes/Admin/AttachmentDetailPage.php:409 +#: includes/Admin/AuditPage.php:372 msgid "Occurrences" msgstr "" -#: includes/Admin/AuditPage.php:352 +#: includes/Admin/AttachmentDetailPage.php:389 +#: includes/Admin/AuditPage.php:566 +msgid "Other Domains" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:405 +#: includes/Admin/AuditPage.php:567 +msgid "Ignored Domains" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:447 +msgid "Pages with this image" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:449 +#: includes/Admin/AttachmentDetailPage.php:550 +#: includes/Admin/AttachmentDetailPage.php:663 +msgid "Page URL" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:450 +msgid "Page Title" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:473 +msgid "Full image matches" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:474 +#: includes/Admin/AttachmentDetailPage.php:492 +#: includes/Admin/AttachmentDetailPage.php:551 +#: includes/Admin/AttachmentDetailPage.php:664 +msgid "Image URL" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:491 +msgid "Partial image matches" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:548 +msgid "Backlinks found by TinEye (sorted by crawl date, newest first)" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:552 +msgid "Crawl date" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:599 +msgid "Face detected" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:602 +msgid "Logo detected" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:605 +msgid "Landmark detected" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:608 +msgid "Stock image" +msgstr "" + +#. translators: %s: copyright holder name +#: includes/Admin/AttachmentDetailPage.php:615 +#, php-format +msgid "EXIF copyright: %s" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:620 +msgid "Risk flags" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:622 +msgid "No risk flags detected." +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:661 +msgid "Backlinks found by PicDefense" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:665 +msgid "Similarity" +msgstr "" + +#: includes/Admin/AttachmentDetailPage.php:694 +msgid "Labels" +msgstr "" + +#: includes/Admin/AuditPage.php:116 +msgid "Loading…" +msgstr "" + +#: includes/Admin/AuditPage.php:117 +msgid "Error loading details." +msgstr "" + +#: includes/Admin/AuditPage.php:118 +#: includes/Admin/AuditPage.php:194 +msgid "This image is not used in any post." +msgstr "" + +#: includes/Admin/AuditPage.php:119 +#: includes/Admin/AuditPage.php:156 +msgid "Usage Details" +msgstr "" + +#: includes/Admin/AuditPage.php:142 +#: includes/Core/Plugin.php:109 +#: includes/Core/Plugin.php:110 +#: includes/Core/Plugin.php:123 +#: includes/Core/Plugin.php:124 +#: includes/Privacy/DataEraser.php:33 +#: includes/Privacy/DataExporter.php:45 +msgid "Media Audit" +msgstr "" + +#: includes/Admin/AuditPage.php:148 +msgid "Search" +msgstr "" + +#: includes/Admin/AuditPage.php:157 +msgid "Close" +msgstr "" + +#: includes/Admin/AuditPage.php:175 +#: includes/Admin/AuditPage.php:529 +#: includes/Admin/AuditPage.php:776 +#: includes/Admin/AuditPage.php:808 +#: includes/Admin/ToolsPage.php:105 +#: includes/Admin/ToolsPage.php:165 +msgid "Insufficient permissions." +msgstr "" + +#: includes/Admin/AuditPage.php:328 +msgid "No matches" +msgstr "" + +#: includes/Admin/AuditPage.php:381 +#: includes/Admin/AuditPage.php:488 +#: includes/Admin/MediaListTable.php:298 +#: includes/Admin/MediaListTable.php:435 +msgid "Alert" +msgstr "" + +#: includes/Admin/AuditPage.php:403 msgid "Consensus Domains" msgstr "" #. translators: %d: number of providers that agree -#: includes/Admin/AuditPage.php:358 +#: includes/Admin/AuditPage.php:409 #, php-format msgid "%d provider" msgid_plural "%d providers" msgstr[0] "" msgstr[1] "" -#: includes/Admin/AuditPage.php:390 +#: includes/Admin/AuditPage.php:419 +msgid "View full report →" +msgstr "" + +#: includes/Admin/AuditPage.php:445 msgid "In Index" msgstr "" #. translators: %d: count of images not yet indexed -#: includes/Admin/AuditPage.php:394 +#: includes/Admin/AuditPage.php:449 #, php-format msgid "%d not yet indexed" msgstr "" -#: includes/Admin/AuditPage.php:397 +#: includes/Admin/AuditPage.php:452 msgid "All indexed" msgstr "" -#: includes/Admin/AuditPage.php:402 -#: includes/Admin/MediaListTable.php:278 +#: includes/Admin/AuditPage.php:457 +#: includes/Admin/MediaListTable.php:329 msgid "Scanned" msgstr "" #. translators: %d: percentage -#: includes/Admin/AuditPage.php:405 +#: includes/Admin/AuditPage.php:460 #, php-format msgid "%d%% of index" msgstr "" -#: includes/Admin/AuditPage.php:412 +#: includes/Admin/AuditPage.php:467 msgid "Used" msgstr "" -#: includes/Admin/AuditPage.php:418 -#: includes/Admin/MediaListTable.php:203 +#: includes/Admin/AuditPage.php:473 +#: includes/Admin/MediaListTable.php:211 msgid "Unused" msgstr "" -#: includes/Admin/AuditPage.php:425 +#: includes/Admin/AuditPage.php:480 msgid "External Matches" msgstr "" -#: includes/Admin/AuditPage.php:475 -#: includes/Admin/AuditPage.php:529 +#: includes/Admin/AuditPage.php:543 msgid "Could not open output stream." msgstr "" -#: includes/Admin/AuditPage.php:484 -#: includes/Admin/AuditPage.php:537 +#: includes/Admin/AuditPage.php:552 #: includes/Privacy/DataExporter.php:257 #: includes/Privacy/DataExporter.php:299 msgid "Attachment ID" msgstr "" -#: includes/Admin/AuditPage.php:485 -#: includes/Admin/AuditPage.php:538 -#: includes/Admin/MediaListTable.php:52 -#: includes/Privacy/DataExporter.php:261 -msgid "Filename" -msgstr "" - -#: includes/Admin/AuditPage.php:486 -#: includes/Admin/AuditPage.php:539 -#: includes/Privacy/DataExporter.php:265 -msgid "File URL" -msgstr "" - -#: includes/Admin/AuditPage.php:487 -msgid "MIME Type" -msgstr "" - -#: includes/Admin/AuditPage.php:488 +#: includes/Admin/AuditPage.php:556 msgid "File Size (bytes)" msgstr "" -#: includes/Admin/AuditPage.php:489 -#: includes/Admin/AuditPage.php:540 -#: includes/Admin/MediaListTable.php:56 -msgid "External Status" +#: includes/Admin/AuditPage.php:557 +msgid "Internal Scan Date" msgstr "" -#: includes/Admin/AuditPage.php:490 -#: includes/Admin/MediaListTable.php:54 +#: includes/Admin/AuditPage.php:559 +msgid "Has Alert" +msgstr "" + +#: includes/Admin/AuditPage.php:560 +#: includes/Admin/MediaListTable.php:57 msgid "Usage Count" msgstr "" -#: includes/Admin/AuditPage.php:491 -msgid "Used In (post titles)" +#: includes/Admin/AuditPage.php:561 +msgid "Used In" msgstr "" -#: includes/Admin/AuditPage.php:541 -#: includes/Admin/MediaListTable.php:57 -msgid "Last Scanned" +#: includes/Admin/AuditPage.php:562 +msgid "Google Vision — Matches" msgstr "" -#: includes/Admin/AuditPage.php:542 -#: includes/Privacy/DataExporter.php:303 -msgid "Provider" +#: includes/Admin/AuditPage.php:563 +msgid "TinEye — Matches" msgstr "" -#: includes/Admin/AuditPage.php:543 -#: includes/Privacy/DataExporter.php:307 -msgid "Match Count" +#: includes/Admin/AuditPage.php:564 +msgid "PicDefense — Matches" msgstr "" -#: includes/Admin/AuditPage.php:544 -msgid "Top Domains" +#: includes/Admin/AuditPage.php:748 +msgid "Yes" msgstr "" -#: includes/Admin/MediaListTable.php:51 +#: includes/Admin/AuditPage.php:748 +msgid "No" +msgstr "" + +#: includes/Admin/MediaListTable.php:54 msgid "Thumbnail" msgstr "" -#: includes/Admin/MediaListTable.php:53 -msgid "ID" -msgstr "" - -#: includes/Admin/MediaListTable.php:55 +#: includes/Admin/MediaListTable.php:58 msgid "Usages" msgstr "" -#: includes/Admin/MediaListTable.php:81 -msgid "Run External Scan" -msgstr "" - -#: includes/Admin/MediaListTable.php:82 -msgid "Purge External Data" -msgstr "" - -#: includes/Admin/MediaListTable.php:83 -msgid "Export CSV" +#: includes/Admin/MediaListTable.php:60 +msgid "Last Scanned" msgstr "" #: includes/Admin/MediaListTable.php:84 -msgid "Export External Results CSV" +msgid "Run External Scan" msgstr "" -#: includes/Admin/MediaListTable.php:168 +#: includes/Admin/MediaListTable.php:85 +msgid "Purge External Data" +msgstr "" + +#: includes/Admin/MediaListTable.php:86 +msgid "Export CSV" +msgstr "" + +#: includes/Admin/MediaListTable.php:87 +msgid "Export CSV (Alerts only)" +msgstr "" + +#: includes/Admin/MediaListTable.php:171 msgid "Edit" msgstr "" -#: includes/Admin/MediaListTable.php:173 +#: includes/Admin/MediaListTable.php:176 msgid "View Details" msgstr "" -#: includes/Admin/MediaListTable.php:239 +#: includes/Admin/MediaListTable.php:181 +msgid "Full Report" +msgstr "" + +#: includes/Admin/MediaListTable.php:247 msgid "(no title)" msgstr "" #. translators: %d: number of additional usages -#: includes/Admin/MediaListTable.php:254 +#: includes/Admin/MediaListTable.php:262 #, php-format msgid "+ %d more…" msgstr "" -#: includes/Admin/MediaListTable.php:276 -#: includes/Admin/ToolsPage.php:580 -#: includes/Admin/ToolsPage.php:581 -#: includes/Admin/ToolsPage.php:582 -msgid "Pending" -msgstr "" - -#: includes/Admin/MediaListTable.php:277 -msgid "Queued" -msgstr "" - -#: includes/Admin/MediaListTable.php:279 -msgid "Matches Found" -msgstr "" - -#: includes/Admin/MediaListTable.php:280 -msgid "Error" -msgstr "" - -#: includes/Admin/MediaListTable.php:308 +#: includes/Admin/MediaListTable.php:320 +#: includes/Admin/MediaListTable.php:359 msgid "View Results" msgstr "" +#: includes/Admin/MediaListTable.php:327 +#: includes/Admin/ToolsPage.php:589 +#: includes/Admin/ToolsPage.php:590 +#: includes/Admin/ToolsPage.php:591 +msgid "Pending" +msgstr "" + +#: includes/Admin/MediaListTable.php:328 +msgid "Queued" +msgstr "" + +#: includes/Admin/MediaListTable.php:330 +msgid "Matches Found" +msgstr "" + +#: includes/Admin/MediaListTable.php:331 +msgid "Error" +msgstr "" + #. translators: %s: human-readable time difference, e.g. "3 days" -#: includes/Admin/MediaListTable.php:350 +#: includes/Admin/MediaListTable.php:401 #, php-format msgid "%s ago" msgstr "" -#: includes/Admin/MediaListTable.php:380 +#: includes/Admin/MediaListTable.php:431 msgid "All statuses" msgstr "" -#: includes/Admin/MediaListTable.php:394 +#: includes/Admin/MediaListTable.php:450 msgid "All post types" msgstr "" -#: includes/Admin/MediaListTable.php:409 +#: includes/Admin/MediaListTable.php:465 msgid "Unused only" msgstr "" -#: includes/Admin/MediaListTable.php:412 +#: includes/Admin/MediaListTable.php:468 msgid "Filter" msgstr "" -#: includes/Admin/MediaListTable.php:422 +#: includes/Admin/MediaListTable.php:478 msgid "No indexed attachments found. Run wp mra scan-internal to populate the index." msgstr "" -#: includes/Admin/Settings.php:47 +#: includes/Admin/Settings.php:203 msgid "General" msgstr "" -#: includes/Admin/Settings.php:54 -msgid "Delete data on uninstall" -msgstr "" - -#: includes/Admin/Settings.php:62 +#: includes/Admin/Settings.php:204 msgid "API Credentials" msgstr "" -#: includes/Admin/Settings.php:69 -msgid "Google Cloud Vision API Key" +#: includes/Admin/Settings.php:205 +msgid "Filters" msgstr "" -#: includes/Admin/Settings.php:77 -msgid "TinEye API Key" -msgstr "" - -#: includes/Admin/Settings.php:85 +#: includes/Admin/Settings.php:206 msgid "External Scanning" msgstr "" -#: includes/Admin/Settings.php:92 -msgid "Batch Size" -msgstr "" - -#: includes/Admin/Settings.php:100 -msgid "Rate Limit (requests/min)" -msgstr "" - -#: includes/Admin/Settings.php:156 -msgid "Remove all plugin data (tables and options) when the plugin is uninstalled." -msgstr "" - -#: includes/Admin/Settings.php:159 -msgid "By default, data is preserved after uninstall. Enable this only if you want a clean removal." -msgstr "" - -#: includes/Admin/Settings.php:183 -msgid "Required for Google Cloud Vision Web Detection. Obtain from the Google Cloud Console." -msgstr "" - -#: includes/Admin/Settings.php:186 -#: includes/Admin/Settings.php:236 -msgid "View pricing" -msgstr "" - -#: includes/Admin/Settings.php:192 -msgid "Monthly requests" -msgstr "" - -#: includes/Admin/Settings.php:193 -msgid "Price per 1,000" -msgstr "" - -#: includes/Admin/Settings.php:198 -msgid "First 1,000" -msgstr "" - -#: includes/Admin/Settings.php:199 -msgid "Free" -msgstr "" - -#: includes/Admin/Settings.php:233 -msgid "Required for TinEye reverse image search. Obtain from your TinEye Commercial account." -msgstr "" - -#: includes/Admin/Settings.php:242 -msgid "Bundle" -msgstr "" - -#: includes/Admin/Settings.php:243 -msgid "Searches" -msgstr "" - -#: includes/Admin/Settings.php:244 -msgid "Price" -msgstr "" - #: includes/Admin/Settings.php:249 -msgid "Starter" +msgid "Delete data on uninstall" msgstr "" -#: includes/Admin/Settings.php:254 -msgid "Standard" +#: includes/Admin/Settings.php:265 +msgid "Google Cloud Vision API Key" msgstr "" -#: includes/Admin/Settings.php:259 -msgid "Professional" +#: includes/Admin/Settings.php:273 +msgid "TinEye API Key" msgstr "" -#: includes/Admin/Settings.php:288 -msgid "Number of images to scan per scheduled batch (1–100). Default: 10." +#: includes/Admin/Settings.php:281 +msgid "PicDefense User ID" +msgstr "" + +#: includes/Admin/Settings.php:289 +msgid "PicDefense API Key" +msgstr "" + +#: includes/Admin/Settings.php:298 +msgid "Alert Hostnames" +msgstr "" + +#: includes/Admin/Settings.php:305 +#: includes/Admin/Settings.php:320 +msgid "Hostnames" msgstr "" #: includes/Admin/Settings.php:313 +msgid "Ignored Hostnames" +msgstr "" + +#: includes/Admin/Settings.php:336 +msgid "Batch Size" +msgstr "" + +#: includes/Admin/Settings.php:344 +msgid "Rate Limit (requests/min)" +msgstr "" + +#. translators: %s: comma-separated list of hostnames +#: includes/Admin/Settings.php:404 +#, php-format +msgid "The following hostnames were removed from the exclusion list because they already appear in the alert list: %s" +msgstr "" + +#: includes/Admin/Settings.php:505 +msgid "API Credentials Status" +msgstr "" + +#: includes/Admin/Settings.php:513 +#: includes/External/GoogleVisionProvider.php:43 +msgid "Google Cloud Vision" +msgstr "" + +#: includes/Admin/Settings.php:521 +msgid "TinEye" +msgstr "" + +#: includes/Admin/Settings.php:544 +msgid "Matches from these hostnames are flagged as critical copyright alerts. Entering example.com also covers all its subdomains." +msgstr "" + +#: includes/Admin/Settings.php:557 +msgid "Matches from these hostnames are silently ignored and not counted as potential copyright issues. Entering example.com also covers all its subdomains. A hostname already present in the alert list cannot be added here." +msgstr "" + +#: includes/Admin/Settings.php:578 +msgid "Remove all plugin data (tables and options) when the plugin is uninstalled." +msgstr "" + +#: includes/Admin/Settings.php:581 +msgid "By default, data is preserved after uninstall. Enable this only if you want a clean removal." +msgstr "" + +#: includes/Admin/Settings.php:605 +msgid "Required for Google Cloud Vision Web Detection. Obtain from the Google Cloud Console." +msgstr "" + +#: includes/Admin/Settings.php:608 +#: includes/Admin/Settings.php:658 +#: includes/Admin/Settings.php:736 +msgid "View pricing" +msgstr "" + +#: includes/Admin/Settings.php:614 +msgid "Monthly requests" +msgstr "" + +#: includes/Admin/Settings.php:615 +msgid "Price per 1,000" +msgstr "" + +#: includes/Admin/Settings.php:620 +msgid "First 1,000" +msgstr "" + +#: includes/Admin/Settings.php:621 +msgid "Free" +msgstr "" + +#: includes/Admin/Settings.php:655 +msgid "Required for TinEye reverse image search. Obtain from your TinEye Commercial account." +msgstr "" + +#: includes/Admin/Settings.php:664 +msgid "Bundle" +msgstr "" + +#: includes/Admin/Settings.php:665 +msgid "Searches" +msgstr "" + +#: includes/Admin/Settings.php:666 +msgid "Price" +msgstr "" + +#: includes/Admin/Settings.php:671 +msgid "Starter" +msgstr "" + +#: includes/Admin/Settings.php:676 +msgid "Standard" +msgstr "" + +#: includes/Admin/Settings.php:681 +msgid "Professional" +msgstr "" + +#: includes/Admin/Settings.php:709 +msgid "Required for PicDefense copyright risk analysis. Your PicDefense account user ID." +msgstr "" + +#: includes/Admin/Settings.php:733 +msgid "Required for PicDefense copyright risk analysis. Your PicDefense API key." +msgstr "" + +#: includes/Admin/Settings.php:768 +#: includes/Admin/Settings.php:799 +msgid "One hostname per line. example.com covers all its subdomains. Explicit wildcard: *.example.com." +msgstr "" + +#: includes/Admin/Settings.php:824 +msgid "Number of images to scan per scheduled batch (1–100). Default: 10." +msgstr "" + +#: includes/Admin/Settings.php:849 msgid "Maximum API requests per minute per provider (1–60). Default: 10." msgstr "" @@ -476,310 +718,322 @@ msgstr "" msgid "An error occurred." msgstr "" -#: includes/Admin/ToolsPage.php:139 +#: includes/Admin/ToolsPage.php:143 msgid "Invalid batch type." msgstr "" -#: includes/Admin/ToolsPage.php:256 +#: includes/Admin/ToolsPage.php:264 msgid "System Status" msgstr "" -#: includes/Admin/ToolsPage.php:259 +#: includes/Admin/ToolsPage.php:267 msgid "Operations" msgstr "" -#: includes/Admin/ToolsPage.php:262 +#: includes/Admin/ToolsPage.php:270 msgid "Direct scan runner" msgstr "" -#: includes/Admin/ToolsPage.php:264 +#: includes/Admin/ToolsPage.php:272 msgid "Run scan batches directly from your browser without relying on background jobs. Useful when WP-Cron is disabled or Action Scheduler is not running. Keep this tab open while processing." msgstr "" -#: includes/Admin/ToolsPage.php:300 +#: includes/Admin/ToolsPage.php:308 msgid "not installed" msgstr "" -#: includes/Admin/ToolsPage.php:358 +#: includes/Admin/ToolsPage.php:366 msgid "Internal scan scheduled." msgstr "" -#: includes/Admin/ToolsPage.php:359 +#: includes/Admin/ToolsPage.php:367 msgid "External scan scheduled." msgstr "" -#: includes/Admin/ToolsPage.php:360 +#: includes/Admin/ToolsPage.php:368 msgid "Failed scans re-queued. Background scan scheduled." msgstr "" -#: includes/Admin/ToolsPage.php:361 +#: includes/Admin/ToolsPage.php:369 +msgid "Provider registry synced. New scans scheduled." +msgstr "" + +#: includes/Admin/ToolsPage.php:370 msgid "Usage data cleared. Background scan scheduled." msgstr "" -#: includes/Admin/ToolsPage.php:362 +#: includes/Admin/ToolsPage.php:371 msgid "Index cleared. Fresh indexing scheduled." msgstr "" -#: includes/Admin/ToolsPage.php:363 +#: includes/Admin/ToolsPage.php:372 msgid "External scan data purged." msgstr "" -#: includes/Admin/ToolsPage.php:364 +#: includes/Admin/ToolsPage.php:373 msgid "All data reset. Fresh indexing scheduled." msgstr "" -#: includes/Admin/ToolsPage.php:367 +#: includes/Admin/ToolsPage.php:376 msgid "Operation completed." msgstr "" -#: includes/Admin/ToolsPage.php:411 +#: includes/Admin/ToolsPage.php:420 msgid "Database schema" msgstr "" #. translators: %s: version number -#: includes/Admin/ToolsPage.php:417 +#: includes/Admin/ToolsPage.php:426 #, php-format msgid "v%s – up to date" msgstr "" #. translators: 1: stored version, 2: expected version -#: includes/Admin/ToolsPage.php:423 +#: includes/Admin/ToolsPage.php:432 #, php-format msgid "Installed: %1$s — Required: %2$s" msgstr "" -#: includes/Admin/ToolsPage.php:432 +#: includes/Admin/ToolsPage.php:441 msgid "Deactivate and reactivate the plugin to apply pending migrations." msgstr "" -#: includes/Admin/ToolsPage.php:439 +#: includes/Admin/ToolsPage.php:448 msgid "Action Scheduler" msgstr "" -#: includes/Admin/ToolsPage.php:442 +#: includes/Admin/ToolsPage.php:451 msgid "Available" msgstr "" -#: includes/Admin/ToolsPage.php:444 +#: includes/Admin/ToolsPage.php:453 msgid "Not available" msgstr "" -#: includes/Admin/ToolsPage.php:449 +#: includes/Admin/ToolsPage.php:458 msgid "Install and activate the Action Scheduler plugin. Background scanning will not work without it." msgstr "" -#: includes/Admin/ToolsPage.php:456 +#: includes/Admin/ToolsPage.php:465 msgid "WP-Cron" msgstr "" -#: includes/Admin/ToolsPage.php:459 +#: includes/Admin/ToolsPage.php:468 msgid "Disabled (DISABLE_WP_CRON)" msgstr "" -#: includes/Admin/ToolsPage.php:461 +#: includes/Admin/ToolsPage.php:470 msgid "Enabled" msgstr "" -#: includes/Admin/ToolsPage.php:466 +#: includes/Admin/ToolsPage.php:475 msgid "Background jobs will not fire automatically. Trigger the cron externally or use WP-CLI:" msgstr "" -#: includes/Admin/ToolsPage.php:474 +#: includes/Admin/ToolsPage.php:483 msgid "Internal index" msgstr "" #. translators: 1: indexed count, 2: total images -#: includes/Admin/ToolsPage.php:479 +#: includes/Admin/ToolsPage.php:488 #, php-format msgid "%1$s / %2$s images indexed" msgstr "" #. translators: %s: formatted count -#: includes/Admin/ToolsPage.php:490 +#: includes/Admin/ToolsPage.php:499 #, php-format msgid "%s image not yet indexed." msgid_plural "%s images not yet indexed." msgstr[0] "" msgstr[1] "" -#: includes/Admin/ToolsPage.php:494 +#: includes/Admin/ToolsPage.php:503 msgid "Schedule an internal scan below." msgstr "" -#: includes/Admin/ToolsPage.php:502 +#: includes/Admin/ToolsPage.php:511 msgid "Usage scan" msgstr "" #. translators: 1: scanned count, 2: total indexed -#: includes/Admin/ToolsPage.php:507 +#: includes/Admin/ToolsPage.php:516 #, php-format msgid "%1$s / %2$s scanned for usage" msgstr "" #. translators: %s: formatted count -#: includes/Admin/ToolsPage.php:518 +#: includes/Admin/ToolsPage.php:527 #, php-format msgid "%s pending." msgid_plural "%s pending." msgstr[0] "" msgstr[1] "" -#: includes/Admin/ToolsPage.php:539 -#: includes/Admin/ToolsPage.php:736 +#: includes/Admin/ToolsPage.php:548 +#: includes/Admin/ToolsPage.php:752 msgid "External scan" msgstr "" #. translators: 1: scanned 2: matches 3: queued 4: pending 5: errors -#: includes/Admin/ToolsPage.php:544 +#: includes/Admin/ToolsPage.php:553 #, php-format msgid "%1$s scanned · %2$s matches · %3$s queued · %4$s pending · %5$s errors" msgstr "" -#: includes/Admin/ToolsPage.php:555 +#: includes/Admin/ToolsPage.php:564 msgid "Some scans failed. Check that API keys are configured correctly in Settings." msgstr "" -#: includes/Admin/ToolsPage.php:557 +#: includes/Admin/ToolsPage.php:566 msgid "Schedule an external scan below to process pending items." msgstr "" -#: includes/Admin/ToolsPage.php:575 +#: includes/Admin/ToolsPage.php:584 msgid "Scheduled jobs" msgstr "" -#: includes/Admin/ToolsPage.php:578 +#: includes/Admin/ToolsPage.php:587 msgid "Action Scheduler not available." msgstr "" -#: includes/Admin/ToolsPage.php:580 +#: includes/Admin/ToolsPage.php:589 msgid "Index:" msgstr "" -#: includes/Admin/ToolsPage.php:581 +#: includes/Admin/ToolsPage.php:590 msgid "Usage:" msgstr "" -#: includes/Admin/ToolsPage.php:582 +#: includes/Admin/ToolsPage.php:591 msgid "External:" msgstr "" -#: includes/Admin/ToolsPage.php:587 +#: includes/Admin/ToolsPage.php:596 msgid "There is work to do but no background job is scheduled. Use the operations below." msgstr "" -#: includes/Admin/ToolsPage.php:589 +#: includes/Admin/ToolsPage.php:598 msgid "WP-Cron is disabled. Jobs will not fire automatically." msgstr "" -#: includes/Admin/ToolsPage.php:599 +#: includes/Admin/ToolsPage.php:608 msgid "WP-CLI commands to process scans manually:" msgstr "" -#: includes/Admin/ToolsPage.php:616 +#: includes/Admin/ToolsPage.php:625 msgid "Schedule internal scan" msgstr "" -#: includes/Admin/ToolsPage.php:617 +#: includes/Admin/ToolsPage.php:626 msgid "Queue a background job to index all unindexed media files and scan their usage across posts, pages, and custom fields. Safe to run at any time — will not re-process completed work." msgstr "" -#: includes/Admin/ToolsPage.php:623 +#: includes/Admin/ToolsPage.php:632 msgid "Schedule external scan" msgstr "" -#: includes/Admin/ToolsPage.php:624 +#: includes/Admin/ToolsPage.php:633 msgid "Mark all pending attachments as queued and launch a background reverse-image-search via the configured providers. Requires API keys in Settings." msgstr "" -#: includes/Admin/ToolsPage.php:630 +#: includes/Admin/ToolsPage.php:639 msgid "Requeue scan errors" msgstr "" -#: includes/Admin/ToolsPage.php:631 +#: includes/Admin/ToolsPage.php:640 msgid "Re-queues only the attachments that failed with an error on the last external scan run. Does not affect already-scanned items. Useful to retry after fixing API key issues." msgstr "" -#: includes/Admin/ToolsPage.php:640 -msgid "Reset usage data" -msgstr "" - -#: includes/Admin/ToolsPage.php:641 -msgid "Clears all usage rows and resets the usage-scan flag for every indexed attachment. File metadata in the index is preserved. A background usage scan is scheduled immediately after." -msgstr "" - -#: includes/Admin/ToolsPage.php:643 -msgid "This will delete all usage data. Continue?" +#: includes/Admin/ToolsPage.php:646 +msgid "Sync provider registry" msgstr "" #: includes/Admin/ToolsPage.php:647 -msgid "Re-index media library" +msgid "Creates scan entries for any newly registered external providers. Run this after adding a new provider via the mra/external/providers filter. Already-scanned attachments are not affected." msgstr "" -#: includes/Admin/ToolsPage.php:648 -msgid "Deletes all index and usage entries, then schedules a full fresh re-index. External scan results are not affected. Useful if many media files have been added or removed." -msgstr "" - -#: includes/Admin/ToolsPage.php:650 -msgid "This will delete all index and usage data. Continue?" -msgstr "" - -#: includes/Admin/ToolsPage.php:654 -msgid "Purge external data" -msgstr "" - -#: includes/Admin/ToolsPage.php:655 -msgid "Deletes all external scan results and resets every attachment's external status to pending. Use this before switching API providers or to force a complete re-scan." +#: includes/Admin/ToolsPage.php:656 +msgid "Reset usage data" msgstr "" #: includes/Admin/ToolsPage.php:657 -msgid "This will delete all external scan results. Continue?" +msgid "Clears all usage rows and resets the usage-scan flag for every indexed attachment. File metadata in the index is preserved. A background usage scan is scheduled immediately after." msgstr "" -#: includes/Admin/ToolsPage.php:661 -msgid "Reset all data" +#: includes/Admin/ToolsPage.php:659 +msgid "This will delete all usage data. Continue?" msgstr "" -#: includes/Admin/ToolsPage.php:662 -msgid "Truncates all three plugin tables (index, usage, external results) and schedules a fresh indexing run. Use this to start completely from scratch." +#: includes/Admin/ToolsPage.php:663 +msgid "Re-index media library" msgstr "" #: includes/Admin/ToolsPage.php:664 -msgid "This will permanently delete ALL plugin data and cannot be undone. Are you absolutely sure?" +msgid "Deletes all index and usage entries, then schedules a full fresh re-index. External scan results are not affected. Useful if many media files have been added or removed." msgstr "" -#: includes/Admin/ToolsPage.php:675 -msgid "Destructive operations" +#: includes/Admin/ToolsPage.php:666 +msgid "This will delete all index and usage data. Continue?" +msgstr "" + +#: includes/Admin/ToolsPage.php:670 +msgid "Purge external data" +msgstr "" + +#: includes/Admin/ToolsPage.php:671 +msgid "Deletes all external scan results and resets every attachment's external status to pending. Use this before switching API providers or to force a complete re-scan." +msgstr "" + +#: includes/Admin/ToolsPage.php:673 +msgid "This will delete all external scan results. Continue?" +msgstr "" + +#: includes/Admin/ToolsPage.php:677 +msgid "Reset all data" msgstr "" #: includes/Admin/ToolsPage.php:678 +msgid "Truncates all three plugin tables (index, usage, external results) and schedules a fresh indexing run. Use this to start completely from scratch." +msgstr "" + +#: includes/Admin/ToolsPage.php:680 +msgid "This will permanently delete ALL plugin data and cannot be undone. Are you absolutely sure?" +msgstr "" + +#: includes/Admin/ToolsPage.php:691 +msgid "Destructive operations" +msgstr "" + +#: includes/Admin/ToolsPage.php:694 msgid "These operations permanently delete plugin data. Intended for forced rescans, troubleshooting, or starting fresh. A confirmation prompt will appear before any action is taken." msgstr "" -#: includes/Admin/ToolsPage.php:726 +#: includes/Admin/ToolsPage.php:742 msgid "Index media files" msgstr "" -#: includes/Admin/ToolsPage.php:727 +#: includes/Admin/ToolsPage.php:743 msgid "Discovers unindexed images and registers them in the plugin index. Run this first." msgstr "" -#: includes/Admin/ToolsPage.php:731 +#: includes/Admin/ToolsPage.php:747 msgid "Scan usage" msgstr "" -#: includes/Admin/ToolsPage.php:732 +#: includes/Admin/ToolsPage.php:748 msgid "Checks every indexed image for usage across posts, pages, and custom fields." msgstr "" -#: includes/Admin/ToolsPage.php:737 +#: includes/Admin/ToolsPage.php:753 msgid "Sends images to external providers for reverse-image search. Requires API keys in Settings." msgstr "" -#: includes/Admin/ToolsPage.php:754 +#: includes/Admin/ToolsPage.php:770 msgid "Run now" msgstr "" -#: includes/Admin/ToolsPage.php:757 +#: includes/Admin/ToolsPage.php:773 msgid "Stop" msgstr "" @@ -844,18 +1098,18 @@ msgstr "" msgid "External scan complete. %d attachments processed." msgstr "" -#: includes/Core/Plugin.php:122 -#: includes/Core/Plugin.php:123 +#: includes/Core/Plugin.php:132 +#: includes/Core/Plugin.php:133 msgid "Tools" msgstr "" -#: includes/Core/Plugin.php:135 -#: includes/Core/Plugin.php:136 +#: includes/Core/Plugin.php:145 +#: includes/Core/Plugin.php:146 msgid "Settings" msgstr "" -#: includes/External/GoogleVisionProvider.php:43 -msgid "Google Cloud Vision" +#: includes/Core/Plugin.php:154 +msgid "Attachment Report" msgstr "" #: includes/Privacy/DataExporter.php:88 @@ -878,6 +1132,14 @@ msgstr "" msgid "Last Scanned (external)" msgstr "" +#: includes/Privacy/DataExporter.php:303 +msgid "Provider" +msgstr "" + +#: includes/Privacy/DataExporter.php:307 +msgid "Match Count" +msgstr "" + #: includes/Privacy/DataExporter.php:311 msgid "Scanned At" msgstr "" diff --git a/readme.txt b/readme.txt index 7ed9fe6..1127263 100644 --- a/readme.txt +++ b/readme.txt @@ -5,11 +5,11 @@ Requires at least: 6.8 Tested up to: 7.0 Requires PHP: 8.2 Requires Plugins: action-scheduler -Stable tag: 1.5.0 +Stable tag: 1.6.0 License: GPL-3.0-or-later License URI: https://www.gnu.org/licenses/gpl-3.0.txt -Audit your media library for copyright risks: track internal usage and run reverse image search via Google Vision and TinEye. +Audit your media library for copyright risks: track internal usage, run reverse image search via Google Vision, TinEye, and PicDefense, and classify results against configurable alert and ignored hostname lists. == Description == @@ -20,7 +20,7 @@ Media Audit helps site owners and editors understand where their media files are * **Internal usage scan** — identifies every post, page, and custom post type that references each attachment as featured image, inline content, or post meta. * **External reverse image search** — submits images to Google Cloud Vision (Web Detection) and TinEye Commercial API to find matching pages across the web. * **Consensus detection** — surfaces domains independently confirmed by multiple providers, providing stronger copyright-risk signals. -* **Audit list** — filterable admin page showing each attachment's external scan status and top matching domains. +* **Audit list** — filterable admin page showing each attachment's external scan status, alert classification, and top matching domains. * **WP-CLI support** — run or schedule scans from the command line. * **GDPR compliance** — full WordPress privacy API integration for personal data export and erasure on request. * **Async processing** — all scanning runs via Action Scheduler to avoid blocking web requests. @@ -98,6 +98,17 @@ By default, no. Enable **Settings → Delete data on uninstall** if you want all Only the 3 latest versions. The full changelog is in [changelog.txt](changelog.txt). += 1.6.0 = + +* Settings page reorganised into four tabs: General, API Credentials, Filters, External Scanning. +* New Filters tab: configurable Alert Hostnames and Ignored Hostnames lists with wildcard support (`*.example.com`), auto-normalization (strips scheme/path/port/www., deduplicates, sorts), and default pre-populated lists (60 alert domains, 56 ignored domains) seeded on first activation. +* New "Alert" status filter in the audit list and alert badge in the External Status column. +* Dashboard stats: new "Alert" card showing attachments with at least one alert domain match. +* Quick-view modal: ignored domains filtered out; alert domains highlighted with a status badge. +* Full Report detail page: external results split into three sections — Alert, Other, and Ignored domains. +* Unified CSV export replacing separate internal/external exports: "Export CSV" (all) and "Export CSV (Alerts only)", one row per attachment with all internal and external data including per-provider match counts and classified domain lists. +* "Media Audit" admin menu repositioned immediately below the built-in Media menu. + = 1.5.0 = * Added PicDefense as a third external scan provider: POST-based reverse image search with risk classification (high/medium/low), backlinks with similarity scores, risk flags (face/logo/landmark/stock/EXIF copyright), and label detection. @@ -111,13 +122,6 @@ Only the 3 latest versions. The full changelog is in [changelog.txt](changelog.t * Fixed `external_batch_size` setting being ignored by Action Scheduler batch processing. * Fixed TinEye domain extraction using the image CDN URL instead of the webpage URL (API field `backlink`, not `url`). -= 1.3.0 = - -* Added per-provider scan tracking table (`mra_provider_status`) so each API is tracked independently. -* Added "Sync providers" operation: registers newly configured providers for all existing attachments without rescanning already-completed work. -* Changed `mra_external_results.provider` from a fixed ENUM to `varchar(100)` for extensibility. -* DB schema bumped to 1.1.0 with an automatic migration on update. - = 1.2.0 = * Added browser-based AJAX scan runner in the Tools page (runs without WP-Cron or Action Scheduler). diff --git a/robotstxt-mediaaudit.php b/robotstxt-mediaaudit.php index 9260830..fb04ccf 100644 --- a/robotstxt-mediaaudit.php +++ b/robotstxt-mediaaudit.php @@ -3,7 +3,7 @@ * Plugin Name: Media Audit (by ROBOTSTXT) * Plugin URI: https://git.robotstxt.es/ROBOTSTXT/robotstxt-mediaaudit * Description: Internal media library usage auditing and external reverse image search to detect potential copyright issues. - * Version: 1.5.0 + * Version: 1.6.0 * Requires at least: 6.8 * Tested up to: 7.0 * Requires PHP: 8.2 @@ -23,7 +23,7 @@ if ( ! defined( 'ABSPATH' ) ) { exit; } -define( 'ROBOTSTXT_MEDIAAUDIT_VERSION', '1.5.0' ); +define( 'ROBOTSTXT_MEDIAAUDIT_VERSION', '1.6.0' ); define( 'ROBOTSTXT_MEDIAAUDIT_DB_VERSION', '1.1.0' ); define( 'ROBOTSTXT_MEDIAAUDIT_PLUGIN_FILE', __FILE__ ); define( 'ROBOTSTXT_MEDIAAUDIT_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index f5cc77e..3a43b2c 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -21,6 +21,7 @@ return array( 'MediaRightsAudit\\External\\AbstractProvider' => $baseDir . '/includes/External/AbstractProvider.php', 'MediaRightsAudit\\External\\ExternalScanner' => $baseDir . '/includes/External/ExternalScanner.php', 'MediaRightsAudit\\External\\GoogleVisionProvider' => $baseDir . '/includes/External/GoogleVisionProvider.php', + 'MediaRightsAudit\\External\\HostnameFilter' => $baseDir . '/includes/External/HostnameFilter.php', 'MediaRightsAudit\\External\\PicDefenseProvider' => $baseDir . '/includes/External/PicDefenseProvider.php', 'MediaRightsAudit\\External\\ResultsConsolidator' => $baseDir . '/includes/External/ResultsConsolidator.php', 'MediaRightsAudit\\External\\ScanResult' => $baseDir . '/includes/External/ScanResult.php', diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 304049f..99abdd8 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -36,6 +36,7 @@ class ComposerStaticInit957728ab3efa005f456e5f9df13a19d2 'MediaRightsAudit\\External\\AbstractProvider' => __DIR__ . '/../..' . '/includes/External/AbstractProvider.php', 'MediaRightsAudit\\External\\ExternalScanner' => __DIR__ . '/../..' . '/includes/External/ExternalScanner.php', 'MediaRightsAudit\\External\\GoogleVisionProvider' => __DIR__ . '/../..' . '/includes/External/GoogleVisionProvider.php', + 'MediaRightsAudit\\External\\HostnameFilter' => __DIR__ . '/../..' . '/includes/External/HostnameFilter.php', 'MediaRightsAudit\\External\\PicDefenseProvider' => __DIR__ . '/../..' . '/includes/External/PicDefenseProvider.php', 'MediaRightsAudit\\External\\ResultsConsolidator' => __DIR__ . '/../..' . '/includes/External/ResultsConsolidator.php', 'MediaRightsAudit\\External\\ScanResult' => __DIR__ . '/../..' . '/includes/External/ScanResult.php',