Initial commit
This commit is contained in:
commit
9c7df76fbd
91 files changed
+36572
No files matched your search
@@ -0,0 +1,7 @@
|
||||
# lang/ — i18n Rules
|
||||
|
||||
- `en.json` is the source of truth. Always update `da.json` and `de.json` when adding or changing keys.
|
||||
- `/api/langs` globs both `*.json` and `*.lang` — both formats coexist.
|
||||
- Loader in `app_config.py` prefers `.json`, falls back to `.lang`.
|
||||
- JS: `t(key, default)` — Python: `LANG.get(key, default)`
|
||||
- No emojis or symbol prefixes in translation values used as button labels.
|
||||
+773
@@ -0,0 +1,773 @@
|
||||
{
|
||||
"app_name": "Document Scanner",
|
||||
"label_root_folder": "Rodmappe",
|
||||
"label_older_than": "Markér filer med data ældre end",
|
||||
"placeholder_folder": "/sti/til/dokumenter",
|
||||
"btn_scan": "Start scanning",
|
||||
"btn_stop": "Stop scanning",
|
||||
"toggle_anonymise": "Anonymisér",
|
||||
"toggle_mask": "Maskér kun CPR",
|
||||
"toggle_blur_faces": "Slør ansigter",
|
||||
"toggle_skip_cloud": "Spring skybaserede filer over",
|
||||
"toggle_ocr": "OCR-scan af PDF'er",
|
||||
"label_face_sensitivity": "Ansigtsfølsomhed",
|
||||
"face_sensitivity_high": "Høj",
|
||||
"face_sensitivity_low": "Lav",
|
||||
"face_sensitivity_hint": "Højere = færre fejlregistreringer",
|
||||
"label_ocr_language": "OCR-sprog",
|
||||
"label_ocr_dpi": "DPI (kvalitet vs. hastighed)",
|
||||
"lang_danish": "Dansk",
|
||||
"lang_danish_english": "Dansk + Engelsk",
|
||||
"lang_english": "Engelsk",
|
||||
"lang_norwegian": "Norsk",
|
||||
"lang_swedish": "Svensk",
|
||||
"lang_german": "Tysk",
|
||||
"lang_french": "Fransk",
|
||||
"lang_dutch": "Hollandsk",
|
||||
"time_any": "Alle",
|
||||
"time_1y": "1 år",
|
||||
"time_2y": "2 år",
|
||||
"time_5y": "5 år",
|
||||
"time_10y": "10 år",
|
||||
"stat_scanned": "Filer scannet",
|
||||
"stat_flagged": "Markerede",
|
||||
"stat_high_risk": "Høj risiko",
|
||||
"stat_cpr": "CPR-numre fundet",
|
||||
"col_file": "Fil",
|
||||
"col_cpr": "CPR-numre",
|
||||
"col_oldest": "Ældste dato",
|
||||
"col_risk": "Risiko",
|
||||
"col_action": "Handling",
|
||||
"col_detail": "Detaljer",
|
||||
"sort_name_az": "Navn A–Z",
|
||||
"sort_name_za": "Navn Z–A",
|
||||
"sort_cpr_desc": "CPR-antal ↓",
|
||||
"sort_oldest_desc": "Ældste dato ↓",
|
||||
"sort_risk_desc": "Risiko ↓",
|
||||
"sort_size_desc": "Størrelse ↓",
|
||||
"filter_all_types": "Alle typer",
|
||||
"filter_pdf": "PDF",
|
||||
"filter_word": "Word",
|
||||
"filter_excel": "Excel",
|
||||
"filter_image": "Billede",
|
||||
"placeholder_search": "Søg filnavn…",
|
||||
"btn_anonymise": "Anonymisér",
|
||||
"btn_mask": "Maskér CPR",
|
||||
"btn_blur": "Slør",
|
||||
"btn_preview": "Forhåndsvis",
|
||||
"btn_show_in_folder": "Vis i mappe",
|
||||
"btn_move_to_trash": "Flyt til papirkurv",
|
||||
"btn_undo": "Fortryd",
|
||||
"btn_export_csv": "CSV",
|
||||
"btn_select_all": "Vælg alle",
|
||||
"btn_anonymise_flagged": "Anonymisér markerede",
|
||||
"btn_anonymise_all": "Anonymisér alle markerede",
|
||||
"btn_cancel": "Annullér",
|
||||
"btn_close": "Luk",
|
||||
"btn_clear": "Ryd",
|
||||
"preview_original": "Original",
|
||||
"preview_processed": "Behandlet",
|
||||
"preview_anonymise": "Anonymisér → forhåndsvis",
|
||||
"preview_mask": "Maskér CPR → forhåndsvis",
|
||||
"preview_blur_faces": "Slør {n} ansigt(er) → forhåndsvis",
|
||||
"preview_no_faces": "✓ Ingen ansigter fundet",
|
||||
"preview_scanning_faces": "Scanner efter ansigter…",
|
||||
"preview_processing_faces": "Behandler ansigter…",
|
||||
"preview_rendering": "Indlæser…",
|
||||
"scan_preparing": "Forbereder…",
|
||||
"scan_scanning": "Scanner…",
|
||||
"scan_face_scanning": "Scanner {total} fil(er) for ansigter…",
|
||||
"scan_face_progress": "Ansigter: {index} / {total} — {file}",
|
||||
"scan_eta": "{eta} tilbage",
|
||||
"scan_stopped": "Scanning stoppet.",
|
||||
"empty_flagged": "Ingen markerede dokumenter",
|
||||
"empty_flagged_detail": "Kør en scanning for at se markerede dokumenter",
|
||||
"empty_filter": "Ingen filer matcher dit filter",
|
||||
"no_audit": "Ingen revisionslog endnu",
|
||||
"dialog_delete_title": "Slet filer?",
|
||||
"dialog_delete_confirm": "Flyt til papirkurv",
|
||||
"all_trashed": "Alle markerede dokumenter er flyttet til papirkurven.",
|
||||
"btn_audit_log": "Revisionslog",
|
||||
"audit_cleared": "Revisionslog ryddet",
|
||||
"failed_audit": "Kunne ikke indlæse revisionslog",
|
||||
"about_title": "Om",
|
||||
"label_python": "Python",
|
||||
"label_spacy": "spaCy-model",
|
||||
"label_tesseract": "Tesseract",
|
||||
"label_pymupdf": "PyMuPDF",
|
||||
"label_opencv": "OpenCV",
|
||||
"no_model": "ingen model installeret",
|
||||
"not_installed": "ikke installeret",
|
||||
"btn_about": "Om",
|
||||
"lbl_size": "Størrelse",
|
||||
"lbl_time": "Tid",
|
||||
"lbl_space": "Mellemrum",
|
||||
"lbl_loading": "Indlæser…",
|
||||
"lbl_blurred": "Sløret",
|
||||
"lbl_none": "Ingen",
|
||||
"lbl_scanner": "Scanner",
|
||||
"lbl_document": "Dokument",
|
||||
"lbl_folder": "Mappe",
|
||||
"empty_scan_hint": "Angiv en mappesti og klik",
|
||||
"empty_flagged_found": "Ingen markerede dokumenter fundet.",
|
||||
"preview_click_hint": "Klik på et dokument for at forhåndsvise det",
|
||||
"kbd_select": "vælg",
|
||||
"kbd_delete": "slet",
|
||||
"kbd_close_preview": "luk forhåndsvisning",
|
||||
"kbd_select_all": "vælg alle",
|
||||
"sort_cpr_asc": "CPR-antal ↑",
|
||||
"preview_error": "Forhåndsvisningsfejl",
|
||||
"preview_unavailable": "Forhåndsvisning utilgængelig",
|
||||
"preview_not_available": "Forhåndsvisning ikke tilgængelig for denne filtype",
|
||||
"lbl_anonymised": "Anonymiseret",
|
||||
"lbl_masked": "CPR maskeret",
|
||||
"lbl_processing": "Behandler…",
|
||||
"lbl_error": "Fejl",
|
||||
"lbl_no_pii": "Ingen ændringer — ingen PII fundet",
|
||||
"badge_anonymised": "✓ anonymiseret",
|
||||
"badge_masked": "✓ maskeret",
|
||||
"badge_blurred": "✓ sløret",
|
||||
"lbl_working": "Arbejder…",
|
||||
"lbl_stopping": "Stopper…",
|
||||
"lbl_no_files_selected": "Ingen filer valgt",
|
||||
"lbl_selected_1": "fil valgt",
|
||||
"lbl_selected_n": "filer valgt",
|
||||
"dialog_delete_body": "Dette vil permanent slette de valgte filer fra disken. Denne handling kan ikke fortrydes.",
|
||||
"lbl_flagged_docs_1": "markeret dokument",
|
||||
"lbl_flagged_docs_n": "markerede dokumenter",
|
||||
"banner_all_clean": "Ingen fund",
|
||||
"banner_files_scanned": "fil(er) scannet, ingen CPR-numre fundet",
|
||||
"banner_need_attention": "fil(er) kræver opmærksomhed ud af",
|
||||
"banner_scanned": "scannet",
|
||||
"summary_face_blur": "billede(r) til ansigtsslørning",
|
||||
"badge_face": "ansigt",
|
||||
"badge_shared": "delt",
|
||||
"badge_archive": "arkiv",
|
||||
"badge_shared_cpr": "Delt CPR",
|
||||
"lbl_also_in": "også i",
|
||||
"filter_shared_cpr": "⚠ Delt CPR",
|
||||
"risk_high": "HØJ",
|
||||
"risk_medium": "MIDDEL",
|
||||
"risk_low": "LAV",
|
||||
"reason_cpr_number": "CPR-nummer",
|
||||
"reason_cpr_numbers": "CPR-numre",
|
||||
"reason_cpr_confirmed": "CPR(er) med nøgleordskontext",
|
||||
"reason_unique_individuals": "unikke personer",
|
||||
"reason_cpr_shared": "CPR delt på tværs af {n} filer",
|
||||
"reason_data_10y": "data > 10 år gammel",
|
||||
"reason_data_5y": "data > 5 år gammel",
|
||||
"btn_export_excel": "Eksporter rapport som Excel",
|
||||
"btn_audit_log_short": "Revisionslog",
|
||||
"btn_delete_selected": "Slet markerede",
|
||||
"audit_action_scan": "Scanning",
|
||||
"audit_action_redact": "Anonymisering",
|
||||
"audit_action_blur_faces": "Ansigtsslørning",
|
||||
"audit_action_delete": "Sletning",
|
||||
"audit_action_restore": "Gendannelse",
|
||||
"audit_action_export": "Eksport",
|
||||
"audit_files": "filer",
|
||||
"audit_flagged": "markerede",
|
||||
"audit_high_risk": "høj risiko",
|
||||
"audit_regions": "områder",
|
||||
"audit_faces": "ansigter",
|
||||
"audit_permanent": "permanent",
|
||||
"audit_trash": "papirkurv",
|
||||
"audit_files_restored": "fil(er) gendannet",
|
||||
"confirm_clear_audit": "Ryd hele revisionsloggen? Dette kan ikke fortrydes.",
|
||||
"lang_spanish": "Spansk",
|
||||
"lang_italian": "Italiensk",
|
||||
"lang_portuguese": "Portugisisk",
|
||||
"lang_finnish": "Finsk",
|
||||
"lang_polish": "Polsk",
|
||||
"lang_czech": "Tjekkisk",
|
||||
"lang_russian": "Russisk",
|
||||
"lang_arabic": "Arabisk",
|
||||
"lang_chinese_simplified": "Kinesisk (forenklet)",
|
||||
"lang_chinese_traditional": "Kinesisk (traditionelt)",
|
||||
"lang_japanese": "Japansk",
|
||||
"lang_korean": "Koreansk",
|
||||
"lbl_root": "rod",
|
||||
"lbl_root_folder": "rodmappe",
|
||||
"lbl_scanning": "Scanner:",
|
||||
"btn_deselect_all": "Fravælg alle",
|
||||
"filter_high_risk": "🔴 Høj risiko",
|
||||
"filter_in_archive": "📦 I arkiv",
|
||||
"log_starting_scan": "Starter scanning af",
|
||||
"log_found_files": "Fandt {n} fil(er) at scanne",
|
||||
"log_cloud_skipped": "kun-sky filer sprunget over",
|
||||
"log_faces_detected": "ansigt(er) fundet",
|
||||
"log_ocr_pages": "side(r)",
|
||||
"log_pages_skipped": "billedside(r) sprunget over (aktivér OCR)",
|
||||
"log_scan_complete": "Scanning fuldført",
|
||||
"log_files_with_cpr": "fil(er) med CPR",
|
||||
"log_no_faces_in": "Ingen ansigter fundet i",
|
||||
"pii_phone": "telefon",
|
||||
"pii_email": "e-mail",
|
||||
"pii_iban": "IBAN",
|
||||
"pii_bank_account": "bankkonto",
|
||||
"pii_name": "navn",
|
||||
"pii_address": "adresse",
|
||||
"pii_org": "org",
|
||||
"lbl_other_pii": "Andre PII",
|
||||
"lbl_found": "fundet",
|
||||
"btn_clear_results_cache": "Ryd resultatcache",
|
||||
"btn_clear_ocr_cache": "Ryd OCR-cache",
|
||||
"confirm_clear_results_cache": "Ryd alle gemte scanningsresultater? Gitteret vil blive ryddet.",
|
||||
"confirm_clear_ocr_cache": "Ryd OCR-cache? Dette vil tvinge ny OCR ved næste scanning.",
|
||||
"log_cache_cleared": "Resultatcache ryddet",
|
||||
"log_ocr_cache_cleared": "OCR-cache ryddet",
|
||||
"m365_app_name": "GDPRScanner",
|
||||
"m365_sources": "Kilder",
|
||||
"m365_options": "Indstillinger",
|
||||
"m365_accounts": "Konti",
|
||||
"m365_stats": "Statistik",
|
||||
"m365_src_email": "Outlook",
|
||||
"m365_src_onedrive": "OneDrive",
|
||||
"m365_src_sharepoint": "SharePoint",
|
||||
"m365_src_teams": "Teams",
|
||||
"m365_opt_date_from": "Scan e-mails/filer fra",
|
||||
"m365_opt_date_from_hint": "Lad være tom for at scanne alt",
|
||||
"m365_opt_email_body": "Scan e-mailindhold",
|
||||
"m365_opt_attachments": "Scan vedhæftede filer",
|
||||
"m365_opt_max_attach": "Maks. vedhæftet filstørrelse (MB)",
|
||||
"m365_opt_max_emails": "Maks. e-mails pr. bruger",
|
||||
"m365_connect_title": "Opret forbindelse til Microsoft 365",
|
||||
"m365_connect_sub": "Angiv dine Azure-appoplysninger for at logge ind.",
|
||||
"m365_label_client_id": "Klient-ID (Applikations-ID)",
|
||||
"m365_label_tenant_id": "Lejer-ID",
|
||||
"m365_label_client_secret": "Klienthemmelighed",
|
||||
"m365_secret_hint": "(valgfri — aktiverer scanning på tværs af organisationen)",
|
||||
"m365_secret_desc_app": "appen tilgår alle brugeres data direkte (applikationstilladelser, kræver ikke login).",
|
||||
"m365_secret_desc_delegated": "du logger ind som dig selv og kan kun scanne egne data, medmindre du er Global Admin.",
|
||||
"m365_btn_connect": "Opret forbindelse",
|
||||
"m365_device_code_go": "Gå til",
|
||||
"m365_device_code_enter": "og indtast denne kode",
|
||||
"m365_btn_cancel_auth": "Annullér",
|
||||
"m365_btn_reconfigure": "Rekonfigurér",
|
||||
"m365_btn_sign_out": "Log ud",
|
||||
"m365_mode_app": "🔑 App-tilstand — hele org.",
|
||||
"m365_mode_delegated": "Delegeret",
|
||||
"m365_search_users": "Søg brugere…",
|
||||
"m365_add_account_label": "Tilføj konto manuelt:",
|
||||
"m365_add_account_placeholder": "e-mail eller UPN",
|
||||
"m365_admin_note": "Viser kun din konto. For at liste alle brugere skal en administrator give samtykke til <strong>User.Read.All</strong> i Azure Portal, eller tilføj konti manuelt nedenfor.",
|
||||
"m365_btn_scan": "Scan",
|
||||
"m365_btn_stop": "Stop",
|
||||
"m365_pill_flagged": "markerede",
|
||||
"m365_pill_scanned": "scannet",
|
||||
"m365_filter_all_sources": "Alle kilder",
|
||||
"m365_filter_email": "Outlook",
|
||||
"m365_filter_onedrive": "OneDrive",
|
||||
"m365_filter_sharepoint": "SharePoint",
|
||||
"m365_filter_teams": "Teams",
|
||||
"m365_empty_hint": "Vælg kilder og klik på <strong>Scan</strong><br>for at finde dokumenter med CPR-numre",
|
||||
"m365_stat_flagged": "Markerede",
|
||||
"m365_stat_cpr": "CPR-fund",
|
||||
"m365_preview_open": "Åbn i M365 ↗",
|
||||
"m365_preview_close": "Luk",
|
||||
"m365_auth_mode_app": "Godkendelsestilstand: Applikation (klientoplysninger — hele org.)",
|
||||
"m365_auth_mode_delegated": "Godkendelsestilstand: Delegeret (enhedskode — kun indlogget bruger)",
|
||||
"m365_phase_teams_index": "Bygger Teams-medlemskabsindeks…",
|
||||
"m365_phase_sharepoint": "Indsamler SharePoint-filer…",
|
||||
"m365_btn_about": "Om",
|
||||
"m365_stat_scanned": "Scannet",
|
||||
"m365_no_users_found": "Ingen brugere fundet",
|
||||
"m365_no_users_match": "Ingen brugere matcher",
|
||||
"m365_no_cpr_found": "Ingen CPR-numre fundet.",
|
||||
"m365_no_matches": "Ingen match",
|
||||
"m365_btn_export_excel": "Eksporter Excel",
|
||||
"m365_export_no_data": "Ingen resultater at eksportere.",
|
||||
"m365_phase_emails": "Indsamler Outlook-beskeder",
|
||||
"m365_phase_onedrive": "Indsamler OneDrive",
|
||||
"m365_phase_teams": "Indsamler Teams",
|
||||
"m365_preset_1yr": "1 år",
|
||||
"m365_preset_2yr": "2 år",
|
||||
"m365_preset_5yr": "5 år",
|
||||
"m365_preset_10yr": "10 år",
|
||||
"m365_preset_any": "Alle",
|
||||
"m365_auth_mode_app_short": "Application permissions · client credentials",
|
||||
"m365_auth_mode_delegated_short": "Delegated permissions · device code flow",
|
||||
"m365_info_permissions": "Tilladelser",
|
||||
"m365_info_signin": "Log-ind krævet",
|
||||
"m365_info_scope": "Rækkevidde",
|
||||
"m365_info_scope_org": "Alle brugere i tenant",
|
||||
"m365_info_scope_user": "Kun den indloggede bruger",
|
||||
"m365_info_consent": "Administratorsamtykke",
|
||||
"m365_info_required": "Påkrævet",
|
||||
"m365_info_admin": "Global Administrator",
|
||||
"m365_info_expands_scope": "Udvider rækkevidde til alle brugere",
|
||||
"m365_info_no": "Nej",
|
||||
"m365_info_yes": "Ja",
|
||||
"m365_info_app_desc": "Appen godkender sig med et Client Secret og tilgår alle brugeres data direkte via Microsoft Graph — intet interaktivt login kræves. Ideel til automatiserede eller planlagte scanninger.",
|
||||
"m365_info_delegated_desc": "Appen handler på vegne af den indloggede bruger via device code flow. Som standard er kun den pågældende brugers data tilgængeligt. En Global Administrator kan give bredere samtykke til at scanne alle brugere.",
|
||||
"m365_filter_search": "Søg…",
|
||||
"m365_filter_clear": "Ryd",
|
||||
"m365_btn_list_view": "Liste",
|
||||
"m365_btn_grid_view": "Gitter",
|
||||
"m365_log_found_items": "Fandt",
|
||||
"m365_log_items_to_scan": "element(er) til scanning",
|
||||
"m365_log_starting_scan": "Starter scanning:",
|
||||
"m365_log_accounts": "konto(er)",
|
||||
"m365_btn_bulk_delete": "Slet",
|
||||
"m365_bulk_delete_title": "Massesletning",
|
||||
"m365_bulk_delete_sub": "E-mails flyttes til Slettet post · Filer sendes til papirkurven",
|
||||
"m365_bulk_filter_heading": "Filtrer hvad der skal slettes",
|
||||
"m365_bulk_filter_source": "Kildetype",
|
||||
"m365_bulk_filter_min_cpr": "Min. CPR-fund",
|
||||
"m365_bulk_filter_older_than": "Ældre end dato",
|
||||
"m365_bulk_no_match": "Ingen elementer matcher disse kriterier.",
|
||||
"m365_bulk_match_count": "element(er) vil blive slettet",
|
||||
"m365_bulk_confirm_q": "element(er) slettes permanent. Fortsæt?",
|
||||
"m365_bulk_deleting": "Sletter…",
|
||||
"m365_bulk_deleted": "slettet",
|
||||
"m365_bulk_failed": "mislykkedes",
|
||||
"m365_bulk_delete_confirm": "Slet matchende elementer",
|
||||
"m365_delete_confirm": "Slet",
|
||||
"m365_delete_warning": "Dette kan ikke fortrydes.",
|
||||
"m365_log_deleted": "Slettet:",
|
||||
"m365_log_delete_failed": "Sletning mislykkedes:",
|
||||
"m365_log_bulk_done": "Massesletning:",
|
||||
"m365_log_older_than": "ældre end",
|
||||
"m365_eta_left": "tilbage",
|
||||
"btn_all": "Alle",
|
||||
"btn_errors": "Fejl",
|
||||
"log_copy": "Kopier",
|
||||
"btn_none": "Ingen",
|
||||
"m365_btn_resume": "Genoptag",
|
||||
"m365_btn_start_fresh": "Start forfra",
|
||||
"m365_resume_banner": "Tidligere scanning afbrudt — {scanned} skannet, {flagged} fundet",
|
||||
"m365_log_resuming": "Genoptager scanning:",
|
||||
"m365_log_already_scanned": "allerede skannet — sprunget over",
|
||||
"m365_resuming": "Genoptager — springer allerede skannede elementer over…",
|
||||
"m365_opt_delta": "Delta-scanning",
|
||||
"m365_opt_delta_hint": "Kun ændrede elementer (efter første fulde scanning)",
|
||||
"m365_delta_tokens_saved": "Tokens gemt",
|
||||
"m365_delta_clear": "Ryd tokens",
|
||||
"m365_delta_cleared": "Delta-tokens ryddet — næste scanning bliver fuld scanning.",
|
||||
"m365_delta_mode": "Delta-tilstand — henter kun ændrede elementer…",
|
||||
"m365_smtp_title": "✉ Send rapport",
|
||||
"m365_smtp_desc": "Send Excel-rapporten via e-mail efter scanning.",
|
||||
"m365_smtp_host": "SMTP-server",
|
||||
"m365_smtp_port": "Port",
|
||||
"m365_smtp_user": "Brugernavn",
|
||||
"m365_smtp_pass": "Adgangskode",
|
||||
"m365_smtp_from": "Afsenderadresse",
|
||||
"m365_smtp_tls": "STARTTLS",
|
||||
"m365_smtp_ssl": "SSL",
|
||||
"m365_smtp_recipients": "Modtagere",
|
||||
"m365_smtp_recipients_hint": "Adskil med komma eller semikolon",
|
||||
"m365_smtp_save": "Gem",
|
||||
"m365_smtp_send": "Send nu",
|
||||
"m365_smtp_saved": "Indstillinger gemt.",
|
||||
"m365_smtp_sending": "Sender…",
|
||||
"m365_smtp_sent": "Rapport sendt.",
|
||||
"m365_smtp_no_recipients": "Angiv mindst én modtager.",
|
||||
"m365_smtp_configure": "Konfigurer",
|
||||
"m365_smtp_from_hint": "(valgfri — standard er brugernavn)",
|
||||
"m365_subject_title": "🔍 Registreret person",
|
||||
"m365_subject_btn": "Slå op",
|
||||
"m365_subject_desc": "Find alle markerede elementer med et givet CPR-nummer. CPR-nummeret hashes før søgning og gemmes aldrig i klartekst.",
|
||||
"m365_subject_placeholder": "DDMMYY-XXXX",
|
||||
"m365_subject_search": "Søg",
|
||||
"m365_subject_searching": "Søger…",
|
||||
"m365_subject_found": "element(er) fundet",
|
||||
"m365_subject_not_found": "Ingen markerede elementer fundet for dette CPR-nummer.",
|
||||
"m365_subject_delete_all": "Slet alle for denne person",
|
||||
"m365_subject_delete_confirm": "element(er) slettes permanent. Fortsæt?",
|
||||
"m365_disposition_label": "Disposition",
|
||||
"m365_disp_unreviewed": "Ikke gennemgået",
|
||||
"m365_disp_retain_legal": "Opbevar — lovkrav",
|
||||
"m365_disp_retain_legit": "Opbevar — legitim interesse",
|
||||
"m365_disp_retain_contract": "Opbevar — kontrakt",
|
||||
"m365_disp_delete_sched": "Slet — planlagt",
|
||||
"m365_disp_personal_use": "Privat brug — uden for scope",
|
||||
"m365_disp_deleted": "Slettet",
|
||||
"m365_disp_save": "Gem",
|
||||
"m365_disp_saved": "✓ Gemt",
|
||||
"m365_opt_retention": "Opbevaringspolitik",
|
||||
"m365_opt_retention_hint": "Flag og slet elementer ældre end N år",
|
||||
"m365_ret_years": "Opbevaringsår",
|
||||
"m365_ret_fy_end": "Regnskabsårs afslutning",
|
||||
"m365_ret_fy_rolling": "Løbende (fra i dag)",
|
||||
"m365_ret_fy_dec": "31 dec. (Bogføringsloven)",
|
||||
"m365_ret_fy_jun": "30 jun.",
|
||||
"m365_ret_fy_mar": "31 mar.",
|
||||
"m365_ret_mode_rolling": "løbende",
|
||||
"m365_ret_mode_fiscal": "regnskabsår",
|
||||
"m365_ret_cutoff_hint": "Elementer ændret før",
|
||||
"m365_ret_cutoff_flagged": "markeres som forfaldne",
|
||||
"m365_overdue_found": "forfaldne element(er) fundet",
|
||||
"m365_bulk_overdue_btn": "Filtrer forfaldne",
|
||||
"m365_bulk_clear_filters": "Ryd filtre",
|
||||
"m365_btn_export_article30": "Art.30",
|
||||
"m365_article30_done": "Artikel 30-rapport klar.",
|
||||
"a30_title": "GDPR Artikel 30",
|
||||
"a30_subtitle": "Fortegnelse over behandlingsaktiviteter",
|
||||
"a30_generated": "Genereret",
|
||||
"a30_confidential": "Fortroligt — GDPR-overholdelses dokument",
|
||||
"a30_s1": "1. Oversigt",
|
||||
"a30_scan_date": "Scanningsdato",
|
||||
"a30_items_scanned": "Scannede elementer",
|
||||
"a30_flagged": "Markerede elementer",
|
||||
"a30_cpr_hits": "CPR-fund i alt",
|
||||
"a30_data_subjects": "Anslåede registrerede",
|
||||
"a30_overdue": "Forfaldne elementer (>5 år)",
|
||||
"a30_by_source": "Fordeling efter kilde",
|
||||
"a30_col_source": "Kilde",
|
||||
"a30_col_items": "Elementer",
|
||||
"a30_col_cpr": "CPR-fund",
|
||||
"a30_col_overdue": "Forfaldne",
|
||||
"a30_s2": "2. Identificerede kategorier af personoplysninger",
|
||||
"a30_s2_intro": "Følgende kategorier af personoplysninger blev fundet under scanning.",
|
||||
"a30_col_gdpr_class": "GDPR-klassifikation",
|
||||
"a30_cpr_label": "CPR-numre (dansk personnummer)",
|
||||
"a30_cpr_class": "Art. 9 — nationalt identifikationsnummer",
|
||||
"a30_pii_class_9": "Art. 9 — helbred/følsomme",
|
||||
"a30_pii_class_4": "Art. 4 — personoplysninger",
|
||||
"a30_s3": "3. Datafortegnelse",
|
||||
"a30_s3_intro": "Alle markerede elementer er listet nedenfor med placering, opbevaringsstatus og dispositionsstatus.",
|
||||
"a30_col_name": "Navn / Emne",
|
||||
"a30_col_account": "Konto",
|
||||
"a30_col_modified": "Ændret",
|
||||
"a30_col_disp": "Disposition",
|
||||
"a30_more_items": "yderligere elementer vises ikke. Eksporter Excel-rapporten for den fulde liste.",
|
||||
"a30_s4": "4. Opbevaringsanalyse",
|
||||
"a30_s4_intro": "Følgende elementer overskrider 5-års opbevaringsgrænsen og bør gennemgås for sletning iht. GDPR artikel 5(1)(e) — opbevaringsbegrænsning.",
|
||||
"a30_s5": "5. Overholdelsestrend",
|
||||
"a30_s5_intro": "Antal markerede elementer over de seneste scanninger (nyeste først).",
|
||||
"a30_col_scan_date": "Scanningsdato",
|
||||
"a30_col_scan_type": "Scanningstype",
|
||||
"a30_scan_delta": "Delta",
|
||||
"a30_scan_full": "Fuld",
|
||||
"a30_s6": "6. Metode og retsgrundlag",
|
||||
"a30_method_title": "Scanningsmetode",
|
||||
"a30_method_1": "CPR-numre registreres ved mønstergenkendelse mod det officielle danske CPR-format (DDMMYY-XXXX) med fuld datovalidering og århundrede-cifferverifikation iht. CPR-registerets regler.",
|
||||
"a30_method_2": "Yderligere personoplysninger (telefonnumre, e-mailadresser, IBAN, bankkontonumre, navne, adresser og organisationer) registreres med regex og spaCy NER.",
|
||||
"a30_method_3": "CPR-numre i dette dokuments database er SHA-256-hashede og gemmes aldrig i klartekst.",
|
||||
"a30_method_4": "Scanning dækker Exchange-mailbokse (alle mapper inkl. Sendt post), OneDrive, SharePoint og Microsoft Teams-kanalefiler via Microsoft Graph API. Ved tilslutning dækker Google Workspace-scanning Gmail og Google Drev via en tjenestekonto med domæneomfattende delegation. Lokale og netværksbaserede filshares (SMB) scannes direkte.",
|
||||
"a30_gdpr_title": "Refererede GDPR-artikler",
|
||||
"a30_gdpr_1": "Artikel 5(1)(c) — Dataminimering: kun nødvendige oplysninger må opbevares",
|
||||
"a30_gdpr_2": "Artikel 5(1)(e) — Opbevaringsbegrænsning: data må ikke opbevares længere end nødvendigt",
|
||||
"a30_gdpr_3": "Artikel 9 — Særlige kategorier: helbredsoplysninger, strafbare forhold, fagforeningsmedlemskab mv. kræver udtrykkeligt retsgrundlag",
|
||||
"a30_gdpr_4": "Artikel 15 — Ret til indsigt: registrerede kan anmode om oplysninger om deres data",
|
||||
"a30_gdpr_5": "Artikel 17 — Ret til sletning: registrerede kan anmode om sletning",
|
||||
"a30_gdpr_6": "Artikel 30 — Fortegnelse over behandlingsaktiviteter: dette dokument opfylder forpligtelsen",
|
||||
"a30_disp_unreviewed": "Ikke gennemgået",
|
||||
"a30_disp_retain_legal": "Opbevar — Lovkrav",
|
||||
"a30_disp_retain_legit": "Opbevar — Legitim interesse",
|
||||
"a30_disp_retain_contract": "Opbevar — Kontrakt",
|
||||
"a30_disp_delete_sched": "Slet — Planlagt",
|
||||
"a30_disp_personal_use": "Personal use — out of GDPR scope (Art. 2(2)(c))",
|
||||
"a30_disp_deleted": "Slettet",
|
||||
"a30_s6_short": "Metode og retsgrundlag",
|
||||
"m365_role_all": "Alle",
|
||||
"m365_role_staff": "Ansat",
|
||||
"m365_role_student": "Elev",
|
||||
"a30_s_dellog": "Sletningslog",
|
||||
"a30_dellog_intro": "element(er) med personoplysninger er slettet via GDPRScanner. Denne log opfylder dokumentationspligten i GDPR artikel 5, stk. 2.",
|
||||
"a30_dellog_by_reason": "Sletninger efter årsag",
|
||||
"a30_dellog_records": "Sletningsposter",
|
||||
"a30_col_reason": "Årsag",
|
||||
"a30_col_count": "Antal",
|
||||
"a30_col_deleted_at": "Slettet den",
|
||||
"a30_col_deleted_by": "Slettet af",
|
||||
"a30_reason_manual": "Manuel (enkelt kort)",
|
||||
"a30_reason_bulk": "Massesletning",
|
||||
"a30_reason_retention": "Opbevaringspolitik",
|
||||
"a30_reason_dsr": "Sletningsanmodning fra registreret (art. 17)",
|
||||
"m365_filter_all_disp": "Alle dispositioner",
|
||||
"m365_trend_title": "Tendens",
|
||||
"m365_trend_flagged": "Markerede",
|
||||
"m365_trend_overdue": "Forfaldne",
|
||||
"m365_filter_all_transfer": "Alle elementer",
|
||||
"m365_filter_ext_recipient": "Ekstern modtager",
|
||||
"m365_filter_ext_share": "Eksternt delt",
|
||||
"m365_filter_shared": "Delt",
|
||||
"m365_badge_ext_recipient": "Ekstern",
|
||||
"m365_badge_shared": "Delt",
|
||||
"a30_s_special": "Særlige kategorier af personoplysninger (artikel 9)",
|
||||
"a30_special_intro": "element(er) indeholder særlige kategorier af personoplysninger iht. GDPR artikel 9. Kræver eksplicit retsgrundlag og konsekvensanalyse (DPIA).",
|
||||
"a30_special_by_cat": "Opdagede kategorier",
|
||||
"a30_special_items": "Berørte elementer (op til 50)",
|
||||
"a30_col_category": "Kategori",
|
||||
"a30_cat_health": "Helbredsoplysninger (art. 9)",
|
||||
"a30_cat_mental": "Psykisk helbred (art. 9)",
|
||||
"a30_cat_criminal": "Strafbare forhold (art. 10)",
|
||||
"a30_cat_union": "Fagforeningsmedlemskab (art. 9)",
|
||||
"a30_cat_religion": "Religiøs overbevisning (art. 9)",
|
||||
"a30_cat_ethnicity": "Etnisk oprindelse (art. 9)",
|
||||
"a30_cat_political": "Politisk overbevisning (art. 9)",
|
||||
"a30_cat_biometric": "Biometriske oplysninger (art. 9)",
|
||||
"a30_cat_sexual": "Seksuel orientering (art. 9)",
|
||||
"m365_filter_all_special": "Alle risikoniveauer",
|
||||
"m365_filter_special_only": "Art. 9 følsomme data",
|
||||
"m365_badge_special": "Art.9",
|
||||
"m365_phase_scanning": "Scanner…",
|
||||
"a30_special_cat": "Særlige kategorier (artikel 9)",
|
||||
"a30_special_cat_note": "Disse elementer indeholder helbredsoplysninger, straffeoplysninger, biometriske data, religiøse, etniske, fagforeningsmæssige, politiske eller seksuelle oplysninger. Et eksplicit retsgrundlag (art. 9, stk. 2) og eventuelt en konsekvensanalyse (art. 35) er påkrævet.",
|
||||
"a30_col_special": "Art. 9",
|
||||
"a30_pii_phone": "Telefonnumre",
|
||||
"a30_pii_email": "E-mailadresser",
|
||||
"a30_pii_iban": "IBAN-bankkontonumre",
|
||||
"a30_pii_bank": "Bankkontonumre",
|
||||
"a30_pii_name": "Personnavne (NER)",
|
||||
"a30_pii_address": "Adresser (NER)",
|
||||
"a30_pii_org": "Organisationer (NER)",
|
||||
"a30_col_cpr_short": "CPR",
|
||||
"a30_inv_staff": "Personale / Undervisere",
|
||||
"a30_inv_students": "Elever",
|
||||
"a30_student_consent_note": "Bemærk: Elevers konti i dansk folkeskole (elever under 15 år) kræver forældrenes samtykke til behandling af personoplysninger i henhold til Databeskyttelsesloven §6. Elementer i elevers konti må ikke slettes automatisk — enhver handling kræver godkendelse fra skoleledelsen, og for elever under 15 år skal forældre eller værger som rettighedshavere underrettes i henhold til GDPR artikel 8.",
|
||||
"m365_profile_label": "Profil:",
|
||||
"m365_profile_placeholder": "— Vælg profil —",
|
||||
"m365_profile_save_tip": "Gem aktuelle indstillinger som profil",
|
||||
"m365_profile_save_prompt": "Profilnavn:",
|
||||
"m365_profile_applied": "Profil indlæst",
|
||||
"m365_profile_saved": "Profil gemt",
|
||||
"m365_profile_manage_btn": "Profiler",
|
||||
"m365_profile_clear_btn": "Ryd",
|
||||
"m365_profile_save_btn": "Gem",
|
||||
"m365_profile_manage_title": "⚙ Administrer profiler",
|
||||
"m365_profile_no_profiles": "Ingen gemte profiler endnu. Brug 💾 til at gemme de aktuelle sidebjælkeindstillinger som en profil.",
|
||||
"m365_profile_use": "Brug",
|
||||
"m365_profile_edit": "Rediger",
|
||||
"m365_profile_duplicate": "Dupliker",
|
||||
"m365_profile_delete": "Slet",
|
||||
"m365_profile_delete_confirm": "Slet profil",
|
||||
"m365_profile_duplicated": "Profil duplikeret",
|
||||
"m365_profile_deleted": "Profil slettet",
|
||||
"m365_profile_never": "aldrig",
|
||||
"m365_profile_last_run": "Sidst kørt",
|
||||
"m365_profile_name_placeholder": "Profilnavn",
|
||||
"m365_profile_desc_placeholder": "Beskrivelse (valgfri)",
|
||||
"m365_profile_name_required": "Profilnavn er påkrævet.",
|
||||
"m365_db_title": "🗄 Database",
|
||||
"m365_db_export": "Eksporter",
|
||||
"m365_db_import": "Importer",
|
||||
"m365_db_export_error": "Eksport mislykkedes",
|
||||
"m365_db_exported": "Database eksporteret",
|
||||
"m365_db_import_title": "📥 Importer database",
|
||||
"m365_db_import_desc": "Vælg en tidligere eksporteret .zip-fil. Sammenfletning tilføjer dispositioner og slettelog. Erstatning sletter alt og gendanner fuldt ud.",
|
||||
"m365_db_import_file": "ZIP-fil",
|
||||
"m365_db_import_mode": "Tilstand:",
|
||||
"m365_db_import_merge": "Sammenflet (sikker)",
|
||||
"m365_db_import_replace": "Erstat (fuld gendannelse)",
|
||||
"m365_db_import_replace_warn": "⚠ Erstatningstilstand sletter alle eksisterende scanningsdata inden gendannelse. Sørg for at have en sikkerhedskopi af ~/.gdpr_scanner.db først.",
|
||||
"m365_db_import_replace_confirm": "Erstatningstilstand sletter ALLE eksisterende scanningsdata og gendanner fra arkivet.\\n\\nSørg for at have en manuel sikkerhedskopi af ~/.gdpr_scanner.db.\\n\\nFortsæt?",
|
||||
"m365_db_import_no_file": "Vælg venligst en ZIP-fil først.",
|
||||
"m365_db_importing": "Importerer…",
|
||||
"m365_db_imported": "Importeret",
|
||||
"m365_db_import_run": "Importer",
|
||||
"m365_opt_scan_photos": "Søg efter ansigter i billeder",
|
||||
"m365_opt_scan_photos_hint": "Markerer billeder med registrerede ansigter som Art. 9 biometriske data. Langsommere — aktivér efter behov.",
|
||||
"m365_filter_photo_only": "📷 Billeder / biometrisk",
|
||||
"m365_badge_faces": "ansigter",
|
||||
"a30_photo_items": "Billeder med registrerede ansigter (Art. 9 biometrisk)",
|
||||
"a30_photo_note": "Fotografier af identificerbare personer er biometriske data i henhold til Art. 9 GDPR. Opbevaring kræver et dokumenteret retsgrundlag i henhold til Art. 9(2). For skolefotografier af elever under 15 år er forældrenes samtykke påkrævet (Databeskyttelsesloven §6). Se Datatilsynets vejledning om fotografering i skoler.",
|
||||
"a30_s_photos": "Fotografier og biometriske data (artikel 9)",
|
||||
"a30_photo_intro": "billedfil(er) med registrerede ansigt(er) blev fundet i scanningen. Fotografier af identificerbare personer udgør biometriske data i henhold til GDPR artikel 9 og er underlagt den samme forhøjede beskyttelse som sundheds- eller straffeoplysninger.",
|
||||
"a30_photo_guidance": "Vejledning om opbevaringsperiode",
|
||||
"a30_photo_g1": "Billeder må kun opbevares, så længe det oprindelige formål er gyldigt (Art. 5(1)(b) — formålsbegrænsning).",
|
||||
"a30_photo_g2": "Elever under 15 år kræver forældrenes samtykke (Databeskyttelsesloven §6). Samtykket skal være frit givet, specifikt og dokumenteret.",
|
||||
"a30_photo_g3": "Billeder på offentligt tilgængelige hjemmesider skal fjernes straks, når en person forlader organisationen eller trækker sit samtykke tilbage (Art. 17 — retten til sletning).",
|
||||
"a30_photo_g4": "Historisk/arkivbrug kan begrunde længere opbevaring i henhold til Art. 89 kun med specifikke sikkerhedsforanstaltninger og en konkret vurdering.",
|
||||
"a30_photo_col_faces": "Ansigter",
|
||||
"a30_method_5": "Når billedscanning er aktiveret, analyseres billedfiler ved hjælp af OpenCV Haar cascade-ansigtsdetektion for at identificere fotografier af personer (Art. 9 biometriske data).",
|
||||
"m365_role_cycle_tip": "Klik for at ændre rolle (skifter elev → personale → andet → auto)",
|
||||
"m365_role_set": "Rolle sat",
|
||||
"m365_role_cleared": "Rolletilsidesættelse fjernet",
|
||||
"m365_sku_debug_title": "🔍 Lejer-SKU-ID'er",
|
||||
"m365_sku_debug_desc": "Dette er de rå SKU-ID'er tildelt dine brugere. Dem markeret ❓ ukendt er ikke i classification/m365_skus.json — kopiér dem ind under student_ids eller staff_ids og genstart.",
|
||||
"m365_sku_debug_none": "Ingen licensdata returneret — kontrollér at appen har User.Read.All tilladelse.",
|
||||
"m365_file_sources_title": "📁 Filkilder",
|
||||
"m365_file_sources_manage": "Administrer",
|
||||
"m365_file_sources_empty": "Ingen filkilder konfigureret. Tilføj en lokal mappe eller netværksdeling nedenfor.",
|
||||
"m365_file_sources_add": "Tilføj kilde",
|
||||
"m365_fsrc_label": "Betegnelse",
|
||||
"m365_fsrc_path": "Sti",
|
||||
"m365_fsrc_smb_detected": "SMB/CIFS-netværksdeling registreret",
|
||||
"m365_fsrc_smb_host": "SMB-vært",
|
||||
"m365_fsrc_smb_user": "Brugernavn",
|
||||
"m365_fsrc_smb_pw": "Adgangskode",
|
||||
"m365_fsrc_smb_pw_hint": "Adgangskoden gemmes i nøglekæden — aldrig i en fil.",
|
||||
"m365_fsrc_add_btn": "Tilføj",
|
||||
"m365_fsrc_saved": "Kilde gemt",
|
||||
"m365_fsrc_saving": "Gemmer...",
|
||||
"m365_fsrc_path_required": "Sti er påkrævet.",
|
||||
"m365_fsrc_scan_btn": "Scan",
|
||||
"m365_fsrc_scan_start": "Starter filscanning",
|
||||
"m365_src_group_files": "Filkilder",
|
||||
"m365_no_sources": "Ingen kilder valgt — intet at scanne.",
|
||||
"m365_fsrc_name_required": "Navn er påkrævet.",
|
||||
"m365_srcmgmt_title": "⚙ Kildeadministration",
|
||||
"m365_srcmgmt_tab_m365": "Microsoft 365",
|
||||
"m365_srcmgmt_tab_google": "Google Workspace",
|
||||
"m365_srcmgmt_tab_files": "Filkilder",
|
||||
"m365_srcmgmt_connection": "Forbindelse",
|
||||
"m365_srcmgmt_azure_creds": "Azure-legitimationsoplysninger",
|
||||
"m365_srcmgmt_sources_m365": "Kilder der skal scannes",
|
||||
"m365_srcmgmt_connected": "Forbundet",
|
||||
"m365_srcmgmt_not_connected": "Ikke forbundet",
|
||||
"m365_srcmgmt_coming_soon": "Kommer snart",
|
||||
"m365_srcmgmt_google_sub": "Gmail og Google Drev-scanning vises her, når det er implementeret.",
|
||||
"m365_srcmgmt_file_sources": "Filkilder",
|
||||
"m365_sources_manage_btn": "Kilder",
|
||||
"m365_connecting": "Opretter forbindelse...",
|
||||
"m365_err_creds_required": "Klient-ID og lejer-ID er påkrævet",
|
||||
"m365_signout_confirm": "Afbryd forbindelsen og ryd legitimationsoplysninger?",
|
||||
"m365_btn_settings": "Indstillinger",
|
||||
"m365_settings_title": "⚙ Indstillinger",
|
||||
"m365_settings_tab_general": "Generelt",
|
||||
"m365_settings_tab_email": "E-mailrapport",
|
||||
"m365_settings_tab_database": "Database",
|
||||
"m365_settings_appearance": "Udseende",
|
||||
"m365_settings_language": "Sprog",
|
||||
"m365_settings_theme": "Tema",
|
||||
"m365_settings_db_actions": "Handlinger",
|
||||
"m365_db_reset": "Nulstil database",
|
||||
"m365_db_reset_confirm": "Nulstil database? Alle scanresultater slettes.",
|
||||
"m365_db_reset_done": "Database nulstillet",
|
||||
"m365_db_scans": "Scanninger",
|
||||
"m365_smtp_saving": "Gemmer...",
|
||||
"m365_settings_admin_pin": "Admin-PIN",
|
||||
"m365_settings_pin_hint": "Påkrævet ved destruktive handlinger (f.eks. nulstil database). Lad stå tom for at deaktivere.",
|
||||
"m365_settings_current_pin": "Nuværende PIN",
|
||||
"m365_settings_new_pin": "Ny PIN",
|
||||
"m365_settings_confirm_pin": "Bekræft PIN",
|
||||
"m365_settings_pin_set": "Admin-PIN er indstillet",
|
||||
"m365_settings_pin_not_set": "Ingen PIN — nulstil database er ubeskyttet",
|
||||
"m365_settings_pin_required": "PIN er påkrævet.",
|
||||
"m365_settings_pin_mismatch": "PINs stemmer ikke overens.",
|
||||
"m365_settings_pin_wrong": "Forkert PIN — nulstilling annulleret.",
|
||||
"m365_settings_pin_saved": "PIN gemt",
|
||||
"m365_settings_enter_pin": "Indtast admin-PIN",
|
||||
"m365_settings_enter_pin_reset": "Indtast admin-PIN for at nulstille databasen.",
|
||||
"btn_confirm": "Bekræft",
|
||||
"m365_log_scan_started": "Scanning startet",
|
||||
"m365_preview_local_file": "Lokal fil — ingen cloud-forhåndsvisning tilgængelig",
|
||||
"m365_badge_gps": "GPS-position",
|
||||
"a30_gps_items": "Elementer med GPS-placeringsdata (Art. 4 — placering = persondata)",
|
||||
"a30_exif_pii_items": "Elementer med EXIF-personoplysninger (forfatter, beskrivelse, nøgleord)",
|
||||
"a30_gps_title": "Elementer med GPS-placeringsdata",
|
||||
"a30_gps_intro": "Følgende filer indeholder GPS-koordinater indlejret i EXIF-metadata. Placeringsdata udgør personoplysninger i henhold til GDPR Art. 4.",
|
||||
"a30_gps_col_lat": "Breddegrad",
|
||||
"a30_gps_col_lon": "Længdegrad",
|
||||
"m365_accounts_disabled_tip": "Vælg en Microsoft 365-kilde for at aktivere kontovalg",
|
||||
"m365_smtp_test": "Test",
|
||||
"m365_smtp_testing": "Sender test-email…",
|
||||
"m365_smtp_test_ok": "Test-email sendt",
|
||||
"m365_smtp_test_fail": "Forbindelse mislykkedes",
|
||||
"m365_fsrc_edit_btn": "Rediger",
|
||||
"m365_fsrc_save_changes": "Gem ændringer",
|
||||
"m365_settings_tab_scheduler": "Planlægger",
|
||||
"m365_sched_title": "Planlagte scanninger",
|
||||
"m365_sched_next": "Næste",
|
||||
"m365_sched_hint": "Kør scanninger automatisk på et fast tidspunkt. Kræver en aktiv M365-forbindelse (app-tilstand anbefales).",
|
||||
"m365_sched_no_aps": "⚠ APScheduler ikke installeret. Kør: pip install apscheduler",
|
||||
"m365_sched_enabled": "Aktivér planlægger",
|
||||
"m365_sched_frequency": "Frekvens",
|
||||
"m365_sched_dow": "Ugedag",
|
||||
"m365_sched_dom": "Dag i måneden",
|
||||
"m365_sched_time": "Tidspunkt",
|
||||
"m365_sched_profile": "Profil",
|
||||
"m365_sched_profile_last": "Sidst gemte indstillinger",
|
||||
"m365_sched_after_scan": "Efter scanning",
|
||||
"m365_sched_auto_email": "Send rapport automatisk",
|
||||
"m365_sched_auto_retention": "Håndhæv opbevaringspolitik",
|
||||
"m365_sched_status": "Status",
|
||||
"m365_sched_run_now": "▶ Kør nu",
|
||||
"m365_sched_add": "+ Tilføj planlagt scanning",
|
||||
"m365_sched_name": "Navn",
|
||||
"m365_sched_editor_new": "Ny planlagt scanning",
|
||||
"m365_sched_editor_edit": "Rediger planlagt scanning",
|
||||
"m365_sched_name_required": "Navn er påkrævet",
|
||||
"m365_sched_no_runs": "Ingen planlagte kørsler endnu",
|
||||
"m365_sched_freq_daily": "Dagligt",
|
||||
"m365_sched_freq_weekly": "Ugentligt",
|
||||
"m365_sched_freq_monthly": "Månedligt",
|
||||
"m365_sched_dow_mon": "Mandag",
|
||||
"m365_sched_dow_tue": "Tirsdag",
|
||||
"m365_sched_dow_wed": "Onsdag",
|
||||
"m365_sched_dow_thu": "Torsdag",
|
||||
"m365_sched_dow_fri": "Fredag",
|
||||
"m365_sched_dow_sat": "Lørdag",
|
||||
"m365_sched_dow_sun": "Søndag",
|
||||
"btn_save": "Gem",
|
||||
"m365_settings_about": "Om",
|
||||
"m365_settings_save_pin": "Gem PIN",
|
||||
"m365_sse_reconnecting": "Genopretter forbindelse til kørende scanning…",
|
||||
"m365_sse_replay_note": "Live-log genoptaget — tidligere indlæg afspillet fra igangværende scanning.",
|
||||
"m365_google_sa_creds": "Tjenestekonto-legitimationsoplysninger",
|
||||
"m365_google_sa_key_file": "JSON-nøgle til tjenestekonto",
|
||||
"m365_google_sa_key_hint": "Download fra Google Cloud Console → IAM & Admin → Tjenestekonti → Nøgler → Tilføj nøgle → JSON",
|
||||
"m365_google_admin_email": "Admin-e-mail",
|
||||
"m365_google_admin_email_hint": "Bruges til domæneomfattende delegation — skal være Workspace-superadmin.",
|
||||
"m365_google_libs_missing": "Biblioteker ikke installeret",
|
||||
"m365_google_key_required": "Vælg en JSON-nøglefil til tjenestekontoen",
|
||||
"m365_google_invalid_json": "Ugyldig JSON-fil",
|
||||
"m365_srcmgmt_sources_google": "Kilder der skal scannes",
|
||||
"m365_google_src_gmail": "Gmail",
|
||||
"m365_google_src_drive": "Google Drev",
|
||||
"m365_google_setup_title": "Opsætning kræves i Google Workspace:",
|
||||
"m365_google_setup_step1": "Opret et Google Cloud-projekt og aktiver Gmail API + Drive API + Admin SDK.",
|
||||
"m365_google_setup_step2": "Opret en tjenestekonto, download JSON-nøglen, og aktiver domæneomfattende delegation.",
|
||||
"m365_google_setup_step3": "I Workspace Admin → Sikkerhed → API-kontroller → Domæneomfattende delegation, tilføj tjenestekontoens klient-ID med omfang:",
|
||||
"m365_google_auth_mode": "Godkendelsestilstand",
|
||||
"m365_google_mode_workspace": "Workspace",
|
||||
"m365_google_mode_personal": "Personlig konto",
|
||||
"m365_google_personal_creds": "Personlig konto",
|
||||
"m365_google_personal_client_id": "Klient-ID",
|
||||
"m365_google_personal_client_secret": "Klienthemmelighed",
|
||||
"m365_google_personal_hint": "Opret OAuth 2.0 Desktop-legitimationsoplysninger i Google Cloud Console, og indsæt klient-ID og hemmelighed ovenfor.",
|
||||
"m365_google_personal_sign_in": "Log ind",
|
||||
"m365_google_personal_creds_required": "Klient-ID og hemmelighed er påkrævet",
|
||||
"m365_google_personal_setup_title": "Opsætning kræves:",
|
||||
"m365_google_personal_setup_step1": "I Google Cloud Console skal du oprette et projekt og aktivere Gmail API + Drive API.",
|
||||
"m365_google_personal_setup_step2": "Opret OAuth 2.0-legitimationsoplysninger (typen Desktop-app) og kopiér klient-ID og hemmelighed.",
|
||||
"m365_google_personal_setup_step3": "Tilføj din Google-konto-e-mail til listen over testbrugere på OAuth-samtykkeskærmen.",
|
||||
"m365_auth_waiting": "Venter på login…",
|
||||
"role_staff": "Ansat",
|
||||
"role_student": "Elev",
|
||||
"role_other": "Anden",
|
||||
|
||||
"m365_settings_tab_security": "Sikkerhed",
|
||||
|
||||
"share_modal_title": "Del resultater",
|
||||
"share_modal_desc": "Skrivebeskyttede links lader en DPO eller gennemganger se resultater og tilknytte dispositioner uden adgang til scanningskontroller eller legitimationsoplysninger.",
|
||||
"share_new_link": "Nyt link",
|
||||
"share_label_lbl": "Etiket (valgfrit)",
|
||||
"share_label_placeholder": "f.eks. DPO-gennemgang 2026",
|
||||
"share_expires_in": "Udløber om",
|
||||
"share_expires_never": "Aldrig",
|
||||
"share_expires_7d": "7 dage",
|
||||
"share_expires_30d": "30 dage",
|
||||
"share_expires_90d": "90 dage",
|
||||
"share_expires_1y": "1 år",
|
||||
"share_create": "Opret",
|
||||
"share_copy_link_prompt": "Kopiér link:",
|
||||
"share_active_links": "Aktive links",
|
||||
"share_viewer_pin_label": "Seerens PIN:",
|
||||
"share_pin_configure": "Konfigurér",
|
||||
"share_pin_set": "Angivet",
|
||||
"share_pin_not_set": "Ikke angivet",
|
||||
"share_no_links": "Ingen aktive links.",
|
||||
"share_unlabelled": "Uden etiket",
|
||||
"share_expires_prefix": "Udløber:",
|
||||
"share_last_used": "Sidst brugt:",
|
||||
"share_revoke": "Tilbagekald",
|
||||
"share_copied": "Kopiéret!",
|
||||
"share_load_error": "Kunne ikke indlæse links.",
|
||||
"share_create_error": "Kunne ikke oprette link:",
|
||||
"share_revoke_confirm": "Tilbagekald dette link? Alle der bruger det, mister straks adgang.",
|
||||
"share_revoke_error": "Kunne ikke tilbagekalde:",
|
||||
|
||||
"viewer_pin_group_title": "Seerens PIN",
|
||||
"viewer_pin_desc": "En numerisk PIN (4–8 cifre), der lader alle åbne <code style=\"font-size:10px\">/view</code> i en browser for skrivebeskyttet adgang til resultater uden et token-link.",
|
||||
"viewer_pin_clear": "Ryd PIN",
|
||||
"viewer_pin_is_set": "Seerens PIN er angivet",
|
||||
"viewer_pin_not_set_msg": "Ingen PIN angivet — /view kræver et token-link",
|
||||
"viewer_pin_format": "PIN skal være 4–8 cifre.",
|
||||
"viewer_pin_saving": "Gemmer…",
|
||||
"viewer_pin_saved": "PIN gemt",
|
||||
"viewer_pin_clear_confirm": "Fjern seerens PIN? /view vil igen kræve et token-link.",
|
||||
"viewer_pin_cleared": "PIN ryddet"
|
||||
}
|
||||
+773
@@ -0,0 +1,773 @@
|
||||
{
|
||||
"app_name": "Document Scanner",
|
||||
"label_root_folder": "Stammordner",
|
||||
"label_older_than": "Dateien mit Daten älter als markieren",
|
||||
"placeholder_folder": "/pfad/zu/dokumenten",
|
||||
"btn_scan": "Scan starten",
|
||||
"btn_stop": "Scan stoppen",
|
||||
"toggle_anonymise": "Anonymisieren",
|
||||
"toggle_mask": "Nur Ausweis-Nr. maskieren",
|
||||
"toggle_blur_faces": "Gesichter unscharf",
|
||||
"toggle_skip_cloud": "Nur-Cloud-Dateien überspringen",
|
||||
"toggle_ocr": "OCR für gescannte PDFs",
|
||||
"label_face_sensitivity": "Gesichtsempfindlichkeit",
|
||||
"face_sensitivity_high": "Hoch",
|
||||
"face_sensitivity_low": "Niedrig",
|
||||
"face_sensitivity_hint": "Höher = weniger Fehlerkennungen",
|
||||
"label_ocr_language": "OCR-Sprache",
|
||||
"label_ocr_dpi": "DPI (Qualität vs. Geschwindigkeit)",
|
||||
"lang_danish": "Dänisch",
|
||||
"lang_danish_english": "Dänisch + Englisch",
|
||||
"lang_english": "Englisch",
|
||||
"lang_norwegian": "Norwegisch",
|
||||
"lang_swedish": "Schwedisch",
|
||||
"lang_german": "Deutsch",
|
||||
"lang_french": "Französisch",
|
||||
"lang_dutch": "Niederländisch",
|
||||
"lang_spanish": "Spanisch",
|
||||
"lang_italian": "Italienisch",
|
||||
"lang_portuguese": "Portugiesisch",
|
||||
"lang_finnish": "Finnisch",
|
||||
"lang_polish": "Polnisch",
|
||||
"lang_czech": "Tschechisch",
|
||||
"lang_russian": "Russisch",
|
||||
"lang_arabic": "Arabisch",
|
||||
"lang_chinese_simplified": "Chinesisch (vereinfacht)",
|
||||
"lang_chinese_traditional": "Chinesisch (traditionell)",
|
||||
"lang_japanese": "Japanisch",
|
||||
"lang_korean": "Koreanisch",
|
||||
"time_any": "Beliebig",
|
||||
"time_1y": "1 Jahr",
|
||||
"time_2y": "2 Jahre",
|
||||
"time_5y": "5 Jahre",
|
||||
"time_10y": "10 Jahre",
|
||||
"stat_scanned": "Gescannte Dateien",
|
||||
"stat_flagged": "Markierte",
|
||||
"stat_high_risk": "Hohes Risiko",
|
||||
"stat_cpr": "Ausweis-Nr. gefunden",
|
||||
"col_file": "Datei",
|
||||
"col_cpr": "Ausweis-Nr.",
|
||||
"col_oldest": "Ältestes Datum",
|
||||
"col_risk": "Risiko",
|
||||
"col_action": "Aktion",
|
||||
"col_detail": "Details",
|
||||
"sort_name_az": "Name A–Z",
|
||||
"sort_name_za": "Name Z–A",
|
||||
"sort_cpr_desc": "Anzahl Ausweis-Nr. ↓",
|
||||
"sort_cpr_asc": "Anzahl Ausweis-Nr. ↑",
|
||||
"sort_oldest_desc": "Ältestes Datum ↓",
|
||||
"sort_risk_desc": "Risiko ↓",
|
||||
"sort_size_desc": "Größe ↓",
|
||||
"filter_all_types": "Alle Typen",
|
||||
"filter_pdf": "PDF",
|
||||
"filter_word": "Word",
|
||||
"filter_excel": "Excel",
|
||||
"filter_image": "Bild",
|
||||
"filter_shared_cpr": "⚠ Geteilte Ausweis-Nr.",
|
||||
"placeholder_search": "Dateiname suchen…",
|
||||
"btn_anonymise": "Anonymisieren",
|
||||
"btn_mask": "Ausweis-Nr. maskieren",
|
||||
"btn_blur": "Unscharf",
|
||||
"btn_preview": "Vorschau",
|
||||
"btn_show_in_folder": "Im Ordner anzeigen",
|
||||
"btn_move_to_trash": "In den Papierkorb",
|
||||
"btn_undo": "Rückgängig",
|
||||
"btn_export_csv": "CSV",
|
||||
"btn_select_all": "Alle auswählen",
|
||||
"btn_anonymise_flagged": "Markierte anonymisieren",
|
||||
"btn_anonymise_all": "Alle markierten anonymisieren",
|
||||
"btn_cancel": "Abbrechen",
|
||||
"btn_close": "Schließen",
|
||||
"btn_clear": "Leeren",
|
||||
"btn_export_excel": "Bericht als Excel exportieren",
|
||||
"btn_audit_log_short": "Protokoll",
|
||||
"btn_delete_selected": "Auswahl löschen",
|
||||
"btn_about": "Über",
|
||||
"preview_original": "Original",
|
||||
"preview_processed": "Verarbeitet",
|
||||
"preview_anonymise": "Anonymisieren → Vorschau",
|
||||
"preview_mask": "Ausweis-Nr. maskieren → Vorschau",
|
||||
"preview_blur_faces": "{n} Gesicht(er) unscharf → Vorschau",
|
||||
"preview_no_faces": "✓ Keine Gesichter erkannt",
|
||||
"preview_scanning_faces": "Gesichter werden gesucht…",
|
||||
"preview_processing_faces": "Gesichter werden verarbeitet…",
|
||||
"preview_rendering": "Wird geladen…",
|
||||
"preview_click_hint": "Auf ein Dokument klicken, um die Vorschau anzuzeigen",
|
||||
"preview_error": "Vorschaufehler",
|
||||
"preview_unavailable": "Vorschau nicht verfügbar",
|
||||
"preview_not_available": "Vorschau für diesen Dateityp nicht verfügbar",
|
||||
"scan_preparing": "Vorbereitung…",
|
||||
"scan_scanning": "Wird gescannt…",
|
||||
"scan_face_scanning": "{total} Datei(en) auf Gesichter prüfen…",
|
||||
"scan_face_progress": "Gesichter: {index} / {total} — {file}",
|
||||
"scan_eta": "{eta} verbleibend",
|
||||
"scan_stopped": "Scan gestoppt.",
|
||||
"empty_flagged": "Keine markierten Dokumente",
|
||||
"empty_flagged_detail": "Scan starten, um markierte Dokumente anzuzeigen",
|
||||
"empty_flagged_found": "Keine markierten Dokumente gefunden.",
|
||||
"empty_filter": "Keine Dateien entsprechen dem Filter",
|
||||
"empty_scan_hint": "Ordnerpfad eingeben und klicken",
|
||||
"no_audit": "Noch keine Protokolleinträge",
|
||||
"dialog_delete_title": "Dateien löschen?",
|
||||
"dialog_delete_confirm": "In den Papierkorb",
|
||||
"dialog_delete_body": "Die ausgewählten Dateien werden dauerhaft von der Festplatte gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"all_trashed": "Alle markierten Dokumente wurden in den Papierkorb verschoben.",
|
||||
"confirm_clear_audit": "Gesamtes Protokoll leeren? Dies kann nicht rückgängig gemacht werden.",
|
||||
"btn_audit_log": "Protokoll",
|
||||
"audit_cleared": "Protokoll geleert",
|
||||
"failed_audit": "Protokoll konnte nicht geladen werden",
|
||||
"audit_action_scan": "Scan",
|
||||
"audit_action_redact": "Schwärzung",
|
||||
"audit_action_blur_faces": "Gesichtsunschärfe",
|
||||
"audit_action_delete": "Löschen",
|
||||
"audit_action_restore": "Wiederherstellen",
|
||||
"audit_action_export": "Export",
|
||||
"audit_files": "Dateien",
|
||||
"audit_flagged": "markiert",
|
||||
"audit_high_risk": "hohes Risiko",
|
||||
"audit_regions": "Bereiche",
|
||||
"audit_faces": "Gesichter",
|
||||
"audit_permanent": "dauerhaft",
|
||||
"audit_trash": "Papierkorb",
|
||||
"audit_files_restored": "Datei(en) wiederhergestellt",
|
||||
"about_title": "Über",
|
||||
"label_python": "Python",
|
||||
"label_spacy": "spaCy-Modell",
|
||||
"label_tesseract": "Tesseract",
|
||||
"label_pymupdf": "PyMuPDF",
|
||||
"label_opencv": "OpenCV",
|
||||
"no_model": "kein Modell installiert",
|
||||
"not_installed": "nicht installiert",
|
||||
"risk_high": "HOCH",
|
||||
"risk_medium": "MITTEL",
|
||||
"risk_low": "NIEDRIG",
|
||||
"reason_cpr_number": "Ausweis-Nr.",
|
||||
"reason_cpr_numbers": "Ausweis-Nummern",
|
||||
"reason_cpr_confirmed": "Ausweis-Nr. mit Schlüsselwortkontext",
|
||||
"reason_unique_individuals": "eindeutige Personen",
|
||||
"reason_cpr_shared": "Ausweis-Nr. in {n} Dateien geteilt",
|
||||
"reason_data_10y": "Daten > 10 Jahre alt",
|
||||
"reason_data_5y": "Daten > 5 Jahre alt",
|
||||
"badge_face": "Gesicht",
|
||||
"badge_shared": "geteilt",
|
||||
"badge_archive": "Archiv",
|
||||
"badge_shared_cpr": "Geteilte Ausweis-Nr.",
|
||||
"lbl_also_in": "auch in",
|
||||
"badge_anonymised": "✓ anonymisiert",
|
||||
"badge_masked": "✓ maskiert",
|
||||
"badge_blurred": "✓ unscharf gemacht",
|
||||
"lbl_anonymised": "Anonymisiert",
|
||||
"lbl_masked": "Ausweis-Nr. maskiert",
|
||||
"lbl_processing": "Wird verarbeitet…",
|
||||
"lbl_error": "Fehler",
|
||||
"lbl_no_pii": "Keine Änderungen — keine personenbez. Daten gefunden",
|
||||
"lbl_working": "Wird bearbeitet…",
|
||||
"lbl_stopping": "Wird gestoppt…",
|
||||
"lbl_loading": "Wird geladen…",
|
||||
"lbl_blurred": "Unscharf gemacht",
|
||||
"lbl_none": "Keine",
|
||||
"lbl_size": "Größe",
|
||||
"lbl_time": "Zeit",
|
||||
"lbl_space": "Leerzeichen",
|
||||
"lbl_scanner": "Scanner",
|
||||
"lbl_document": "Dokument",
|
||||
"lbl_folder": "Ordner",
|
||||
"lbl_no_files_selected": "Keine Dateien ausgewählt",
|
||||
"lbl_selected_1": "Datei ausgewählt",
|
||||
"lbl_selected_n": "Dateien ausgewählt",
|
||||
"lbl_root": "Stamm",
|
||||
"lbl_root_folder": "Stammordner",
|
||||
"lbl_scanning": "Scannen:",
|
||||
"banner_all_clean": "Keine Funde",
|
||||
"banner_files_scanned": "Datei(en) gescannt, keine Ausweis-Nr. gefunden",
|
||||
"banner_need_attention": "Datei(en) erfordern Aufmerksamkeit von",
|
||||
"banner_scanned": "gescannt",
|
||||
"summary_face_blur": "Bild(er) zur Gesichtsunschärfe",
|
||||
"kbd_select": "auswählen",
|
||||
"kbd_delete": "löschen",
|
||||
"kbd_close_preview": "Vorschau schließen",
|
||||
"kbd_select_all": "alle auswählen",
|
||||
"lbl_flagged_docs_1": "markiertes Dokument",
|
||||
"lbl_flagged_docs_n": "markierte Dokumente",
|
||||
"btn_deselect_all": "Alle abwählen",
|
||||
"filter_high_risk": "🔴 Hohes Risiko",
|
||||
"filter_in_archive": "📦 Im Archiv",
|
||||
"log_starting_scan": "Scan gestartet von",
|
||||
"log_found_files": "{n} Datei(en) gefunden",
|
||||
"log_cloud_skipped": "Nur-Cloud-Dateien übersprungen",
|
||||
"log_faces_detected": "Gesicht(er) erkannt",
|
||||
"log_ocr_pages": "Seite(n)",
|
||||
"log_pages_skipped": "Bildseite(n) übersprungen (OCR aktivieren)",
|
||||
"log_scan_complete": "Scan abgeschlossen",
|
||||
"log_files_with_cpr": "Datei(en) mit Ausweis-Nr.",
|
||||
"log_no_faces_in": "Keine Gesichter erkannt in",
|
||||
"pii_phone": "Telefon",
|
||||
"pii_email": "E-Mail",
|
||||
"pii_iban": "IBAN",
|
||||
"pii_bank_account": "Bankkonto",
|
||||
"pii_name": "Name",
|
||||
"pii_address": "Adresse",
|
||||
"pii_org": "Org",
|
||||
"lbl_other_pii": "Weitere PII",
|
||||
"lbl_found": "gefunden",
|
||||
"btn_clear_results_cache": "Ergebniscache leeren",
|
||||
"btn_clear_ocr_cache": "OCR-Cache leeren",
|
||||
"confirm_clear_results_cache": "Alle gespeicherten Scan-Ergebnisse löschen? Das Raster wird geleert.",
|
||||
"confirm_clear_ocr_cache": "OCR-Cache leeren? Beim nächsten Scan wird OCR erneut durchgeführt.",
|
||||
"log_cache_cleared": "Ergebniscache geleert",
|
||||
"log_ocr_cache_cleared": "OCR-Cache geleert",
|
||||
"m365_app_name": "GDPRScanner",
|
||||
"m365_sources": "Quellen",
|
||||
"m365_options": "Optionen",
|
||||
"m365_accounts": "Konten",
|
||||
"m365_stats": "Statistik",
|
||||
"m365_src_email": "Outlook",
|
||||
"m365_src_onedrive": "OneDrive",
|
||||
"m365_src_sharepoint": "SharePoint",
|
||||
"m365_src_teams": "Teams",
|
||||
"m365_opt_date_from": "E-Mails/Dateien scannen ab",
|
||||
"m365_opt_date_from_hint": "Leer lassen, um alles zu scannen",
|
||||
"m365_opt_email_body": "E-Mail-Text scannen",
|
||||
"m365_opt_attachments": "Anhänge scannen",
|
||||
"m365_opt_max_attach": "Max. Anhangsgröße (MB)",
|
||||
"m365_opt_max_emails": "Max. E-Mails pro Benutzer",
|
||||
"m365_connect_title": "Mit Microsoft 365 verbinden",
|
||||
"m365_connect_sub": "Geben Sie Ihre Azure-App-Anmeldedaten ein.",
|
||||
"m365_label_client_id": "Client-ID (Anwendungs-ID)",
|
||||
"m365_label_tenant_id": "Mandanten-ID",
|
||||
"m365_label_client_secret": "Client-Geheimnis",
|
||||
"m365_secret_hint": "(optional — ermöglicht organisationsweites Scannen)",
|
||||
"m365_secret_desc_app": "App greift direkt auf Daten aller Benutzer zu (Anwendungsberechtigungen, keine Anmeldung erforderlich).",
|
||||
"m365_secret_desc_delegated": "Sie melden sich als sich selbst an und können nur eigene Daten scannen, sofern Sie kein globaler Administrator sind.",
|
||||
"m365_btn_connect": "Verbinden",
|
||||
"m365_device_code_go": "Gehen Sie zu",
|
||||
"m365_device_code_enter": "und geben Sie diesen Code ein",
|
||||
"m365_btn_cancel_auth": "Abbrechen",
|
||||
"m365_btn_reconfigure": "Neu konfigurieren",
|
||||
"m365_btn_sign_out": "Abmelden",
|
||||
"m365_mode_app": "🔑 App-Modus — organisationsweit",
|
||||
"m365_mode_delegated": "Delegiert",
|
||||
"m365_search_users": "Benutzer suchen…",
|
||||
"m365_add_account_label": "Konto manuell hinzufügen:",
|
||||
"m365_add_account_placeholder": "E-Mail oder UPN",
|
||||
"m365_admin_note": "Es wird nur Ihr Konto angezeigt. Um alle Benutzer aufzulisten, muss ein Administrator <strong>User.Read.All</strong> im Azure Portal genehmigen oder Konten manuell unten hinzufügen.",
|
||||
"m365_btn_scan": "Scannen",
|
||||
"m365_btn_stop": "Stop",
|
||||
"m365_pill_flagged": "markiert",
|
||||
"m365_pill_scanned": "gescannt",
|
||||
"m365_filter_all_sources": "Alle Quellen",
|
||||
"m365_filter_email": "Outlook",
|
||||
"m365_filter_onedrive": "OneDrive",
|
||||
"m365_filter_sharepoint": "SharePoint",
|
||||
"m365_filter_teams": "Teams",
|
||||
"m365_empty_hint": "Quellen auswählen und auf <strong>Scannen</strong> klicken,<br>um Dokumente mit Ausweis-Nr. zu finden",
|
||||
"m365_stat_flagged": "Markiert",
|
||||
"m365_stat_cpr": "Treffer",
|
||||
"m365_preview_open": "In M365 öffnen ↗",
|
||||
"m365_preview_close": "Schließen",
|
||||
"m365_auth_mode_app": "Auth-Modus: Anwendung (Client-Anmeldedaten — organisationsweit)",
|
||||
"m365_auth_mode_delegated": "Auth-Modus: Delegiert (Gerätecode — nur angemeldeter Benutzer)",
|
||||
"m365_phase_teams_index": "Teams-Mitgliedschaftsindex wird erstellt…",
|
||||
"m365_phase_sharepoint": "SharePoint-Dateien werden gesammelt…",
|
||||
"m365_btn_about": "Info",
|
||||
"m365_stat_scanned": "Gescannt",
|
||||
"m365_no_users_found": "Keine Benutzer gefunden",
|
||||
"m365_no_users_match": "Keine Benutzer entsprechen",
|
||||
"m365_no_cpr_found": "Keine Ausweis-Nummern gefunden.",
|
||||
"m365_no_matches": "Keine Treffer",
|
||||
"m365_btn_export_excel": "Excel exportieren",
|
||||
"m365_export_no_data": "Keine Ergebnisse zum Exportieren.",
|
||||
"m365_phase_emails": "Outlook-Nachrichten werden gesammelt",
|
||||
"m365_phase_onedrive": "OneDrive wird gesammelt",
|
||||
"m365_phase_teams": "Teams werden gesammelt",
|
||||
"m365_preset_1yr": "1 J.",
|
||||
"m365_preset_2yr": "2 J.",
|
||||
"m365_preset_5yr": "5 J.",
|
||||
"m365_preset_10yr": "10 J.",
|
||||
"m365_preset_any": "Alle",
|
||||
"m365_auth_mode_app_short": "Application permissions · client credentials",
|
||||
"m365_auth_mode_delegated_short": "Delegated permissions · device code flow",
|
||||
"m365_info_permissions": "Berechtigungen",
|
||||
"m365_info_signin": "Anmeldung erforderlich",
|
||||
"m365_info_scope": "Umfang",
|
||||
"m365_info_scope_org": "Alle Benutzer im Mandanten",
|
||||
"m365_info_scope_user": "Nur angemeldeter Benutzer",
|
||||
"m365_info_consent": "Administratorzustimmung",
|
||||
"m365_info_required": "Erforderlich",
|
||||
"m365_info_admin": "Global Administrator",
|
||||
"m365_info_expands_scope": "Erweitert Umfang auf alle Benutzer",
|
||||
"m365_info_no": "Nein",
|
||||
"m365_info_yes": "Ja",
|
||||
"m365_info_app_desc": "Die App authentifiziert sich mit einem Client Secret und greift direkt über Microsoft Graph auf die Daten aller Benutzer zu — kein interaktives Anmelden erforderlich. Ideal für automatisierte oder geplante Scans.",
|
||||
"m365_info_delegated_desc": "Die App handelt im Namen des angemeldeten Benutzers über den device code flow. Standardmäßig sind nur die Daten dieses Benutzers zugänglich. Ein Global Administrator kann eine umfassendere Zustimmung erteilen.",
|
||||
"m365_filter_search": "Suchen…",
|
||||
"m365_filter_clear": "Löschen",
|
||||
"m365_btn_list_view": "Liste",
|
||||
"m365_btn_grid_view": "Raster",
|
||||
"m365_log_found_items": "Gefunden",
|
||||
"m365_log_items_to_scan": "Element(e) zum Scannen",
|
||||
"m365_log_starting_scan": "Scan starten:",
|
||||
"m365_log_accounts": "Konto(en)",
|
||||
"m365_btn_bulk_delete": "Löschen",
|
||||
"m365_bulk_delete_title": "Massenlöschung",
|
||||
"m365_bulk_delete_sub": "E-Mails werden in „Gelöschte Elemente\" verschoben · Dateien kommen in den Papierkorb",
|
||||
"m365_bulk_filter_heading": "Filter für zu löschende Elemente",
|
||||
"m365_bulk_filter_source": "Quellentyp",
|
||||
"m365_bulk_filter_min_cpr": "Min. CPR-Treffer",
|
||||
"m365_bulk_filter_older_than": "Älter als Datum",
|
||||
"m365_bulk_no_match": "Keine Elemente entsprechen diesen Kriterien.",
|
||||
"m365_bulk_match_count": "Element(e) werden gelöscht",
|
||||
"m365_bulk_confirm_q": "Element(e) werden dauerhaft gelöscht. Fortfahren?",
|
||||
"m365_bulk_deleting": "Löschen…",
|
||||
"m365_bulk_deleted": "gelöscht",
|
||||
"m365_bulk_failed": "fehlgeschlagen",
|
||||
"m365_bulk_delete_confirm": "Passende Elemente löschen",
|
||||
"m365_delete_confirm": "Löschen",
|
||||
"m365_delete_warning": "Dies kann nicht rückgängig gemacht werden.",
|
||||
"m365_log_deleted": "Gelöscht:",
|
||||
"m365_log_delete_failed": "Löschen fehlgeschlagen:",
|
||||
"m365_log_bulk_done": "Massenlöschung:",
|
||||
"m365_log_older_than": "älter als",
|
||||
"m365_eta_left": "verbleibend",
|
||||
"btn_all": "Alle",
|
||||
"btn_errors": "Fehler",
|
||||
"log_copy": "Kopieren",
|
||||
"btn_none": "Keine",
|
||||
"m365_btn_resume": "Fortsetzen",
|
||||
"m365_btn_start_fresh": "Neu starten",
|
||||
"m365_resume_banner": "Vorheriger Scan unterbrochen — {scanned} gescannt, {flagged} gefunden",
|
||||
"m365_log_resuming": "Scan fortsetzen:",
|
||||
"m365_log_already_scanned": "bereits gescannt — übersprungen",
|
||||
"m365_resuming": "Fortsetzen — bereits gescannte Elemente werden übersprungen…",
|
||||
"m365_opt_delta": "Delta-Scan",
|
||||
"m365_opt_delta_hint": "Nur geänderte Elemente (nach erstem Vollscan)",
|
||||
"m365_delta_tokens_saved": "Tokens gespeichert",
|
||||
"m365_delta_clear": "Tokens löschen",
|
||||
"m365_delta_cleared": "Delta-Tokens gelöscht — nächster Scan wird ein Vollscan.",
|
||||
"m365_delta_mode": "Delta-Modus — nur geänderte Elemente werden abgerufen…",
|
||||
"m365_smtp_title": "✉ Bericht senden",
|
||||
"m365_smtp_desc": "Excel-Bericht nach dem Scan per E-Mail senden.",
|
||||
"m365_smtp_host": "SMTP-Server",
|
||||
"m365_smtp_port": "Port",
|
||||
"m365_smtp_user": "Benutzername",
|
||||
"m365_smtp_pass": "Passwort",
|
||||
"m365_smtp_from": "Absenderadresse",
|
||||
"m365_smtp_tls": "STARTTLS",
|
||||
"m365_smtp_ssl": "SSL",
|
||||
"m365_smtp_recipients": "Empfänger",
|
||||
"m365_smtp_recipients_hint": "Komma- oder semikolongetrennt",
|
||||
"m365_smtp_save": "Speichern",
|
||||
"m365_smtp_send": "Jetzt senden",
|
||||
"m365_smtp_saved": "Einstellungen gespeichert.",
|
||||
"m365_smtp_sending": "Senden…",
|
||||
"m365_smtp_sent": "Bericht gesendet.",
|
||||
"m365_smtp_no_recipients": "Mindestens einen Empfänger eingeben.",
|
||||
"m365_smtp_configure": "Konfigurieren",
|
||||
"m365_smtp_from_hint": "(optional — Standard ist Benutzername)",
|
||||
"m365_subject_title": "🔍 Betroffenenperson",
|
||||
"m365_subject_btn": "Nachschlagen",
|
||||
"m365_subject_desc": "Alle markierten Elemente mit einer bestimmten CPR-Nummer finden. Die CPR-Nummer wird vor der Abfrage gehasht und nie im Klartext gespeichert.",
|
||||
"m365_subject_placeholder": "TTMMJJ-XXXX",
|
||||
"m365_subject_search": "Suchen",
|
||||
"m365_subject_searching": "Suche…",
|
||||
"m365_subject_found": "Element(e) gefunden",
|
||||
"m365_subject_not_found": "Keine markierten Elemente für diese CPR-Nummer gefunden.",
|
||||
"m365_subject_delete_all": "Alle für diese Person löschen",
|
||||
"m365_subject_delete_confirm": "Element(e) werden dauerhaft gelöscht. Fortfahren?",
|
||||
"m365_disposition_label": "Disposition",
|
||||
"m365_disp_unreviewed": "Nicht geprüft",
|
||||
"m365_disp_retain_legal": "Aufbewahren — gesetzliche Pflicht",
|
||||
"m365_disp_retain_legit": "Aufbewahren — berechtigtes Interesse",
|
||||
"m365_disp_retain_contract": "Aufbewahren — Vertrag",
|
||||
"m365_disp_delete_sched": "Löschen — geplant",
|
||||
"m365_disp_personal_use": "Privatgebrauch — außerhalb des Geltungsbereichs",
|
||||
"m365_disp_deleted": "Gelöscht",
|
||||
"m365_disp_save": "Speichern",
|
||||
"m365_disp_saved": "✓ Gespeichert",
|
||||
"m365_opt_retention": "Aufbewahrungsrichtlinie",
|
||||
"m365_opt_retention_hint": "Elemente älter als N Jahre markieren und löschen",
|
||||
"m365_ret_years": "Aufbewahrungsjahre",
|
||||
"m365_ret_fy_end": "Geschäftsjahresende",
|
||||
"m365_ret_fy_rolling": "Rollierend (ab heute)",
|
||||
"m365_ret_fy_dec": "31. Dez. (Bogføringsloven)",
|
||||
"m365_ret_fy_jun": "30. Jun.",
|
||||
"m365_ret_fy_mar": "31. Mär.",
|
||||
"m365_ret_mode_rolling": "rollierend",
|
||||
"m365_ret_mode_fiscal": "Geschäftsjahr",
|
||||
"m365_ret_cutoff_hint": "Elemente geändert vor",
|
||||
"m365_ret_cutoff_flagged": "werden als überfällig markiert",
|
||||
"m365_overdue_found": "überfällige(s) Element(e) gefunden",
|
||||
"m365_bulk_overdue_btn": "Übrfällige filtern",
|
||||
"m365_bulk_clear_filters": "Filter löschen",
|
||||
"m365_btn_export_article30": "Art.30",
|
||||
"m365_article30_done": "Artikel-30-Bericht bereit.",
|
||||
"a30_title": "DSGVO Artikel 30",
|
||||
"a30_subtitle": "Verzeichnis von Verarbeitungstätigkeiten",
|
||||
"a30_generated": "Erstellt",
|
||||
"a30_confidential": "Vertraulich — DSGVO-Compliance-Dokument",
|
||||
"a30_s1": "1. Zusammenfassung",
|
||||
"a30_scan_date": "Scan-Datum",
|
||||
"a30_items_scanned": "Gescannte Elemente",
|
||||
"a30_flagged": "Markierte Elemente",
|
||||
"a30_cpr_hits": "CPR-Treffer gesamt",
|
||||
"a30_data_subjects": "Geschätzte betroffene Personen",
|
||||
"a30_overdue": "Überfällige Elemente (>5 J.)",
|
||||
"a30_by_source": "Aufschlüsselung nach Quelle",
|
||||
"a30_col_source": "Quelle",
|
||||
"a30_col_items": "Elemente",
|
||||
"a30_col_cpr": "CPR-Treffer",
|
||||
"a30_col_overdue": "Überfällig",
|
||||
"a30_s2": "2. Identifizierte Kategorien personenbezogener Daten",
|
||||
"a30_s2_intro": "Folgende Kategorien personenbezogener Daten wurden beim Scan erkannt.",
|
||||
"a30_col_gdpr_class": "DSGVO-Klassifizierung",
|
||||
"a30_cpr_label": "CPR-Nummern (dän. Personalausweis-Nr.)",
|
||||
"a30_cpr_class": "Art. 9 — nationales Kennzeichen",
|
||||
"a30_pii_class_9": "Art. 9 — Gesundheit/sensibel",
|
||||
"a30_pii_class_4": "Art. 4 — personenbezogene Daten",
|
||||
"a30_s3": "3. Datenbestand",
|
||||
"a30_s3_intro": "Alle markierten Elemente sind unten mit Speicherort, Aufbewahrungsstatus und Compliance-Disposition aufgeführt.",
|
||||
"a30_col_name": "Name / Betreff",
|
||||
"a30_col_account": "Konto",
|
||||
"a30_col_modified": "Geändert",
|
||||
"a30_col_disp": "Disposition",
|
||||
"a30_more_items": "weitere Elemente nicht angezeigt. Für die vollständige Liste den Excel-Bericht exportieren.",
|
||||
"a30_s4": "4. Aufbewahrungsanalyse",
|
||||
"a30_s4_intro": "Folgende Elemente überschreiten den 5-jährigen Aufbewahrungszeitraum und sollten gemäß DSGVO Artikel 5(1)(e) — Speicherbegrenzung — auf Löschung geprüft werden.",
|
||||
"a30_s5": "5. Compliance-Trend",
|
||||
"a30_s5_intro": "Anzahl markierter Elemente über die letzten Scans (neuester zuerst).",
|
||||
"a30_col_scan_date": "Scan-Datum",
|
||||
"a30_col_scan_type": "Scan-Typ",
|
||||
"a30_scan_delta": "Delta",
|
||||
"a30_scan_full": "Vollständig",
|
||||
"a30_s6": "6. Methodik und Rechtsgrundlage",
|
||||
"a30_method_title": "Scan-Methodik",
|
||||
"a30_method_1": "CPR-Nummern werden per Mustererkennung gegen das offizielle dänische CPR-Format (TTMMJJ-XXXX) mit vollständiger Datumsvalidierung erkannt.",
|
||||
"a30_method_2": "Weitere personenbezogene Daten (Telefonnummern, E-Mail-Adressen, IBANs, Bankkontonummern, Namen, Adressen und Organisationen) werden per Regex und spaCy NER erkannt.",
|
||||
"a30_method_3": "CPR-Nummern in der Datenbank dieses Dokuments sind SHA-256-gehasht und werden nie im Klartext gespeichert.",
|
||||
"a30_method_4": "Die Überprüfung umfasst Exchange-Postfächer (alle Ordner einschl. Gesendete Elemente), OneDrive, SharePoint und Microsoft Teams-Kanaldateien über die Microsoft Graph API. Bei Verbindung umfasst das Google Workspace-Scanning Gmail und Google Drive über ein Dienstkonto mit domänenweiter Delegierung. Lokale und netzwerkbasierte Dateifreigaben (SMB) werden direkt gescannt.",
|
||||
"a30_gdpr_title": "Referenzierte DSGVO-Artikel",
|
||||
"a30_gdpr_1": "Artikel 5(1)(c) — Datenminimierung: nur notwendige Daten dürfen aufbewahrt werden",
|
||||
"a30_gdpr_2": "Artikel 5(1)(e) — Speicherbegrenzung: Daten dürfen nicht länger als nötig aufbewahrt werden",
|
||||
"a30_gdpr_3": "Artikel 9 — Besondere Kategorien: Gesundheitsdaten, Strafregister, Gewerkschaftszugehörigkeit usw. erfordern eine ausdrückliche Rechtsgrundlage",
|
||||
"a30_gdpr_4": "Artikel 15 — Auskunftsrecht: betroffene Personen können Auskunft über ihre Daten verlangen",
|
||||
"a30_gdpr_5": "Artikel 17 — Recht auf Löschung: betroffene Personen können Löschung verlangen",
|
||||
"a30_gdpr_6": "Artikel 30 — Verzeichnis von Verarbeitungstätigkeiten: dieses Dokument erfüllt die Pflicht",
|
||||
"a30_disp_unreviewed": "Nicht geprüft",
|
||||
"a30_disp_retain_legal": "Aufbewahren — Gesetzliche Pflicht",
|
||||
"a30_disp_retain_legit": "Aufbewahren — Berechtigtes Interesse",
|
||||
"a30_disp_retain_contract": "Aufbewahren — Vertrag",
|
||||
"a30_disp_delete_sched": "Löschen — Geplant",
|
||||
"a30_disp_personal_use": "Personal use — out of GDPR scope (Art. 2(2)(c))",
|
||||
"a30_disp_deleted": "Gelöscht",
|
||||
"a30_s6_short": "Methodik und Rechtsgrundlage",
|
||||
"m365_role_all": "Alle",
|
||||
"m365_role_staff": "Personal",
|
||||
"m365_role_student": "Schüler",
|
||||
"a30_s_dellog": "Löschprotokoll",
|
||||
"a30_dellog_intro": "Element(e) mit personenbezogenen Daten wurden über GDPRScanner gelöscht. Dieses Protokoll erfüllt die Rechenschaftspflicht gemäß DSGVO Art. 5 Abs. 2.",
|
||||
"a30_dellog_by_reason": "Löschungen nach Grund",
|
||||
"a30_dellog_records": "Löscheinträge",
|
||||
"a30_col_reason": "Grund",
|
||||
"a30_col_count": "Anzahl",
|
||||
"a30_col_deleted_at": "Gelöscht am",
|
||||
"a30_col_deleted_by": "Gelöscht von",
|
||||
"a30_reason_manual": "Manuell (einzelne Karte)",
|
||||
"a30_reason_bulk": "Massенlöschung",
|
||||
"a30_reason_retention": "Aufbewahrungsrichtlinie",
|
||||
"a30_reason_dsr": "Löschanfrage der betroffenen Person (Art. 17)",
|
||||
"m365_filter_all_disp": "Alle Dispositionen",
|
||||
"m365_trend_title": "Trend",
|
||||
"m365_trend_flagged": "Markiert",
|
||||
"m365_trend_overdue": "Überfällig",
|
||||
"m365_filter_all_transfer": "Alle Elemente",
|
||||
"m365_filter_ext_recipient": "Externer Empfänger",
|
||||
"m365_filter_ext_share": "Extern freigegeben",
|
||||
"m365_filter_shared": "Freigegeben",
|
||||
"m365_badge_ext_recipient": "Extern",
|
||||
"m365_badge_shared": "Freigegeben",
|
||||
"a30_s_special": "Besondere Kategorien personenbezogener Daten (Artikel 9)",
|
||||
"a30_special_intro": "Element(e) als besondere Kategorie gemäß DSGVO Artikel 9 erkannt. Erfordert explizite Rechtsgrundlage und Datenschutz-Folgenabschätzung (DSFA).",
|
||||
"a30_special_by_cat": "Erkannte Kategorien",
|
||||
"a30_special_items": "Betroffene Elemente (bis zu 50)",
|
||||
"a30_col_category": "Kategorie",
|
||||
"a30_cat_health": "Gesundheitsdaten (Art. 9)",
|
||||
"a30_cat_mental": "Psychische Gesundheit (Art. 9)",
|
||||
"a30_cat_criminal": "Strafregister (Art. 10)",
|
||||
"a30_cat_union": "Gewerkschaftsmitgliedschaft (Art. 9)",
|
||||
"a30_cat_religion": "Religiöse Überzeugungen (Art. 9)",
|
||||
"a30_cat_ethnicity": "Ethnische Herkunft (Art. 9)",
|
||||
"a30_cat_political": "Politische Meinungen (Art. 9)",
|
||||
"a30_cat_biometric": "Biometrische Daten (Art. 9)",
|
||||
"a30_cat_sexual": "Sexuelle Orientierung (Art. 9)",
|
||||
"m365_filter_all_special": "Alle Risikostufen",
|
||||
"m365_filter_special_only": "Art. 9 besondere Kategorien",
|
||||
"m365_badge_special": "Art.9",
|
||||
"m365_phase_scanning": "Scanne…",
|
||||
"a30_special_cat": "Besondere Kategorien (Artikel 9)",
|
||||
"a30_special_cat_note": "Diese Elemente enthalten Gesundheits-, Straf-, biometrische, religiöse, ethnische, gewerkschaftliche, politische oder sexuelle Daten. Eine ausdrückliche Rechtsgrundlage (Art. 9 Abs. 2) und ggf. eine DSFA (Art. 35) sind erforderlich.",
|
||||
"a30_col_special": "Art. 9",
|
||||
"a30_pii_phone": "Telefonnummern",
|
||||
"a30_pii_email": "E-Mail-Adressen",
|
||||
"a30_pii_iban": "IBAN-Bankkontonummern",
|
||||
"a30_pii_bank": "Bankkontonummern",
|
||||
"a30_pii_name": "Personennamen (NER)",
|
||||
"a30_pii_address": "Adressen (NER)",
|
||||
"a30_pii_org": "Organisationen (NER)",
|
||||
"a30_col_cpr_short": "CPR",
|
||||
"a30_inv_staff": "Personal / Lehrkräfte",
|
||||
"a30_inv_students": "Schüler",
|
||||
"a30_student_consent_note": "Hinweis: Schülerkonten in dänischen Folkeskoler (Schüler unter 15 Jahren) erfordern die elterliche Einwilligung zur Verarbeitung personenbezogener Daten gemäß Databeskyttelsesloven §6. Elemente in Schülerkonten dürfen nicht automatisch gelöscht werden — jede Maßnahme erfordert die Genehmigung der Schulleitung und für Schüler unter 15 Jahren die Benachrichtigung der Eltern oder Erziehungsberechtigten als Rechteinhaber gemäß DSGVO Artikel 8.",
|
||||
"m365_profile_label": "Profil:",
|
||||
"m365_profile_placeholder": "— Profil wählen —",
|
||||
"m365_profile_save_tip": "Aktuelle Einstellungen als Profil speichern",
|
||||
"m365_profile_save_prompt": "Profilname:",
|
||||
"m365_profile_applied": "Profil geladen",
|
||||
"m365_profile_saved": "Profil gespeichert",
|
||||
"m365_profile_manage_btn": "Profile",
|
||||
"m365_profile_clear_btn": "Löschen",
|
||||
"m365_profile_save_btn": "Speichern",
|
||||
"m365_profile_manage_title": "⚙ Profile verwalten",
|
||||
"m365_profile_no_profiles": "Noch keine gespeicherten Profile. Verwenden Sie 💾, um die aktuellen Seitenleisteneinstellungen als Profil zu speichern.",
|
||||
"m365_profile_use": "Verwenden",
|
||||
"m365_profile_edit": "Bearbeiten",
|
||||
"m365_profile_duplicate": "Duplizieren",
|
||||
"m365_profile_delete": "Löschen",
|
||||
"m365_profile_delete_confirm": "Profil löschen",
|
||||
"m365_profile_duplicated": "Profil dupliziert",
|
||||
"m365_profile_deleted": "Profil gelöscht",
|
||||
"m365_profile_never": "nie",
|
||||
"m365_profile_last_run": "Zuletzt ausgeführt",
|
||||
"m365_profile_name_placeholder": "Profilname",
|
||||
"m365_profile_desc_placeholder": "Beschreibung (optional)",
|
||||
"m365_profile_name_required": "Profilname ist erforderlich.",
|
||||
"m365_db_title": "🗄 Datenbank",
|
||||
"m365_db_export": "Exportieren",
|
||||
"m365_db_import": "Importieren",
|
||||
"m365_db_export_error": "Export fehlgeschlagen",
|
||||
"m365_db_exported": "Datenbank exportiert",
|
||||
"m365_db_import_title": "📥 Datenbank importieren",
|
||||
"m365_db_import_desc": "Wählen Sie eine zuvor exportierte .zip-Datei. Zusammenführen fügt Dispositionen und Löschprotokoll hinzu. Ersetzen löscht alles und stellt vollständig wieder her.",
|
||||
"m365_db_import_file": "ZIP-Datei",
|
||||
"m365_db_import_mode": "Modus:",
|
||||
"m365_db_import_merge": "Zusammenführen (sicher)",
|
||||
"m365_db_import_replace": "Ersetzen (vollständige Wiederherstellung)",
|
||||
"m365_db_import_replace_warn": "⚠ Der Ersetzungsmodus löscht alle vorhandenen Scandaten vor der Wiederherstellung. Stellen Sie sicher, dass Sie zuerst eine Sicherungskopie von ~/.gdpr_scanner.db haben.",
|
||||
"m365_db_import_replace_confirm": "Der Ersetzungsmodus löscht ALLE vorhandenen Scandaten und stellt aus dem Archiv wieder her.\\n\\nStellen Sie sicher, dass Sie eine manuelle Sicherungskopie von ~/.gdpr_scanner.db haben.\\n\\nFortfahren?",
|
||||
"m365_db_import_no_file": "Bitte wählen Sie zuerst eine ZIP-Datei aus.",
|
||||
"m365_db_importing": "Importiere…",
|
||||
"m365_db_imported": "Importiert",
|
||||
"m365_db_import_run": "Importieren",
|
||||
"m365_opt_scan_photos": "Fotos nach Gesichtern durchsuchen",
|
||||
"m365_opt_scan_photos_hint": "Markiert Bilder mit erkannten Gesichtern als biometrische Daten gem. Art. 9. Langsamer — bei Bedarf aktivieren.",
|
||||
"m365_filter_photo_only": "📷 Fotos / biometrisch",
|
||||
"m365_badge_faces": "Gesichter",
|
||||
"a30_photo_items": "Fotos mit erkannten Gesichtern (Art. 9 biometrisch)",
|
||||
"a30_photo_note": "Fotografien identifizierbarer Personen sind biometrische Daten gemäß Art. 9 DSGVO. Die Aufbewahrung erfordert eine dokumentierte Rechtsgrundlage gemäß Art. 9(2). Für Schulfotos von Schülern unter 15 Jahren ist die elterliche Einwilligung erforderlich (Databeskyttelsesloven §6). Siehe Leitfaden des Datatilsynet zur Schulfotografie.",
|
||||
"a30_s_photos": "Fotografien und biometrische Daten (Artikel 9)",
|
||||
"a30_photo_intro": "Bilddatei(en) mit erkanntem(n) Gesicht(ern) wurden beim Scan gefunden. Fotografien identifizierbarer Personen stellen biometrische Daten gemäß DSGVO Artikel 9 dar und unterliegen demselben erhöhten Schutz wie Gesundheits- oder Strafregisterdaten.",
|
||||
"a30_photo_guidance": "Aufbewahrungshinweise",
|
||||
"a30_photo_g1": "Fotos dürfen nur aufbewahrt werden, solange der ursprüngliche Zweck gültig ist (Art. 5(1)(b) — Zweckbindung).",
|
||||
"a30_photo_g2": "Schüler unter 15 Jahren benötigen die elterliche Einwilligung (Databeskyttelsesloven §6). Die Einwilligung muss freiwillig, spezifisch und dokumentiert sein.",
|
||||
"a30_photo_g3": "Fotos auf öffentlich zugänglichen Websites müssen umgehend entfernt werden, wenn eine Person die Organisation verlässt oder ihre Einwilligung widerruft (Art. 17 — Recht auf Löschung).",
|
||||
"a30_photo_g4": "Historische/Archivnutzung kann eine längere Aufbewahrung gemäß Art. 89 nur mit spezifischen Schutzmaßnahmen und einer Einzelfallbewertung rechtfertigen.",
|
||||
"a30_photo_col_faces": "Gesichter",
|
||||
"a30_method_5": "Wenn die Fotoerfassung aktiviert ist, werden Bilddateien mithilfe der OpenCV Haar-Cascade-Gesichtserkennung analysiert, um Fotografien von Personen zu identifizieren (Art. 9 biometrische Daten).",
|
||||
"m365_role_cycle_tip": "Klicken zum Ändern der Rolle (wechselt Schüler → Personal → Sonstiges → Auto)",
|
||||
"m365_role_set": "Rolle gesetzt",
|
||||
"m365_role_cleared": "Rollenüberschreibung entfernt",
|
||||
"m365_sku_debug_title": "🔍 Mandanten-SKU-IDs",
|
||||
"m365_sku_debug_desc": "Dies sind die rohen SKU-IDs, die Ihren Benutzern zugewiesen sind. Alle mit ❓ unbekannt markierten sind nicht in classification/m365_skus.json — kopieren Sie sie unter student_ids oder staff_ids und starten Sie neu.",
|
||||
"m365_sku_debug_none": "Keine Lizenzdaten zurückgegeben — überprüfen Sie, ob die App die Berechtigung User.Read.All hat.",
|
||||
"m365_file_sources_title": "📁 Dateiquellen",
|
||||
"m365_file_sources_manage": "Verwalten",
|
||||
"m365_file_sources_empty": "Keine Dateiquellen konfiguriert. Fügen Sie unten einen lokalen Ordner oder eine Netzwerkfreigabe hinzu.",
|
||||
"m365_file_sources_add": "Quelle hinzufügen",
|
||||
"m365_fsrc_label": "Bezeichnung",
|
||||
"m365_fsrc_path": "Pfad",
|
||||
"m365_fsrc_smb_detected": "SMB/CIFS-Netzwerkfreigabe erkannt",
|
||||
"m365_fsrc_smb_host": "SMB-Host",
|
||||
"m365_fsrc_smb_user": "Benutzername",
|
||||
"m365_fsrc_smb_pw": "Passwort",
|
||||
"m365_fsrc_smb_pw_hint": "Das Passwort wird im OS-Schlüsselbund gespeichert — nie in einer Datei.",
|
||||
"m365_fsrc_add_btn": "Hinzufügen",
|
||||
"m365_fsrc_saved": "Quelle gespeichert",
|
||||
"m365_fsrc_saving": "Speichern...",
|
||||
"m365_fsrc_path_required": "Pfad ist erforderlich.",
|
||||
"m365_fsrc_scan_btn": "Scannen",
|
||||
"m365_fsrc_scan_start": "Datei-Scan wird gestartet",
|
||||
"m365_src_group_files": "Dateiquellen",
|
||||
"m365_no_sources": "Keine Quellen ausgewählt — nichts zu scannen.",
|
||||
"m365_fsrc_name_required": "Name ist erforderlich.",
|
||||
"m365_srcmgmt_title": "⚙ Quellenverwaltung",
|
||||
"m365_srcmgmt_tab_m365": "Microsoft 365",
|
||||
"m365_srcmgmt_tab_google": "Google Workspace",
|
||||
"m365_srcmgmt_tab_files": "Dateiquellen",
|
||||
"m365_srcmgmt_connection": "Verbindung",
|
||||
"m365_srcmgmt_azure_creds": "Azure-Anmeldedaten",
|
||||
"m365_srcmgmt_sources_m365": "Zu scannende Quellen",
|
||||
"m365_srcmgmt_connected": "Verbunden",
|
||||
"m365_srcmgmt_not_connected": "Nicht verbunden",
|
||||
"m365_srcmgmt_coming_soon": "Kommt bald",
|
||||
"m365_srcmgmt_google_sub": "Gmail- und Google Drive-Scan erscheint hier, wenn implementiert.",
|
||||
"m365_srcmgmt_file_sources": "Dateiquellen",
|
||||
"m365_sources_manage_btn": "Quellen",
|
||||
"m365_connecting": "Verbinde...",
|
||||
"m365_err_creds_required": "Client-ID und Mandanten-ID erforderlich",
|
||||
"m365_signout_confirm": "Trennen und Anmeldedaten löschen?",
|
||||
"m365_btn_settings": "Einstellungen",
|
||||
"m365_settings_title": "⚙ Einstellungen",
|
||||
"m365_settings_tab_general": "Allgemein",
|
||||
"m365_settings_tab_email": "E-Mail-Bericht",
|
||||
"m365_settings_tab_database": "Datenbank",
|
||||
"m365_settings_appearance": "Erscheinungsbild",
|
||||
"m365_settings_language": "Sprache",
|
||||
"m365_settings_theme": "Design",
|
||||
"m365_settings_db_actions": "Aktionen",
|
||||
"m365_db_reset": "DB zurücksetzen",
|
||||
"m365_db_reset_confirm": "Datenbank zurücksetzen? Alle Scan-Ergebnisse werden gelöscht.",
|
||||
"m365_db_reset_done": "Datenbank zurückgesetzt",
|
||||
"m365_db_scans": "Scans",
|
||||
"m365_smtp_saving": "Speichern...",
|
||||
"m365_settings_admin_pin": "Admin-PIN",
|
||||
"m365_settings_pin_hint": "Erforderlich für destruktive Aktionen (z.B. DB zurücksetzen). Leer lassen zum Deaktivieren.",
|
||||
"m365_settings_current_pin": "Aktueller PIN",
|
||||
"m365_settings_new_pin": "Neuer PIN",
|
||||
"m365_settings_confirm_pin": "PIN bestätigen",
|
||||
"m365_settings_pin_set": "Admin-PIN ist gesetzt",
|
||||
"m365_settings_pin_not_set": "Kein PIN — DB zurücksetzen ist ungeschützt",
|
||||
"m365_settings_pin_required": "PIN ist erforderlich.",
|
||||
"m365_settings_pin_mismatch": "PINs stimmen nicht überein.",
|
||||
"m365_settings_pin_wrong": "Falscher PIN — Zurücksetzen abgebrochen.",
|
||||
"m365_settings_pin_saved": "PIN gespeichert",
|
||||
"m365_settings_enter_pin": "Admin-PIN eingeben",
|
||||
"m365_settings_enter_pin_reset": "Admin-PIN eingeben, um die Datenbank zurückzusetzen.",
|
||||
"btn_confirm": "Bestätigen",
|
||||
"m365_log_scan_started": "Scan gestartet",
|
||||
"m365_preview_local_file": "Lokale Datei — keine Cloud-Vorschau verfügbar",
|
||||
"m365_badge_gps": "GPS-Standort",
|
||||
"a30_gps_items": "Elemente mit GPS-Standortdaten (Art. 4 — Standort = personenbezogene Daten)",
|
||||
"a30_exif_pii_items": "Elemente mit EXIF-PII (Autor, Beschreibung, Schlüsselwörter)",
|
||||
"a30_gps_title": "Elemente mit GPS-Standortdaten",
|
||||
"a30_gps_intro": "Die folgenden Dateien enthalten GPS-Koordinaten in den EXIF-Metadaten. Standortdaten sind personenbezogene Daten gemäß Art. 4 DSGVO.",
|
||||
"a30_gps_col_lat": "Breitengrad",
|
||||
"a30_gps_col_lon": "Längengrad",
|
||||
"m365_accounts_disabled_tip": "Wählen Sie eine Microsoft 365-Quelle aus, um die Kontoauswahl zu aktivieren",
|
||||
"m365_smtp_test": "Testen",
|
||||
"m365_smtp_testing": "Test-E-Mail wird gesendet…",
|
||||
"m365_smtp_test_ok": "Test-E-Mail gesendet",
|
||||
"m365_smtp_test_fail": "Verbindung fehlgeschlagen",
|
||||
"m365_fsrc_edit_btn": "Bearbeiten",
|
||||
"m365_fsrc_save_changes": "Änderungen speichern",
|
||||
"m365_settings_tab_scheduler": "Zeitplaner",
|
||||
"m365_sched_title": "Geplante Scans",
|
||||
"m365_sched_next": "Nächste",
|
||||
"m365_sched_hint": "Scans automatisch zu einem festgelegten Zeitpunkt ausführen. Erfordert eine aktive M365-Verbindung (Anwendungsmodus empfohlen).",
|
||||
"m365_sched_no_aps": "⚠ APScheduler nicht installiert. Ausführen: pip install apscheduler",
|
||||
"m365_sched_enabled": "Zeitplaner aktivieren",
|
||||
"m365_sched_frequency": "Häufigkeit",
|
||||
"m365_sched_dow": "Wochentag",
|
||||
"m365_sched_dom": "Tag im Monat",
|
||||
"m365_sched_time": "Uhrzeit",
|
||||
"m365_sched_profile": "Profil",
|
||||
"m365_sched_profile_last": "Zuletzt gespeicherte Einstellungen",
|
||||
"m365_sched_after_scan": "Nach dem Scan",
|
||||
"m365_sched_auto_email": "Bericht automatisch senden",
|
||||
"m365_sched_auto_retention": "Aufbewahrungsrichtlinie durchsetzen",
|
||||
"m365_sched_status": "Status",
|
||||
"m365_sched_run_now": "▶ Jetzt ausführen",
|
||||
"m365_sched_add": "+ Geplante Suche hinzufügen",
|
||||
"m365_sched_name": "Name",
|
||||
"m365_sched_editor_new": "Neue geplante Suche",
|
||||
"m365_sched_editor_edit": "Geplante Suche bearbeiten",
|
||||
"m365_sched_name_required": "Name ist erforderlich",
|
||||
"m365_sched_no_runs": "Noch keine geplanten Läufe",
|
||||
"m365_sched_freq_daily": "Täglich",
|
||||
"m365_sched_freq_weekly": "Wöchentlich",
|
||||
"m365_sched_freq_monthly": "Monatlich",
|
||||
"m365_sched_dow_mon": "Montag",
|
||||
"m365_sched_dow_tue": "Dienstag",
|
||||
"m365_sched_dow_wed": "Mittwoch",
|
||||
"m365_sched_dow_thu": "Donnerstag",
|
||||
"m365_sched_dow_fri": "Freitag",
|
||||
"m365_sched_dow_sat": "Samstag",
|
||||
"m365_sched_dow_sun": "Sonntag",
|
||||
"btn_save": "Speichern",
|
||||
"m365_settings_about": "Über",
|
||||
"m365_settings_save_pin": "PIN speichern",
|
||||
"m365_sse_reconnecting": "Verbindung zum laufenden Scan wird wiederhergestellt…",
|
||||
"m365_sse_replay_note": "Live-Log fortgesetzt — frühere Einträge vom laufenden Scan wiedergegeben.",
|
||||
"m365_google_sa_creds": "Dienstkonto-Anmeldedaten",
|
||||
"m365_google_sa_key_file": "JSON-Schlüssel des Dienstkontos",
|
||||
"m365_google_sa_key_hint": "Download von Google Cloud Console → IAM & Admin → Dienstkonten → Schlüssel → Schlüssel hinzufügen → JSON",
|
||||
"m365_google_admin_email": "Admin-E-Mail",
|
||||
"m365_google_admin_email_hint": "Wird für domänenweite Delegierung verwendet — muss ein Workspace-Superadmin sein.",
|
||||
"m365_google_libs_missing": "Bibliotheken nicht installiert",
|
||||
"m365_google_key_required": "Wählen Sie eine JSON-Schlüsseldatei für das Dienstkonto aus",
|
||||
"m365_google_invalid_json": "Ungültige JSON-Datei",
|
||||
"m365_srcmgmt_sources_google": "Zu scannende Quellen",
|
||||
"m365_google_src_gmail": "Gmail",
|
||||
"m365_google_src_drive": "Google Drive",
|
||||
"m365_google_setup_title": "Einrichtung in Google Workspace erforderlich:",
|
||||
"m365_google_setup_step1": "Erstellen Sie ein Google Cloud-Projekt und aktivieren Sie Gmail API + Drive API + Admin SDK.",
|
||||
"m365_google_setup_step2": "Erstellen Sie ein Dienstkonto, laden Sie den JSON-Schlüssel herunter und aktivieren Sie die domänenweite Delegierung.",
|
||||
"m365_google_setup_step3": "Fügen Sie in Workspace Admin → Sicherheit → API-Steuerung → Domänenweite Delegierung die Client-ID des Dienstkontos mit folgenden Scopes hinzu:",
|
||||
"m365_google_auth_mode": "Authentifizierungsmodus",
|
||||
"m365_google_mode_workspace": "Workspace",
|
||||
"m365_google_mode_personal": "Persönliches Konto",
|
||||
"m365_google_personal_creds": "Persönliches Konto",
|
||||
"m365_google_personal_client_id": "Client-ID",
|
||||
"m365_google_personal_client_secret": "Client-Secret",
|
||||
"m365_google_personal_hint": "Erstellen Sie OAuth 2.0 Desktop-Anmeldedaten in der Google Cloud Console und fügen Sie Client-ID und Secret oben ein.",
|
||||
"m365_google_personal_sign_in": "Anmelden",
|
||||
"m365_google_personal_creds_required": "Client-ID und Secret erforderlich",
|
||||
"m365_google_personal_setup_title": "Einrichtung erforderlich:",
|
||||
"m365_google_personal_setup_step1": "Erstellen Sie in der Google Cloud Console ein Projekt und aktivieren Sie Gmail API + Drive API.",
|
||||
"m365_google_personal_setup_step2": "Erstellen Sie OAuth 2.0-Anmeldedaten (Typ: Desktop-App) und kopieren Sie Client-ID und Secret.",
|
||||
"m365_google_personal_setup_step3": "Fügen Sie Ihre Google-Konto-E-Mail zur Liste der Testnutzer im OAuth-Einwilligungsbildschirm hinzu.",
|
||||
"m365_auth_waiting": "Warte auf Anmeldung…",
|
||||
"role_staff": "Personal",
|
||||
"role_student": "Schüler",
|
||||
"role_other": "Andere",
|
||||
|
||||
"m365_settings_tab_security": "Sicherheit",
|
||||
|
||||
"share_modal_title": "Ergebnisse teilen",
|
||||
"share_modal_desc": "Schreibgeschützte Links ermöglichen einem Datenschutzbeauftragten oder Prüfer, Ergebnisse einzusehen und Verwendungszwecke zuzuweisen, ohne Zugriff auf Scansteuerung oder Anmeldedaten.",
|
||||
"share_new_link": "Neuer Link",
|
||||
"share_label_lbl": "Bezeichnung (optional)",
|
||||
"share_label_placeholder": "z. B. DSB-Prüfung 2026",
|
||||
"share_expires_in": "Läuft ab in",
|
||||
"share_expires_never": "Nie",
|
||||
"share_expires_7d": "7 Tage",
|
||||
"share_expires_30d": "30 Tage",
|
||||
"share_expires_90d": "90 Tage",
|
||||
"share_expires_1y": "1 Jahr",
|
||||
"share_create": "Erstellen",
|
||||
"share_copy_link_prompt": "Link kopieren:",
|
||||
"share_active_links": "Aktive Links",
|
||||
"share_viewer_pin_label": "Betrachter-PIN:",
|
||||
"share_pin_configure": "Konfigurieren",
|
||||
"share_pin_set": "Festgelegt",
|
||||
"share_pin_not_set": "Nicht festgelegt",
|
||||
"share_no_links": "Keine aktiven Links.",
|
||||
"share_unlabelled": "Ohne Bezeichnung",
|
||||
"share_expires_prefix": "Läuft ab:",
|
||||
"share_last_used": "Zuletzt verwendet:",
|
||||
"share_revoke": "Widerrufen",
|
||||
"share_copied": "Kopiert!",
|
||||
"share_load_error": "Links konnten nicht geladen werden.",
|
||||
"share_create_error": "Link konnte nicht erstellt werden:",
|
||||
"share_revoke_confirm": "Diesen Link widerrufen? Alle Nutzer verlieren sofort den Zugriff.",
|
||||
"share_revoke_error": "Widerrufen fehlgeschlagen:",
|
||||
|
||||
"viewer_pin_group_title": "Betrachter-PIN",
|
||||
"viewer_pin_desc": "Eine numerische PIN (4–8 Stellen), die es jedem ermöglicht, <code style=\"font-size:10px\">/view</code> im Browser zu öffnen und schreibgeschützt auf Ergebnisse zuzugreifen \u2013 ohne Token-Link.",
|
||||
"viewer_pin_clear": "PIN löschen",
|
||||
"viewer_pin_is_set": "Betrachter-PIN ist festgelegt",
|
||||
"viewer_pin_not_set_msg": "Keine PIN festgelegt — /view erfordert einen Token-Link",
|
||||
"viewer_pin_format": "PIN muss 4–8 Stellen haben.",
|
||||
"viewer_pin_saving": "Wird gespeichert…",
|
||||
"viewer_pin_saved": "PIN gespeichert",
|
||||
"viewer_pin_clear_confirm": "Betrachter-PIN entfernen? /view erfordert dann wieder einen Token-Link.",
|
||||
"viewer_pin_cleared": "PIN gelöscht"
|
||||
}
|
||||
+773
@@ -0,0 +1,773 @@
|
||||
{
|
||||
"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 A–Z",
|
||||
"sort_name_za": "Name Z–A",
|
||||
"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…",
|
||||
"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_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_filter_photo_only": "📷 Photos / biometric",
|
||||
"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_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_fail": "Connection failed",
|
||||
"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_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:",
|
||||
|
||||
"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"
|
||||
}
|
||||
Reference in new issue
Block a user