Legal Analysis: full language follow-through (UI + LLM)
The tool now respects the chosen UI language end-to-end — even if the source document is Norwegian, a user on EN/UK/PL gets the analysis in their language. Norwegian statute references (barnevernsloven § 4-25, EMK Art. 8) and case names (Strand Lobben mot Norge 37283/13) are kept verbatim because they are proper nouns. LLM (LegalAnalysisAgent.php): - extractIssues: prompt asks for question + brief_context in user's language; statute refs preserved - answerIssue: Norwegian core system prompt (keeps fine-tune precision) + language-coercion line for non-NO; localised context/source labels - synthesise: overall_assessment, next_steps, disclaimer in user's language; explicit per-language disclaimer text - runFullAnalysis empty-case fallback also localised - what_to_check translated per language UI: - 40 new la_* translation keys in i18n.php × 4 languages (NO/EN/UK/PL) - legal-analysis.php: 4-way lang switcher, dbnToolsT() for every label, emits window.DBN_LA_I18N for runtime JS strings - legal-analysis.js: t() helper reads from window.DBN_LA_I18N - layout_footer.php: emits window.DBN_CURRENT_LANG + window.DBN_ADDON_I18N so the legal-analysis add-on button works in the page's language no matter which tool it's invoked from - tools.js add-on: reads from DBN_ADDON_I18N, passes DBN_CURRENT_LANG to /api/legal-analysis.php so server responds in same language Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -23,6 +23,37 @@
|
||||
</main><!-- /appShell -->
|
||||
<?php require_once __DIR__ . '/footer.php'; ?>
|
||||
<link rel="stylesheet" href="/assets/css/doc-picker.css">
|
||||
<?php
|
||||
// Expose current UI language + add-on i18n map for tools.js (legal-analysis add-on
|
||||
// can fire from any tool page, so it needs strings without depending on per-tool maps).
|
||||
$_footerLang = $uiLang ?? dbnToolsCurrentLanguage();
|
||||
$_footerAddonI18n = [
|
||||
'addonButton' => 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),
|
||||
];
|
||||
?>
|
||||
<script>
|
||||
window.DBN_CURRENT_LANG = <?= json_encode($_footerLang) ?>;
|
||||
window.DBN_ADDON_I18N = <?= json_encode($_footerAddonI18n, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP) ?>;
|
||||
</script>
|
||||
<script src="assets/js/tools.js" defer></script>
|
||||
<?php if (!empty($extraScripts) && is_array($extraScripts)): foreach ($extraScripts as $extraScript): ?>
|
||||
<script src="<?= htmlspecialchars((string)$extraScript) ?>" defer></script>
|
||||
|
||||
Reference in New Issue
Block a user