diff --git a/CHANGELOG.md b/CHANGELOG.md index 494f2eca..9b68f8f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ ## [Unreleased] +### Fixed + +- Third-party notes drawer copy now uses localized strings in the supported non-English locale bundles instead of reusing the English defaults. + ## [v0.51.132] — 2026-05-24 — Release DD (stage-batch14 — 4-PR replayed-context + interrupted-response + shutdown affordance + passkey opt-in) ### Added @@ -27,7 +31,6 @@ - CHANGELOG entries added for PR #2685 and PR #2824 (both originally missing despite functional code changes) - Deferred to follow-up: per-turn cumulative live-tool-prompt token cap (#2685 only added per-call cap; aggregate across many tool calls is a separate refactor). - **i18n parity**: 7 new shutdown-affordance keys added across all 11 non-en locales (it, ja, ru, es, de, zh, zh-Hant, pt, ko, fr, tr) so locale parity tests pass on first run. - ## [v0.51.131] — 2026-05-24 — Release DC (stage-batch13 — 6-PR notes-drawer + context-parity + PWA-swipe + locale polish) ### Added diff --git a/static/i18n.js b/static/i18n.js index 458cd7f7..4913139d 100644 --- a/static/i18n.js +++ b/static/i18n.js @@ -2379,17 +2379,17 @@ const LOCALES = { memory_saved: 'Memoria salvata', my_notes: 'Le Mie Note', user_profile: 'Profilo Utente', - external_notes_sources: 'Third-party notes', - external_notes_empty: 'No note or knowledge MCP sources are visible yet. Configure Joplin, Obsidian, Notion, llm-wiki, or another notes server to list it here.', - external_notes_auto_recall_hint: 'Automatic session recall is unchanged; this drawer only shows configured sources and available read/search tools.', - external_notes_no_tools: 'No read/search tools are currently visible for this source.', - external_notes_tool_count: (count) => `${count} note tool${Number(count)===1?'':'s'} available`, - external_notes_configured_hint: 'Tool names are expected from this configured source; live schemas will appear when the WebUI runtime exposes them.', - external_notes_recent_ai: 'Recently used by AI', + external_notes_sources: 'Note di terze parti', + external_notes_empty: 'Nessuna fonte MCP di note o conoscenza è ancora visibile. Configura Joplin, Obsidian, Notion, llm-wiki o un altro server di note per mostrarlo qui.', + external_notes_auto_recall_hint: 'Il richiamo automatico della sessione non cambia; questo pannello mostra solo fonti configurate e strumenti di lettura/ricerca disponibili.', + external_notes_no_tools: 'Nessuno strumento di lettura/ricerca è attualmente visibile per questa fonte.', + external_notes_tool_count: (count) => `${count} strument${Number(count)===1?'o':'i'} per note disponibile${Number(count)===1?'':'i'}`, + external_notes_configured_hint: 'I nomi degli strumenti sono attesi da questa fonte configurata; gli schemi live appariranno quando il runtime WebUI li esporrà.', + external_notes_recent_ai: 'Usate di recente dall’AI', external_notes_auto: 'auto', - external_notes_recent_ai_reason: 'Automatic recall', - external_notes_search_placeholder: 'Search notes…', - external_notes_search_empty: 'Search a configured notes source to preview notes here.', + external_notes_recent_ai_reason: 'Richiamo automatico', + external_notes_search_placeholder: 'Cerca note…', + external_notes_search_empty: 'Cerca in una fonte di note configurata per visualizzare anteprime qui.', source_active: 'active', source_configured: 'configured', no_notes_yet: 'Ancora nessuna nota.', @@ -3655,17 +3655,17 @@ const LOCALES = { memory_saved: 'メモリを保存しました', my_notes: 'マイノート', user_profile: 'ユーザープロファイル', - external_notes_sources: 'Third-party notes', - external_notes_empty: 'No note or knowledge MCP sources are visible yet. Configure Joplin, Obsidian, Notion, llm-wiki, or another notes server to list it here.', - external_notes_auto_recall_hint: 'Automatic session recall is unchanged; this drawer only shows configured sources and available read/search tools.', - external_notes_no_tools: 'No read/search tools are currently visible for this source.', - external_notes_tool_count: (count) => `${count} note tool${Number(count)===1?'':'s'} available`, - external_notes_configured_hint: 'Tool names are expected from this configured source; live schemas will appear when the WebUI runtime exposes them.', - external_notes_recent_ai: 'Recently used by AI', + external_notes_sources: 'サードパーティのノート', + external_notes_empty: 'ノートまたはナレッジ用の MCP ソースはまだ表示されていません。Joplin、Obsidian、Notion、llm-wiki、または別のノートサーバーを設定するとここに表示されます。', + external_notes_auto_recall_hint: '自動セッションリコールは変更されません。このドロワーには、設定済みソースと利用可能な読み取り/検索ツールだけが表示されます。', + external_notes_no_tools: 'このソースで利用できる読み取り/検索ツールは現在表示されていません。', + external_notes_tool_count: (count) => `${count} 個のノートツールが利用可能`, + external_notes_configured_hint: 'この設定済みソースからツール名が想定されています。WebUI ランタイムが公開するとライブスキーマが表示されます。', + external_notes_recent_ai: 'AI が最近使用', external_notes_auto: 'auto', - external_notes_recent_ai_reason: 'Automatic recall', - external_notes_search_placeholder: 'Search notes…', - external_notes_search_empty: 'Search a configured notes source to preview notes here.', + external_notes_recent_ai_reason: '自動リコール', + external_notes_search_placeholder: 'ノートを検索…', + external_notes_search_empty: '設定済みのノートソースを検索すると、ここにプレビューが表示されます。', source_active: 'active', source_configured: 'configured', no_notes_yet: 'まだノートはありません。', @@ -4664,17 +4664,17 @@ const LOCALES = { memory_saved: 'Память сохранена', my_notes: 'Мои заметки', user_profile: 'Пользовательский профиль', - external_notes_sources: 'Third-party notes', - external_notes_empty: 'No note or knowledge MCP sources are visible yet. Configure Joplin, Obsidian, Notion, llm-wiki, or another notes server to list it here.', - external_notes_auto_recall_hint: 'Automatic session recall is unchanged; this drawer only shows configured sources and available read/search tools.', - external_notes_no_tools: 'No read/search tools are currently visible for this source.', - external_notes_tool_count: (count) => `${count} note tool${Number(count)===1?'':'s'} available`, - external_notes_configured_hint: 'Tool names are expected from this configured source; live schemas will appear when the WebUI runtime exposes them.', - external_notes_recent_ai: 'Recently used by AI', + external_notes_sources: 'Сторонние заметки', + external_notes_empty: 'Источники заметок или знаний MCP пока не видны. Настройте Joplin, Obsidian, Notion, llm-wiki или другой сервер заметок, чтобы он появился здесь.', + external_notes_auto_recall_hint: 'Автоматический вызов контекста сеанса не меняется; эта панель показывает только настроенные источники и доступные инструменты чтения/поиска.', + external_notes_no_tools: 'Для этого источника сейчас не видно инструментов чтения/поиска.', + external_notes_tool_count: (count) => `Доступно инструментов заметок: ${count}`, + external_notes_configured_hint: 'От этого настроенного источника ожидаются имена инструментов; живые схемы появятся, когда WebUI runtime их предоставит.', + external_notes_recent_ai: 'Недавно использовано AI', external_notes_auto: 'auto', - external_notes_recent_ai_reason: 'Automatic recall', - external_notes_search_placeholder: 'Search notes…', - external_notes_search_empty: 'Search a configured notes source to preview notes here.', + external_notes_recent_ai_reason: 'Автоматический вызов', + external_notes_search_placeholder: 'Искать заметки…', + external_notes_search_empty: 'Выполните поиск по настроенному источнику заметок, чтобы увидеть предпросмотр здесь.', source_active: 'active', source_configured: 'configured', no_notes_yet: 'Пока нет заметок.', @@ -5892,17 +5892,17 @@ const LOCALES = { memory_saved: 'Memory saved', my_notes: 'My Notes', user_profile: 'User Profile', - external_notes_sources: 'Third-party notes', - external_notes_empty: 'No note or knowledge MCP sources are visible yet. Configure Joplin, Obsidian, Notion, llm-wiki, or another notes server to list it here.', - external_notes_auto_recall_hint: 'Automatic session recall is unchanged; this drawer only shows configured sources and available read/search tools.', - external_notes_no_tools: 'No read/search tools are currently visible for this source.', - external_notes_tool_count: (count) => `${count} note tool${Number(count)===1?'':'s'} available`, - external_notes_configured_hint: 'Tool names are expected from this configured source; live schemas will appear when the WebUI runtime exposes them.', - external_notes_recent_ai: 'Recently used by AI', + external_notes_sources: 'Notas de terceros', + external_notes_empty: 'Aún no hay fuentes MCP de notas o conocimiento visibles. Configura Joplin, Obsidian, Notion, llm-wiki u otro servidor de notas para mostrarlo aquí.', + external_notes_auto_recall_hint: 'El recuerdo automático de la sesión no cambia; este panel solo muestra fuentes configuradas y herramientas de lectura/búsqueda disponibles.', + external_notes_no_tools: 'No hay herramientas de lectura/búsqueda visibles actualmente para esta fuente.', + external_notes_tool_count: (count) => `${count} herramienta${Number(count)===1?'':'s'} de notas disponible${Number(count)===1?'':'s'}`, + external_notes_configured_hint: 'Se esperan nombres de herramientas de esta fuente configurada; los esquemas en vivo aparecerán cuando el runtime de WebUI los exponga.', + external_notes_recent_ai: 'Usado recientemente por la IA', external_notes_auto: 'auto', - external_notes_recent_ai_reason: 'Automatic recall', - external_notes_search_placeholder: 'Search notes…', - external_notes_search_empty: 'Search a configured notes source to preview notes here.', + external_notes_recent_ai_reason: 'Recuerdo automático', + external_notes_search_placeholder: 'Buscar notas…', + external_notes_search_empty: 'Busca en una fuente de notas configurada para previsualizar notas aquí.', source_active: 'active', source_configured: 'configured', no_notes_yet: 'No notes yet.', @@ -7292,17 +7292,17 @@ const LOCALES = { memory_saved: 'Notiz gespeichert.', my_notes: 'Meine Notizen', user_profile: 'Benutzerprofil', - external_notes_sources: 'Third-party notes', - external_notes_empty: 'No note or knowledge MCP sources are visible yet. Configure Joplin, Obsidian, Notion, llm-wiki, or another notes server to list it here.', - external_notes_auto_recall_hint: 'Automatic session recall is unchanged; this drawer only shows configured sources and available read/search tools.', - external_notes_no_tools: 'No read/search tools are currently visible for this source.', - external_notes_tool_count: (count) => `${count} note tool${Number(count)===1?'':'s'} available`, - external_notes_configured_hint: 'Tool names are expected from this configured source; live schemas will appear when the WebUI runtime exposes them.', - external_notes_recent_ai: 'Recently used by AI', + external_notes_sources: 'Notizen von Drittanbietern', + external_notes_empty: 'Noch sind keine MCP-Quellen für Notizen oder Wissen sichtbar. Konfiguriere Joplin, Obsidian, Notion, llm-wiki oder einen anderen Notizen-Server, um ihn hier anzuzeigen.', + external_notes_auto_recall_hint: 'Der automatische Sitzungsabruf bleibt unverändert; diese Leiste zeigt nur konfigurierte Quellen und verfügbare Lese-/Suchwerkzeuge.', + external_notes_no_tools: 'Für diese Quelle sind derzeit keine Lese-/Suchwerkzeuge sichtbar.', + external_notes_tool_count: (count) => `${count} Notizwerkzeug${Number(count)===1?'':'e'} verfügbar`, + external_notes_configured_hint: 'Werkzeugnamen werden von dieser konfigurierten Quelle erwartet; Live-Schemas erscheinen, wenn die WebUI-Laufzeit sie bereitstellt.', + external_notes_recent_ai: 'Zuletzt von der KI verwendet', external_notes_auto: 'auto', - external_notes_recent_ai_reason: 'Automatic recall', - external_notes_search_placeholder: 'Search notes…', - external_notes_search_empty: 'Search a configured notes source to preview notes here.', + external_notes_recent_ai_reason: 'Automatischer Abruf', + external_notes_search_placeholder: 'Notizen suchen…', + external_notes_search_empty: 'Durchsuche eine konfigurierte Notizenquelle, um hier eine Vorschau zu sehen.', source_active: 'active', source_configured: 'configured', no_notes_yet: 'Noch keine Notizen.', @@ -8306,17 +8306,17 @@ const LOCALES = { memory_saved: '记忆已保存', my_notes: '我的备注', user_profile: '用户画像', - external_notes_sources: 'Third-party notes', - external_notes_empty: 'No note or knowledge MCP sources are visible yet. Configure Joplin, Obsidian, Notion, llm-wiki, or another notes server to list it here.', - external_notes_auto_recall_hint: 'Automatic session recall is unchanged; this drawer only shows configured sources and available read/search tools.', - external_notes_no_tools: 'No read/search tools are currently visible for this source.', - external_notes_tool_count: (count) => `${count} note tool${Number(count)===1?'':'s'} available`, - external_notes_configured_hint: 'Tool names are expected from this configured source; live schemas will appear when the WebUI runtime exposes them.', - external_notes_recent_ai: 'Recently used by AI', + external_notes_sources: '第三方笔记', + external_notes_empty: '还没有可见的笔记或知识 MCP 来源。配置 Joplin、Obsidian、Notion、llm-wiki 或其他笔记服务器后会显示在这里。', + external_notes_auto_recall_hint: '自动会话召回保持不变;这个抽屉只显示已配置的来源和可用的读取/搜索工具。', + external_notes_no_tools: '此来源当前没有可见的读取/搜索工具。', + external_notes_tool_count: (count) => `${count} 个笔记工具可用`, + external_notes_configured_hint: '此已配置来源应提供工具名称;当 WebUI 运行时暴露实时 schema 后会显示在这里。', + external_notes_recent_ai: 'AI 最近使用', external_notes_auto: 'auto', - external_notes_recent_ai_reason: 'Automatic recall', - external_notes_search_placeholder: 'Search notes…', - external_notes_search_empty: 'Search a configured notes source to preview notes here.', + external_notes_recent_ai_reason: '自动召回', + external_notes_search_placeholder: '搜索笔记…', + external_notes_search_empty: '搜索已配置的笔记来源后,可在这里预览笔记。', source_active: 'active', source_configured: 'configured', no_notes_yet: '暂无备注。', @@ -9525,6 +9525,17 @@ const LOCALES = { no_profile_yet: '\u5c1a\u7121\u8a2d\u5b9a\u6a94\u3002', agent_soul: '智能體靈魂', no_soul_yet: '尚無靈魂定義。', + external_notes_sources: '第三方筆記', + external_notes_empty: '尚未看到任何筆記或知識 MCP 來源。設定 Joplin、Obsidian、Notion、llm-wiki 或其他筆記伺服器後,會顯示在這裡。', + external_notes_auto_recall_hint: '自動會話召回維持不變;這個抽屜只顯示已設定的來源,以及可用的讀取/搜尋工具。', + external_notes_no_tools: '此來源目前沒有可見的讀取/搜尋工具。', + external_notes_tool_count: (count) => `${count} 個筆記工具可用`, + external_notes_configured_hint: '此已設定來源應提供工具名稱;當 WebUI 執行階段提供即時 schema 時會顯示在這裡。', + external_notes_recent_ai: 'AI 最近使用', + external_notes_auto: 'auto', + external_notes_recent_ai_reason: '自動召回', + external_notes_search_placeholder: '搜尋筆記…', + external_notes_search_empty: '搜尋已設定的筆記來源後,可在這裡預覽筆記。', not_available: '\u7121', profile_active: '\u555f\u7528\u4e2d', profile_api_key_placeholder: 'API \u91d1\u9470\uff08\u9078\u586b\uff09', @@ -10874,17 +10885,17 @@ const LOCALES = { memory_saved: 'Memória salva', my_notes: 'Minhas Notas', user_profile: 'Perfil do Usuário', - external_notes_sources: 'Third-party notes', - external_notes_empty: 'No note or knowledge MCP sources are visible yet. Configure Joplin, Obsidian, Notion, llm-wiki, or another notes server to list it here.', - external_notes_auto_recall_hint: 'Automatic session recall is unchanged; this drawer only shows configured sources and available read/search tools.', - external_notes_no_tools: 'No read/search tools are currently visible for this source.', - external_notes_tool_count: (count) => `${count} note tool${Number(count)===1?'':'s'} available`, - external_notes_configured_hint: 'Tool names are expected from this configured source; live schemas will appear when the WebUI runtime exposes them.', - external_notes_recent_ai: 'Recently used by AI', + external_notes_sources: 'Notas de terceiros', + external_notes_empty: 'Nenhuma fonte MCP de notas ou conhecimento está visível ainda. Configure Joplin, Obsidian, Notion, llm-wiki ou outro servidor de notas para listá-lo aqui.', + external_notes_auto_recall_hint: 'A recuperação automática da sessão não muda; esta gaveta mostra apenas fontes configuradas e ferramentas de leitura/pesquisa disponíveis.', + external_notes_no_tools: 'Nenhuma ferramenta de leitura/pesquisa está visível para esta fonte no momento.', + external_notes_tool_count: (count) => `${count} ferramenta${Number(count)===1?'':'s'} de notas ${Number(count)===1?'disponível':'disponíveis'}`, + external_notes_configured_hint: 'Nomes de ferramentas são esperados desta fonte configurada; esquemas ao vivo aparecerão quando o runtime do WebUI os expuser.', + external_notes_recent_ai: 'Usado recentemente pela IA', external_notes_auto: 'auto', - external_notes_recent_ai_reason: 'Automatic recall', - external_notes_search_placeholder: 'Search notes…', - external_notes_search_empty: 'Search a configured notes source to preview notes here.', + external_notes_recent_ai_reason: 'Recuperação automática', + external_notes_search_placeholder: 'Pesquisar notas…', + external_notes_search_empty: 'Pesquise em uma fonte de notas configurada para pré-visualizar notas aqui.', source_active: 'active', source_configured: 'configured', no_notes_yet: 'Nenhuma nota ainda.', @@ -12054,17 +12065,17 @@ const LOCALES = { memory_saved: 'Memory saved', my_notes: 'My Notes', user_profile: 'User Profile', - external_notes_sources: 'Third-party notes', - external_notes_empty: 'No note or knowledge MCP sources are visible yet. Configure Joplin, Obsidian, Notion, llm-wiki, or another notes server to list it here.', - external_notes_auto_recall_hint: 'Automatic session recall is unchanged; this drawer only shows configured sources and available read/search tools.', - external_notes_no_tools: 'No read/search tools are currently visible for this source.', - external_notes_tool_count: (count) => `${count} note tool${Number(count)===1?'':'s'} available`, - external_notes_configured_hint: 'Tool names are expected from this configured source; live schemas will appear when the WebUI runtime exposes them.', - external_notes_recent_ai: 'Recently used by AI', + external_notes_sources: '타사 노트', + external_notes_empty: '아직 표시되는 노트 또는 지식 MCP 소스가 없습니다. Joplin, Obsidian, Notion, llm-wiki 또는 다른 노트 서버를 설정하면 여기에 표시됩니다.', + external_notes_auto_recall_hint: '자동 세션 리콜은 변경되지 않습니다. 이 드로어는 설정된 소스와 사용 가능한 읽기/검색 도구만 보여줍니다.', + external_notes_no_tools: '이 소스에 대해 현재 표시되는 읽기/검색 도구가 없습니다.', + external_notes_tool_count: (count) => `${count}개의 노트 도구 사용 가능`, + external_notes_configured_hint: '이 설정된 소스에서 도구 이름이 제공될 것으로 예상됩니다. WebUI 런타임이 노출하면 실시간 스키마가 표시됩니다.', + external_notes_recent_ai: 'AI가 최근 사용', external_notes_auto: 'auto', - external_notes_recent_ai_reason: 'Automatic recall', - external_notes_search_placeholder: 'Search notes…', - external_notes_search_empty: 'Search a configured notes source to preview notes here.', + external_notes_recent_ai_reason: '자동 리콜', + external_notes_search_placeholder: '노트 검색…', + external_notes_search_empty: '설정된 노트 소스를 검색하면 여기에 노트 미리보기가 표시됩니다.', source_active: 'active', source_configured: 'configured', no_notes_yet: 'No notes yet.', @@ -13245,17 +13256,17 @@ const LOCALES = { memory_saved: 'Mémoire sauvegardée', my_notes: 'Mes notes', user_profile: 'Profil utilisateur', - external_notes_sources: 'Third-party notes', - external_notes_empty: 'No note or knowledge MCP sources are visible yet. Configure Joplin, Obsidian, Notion, llm-wiki, or another notes server to list it here.', - external_notes_auto_recall_hint: 'Automatic session recall is unchanged; this drawer only shows configured sources and available read/search tools.', - external_notes_no_tools: 'No read/search tools are currently visible for this source.', - external_notes_tool_count: (count) => `${count} note tool${Number(count)===1?'':'s'} available`, - external_notes_configured_hint: 'Tool names are expected from this configured source; live schemas will appear when the WebUI runtime exposes them.', - external_notes_recent_ai: 'Recently used by AI', + external_notes_sources: 'Notes tierces', + external_notes_empty: 'Aucune source MCP de notes ou de connaissances n’est encore visible. Configurez Joplin, Obsidian, Notion, llm-wiki ou un autre serveur de notes pour l’afficher ici.', + external_notes_auto_recall_hint: 'Le rappel automatique de session reste inchangé ; ce tiroir affiche seulement les sources configurées et les outils de lecture/recherche disponibles.', + external_notes_no_tools: 'Aucun outil de lecture/recherche n’est actuellement visible pour cette source.', + external_notes_tool_count: (count) => `${count} outil${Number(count)===1?'':'s'} de notes disponible${Number(count)===1?'':'s'}`, + external_notes_configured_hint: 'Des noms d’outils sont attendus depuis cette source configurée ; les schémas live apparaîtront quand le runtime WebUI les exposera.', + external_notes_recent_ai: 'Utilisé récemment par l’IA', external_notes_auto: 'auto', - external_notes_recent_ai_reason: 'Automatic recall', - external_notes_search_placeholder: 'Search notes…', - external_notes_search_empty: 'Search a configured notes source to preview notes here.', + external_notes_recent_ai_reason: 'Rappel automatique', + external_notes_search_placeholder: 'Rechercher des notes…', + external_notes_search_empty: 'Recherchez dans une source de notes configurée pour prévisualiser les notes ici.', source_active: 'active', source_configured: 'configured', no_notes_yet: 'Aucune note pour l\'instant.', @@ -14529,17 +14540,17 @@ const LOCALES = { memory_saved: 'Bellek kaydedildi', my_notes: 'Notlarım', user_profile: 'Kullanıcı Profili', - external_notes_sources: 'Third-party notes', - external_notes_empty: 'No note or knowledge MCP sources are visible yet. Configure Joplin, Obsidian, Notion, llm-wiki, or another notes server to list it here.', - external_notes_auto_recall_hint: 'Automatic session recall is unchanged; this drawer only shows configured sources and available read/search tools.', - external_notes_no_tools: 'No read/search tools are currently visible for this source.', - external_notes_tool_count: (count) => `${count} note tool${Number(count)===1?'':'s'} available`, - external_notes_configured_hint: 'Tool names are expected from this configured source; live schemas will appear when the WebUI runtime exposes them.', - external_notes_recent_ai: 'Recently used by AI', + external_notes_sources: 'Üçüncü taraf notlar', + external_notes_empty: 'Henüz görünür not veya bilgi MCP kaynağı yok. Burada listelemek için Joplin, Obsidian, Notion, llm-wiki veya başka bir not sunucusu yapılandırın.', + external_notes_auto_recall_hint: 'Otomatik oturum hatırlama değişmedi; bu çekmece yalnızca yapılandırılmış kaynakları ve kullanılabilir okuma/arama araçlarını gösterir.', + external_notes_no_tools: 'Bu kaynak için şu anda görünür okuma/arama aracı yok.', + external_notes_tool_count: (count) => `${count} not aracı kullanılabilir`, + external_notes_configured_hint: 'Bu yapılandırılmış kaynaktan araç adları beklenir; WebUI runtime bunları sunduğunda canlı şemalar görünecek.', + external_notes_recent_ai: 'AI tarafından yakın zamanda kullanıldı', external_notes_auto: 'auto', - external_notes_recent_ai_reason: 'Automatic recall', - external_notes_search_placeholder: 'Search notes…', - external_notes_search_empty: 'Search a configured notes source to preview notes here.', + external_notes_recent_ai_reason: 'Otomatik hatırlama', + external_notes_search_placeholder: 'Notlarda ara…', + external_notes_search_empty: 'Notları burada önizlemek için yapılandırılmış bir not kaynağında arama yapın.', source_active: 'active', source_configured: 'configured', no_notes_yet: 'Henüz not yok.', diff --git a/tests/test_webui_notes_sources.py b/tests/test_webui_notes_sources.py index bcf8c8fe..fec79ba1 100644 --- a/tests/test_webui_notes_sources.py +++ b/tests/test_webui_notes_sources.py @@ -190,6 +190,40 @@ def test_external_notes_menu_item_is_default_off_from_memory_payload(): assert "if (s.key === 'external_notes' && !_memoryData.external_notes_enabled) continue;" in panels +def test_external_notes_drawer_copy_is_localized_outside_english(): + from pathlib import Path + + i18n = Path("static/i18n.js").read_text(encoding="utf-8") + + assert i18n.count("external_notes_sources: 'Third-party notes'") == 1 + assert i18n.count("external_notes_recent_ai: 'Recently used by AI'") == 1 + assert i18n.count("external_notes_recent_ai_reason: 'Automatic recall'") == 1 + assert i18n.count("external_notes_search_placeholder: 'Search notes…'") == 1 + + locale_sources = [ + (" en: {", " it: {", "external_notes_sources: 'Third-party notes'"), + (" it: {", " ja: {", "external_notes_sources: 'Note di terze parti'"), + (" ja: {", " ru: {", "external_notes_sources: 'サードパーティのノート'"), + (" ru: {", " es: {", "external_notes_sources: 'Сторонние заметки'"), + (" es: {", " de: {", "external_notes_sources: 'Notas de terceros'"), + (" de: {", " zh: {", "external_notes_sources: 'Notizen von Drittanbietern'"), + (" zh: {", " 'zh-Hant': {", "external_notes_sources: '第三方笔记'"), + (" 'zh-Hant': {", " pt: {", "external_notes_sources: '第三方筆記'"), + (" pt: {", " ko: {", "external_notes_sources: 'Notas de terceiros'"), + (" ko: {", " fr: {", "external_notes_sources: '타사 노트'"), + (" fr: {", " tr: {", "external_notes_sources: 'Notes tierces'"), + ] + for start_marker, end_marker, expected in locale_sources: + start = i18n.index(start_marker) + end = i18n.index(end_marker, start) + assert expected in i18n[start:end] + + tr_start = i18n.index(" tr: {") + tr_block = i18n[tr_start:] + assert "external_notes_sources: 'Üçüncü taraf notlar'" in tr_block + assert "external_notes_sources: 'Third-party notes'" not in tr_block + + def test_external_notes_search_button_matches_minimal_dark_controls(): from pathlib import Path