Fix docPickerBtn/audioPickerBtn i18n — add missing translation keys

Add doc_picker_btn/audio_picker_btn to i18n.php (en/no/uk/pl), add
docPickerBtn to REDACT_I18N + TIMELINE_I18N and audioPickerBtn to
TRANSCRIBE_I18N in tools.js. PHP-render picker labels in legal-analysis,
translate, summarize, tool_form, and layout_footer using dbnToolsT().

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-24 12:41:09 +02:00
parent 1eb55a8384
commit 88555eb8a7
7 changed files with 33 additions and 5 deletions
+12
View File
@@ -57,6 +57,7 @@ const REDACT_I18N = {
redactDownloadDocx: 'Download .docx', redactDownloadDocx: 'Download .docx',
redactCopy: 'Copy', redactCopy: 'Copy',
redactCopied: 'Copied!', redactCopied: 'Copied!',
docPickerBtn: 'Select from My Docs',
}, },
no: { no: {
redactEngine: 'Motor', redactEngine: 'Motor',
@@ -111,6 +112,7 @@ const REDACT_I18N = {
redactDownloadDocx: 'Last ned .docx', redactDownloadDocx: 'Last ned .docx',
redactCopy: 'Kopier', redactCopy: 'Kopier',
redactCopied: 'Kopiert!', redactCopied: 'Kopiert!',
docPickerBtn: 'Velg fra Mine dokumenter',
}, },
uk: { uk: {
redactEngine: 'Рушій', redactEngine: 'Рушій',
@@ -165,6 +167,7 @@ const REDACT_I18N = {
redactDownloadDocx: 'Завантажити .docx', redactDownloadDocx: 'Завантажити .docx',
redactCopy: 'Копіювати', redactCopy: 'Копіювати',
redactCopied: 'Скопійовано!', redactCopied: 'Скопійовано!',
docPickerBtn: 'Вибрати з Моїх документів',
}, },
pl: { pl: {
redactEngine: 'Silnik', redactEngine: 'Silnik',
@@ -219,6 +222,7 @@ const REDACT_I18N = {
redactDownloadDocx: 'Pobierz .docx', redactDownloadDocx: 'Pobierz .docx',
redactCopy: 'Kopiuj', redactCopy: 'Kopiuj',
redactCopied: 'Skopiowano!', redactCopied: 'Skopiowano!',
docPickerBtn: 'Wybierz z Moich dokumentów',
}, },
}; };
@@ -263,6 +267,7 @@ const TIMELINE_I18N = {
timelineNotesLabel: 'Context notes', timelineNotesLabel: 'Context notes',
timelineNotesPlaceholder: 'Add any clarifications to guide the AI — e.g. "All dates are 2024", "Focus on the mother\'s actions", "D refers to the defendant throughout".', timelineNotesPlaceholder: 'Add any clarifications to guide the AI — e.g. "All dates are 2024", "Focus on the mother\'s actions", "D refers to the defendant throughout".',
timelineNotesHint: 'These notes are included in the prompt to help the model interpret ambiguous dates, actors, or abbreviations. Not stored.', timelineNotesHint: 'These notes are included in the prompt to help the model interpret ambiguous dates, actors, or abbreviations. Not stored.',
docPickerBtn: 'Select from My Docs',
}, },
no: { no: {
timelineEngine: 'Motor', timelineEngine: 'Motor',
@@ -304,6 +309,7 @@ const TIMELINE_I18N = {
timelineNotesLabel: 'Kontekstnotes', timelineNotesLabel: 'Kontekstnotes',
timelineNotesPlaceholder: 'Legg til avklaringer for å veilede AI-en — f.eks. "Alle datoer er 2024", "Fokuser på morens handlinger", "D refererer til saksøkte gjennom hele dokumentet".', timelineNotesPlaceholder: 'Legg til avklaringer for å veilede AI-en — f.eks. "Alle datoer er 2024", "Fokuser på morens handlinger", "D refererer til saksøkte gjennom hele dokumentet".',
timelineNotesHint: 'Disse notatene inkluderes i ledeteksten for å hjelpe modellen med å tolke uklare datoer, aktører eller forkortelser. Lagres ikke.', timelineNotesHint: 'Disse notatene inkluderes i ledeteksten for å hjelpe modellen med å tolke uklare datoer, aktører eller forkortelser. Lagres ikke.',
docPickerBtn: 'Velg fra Mine dokumenter',
}, },
uk: { uk: {
timelineEngine: 'Рушій', timelineEngine: 'Рушій',
@@ -345,6 +351,7 @@ const TIMELINE_I18N = {
timelineNotesLabel: 'Контекстні нотатки', timelineNotesLabel: 'Контекстні нотатки',
timelineNotesPlaceholder: 'Додайте пояснення для ШІ — напр. "Усі дати відносяться до 2024 року", "Зосередьтесь на діях матері", "D — відповідач по всьому документу".', timelineNotesPlaceholder: 'Додайте пояснення для ШІ — напр. "Усі дати відносяться до 2024 року", "Зосередьтесь на діях матері", "D — відповідач по всьому документу".',
timelineNotesHint: 'Ці нотатки включаються до запиту, щоб допомогти моделі інтерпретувати неоднозначні дати, учасників або скорочення. Не зберігаються.', timelineNotesHint: 'Ці нотатки включаються до запиту, щоб допомогти моделі інтерпретувати неоднозначні дати, учасників або скорочення. Не зберігаються.',
docPickerBtn: 'Вибрати з Моїх документів',
}, },
pl: { pl: {
timelineEngine: 'Silnik', timelineEngine: 'Silnik',
@@ -386,6 +393,7 @@ const TIMELINE_I18N = {
timelineNotesLabel: 'Notatki kontekstowe', timelineNotesLabel: 'Notatki kontekstowe',
timelineNotesPlaceholder: 'Dodaj wyjaśnienia dla AI — np. "Wszystkie daty dotyczą 2024", "Skup się na działaniach matki", "D odnosi się do pozwanego w całym dokumencie".', timelineNotesPlaceholder: 'Dodaj wyjaśnienia dla AI — np. "Wszystkie daty dotyczą 2024", "Skup się na działaniach matki", "D odnosi się do pozwanego w całym dokumencie".',
timelineNotesHint: 'Te notatki są dołączane do zapytania, aby pomóc modelowi interpretować niejednoznaczne daty, uczestników lub skróty. Nie są przechowywane.', timelineNotesHint: 'Te notatki są dołączane do zapytania, aby pomóc modelowi interpretować niejednoznaczne daty, uczestników lub skróty. Nie są przechowywane.',
docPickerBtn: 'Wybierz z Moich dokumentów',
}, },
}; };
@@ -474,6 +482,7 @@ const TRANSCRIBE_I18N = {
postModelMini: 'GPT-4o Mini', postModelMini: 'GPT-4o Mini',
postModelFull: 'GPT-4o', postModelFull: 'GPT-4o',
postModelHint: 'Fixes errors, punctuation, and domain terms after transcription.', postModelHint: 'Fixes errors, punctuation, and domain terms after transcription.',
audioPickerBtn: 'Select from My Audio',
}, },
no: { no: {
transcribeLang: 'Språk i lydfil', transcribeLang: 'Språk i lydfil',
@@ -528,6 +537,7 @@ const TRANSCRIBE_I18N = {
postModelMini: 'GPT-4o Mini', postModelMini: 'GPT-4o Mini',
postModelFull: 'GPT-4o', postModelFull: 'GPT-4o',
postModelHint: 'Retter feil, tegnsetting og fagtermer etter transkripsjon.', postModelHint: 'Retter feil, tegnsetting og fagtermer etter transkripsjon.',
audioPickerBtn: 'Velg fra Mine lydfiler',
}, },
uk: { uk: {
transcribeLang: 'Мова аудіо', transcribeLang: 'Мова аудіо',
@@ -582,6 +592,7 @@ const TRANSCRIBE_I18N = {
postModelMini: 'GPT-4o Mini', postModelMini: 'GPT-4o Mini',
postModelFull: 'GPT-4o', postModelFull: 'GPT-4o',
postModelHint: 'Виправляє помилки, пунктуацію та терміни після транскрипції.', postModelHint: 'Виправляє помилки, пунктуацію та терміни після транскрипції.',
audioPickerBtn: 'Вибрати з Мого аудіо',
}, },
pl: { pl: {
transcribeLang: 'Język audio', transcribeLang: 'Język audio',
@@ -636,6 +647,7 @@ const TRANSCRIBE_I18N = {
postModelMini: 'GPT-4o Mini', postModelMini: 'GPT-4o Mini',
postModelFull: 'GPT-4o', postModelFull: 'GPT-4o',
postModelHint: 'Poprawia błędy, interpunkcję i terminy po transkrypcji.', postModelHint: 'Poprawia błędy, interpunkcję i terminy po transkrypcji.',
audioPickerBtn: 'Wybierz z Mojego audio',
}, },
}; };
+16
View File
@@ -459,6 +459,10 @@ function dbnToolsTranslations(): array
'lt_same_lang_error' => 'Source and target languages must be different.', 'lt_same_lang_error' => 'Source and target languages must be different.',
'lt_disclaimer' => 'This is an AI-assisted translation. Always verify with a qualified legal interpreter for official use.', 'lt_disclaimer' => 'This is an AI-assisted translation. Always verify with a qualified legal interpreter for official use.',
'doc_picker_btn' => 'Select from My Docs',
'audio_picker_btn' => 'Select from My Audio',
'doc_picker_modal_title' => 'Select from My Docs',
// MCP setup page + tool detail pages // MCP setup page + tool detail pages
'mcp_page_title' => 'MCP — Do Better Norge', 'mcp_page_title' => 'MCP — Do Better Norge',
'mcp_meta_desc' => 'Connect Claude, Cursor, and other AI tools to all 19 DBN legal preparation tools via MCP.', 'mcp_meta_desc' => 'Connect Claude, Cursor, and other AI tools to all 19 DBN legal preparation tools via MCP.',
@@ -899,6 +903,10 @@ function dbnToolsTranslations(): array
'lt_same_lang_error' => 'Kilde- og målspråk må være forskjellige.', 'lt_same_lang_error' => 'Kilde- og målspråk må være forskjellige.',
'lt_disclaimer' => 'Dette er en AI-assistert oversettelse. Verifiser alltid med en kvalifisert juridisk tolk til offisielt bruk.', 'lt_disclaimer' => 'Dette er en AI-assistert oversettelse. Verifiser alltid med en kvalifisert juridisk tolk til offisielt bruk.',
'doc_picker_btn' => 'Velg fra Mine dokumenter',
'audio_picker_btn' => 'Velg fra Mine lydfiler',
'doc_picker_modal_title' => 'Velg fra Mine dokumenter',
// MCP setup page + tool detail pages // MCP setup page + tool detail pages
'mcp_page_title' => 'MCP — Do Better Norge', 'mcp_page_title' => 'MCP — Do Better Norge',
'mcp_meta_desc' => 'Koble Claude, Cursor og andre AI-verktøy til alle 19 DBN juridiske forberedelsesverktøy via MCP.', 'mcp_meta_desc' => 'Koble Claude, Cursor og andre AI-verktøy til alle 19 DBN juridiske forberedelsesverktøy via MCP.',
@@ -1339,6 +1347,10 @@ function dbnToolsTranslations(): array
'lt_same_lang_error' => 'Мова оригіналу та мова перекладу повинні бути різними.', 'lt_same_lang_error' => 'Мова оригіналу та мова перекладу повинні бути різними.',
'lt_disclaimer' => 'Це переклад за допомогою штучного інтелекту. Завжди перевіряйте з кваліфікованим юридичним перекладачем для офіційного використання.', 'lt_disclaimer' => 'Це переклад за допомогою штучного інтелекту. Завжди перевіряйте з кваліфікованим юридичним перекладачем для офіційного використання.',
'doc_picker_btn' => 'Вибрати з Моїх документів',
'audio_picker_btn' => 'Вибрати з Мого аудіо',
'doc_picker_modal_title' => 'Вибрати з Моїх документів',
// MCP setup page + tool detail pages // MCP setup page + tool detail pages
'mcp_page_title' => 'MCP — Do Better Norge', 'mcp_page_title' => 'MCP — Do Better Norge',
'mcp_meta_desc' => 'Підключіть Claude, Cursor та інші інструменти ШІ до всіх 19 юридичних підготовчих інструментів DBN через MCP.', 'mcp_meta_desc' => 'Підключіть Claude, Cursor та інші інструменти ШІ до всіх 19 юридичних підготовчих інструментів DBN через MCP.',
@@ -1779,6 +1791,10 @@ function dbnToolsTranslations(): array
'lt_same_lang_error' => 'Języki źródłowy i docelowy muszą być różne.', 'lt_same_lang_error' => 'Języki źródłowy i docelowy muszą być różne.',
'lt_disclaimer' => 'To jest tłumaczenie wspomagane AI. Zawsze weryfikuj z wykwalifikowanym tłumaczem prawnym do oficjalnego użytku.', 'lt_disclaimer' => 'To jest tłumaczenie wspomagane AI. Zawsze weryfikuj z wykwalifikowanym tłumaczem prawnym do oficjalnego użytku.',
'doc_picker_btn' => 'Wybierz z Moich dokumentów',
'audio_picker_btn' => 'Wybierz z Mojego audio',
'doc_picker_modal_title' => 'Wybierz z Moich dokumentów',
// MCP setup page + tool detail pages // MCP setup page + tool detail pages
'mcp_page_title' => 'MCP — Do Better Norge', 'mcp_page_title' => 'MCP — Do Better Norge',
'mcp_meta_desc' => 'Połącz Claude, Cursor i inne narzędzia AI z wszystkimi 19 narzędziami przygotowania prawnego DBN za pośrednictwem MCP.', 'mcp_meta_desc' => 'Połącz Claude, Cursor i inne narzędzia AI z wszystkimi 19 narzędziami przygotowania prawnego DBN za pośrednictwem MCP.',
+1 -1
View File
@@ -65,7 +65,7 @@ $_footerAddonI18n = [
<div id="docPickerBackdrop" class="doc-picker-backdrop" hidden role="dialog" aria-modal="true" aria-labelledby="docPickerTitle"> <div id="docPickerBackdrop" class="doc-picker-backdrop" hidden role="dialog" aria-modal="true" aria-labelledby="docPickerTitle">
<div class="doc-picker-dialog"> <div class="doc-picker-dialog">
<div class="doc-picker-dialog__head"> <div class="doc-picker-dialog__head">
<h3 id="docPickerTitle">Select from My Docs</h3> <h3 id="docPickerTitle"><?= htmlspecialchars(dbnToolsT('doc_picker_modal_title', $uiLang)) ?></h3>
<button class="doc-picker-dialog__close" aria-label="Close">&times;</button> <button class="doc-picker-dialog__close" aria-label="Close">&times;</button>
</div> </div>
<input type="search" class="doc-picker-dialog__search" placeholder="Search documents…" aria-label="Search documents"> <input type="search" class="doc-picker-dialog__search" placeholder="Search documents…" aria-label="Search documents">
+1 -1
View File
@@ -75,7 +75,7 @@
<div id="docPickerSection" class="doc-picker-section"> <div id="docPickerSection" class="doc-picker-section">
<button type="button" id="docPickerBtn" class="doc-picker-btn" aria-haspopup="dialog"> <button type="button" id="docPickerBtn" class="doc-picker-btn" aria-haspopup="dialog">
<svg class="doc-picker-btn__icon" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M3 2h7l3 3v9H3V2z" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/><path d="M10 2v3h3" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/><path d="M5 7h6M5 9.5h4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg> <svg class="doc-picker-btn__icon" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M3 2h7l3 3v9H3V2z" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/><path d="M10 2v3h3" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/><path d="M5 7h6M5 9.5h4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>
<span>Select from My Docs</span> <span><?= htmlspecialchars(dbnToolsT('doc_picker_btn', $uiLang)) ?></span>
</button> </button>
<div id="docPickerChips" class="doc-picker-chips" aria-label="Selected documents"></div> <div id="docPickerChips" class="doc-picker-chips" aria-label="Selected documents"></div>
<input type="hidden" id="docPickerIds" name="doc_ids" value=""> <input type="hidden" id="docPickerIds" name="doc_ids" value="">
+1 -1
View File
@@ -62,7 +62,7 @@ $laI18n = [
<div id="docPickerSection" class="doc-picker-section"> <div id="docPickerSection" class="doc-picker-section">
<button type="button" id="docPickerBtn" class="doc-picker-btn" aria-haspopup="dialog"> <button type="button" id="docPickerBtn" class="doc-picker-btn" aria-haspopup="dialog">
<svg class="doc-picker-btn__icon" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><rect x="2" y="1" width="9" height="12" rx="1.5" stroke="currentColor" stroke-width="1.4"/><path d="M5 5h5M5 8h3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/><rect x="7" y="9" width="6" height="5" rx="1" fill="white" stroke="currentColor" stroke-width="1.3"/><path d="M9 11h2M9 12.5h1" stroke="currentColor" stroke-width="1" stroke-linecap="round"/></svg> <svg class="doc-picker-btn__icon" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><rect x="2" y="1" width="9" height="12" rx="1.5" stroke="currentColor" stroke-width="1.4"/><path d="M5 5h5M5 8h3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/><rect x="7" y="9" width="6" height="5" rx="1" fill="white" stroke="currentColor" stroke-width="1.3"/><path d="M9 11h2M9 12.5h1" stroke="currentColor" stroke-width="1" stroke-linecap="round"/></svg>
<span>Select from My Docs</span> <span><?= htmlspecialchars($laT('doc_picker_btn')) ?></span>
</button> </button>
<div id="docPickerChips" class="doc-picker-chips" aria-label="Selected documents"></div> <div id="docPickerChips" class="doc-picker-chips" aria-label="Selected documents"></div>
<input type="hidden" id="docPickerIds" name="doc_ids" value=""> <input type="hidden" id="docPickerIds" name="doc_ids" value="">
+1 -1
View File
@@ -90,7 +90,7 @@ require_once __DIR__ . '/includes/layout.php';
<div id="docPickerSection" class="doc-picker-section"> <div id="docPickerSection" class="doc-picker-section">
<button type="button" id="docPickerBtn" class="doc-picker-btn" aria-haspopup="dialog"> <button type="button" id="docPickerBtn" class="doc-picker-btn" aria-haspopup="dialog">
<svg class="doc-picker-btn__icon" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><rect x="2" y="1" width="9" height="12" rx="1.5" stroke="currentColor" stroke-width="1.4"/><path d="M5 5h5M5 8h3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/><rect x="7" y="9" width="6" height="5" rx="1" fill="white" stroke="currentColor" stroke-width="1.3"/><path d="M9 11h2M9 12.5h1" stroke="currentColor" stroke-width="1" stroke-linecap="round"/></svg> <svg class="doc-picker-btn__icon" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><rect x="2" y="1" width="9" height="12" rx="1.5" stroke="currentColor" stroke-width="1.4"/><path d="M5 5h5M5 8h3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/><rect x="7" y="9" width="6" height="5" rx="1" fill="white" stroke="currentColor" stroke-width="1.3"/><path d="M9 11h2M9 12.5h1" stroke="currentColor" stroke-width="1" stroke-linecap="round"/></svg>
<span>Select from My Docs</span> <span><?= htmlspecialchars(dbnToolsT('doc_picker_btn', $uiLang)) ?></span>
</button> </button>
<div id="docPickerChips" class="doc-picker-chips" aria-label="Selected documents"></div> <div id="docPickerChips" class="doc-picker-chips" aria-label="Selected documents"></div>
<input type="hidden" id="docPickerIds" name="doc_ids" value=""> <input type="hidden" id="docPickerIds" name="doc_ids" value="">
+1 -1
View File
@@ -68,7 +68,7 @@ $ltI18n = [
<div id="docPickerSection" class="doc-picker-section"> <div id="docPickerSection" class="doc-picker-section">
<button type="button" id="docPickerBtn" class="doc-picker-btn" aria-haspopup="dialog"> <button type="button" id="docPickerBtn" class="doc-picker-btn" aria-haspopup="dialog">
<svg class="doc-picker-btn__icon" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><rect x="2" y="1" width="9" height="12" rx="1.5" stroke="currentColor" stroke-width="1.4"/><path d="M5 5h5M5 8h3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/><rect x="7" y="9" width="6" height="5" rx="1" fill="white" stroke="currentColor" stroke-width="1.3"/><path d="M9 11h2M9 12.5h1" stroke="currentColor" stroke-width="1" stroke-linecap="round"/></svg> <svg class="doc-picker-btn__icon" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><rect x="2" y="1" width="9" height="12" rx="1.5" stroke="currentColor" stroke-width="1.4"/><path d="M5 5h5M5 8h3" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/><rect x="7" y="9" width="6" height="5" rx="1" fill="white" stroke="currentColor" stroke-width="1.3"/><path d="M9 11h2M9 12.5h1" stroke="currentColor" stroke-width="1" stroke-linecap="round"/></svg>
<span>Select from My Docs</span> <span><?= htmlspecialchars($ltT('doc_picker_btn')) ?></span>
</button> </button>
<div id="docPickerChips" class="doc-picker-chips" aria-label="Selected documents"></div> <div id="docPickerChips" class="doc-picker-chips" aria-label="Selected documents"></div>
<input type="hidden" id="docPickerIds" name="doc_ids" value=""> <input type="hidden" id="docPickerIds" name="doc_ids" value="">