GDPRScanner/lang/en.json
2026-04-25 08:48:54 +02:00

850 lines
42 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"app_name": "Document Scanner",
"label_root_folder": "Root Folder",
"label_older_than": "Flag files with data older than",
"placeholder_folder": "/path/to/documents",
"btn_scan": "Run Scan",
"btn_stop": "Stop scan",
"toggle_anonymise": "Anonymise",
"toggle_mask": "Mask CPR only",
"toggle_blur_faces": "Blur faces",
"toggle_skip_cloud": "Skip cloud-only files",
"toggle_ocr": "OCR scanned PDFs",
"label_face_sensitivity": "Face sensitivity",
"face_sensitivity_high": "High",
"face_sensitivity_low": "Low",
"face_sensitivity_hint": "Higher = fewer false detections",
"label_ocr_language": "OCR language",
"label_ocr_dpi": "DPI (quality vs speed)",
"lang_danish": "Danish",
"lang_danish_english": "Danish + English",
"lang_english": "English",
"lang_norwegian": "Norwegian",
"lang_swedish": "Swedish",
"lang_german": "German",
"lang_french": "French",
"lang_dutch": "Dutch",
"time_any": "Any",
"time_1y": "1 year",
"time_2y": "2 years",
"time_5y": "5 years",
"time_10y": "10 years",
"stat_scanned": "Files scanned",
"stat_flagged": "Flagged",
"stat_high_risk": "High risk",
"stat_cpr": "CPR numbers found",
"col_file": "File",
"col_cpr": "CPR numbers",
"col_oldest": "Oldest date",
"col_risk": "Risk",
"col_action": "Action",
"col_detail": "Detail",
"sort_name_az": "Name AZ",
"sort_name_za": "Name ZA",
"sort_cpr_desc": "CPR count ↓",
"sort_oldest_desc": "Oldest date ↓",
"sort_risk_desc": "Risk ↓",
"sort_size_desc": "Size ↓",
"filter_all_types": "All types",
"filter_pdf": "PDF",
"filter_word": "Word",
"filter_excel": "Excel",
"filter_image": "Image",
"placeholder_search": "Search filename…",
"btn_anonymise": "Anonymise",
"btn_mask": "Mask CPR",
"btn_blur": "Blur",
"btn_preview": "Preview",
"btn_show_in_folder": "Show in folder",
"btn_move_to_trash": "Move to trash",
"btn_undo": "Undo",
"btn_export_csv": "CSV",
"btn_select_all": "Select all",
"btn_anonymise_flagged": "Anonymise flagged",
"btn_anonymise_all": "Anonymise all flagged",
"btn_cancel": "Cancel",
"btn_close": "Close",
"btn_clear": "Clear",
"preview_original": "Original",
"preview_processed": "Processed",
"preview_anonymise": "Anonymise → preview",
"preview_mask": "Mask CPR → preview",
"preview_blur_faces": "Blur {n} face(s) → preview",
"preview_no_faces": "✓ No faces detected",
"preview_scanning_faces": "Scanning for faces…",
"preview_processing_faces": "Processing faces…",
"preview_rendering": "Rendering…",
"scan_preparing": "Preparing…",
"scan_scanning": "Scanning…",
"scan_face_scanning": "Scanning {total} file(s) for faces…",
"scan_face_progress": "Faces: {index} / {total} — {file}",
"scan_eta": "{eta} left",
"scan_stopped": "Scan stopped.",
"empty_flagged": "No flagged documents",
"empty_flagged_detail": "Run a scan to view flagged documents",
"empty_filter": "No files match your filter",
"no_audit": "No audit entries yet",
"dialog_delete_title": "Delete files?",
"dialog_delete_confirm": "Move to trash",
"all_trashed": "All flagged documents moved to trash.",
"btn_audit_log": "Audit Log",
"audit_cleared": "Audit log cleared",
"failed_audit": "Failed to load audit log",
"about_title": "About",
"label_python": "Python",
"label_spacy": "spaCy model",
"label_tesseract": "Tesseract",
"label_pymupdf": "PyMuPDF",
"label_opencv": "OpenCV",
"no_model": "no model installed",
"not_installed": "not installed",
"btn_about": "About",
"lbl_size": "Size",
"lbl_time": "Time",
"lbl_space": "Space",
"lbl_loading": "Loading…",
"history_lbl": "History",
"history_items": "items",
"history_btn_sessions": "Sessions",
"history_btn_latest": "Latest scan",
"history_picker_empty": "No past scans",
"history_delta_badge": "Delta",
"history_latest_badge": "Latest",
"lbl_blurred": "Blurred",
"lbl_none": "None",
"lbl_scanner": "Scanner",
"lbl_document": "Document",
"lbl_folder": "Folder",
"empty_scan_hint": "Set a folder path and click",
"empty_flagged_found": "No flagged documents found.",
"preview_click_hint": "Click a document to preview it",
"kbd_select": "select",
"kbd_delete": "delete",
"kbd_close_preview": "close preview",
"kbd_select_all": "select all",
"sort_cpr_asc": "CPR count ↑",
"preview_error": "Preview error",
"preview_unavailable": "Preview unavailable",
"preview_not_available": "Preview not available for this file type",
"lbl_anonymised": "Anonymised",
"lbl_masked": "Masked CPR",
"lbl_processing": "Processing…",
"lbl_error": "Error",
"lbl_no_pii": "No changes — no PII found",
"badge_anonymised": "✓ anonymised",
"badge_masked": "✓ masked",
"badge_blurred": "✓ blurred",
"lbl_working": "Working…",
"lbl_stopping": "Stopping…",
"lbl_no_files_selected": "No files selected",
"lbl_selected_1": "file selected",
"lbl_selected_n": "files selected",
"dialog_delete_body": "This will permanently delete the selected files from disk. This action cannot be undone.",
"lbl_flagged_docs_1": "flagged document",
"lbl_flagged_docs_n": "flagged documents",
"banner_all_clean": "All clean",
"banner_files_scanned": "file(s) scanned, no CPR numbers found",
"banner_need_attention": "file(s) need attention out of",
"banner_scanned": "scanned",
"summary_face_blur": "image(s) to face-blur",
"badge_face": "face",
"badge_shared": "shared",
"badge_archive": "archive",
"badge_shared_cpr": "Shared CPR",
"lbl_also_in": "also in",
"filter_shared_cpr": "⚠ Shared CPR",
"risk_high": "HIGH",
"risk_medium": "MEDIUM",
"risk_low": "LOW",
"reason_cpr_number": "CPR number",
"reason_cpr_numbers": "CPR numbers",
"reason_cpr_confirmed": "CPR(s) with keyword context",
"reason_unique_individuals": "unique individuals",
"reason_cpr_shared": "CPR shared across {n} files",
"reason_data_10y": "data > 10 years old",
"reason_data_5y": "data > 5 years old",
"btn_export_excel": "Export report as Excel",
"btn_audit_log_short": "Audit log",
"btn_delete_selected": "Delete selected",
"audit_action_scan": "Scan",
"audit_action_redact": "Redact",
"audit_action_blur_faces": "Blur faces",
"audit_action_delete": "Delete",
"audit_action_restore": "Restore",
"audit_action_export": "Export",
"audit_files": "files",
"audit_flagged": "flagged",
"audit_high_risk": "high risk",
"audit_regions": "regions",
"audit_faces": "faces",
"audit_permanent": "permanent",
"audit_trash": "trash",
"audit_files_restored": "file(s) restored",
"confirm_clear_audit": "Clear the entire audit log? This cannot be undone.",
"lang_spanish": "Spanish",
"lang_italian": "Italian",
"lang_portuguese": "Portuguese",
"lang_finnish": "Finnish",
"lang_polish": "Polish",
"lang_czech": "Czech",
"lang_russian": "Russian",
"lang_arabic": "Arabic",
"lang_chinese_simplified": "Chinese (Simplified)",
"lang_chinese_traditional": "Chinese (Traditional)",
"lang_japanese": "Japanese",
"lang_korean": "Korean",
"lbl_root": "root",
"lbl_root_folder": "root folder",
"lbl_scanning": "Scanning:",
"btn_deselect_all": "Deselect all",
"filter_high_risk": "🔴 High risk",
"filter_in_archive": "📦 In archive",
"log_starting_scan": "Starting scan of",
"log_found_files": "Found {n} file(s) to scan",
"log_cloud_skipped": "cloud-only skipped",
"log_faces_detected": "face(s) detected",
"log_ocr_pages": "page(s)",
"log_pages_skipped": "image page(s) skipped (enable OCR)",
"log_scan_complete": "Scan complete",
"log_files_with_cpr": "file(s) with CPR",
"log_no_faces_in": "No faces detected in",
"pii_phone": "phone",
"pii_email": "email",
"pii_iban": "IBAN",
"pii_bank_account": "bank account",
"pii_name": "name",
"pii_address": "address",
"pii_org": "org",
"lbl_other_pii": "Other PII",
"lbl_found": "found",
"btn_clear_results_cache": "Clear results cache",
"btn_clear_ocr_cache": "Clear OCR cache",
"confirm_clear_results_cache": "Clear all cached scan results? The grid will be cleared.",
"confirm_clear_ocr_cache": "Clear OCR cache? This will force re-OCR on next scan.",
"log_cache_cleared": "Results cache cleared",
"log_ocr_cache_cleared": "OCR cache cleared",
"m365_app_name": "GDPRScanner",
"m365_sources": "Sources",
"m365_options": "Options",
"m365_accounts": "Accounts",
"m365_stats": "Stats",
"m365_src_email": "Outlook",
"m365_src_onedrive": "OneDrive",
"m365_src_sharepoint": "SharePoint",
"m365_src_teams": "Teams",
"m365_opt_date_from": "Scan emails/files from",
"m365_opt_date_from_hint": "Leave blank to scan all",
"m365_opt_email_body": "Scan email body",
"m365_opt_attachments": "Scan attachments",
"m365_opt_max_attach": "Max attachment size (MB)",
"m365_opt_max_emails": "Max emails per user",
"m365_connect_title": "Connect to Microsoft 365",
"m365_connect_sub": "Enter your Azure app credentials to sign in.",
"m365_label_client_id": "Client ID (Application ID)",
"m365_label_tenant_id": "Tenant ID",
"m365_label_client_secret": "Client Secret",
"m365_secret_hint": "(optional — enables org-wide scanning)",
"m365_secret_desc_app": "app accesses all users' data directly (Application permissions, no sign-in required).",
"m365_secret_desc_delegated": "you sign in as yourself and can only scan your own data unless you're a Global Admin.",
"m365_btn_connect": "Connect",
"m365_device_code_go": "Go to",
"m365_device_code_enter": "and enter this code",
"m365_btn_cancel_auth": "Cancel",
"m365_btn_reconfigure": "Reconfigure",
"m365_btn_sign_out": "Sign out",
"m365_mode_app": "🔑 App mode — org-wide",
"m365_mode_delegated": "Delegated",
"m365_search_users": "Search users…",
"m365_add_account_label": "Add account manually:",
"m365_add_account_placeholder": "email or UPN",
"m365_admin_note": "Only showing your account. To list all users, an admin must grant <strong>User.Read.All</strong> consent in Azure Portal, or add accounts manually below.",
"m365_btn_scan": "Scan",
"m365_btn_stop": "Stop",
"m365_pill_flagged": "flagged",
"m365_pill_scanned": "scanned",
"m365_filter_all_sources": "All sources",
"m365_filter_email": "Outlook",
"m365_filter_onedrive": "OneDrive",
"m365_filter_sharepoint": "SharePoint",
"m365_filter_teams": "Teams",
"m365_empty_hint": "Select sources and click <strong>Scan</strong><br>to find documents with CPR numbers",
"m365_stat_flagged": "Flagged",
"m365_stat_cpr": "CPR hits",
"m365_preview_open": "Open in M365 ↗",
"m365_preview_close": "Close",
"m365_auth_mode_app": "Auth mode: Application (client credentials — org-wide)",
"m365_auth_mode_delegated": "Auth mode: Delegated (device code — signed-in user only)",
"m365_phase_teams_index": "Building Teams membership index…",
"m365_phase_sharepoint": "Collecting SharePoint files…",
"m365_btn_about": "About",
"m365_stat_scanned": "Scanned",
"m365_no_users_found": "No users found",
"m365_no_users_match": "No users match",
"m365_no_cpr_found": "No CPR numbers found.",
"m365_no_matches": "No matches",
"m365_btn_export_excel": "Export Excel",
"m365_export_no_data": "No results to export.",
"m365_phase_emails": "Collecting Outlook messages",
"m365_phase_onedrive": "Collecting OneDrive",
"m365_phase_teams": "Collecting Teams",
"m365_preset_1yr": "1 yr",
"m365_preset_2yr": "2 yr",
"m365_preset_5yr": "5 yr",
"m365_preset_10yr": "10 yr",
"m365_preset_any": "Any",
"m365_auth_mode_app_short": "Application permissions · client credentials",
"m365_auth_mode_delegated_short": "Delegated permissions · device code flow",
"m365_info_permissions": "Permissions",
"m365_info_signin": "Sign-in required",
"m365_info_scope": "Scope",
"m365_info_scope_org": "All users in tenant",
"m365_info_scope_user": "Signed-in user only",
"m365_info_consent": "Admin consent",
"m365_info_required": "Required",
"m365_info_admin": "Global Admin",
"m365_info_expands_scope": "Expands scope to all users",
"m365_info_no": "No",
"m365_info_yes": "Yes",
"m365_info_app_desc": "The app authenticates with a Client Secret and accesses all users' data directly via Microsoft Graph — no interactive sign-in needed. Ideal for automated or scheduled scans.",
"m365_info_delegated_desc": "The app acts on behalf of the signed-in user via the device code flow. By default only that user's data is accessible. A Global Admin can grant broader consent to scan all users.",
"m365_filter_search": "Search…",
"m365_filter_clear": "Clear",
"m365_btn_list_view": "List",
"m365_btn_grid_view": "Grid",
"m365_log_found_items": "Found",
"m365_log_items_to_scan": "item(s) to scan",
"m365_log_starting_scan": "Starting scan:",
"m365_log_accounts": "account(s)",
"m365_btn_bulk_delete": "Delete",
"m365_bulk_delete_title": "Bulk Delete",
"m365_bulk_delete_sub": "Emails move to Deleted Items · Files go to the recycle bin",
"m365_bulk_filter_heading": "Filter what to delete",
"m365_bulk_filter_source": "Source type",
"m365_bulk_filter_min_cpr": "Min CPR hits",
"m365_bulk_filter_older_than": "Older than date",
"m365_bulk_no_match": "No items match these criteria.",
"m365_bulk_match_count": "item(s) will be deleted",
"m365_bulk_confirm_q": "item(s) will be permanently deleted. Continue?",
"m365_bulk_deleting": "Deleting…",
"m365_bulk_deleted": "deleted",
"m365_bulk_failed": "failed",
"m365_bulk_delete_confirm": "Delete matching items",
"m365_delete_confirm": "Delete",
"m365_delete_warning": "This cannot be undone.",
"m365_log_deleted": "Deleted:",
"m365_log_delete_failed": "Delete failed:",
"m365_log_bulk_done": "Bulk delete:",
"m365_log_older_than": "older than",
"m365_eta_left": "left",
"btn_all": "All",
"btn_errors": "Errors",
"log_copy": "Copy",
"btn_none": "None",
"m365_btn_resume": "Resume",
"m365_btn_start_fresh": "Start fresh",
"m365_resume_banner": "Previous scan interrupted — {scanned} scanned, {flagged} found",
"m365_log_resuming": "Resuming scan:",
"m365_log_already_scanned": "already scanned — skipped",
"m365_resuming": "Resuming — skipping already-scanned items…",
"m365_opt_delta": "Delta scan",
"m365_opt_delta_hint": "Changed items only (after first full scan)",
"m365_delta_tokens_saved": "Tokens saved",
"m365_delta_clear": "Clear tokens",
"m365_delta_cleared": "Delta tokens cleared — next scan will be a full scan.",
"m365_delta_mode": "Delta mode — fetching changed items only…",
"m365_smtp_title": "✉ Email report",
"m365_smtp_desc": "Send the Excel report by email after scanning.",
"m365_smtp_host": "SMTP host",
"m365_smtp_port": "Port",
"m365_smtp_user": "Username",
"m365_smtp_pass": "Password",
"m365_smtp_from": "From address",
"m365_smtp_tls": "STARTTLS",
"m365_smtp_ssl": "SSL",
"m365_smtp_recipients": "Recipients",
"m365_smtp_recipients_hint": "Comma or semicolon separated",
"m365_smtp_save": "Save",
"m365_smtp_auto_email_manual": "Email report after manual scan",
"m365_smtp_send": "Send now",
"m365_smtp_saved": "Settings saved.",
"m365_smtp_sending": "Sending…",
"m365_smtp_sent": "Report sent.",
"m365_smtp_no_recipients": "Enter at least one recipient.",
"m365_smtp_configure": "Configure",
"m365_smtp_from_hint": "(optional — defaults to username)",
"m365_subject_title": "🔍 Data subject lookup",
"m365_subject_btn": "Look up",
"m365_subject_desc": "Find all flagged items containing a given CPR number. The CPR is hashed before querying and never stored in plaintext.",
"m365_subject_placeholder": "DDMMYY-XXXX",
"m365_subject_search": "Search",
"m365_subject_searching": "Searching…",
"m365_subject_found": "item(s) found",
"m365_subject_not_found": "No flagged items found for this CPR number.",
"m365_subject_delete_all": "Delete all for this person",
"m365_subject_delete_confirm": "item(s) will be permanently deleted. Continue?",
"m365_disposition_label": "Disposition",
"m365_disp_unreviewed": "Unreviewed",
"m365_disp_retain_legal": "Retain — legal obligation",
"m365_disp_retain_legit": "Retain — legitimate interest",
"m365_disp_retain_contract": "Retain — contract",
"m365_disp_delete_sched": "Delete — scheduled",
"m365_disp_personal_use": "Personal use — out of scope",
"m365_disp_deleted": "Deleted",
"m365_disp_save": "Save",
"m365_disp_saved": "✓ Saved",
"m365_opt_retention": "Retention policy",
"m365_opt_retention_hint": "Flag and delete items older than N years",
"m365_ret_years": "Retention years",
"m365_ret_fy_end": "Fiscal year end",
"m365_ret_fy_rolling": "Rolling (from today)",
"m365_ret_fy_dec": "31 Dec (Bogføringsloven)",
"m365_ret_fy_jun": "30 Jun",
"m365_ret_fy_mar": "31 Mar",
"m365_ret_mode_rolling": "rolling",
"m365_ret_mode_fiscal": "fiscal year",
"m365_ret_cutoff_hint": "Items modified before",
"m365_ret_cutoff_flagged": "will be flagged as overdue",
"m365_overdue_found": "overdue item(s) found",
"m365_bulk_overdue_btn": "Filter overdue",
"m365_bulk_clear_filters": "Clear filters",
"m365_btn_export_article30": "Art.30",
"m365_article30_done": "Article 30 report ready.",
"a30_title": "GDPR Article 30",
"a30_subtitle": "Register of Processing Activities",
"a30_generated": "Generated",
"a30_confidential": "Confidential — GDPR compliance document",
"a30_s1": "1. Summary",
"a30_scan_date": "Scan date",
"a30_items_scanned": "Items scanned",
"a30_flagged": "Flagged items",
"a30_cpr_hits": "Total CPR hits",
"a30_data_subjects": "Estimated data subjects",
"a30_overdue": "Overdue items (>5 yrs)",
"a30_by_source": "Breakdown by source",
"a30_col_source": "Source",
"a30_col_items": "Items",
"a30_col_cpr": "CPR hits",
"a30_col_overdue": "Overdue",
"a30_s2": "2. Personal Data Categories Identified",
"a30_s2_intro": "The following categories of personal data were detected during scanning.",
"a30_col_gdpr_class": "GDPR classification",
"a30_cpr_label": "CPR numbers (Danish personal ID)",
"a30_cpr_class": "Art. 9 — national identifier",
"a30_pii_class_9": "Art. 9 — health/sensitive",
"a30_pii_class_4": "Art. 4 — personal data",
"a30_s3": "3. Data Inventory",
"a30_s3_intro": "All flagged items are listed below with location, retention status, and compliance disposition.",
"a30_col_name": "Name / Subject",
"a30_col_account": "Account",
"a30_col_modified": "Modified",
"a30_col_disp": "Disposition",
"a30_more_items": "additional items not shown. Export the Excel report for the complete list.",
"a30_s4": "4. Retention Analysis",
"a30_s4_intro": "The following items exceed the 5-year retention threshold and should be reviewed for deletion under GDPR Article 5(1)(e) — storage limitation.",
"a30_s5": "5. Compliance Trend",
"a30_s5_intro": "Flagged item counts over the last scans (most recent first).",
"a30_col_scan_date": "Scan date",
"a30_col_scan_type": "Scan type",
"a30_scan_delta": "Delta",
"a30_scan_full": "Full",
"a30_s6": "6. Methodology and Legal Basis",
"a30_method_title": "Scanning methodology",
"a30_method_1": "CPR numbers are detected using pattern matching against the official Danish CPR format (DDMMYY-XXXX) with full date validation and century-digit verification per the CPR register rules.",
"a30_method_2": "Additional personal data (phone numbers, email addresses, IBANs, bank accounts, names, addresses, and organisations) is detected using regular expressions and spaCy NER.",
"a30_method_3": "CPR numbers stored in this document's database are SHA-256 hashed and never stored in plaintext.",
"a30_method_4": "Scanning covers Exchange mailboxes (all folders including Sent Items), OneDrive, SharePoint, and Microsoft Teams channel files via the Microsoft Graph API. When connected, Google Workspace scanning covers Gmail and Google Drive via a service account with domain-wide delegation. Local and network (SMB) file shares are scanned directly.",
"a30_gdpr_title": "GDPR Articles referenced",
"a30_gdpr_1": "Article 5(1)(c) — Data minimisation: only necessary data should be retained",
"a30_gdpr_2": "Article 5(1)(e) — Storage limitation: data must not be kept longer than necessary",
"a30_gdpr_3": "Article 9 — Special categories: health, criminal, trade union, and similar data require explicit legal basis",
"a30_gdpr_4": "Article 15 — Right of access: data subjects may request information about their data",
"a30_gdpr_5": "Article 17 — Right to erasure: data subjects may request deletion",
"a30_gdpr_6": "Article 30 — Records of processing activities: this document satisfies the obligation",
"a30_disp_unreviewed": "Unreviewed",
"a30_disp_retain_legal": "Retain — Legal obligation",
"a30_disp_retain_legit": "Retain — Legitimate interest",
"a30_disp_retain_contract": "Retain — Contract",
"a30_disp_delete_sched": "Delete — Scheduled",
"a30_disp_personal_use": "Personal use — out of GDPR scope (Art. 2(2)(c))",
"a30_disp_deleted": "Deleted",
"a30_s6_short": "Methodology and Legal Basis",
"m365_role_all": "All",
"m365_role_staff": "Staff",
"m365_role_student": "Student",
"a30_s_dellog": "Deletion Audit Log",
"a30_dellog_intro": "item(s) containing personal data have been deleted via GDPRScanner. This log satisfies the accountability obligation under GDPR Article 5(2).",
"a30_dellog_by_reason": "Deletions by reason",
"a30_dellog_records": "Deletion records",
"a30_col_reason": "Reason",
"a30_col_count": "Count",
"a30_col_deleted_at": "Deleted at",
"a30_col_deleted_by": "Deleted by",
"a30_reason_manual": "Manual (individual card delete)",
"a30_reason_bulk": "Bulk delete",
"a30_reason_retention": "Retention policy enforcement",
"a30_reason_dsr": "Data subject erasure request (Art. 17)",
"m365_filter_all_disp": "All dispositions",
"m365_trend_title": "Trend",
"m365_trend_flagged": "Flagged",
"m365_trend_overdue": "Overdue",
"m365_filter_all_transfer": "All items",
"m365_filter_ext_recipient": "External recipient",
"m365_filter_ext_share": "Externally shared",
"m365_filter_shared": "Shared",
"m365_badge_ext_recipient": "External",
"m365_badge_shared": "Shared",
"a30_s_special": "Special Category Data (Article 9)",
"a30_special_intro": "item(s) detected as special category data under GDPR Article 9. Requires explicit legal basis and DPIA.",
"a30_special_by_cat": "Detected categories",
"a30_special_items": "Affected items (up to 50)",
"a30_col_category": "Category",
"a30_cat_health": "Health data (Art. 9)",
"a30_cat_mental": "Mental health (Art. 9)",
"a30_cat_criminal": "Criminal records (Art. 10)",
"a30_cat_union": "Trade union membership (Art. 9)",
"a30_cat_religion": "Religious beliefs (Art. 9)",
"a30_cat_ethnicity": "Racial/ethnic origin (Art. 9)",
"a30_cat_political": "Political opinions (Art. 9)",
"a30_cat_biometric": "Biometric data (Art. 9)",
"a30_cat_sexual": "Sexual orientation (Art. 9)",
"m365_filter_all_special": "All risk levels",
"m365_filter_special_only": "Art. 9 special category",
"m365_badge_special": "Art.9",
"m365_phase_scanning": "Scanning…",
"a30_special_cat": "Art. 9 special category items",
"a30_special_cat_note": "These items contain health, criminal, biometric, religious, ethnic, trade union, political, or sexual orientation data. An explicit legal basis (Art. 9(2)) and possibly a DPIA (Art. 35) is required.",
"a30_col_special": "Art. 9",
"a30_pii_phone": "Phone numbers",
"a30_pii_email": "Email addresses",
"a30_pii_iban": "IBAN bank numbers",
"a30_pii_bank": "Bank account numbers",
"a30_pii_name": "Personal names (NER)",
"a30_pii_address": "Addresses (NER)",
"a30_pii_org": "Organisations (NER)",
"a30_col_cpr_short": "CPR",
"a30_inv_staff": "Staff / Faculty",
"a30_inv_students": "Students",
"a30_student_consent_note": "Note: Student accounts in Danish folkeskole (pupils under age 15) require parental consent for processing of personal data under Databeskyttelsesloven §6. Items in student accounts must not be auto-deleted — any action requires review by school administration and, for pupils under 15, notification of parents or guardians as rights holders under GDPR Article 8.",
"m365_profile_label": "Profile:",
"m365_profile_placeholder": "— Select profile —",
"m365_profile_save_tip": "Save current settings as a profile",
"m365_profile_save_prompt": "Profile name:",
"m365_profile_applied": "Profile loaded",
"m365_profile_saved": "Profile saved",
"m365_profile_manage_btn": "Profiles",
"m365_profile_clear_btn": "Clear",
"m365_profile_save_btn": "Save",
"m365_profile_manage_title": "⚙ Manage Profiles",
"m365_profile_no_profiles": "No saved profiles yet. Use 💾 to save the current sidebar settings as a profile.",
"m365_profile_use": "Use",
"m365_profile_edit": "Edit",
"m365_profile_duplicate": "Duplicate",
"m365_profile_delete": "Delete",
"m365_profile_delete_confirm": "Delete profile",
"m365_profile_duplicated": "Profile duplicated",
"m365_profile_deleted": "Profile deleted",
"m365_profile_never": "never",
"m365_profile_last_run": "Last run",
"m365_profile_name_placeholder": "Profile name",
"m365_profile_desc_placeholder": "Description (optional)",
"m365_profile_name_required": "Profile name is required.",
"m365_db_title": "🗄 Database",
"m365_db_export": "Export",
"m365_db_import": "Import",
"m365_db_export_error": "Export failed",
"m365_db_exported": "Database exported",
"m365_db_import_title": "📥 Import Database",
"m365_db_import_desc": "Select a previously exported .zip file. Merge adds dispositions and deletion log. Replace wipes and fully restores.",
"m365_db_import_file": "ZIP file",
"m365_db_import_mode": "Mode:",
"m365_db_import_merge": "Merge (safe)",
"m365_db_import_replace": "Replace (full restore)",
"m365_db_import_replace_warn": "⚠ Replace mode will erase all existing scan data before restoring. Make sure you have a backup of ~/.gdpr_scanner.db first.",
"m365_db_import_replace_confirm": "Replace mode will erase ALL existing scan data and restore from the archive.\\n\\nMake sure you have a manual backup of ~/.gdpr_scanner.db.\\n\\nProceed?",
"m365_db_import_no_file": "Please select a ZIP file first.",
"m365_db_importing": "Importing…",
"m365_db_imported": "Imported",
"m365_db_import_run": "Import",
"m365_opt_scan_photos": "Scan photos for faces",
"m365_opt_scan_photos_hint": "Flags images with detected faces as Art. 9 biometric data. Slower — opt in.",
"m365_opt_skip_gps": "Ignore GPS in images",
"m365_opt_skip_gps_hint": "Images with GPS coordinates are not flagged — useful when scanning students whose smartphones embed location in every photo.",
"m365_opt_min_cpr": "Min. CPR count per file",
"m365_opt_min_cpr_hint": "Files with fewer distinct CPR numbers than this threshold are not reported. Set to 2 to avoid false positives when students have their own CPR in documents.",
"m365_filter_photo_only": "📷 Photos / biometric",
"m365_filter_all_roles": "All roles",
"m365_filter_staff": "Staff",
"m365_filter_student": "Students",
"m365_badge_faces": "faces",
"a30_photo_items": "Photos with detected faces (Art. 9 biometric)",
"a30_photo_note": "Photographs of identifiable persons are biometric data under Art. 9 GDPR. Retention requires a documented legal basis under Art. 9(2). For school photographs of pupils under 15, parental consent is required (Databeskyttelsesloven §6). See Datatilsynet guidance on school photography.",
"a30_s_photos": "Photographs and Biometric Data (Article 9)",
"a30_photo_intro": "image file(s) containing detected face(s) were found in the scan. Photographs of identifiable persons constitute biometric data under GDPR Article 9 and are subject to the same heightened protection as health or criminal records data.",
"a30_photo_guidance": "Retention guidance",
"a30_photo_g1": "Photos may only be retained while the original purpose remains valid (Art. 5(1)(b) — purpose limitation).",
"a30_photo_g2": "Pupils under 15 require parental consent (Databeskyttelsesloven §6). Consent must be freely given, specific, and documented.",
"a30_photo_g3": "Photos on public-facing websites must be removed promptly after a person leaves the organisation or withdraws consent (Art. 17 — right to erasure).",
"a30_photo_g4": "Historical/archive use may justify longer retention under Art. 89 only with specific safeguards and case-by-case assessment.",
"a30_photo_col_faces": "Faces",
"a30_method_5": "When photo scanning is enabled, image files are analysed using OpenCV Haar cascade face detection to identify photographs of persons (Art. 9 biometric data).",
"m365_role_cycle_tip": "Click to override role (cycles student → staff → other → auto)",
"m365_role_set": "Role set",
"m365_role_cleared": "Role override cleared",
"m365_sku_debug_title": "🔍 Tenant SKU IDs",
"m365_sku_debug_desc": "These are the raw SKU IDs assigned to your users. Any marked ❓ unknown are not in classification/m365_skus.json — copy them under student_ids or staff_ids and restart.",
"m365_sku_debug_none": "No license data returned — check that the app has User.Read.All permission.",
"m365_file_sources_title": "📁 File sources",
"m365_file_sources_manage": "Manage",
"m365_file_sources_empty": "No file sources configured. Add a local folder or network share below.",
"m365_file_sources_add": "Add source",
"m365_fsrc_label": "Label",
"m365_fsrc_path": "Path",
"m365_fsrc_smb_detected": "SMB/CIFS network share detected",
"m365_fsrc_smb_host": "SMB host",
"m365_fsrc_smb_user": "Username",
"m365_fsrc_smb_pw": "Password",
"m365_fsrc_smb_pw_hint": "Password is saved to the OS keychain — never stored in a file.",
"m365_fsrc_add_btn": "Add",
"m365_fsrc_saved": "Source saved",
"m365_fsrc_saving": "Saving...",
"m365_fsrc_path_required": "Path is required.",
"m365_fsrc_type_local": "Local folder",
"m365_fsrc_type_smb": "Network share (SMB)",
"m365_fsrc_type_sftp": "SFTP server",
"m365_fsrc_sftp_host": "SFTP host",
"m365_fsrc_sftp_port": "Port",
"m365_fsrc_sftp_user": "Username",
"m365_fsrc_sftp_remote_path": "Remote path",
"m365_fsrc_sftp_auth_password": "Password",
"m365_fsrc_sftp_auth_key": "SSH key",
"m365_fsrc_sftp_pw": "Password",
"m365_fsrc_sftp_pw_hint": "Password is saved to the OS keychain — never stored in a file.",
"m365_fsrc_sftp_key_upload": "Private key file",
"m365_fsrc_sftp_key_btn": "Upload key",
"m365_fsrc_sftp_key_uploaded": "Key uploaded",
"m365_fsrc_sftp_passphrase": "Passphrase (if key is encrypted)",
"m365_fsrc_sftp_passphrase_hint": "Passphrase is saved to the OS keychain — never stored in a file.",
"m365_fsrc_sftp_not_installed": "paramiko not installed — run: pip install paramiko",
"m365_fsrc_sftp_host_required": "SFTP host is required.",
"m365_fsrc_sftp_user_required": "SFTP username is required.",
"m365_fsrc_scan_btn": "Scan",
"m365_fsrc_scan_start": "Starting file scan",
"m365_src_group_files": "File sources",
"m365_no_sources": "No sources selected — nothing to scan.",
"m365_fsrc_name_required": "Name is required.",
"m365_srcmgmt_title": "⚙ Source management",
"m365_srcmgmt_tab_m365": "Microsoft 365",
"m365_srcmgmt_tab_google": "Google Workspace",
"m365_srcmgmt_tab_files": "File sources",
"m365_srcmgmt_connection": "Connection",
"m365_srcmgmt_azure_creds": "Azure credentials",
"m365_srcmgmt_sources_m365": "Sources to scan",
"m365_srcmgmt_connected": "Connected",
"m365_srcmgmt_not_connected": "Not connected",
"m365_srcmgmt_coming_soon": "Coming soon",
"m365_srcmgmt_google_sub": "Gmail and Google Drive scanning will appear here when implemented.",
"m365_srcmgmt_file_sources": "File sources",
"m365_sources_manage_btn": "Sources",
"m365_connecting": "Connecting...",
"m365_err_creds_required": "Client ID and Tenant ID required",
"m365_signout_confirm": "Disconnect and clear credentials?",
"m365_btn_settings": "Settings",
"m365_settings_title": "⚙ Settings",
"m365_settings_tab_general": "General",
"m365_settings_tab_email": "Email report",
"m365_settings_tab_database": "Database",
"m365_settings_appearance": "Appearance",
"m365_settings_language": "Language",
"m365_settings_theme": "Theme",
"m365_settings_db_actions": "Actions",
"m365_db_reset": "Reset DB",
"m365_db_reset_confirm": "Reset database? All scan results will be deleted.",
"m365_db_reset_done": "Database reset",
"m365_db_scans": "Scans",
"m365_smtp_saving": "Saving...",
"m365_settings_admin_pin": "Admin PIN",
"m365_settings_pin_hint": "Required for destructive actions (e.g. Reset DB). Leave blank to disable.",
"m365_settings_current_pin": "Current PIN",
"m365_settings_new_pin": "New PIN",
"m365_settings_confirm_pin": "Confirm PIN",
"m365_settings_pin_set": "Admin PIN is set",
"m365_settings_pin_not_set": "No PIN set — Reset DB is unprotected",
"m365_settings_pin_required": "PIN is required.",
"m365_settings_pin_mismatch": "PINs do not match.",
"m365_settings_pin_wrong": "Incorrect PIN — reset cancelled.",
"m365_settings_pin_saved": "PIN saved",
"m365_settings_enter_pin": "Enter admin PIN",
"m365_settings_enter_pin_reset": "Enter admin PIN to reset the database.",
"btn_confirm": "Confirm",
"m365_log_scan_started": "Scan started",
"m365_preview_local_file": "Local file — no cloud preview available",
"m365_badge_gps": "GPS location",
"a30_gps_items": "Items with GPS location data (Art. 4 — location = personal data)",
"a30_exif_pii_items": "Items with EXIF PII (author, description, keywords)",
"a30_gps_title": "Items with GPS location data",
"a30_gps_intro": "The following files contain GPS coordinates embedded in EXIF metadata. Location data constitutes personal data under Art. 4 GDPR.",
"a30_gps_col_lat": "Latitude",
"a30_gps_col_lon": "Longitude",
"m365_accounts_disabled_tip": "Select a Microsoft 365 source to enable account selection",
"m365_smtp_test": "Test",
"m365_smtp_testing": "Sending test email…",
"m365_smtp_test_ok": "Test email sent",
"m365_smtp_test_ok_graph": "Test email sent via Microsoft Graph to",
"m365_smtp_test_ok_smtp": "Test email sent via SMTP to",
"m365_smtp_graph_also_failed": "(⚠ Graph also failed — Mail.Send not granted)",
"m365_smtp_test_fail": "Connection failed",
"bulk_select_mode": "Select",
"bulk_select_all": "Select all visible",
"bulk_deselect_all": "Deselect all",
"bulk_apply": "Apply",
"bulk_done": "Done",
"bulk_selected": "selected",
"bulk_applied": "updated",
"disp_stats_total": "total",
"disp_stats_unreviewed": "unreviewed",
"disp_stats_retain": "retain",
"disp_stats_delete": "delete",
"disp_stats_other": "other",
"disp_stats_reviewed": "reviewed",
"m365_fsrc_edit_btn": "Edit",
"m365_fsrc_save_changes": "Save changes",
"m365_settings_tab_scheduler": "Scheduler",
"m365_sched_title": "Scheduled scans",
"m365_sched_next": "Next",
"m365_sched_hint": "Run scans automatically at a set time. Requires an active M365 connection (application mode recommended).",
"m365_sched_no_aps": "⚠ APScheduler not installed. Run: pip install apscheduler",
"m365_sched_enabled": "Enable scheduler",
"m365_sched_frequency": "Frequency",
"m365_sched_dow": "Day of week",
"m365_sched_dom": "Day of month",
"m365_sched_time": "Time",
"m365_sched_profile": "Profile",
"m365_sched_profile_last": "Last saved settings",
"m365_sched_after_scan": "After scan",
"m365_sched_auto_email": "Email report automatically",
"m365_sched_auto_retention": "Enforce retention policy",
"m365_sched_status": "Status",
"m365_sched_run_now": "▶ Run now",
"m365_sched_add": "+ Add scheduled scan",
"m365_sched_name": "Name",
"m365_sched_editor_new": "New scheduled scan",
"m365_sched_editor_edit": "Edit scheduled scan",
"m365_sched_name_required": "Name is required",
"m365_sched_no_runs": "No scheduled runs yet",
"m365_sched_no_jobs": "No scheduled scans yet.",
"m365_sched_running": "Running...",
"m365_sched_disabled": "Disabled",
"m365_sched_freq_daily": "Daily",
"m365_sched_freq_weekly": "Weekly",
"m365_sched_freq_monthly": "Monthly",
"m365_sched_dow_mon": "Monday",
"m365_sched_dow_tue": "Tuesday",
"m365_sched_dow_wed": "Wednesday",
"m365_sched_dow_thu": "Thursday",
"m365_sched_dow_fri": "Friday",
"m365_sched_dow_sat": "Saturday",
"m365_sched_dow_sun": "Sunday",
"btn_save": "Save",
"m365_settings_about": "About",
"m365_settings_save_pin": "Save PIN",
"m365_sse_reconnecting": "Reconnecting to running scan…",
"m365_sse_replay_note": "Live log resumed — earlier entries replayed from running scan.",
"m365_google_sa_creds": "Service account credentials",
"m365_google_sa_key_file": "Service Account JSON key",
"m365_google_sa_key_hint": "Download from Google Cloud Console → IAM & Admin → Service Accounts → Keys → Add Key → JSON",
"m365_google_admin_email": "Admin email",
"m365_google_admin_email_hint": "Used for domain-wide delegation — must be a Workspace super-admin.",
"m365_google_libs_missing": "Libraries not installed",
"m365_google_key_required": "Select a service account JSON key file",
"m365_google_invalid_json": "Invalid JSON file",
"m365_srcmgmt_sources_google": "Sources to scan",
"m365_google_src_gmail": "Gmail",
"m365_google_src_drive": "Google Drive",
"m365_google_setup_title": "Setup required in Google Workspace:",
"m365_google_setup_step1": "Create a Google Cloud project and enable Gmail API + Drive API + Admin SDK.",
"m365_google_setup_step2": "Create a service account, download the JSON key, and enable domain-wide delegation.",
"m365_google_setup_step3": "In Workspace Admin → Security → API Controls → Domain-wide delegation, add the service account client ID with scopes:",
"m365_google_auth_mode": "Auth mode",
"m365_google_mode_workspace": "Workspace",
"m365_google_mode_personal": "Personal account",
"m365_google_personal_creds": "Personal account",
"m365_google_personal_client_id": "Client ID",
"m365_google_personal_client_secret": "Client secret",
"m365_google_personal_hint": "Create OAuth 2.0 Desktop credentials in Google Cloud Console, then paste the client ID and secret above.",
"m365_google_personal_sign_in": "Sign in",
"m365_google_personal_creds_required": "Client ID and secret required",
"m365_google_personal_setup_title": "Setup required:",
"m365_google_personal_setup_step1": "In Google Cloud Console, create a project and enable Gmail API + Drive API.",
"m365_google_personal_setup_step2": "Create OAuth 2.0 credentials (Desktop app type) and copy the client ID and secret.",
"m365_google_personal_setup_step3": "Add your Google account email to the OAuth consent screen test users list.",
"m365_auth_waiting": "Waiting for sign-in…",
"role_staff": "Staff",
"role_student": "Student",
"role_other": "Other",
"m365_settings_tab_security": "Security",
"share_modal_title": "Share results",
"share_modal_desc": "Read-only links let a DPO or reviewer browse results and tag dispositions without access to scan controls or credentials.",
"share_new_link": "New link",
"share_label_lbl": "Label (optional)",
"share_label_placeholder": "e.g. DPO review 2026",
"share_expires_in": "Expires in",
"share_expires_never": "Never",
"share_expires_7d": "7 days",
"share_expires_30d": "30 days",
"share_expires_90d": "90 days",
"share_expires_1y": "1 year",
"share_create": "Create",
"share_copy_link_prompt": "Copy link:",
"share_active_links": "Active links",
"share_viewer_pin_label": "Viewer PIN:",
"share_pin_configure": "Configure",
"share_pin_set": "Set",
"share_pin_not_set": "Not set",
"share_no_links": "No active links.",
"share_unlabelled": "Unlabelled",
"share_expires_prefix": "Expires:",
"share_last_used": "Last used:",
"share_revoke": "Revoke",
"share_copied": "Copied!",
"share_load_error": "Failed to load links.",
"share_create_error": "Failed to create link:",
"share_revoke_confirm": "Revoke this link? Anyone using it will immediately lose access.",
"share_revoke_error": "Failed to revoke:",
"share_scope_lbl": "Scope",
"share_scope_all": "All",
"share_scope_type_role": "Role",
"share_scope_type_user": "User",
"share_scope_role_lbl": "Role",
"share_scope_user_lbl": "User email",
"share_scope_user_placeholder": "alice@school.dk",
"share_scope_user_invalid": "Please enter a valid email address for the user scope.",
"share_scope_staff": "Staff",
"share_scope_student": "Students",
"viewer_pin_group_title": "Viewer PIN",
"viewer_pin_desc": "A numeric PIN (4\u20138 digits) that lets anyone open <code style=\"font-size:10px\">/view</code> in a browser for read-only access to results without a token URL.",
"viewer_pin_clear": "Clear PIN",
"viewer_pin_is_set": "Viewer PIN is set",
"viewer_pin_not_set_msg": "No PIN set \u2014 /view requires a token link",
"viewer_pin_format": "PIN must be 4\u20138 digits.",
"viewer_pin_saving": "Saving\u2026",
"viewer_pin_saved": "PIN saved",
"viewer_pin_clear_confirm": "Remove the viewer PIN? /view will require a token link again.",
"viewer_pin_cleared": "PIN cleared",
"interface_pin_group_title": "Interface PIN",
"interface_pin_desc": "A numeric PIN (4\u20138 digits) that must be entered before accessing the main scanner interface. Viewers accessing <code style=\"font-size:10px\">/view</code> are not affected.",
"interface_pin_clear": "Clear PIN",
"interface_pin_is_set": "Interface PIN is set",
"interface_pin_not_set_msg": "No PIN set \u2014 interface is open to anyone on the network",
"interface_pin_saved": "PIN saved",
"interface_pin_clear_confirm": "Remove the interface PIN? The scanner will be accessible to anyone on the network.",
"interface_pin_cleared": "PIN cleared",
"interface_pin_login_desc": "Enter the interface PIN to continue.",
"interface_pin_login_btn": "Continue",
"interface_pin_err_incorrect": "Incorrect PIN.",
"interface_pin_err_too_many": "Too many attempts. Try again later.",
"interface_pin_err_network": "Network error. Please try again."
}