';
}
var checkHtml = '';
@@ -326,14 +340,13 @@
}
function renderFinal(result) {
- // Add Pass 3 synthesis at the top
var topHtml = '';
if (result.overall_assessment) {
topHtml = ''
- + '
Overall assessment
'
+ + '
' + esc(t('overall')) + '
'
+ '
' + esc(result.overall_assessment) + '
';
if (Array.isArray(result.next_steps) && result.next_steps.length) {
- topHtml += '
Next steps
'
+ topHtml += '
' + esc(t('nextSteps')) + '
'
+ result.next_steps.map(function (s) { return '
' + esc(s) + '
'; }).join('')
+ '
';
}
@@ -343,32 +356,29 @@
topHtml += '
';
}
- // Mark Pass 2/3 complete in the pipeline strip
var pipeline = resultsEl.querySelector('.la-pipeline');
if (pipeline) {
pipeline.innerHTML =
- '
';
}
- // Insert synthesis at top of resultsEl, after pipeline
if (topHtml && pipeline) {
pipeline.insertAdjacentHTML('afterend', topHtml);
} else if (topHtml) {
resultsEl.insertAdjacentHTML('afterbegin', topHtml);
}
- // If issues weren't already rendered (e.g. empty result), put the message in
if ((!result.issues || !result.issues.length) && resultsEl.querySelector('#laIssueList')) {
resultsEl.querySelector('#laIssueList').innerHTML =
- '
No discrete legal issues were identified.
';
+ '
' + esc(t('emptyIssues')) + '
';
}
}
function showError(msg) {
if (resultsEl) {
- resultsEl.innerHTML = '
Error
' + esc(msg) + '
';
+ resultsEl.innerHTML = '
' + esc(t('errorPrefix')) + '
' + esc(msg) + '
';
}
setStatus('');
}
@@ -376,7 +386,7 @@
// ── Helpers ───────────────────────────────────────────────────────────────
function setBusy(on) {
if (runBtn) runBtn.disabled = on;
- if (runBtn) runBtn.textContent = on ? 'Running…' : 'Run legal analysis';
+ if (runBtn) runBtn.textContent = on ? t('runButtonBusy') : t('runButton');
}
function setStatus(msg) {
if (statusEl) statusEl.textContent = msg;
diff --git a/assets/js/tools.js b/assets/js/tools.js
index 1bb2b17..cd1633d 100644
--- a/assets/js/tools.js
+++ b/assets/js/tools.js
@@ -2579,6 +2579,14 @@ window.dbnShowSaveResultButton = showSaveResultButton;
// Injects a button that, when clicked, streams the two-pass legal-analysis flow
// (extract issues → ask dbn-legal-agent-v3 → synthesise) into a sub-section
// below the host container.
+function _laT(key, vars) {
+ const map = window.DBN_ADDON_I18N || {};
+ let s = map[key] || key;
+ if (vars) {
+ Object.keys(vars).forEach((k) => { s = s.split('{' + k + '}').join(String(vars[k])); });
+ }
+ return s;
+}
function dbnRunLegalAnalysisAddon(text, lang, sourceTool, containerEl) {
if (!containerEl) containerEl = document.getElementById('results');
if (!containerEl || !text || text.length < 80) return;
@@ -2595,9 +2603,9 @@ function dbnRunLegalAnalysisAddon(text, lang, sourceTool, containerEl) {
section.style.borderRadius = '8px';
section.style.background = '#f0fdfa';
section.innerHTML =
- '
';
}
}
function dbnInjectLegalAnalysisButton(text, lang, sourceTool, containerEl, options) {
if (!containerEl || !text || text.length < 80) return;
- // Avoid duplicate buttons
if (containerEl.querySelector('.la-addon-btn')) return;
const btn = document.createElement('button');
btn.type = 'button';
btn.className = 'la-addon-btn';
- btn.textContent = (options && options.label) || '⚖️🇳🇴 Run deep legal analysis on this text';
+ btn.textContent = (options && options.label) || _laT('addonButton');
btn.style.cssText = 'display:block;margin:1rem auto 0;padding:0.6rem 1.2rem;font-size:0.92rem;'
+ 'background:#0f766e;color:#fff;border:none;border-radius:6px;cursor:pointer;'
+ 'font-weight:600;letter-spacing:0.02em;';
@@ -2743,9 +2750,9 @@ function dbnInjectLegalAnalysisButton(text, lang, sourceTool, containerEl, optio
btn.addEventListener('mouseleave', function () { btn.style.background = '#0f766e'; });
btn.addEventListener('click', function () {
btn.disabled = true;
- btn.textContent = 'Running deep legal analysis…';
+ btn.textContent = _laT('addonButtonBusy');
btn.style.background = '#94a3b8';
- dbnRunLegalAnalysisAddon(text, lang, sourceTool, containerEl);
+ dbnRunLegalAnalysisAddon(text, lang || window.DBN_CURRENT_LANG || 'no', sourceTool, containerEl);
});
containerEl.appendChild(btn);
}
diff --git a/includes/LegalAnalysisAgent.php b/includes/LegalAnalysisAgent.php
index 22a48fd..0f9e3e5 100644
--- a/includes/LegalAnalysisAgent.php
+++ b/includes/LegalAnalysisAgent.php
@@ -48,15 +48,18 @@ process law). Each issue must be answerable as a SINGLE focused legal question
(≤ 25 words), not a multi-part essay.
Document type hint: {$docType}
-Document language: {$locale}
+User's response language: {$locale}
-Return JSON only:
+Return JSON only — every human-readable string ("question", "brief_context") MUST be
+written in {$locale}. Keep Norwegian statute references (barnevernsloven § 4-25,
+forvaltningsloven § 17, EMK Art. 8) and Norwegian/EMD case names (Strand Lobben mot
+Norge 37283/13) in their original form even when the surrounding text is in {$locale}.
{
"issues": [
{
"id": 1,
- "question": "",
- "brief_context": "<≤2 sentences from the document that triggered this question>",
+ "question": "",
+ "brief_context": "<≤2 sentences in {$locale} summarising what in the document triggered this question — paraphrase, do not quote in Norwegian unless quoting a statute>",
"doc_type": "",
"severity_hint": ""
}
@@ -69,6 +72,7 @@ Rules:
named Høyesterett/EMD cases — NOT general advice.
- If the document has fewer than 5 real legal issues, return fewer entries.
- If NO real legal issue exists, return {"issues": []}.
+- The source document may be in Norwegian — that is fine; still write your output in {$locale}.
DOCUMENT:
---
@@ -119,19 +123,48 @@ PROMPT;
*/
public function answerIssue(array $issue, string $corpusContext, string $language): array
{
+ $locale = dbnToolsLanguageName($language);
+
+ // The fine-tune was trained primarily in Norwegian; the Norwegian system
+ // prompt keeps its precision on barnevernsloven / EMD. We then add a
+ // language-coercion line so the prose comes back in the user's chosen
+ // language. Statute and case names stay in their original Norwegian form.
$sysMsg = 'Du er en ekspert på norsk barnevernsloven og EMD-praksis. '
- . 'Svar alltid på norsk med korrekt juridisk terminologi. '
+ . 'Bruk korrekt juridisk terminologi. '
. 'Bruk terskler fra barnevernsloven 2021: § 4-25 krever «klar nødvendighet». '
. 'Strand Lobben mot Norge (37283/13) setter krav om rehabiliteringsplan før adopsjon. '
. 'Aldri oppfinn paragrafnumre, saksnumre eller dommernavn. '
- . 'Avslutt med en «Kilder:»-seksjon som lister lovparagrafer og dommer du har sitert.';
+ . 'Avslutt med en «Kilder:»-seksjon som lister lovparagrafer og dommer du har sitert. ';
+
+ if ($language === 'no') {
+ $sysMsg .= 'Svar på norsk.';
+ } else {
+ $sysMsg .= 'IMPORTANT: Write your answer in ' . $locale
+ . '. Keep all Norwegian statute references (e.g. "barnevernsloven § 4-25", '
+ . '"forvaltningsloven § 17", "EMK Art. 8") and case names (e.g. "Strand Lobben '
+ . 'mot Norge 37283/13") in their original Norwegian/Latin form. The "Kilder:" '
+ . 'section heading stays as "Kilder:" but its contents (the cited authorities) '
+ . 'are listed in their original Norwegian form.';
+ }
$userMsg = $issue['question'];
if ($issue['brief_context'] !== '') {
- $userMsg .= "\n\nKontekst fra saken: " . $issue['brief_context'];
+ $ctxLabel = match ($language) {
+ 'no' => 'Kontekst fra saken',
+ 'pl' => 'Kontekst sprawy',
+ 'uk' => 'Контекст справи',
+ default => 'Case context',
+ };
+ $userMsg .= "\n\n" . $ctxLabel . ': ' . $issue['brief_context'];
}
if ($corpusContext !== '') {
- $userMsg .= "\n\nRelevante kilder fra Do Better Norge-korpuset:\n" . $corpusContext;
+ $srcLabel = match ($language) {
+ 'no' => 'Relevante kilder fra Do Better Norge-korpuset',
+ 'pl' => 'Istotne źródła z korpusu Do Better Norge',
+ 'uk' => 'Релевантні джерела з корпусу Do Better Norge',
+ default => 'Relevant sources from the Do Better Norge corpus',
+ };
+ $userMsg .= "\n\n" . $srcLabel . ":\n" . $corpusContext;
}
$answer = '';
@@ -164,6 +197,13 @@ PROMPT;
$severity = $clean !== '' ? dbnToolsInferCheckSeverity($clean) : $issue['severity_hint'];
$legalBasis = dbnToolsExtractCheckLegalBasis($clean);
+ $whatToCheck = match ($language) {
+ 'no' => 'Verifiser med norsk familieretsadvokat før handling.',
+ 'pl' => 'Zweryfikuj z norweskim adwokatem ds. rodzinnych przed podjęciem działań.',
+ 'uk' => 'Перевірте з норвезьким адвокатом із сімейного права перед діями.',
+ default => 'Verify with a qualified Norwegian family-law lawyer before acting.',
+ };
+
return [
'id' => $issue['id'],
'question' => $issue['question'],
@@ -171,8 +211,8 @@ PROMPT;
'answer' => $clean,
'severity' => $severity,
'legal_basis' => $legalBasis,
- 'citations_from_corpus' => [], // populated by orchestrator if it kept the chunks
- 'what_to_check' => 'Verifiser med norsk familieretsadvokat før handling.',
+ 'citations_from_corpus' => [],
+ 'what_to_check' => $whatToCheck,
];
}
@@ -194,18 +234,29 @@ PROMPT;
}
$issuesBlock = implode("\n", $bullets);
+ $disclaimerText = match ($language) {
+ 'no' => 'Dette er automatisert juridisk analyse, ikke juridisk rådgivning. Verifiser med en kvalifisert norsk advokat før du handler.',
+ 'pl' => 'To jest zautomatyzowana analiza prawna, a nie porada prawna. Zweryfikuj z wykwalifikowanym norweskim prawnikiem przed podjęciem działań.',
+ 'uk' => 'Це автоматизований юридичний аналіз, а не юридична консультація. Перевірте з кваліфікованим норвезьким юристом перед діями.',
+ default => 'This is automated legal analysis, not legal advice. Verify with a qualified Norwegian lawyer before acting.',
+ };
+
$prompt = <<",
- "next_steps": ["", "", ""],
- "disclaimer": "This is automated legal analysis, not legal advice. Verify with a qualified Norwegian lawyer before acting."
+ "overall_assessment": "<3-5 sentences in {$locale} summarising the legal picture across all issues>",
+ "next_steps": ["", "", ""],
+ "disclaimer": "{$disclaimerText}"
}
PROMPT;
@@ -250,12 +301,24 @@ PROMPT;
$issues = $this->extractIssues($text, $language, $docType);
if (empty($issues)) {
+ $emptyAssessment = match ($language) {
+ 'no' => 'Ingen distinkte juridiske spørsmål identifisert i dette dokumentet.',
+ 'pl' => 'Nie zidentyfikowano odrębnych kwestii prawnych w tym dokumencie.',
+ 'uk' => 'У цьому документі не виявлено окремих юридичних питань.',
+ default => 'No discrete legal issues identified in this document.',
+ };
+ $emptyDisclaimer = match ($language) {
+ 'no' => 'Automatisert analyse — ikke juridisk rådgivning.',
+ 'pl' => 'Analiza zautomatyzowana — nie stanowi porady prawnej.',
+ 'uk' => 'Автоматизований аналіз — не є юридичною консультацією.',
+ default => 'Automated analysis — not legal advice.',
+ };
return [
'ok' => true,
'issues' => [],
- 'overall_assessment' => 'No discrete legal issues identified in this document.',
+ 'overall_assessment' => $emptyAssessment,
'next_steps' => [],
- 'disclaimer' => 'Automated analysis — not legal advice.',
+ 'disclaimer' => $emptyDisclaimer,
'model' => self::LEGAL_MODEL,
'latency_ms' => (int)round(microtime(true) * 1000) - $startMs,
];
diff --git a/includes/i18n.php b/includes/i18n.php
index b1af41b..2510d4a 100644
--- a/includes/i18n.php
+++ b/includes/i18n.php
@@ -395,6 +395,46 @@ function dbnToolsTranslations(): array
'js_field_tags' => 'Tags (comma-separated)',
'js_field_lang' => 'Language',
'js_field_author' => 'Author',
+
+ // ── Legal Analysis tool ───────────────────────────────────────────
+ 'la_doc_type_label' => 'Document type',
+ 'la_doc_type_auto' => 'Auto-detect',
+ 'la_doc_type_other' => 'Other',
+ 'la_engine_hint' => 'Engine: dbn-legal-agent-v3 (Norwegian legal fine-tune on GPU). Each issue answered separately; ~30-60s per issue, up to 5 issues per run.',
+ 'la_input_label' => 'Pasted text',
+ 'la_input_hint' => '(optional if file or doc selected)',
+ 'la_input_placeholder' => 'Paste a case note, court decision, vedtak, letter, or any legal document text. You can also upload a file or select from My Docs above — at least one source is required.',
+ 'la_run_button' => 'Run legal analysis',
+ 'la_run_button_busy' => 'Running…',
+ 'la_ready_title' => 'Ready',
+ 'la_ready_intro' => 'Upload a document or paste text — the tool will extract up to 5 distinct legal issues, then ask the Norwegian-law fine-tune to answer each one with citations.',
+ 'la_ready_pipeline' => 'Pass 1 uses Azure GPT-4o-mini to spot issues. Pass 2 calls the dbn-legal-agent-v3 fine-tune on ocelot for each one. Pass 3 synthesises the overall picture. A typical run takes 2-5 minutes.',
+ 'la_pipeline_pass1' => 'Pass 1',
+ 'la_pipeline_pass2' => 'Pass 2',
+ 'la_pipeline_pass3' => 'Pass 3',
+ 'la_pass1_extracting' => 'Extracting legal issues from your document…',
+ 'la_pass1_found' => 'Found {n} legal issue(s)',
+ 'la_pass2_asking' => 'Asking dbn-legal-agent-v3 about each issue…',
+ 'la_pass2_answered' => 'Specialist answered {n} issue(s)',
+ 'la_pass3_synthesis' => 'Synthesis complete',
+ 'la_waiting' => 'Waiting…',
+ 'la_searching_corpus' => 'Searching legal corpus…',
+ 'la_asking_finetune' => 'Asking dbn-legal-agent-v3…',
+ 'la_overall' => 'Overall assessment',
+ 'la_next_steps' => 'Next steps',
+ 'la_answer_header' => 'Answer',
+ 'la_legal_basis' => 'Legal basis:',
+ 'la_extracting_status' => 'Identifying distinct legal issues…',
+ 'la_synthesising_status' => 'Synthesising overall assessment…',
+ 'la_extracting_files' => 'Extracting text from {n} file(s)…',
+ 'la_need_input' => 'Paste text, upload a file, or select a document before running.',
+ 'la_error_prefix' => 'Error:',
+ 'la_server_returned' => 'Server returned',
+ 'la_empty_issues' => 'No discrete legal issues were identified.',
+
+ 'la_addon_button' => '⚖️🇳🇴 Run deep legal analysis on this text',
+ 'la_addon_button_busy' => 'Running deep legal analysis…',
+ 'la_addon_section' => 'Deep Legal Analysis',
],
'no' => [
'meta_title' => 'Do Better Norge - juridiske AI-verktøy',
@@ -722,6 +762,46 @@ function dbnToolsTranslations(): array
'js_field_tags' => 'Tagger (komma-separert)',
'js_field_lang' => 'Språk',
'js_field_author' => 'Forfatter',
+
+ // ── Juridisk analyse ──────────────────────────────────────────────
+ 'la_doc_type_label' => 'Dokumenttype',
+ 'la_doc_type_auto' => 'Auto-oppdaging',
+ 'la_doc_type_other' => 'Annet',
+ 'la_engine_hint' => 'Motor: dbn-legal-agent-v3 (norsk juridisk fine-tune på GPU). Hvert spørsmål besvares hver for seg; ~30-60s per spørsmål, opp til 5 spørsmål per kjøring.',
+ 'la_input_label' => 'Limt inn tekst',
+ 'la_input_hint' => '(valgfritt hvis fil eller dokument er valgt)',
+ 'la_input_placeholder' => 'Lim inn et saksnotat, rettsavgjørelse, vedtak, brev eller annen juridisk dokumenttekst. Du kan også laste opp en fil eller velge fra Mine dokumenter ovenfor — minst én kilde kreves.',
+ 'la_run_button' => 'Kjør juridisk analyse',
+ 'la_run_button_busy' => 'Kjører…',
+ 'la_ready_title' => 'Klar',
+ 'la_ready_intro' => 'Last opp et dokument eller lim inn tekst — verktøyet henter ut opptil 5 distinkte juridiske spørsmål og lar den norske fine-tunen svare på hvert enkelt med kilder.',
+ 'la_ready_pipeline' => 'Pass 1 bruker Azure GPT-4o-mini for å identifisere spørsmål. Pass 2 kaller dbn-legal-agent-v3 fine-tunen på ocelot for hvert spørsmål. Pass 3 sammenfatter helhetsbildet. En typisk kjøring tar 2-5 minutter.',
+ 'la_pipeline_pass1' => 'Pass 1',
+ 'la_pipeline_pass2' => 'Pass 2',
+ 'la_pipeline_pass3' => 'Pass 3',
+ 'la_pass1_extracting' => 'Henter ut juridiske spørsmål fra dokumentet…',
+ 'la_pass1_found' => 'Fant {n} juridisk(e) spørsmål',
+ 'la_pass2_asking' => 'Spør dbn-legal-agent-v3 om hvert spørsmål…',
+ 'la_pass2_answered' => 'Spesialisten besvarte {n} spørsmål',
+ 'la_pass3_synthesis' => 'Syntese fullført',
+ 'la_waiting' => 'Venter…',
+ 'la_searching_corpus' => 'Søker i juridisk korpus…',
+ 'la_asking_finetune' => 'Spør dbn-legal-agent-v3…',
+ 'la_overall' => 'Helhetsvurdering',
+ 'la_next_steps' => 'Neste skritt',
+ 'la_answer_header' => 'Svar',
+ 'la_legal_basis' => 'Lovgrunnlag:',
+ 'la_extracting_status' => 'Identifiserer distinkte juridiske spørsmål…',
+ 'la_synthesising_status' => 'Sammenfatter helhetsvurdering…',
+ 'la_extracting_files' => 'Henter ut tekst fra {n} fil(er)…',
+ 'la_need_input' => 'Lim inn tekst, last opp en fil eller velg et dokument før du kjører.',
+ 'la_error_prefix' => 'Feil:',
+ 'la_server_returned' => 'Server svarte',
+ 'la_empty_issues' => 'Ingen distinkte juridiske spørsmål ble identifisert.',
+
+ 'la_addon_button' => '⚖️🇳🇴 Kjør dyp juridisk analyse på denne teksten',
+ 'la_addon_button_busy' => 'Kjører dyp juridisk analyse…',
+ 'la_addon_section' => 'Dyp juridisk analyse',
],
'uk' => [
'meta_title' => 'Do Better Norge - юридичні AI інструменти',
@@ -1049,6 +1129,46 @@ function dbnToolsTranslations(): array
'js_field_tags' => 'Теги (через кому)',
'js_field_lang' => 'Мова',
'js_field_author' => 'Автор',
+
+ // ── Юридичний аналіз ──────────────────────────────────────────────
+ 'la_doc_type_label' => 'Тип документа',
+ 'la_doc_type_auto' => 'Авто-визначення',
+ 'la_doc_type_other' => 'Інше',
+ 'la_engine_hint' => 'Модель: dbn-legal-agent-v3 (норвезька юридична fine-tune на GPU). Кожне питання обробляється окремо; ~30-60с на питання, до 5 питань за запуск.',
+ 'la_input_label' => 'Вставлений текст',
+ 'la_input_hint' => '(необов’язково, якщо вибрано файл або документ)',
+ 'la_input_placeholder' => 'Вставте судову нотатку, рішення суду, vedtak, лист або будь-який юридичний текст. Можна також завантажити файл або вибрати з Моїх документів вище — потрібне принаймні одне джерело.',
+ 'la_run_button' => 'Запустити юридичний аналіз',
+ 'la_run_button_busy' => 'Виконання…',
+ 'la_ready_title' => 'Готово',
+ 'la_ready_intro' => 'Завантажте документ або вставте текст — інструмент виявить до 5 окремих юридичних питань і попросить норвезьку fine-tune відповісти на кожне з цитатами.',
+ 'la_ready_pipeline' => 'Прохід 1 використовує Azure GPT-4o-mini для виявлення питань. Прохід 2 викликає dbn-legal-agent-v3 для кожного. Прохід 3 синтезує загальну картину. Типовий запуск триває 2-5 хвилин.',
+ 'la_pipeline_pass1' => 'Прохід 1',
+ 'la_pipeline_pass2' => 'Прохід 2',
+ 'la_pipeline_pass3' => 'Прохід 3',
+ 'la_pass1_extracting' => 'Виявлення юридичних питань у документі…',
+ 'la_pass1_found' => 'Знайдено {n} юридичне(их) питання',
+ 'la_pass2_asking' => 'Запит до dbn-legal-agent-v3 для кожного питання…',
+ 'la_pass2_answered' => 'Спеціаліст відповів на {n} питання',
+ 'la_pass3_synthesis' => 'Синтез завершено',
+ 'la_waiting' => 'Очікування…',
+ 'la_searching_corpus' => 'Пошук у юридичному корпусі…',
+ 'la_asking_finetune' => 'Запит до dbn-legal-agent-v3…',
+ 'la_overall' => 'Загальна оцінка',
+ 'la_next_steps' => 'Наступні кроки',
+ 'la_answer_header' => 'Відповідь',
+ 'la_legal_basis' => 'Правова підстава:',
+ 'la_extracting_status' => 'Виявлення окремих юридичних питань…',
+ 'la_synthesising_status' => 'Синтез загальної оцінки…',
+ 'la_extracting_files' => 'Виділення тексту з {n} файл(ів)…',
+ 'la_need_input' => 'Вставте текст, завантажте файл або виберіть документ перед запуском.',
+ 'la_error_prefix' => 'Помилка:',
+ 'la_server_returned' => 'Сервер повернув',
+ 'la_empty_issues' => 'Окремих юридичних питань не виявлено.',
+
+ 'la_addon_button' => '⚖️🇳🇴 Запустити глибокий юридичний аналіз цього тексту',
+ 'la_addon_button_busy' => 'Виконується глибокий юридичний аналіз…',
+ 'la_addon_section' => 'Глибокий юридичний аналіз',
],
'pl' => [
'meta_title' => 'Do Better Norge - prawne narzędzia AI',
@@ -1376,6 +1496,46 @@ function dbnToolsTranslations(): array
'js_field_tags' => 'Tagi (oddzielone przecinkami)',
'js_field_lang' => 'Język',
'js_field_author' => 'Autor',
+
+ // ── Analiza prawna ────────────────────────────────────────────────
+ 'la_doc_type_label' => 'Typ dokumentu',
+ 'la_doc_type_auto' => 'Auto-wykrywanie',
+ 'la_doc_type_other' => 'Inny',
+ 'la_engine_hint' => 'Silnik: dbn-legal-agent-v3 (norweski prawny fine-tune na GPU). Każda kwestia odpowiadana osobno; ~30-60s na kwestię, do 5 kwestii na uruchomienie.',
+ 'la_input_label' => 'Wklejony tekst',
+ 'la_input_hint' => '(opcjonalne, jeśli wybrano plik lub dokument)',
+ 'la_input_placeholder' => 'Wklej notatkę sprawy, orzeczenie sądu, vedtak, list lub dowolny tekst prawny. Możesz też przesłać plik lub wybrać z Moich dokumentów powyżej — wymagane jest co najmniej jedno źródło.',
+ 'la_run_button' => 'Uruchom analizę prawną',
+ 'la_run_button_busy' => 'Uruchamianie…',
+ 'la_ready_title' => 'Gotowe',
+ 'la_ready_intro' => 'Prześlij dokument lub wklej tekst — narzędzie wyodrębni do 5 odrębnych kwestii prawnych i poprosi norweski fine-tune o odpowiedź na każdą z cytatami.',
+ 'la_ready_pipeline' => 'Przebieg 1 używa Azure GPT-4o-mini do wykrycia kwestii. Przebieg 2 wywołuje dbn-legal-agent-v3 dla każdej. Przebieg 3 syntetyzuje obraz całości. Typowe uruchomienie trwa 2-5 minut.',
+ 'la_pipeline_pass1' => 'Przebieg 1',
+ 'la_pipeline_pass2' => 'Przebieg 2',
+ 'la_pipeline_pass3' => 'Przebieg 3',
+ 'la_pass1_extracting' => 'Wyodrębnianie kwestii prawnych z dokumentu…',
+ 'la_pass1_found' => 'Znaleziono {n} kwestii prawnych',
+ 'la_pass2_asking' => 'Pytanie dbn-legal-agent-v3 o każdą kwestię…',
+ 'la_pass2_answered' => 'Specjalista odpowiedział na {n} kwestii',
+ 'la_pass3_synthesis' => 'Synteza zakończona',
+ 'la_waiting' => 'Oczekiwanie…',
+ 'la_searching_corpus' => 'Przeszukiwanie korpusu prawnego…',
+ 'la_asking_finetune' => 'Pytanie dbn-legal-agent-v3…',
+ 'la_overall' => 'Ocena całościowa',
+ 'la_next_steps' => 'Następne kroki',
+ 'la_answer_header' => 'Odpowiedź',
+ 'la_legal_basis' => 'Podstawa prawna:',
+ 'la_extracting_status' => 'Identyfikowanie odrębnych kwestii prawnych…',
+ 'la_synthesising_status' => 'Syntetyzowanie oceny całościowej…',
+ 'la_extracting_files' => 'Wyodrębnianie tekstu z {n} plik(ów)…',
+ 'la_need_input' => 'Wklej tekst, prześlij plik lub wybierz dokument przed uruchomieniem.',
+ 'la_error_prefix' => 'Błąd:',
+ 'la_server_returned' => 'Serwer zwrócił',
+ 'la_empty_issues' => 'Nie zidentyfikowano odrębnych kwestii prawnych.',
+
+ 'la_addon_button' => '⚖️🇳🇴 Uruchom głęboką analizę prawną tego tekstu',
+ 'la_addon_button_busy' => 'Trwa głęboka analiza prawna…',
+ 'la_addon_section' => 'Głęboka analiza prawna',
],
];
}
diff --git a/includes/layout_footer.php b/includes/layout_footer.php
index 404bd55..b18f9de 100644
--- a/includes/layout_footer.php
+++ b/includes/layout_footer.php
@@ -23,6 +23,37 @@
+ dbnToolsT('la_addon_button', $_footerLang),
+ 'addonButtonBusy' => dbnToolsT('la_addon_button_busy', $_footerLang),
+ 'addonSection' => dbnToolsT('la_addon_section', $_footerLang),
+ 'pass1' => dbnToolsT('la_pipeline_pass1', $_footerLang),
+ 'pass2' => dbnToolsT('la_pipeline_pass2', $_footerLang),
+ 'pass3' => dbnToolsT('la_pipeline_pass3', $_footerLang),
+ 'pass1Extracting' => dbnToolsT('la_pass1_extracting', $_footerLang),
+ 'pass1Found' => dbnToolsT('la_pass1_found', $_footerLang),
+ 'pass2Asking' => dbnToolsT('la_pass2_asking', $_footerLang),
+ 'pass2Answered' => dbnToolsT('la_pass2_answered', $_footerLang),
+ 'pass3Synthesis' => dbnToolsT('la_pass3_synthesis', $_footerLang),
+ 'waiting' => dbnToolsT('la_waiting', $_footerLang),
+ 'searchingCorpus' => dbnToolsT('la_searching_corpus', $_footerLang),
+ 'askingFinetune' => dbnToolsT('la_asking_finetune', $_footerLang),
+ 'overall' => dbnToolsT('la_overall', $_footerLang),
+ 'nextSteps' => dbnToolsT('la_next_steps', $_footerLang),
+ 'answerHeader' => dbnToolsT('la_answer_header', $_footerLang),
+ 'legalBasis' => dbnToolsT('la_legal_basis', $_footerLang),
+ 'errorPrefix' => dbnToolsT('la_error_prefix', $_footerLang),
+ 'serverReturned' => dbnToolsT('la_server_returned', $_footerLang),
+];
+?>
+
diff --git a/legal-analysis.php b/legal-analysis.php
index 5fb6bf0..529fb4f 100644
--- a/legal-analysis.php
+++ b/legal-analysis.php
@@ -6,28 +6,58 @@ $toolKind = 'Deep Legal Q&A';
$toolBadge = 'Two-pass';
$extraScripts = ['assets/js/legal-analysis.js'];
require_once __DIR__ . '/includes/layout.php';
+
+$laLang = dbnToolsCurrentLanguage();
+$laT = static fn(string $k): string => dbnToolsT($k, $laLang);
+$laI18n = [
+ 'docTypeAuto' => $laT('la_doc_type_auto'),
+ 'runButton' => $laT('la_run_button'),
+ 'runButtonBusy' => $laT('la_run_button_busy'),
+ 'extractingFiles' => $laT('la_extracting_files'),
+ 'needInput' => $laT('la_need_input'),
+ 'errorPrefix' => $laT('la_error_prefix'),
+ 'serverReturned' => $laT('la_server_returned'),
+ 'pass1' => $laT('la_pipeline_pass1'),
+ 'pass2' => $laT('la_pipeline_pass2'),
+ 'pass3' => $laT('la_pipeline_pass3'),
+ 'pass1Extracting' => $laT('la_pass1_extracting'),
+ 'pass1Found' => $laT('la_pass1_found'),
+ 'pass2Asking' => $laT('la_pass2_asking'),
+ 'pass2Answered' => $laT('la_pass2_answered'),
+ 'pass3Synthesis' => $laT('la_pass3_synthesis'),
+ 'waiting' => $laT('la_waiting'),
+ 'searchingCorpus' => $laT('la_searching_corpus'),
+ 'askingFinetune' => $laT('la_asking_finetune'),
+ 'overall' => $laT('la_overall'),
+ 'nextSteps' => $laT('la_next_steps'),
+ 'answerHeader' => $laT('la_answer_header'),
+ 'legalBasis' => $laT('la_legal_basis'),
+ 'extractingStatus' => $laT('la_extracting_status'),
+ 'synthesisingStatus' => $laT('la_synthesising_status'),
+ 'emptyIssues' => $laT('la_empty_issues'),
+];
?>
-
-
+
+
-
Ready
-
Upload a document or paste text — the tool will extract up to 5 distinct legal issues, then ask the Norwegian-law fine-tune to answer each one with citations.
-
Pass 1 uses Azure GPT-4o-mini to spot issues. Pass 2 calls the dbn-legal-agent-v3 fine-tune on ocelot for each one. Pass 3 synthesises the overall picture. A typical run takes 2-5 minutes.