diff --git a/src/chrome/src/ui/locales/ar.js b/src/chrome/src/ui/locales/ar.js index ed4a2abbd..1461ff5c7 100644 --- a/src/chrome/src/ui/locales/ar.js +++ b/src/chrome/src/ui/locales/ar.js @@ -591,6 +591,7 @@ export default { 'sp.scratchpad.cleared': 'تم مسح المسودة.', 'sp.scratchpad.error': 'منطقة المسودة غير متاحة: {msg}', 'sp.perm.verb.schedule': 'جدولة عمل مستقبلي لـ', + 'sp.perm.verb.window': 'تغيير حجم نافذة المتصفح على', 'tool.schedule_resume': 'جدولة استئناف', 'tool.schedule_task': 'جدولة مهمة', 'st.display.scheduled_tasks.label': 'المهام المجدوَلة', diff --git a/src/chrome/src/ui/locales/bn.js b/src/chrome/src/ui/locales/bn.js index 756c15ed5..0b1c99be6 100644 --- a/src/chrome/src/ui/locales/bn.js +++ b/src/chrome/src/ui/locales/bn.js @@ -331,6 +331,7 @@ export default { 'sp.perm.verb.upload': "একটি ফাইল আপলোড করুন", 'sp.perm.verb.record': "ট্যাব (এবং মাইক্রোফোন) চালু করুন", 'sp.perm.verb.schedule': "ভবিষ্যত কাজের সময়সূচী", + 'sp.perm.verb.window': 'ব্রাউজার উইন্ডোর আকার পরিবর্তন করুন', 'sp.step.details': "বিস্তারিত", 'sp.step.input_label': "ইনপুট", diff --git a/src/chrome/src/ui/locales/de.js b/src/chrome/src/ui/locales/de.js index a7fa93cb4..6452d9e44 100644 --- a/src/chrome/src/ui/locales/de.js +++ b/src/chrome/src/ui/locales/de.js @@ -341,6 +341,7 @@ export default { 'sp.perm.verb.upload': 'Datei hochladen zu', 'sp.perm.verb.record': 'Tab (und Mikrofon) aufnehmen auf', 'sp.perm.verb.schedule': 'zukünftige Aufgaben planen für', + 'sp.perm.verb.window': 'die Größe des Browserfensters ändern auf', 'sp.help.shortcuts_html': 'Tastenkürzel
Ctrl/Cmd+/ — Eingabefeld fokussieren
Ctrl/Cmd+Shift+A — Zum Fragen-Modus wechseln
Ctrl/Cmd+Shift+X — Zum Handeln-Modus wechseln
Ctrl/Cmd+Shift+D — Zum Dev-Modus wechseln
Escape — Aktiven Durchlauf stoppen
Escape zweimal — Aktive Aufnahme stoppen', 'sp.compact.nothing_to_compact': 'Noch nichts zu kompaktieren — es gibt nicht genügend älteren Kontext.', 'sp.compact.busy': 'Kompaktierung nicht möglich, während ein Durchlauf läuft — warten Sie auf dessen Abschluss.', diff --git a/src/chrome/src/ui/locales/en.js b/src/chrome/src/ui/locales/en.js index 85a1553a9..04c22c26b 100644 --- a/src/chrome/src/ui/locales/en.js +++ b/src/chrome/src/ui/locales/en.js @@ -331,6 +331,7 @@ export default { 'sp.perm.verb.upload': 'upload a file to', 'sp.perm.verb.record': 'record the tab (and microphone) on', 'sp.perm.verb.schedule': 'schedule future work for', + 'sp.perm.verb.window': 'resize the browser window for', 'sp.step.details': 'details', 'sp.step.input_label': 'Input', diff --git a/src/chrome/src/ui/locales/es.js b/src/chrome/src/ui/locales/es.js index 48fcc3289..0859d9e73 100644 --- a/src/chrome/src/ui/locales/es.js +++ b/src/chrome/src/ui/locales/es.js @@ -591,6 +591,7 @@ export default { 'sp.scratchpad.cleared': 'Bloc de notas borrado.', 'sp.scratchpad.error': 'Bloc de notas no disponible: {msg}', 'sp.perm.verb.schedule': 'programar trabajo futuro en', + 'sp.perm.verb.window': 'cambiar el tamaño de la ventana del navegador en', 'tool.schedule_resume': 'Programando reanudación', 'tool.schedule_task': 'Programando tarea', 'st.display.scheduled_tasks.label': 'Tareas programadas', diff --git a/src/chrome/src/ui/locales/fa.js b/src/chrome/src/ui/locales/fa.js index b6d92a81c..eb9599fe8 100644 --- a/src/chrome/src/ui/locales/fa.js +++ b/src/chrome/src/ui/locales/fa.js @@ -331,6 +331,7 @@ export default { 'sp.perm.verb.upload': "آپلود فایل به", 'sp.perm.verb.record': "زبانه (و میکروفون) را روی آن ضبط کنید", 'sp.perm.verb.schedule': "برای کارهای آینده برنامه ریزی کنید", + 'sp.perm.verb.window': 'اندازه پنجره مرورگر را تغییر دهید در', 'sp.step.details': "جزئیات", 'sp.step.input_label': "ورودی", diff --git a/src/chrome/src/ui/locales/fr.js b/src/chrome/src/ui/locales/fr.js index 66c53e25f..47a3d0511 100644 --- a/src/chrome/src/ui/locales/fr.js +++ b/src/chrome/src/ui/locales/fr.js @@ -591,6 +591,7 @@ export default { 'sp.scratchpad.cleared': 'Bloc-notes effacé.', 'sp.scratchpad.error': 'Bloc-notes indisponible : {msg}', 'sp.perm.verb.schedule': 'planifier des tâches futures pour', + 'sp.perm.verb.window': 'redimensionner la fenêtre du navigateur sur', 'tool.schedule_resume': 'Planification de la reprise', 'tool.schedule_task': 'Planification de la tâche', 'st.display.scheduled_tasks.label': 'Tâches planifiées', diff --git a/src/chrome/src/ui/locales/he.js b/src/chrome/src/ui/locales/he.js index 1a0b38b1d..f7a83544f 100644 --- a/src/chrome/src/ui/locales/he.js +++ b/src/chrome/src/ui/locales/he.js @@ -305,6 +305,7 @@ export default { "sp.perm.verb.download": "להוריד קבצים מ", "sp.perm.verb.upload": "להעלות קובץ ל", "sp.perm.verb.schedule": "לתזמן עבודה עתידית עבור", + "sp.perm.verb.window": "לשנות את גודל חלון הדפדפן באתר", "sp.step.details": "פרטים", "sp.step.input_label": "קלט", "sp.step.result_label": "תוצאה", diff --git a/src/chrome/src/ui/locales/hi.js b/src/chrome/src/ui/locales/hi.js index 730ea4de2..d166eace0 100644 --- a/src/chrome/src/ui/locales/hi.js +++ b/src/chrome/src/ui/locales/hi.js @@ -331,6 +331,7 @@ export default { 'sp.perm.verb.upload': "पर एक फ़ाइल अपलोड करें", 'sp.perm.verb.record': "टैब (और माइक्रोफ़ोन) को चालू रखें", 'sp.perm.verb.schedule': "भविष्य के लिए कार्य शेड्यूल करें", + 'sp.perm.verb.window': 'ब्राउज़र विंडो का आकार बदलें', 'sp.step.details': "विवरण", 'sp.step.input_label': "इनपुट", diff --git a/src/chrome/src/ui/locales/id.js b/src/chrome/src/ui/locales/id.js index 1d853338b..ebadd7eaf 100644 --- a/src/chrome/src/ui/locales/id.js +++ b/src/chrome/src/ui/locales/id.js @@ -591,6 +591,7 @@ export default { 'sp.scratchpad.cleared': 'Bak pasir dikosongkan.', 'sp.scratchpad.error': 'Bak pasir tidak tersedia: {msg}', 'sp.perm.verb.schedule': 'menjadwalkan pekerjaan mendatang untuk', + 'sp.perm.verb.window': 'mengubah ukuran jendela browser di', 'tool.schedule_resume': 'Menjadwalkan lanjutan', 'tool.schedule_task': 'Menjadwalkan tugas', 'st.display.scheduled_tasks.label': 'Tugas terjadwal', diff --git a/src/chrome/src/ui/locales/ja.js b/src/chrome/src/ui/locales/ja.js index eca7acae0..497baa781 100644 --- a/src/chrome/src/ui/locales/ja.js +++ b/src/chrome/src/ui/locales/ja.js @@ -591,6 +591,7 @@ export default { 'sp.scratchpad.cleared': 'スクラッチパッドをクリアしました。', 'sp.scratchpad.error': 'スクラッチパッドを取得できませんでした: {msg}', 'sp.perm.verb.schedule': 'での将来の作業のスケジュールを', + 'sp.perm.verb.window': 'でのブラウザウィンドウのサイズ変更を', 'tool.schedule_resume': '再開をスケジュール中', 'tool.schedule_task': 'タスクをスケジュール中', 'st.display.scheduled_tasks.label': 'スケジュールタスク', diff --git a/src/chrome/src/ui/locales/ko.js b/src/chrome/src/ui/locales/ko.js index a51523c4c..2acca1cb2 100644 --- a/src/chrome/src/ui/locales/ko.js +++ b/src/chrome/src/ui/locales/ko.js @@ -591,6 +591,7 @@ export default { 'sp.scratchpad.cleared': '스크래치패드가 지워졌습니다.', 'sp.scratchpad.error': '스크래치패드를 사용할 수 없습니다: {msg}', 'sp.perm.verb.schedule': '미래 작업 예약', + 'sp.perm.verb.window': '브라우저 창 크기 조절', 'tool.schedule_resume': '재개 예약 중', 'tool.schedule_task': '작업 예약 중', 'st.display.scheduled_tasks.label': '예약된 작업', diff --git a/src/chrome/src/ui/locales/ms.js b/src/chrome/src/ui/locales/ms.js index 1dcab821a..a58f0d9c4 100644 --- a/src/chrome/src/ui/locales/ms.js +++ b/src/chrome/src/ui/locales/ms.js @@ -591,6 +591,7 @@ export default { 'sp.scratchpad.cleared': 'Pad nota dikosongkan.', 'sp.scratchpad.error': 'Pad nota tidak tersedia: {msg}', 'sp.perm.verb.schedule': 'menjadualkan kerja masa hadapan untuk', + 'sp.perm.verb.window': 'menukar saiz tetingkap pelayar pada', 'tool.schedule_resume': 'Menjadualkan sambungan semula', 'tool.schedule_task': 'Menjadualkan tugas', 'st.display.scheduled_tasks.label': 'Tugas berjadual', diff --git a/src/chrome/src/ui/locales/nl.js b/src/chrome/src/ui/locales/nl.js index 8ad60766f..a9c770945 100644 --- a/src/chrome/src/ui/locales/nl.js +++ b/src/chrome/src/ui/locales/nl.js @@ -319,6 +319,7 @@ export default { 'sp.perm.verb.upload': 'een bestand uploaden naar', 'sp.perm.verb.record': 'het tabblad (en microfoon) opnemen op', 'sp.perm.verb.schedule': 'geplande taken instellen voor', + 'sp.perm.verb.window': 'het browservenster aanpassen op', 'sp.step.details': 'details', 'sp.step.input_label': 'Invoer', 'sp.step.result_label': 'Resultaat', diff --git a/src/chrome/src/ui/locales/pl.js b/src/chrome/src/ui/locales/pl.js index 5e2cd1751..d46651625 100644 --- a/src/chrome/src/ui/locales/pl.js +++ b/src/chrome/src/ui/locales/pl.js @@ -239,6 +239,7 @@ export default { 'sp.perm.verb.upload': 'przesłać plik do', 'sp.perm.verb.record': 'nagrać kartę (i mikrofon) na', 'sp.perm.verb.schedule': 'zaplanować przyszłe działania dla', + 'sp.perm.verb.window': 'zmienić rozmiar okna przeglądarki na', 'sp.step.details': 'szczegóły', 'sp.step.input_label': 'Wejście', 'sp.step.result_label': 'Wynik', diff --git a/src/chrome/src/ui/locales/pt.js b/src/chrome/src/ui/locales/pt.js index 75b1868d9..65b3b884f 100644 --- a/src/chrome/src/ui/locales/pt.js +++ b/src/chrome/src/ui/locales/pt.js @@ -331,6 +331,7 @@ export default { 'sp.perm.verb.upload': "carregar um arquivo para", 'sp.perm.verb.record': "grave a guia (e o microfone) em", 'sp.perm.verb.schedule': "agendar trabalhos futuros para", + 'sp.perm.verb.window': 'redimensionar a janela do navegador em', 'sp.step.details': "detalhes", 'sp.step.input_label': "Entrada", diff --git a/src/chrome/src/ui/locales/ru.js b/src/chrome/src/ui/locales/ru.js index 4643f3e1f..c3d48ec6f 100644 --- a/src/chrome/src/ui/locales/ru.js +++ b/src/chrome/src/ui/locales/ru.js @@ -591,6 +591,7 @@ export default { 'sp.scratchpad.cleared': 'Блокнот очищен.', 'sp.scratchpad.error': 'Блокнот недоступен: {msg}', 'sp.perm.verb.schedule': 'запланировать будущие действия для', + 'sp.perm.verb.window': 'изменить размер окна браузера на', 'tool.schedule_resume': 'Планирование возобновления', 'tool.schedule_task': 'Планирование задачи', 'st.display.scheduled_tasks.label': 'Запланированные задачи', diff --git a/src/chrome/src/ui/locales/th.js b/src/chrome/src/ui/locales/th.js index 1cd152066..d1f3590e1 100644 --- a/src/chrome/src/ui/locales/th.js +++ b/src/chrome/src/ui/locales/th.js @@ -591,6 +591,7 @@ export default { 'sp.scratchpad.cleared': 'ล้างกระดานร่างแล้ว', 'sp.scratchpad.error': 'ไม่สามารถใช้กระดานร่างได้: {msg}', 'sp.perm.verb.schedule': 'ตั้งเวลางานในอนาคตสำหรับ', + 'sp.perm.verb.window': 'ปรับขนาดหน้าต่างเบราว์เซอร์บน', 'tool.schedule_resume': 'กำลังตั้งเวลาต่องาน', 'tool.schedule_task': 'กำลังตั้งเวลางาน', 'st.display.scheduled_tasks.label': 'งานที่ตั้งเวลาไว้', diff --git a/src/chrome/src/ui/locales/tl.js b/src/chrome/src/ui/locales/tl.js index 328e1990b..5e7bc5c1e 100644 --- a/src/chrome/src/ui/locales/tl.js +++ b/src/chrome/src/ui/locales/tl.js @@ -591,6 +591,7 @@ export default { 'sp.scratchpad.cleared': 'Na-clear ang scratchpad.', 'sp.scratchpad.error': 'Hindi available ang scratchpad: {msg}', 'sp.perm.verb.schedule': 'mag-iskedyul ng gawaing hinaharap para sa', + 'sp.perm.verb.window': 'baguhin ang laki ng window ng browser sa', 'tool.schedule_resume': 'Nag-iiskedyul ng pagpapatuloy', 'tool.schedule_task': 'Nag-iiskedyul ng gawain', 'st.display.scheduled_tasks.label': 'Mga naka-iskedyul na gawain', diff --git a/src/chrome/src/ui/locales/tr.js b/src/chrome/src/ui/locales/tr.js index 37516dfb6..768f1bbe3 100644 --- a/src/chrome/src/ui/locales/tr.js +++ b/src/chrome/src/ui/locales/tr.js @@ -630,6 +630,7 @@ export default { 'sp.scratchpad.cleared': 'Not defteri temizlendi.', 'sp.scratchpad.error': 'Not defterine erişilemiyor: {msg}', 'sp.perm.verb.schedule': 'gelecekteki çalışmayı zamanlamak için', + 'sp.perm.verb.window': 'tarayıcı penceresinin boyutunu değiştirmek', 'tool.schedule_resume': 'Devam zamanlama', 'tool.schedule_task': 'Görev zamanlama', 'st.display.scheduled_tasks.label': 'Zamanlanmış görevler', diff --git a/src/chrome/src/ui/locales/uk.js b/src/chrome/src/ui/locales/uk.js index 0f37dbc03..09625e10b 100644 --- a/src/chrome/src/ui/locales/uk.js +++ b/src/chrome/src/ui/locales/uk.js @@ -591,6 +591,7 @@ export default { 'sp.scratchpad.cleared': 'Чернетник очищено.', 'sp.scratchpad.error': 'Чернетник недоступний: {msg}', 'sp.perm.verb.schedule': 'запланувати майбутню роботу для', + 'sp.perm.verb.window': 'змінити розмір вікна браузера на', 'tool.schedule_resume': 'Планування відновлення', 'tool.schedule_task': 'Планування завдання', 'st.display.scheduled_tasks.label': 'Заплановані завдання', diff --git a/src/chrome/src/ui/locales/vi.js b/src/chrome/src/ui/locales/vi.js index c66df90f8..26cd6f003 100644 --- a/src/chrome/src/ui/locales/vi.js +++ b/src/chrome/src/ui/locales/vi.js @@ -331,6 +331,7 @@ export default { 'sp.perm.verb.upload': "tải một tập tin lên", 'sp.perm.verb.record': "ghi lại tab (và micrô) trên", 'sp.perm.verb.schedule': "sắp xếp công việc trong tương lai cho", + 'sp.perm.verb.window': 'thay đổi kích thước cửa sổ trình duyệt trên', 'sp.step.details': "chi tiết", 'sp.step.input_label': "đầu vào", diff --git a/src/chrome/src/ui/locales/zh.js b/src/chrome/src/ui/locales/zh.js index 65e3422fd..1f17b4c34 100644 --- a/src/chrome/src/ui/locales/zh.js +++ b/src/chrome/src/ui/locales/zh.js @@ -591,6 +591,7 @@ export default { 'sp.scratchpad.cleared': '草稿板已清除。', 'sp.scratchpad.error': '草稿板不可用:{msg}', 'sp.perm.verb.schedule': '为以下对象安排后续任务', + 'sp.perm.verb.window': '调整浏览器窗口大小于', 'tool.schedule_resume': '正在安排恢复', 'tool.schedule_task': '正在安排任务', 'st.display.scheduled_tasks.label': '定时任务', diff --git a/src/chrome/src/ui/sidepanel.js b/src/chrome/src/ui/sidepanel.js index 63f901e2c..f579858dd 100644 --- a/src/chrome/src/ui/sidepanel.js +++ b/src/chrome/src/ui/sidepanel.js @@ -4,6 +4,7 @@ */ import { t, getLocale, setLocale, LANGUAGES, applyDOMTranslations } from './i18n.js'; +import { CAPABILITY_LABEL } from '../agent/permission-gate.js'; import { sanitizeMarkdownLinks } from './markdown-link.js'; import { codeFenceLanguage, highlightCode, renderMarkdownHeadings } from './markdown-render.js'; import { applyMode, loadMode, watch } from './theme.js'; @@ -9315,8 +9316,13 @@ function renderClarifyCard(data) { card.dataset.permission = '1'; const host = String(data.permission.host || ''); const cap = String(data.permission.capability || ''); - const verb = t('sp.perm.verb.' + cap); - qEl.textContent = t('sp.perm.question', { verb, host }); + const verbKey = 'sp.perm.verb.' + cap; + const verb = t(verbKey); + // English falls back to the single CAPABILITY_LABEL source of truth so the + // consent wording cannot drift between two English copies; other locales + // carry their own translation under the key. + const resolvedVerb = verb === verbKey ? (CAPABILITY_LABEL[cap] || cap) : verb; + qEl.textContent = t('sp.perm.question', { verb: resolvedVerb, host }); const reasonEl = document.createElement('div'); reasonEl.className = 'clarify-reason'; diff --git a/src/firefox/src/ui/locales/ar.js b/src/firefox/src/ui/locales/ar.js index 80da198cf..e5ea78a4e 100644 --- a/src/firefox/src/ui/locales/ar.js +++ b/src/firefox/src/ui/locales/ar.js @@ -575,6 +575,7 @@ export default { 'sp.scratchpad.cleared': 'تم مسح المسودة.', 'sp.scratchpad.error': 'منطقة المسودة غير متاحة: {msg}', 'sp.perm.verb.schedule': 'جدولة عمل مستقبلي لـ', + 'sp.perm.verb.window': 'تغيير حجم نافذة المتصفح على', 'tool.schedule_resume': 'جدولة استئناف', 'tool.schedule_task': 'جدولة مهمة', 'st.display.scheduled_tasks.label': 'المهام المجدوَلة', diff --git a/src/firefox/src/ui/locales/bn.js b/src/firefox/src/ui/locales/bn.js index a4a6f7cbf..16c46ef66 100644 --- a/src/firefox/src/ui/locales/bn.js +++ b/src/firefox/src/ui/locales/bn.js @@ -329,6 +329,7 @@ export default { 'sp.perm.verb.upload': "একটি ফাইল আপলোড করুন", 'sp.perm.verb.record': "ট্যাব (এবং মাইক্রোফোন) চালু করুন", 'sp.perm.verb.schedule': "ভবিষ্যত কাজের সময়সূচী", + 'sp.perm.verb.window': 'ব্রাউজার উইন্ডোর আকার পরিবর্তন করুন', 'sp.step.details': "বিস্তারিত", 'sp.step.input_label': "ইনপুট", diff --git a/src/firefox/src/ui/locales/de.js b/src/firefox/src/ui/locales/de.js index e9a14d40d..ba4ad4702 100644 --- a/src/firefox/src/ui/locales/de.js +++ b/src/firefox/src/ui/locales/de.js @@ -339,6 +339,7 @@ export default { 'sp.perm.verb.upload': 'Datei hochladen zu', 'sp.perm.verb.record': 'Tab (und Mikrofon) aufnehmen auf', 'sp.perm.verb.schedule': 'zukünftige Aufgaben planen für', + 'sp.perm.verb.window': 'die Größe des Browserfensters ändern auf', 'sp.help.shortcuts_html': 'Tastenkürzel
Ctrl/Cmd+/ — Eingabefeld fokussieren
Ctrl/Cmd+Shift+A — Zum Fragen-Modus wechseln
Ctrl/Cmd+Shift+X — Zum Handeln-Modus wechseln
Ctrl/Cmd+Shift+D — Zum Dev-Modus wechseln
Escape — Aktiven Durchlauf stoppen
Escape zweimal — Aktive Aufnahme stoppen', 'sp.compact.nothing_to_compact': 'Noch nichts zu kompaktieren — es gibt nicht genügend älteren Kontext.', 'sp.compact.busy': 'Kompaktierung nicht möglich, während ein Durchlauf läuft — warten Sie auf dessen Abschluss.', diff --git a/src/firefox/src/ui/locales/en.js b/src/firefox/src/ui/locales/en.js index 9043b6d2f..e5ec9c0c7 100644 --- a/src/firefox/src/ui/locales/en.js +++ b/src/firefox/src/ui/locales/en.js @@ -329,6 +329,7 @@ export default { 'sp.perm.verb.upload': 'upload a file to', 'sp.perm.verb.record': 'record the tab (and microphone) on', 'sp.perm.verb.schedule': 'schedule future work for', + 'sp.perm.verb.window': 'resize the browser window for', 'sp.step.details': 'details', 'sp.step.input_label': 'Input', diff --git a/src/firefox/src/ui/locales/es.js b/src/firefox/src/ui/locales/es.js index 142b15723..8a22839be 100644 --- a/src/firefox/src/ui/locales/es.js +++ b/src/firefox/src/ui/locales/es.js @@ -575,6 +575,7 @@ export default { 'sp.scratchpad.cleared': 'Bloc de notas borrado.', 'sp.scratchpad.error': 'Bloc de notas no disponible: {msg}', 'sp.perm.verb.schedule': 'programar trabajo futuro en', + 'sp.perm.verb.window': 'cambiar el tamaño de la ventana del navegador en', 'tool.schedule_resume': 'Programando reanudación', 'tool.schedule_task': 'Programando tarea', 'st.display.scheduled_tasks.label': 'Tareas programadas', diff --git a/src/firefox/src/ui/locales/fa.js b/src/firefox/src/ui/locales/fa.js index 2bcbd817c..30ced7a6a 100644 --- a/src/firefox/src/ui/locales/fa.js +++ b/src/firefox/src/ui/locales/fa.js @@ -329,6 +329,7 @@ export default { 'sp.perm.verb.upload': "آپلود فایل به", 'sp.perm.verb.record': "زبانه (و میکروفون) را روی آن ضبط کنید", 'sp.perm.verb.schedule': "برای کارهای آینده برنامه ریزی کنید", + 'sp.perm.verb.window': 'اندازه پنجره مرورگر را تغییر دهید در', 'sp.step.details': "جزئیات", 'sp.step.input_label': "ورودی", diff --git a/src/firefox/src/ui/locales/fr.js b/src/firefox/src/ui/locales/fr.js index 395764fb4..779f91ab0 100644 --- a/src/firefox/src/ui/locales/fr.js +++ b/src/firefox/src/ui/locales/fr.js @@ -575,6 +575,7 @@ export default { 'sp.scratchpad.cleared': 'Bloc-notes effacé.', 'sp.scratchpad.error': 'Bloc-notes indisponible : {msg}', 'sp.perm.verb.schedule': 'planifier des tâches futures pour', + 'sp.perm.verb.window': 'redimensionner la fenêtre du navigateur sur', 'tool.schedule_resume': 'Planification de la reprise', 'tool.schedule_task': 'Planification de la tâche', 'st.display.scheduled_tasks.label': 'Tâches planifiées', diff --git a/src/firefox/src/ui/locales/he.js b/src/firefox/src/ui/locales/he.js index ebaa29d80..bc7d4d53a 100644 --- a/src/firefox/src/ui/locales/he.js +++ b/src/firefox/src/ui/locales/he.js @@ -303,6 +303,7 @@ export default { "sp.perm.verb.download": "להוריד קבצים מ", "sp.perm.verb.upload": "להעלות קובץ ל", "sp.perm.verb.schedule": "לתזמן עבודה עתידית עבור", + "sp.perm.verb.window": "לשנות את גודל חלון הדפדפן באתר", "sp.step.details": "פרטים", "sp.step.input_label": "קלט", "sp.step.result_label": "תוצאה", diff --git a/src/firefox/src/ui/locales/hi.js b/src/firefox/src/ui/locales/hi.js index 048a7336f..ae494ce20 100644 --- a/src/firefox/src/ui/locales/hi.js +++ b/src/firefox/src/ui/locales/hi.js @@ -329,6 +329,7 @@ export default { 'sp.perm.verb.upload': "पर एक फ़ाइल अपलोड करें", 'sp.perm.verb.record': "टैब (और माइक्रोफ़ोन) को चालू रखें", 'sp.perm.verb.schedule': "भविष्य के लिए कार्य शेड्यूल करें", + 'sp.perm.verb.window': 'ब्राउज़र विंडो का आकार बदलें', 'sp.step.details': "विवरण", 'sp.step.input_label': "इनपुट", diff --git a/src/firefox/src/ui/locales/id.js b/src/firefox/src/ui/locales/id.js index 89a00e197..9515fd263 100644 --- a/src/firefox/src/ui/locales/id.js +++ b/src/firefox/src/ui/locales/id.js @@ -575,6 +575,7 @@ export default { 'sp.scratchpad.cleared': 'Bak pasir dikosongkan.', 'sp.scratchpad.error': 'Bak pasir tidak tersedia: {msg}', 'sp.perm.verb.schedule': 'menjadwalkan pekerjaan mendatang untuk', + 'sp.perm.verb.window': 'mengubah ukuran jendela browser di', 'tool.schedule_resume': 'Menjadwalkan lanjutan', 'tool.schedule_task': 'Menjadwalkan tugas', 'st.display.scheduled_tasks.label': 'Tugas terjadwal', diff --git a/src/firefox/src/ui/locales/ja.js b/src/firefox/src/ui/locales/ja.js index 4ba0c92d6..26596e951 100644 --- a/src/firefox/src/ui/locales/ja.js +++ b/src/firefox/src/ui/locales/ja.js @@ -575,6 +575,7 @@ export default { 'sp.scratchpad.cleared': 'スクラッチパッドをクリアしました。', 'sp.scratchpad.error': 'スクラッチパッドを取得できませんでした: {msg}', 'sp.perm.verb.schedule': 'での将来の作業のスケジュールを', + 'sp.perm.verb.window': 'でのブラウザウィンドウのサイズ変更を', 'tool.schedule_resume': '再開をスケジュール中', 'tool.schedule_task': 'タスクをスケジュール中', 'st.display.scheduled_tasks.label': 'スケジュールタスク', diff --git a/src/firefox/src/ui/locales/ko.js b/src/firefox/src/ui/locales/ko.js index da4c5d988..2c3d0ea01 100644 --- a/src/firefox/src/ui/locales/ko.js +++ b/src/firefox/src/ui/locales/ko.js @@ -575,6 +575,7 @@ export default { 'sp.scratchpad.cleared': '스크래치패드가 지워졌습니다.', 'sp.scratchpad.error': '스크래치패드를 사용할 수 없습니다: {msg}', 'sp.perm.verb.schedule': '미래 작업 예약', + 'sp.perm.verb.window': '브라우저 창 크기 조절', 'tool.schedule_resume': '재개 예약 중', 'tool.schedule_task': '작업 예약 중', 'st.display.scheduled_tasks.label': '예약된 작업', diff --git a/src/firefox/src/ui/locales/ms.js b/src/firefox/src/ui/locales/ms.js index 286af4d48..d553d7b30 100644 --- a/src/firefox/src/ui/locales/ms.js +++ b/src/firefox/src/ui/locales/ms.js @@ -575,6 +575,7 @@ export default { 'sp.scratchpad.cleared': 'Pad nota dikosongkan.', 'sp.scratchpad.error': 'Pad nota tidak tersedia: {msg}', 'sp.perm.verb.schedule': 'menjadualkan kerja masa hadapan untuk', + 'sp.perm.verb.window': 'menukar saiz tetingkap pelayar pada', 'tool.schedule_resume': 'Menjadualkan sambungan semula', 'tool.schedule_task': 'Menjadualkan tugas', 'st.display.scheduled_tasks.label': 'Tugas berjadual', diff --git a/src/firefox/src/ui/locales/nl.js b/src/firefox/src/ui/locales/nl.js index 238e73239..c48bffa1b 100644 --- a/src/firefox/src/ui/locales/nl.js +++ b/src/firefox/src/ui/locales/nl.js @@ -317,6 +317,7 @@ export default { 'sp.perm.verb.upload': 'een bestand uploaden naar', 'sp.perm.verb.record': 'het tabblad (en microfoon) opnemen op', 'sp.perm.verb.schedule': 'geplande taken instellen voor', + 'sp.perm.verb.window': 'het browservenster aanpassen op', 'sp.step.details': 'details', 'sp.step.input_label': 'Invoer', 'sp.step.result_label': 'Resultaat', diff --git a/src/firefox/src/ui/locales/pl.js b/src/firefox/src/ui/locales/pl.js index 599f9f900..ca3e0145e 100644 --- a/src/firefox/src/ui/locales/pl.js +++ b/src/firefox/src/ui/locales/pl.js @@ -238,6 +238,7 @@ export default { 'sp.perm.verb.upload': 'przesłać plik do', 'sp.perm.verb.record': 'nagrać kartę (i mikrofon) na', 'sp.perm.verb.schedule': 'zaplanować przyszłe działania dla', + 'sp.perm.verb.window': 'zmienić rozmiar okna przeglądarki na', 'sp.step.details': 'szczegóły', 'sp.step.input_label': 'Wejście', 'sp.step.result_label': 'Wynik', diff --git a/src/firefox/src/ui/locales/pt.js b/src/firefox/src/ui/locales/pt.js index f72cf61a2..248cfa0fb 100644 --- a/src/firefox/src/ui/locales/pt.js +++ b/src/firefox/src/ui/locales/pt.js @@ -329,6 +329,7 @@ export default { 'sp.perm.verb.upload': "carregar um arquivo para", 'sp.perm.verb.record': "grave a guia (e o microfone) em", 'sp.perm.verb.schedule': "agendar trabalhos futuros para", + 'sp.perm.verb.window': 'redimensionar a janela do navegador em', 'sp.step.details': "detalhes", 'sp.step.input_label': "Entrada", diff --git a/src/firefox/src/ui/locales/ru.js b/src/firefox/src/ui/locales/ru.js index 4f10132f7..9aadd0bf9 100644 --- a/src/firefox/src/ui/locales/ru.js +++ b/src/firefox/src/ui/locales/ru.js @@ -575,6 +575,7 @@ export default { 'sp.scratchpad.cleared': 'Блокнот очищен.', 'sp.scratchpad.error': 'Блокнот недоступен: {msg}', 'sp.perm.verb.schedule': 'запланировать будущие действия для', + 'sp.perm.verb.window': 'изменить размер окна браузера на', 'tool.schedule_resume': 'Планирование возобновления', 'tool.schedule_task': 'Планирование задачи', 'st.display.scheduled_tasks.label': 'Запланированные задачи', diff --git a/src/firefox/src/ui/locales/th.js b/src/firefox/src/ui/locales/th.js index aa9c46c66..4a15c38e4 100644 --- a/src/firefox/src/ui/locales/th.js +++ b/src/firefox/src/ui/locales/th.js @@ -575,6 +575,7 @@ export default { 'sp.scratchpad.cleared': 'ล้างกระดานร่างแล้ว', 'sp.scratchpad.error': 'ไม่สามารถใช้กระดานร่างได้: {msg}', 'sp.perm.verb.schedule': 'ตั้งเวลางานในอนาคตสำหรับ', + 'sp.perm.verb.window': 'ปรับขนาดหน้าต่างเบราว์เซอร์บน', 'tool.schedule_resume': 'กำลังตั้งเวลาต่องาน', 'tool.schedule_task': 'กำลังตั้งเวลางาน', 'st.display.scheduled_tasks.label': 'งานที่ตั้งเวลาไว้', diff --git a/src/firefox/src/ui/locales/tl.js b/src/firefox/src/ui/locales/tl.js index 3cfc0657d..b8da08f22 100644 --- a/src/firefox/src/ui/locales/tl.js +++ b/src/firefox/src/ui/locales/tl.js @@ -575,6 +575,7 @@ export default { 'sp.scratchpad.cleared': 'Na-clear ang scratchpad.', 'sp.scratchpad.error': 'Hindi available ang scratchpad: {msg}', 'sp.perm.verb.schedule': 'mag-iskedyul ng gawaing hinaharap para sa', + 'sp.perm.verb.window': 'baguhin ang laki ng window ng browser sa', 'tool.schedule_resume': 'Nag-iiskedyul ng pagpapatuloy', 'tool.schedule_task': 'Nag-iiskedyul ng gawain', 'st.display.scheduled_tasks.label': 'Mga naka-iskedyul na gawain', diff --git a/src/firefox/src/ui/locales/tr.js b/src/firefox/src/ui/locales/tr.js index 7fc178bcc..a91520565 100644 --- a/src/firefox/src/ui/locales/tr.js +++ b/src/firefox/src/ui/locales/tr.js @@ -614,6 +614,7 @@ export default { 'sp.scratchpad.cleared': 'Not defteri temizlendi.', 'sp.scratchpad.error': 'Not defterine erişilemiyor: {msg}', 'sp.perm.verb.schedule': 'gelecekteki çalışmayı zamanlamak için', + 'sp.perm.verb.window': 'tarayıcı penceresinin boyutunu değiştirmek', 'tool.schedule_resume': 'Devam zamanlama', 'tool.schedule_task': 'Görev zamanlama', 'st.display.scheduled_tasks.label': 'Zamanlanmış görevler', diff --git a/src/firefox/src/ui/locales/uk.js b/src/firefox/src/ui/locales/uk.js index 43b80975e..839804ce3 100644 --- a/src/firefox/src/ui/locales/uk.js +++ b/src/firefox/src/ui/locales/uk.js @@ -575,6 +575,7 @@ export default { 'sp.scratchpad.cleared': 'Чернетник очищено.', 'sp.scratchpad.error': 'Чернетник недоступний: {msg}', 'sp.perm.verb.schedule': 'запланувати майбутню роботу для', + 'sp.perm.verb.window': 'змінити розмір вікна браузера на', 'tool.schedule_resume': 'Планування відновлення', 'tool.schedule_task': 'Планування завдання', 'st.display.scheduled_tasks.label': 'Заплановані завдання', diff --git a/src/firefox/src/ui/locales/vi.js b/src/firefox/src/ui/locales/vi.js index dca99b7d0..b9ba98679 100644 --- a/src/firefox/src/ui/locales/vi.js +++ b/src/firefox/src/ui/locales/vi.js @@ -329,6 +329,7 @@ export default { 'sp.perm.verb.upload': "tải một tập tin lên", 'sp.perm.verb.record': "ghi lại tab (và micrô) trên", 'sp.perm.verb.schedule': "sắp xếp công việc trong tương lai cho", + 'sp.perm.verb.window': 'thay đổi kích thước cửa sổ trình duyệt trên', 'sp.step.details': "chi tiết", 'sp.step.input_label': "đầu vào", diff --git a/src/firefox/src/ui/locales/zh.js b/src/firefox/src/ui/locales/zh.js index 7ae459f06..3acbd226c 100644 --- a/src/firefox/src/ui/locales/zh.js +++ b/src/firefox/src/ui/locales/zh.js @@ -575,6 +575,7 @@ export default { 'sp.scratchpad.cleared': '草稿板已清除。', 'sp.scratchpad.error': '草稿板不可用:{msg}', 'sp.perm.verb.schedule': '为以下对象安排后续任务', + 'sp.perm.verb.window': '调整浏览器窗口大小于', 'tool.schedule_resume': '正在安排恢复', 'tool.schedule_task': '正在安排任务', 'st.display.scheduled_tasks.label': '定时任务', diff --git a/src/firefox/src/ui/sidepanel.js b/src/firefox/src/ui/sidepanel.js index 99db46a49..30d536c76 100644 --- a/src/firefox/src/ui/sidepanel.js +++ b/src/firefox/src/ui/sidepanel.js @@ -4,6 +4,7 @@ */ import { t, getLocale, setLocale, LANGUAGES, applyDOMTranslations } from './i18n.js'; +import { CAPABILITY_LABEL } from '../agent/permission-gate.js'; import { sanitizeMarkdownLinks } from './markdown-link.js'; import { codeFenceLanguage, highlightCode, renderMarkdownHeadings } from './markdown-render.js'; import { applyMode, loadMode, watch } from './theme.js'; @@ -8801,8 +8802,13 @@ function renderClarifyCard(data) { card.dataset.permission = '1'; const host = String(data.permission.host || ''); const cap = String(data.permission.capability || ''); - const verb = t('sp.perm.verb.' + cap); - qEl.textContent = t('sp.perm.question', { verb, host }); + const verbKey = 'sp.perm.verb.' + cap; + const verb = t(verbKey); + // English falls back to the single CAPABILITY_LABEL source of truth so the + // consent wording cannot drift between two English copies; other locales + // carry their own translation under the key. + const resolvedVerb = verb === verbKey ? (CAPABILITY_LABEL[cap] || cap) : verb; + qEl.textContent = t('sp.perm.question', { verb: resolvedVerb, host }); const reasonEl = document.createElement('div'); reasonEl.className = 'clarify-reason'; diff --git a/test/run.js b/test/run.js index cbab07c8a..d3333f638 100644 --- a/test/run.js +++ b/test/run.js @@ -567,11 +567,12 @@ const { createContextMenuPromptHandler: createContextMenuPromptHandlerFx } = awa ); // permission-gate.js is pure JS (deterministic capability × origin gate). -const { Capability, capabilityFor, capabilitiesFor, normalizeHost, hostForCapability, requiredHosts, frameHostMatches, isNetworkMutation, PermissionManager, UNTRUSTED_CONTENT_TOOLS } = await import( +const { Capability, CAPABILITY_LABEL, capabilityFor, capabilitiesFor, normalizeHost, hostForCapability, requiredHosts, frameHostMatches, isNetworkMutation, PermissionManager, UNTRUSTED_CONTENT_TOOLS } = await import( 'file://' + path.join(ROOT, 'src/firefox/src/agent/permission-gate.js').replace(/\\/g, '/') ); const { Capability: CapabilityCh, + CAPABILITY_LABEL: CAPABILITY_LABEL_CH, capabilityFor: capabilityForCh, PermissionManager: PermissionManagerCh, normalizeHost: normalizeHostCh, @@ -25142,6 +25143,24 @@ test('all locales cover English keys and preserve interpolation placeholders', a } }); +test('every permission-gate capability has an English verb and a sidepanel fallback', () => { + for (const [label, Cap, LABEL, prefix] of [ + ['chrome', CapabilityCh, CAPABILITY_LABEL_CH, 'src/chrome'], + ['firefox', Capability, CAPABILITY_LABEL, 'src/firefox'], + ]) { + for (const cap of Object.values(Cap)) { + const labelText = LABEL[cap]; + assert.equal(typeof labelText, 'string', `${label}: ${cap} missing from CAPABILITY_LABEL`); + assert.ok(labelText.length > 0, `${label}: ${cap} English verb must not be empty`); + } + // The permission prompt must fall back to CAPABILITY_LABEL (not the raw + // key) when a locale lacks sp.perm.verb., so a newly added capability + // can never render its raw key on the consent prompt. + const sidepanel = fs.readFileSync(path.join(ROOT, prefix, 'src/ui/sidepanel.js'), 'utf8'); + assert.match(sidepanel, /CAPABILITY_LABEL\[cap\] \|\| cap/, `${label}: sidepanel permission prompt must fall back to CAPABILITY_LABEL`); + } +}); + test('Apocalypse Mode copy is translated instead of inherited from English in every locale', async () => { const requiredTranslatedKeys = [ 'st.display.apocalypse_mode.desc',