Apply Do Better Norge tools brand redesign (CSS + all tool pages)

New dbn-tools-redesign.css with warm paper surface, navy tools nav, gold
accent, and per-tool themes via body[data-active-tool]. Updated all 21 tool
PHP pages, shared layout/nav/footer includes, and advocate route (new).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-24 11:26:39 +02:00
parent c997f204b5
commit e09ee62c62
60 changed files with 2583 additions and 6 deletions
+263
View File
@@ -0,0 +1,263 @@
<?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 Advocate →',
'hero_kicker' => 'Architecture · Hard-RAG · Fine-tuned LLM',
'hero_title' => 'How Advocate builds your brief.',
'hero_sub' => 'A 7-step pipeline that turns your case description into a legally grounded partisan brief — adversarial sub-questions, hybrid retrieval from 220,000+ passages, and a fine-tuned Norwegian law model for synthesis.',
'stat_legal' => 'legal passages indexed',
'stat_slices' => 'corpus slices',
'stat_steps' => 'pipeline steps',
'stat_model' => 'fine-tuned model',
'pipe_eyebrow' => 'Pipeline architecture',
'pipe_title' => 'Seven steps from case facts to partisan brief.',
'pipe_sub' => 'Each step is visible in the Reasoning panel as the run progresses. No black-box generation — every retrieval pass, dedup, and synthesis is logged.',
'step1_title' => 'Query interpretation',
'step1_body' => 'The seed text is parsed for case type, parties involved, applicable acts, and time context. If the input is clear enough, this step is skipped and the raw seed is passed directly to expansion.',
'step2_title' => 'Query expansion',
'step2_body' => 'The agent generates 35 adversarial sub-questions, each framed to strengthen the selected party\'s position. Sub-questions target different legal angles: procedural obligations, proportionality, ECHR anchors, evidentiary standards.',
'step3_title' => 'Slice resolution',
'step3_body' => 'Active corpus slices are resolved into a Qdrant filter. Candidate documents from the selected slices constrain the vector search space — preventing retrieval from unrelated areas of law.',
'step4_title' => 'Upload indexing',
'step4_body' => 'Uploaded files are chunked into 512-token passages and embedded with nomic-embed-text. The resulting vectors are stored in an in-memory index — searched in the same retrieval pass as the legal corpus, then discarded at session end.',
'step5_title' => 'Retrieval',
'step5_body' => 'For each sub-question: hybrid BM25 + vector search → RRF fusion → reranker. Corpus hits and upload hits are merged, deduped, and trimmed to the configured "Sources kept" limit. Output: N unique ranked passages.',
'step6_title' => 'Synthesis',
'step6_body' => 'The selected engine (dbn-legal-agent or Azure gpt-4o) synthesises the full output: YOUR STRONGEST ARGUMENTS, the advocate brief, GAPS IN THE OPPOSING POSITION, uncertainties, and the next practical step. All framed for the selected party role.',
'step7_title' => 'Citation confidence',
'step7_body' => 'Each inline citation is verified against its source passage. A confidence score is computed and surfaced in the output header. Low-confidence citations are flagged. No hallucinated § numbers reach the final brief.',
'rag_eyebrow' => 'Hard-RAG retrieval',
'rag_title' => 'Every claim traced to a source.',
'rag_sub' => 'Hard-RAG means no citation appears in the brief unless it was retrieved from the corpus or your uploaded files. The retrieval pipeline is deterministic and logged.',
'rag_step1' => 'Active slices → Qdrant payload filter',
'rag_step2' => 'Sub-questions → BM25 keyword search',
'rag_step3' => 'Sub-questions → vector similarity search',
'rag_step4' => 'RRF fusion (rank-based merge)',
'rag_step5' => 'Cross-encoder reranker',
'rag_step6' => 'Upload chunks merged',
'rag_step7' => 'Dedup → top N sources',
'rag_step8' => 'Synthesis with citations',
'corpus_eyebrow' => 'Knowledge base',
'corpus_title' => '220,000+ passages across 8 corpus slices.',
'corpus_sub' => 'The same corpus that powers Korrespond. Indexed from Lovdata, ECHR HUDOC, Norwegian appellate decisions, and Bufdir guidance.',
'llm_eyebrow' => 'Fine-tuned model',
'llm_title' => 'dbn-legal-agent — trained for Norwegian child-welfare law.',
'llm_body_html' => 'A QLoRA fine-tune trained on Norwegian child-welfare and administrative law text. dbn-legal-agent understands the procedural vocabulary of barnevernsloven and barneloven — the proportionality threshold for omsorgsovertakelse, how Barnevernet\'s § 4-1 / 4-4 duty of assessment can be challenged, what ECHR Art. 8 requires in care-order cases, and how the principle of <em>barnets beste</em> is weighed against parental rights in Norwegian courts.',
'llm_table_col1' => 'Pipeline step',
'llm_table_col2' => 'dbn-legal-agent role',
'privacy_eyebrow' => 'Privacy by design',
'privacy_title' => 'Your case data never leaves the request.',
'privacy_p1' => 'Uploaded files are chunked and embedded in-memory only — vectors are discarded when your session ends.',
'privacy_p2' => 'Case descriptions are used for retrieval and synthesis only. They are not logged, stored, or used for training.',
'privacy_p3' => 'The Qdrant corpus is read-only during retrieval — no user data is written to the vector database.',
'privacy_p4' => 'Azure OpenAI processing occurs within EU-region endpoints (West Europe).',
'privacy_p5' => 'Session-scoped uploads: each run gets a fresh in-memory index, isolated from other users.',
'privacy_p6' => 'No cookies, no persistent identifiers, no cross-session tracking on the doc pages.',
'cta_title' => 'See it in action.',
'cta_sub' => 'Free for Do Better Norge members. No credit card required.',
'btn_open' => 'Open Advocate →',
'btn_signin_cta' => 'Sign in to use Advocate →',
'btn_register' => 'Register free',
),
'no' =>
array (
'nav_about' => 'Om',
'nav_guide' => 'Brukerveiledning',
'nav_howit' => 'Hvordan det fungerer',
'nav_opentool' => '← Åpne verktøyet',
'nav_signin' => 'Logg inn',
'nav_open' => 'Åpne Advocate →',
'hero_kicker' => 'Arkitektur · Hard-RAG · Finjustert LLM',
'hero_title' => 'Slik bygger Advocate sammendraget ditt.',
'hero_sub' => 'En 7-trinns pipeline som gjør saksbeskrivelsen din til et juridisk forankret partisk sammendrag — motstandsorienterte delspørsmål, hybrid henting fra 220 000+ passasjer og en finjustert norsk rettsmodell.',
'stat_legal' => 'juridiske passasjer indeksert',
'stat_slices' => 'corpus-seksjoner',
'stat_steps' => 'pipeline-trinn',
'stat_model' => 'finjustert modell',
'pipe_eyebrow' => 'Pipeline-arkitektur',
'pipe_title' => 'Sju trinn fra saksfakta til partisk sammendrag.',
'pipe_sub' => 'Hvert trinn er synlig i Begrunnelsespanelet mens kjøringen pågår.',
'step1_title' => 'Søkefortolkning',
'step1_body' => 'Seed-teksten analyseres for sakstype, involverte parter, gjeldende lover og tidssammenheng.',
'step2_title' => 'Søkeutvidelse',
'step2_body' => 'Agenten genererer 35 motstandsorienterte delspørsmål, hvert utformet for å styrke den valgte partens posisjon.',
'step3_title' => 'Seksjonsoppløsning',
'step3_body' => 'Aktive corpus-seksjoner løses til et Qdrant-filter. Kandidatdokumenter begrenser søkerommet.',
'step4_title' => 'Opplastingsindeksering',
'step4_body' => 'Opplastede filer deles inn i 512-token passasjer og innbygges med nomic-embed-text. Lagres kun i minne.',
'step5_title' => 'Henting',
'step5_body' => 'For hvert delspørsmål: hybrid BM25 + vektorsøk → RRF-sammenslåing → omrangering. Korpus- og opplastingstreff slås sammen, dedupes og trimmes.',
'step6_title' => 'Syntese',
'step6_body' => 'Den valgte motoren syntetiserer hele utdataene: DINE STERKESTE ARGUMENTER, advokatsammendrag, HULL I MOTPARTENS POSISJON, usikkerheter og neste steg.',
'step7_title' => 'Sitatkonfidens',
'step7_body' => 'Hvert inline-sitat verifiseres mot kildepassasjen. En konfidenspoengsum beregnes. Ingen hallusinerte §-numre.',
'rag_eyebrow' => 'Hard-RAG-henting',
'rag_title' => 'Hvert påstand sporet til en kilde.',
'rag_sub' => 'Hard-RAG betyr at ingen referanse vises i sammendraget med mindre den ble hentet fra korpuset eller filene dine.',
'rag_step1' => 'Aktive seksjoner → Qdrant nyttlast-filter',
'rag_step2' => 'Delspørsmål → BM25-nøkkelordssøk',
'rag_step3' => 'Delspørsmål → vektorsimilaritetssøk',
'rag_step4' => 'RRF-sammenslåing (rangbasert sammenslåing)',
'rag_step5' => 'Kryss-koder omrangerer',
'rag_step6' => 'Opplastingsstykker slås sammen',
'rag_step7' => 'Dedup → topp N-kilder',
'rag_step8' => 'Syntese med referanser',
'corpus_eyebrow' => 'Kunnskapsbase',
'corpus_title' => '220 000+ passasjer over 8 corpus-seksjoner.',
'corpus_sub' => 'Samme corpus som driver Korrespond. Indeksert fra Lovdata, ECHR HUDOC, norske lagmannsrettavgjørelser og Bufdir-veiledning.',
'llm_eyebrow' => 'Finjustert modell',
'llm_title' => 'dbn-legal-agent — trent for norsk barnevernsrett.',
'llm_body_html' => 'En QLoRA-finjustering trent på norsk barnevernsrett og forvaltningsrett. dbn-legal-agent forstår det prosessuelle vokabularet i barnevernsloven og barneloven — proporsjonalitetsterskelen for omsorgsovertakelse, hvordan Barnevernets vurderingsplikt kan utfordres, og hva EMK Art. 8 krever i omsorgsovertakelsessaker.',
'llm_table_col1' => 'Pipeline-trinn',
'llm_table_col2' => 'dbn-legal-agent rolle',
'privacy_eyebrow' => 'Personvern etter design',
'privacy_title' => 'Saksdataene dine forlater aldri forespørselen.',
'privacy_p1' => 'Opplastede filer behandles kun i minne — vektorer slettes når sesjonen avsluttes.',
'privacy_p2' => 'Saksbeskrivelser brukes kun for henting og syntese. De logges ikke eller lagres.',
'privacy_p3' => 'Qdrant-korpuset er skrivebeskyttet under henting.',
'privacy_p4' => 'Azure OpenAI-behandling skjer innen EU-regionsendepunkter (Vest-Europa).',
'privacy_p5' => 'Sesjonsscoped opplastinger: hvert kjøring får en ny minneindeks, isolert fra andre brukere.',
'privacy_p6' => 'Ingen informasjonskapsler, ingen vedvarende identifikatorer på dokumentsidene.',
'cta_title' => 'Se det i aksjon.',
'cta_sub' => 'Gratis for Do Better Norge-medlemmer. Ingen kredittkort nødvendig.',
'btn_open' => 'Åpne Advocate →',
'btn_signin_cta' => 'Logg inn for å bruke Advocate →',
'btn_register' => 'Registrer gratis',
),
'uk' =>
array (
'nav_about' => 'Про нас',
'nav_guide' => 'Посібник користувача',
'nav_howit' => 'Як це працює',
'nav_opentool' => '← Відкрити інструмент',
'nav_signin' => 'Увійти',
'nav_open' => 'Відкрити Advocate →',
'hero_kicker' => 'Архітектура · Hard-RAG · Fine-tuned LLM',
'hero_title' => 'Як Advocate будує ваше резюме.',
'hero_sub' => '7-кроковий конвеєр, що перетворює опис вашої справи на юридично обґрунтоване упереджене резюме.',
'stat_legal' => 'індексовані правові положення',
'stat_slices' => 'розділи корпусу',
'stat_steps' => 'кроки конвеєра',
'stat_model' => 'модель з тонким налаштуванням',
'pipe_eyebrow' => 'Архітектура конвеєра',
'pipe_title' => 'Сім кроків від фактів справи до упередженого резюме.',
'pipe_sub' => 'Кожен крок видно на панелі обґрунтування під час виконання.',
'step1_title' => 'Інтерпретація запиту',
'step1_body' => 'Вихідний текст аналізується для типу справи, залучених сторін, застосовних законів.',
'step2_title' => 'Розширення запиту',
'step2_body' => 'Агент генерує 3–5 змагальних підпитань, кожне з яких сформульоване для зміцнення позиції обраної сторони.',
'step3_title' => 'Вирішення розділів',
'step3_body' => 'Активні розділи корпусу перетворюються на фільтр Qdrant.',
'step4_title' => 'Індексування завантажень',
'step4_body' => 'Завантажені файли розбиваються на пасажі по 512 токенів та вбудовуються з nomic-embed-text. Зберігаються лише в пам\'яті.',
'step5_title' => 'Отримання',
'step5_body' => 'Для кожного підпитання: гібридний BM25 + векторний пошук → злиття RRF → ранжування. Пасажі корпусу та завантажень об\'єднуються і дедублюються.',
'step6_title' => 'Синтез',
'step6_body' => 'Вибраний двигун синтезує повний вивід: ВАШІ НАЙСИЛЬНІШІ АРГУМЕНТИ, адвокатське резюме, ПРОГАЛИНИ В ПОЗИЦІЇ ОПОНЕНТА, невизначеності та наступний крок.',
'step7_title' => 'Достовірність цитат',
'step7_body' => 'Кожна вбудована цитата перевіряється по вихідному пасажу. Жодних вигаданих § номерів.',
'rag_eyebrow' => 'Отримання Hard-RAG',
'rag_title' => 'Кожне твердження прив\'язане до джерела.',
'rag_sub' => 'Hard-RAG означає, що жодна цитата не з\'являється в резюме, якщо вона не була отримана з корпусу або ваших файлів.',
'rag_step1' => 'Активні розділи → фільтр навантаження Qdrant',
'rag_step2' => 'Підпитання → ключове слово BM25',
'rag_step3' => 'Підпитання → векторний пошук подібності',
'rag_step4' => 'Злиття RRF',
'rag_step5' => 'Кросс-кодер ранжування',
'rag_step6' => 'Фрагменти завантажень об\'єднані',
'rag_step7' => 'Дедублікація → топ N джерел',
'rag_step8' => 'Синтез з цитатами',
'corpus_eyebrow' => 'База знань',
'corpus_title' => '220 000+ пасажів у 8 розділах корпусу.',
'corpus_sub' => 'Той самий корпус, що живить Korrespond. Індексований з Lovdata, ЄСПЛ HUDOC, норвезьких апеляційних рішень та керівництва Bufdir.',
'llm_eyebrow' => 'Модель з тонким налаштуванням',
'llm_title' => 'dbn-legal-agent — навчена для норвезького права із захисту дітей.',
'llm_body_html' => 'Модель QLoRA, налаштована на текст норвезького права із захисту дітей та адміністративного права. dbn-legal-agent розуміє процедурну лексику barnevernsloven і barneloven.',
'llm_table_col1' => 'Крок конвеєра',
'llm_table_col2' => 'Роль dbn-legal-agent',
'privacy_eyebrow' => 'Конфіденційність за дизайном',
'privacy_title' => 'Ваші дані справи ніколи не покидають запит.',
'privacy_p1' => 'Завантажені файли обробляються лише в пам\'яті — вектори видаляються по закінченні сесії.',
'privacy_p2' => 'Описи справ використовуються лише для отримання та синтезу. Не журналюються і не зберігаються.',
'privacy_p3' => 'Корпус Qdrant доступний лише для читання під час отримання.',
'privacy_p4' => 'Обробка Azure OpenAI відбувається в кінцевих точках регіону ЄС (Західна Європа).',
'privacy_p5' => 'Завантаження в рамках сесії: кожен запуск отримує новий індекс у пам\'яті, ізольований від інших.',
'privacy_p6' => 'Без файлів cookie, без постійних ідентифікаторів на сторінках документів.',
'cta_title' => 'Побачте це в дії.',
'cta_sub' => 'Безкоштовно для членів Do Better Norge. Кредитна картка не потрібна.',
'btn_open' => 'Відкрити Advocate →',
'btn_signin_cta' => 'Увійти, щоб використовувати Advocate →',
'btn_register' => 'Зареєструватися безкоштовно',
),
'pl' =>
array (
'nav_about' => 'O nas',
'nav_guide' => 'Podręcznik użytkownika',
'nav_howit' => 'Jak to działa',
'nav_opentool' => '← Otwórz narzędzie',
'nav_signin' => 'Zaloguj się',
'nav_open' => 'Otwórz Advocate →',
'hero_kicker' => 'Architektura · Hard-RAG · Fine-tuned LLM',
'hero_title' => 'Jak Advocate buduje Twoje pismo.',
'hero_sub' => '7-krokowy pipeline, który przekształca opis Twojej sprawy w prawnie ugruntowane stronnicze pismo.',
'stat_legal' => 'zindeksowane przepisy prawne',
'stat_slices' => 'sekcje korpusu',
'stat_steps' => 'kroki pipeline',
'stat_model' => 'model dostosowany',
'pipe_eyebrow' => 'Architektura pipeline',
'pipe_title' => 'Siedem kroków od faktów sprawy do stronniczego pisma.',
'pipe_sub' => 'Każdy krok jest widoczny w panelu Reasoning podczas przebiegu.',
'step1_title' => 'Interpretacja zapytania',
'step1_body' => 'Tekst źródłowy jest analizowany pod kątem typu sprawy, zaangażowanych stron i obowiązujących przepisów.',
'step2_title' => 'Rozszerzenie zapytania',
'step2_body' => 'Agent generuje 35 adversarialnych podpytań, każde sformułowane w celu wzmocnienia pozycji wybranej strony.',
'step3_title' => 'Rozwiązanie sekcji',
'step3_body' => 'Aktywne sekcje korpusu są przekształcane w filtr Qdrant.',
'step4_title' => 'Indeksowanie przesłanych plików',
'step4_body' => 'Przesłane pliki są dzielone na fragmenty po 512 tokenów i osadzane z nomic-embed-text. Przechowywane tylko w pamięci.',
'step5_title' => 'Pobieranie',
'step5_body' => 'Dla każdego podpytania: hybryda BM25 + wyszukiwanie wektorowe → fuzja RRF → reranking. Fragmenty korpusu i przesłanych plików są łączone i deduplikowane.',
'step6_title' => 'Synteza',
'step6_body' => 'Wybrany silnik syntetyzuje pełny wynik: TWOJE NAJSILNIEJSZE ARGUMENTY, pismo adwokackie, LUKI W POZYCJI STRONY PRZECIWNEJ, niepewności i następny krok.',
'step7_title' => 'Pewność cytacji',
'step7_body' => 'Każda cytacja inline jest weryfikowana względem fragmentu źródłowego. Żadnych halucynowanych § numerów.',
'rag_eyebrow' => 'Pobieranie Hard-RAG',
'rag_title' => 'Każde twierdzenie powiązane ze źródłem.',
'rag_sub' => 'Hard-RAG oznacza, że żadna cytacja nie pojawia się w piśmie, chyba że została pobrana z korpusu lub przesłanych plików.',
'rag_step1' => 'Aktywne sekcje → filtr ładunku Qdrant',
'rag_step2' => 'Podpytania → wyszukiwanie słów kluczowych BM25',
'rag_step3' => 'Podpytania → wektorowe wyszukiwanie podobieństwa',
'rag_step4' => 'Fuzja RRF',
'rag_step5' => 'Cross-encoder reranking',
'rag_step6' => 'Fragmenty przesłanych plików połączone',
'rag_step7' => 'Dedup → top N źródeł',
'rag_step8' => 'Synteza z cytacjami',
'corpus_eyebrow' => 'Baza wiedzy',
'corpus_title' => '220 000+ fragmentów w 8 sekcjach korpusu.',
'corpus_sub' => 'Ten sam korpus, który napędza Korrespond. Zindeksowany z Lovdata, ECHR HUDOC, norweskich orzeczeń apelacyjnych i wytycznych Bufdir.',
'llm_eyebrow' => 'Model dostosowany',
'llm_title' => 'dbn-legal-agent — wytrenowany dla norweskiego prawa opieki nad dziećmi.',
'llm_body_html' => 'Model QLoRA dostosowany do tekstów norweskiego prawa dotyczącego opieki nad dziećmi i prawa administracyjnego. dbn-legal-agent rozumie słownictwo proceduralne barnevernsloven i barneloven.',
'llm_table_col1' => 'Krok pipeline',
'llm_table_col2' => 'Rola dbn-legal-agent',
'privacy_eyebrow' => 'Prywatność przez projekt',
'privacy_title' => 'Dane Twojej sprawy nigdy nie opuszczają żądania.',
'privacy_p1' => 'Przesłane pliki są przetwarzane tylko w pamięci — wektory są usuwane po zakończeniu sesji.',
'privacy_p2' => 'Opisy spraw są używane tylko do pobierania i syntezy. Nie są rejestrowane ani przechowywane.',
'privacy_p3' => 'Korpus Qdrant jest tylko do odczytu podczas pobierania.',
'privacy_p4' => 'Przetwarzanie Azure OpenAI odbywa się w punktach końcowych regionu UE (Europa Zachodnia).',
'privacy_p5' => 'Przesyłanie w zakresie sesji: każde uruchomienie otrzymuje nowy indeks w pamięci, odizolowany od innych.',
'privacy_p6' => 'Bez ciasteczek, bez stałych identyfikatorów na stronach dokumentów.',
'cta_title' => 'Zobacz to w akcji.',
'cta_sub' => 'Darmowe dla członków Do Better Norge. Nie jest wymagana karta kredytowa.',
'btn_open' => 'Otwórz Advocate →',
'btn_signin_cta' => 'Zaloguj się, aby użyć Advocate →',
'btn_register' => 'Zarejestruj się za darmo',
),
);