From 4f4993b60532faa26cf6b41b4b6e13aeec6d3a55 Mon Sep 17 00:00:00 2001 From: Russell Ballestrini Date: Thu, 10 Jul 2025 22:01:43 -0400 Subject: [PATCH] feat: add translations for chat message button tooltips - Add deleteMessage, copyRawMarkdown, copyHTML translation keys to all 19 language files - Update all chat bubble button tooltips to use translation functions - Provides proper localization for Delete message, Copy raw (Markdown), and Copy HTML buttons --- src/languages/ar.js | 3 +++ src/languages/bn.js | 3 +++ src/languages/de.js | 3 +++ src/languages/en.js | 3 +++ src/languages/es.js | 3 +++ src/languages/fr.js | 3 +++ src/languages/hi.js | 3 +++ src/languages/id.js | 3 +++ src/languages/ja.js | 3 +++ src/languages/ko.js | 3 +++ src/languages/mr.js | 3 +++ src/languages/pt.js | 3 +++ src/languages/ru.js | 3 +++ src/languages/sw.js | 3 +++ src/languages/te.js | 3 +++ src/languages/tr.js | 3 +++ src/languages/ur.js | 3 +++ src/languages/zh-tw.js | 3 +++ src/languages/zh.js | 3 +++ src/uncloseai-embed-modal.js | 22 +++++++++++----------- 20 files changed, 68 insertions(+), 11 deletions(-) diff --git a/src/languages/ar.js b/src/languages/ar.js index d1c2ec7..42dd53e 100644 --- a/src/languages/ar.js +++ b/src/languages/ar.js @@ -108,5 +108,8 @@ export const ar = { pausedClickToResume: "متوقف. انقر للمتابعة", downloadPageAudio: "تنزيل ملف MP3 الخاص بتحويل النص إلى كلام لهذه الصفحة.", downloadChatAudio: "تنزيل هذه الرسالة كملف .mp3.", + deleteMessage: "حذف الرسالة", + copyRawMarkdown: "نسخ النص الخام (Markdown)", + copyHTML: "نسخ HTML", aiModalNotAvailable: "نافذة الذكاء الاصطناعي غير متاحة في هذا السياق", }; \ No newline at end of file diff --git a/src/languages/bn.js b/src/languages/bn.js index 07ad4af..2c8dbb7 100644 --- a/src/languages/bn.js +++ b/src/languages/bn.js @@ -108,5 +108,8 @@ export const bn = { pausedClickToResume: "বিরতি। পুনরায় শুরুর জন্য ক্লিক করুন", downloadPageAudio: "এই পৃষ্ঠার জন্য টেক্সট-টু-স্পিচ .mp3 ফাইলটি ডাউনলোড করুন।", downloadChatAudio: "এই বার্তাটি একটি .mp3 ফাইল হিসাবে ডাউনলোড করুন।", + deleteMessage: "বার্তা মুছুন", + copyRawMarkdown: "কাঁচা টেক্সট কপি করুন (Markdown)", + copyHTML: "HTML কপি করুন", aiModalNotAvailable: "AI মডেল এই প্রসঙ্গে উপলব্ধ নয়", }; \ No newline at end of file diff --git a/src/languages/de.js b/src/languages/de.js index 459fc45..45e3b27 100644 --- a/src/languages/de.js +++ b/src/languages/de.js @@ -108,5 +108,8 @@ export const de = { pausedClickToResume: "Pausiert. Klicken zum Fortsetzen", downloadPageAudio: "Laden Sie die Text-to-Speech-MP3-Datei für diese Seite herunter.", downloadChatAudio: "Diese Nachricht als .mp3-Datei herunterladen.", + deleteMessage: "Nachricht löschen", + copyRawMarkdown: "Rohen Text kopieren (Markdown)", + copyHTML: "HTML kopieren", aiModalNotAvailable: "KI-Modal ist in diesem Kontext nicht verfügbar", }; \ No newline at end of file diff --git a/src/languages/en.js b/src/languages/en.js index aa465bf..94f35be 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -75,6 +75,9 @@ export const en = { pausedClickToResume: "Paused. Click to resume", downloadPageAudio: "Download the text to speech .mp3 file for this page.", downloadChatAudio: "Download this message as an .mp3 file.", + deleteMessage: "Delete message", + copyRawMarkdown: "Copy raw (Markdown)", + copyHTML: "Copy HTML", // Translation modal tabs translatePageTab: "📄 Translate Page", diff --git a/src/languages/es.js b/src/languages/es.js index d155d38..13d27ed 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -76,6 +76,9 @@ export const es = { pausedClickToResume: "Pausado. Haz clic para reanudar", downloadPageAudio: "Descargue el archivo .mp3 de texto a voz para esta página.", downloadChatAudio: "Descargar este mensaje como archivo .mp3.", + deleteMessage: "Eliminar mensaje", + copyRawMarkdown: "Copiar texto sin formato (Markdown)", + copyHTML: "Copiar HTML", // Translation modal tabs translatePageTab: "📄 Traducir Página", diff --git a/src/languages/fr.js b/src/languages/fr.js index 9b459df..b50770e 100644 --- a/src/languages/fr.js +++ b/src/languages/fr.js @@ -76,6 +76,9 @@ export const fr = { pausedClickToResume: "En pause. Cliquez pour reprendre", downloadPageAudio: "Téléchargez le fichier .mp3 de synthèse vocale pour cette page.", downloadChatAudio: "Télécharger ce message en fichier .mp3.", + deleteMessage: "Supprimer le message", + copyRawMarkdown: "Copier le texte brut (Markdown)", + copyHTML: "Copier HTML", // Translation modal tabs translatePageTab: "📄 Traduire la Page", diff --git a/src/languages/hi.js b/src/languages/hi.js index 2d7d649..ca21067 100644 --- a/src/languages/hi.js +++ b/src/languages/hi.js @@ -107,5 +107,8 @@ export const hi = { pausedClickToResume: "रुका हुआ। जारी रखने के लिए क्लिक करें", downloadPageAudio: "इस पेज के लिए टेक्स्ट-टू-स्पीच .mp3 फ़ाइल डाउनलोड करें।", downloadChatAudio: "इस संदेश को .mp3 फ़ाइल के रूप में डाउनलोड करें।", + deleteMessage: "संदेश हटाएं", + copyRawMarkdown: "कच्चा टेक्स्ट कॉपी करें (Markdown)", + copyHTML: "HTML कॉपी करें", aiModalNotAvailable: "AI मॉडल इस संदर्भ में उपलब्ध नहीं है", }; \ No newline at end of file diff --git a/src/languages/id.js b/src/languages/id.js index 4434224..03fad68 100644 --- a/src/languages/id.js +++ b/src/languages/id.js @@ -108,5 +108,8 @@ export const id = { pausedClickToResume: "Dijeda. Klik untuk melanjutkan", downloadPageAudio: "Unduh file .mp3 text-to-speech untuk halaman ini.", downloadChatAudio: "Unduh pesan ini sebagai file .mp3.", + deleteMessage: "Hapus pesan", + copyRawMarkdown: "Salin teks mentah (Markdown)", + copyHTML: "Salin HTML", aiModalNotAvailable: "Modal AI tidak tersedia dalam konteks ini", }; \ No newline at end of file diff --git a/src/languages/ja.js b/src/languages/ja.js index 71efa9b..0b45b26 100644 --- a/src/languages/ja.js +++ b/src/languages/ja.js @@ -108,5 +108,8 @@ export const ja = { pausedClickToResume: "一時停止中。再開するにはクリック", downloadPageAudio: "このページのテキスト読み上げ.mp3ファイルをダウンロードします。", downloadChatAudio: "このメッセージを.mp3ファイルとしてダウンロード。", + deleteMessage: "メッセージを削除", + copyRawMarkdown: "生テキストをコピー (Markdown)", + copyHTML: "HTMLをコピー", aiModalNotAvailable: "AIモーダルはこのコンテキストでは利用できません", }; \ No newline at end of file diff --git a/src/languages/ko.js b/src/languages/ko.js index 6defeae..25a814d 100644 --- a/src/languages/ko.js +++ b/src/languages/ko.js @@ -108,5 +108,8 @@ export const ko = { pausedClickToResume: "일시정지됨. 재개하려면 클릭", downloadPageAudio: "이 페이지의 텍스트 음성 변환 .mp3 파일을 다운로드하십시오.", downloadChatAudio: "이 메시지를 .mp3 파일로 다운로드합니다.", + deleteMessage: "메시지 삭제", + copyRawMarkdown: "원시 텍스트 복사 (Markdown)", + copyHTML: "HTML 복사", aiModalNotAvailable: "AI 모달이 이 컨텍스트에서 사용할 수 없습니다", }; \ No newline at end of file diff --git a/src/languages/mr.js b/src/languages/mr.js index a799b8a..ea9b93a 100644 --- a/src/languages/mr.js +++ b/src/languages/mr.js @@ -108,5 +108,8 @@ export const mr = { pausedClickToResume: "थांबवले आहे. पुन्हा सुरू करण्यासाठी क्लिक करा", downloadPageAudio: "या पृष्ठासाठी टेक्स्ट-टू-स्पीच .mp3 फाइल डाउनलोड करा.", downloadChatAudio: "हा संदेश .mp3 फाइल म्हणून डाउनलोड करा.", + deleteMessage: "संदेश हटवा", + copyRawMarkdown: "कच्चा मजकूर कॉपी करा (Markdown)", + copyHTML: "HTML कॉपी करा", aiModalNotAvailable: "AI मॉडल या संदर्भात उपलब्ध नाही", }; \ No newline at end of file diff --git a/src/languages/pt.js b/src/languages/pt.js index 05bea82..96381c4 100644 --- a/src/languages/pt.js +++ b/src/languages/pt.js @@ -108,5 +108,8 @@ export const pt = { pausedClickToResume: "Pausado. Clique para continuar", downloadPageAudio: "Faça o download do arquivo .mp3 de conversão de texto em fala para esta página.", downloadChatAudio: "Baixar esta mensagem como arquivo .mp3.", + deleteMessage: "Excluir mensagem", + copyRawMarkdown: "Copiar texto bruto (Markdown)", + copyHTML: "Copiar HTML", aiModalNotAvailable: "Modal de IA não disponível neste contexto", }; \ No newline at end of file diff --git a/src/languages/ru.js b/src/languages/ru.js index 9470b49..45bd3c3 100644 --- a/src/languages/ru.js +++ b/src/languages/ru.js @@ -108,5 +108,8 @@ export const ru = { pausedClickToResume: "На паузе. Нажмите для продолжения", downloadPageAudio: "Загрузите mp3-файл с преобразованием текста в речь для этой страницы.", downloadChatAudio: "Скачать это сообщение как .mp3 файл.", + deleteMessage: "Удалить сообщение", + copyRawMarkdown: "Копировать исходный текст (Markdown)", + copyHTML: "Копировать HTML", aiModalNotAvailable: "Модальное окно ИИ недоступно в этом контексте", }; \ No newline at end of file diff --git a/src/languages/sw.js b/src/languages/sw.js index 274a854..5b595d9 100644 --- a/src/languages/sw.js +++ b/src/languages/sw.js @@ -108,5 +108,8 @@ export const sw = { pausedClickToResume: "Kusitishwa. Bonyeza kuendelea", downloadPageAudio: "Pakua faili ya .mp3 ya maandishi-hadi-hotuba ya ukurasa huu.", downloadChatAudio: "Pakua ujumbe huu kama faili ya .mp3.", + deleteMessage: "Futa ujumbe", + copyRawMarkdown: "Nakili maandishi ghafi (Markdown)", + copyHTML: "Nakili HTML", aiModalNotAvailable: "Modal ya AI haipatikani katika muktadha huu", }; \ No newline at end of file diff --git a/src/languages/te.js b/src/languages/te.js index 582e484..1de520d 100644 --- a/src/languages/te.js +++ b/src/languages/te.js @@ -108,5 +108,8 @@ export const te = { pausedClickToResume: "నిలిపివేయబడింది. కొనసాగించడానికి క్లిక్ చేయండి", downloadPageAudio: "ఈ పేజీ కోసం టెక్స్ట్-టు-స్పీచ్ .mp3 ఫైల్‌ను డౌన్‌లోడ్ చేయండి.", downloadChatAudio: "ఈ సందేశాన్ని .mp3 ఫైల్‌గా డౌన్‌లోడ్ చేయండి.", + deleteMessage: "సందేశాన్ని తొలగించు", + copyRawMarkdown: "ముడి వచనాన్ని కాపీ చేయండి (Markdown)", + copyHTML: "HTML కాపీ చేయండి", aiModalNotAvailable: "AI మోడల్ ఈ సందర్భంలో అందుబాటులో లేదు", }; \ No newline at end of file diff --git a/src/languages/tr.js b/src/languages/tr.js index 0addfce..46d0bfb 100644 --- a/src/languages/tr.js +++ b/src/languages/tr.js @@ -108,5 +108,8 @@ export const tr = { pausedClickToResume: "Duraklatıldı. Devam etmek için tıklayın", downloadPageAudio: "Bu sayfa için metin okuma .mp3 dosyasını indirin.", downloadChatAudio: "Bu mesajı .mp3 dosyası olarak indir.", + deleteMessage: "Mesajı sil", + copyRawMarkdown: "Ham metni kopyala (Markdown)", + copyHTML: "HTML kopyala", aiModalNotAvailable: "AI modalı bu bağlamda mevcut değil", }; \ No newline at end of file diff --git a/src/languages/ur.js b/src/languages/ur.js index 1d11916..9045531 100644 --- a/src/languages/ur.js +++ b/src/languages/ur.js @@ -108,5 +108,8 @@ export const ur = { pausedClickToResume: "رک گیا۔ جاری رکھنے کے لیے کلک کریں", downloadPageAudio: "اس صفحے کے لیے ٹیکسٹ ٹو اسپیچ .mp3 فائل ڈاؤن لوڈ کریں۔", downloadChatAudio: "اس پیغام کو .mp3 فائل کے طور پر ڈاؤن لوڈ کریں۔", + deleteMessage: "پیغام حذف کریں", + copyRawMarkdown: "خام متن کاپی کریں (Markdown)", + copyHTML: "HTML کاپی کریں", aiModalNotAvailable: "AI ماڈل اس سیاق میں دستیاب نہیں ہے", }; \ No newline at end of file diff --git a/src/languages/zh-tw.js b/src/languages/zh-tw.js index d4fc12a..4f8ea22 100644 --- a/src/languages/zh-tw.js +++ b/src/languages/zh-tw.js @@ -106,5 +106,8 @@ export const zhTw = { pausedClickToResume: "已暫停。點擊繼續", downloadPageAudio: "下載此頁面的文字轉語音 .mp3 檔案。", downloadChatAudio: "將此訊息下載為 .mp3 檔案。", + deleteMessage: "刪除訊息", + copyRawMarkdown: "複製原始文字 (Markdown)", + copyHTML: "複製 HTML", aiModalNotAvailable: "AI對話框在此上下文中不可用", }; \ No newline at end of file diff --git a/src/languages/zh.js b/src/languages/zh.js index 7fb3b97..029deca 100644 --- a/src/languages/zh.js +++ b/src/languages/zh.js @@ -106,5 +106,8 @@ export const zh = { pausedClickToResume: "已暂停。点击继续", downloadPageAudio: "下载此页面的文本转语音 .mp3 文件。", downloadChatAudio: "将此消息下载为 .mp3 文件。", + deleteMessage: "删除消息", + copyRawMarkdown: "复制原始文本 (Markdown)", + copyHTML: "复制 HTML", aiModalNotAvailable: "AI模态框在此上下文中不可用", }; \ No newline at end of file diff --git a/src/uncloseai-embed-modal.js b/src/uncloseai-embed-modal.js index 5dc1782..df87bb3 100644 --- a/src/uncloseai-embed-modal.js +++ b/src/uncloseai-embed-modal.js @@ -931,7 +931,7 @@ async function openUncloseaiEmbeddedModalNew() { const userDeleteBtn = document.createElement("button"); userDeleteBtn.textContent = "🗑️"; - userDeleteBtn.title = "Delete message"; + userDeleteBtn.title = getUIText("deleteMessage"); userDeleteBtn.className = "uncloseai-btn-small"; userDeleteBtn.onclick = async () => { // Remove from chat history and localStorage @@ -1124,7 +1124,7 @@ async function openUncloseaiEmbeddedModalNew() { const deleteBtn = document.createElement("button"); deleteBtn.textContent = "🗑️"; - deleteBtn.title = "Delete message"; + deleteBtn.title = getUIText("deleteMessage"); deleteBtn.className = "uncloseai-btn-small"; deleteBtn.onclick = async () => { // Remove both user and AI messages from history and localStorage @@ -1150,7 +1150,7 @@ async function openUncloseaiEmbeddedModalNew() { // Copy Raw (Markdown) button const copyRawBtn = document.createElement("button"); copyRawBtn.textContent = "📋"; - copyRawBtn.title = "Copy raw (Markdown)"; + copyRawBtn.title = getUIText("copyRawMarkdown"); copyRawBtn.className = "uncloseai-btn-small"; copyRawBtn.onclick = async () => { try { @@ -1168,7 +1168,7 @@ async function openUncloseaiEmbeddedModalNew() { // Copy HTML button const copyHtmlBtn = document.createElement("button"); copyHtmlBtn.textContent = "📄"; - copyHtmlBtn.title = "Copy HTML"; + copyHtmlBtn.title = getUIText("copyHTML"); copyHtmlBtn.className = "uncloseai-btn-small"; copyHtmlBtn.onclick = async () => { try { @@ -1455,7 +1455,7 @@ You have complete knowledge of this page content and can reference any details, const userDeleteBtn = document.createElement("button"); userDeleteBtn.textContent = "🗑️"; - userDeleteBtn.title = "Delete message"; + userDeleteBtn.title = getUIText("deleteMessage"); userDeleteBtn.className = "uncloseai-btn-small"; userDeleteBtn.onclick = async () => { // Remove from chat history by index @@ -1618,7 +1618,7 @@ You have complete knowledge of this page content and can reference any details, const deleteBtn = document.createElement("button"); deleteBtn.textContent = "🗑️"; - deleteBtn.title = "Delete message"; + deleteBtn.title = getUIText("deleteMessage"); deleteBtn.className = "uncloseai-btn-small"; deleteBtn.onclick = async () => { // Remove from chat history and localStorage by index @@ -1640,7 +1640,7 @@ You have complete knowledge of this page content and can reference any details, // Copy Raw (Markdown) button const copyRawBtn = document.createElement("button"); copyRawBtn.textContent = "📋"; - copyRawBtn.title = "Copy raw (Markdown)"; + copyRawBtn.title = getUIText("copyRawMarkdown"); copyRawBtn.className = "uncloseai-btn-small"; copyRawBtn.onclick = async () => { try { @@ -1658,7 +1658,7 @@ You have complete knowledge of this page content and can reference any details, // Copy HTML button const copyHtmlBtn = document.createElement("button"); copyHtmlBtn.textContent = "📄"; - copyHtmlBtn.title = "Copy HTML"; + copyHtmlBtn.title = getUIText("copyHTML"); copyHtmlBtn.className = "uncloseai-btn-small"; copyHtmlBtn.onclick = async () => { try { @@ -1868,7 +1868,7 @@ You have complete knowledge of this page content and can reference any details, const deleteBtn = document.createElement("button"); deleteBtn.textContent = "🗑️"; - deleteBtn.title = "Delete message"; + deleteBtn.title = getUIText("deleteMessage"); deleteBtn.className = "uncloseai-btn-small"; deleteBtn.onclick = async () => { // Remove intro message from localStorage @@ -1890,7 +1890,7 @@ You have complete knowledge of this page content and can reference any details, // Copy Raw (Markdown) button const copyRawBtn = document.createElement("button"); copyRawBtn.textContent = "📋"; - copyRawBtn.title = "Copy raw (Markdown)"; + copyRawBtn.title = getUIText("copyRawMarkdown"); copyRawBtn.className = "uncloseai-btn-small"; copyRawBtn.onclick = async () => { try { @@ -1908,7 +1908,7 @@ You have complete knowledge of this page content and can reference any details, // Copy HTML button const copyHtmlBtn = document.createElement("button"); copyHtmlBtn.textContent = "📄"; - copyHtmlBtn.title = "Copy HTML"; + copyHtmlBtn.title = getUIText("copyHTML"); copyHtmlBtn.className = "uncloseai-btn-small"; copyHtmlBtn.onclick = async () => { try {