Add redact doc pages; update timeline docs to remove GPU references
- New: redact-about.php, redact-guide.php, redact-tech.php with full
two-pass pipeline docs, regional rule sets, output format comparison
- New: translations/redact-{about,guide,tech}.php (en + no)
- redact.php: add About/Guide/How-it-works doc links
- timeline-guide.php: remove GPU/cuttlefish engine row
- timeline-tech.php: remove GPU row, replace fine-tuned LLM section
with SSE streaming + DOCX export section, stat4 3→2 engines
- timeline-about.php: replace dbn-legal-agent spotlight with
SSE/DOCX export highlight
- translations/timeline-{about,guide,tech}.php: remove all GPU/
cuttlefish references across all 4 languages; add stream_* and
export_* keys; fix upload copy (5 files → 1 file)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,199 @@
|
||||
<?php
|
||||
return array (
|
||||
'en' =>
|
||||
array (
|
||||
'nav_about' => 'About',
|
||||
'nav_guide' => 'User guide',
|
||||
'nav_howit' => 'How it works',
|
||||
'nav_opentool' => '← Open the tool',
|
||||
'nav_signin' => 'Sign in',
|
||||
'nav_open' => 'Open Redact →',
|
||||
'hero_kicker' => 'Technical Showcase · How the AI protects documents',
|
||||
'hero_title' => 'How Redact knows what to replace.',
|
||||
'hero_sub' => 'A full walkthrough of the two-pass redaction pipeline, regional pattern recognition, entity classification, output format generation, and privacy architecture.',
|
||||
'stat1' => 'processing passes',
|
||||
'stat2' => 'regional rule sets',
|
||||
'stat3' => 'output formats',
|
||||
'stat4' => 'engine options',
|
||||
'arch_eyebrow' => 'Architecture',
|
||||
'arch_title' => 'Two passes. Deterministic first, intelligent second.',
|
||||
'arch_sub' => 'The pipeline is intentionally layered — Pass 1 catches everything that can be caught by rules alone; Pass 2 handles context-dependent entities that rules cannot identify.',
|
||||
'pass1_title' => 'Detect & replace known patterns',
|
||||
'pass1_p1_html' => 'A deterministic regex pass runs before any LLM call. It scans the full input for identifiers matching the active regional profile:',
|
||||
'pass1_li1_html' => 'Norwegian <code>fødselsnummer</code> (11-digit) and D-number',
|
||||
'pass1_li2' => 'Phone numbers in +47 format, Norwegian mobile (4xx/9xx) and landline patterns',
|
||||
'pass1_li3' => 'Email addresses (RFC 5322 simplified)',
|
||||
'pass1_li4' => 'Norwegian postal addresses: street name + number + postnummer + poststed',
|
||||
'pass1_li5' => 'Additional patterns per region (IBAN, CPR, ECHR numbers, SSN, etc.)',
|
||||
'pass1_p2' => 'Pattern-matched tokens are replaced immediately and marked as already redacted so the LLM pass does not double-process them.',
|
||||
'pass2_title' => 'Sweep for named entities',
|
||||
'pass2_p1_html' => 'The LLM reads the full document (with pattern-replaced tokens visible as placeholders). It identifies all remaining named entities:',
|
||||
'pass2_li1' => 'Personal names — first name, surname, or full name; handles Norwegian, Sami, and foreign names',
|
||||
'pass2_li2' => 'Organisations — companies, government agencies, NGOs, religious bodies, sports clubs',
|
||||
'pass2_li3' => 'Places — streets, neighbourhoods, municipalities, counties, countries',
|
||||
'pass2_li4' => 'Date-of-birth and age phrases (when Dates entity type is checked)',
|
||||
'pass2_p2' => 'Each matched entity is classified by type and role (FATHER, MOTHER, JUDGE, SOCIAL WORKER, etc.) and replaced according to the selected output format. The prompt explicitly instructs the model not to infer or guess identities — only replace what is explicitly named.',
|
||||
'pass3_title' => 'Post-processing & alias substitution',
|
||||
'pass3_p1_html' => 'After both passes, PHP applies final transformations:',
|
||||
'pass3_f1_html' => '<strong>Officials pass</strong> — if Keep official names is checked, named judges, experts, and caseworkers get labelled tags ([JUDGE: Andersen]) instead of generic ones',
|
||||
'pass3_f2_html' => '<strong>Alias substitution</strong> — user-defined aliases are applied as a final regex replacement, overriding whatever the LLM assigned',
|
||||
'pass3_f3_html' => '<strong>Exempt name protection</strong> — any token matching an exempt name is restored to its original value',
|
||||
'pass3_f4_html' => '<strong>Pseudonym generation</strong> — if Pseudonym output is selected, all role tags are replaced with plausible Norwegian names, phone numbers, and addresses drawn from a generation pool',
|
||||
'pass3_p2_html' => 'The final output is assembled and returned as plain text. The DOCX export converts this to an OOXML document via PHP ZipArchive.',
|
||||
'date_eyebrow' => 'Regional pattern sets',
|
||||
'date_title' => 'Four regions. Each adds patterns to the last.',
|
||||
'date_sub' => 'Regional profiles are cumulative — European adds to Nordic, ECHR adds to European, Global adds to ECHR.',
|
||||
'th_region' => 'Region',
|
||||
'th_patterns' => 'Patterns covered',
|
||||
'th_notes' => 'Notes',
|
||||
'rn1' => 'Default for Norwegian documents. All local ID formats.',
|
||||
'rn2' => 'Cross-border EU documents, Nordic neighbours.',
|
||||
'rn3' => 'Complaints to the European Court of Human Rights.',
|
||||
'rn4' => 'Documents involving non-European parties or jurisdictions.',
|
||||
'class_eyebrow' => 'Entity classification',
|
||||
'class_title' => 'What the LLM identifies and how it labels each type.',
|
||||
'class_h1' => 'Named entity types',
|
||||
'th_entity' => 'Entity',
|
||||
'th_definition' => 'What qualifies',
|
||||
'th_output' => 'Default output (contextual)',
|
||||
'et1_def' => 'Any personal name — first, last, or full',
|
||||
'et1_out' => '[ROLE] — inferred from context (FATHER, MOTHER, JUDGE, etc.)',
|
||||
'et2_def' => 'Companies, agencies, authorities, institutions, clubs',
|
||||
'et2_out' => '[ORG: partial name] or generic [ORG]',
|
||||
'et3_def' => 'Streets, towns, counties, countries, regions',
|
||||
'et3_out' => '[PLACE] or [CITY] or [ADDRESS]',
|
||||
'et4_def' => 'Dates of birth, age references, personal date phrases',
|
||||
'et4_out' => '[DOB] or [AGE: xx]',
|
||||
'class_h2' => 'Output format comparison',
|
||||
'th_format' => 'Format',
|
||||
'th_person_ex' => 'Person example',
|
||||
'th_org_ex' => 'Org example',
|
||||
'fmt1_person' => '[FATHER] or [JUDGE: Andersen]',
|
||||
'fmt1_org' => '[BARNEVERNET: Oslo] or [ORG]',
|
||||
'fmt2_person' => '[PERSON]',
|
||||
'fmt2_org' => '[ORG]',
|
||||
'fmt3_person' => 'Ola Nordmann (generated)',
|
||||
'fmt3_org' => 'Nordnes AS (generated)',
|
||||
'eng_eyebrow' => 'Engines',
|
||||
'eng_title' => 'Two engines, one redaction schema.',
|
||||
'eng_sub' => 'Both engines produce the same redaction output schema. Engine choice affects accuracy on complex documents and credit cost only.',
|
||||
'th_engine' => 'Engine',
|
||||
'th_model' => 'Model',
|
||||
'th_latency' => 'Latency',
|
||||
'th_best' => 'Best for',
|
||||
'eng1_best' => 'Default. Most documents, single subject, clear formatting.',
|
||||
'eng2_best' => 'Complex documents with many named parties, overlapping roles, or degraded source text.',
|
||||
'priv_eyebrow' => 'Privacy & security',
|
||||
'priv_title' => 'Your documents never leave your session.',
|
||||
'priv_badge' => 'Privacy by design',
|
||||
'priv_1_html' => 'All uploaded files are extracted to text <strong>in memory</strong> using PHP\'s in-process file handlers. The raw binary is never written to disk on the server.',
|
||||
'priv_2' => 'Session context (pasted text, uploaded content, redacted output) is scoped to your authenticated session and discarded when the session ends.',
|
||||
'priv_3_html' => 'Azure OpenAI (<code>gpt-4o</code>, <code>gpt-4o-mini</code>) is configured on the <strong>West Europe</strong> region. Data processed via Azure OpenAI is not used for model training under the default enterprise agreement.',
|
||||
'priv_4_html' => 'Azure OpenAI is called only for the LLM sweep pass. No document content is retained by Azure after the response is returned, per the enterprise data-handling agreement.',
|
||||
'priv_5_html' => 'Telemetry logged: tool name, engine, mode, region, latency. <strong>No document text, entity names, or redacted content is logged.</strong>',
|
||||
'cta_title' => 'See it work on your documents.',
|
||||
'cta_sub' => 'Free for Do Better Norge members.',
|
||||
'btn_open' => 'Open Redact →',
|
||||
'btn_signin_cta' => 'Sign in to use Redact →',
|
||||
'btn_register' => 'Register free',
|
||||
'btn_guide' => 'User guide',
|
||||
),
|
||||
'no' =>
|
||||
array (
|
||||
'nav_about' => 'Om',
|
||||
'nav_guide' => 'Brukerveiledning',
|
||||
'nav_howit' => 'Slik fungerer det',
|
||||
'nav_opentool' => '← Åpne verktøyet',
|
||||
'nav_signin' => 'Logg inn',
|
||||
'nav_open' => 'Åpne Sladding →',
|
||||
'hero_kicker' => 'Teknisk Vist · Hvordan AI-en beskytter dokumenter',
|
||||
'hero_title' => 'Hvordan Sladding vet hva som skal erstattes.',
|
||||
'hero_sub' => 'En full gjennomgang av to-pass sladdingsprosessen, regional mønstergjenkjenning, enhetsklassifisering, utdataformatgenerering og personvernarkitektur.',
|
||||
'stat1' => 'behandlingspass',
|
||||
'stat2' => 'regionale regelsett',
|
||||
'stat3' => 'utdataformater',
|
||||
'stat4' => 'motoralternativer',
|
||||
'arch_eyebrow' => 'Arkitektur',
|
||||
'arch_title' => 'To pass. Deterministisk først, intelligent deretter.',
|
||||
'arch_sub' => 'Rørledningen er bevisst lagdelt — Pass 1 fanger alt som kan fanges av regler alene; Pass 2 håndterer kontekstavhengige enheter som regler ikke kan identifisere.',
|
||||
'pass1_title' => 'Oppdage & erstatte kjente mønstre',
|
||||
'pass1_p1_html' => 'Et deterministisk regex-pass kjøres før noen LLM-anrop. Det skanner hele inngangen for identifikatorer som matcher den aktive regionale profilen:',
|
||||
'pass1_li1_html' => 'Norsk <code>fødselsnummer</code> (11 sifre) og D-nummer',
|
||||
'pass1_li2' => 'Telefonnumre i +47-format, norsk mobil (4xx/9xx) og fasttelefon',
|
||||
'pass1_li3' => 'E-postadresser (RFC 5322 forenklet)',
|
||||
'pass1_li4' => 'Norske postadresser: gatenavn + nummer + postnummer + poststed',
|
||||
'pass1_li5' => 'Ytterligere mønstre per region (IBAN, CPR, EMD-numre, SSN, osv.)',
|
||||
'pass1_p2' => 'Mønster-matchede symboler erstattes umiddelbart og merkes som allerede sladdede slik at LLM-passet ikke dobbeltbehandler dem.',
|
||||
'pass2_title' => 'Søk etter navngitte enheter',
|
||||
'pass2_p1_html' => 'LLM-en leser hele dokumentet (med mønster-erstattede symboler synlige som plassholdere). Den identifiserer alle gjenværende navngitte enheter:',
|
||||
'pass2_li1' => 'Personnavn — fornavn, etternavn eller fullt navn; håndterer norske, samiske og utenlandske navn',
|
||||
'pass2_li2' => 'Organisasjoner — selskaper, myndigheter, frivillige organisasjoner, religiøse organer, idrettslag',
|
||||
'pass2_li3' => 'Steder — gater, nabolag, kommuner, fylker, land',
|
||||
'pass2_li4' => 'Fødselsdato og aldersfraser (når enhetstype Datoer er avkrysset)',
|
||||
'pass2_p2' => 'Hver matchet enhet klassifiseres etter type og rolle (FAR, MOR, DOMMER, SAKSBEHANDLER, osv.) og erstattes i henhold til valgt utdataformat.',
|
||||
'pass3_title' => 'Etterbehandling og aliassubstitusjon',
|
||||
'pass3_p1_html' => 'Etter begge passene anvender PHP endelige transformasjoner:',
|
||||
'pass3_f1_html' => '<strong>Offisielt pass</strong> — hvis Behold offisielle navn er avkrysset, får navngitte dommere, eksperter og saksbehandlere merkede koder ([DOMMER: Andersen])',
|
||||
'pass3_f2_html' => '<strong>Aliassubstitusjon</strong> — brukerdefinerte aliaser brukes som et siste regex-erstatning',
|
||||
'pass3_f3_html' => '<strong>Unntak for navnbeskyttelse</strong> — eventuelle symboler som matcher et unntaksnavn gjenopprettes til den opprinnelige verdien',
|
||||
'pass3_f4_html' => '<strong>Pseudonymgenerering</strong> — hvis Pseudonymutdata er valgt, erstattes alle rollekoder med plausible norske navn, telefonnumre og adresser',
|
||||
'pass3_p2_html' => 'Sluttutdataene settes sammen og returneres som ren tekst. DOCX-eksporten konverterer dette til et OOXML-dokument via PHP ZipArchive.',
|
||||
'date_eyebrow' => 'Regionale mønsterssett',
|
||||
'date_title' => 'Fire regioner. Hver legger til mønstre fra den siste.',
|
||||
'date_sub' => 'Regionale profiler er kumulative — Europeisk legger til Nordisk, EMD legger til Europeisk, Global legger til EMD.',
|
||||
'th_region' => 'Region',
|
||||
'th_patterns' => 'Dekket mønstre',
|
||||
'th_notes' => 'Notater',
|
||||
'rn1' => 'Standard for norske dokumenter. Alle lokale ID-formater.',
|
||||
'rn2' => 'Grenseoverskridende EU-dokumenter, nordiske naboer.',
|
||||
'rn3' => 'Klager til Den europeiske menneskerettighetsdomstolen.',
|
||||
'rn4' => 'Dokumenter som involverer ikke-europeiske parter eller jurisdiksjoner.',
|
||||
'class_eyebrow' => 'Enhetsklassifisering',
|
||||
'class_title' => 'Hva LLM-en identifiserer og hvordan den merker hver type.',
|
||||
'class_h1' => 'Navngitte enhetstyper',
|
||||
'th_entity' => 'Enhet',
|
||||
'th_definition' => 'Hva som kvalifiserer',
|
||||
'th_output' => 'Standard utdata (kontekstuell)',
|
||||
'et1_def' => 'Ethvert personnavn — fornavn, etternavn eller fullt navn',
|
||||
'et1_out' => '[ROLLE] — utledet fra kontekst (FAR, MOR, DOMMER, osv.)',
|
||||
'et2_def' => 'Selskaper, etater, myndigheter, institusjoner, klubber',
|
||||
'et2_out' => '[ORG: delvis navn] eller generisk [ORG]',
|
||||
'et3_def' => 'Gater, tettsteder, kommuner, fylker, land, regioner',
|
||||
'et3_out' => '[STED] eller [BY] eller [ADRESSE]',
|
||||
'et4_def' => 'Fødselsdatoer, aldersreferanser, personlige datofraser',
|
||||
'et4_out' => '[FØDSELSDATO] eller [ALDER: xx]',
|
||||
'class_h2' => 'Sammenligning av utdataformat',
|
||||
'th_format' => 'Format',
|
||||
'th_person_ex' => 'Person eksempel',
|
||||
'th_org_ex' => 'Org eksempel',
|
||||
'fmt1_person' => '[FAR] eller [DOMMER: Andersen]',
|
||||
'fmt1_org' => '[BARNEVERNET: Oslo] eller [ORG]',
|
||||
'fmt2_person' => '[PERSON]',
|
||||
'fmt2_org' => '[ORG]',
|
||||
'fmt3_person' => 'Ola Nordmann (generert)',
|
||||
'fmt3_org' => 'Nordnes AS (generert)',
|
||||
'eng_eyebrow' => 'Motorer',
|
||||
'eng_title' => 'To motorer, ett sladdskjema.',
|
||||
'eng_sub' => 'Begge motorer produserer det samme sladdutdataskjemaet. Motorvalg påvirker nøyaktigheten på komplekse dokumenter og kreditt-kostnad.',
|
||||
'th_engine' => 'Motor',
|
||||
'th_model' => 'Modell',
|
||||
'th_latency' => 'Forsinkelse',
|
||||
'th_best' => 'Best for',
|
||||
'eng1_best' => 'Standard. De fleste dokumenter, enkelt emne, klar formatering.',
|
||||
'eng2_best' => 'Komplekse dokumenter med mange navngitte parter, overlappende roller eller forringet kildetekst.',
|
||||
'priv_eyebrow' => 'Personvern & sikkerhet',
|
||||
'priv_title' => 'Dine dokumenter forlater aldri sesjonen din.',
|
||||
'priv_badge' => 'Personvern ved design',
|
||||
'priv_1_html' => 'Alle opplastede filer blir ekstraktert til tekst <strong>i minnet</strong> ved hjelp av PHPs in-process filbehandlere. Den rå binære data skrives aldri til disk på serveren.',
|
||||
'priv_2' => 'Sesjonskonteksten (limt inn tekst, opplastet innhold, sladdet utdata) er avgrenset til din autentiserte sesjon og kastes når sesjonen avsluttes.',
|
||||
'priv_3_html' => 'Azure OpenAI (<code>gpt-4o</code>, <code>gpt-4o-mini</code>) er konfigurert på <strong>Vest-Europa</strong> regionen. Data behandlet via Azure OpenAI brukes ikke til modelltrening under den standard bedriftsavtalen.',
|
||||
'priv_4_html' => 'Azure OpenAI kalles kun under LLM-søkpasset. Ingen dokumentinnhold beholdes av Azure etter at svaret er returnert, i henhold til bedriftsavtalen for datahåndtering.',
|
||||
'priv_5_html' => 'Telemetri logget: verktøynavn, motor, modus, region, forsinkelse. <strong>Ingen dokumenttekst, enhetsnavn eller sladdede innhold logges.</strong>',
|
||||
'cta_title' => 'Se det fungere på dine dokumenter.',
|
||||
'cta_sub' => 'Gratis for Do Better Norge-medlemmer.',
|
||||
'btn_open' => 'Åpne Sladding →',
|
||||
'btn_signin_cta' => 'Logg inn for å bruke Sladding →',
|
||||
'btn_register' => 'Registrer gratis',
|
||||
'btn_guide' => 'Brukerveiledning',
|
||||
),
|
||||
);
|
||||
Reference in New Issue
Block a user