מדריך | תרגום הסטטוס של ה ✔️✔️ במיילטראק 2
-
תרגום סטטוסים של מייל טראק לעברית
הסקריפט עודכן ב 25/1/2026
כהמשך למלאכה הנהדרת של @יוסף-אלחנן, שיצר כאן סקריפט לתרגום הסטטוסים של תוסף Mailsuite (לשעבר Mailtrack) לעברית – הסקריפט אכן שיפר את החוויה, אך היה צורך בכמה תיקונים נוספים לשפה ולדיוק התרגום.
כעת, שדרגתי את הסקריפט כך שהוא מתרגם בצורה מלאה ומדויקת את כל הסטטוסים, ללא פספוסים. כמובן, מומלץ שגם אתם תנסו ותוודאו שהכול מתרגם כראוי.
לאחר התקנת הסקריפט, כשתעמדו על סמן הסטטוס של הודעה (שני סמני וי או נקודה), יופיע לכם הכיתוב בעברית, 'פלוני קרא את המייל שלך לפני 3 דקות', וכן הלאה.
כיצד מתקינים ומריצים את הסקריפט:
-
יש להתקין את Tampermonkey – תוסף פופולארי לדפדפני כרום (ודומיהם), שמאפשר להריץ סקריפטים מותאמים אישית באתרים שונים. (@עדלאידע כתב כאן מדריך ברור ומפורט לתוסף).
-
לאחר התקנת התוסף:
- היכנסו לרשימת התוספים של הדפדפן.
- לחצו קליק ימני על סמל תוסף Tampermonkey ובחרו: "Create a new script..." - ייפתח עורך הסקריפטים.
- מחקו את כל התוכן הקיים.
- הדביקו שם את הקוד המצורף.
- שמרו את הסקריפט (Ctrl+S או דרך התפריט: קובץ > Save).
בהצלחה!
// ==UserScript== // @name תרגום מיילסוויט (מיילטראק) - גרסה מעודכנת // @namespace http://tampermonkey.net/ // @version 3.0 // @description שדרוג התרגום לכסות את כל החורים - 2026-01-25 // @author I believe (https://mitmachim.top/user/i-believe) // @author יוסף אלחנן (https://mitmachim.top/user/יוסף-אלחנן) // @match https://mail.google.com/* // @grant none // ==/UserScript== (function() { 'use strict'; const translations = { // --- 1. ביטויים ארוכים עם עדיפות --- "opened your email": " פתח/ה את המייל שלך ", "read your email": " קרא/ה את המייל שלך ", "opened from": " פתח/ה מ- ", "opened at": " פתח/ה ב- ", // --- 2. ביטויים סבילים (המייל עצמו) --- "Your last email was opened": " המייל האחרון שלך נפתח ", "Your email was opened": " המייל שלך נפתח ", "Your last email": " המייל האחרון שלך ", "Your email": " המייל שלך ", "your last email": " המייל האחרון שלך ", "your email": " המייל שלך ", "opened by": " נפתח על ידי ", "read by": " נקרא על ידי ", "was opened": " נפתח ", "was read": " נקרא ", // --- 3. ברירת מחדל לפעלים --- "opened": " נפתח ", // זה ישונה דינמית ל"פתח/ה" אם ההקשר מתאים "read": " נקרא ", "after you sent it": " אחרי ששלחת אותו ", // --- 4. ביטויים מורכבים --- "one of the recipients": " אחד הנמענים ", "less than a minute": " פחות מדקה ", "less than a": " פחות מ- ", "Email not tracked": " מייל ללא מעקב ", "First opened": " פתיחה ראשונה ", "First read": " קריאה ראשונה ", "tracking history": " היסטוריית מעקב ", "tracking details": " פרטי המעקב", "uses email tracking": " משתמש/ת במעקב דוא''ל", "opened your last email": " פתח/ה את המייל האחרון שלך ", "tracking": " מעקב ", "Learn more": "למידע נוסף", // --- 5. מילות קישור וזמן --- "by": " על ידי ", "at": " ב- ", "hasn't": " עדיין לא ", "times": " פעמים ", "ago": " לפני ", "minute": " דקה ", "minutes": " דקות ", "hour": " שעה ", "hours": " שעות ", "day": " יום ", "days": " ימים ", "after": " אחרי ", "tracked": " במעקב ", "Details": " פרטים ", "See all": " צפה בכל ", "yet": "" }; /** * פונקציית התרגום המרכזית * @param {string} text - הטקסט לתרגום * @param {Node} node - צומת הטקסט המקורי (לצורך בדיקת הקשר) */ function translateText(text, node) { if (!text || !/[a-zA-Z]/.test(text)) return text; let t = text; // שלב א': טיפול בהצמדות מספרים (למשל 5minutes -> 5 minutes) t = t.replace(/([a-zA-Z]+)(\d+)/g, '$1 $2'); t = t.replace(/(\d+)([a-zA-Z]+)/g, '$1 $2'); // שלב ב': בדיקת הקשר רחבה (האם המילה opened צריכה להיות פעילה) const parent = node && node.parentElement ? node.parentElement.closest('[role="tooltip"], [class*="ms-"], [class*="mailtrack"]') : null; const parentText = parent ? parent.textContent.toLowerCase() : ""; // בדיקה גמישה: האם המילה opened והמילה your קיימות באותו אלמנט צף const isActionContext = parentText.includes("opened") && parentText.includes("your"); // שלב ג': תרגום לפי סדר חשיבות (מהארוך לקצר) const sortedKeys = Object.keys(translations).sort((a, b) => b.length - a.length); for (let eng of sortedKeys) { const regex = new RegExp("\\b" + eng + "\\b", 'gi'); if (regex.test(t)) { if (eng.toLowerCase() === "opened") { // כאן קורה הקסם: אם ההקשר הוא "פתח את המייל שלך", נשתמש ב"פתח/ה" t = t.replace(regex, isActionContext ? " פתח/ה את " : " נפתח "); } else { t = t.replace(regex, translations[eng]); } } } t = t.replace(/\b(was|you|it)\b/gi, ''); t = t.replace(/(ימים|דקות|שעות)\s+(\d+)\s+לפני/g, ' לפני $2 $1 '); t = t.replace(/([א-ת]+)\s+(\d+)/g, ' $2 $1 '); // --- תיקון ממוקד: הסרת רווח לפני נקודה רק אחרי מילים ספציפיות --- const wordsToAttach = ["פעמים", "שלך", "במעקב", "נפתח", "נקרא"]; wordsToAttach.forEach(word => { const regex = new RegExp(word + "\\s+\\.", "g"); t = t.replace(regex, word + "."); }); // ניקוי רווחים כפולים (אבל שומר על רווח בודד בין מילים) t = t.replace(/\s+/g, ' ').trim(); // שלב ד': ניקוי מילות עזר באנגלית ותיקוני RTL t = t.replace(/\bwas\b/gi, '').replace(/\byou\b/gi, '').replace(/\bit\b/gi, ''); // סידור מספרים (למשל: דקות 5 לפני -> לפני 5 דקות) t = t.replace(/(ימים|דקות|שעות)\s+(\d+)\s+לפני/g, ' לפני $2 $1 '); t = t.replace(/([א-ת]+)\s+(\d+)/g, ' $2 $1 '); //הצמדת סימני פיסוק למילה שלפניהם t = t.replace(/\s+([.,?!=])/g, '$1'); // ניקוי נקודות בתחילת משפט שקופצות בגלל RTL t = t.replace(/^\s*\.\s*/, ''); return t.replace(/\s+/g, ' ').trim(); } function processNode(node) { if (node.nodeType === Node.TEXT_NODE) { const original = node.textContent; // שים לב: אנחנו מעבירים גם את ה-node עצמו כדי שהתרגום יכיר את ההקשר const translated = translateText(original, node); if (translated !== original && translated.trim() !== "") { node.textContent = " " + translated + " "; } } else if (node.nodeType === Node.ELEMENT_NODE) { if (['SCRIPT', 'STYLE', 'SVG', 'PATH'].includes(node.tagName)) return; if (node.dataset && node.dataset.msTranslated) return; const className = typeof node.className === 'string' ? node.className : ""; const isMailsuite = node.getAttribute('role') === 'tooltip' || className.includes('mailtrack') || className.includes('ms-'); if (isMailsuite) { node.style.setProperty('direction', 'rtl', 'important'); node.style.setProperty('text-align', 'right', 'important'); node.style.setProperty('unicode-bidi', 'plaintext', 'important'); if (node.dataset) node.dataset.msTranslated = "true"; } node.childNodes.forEach(processNode); } } function safeUpdate() { try { const targets = document.querySelectorAll('[role="tooltip"], [class*="mailtrack"], [class*="ms-"]'); targets.forEach(el => processNode(el)); } catch (e) {} } // מעקב אחרי שינויים בדף (כדי לתרגם הודעות שקופצות) const observer = new MutationObserver(safeUpdate); observer.observe(document.body, { childList: true, subtree: true }); // הזרקת CSS לתיקון כיווניות גלובלי לאלמנטים של מיילסוויט const style = document.createElement('style'); style.innerHTML = ` [role="tooltip"], .mailtrack-tooltip, [class*="ms-"] { direction: rtl !important; text-align: right !important; word-spacing: 1px !important; } `; document.head.appendChild(style); // הרצה ראשונית ומחזורית safeUpdate(); setInterval(safeUpdate, 3000); })(); -
-
תרגום סטטוסים של מייל טראק לעברית
הסקריפט עודכן ב 25/1/2026
כהמשך למלאכה הנהדרת של @יוסף-אלחנן, שיצר כאן סקריפט לתרגום הסטטוסים של תוסף Mailsuite (לשעבר Mailtrack) לעברית – הסקריפט אכן שיפר את החוויה, אך היה צורך בכמה תיקונים נוספים לשפה ולדיוק התרגום.
כעת, שדרגתי את הסקריפט כך שהוא מתרגם בצורה מלאה ומדויקת את כל הסטטוסים, ללא פספוסים. כמובן, מומלץ שגם אתם תנסו ותוודאו שהכול מתרגם כראוי.
לאחר התקנת הסקריפט, כשתעמדו על סמן הסטטוס של הודעה (שני סמני וי או נקודה), יופיע לכם הכיתוב בעברית, 'פלוני קרא את המייל שלך לפני 3 דקות', וכן הלאה.
כיצד מתקינים ומריצים את הסקריפט:
-
יש להתקין את Tampermonkey – תוסף פופולארי לדפדפני כרום (ודומיהם), שמאפשר להריץ סקריפטים מותאמים אישית באתרים שונים. (@עדלאידע כתב כאן מדריך ברור ומפורט לתוסף).
-
לאחר התקנת התוסף:
- היכנסו לרשימת התוספים של הדפדפן.
- לחצו קליק ימני על סמל תוסף Tampermonkey ובחרו: "Create a new script..." - ייפתח עורך הסקריפטים.
- מחקו את כל התוכן הקיים.
- הדביקו שם את הקוד המצורף.
- שמרו את הסקריפט (Ctrl+S או דרך התפריט: קובץ > Save).
בהצלחה!
// ==UserScript== // @name תרגום מיילסוויט (מיילטראק) - גרסה מעודכנת // @namespace http://tampermonkey.net/ // @version 3.0 // @description שדרוג התרגום לכסות את כל החורים - 2026-01-25 // @author I believe (https://mitmachim.top/user/i-believe) // @author יוסף אלחנן (https://mitmachim.top/user/יוסף-אלחנן) // @match https://mail.google.com/* // @grant none // ==/UserScript== (function() { 'use strict'; const translations = { // --- 1. ביטויים ארוכים עם עדיפות --- "opened your email": " פתח/ה את המייל שלך ", "read your email": " קרא/ה את המייל שלך ", "opened from": " פתח/ה מ- ", "opened at": " פתח/ה ב- ", // --- 2. ביטויים סבילים (המייל עצמו) --- "Your last email was opened": " המייל האחרון שלך נפתח ", "Your email was opened": " המייל שלך נפתח ", "Your last email": " המייל האחרון שלך ", "Your email": " המייל שלך ", "your last email": " המייל האחרון שלך ", "your email": " המייל שלך ", "opened by": " נפתח על ידי ", "read by": " נקרא על ידי ", "was opened": " נפתח ", "was read": " נקרא ", // --- 3. ברירת מחדל לפעלים --- "opened": " נפתח ", // זה ישונה דינמית ל"פתח/ה" אם ההקשר מתאים "read": " נקרא ", "after you sent it": " אחרי ששלחת אותו ", // --- 4. ביטויים מורכבים --- "one of the recipients": " אחד הנמענים ", "less than a minute": " פחות מדקה ", "less than a": " פחות מ- ", "Email not tracked": " מייל ללא מעקב ", "First opened": " פתיחה ראשונה ", "First read": " קריאה ראשונה ", "tracking history": " היסטוריית מעקב ", "tracking details": " פרטי המעקב", "uses email tracking": " משתמש/ת במעקב דוא''ל", "opened your last email": " פתח/ה את המייל האחרון שלך ", "tracking": " מעקב ", "Learn more": "למידע נוסף", // --- 5. מילות קישור וזמן --- "by": " על ידי ", "at": " ב- ", "hasn't": " עדיין לא ", "times": " פעמים ", "ago": " לפני ", "minute": " דקה ", "minutes": " דקות ", "hour": " שעה ", "hours": " שעות ", "day": " יום ", "days": " ימים ", "after": " אחרי ", "tracked": " במעקב ", "Details": " פרטים ", "See all": " צפה בכל ", "yet": "" }; /** * פונקציית התרגום המרכזית * @param {string} text - הטקסט לתרגום * @param {Node} node - צומת הטקסט המקורי (לצורך בדיקת הקשר) */ function translateText(text, node) { if (!text || !/[a-zA-Z]/.test(text)) return text; let t = text; // שלב א': טיפול בהצמדות מספרים (למשל 5minutes -> 5 minutes) t = t.replace(/([a-zA-Z]+)(\d+)/g, '$1 $2'); t = t.replace(/(\d+)([a-zA-Z]+)/g, '$1 $2'); // שלב ב': בדיקת הקשר רחבה (האם המילה opened צריכה להיות פעילה) const parent = node && node.parentElement ? node.parentElement.closest('[role="tooltip"], [class*="ms-"], [class*="mailtrack"]') : null; const parentText = parent ? parent.textContent.toLowerCase() : ""; // בדיקה גמישה: האם המילה opened והמילה your קיימות באותו אלמנט צף const isActionContext = parentText.includes("opened") && parentText.includes("your"); // שלב ג': תרגום לפי סדר חשיבות (מהארוך לקצר) const sortedKeys = Object.keys(translations).sort((a, b) => b.length - a.length); for (let eng of sortedKeys) { const regex = new RegExp("\\b" + eng + "\\b", 'gi'); if (regex.test(t)) { if (eng.toLowerCase() === "opened") { // כאן קורה הקסם: אם ההקשר הוא "פתח את המייל שלך", נשתמש ב"פתח/ה" t = t.replace(regex, isActionContext ? " פתח/ה את " : " נפתח "); } else { t = t.replace(regex, translations[eng]); } } } t = t.replace(/\b(was|you|it)\b/gi, ''); t = t.replace(/(ימים|דקות|שעות)\s+(\d+)\s+לפני/g, ' לפני $2 $1 '); t = t.replace(/([א-ת]+)\s+(\d+)/g, ' $2 $1 '); // --- תיקון ממוקד: הסרת רווח לפני נקודה רק אחרי מילים ספציפיות --- const wordsToAttach = ["פעמים", "שלך", "במעקב", "נפתח", "נקרא"]; wordsToAttach.forEach(word => { const regex = new RegExp(word + "\\s+\\.", "g"); t = t.replace(regex, word + "."); }); // ניקוי רווחים כפולים (אבל שומר על רווח בודד בין מילים) t = t.replace(/\s+/g, ' ').trim(); // שלב ד': ניקוי מילות עזר באנגלית ותיקוני RTL t = t.replace(/\bwas\b/gi, '').replace(/\byou\b/gi, '').replace(/\bit\b/gi, ''); // סידור מספרים (למשל: דקות 5 לפני -> לפני 5 דקות) t = t.replace(/(ימים|דקות|שעות)\s+(\d+)\s+לפני/g, ' לפני $2 $1 '); t = t.replace(/([א-ת]+)\s+(\d+)/g, ' $2 $1 '); //הצמדת סימני פיסוק למילה שלפניהם t = t.replace(/\s+([.,?!=])/g, '$1'); // ניקוי נקודות בתחילת משפט שקופצות בגלל RTL t = t.replace(/^\s*\.\s*/, ''); return t.replace(/\s+/g, ' ').trim(); } function processNode(node) { if (node.nodeType === Node.TEXT_NODE) { const original = node.textContent; // שים לב: אנחנו מעבירים גם את ה-node עצמו כדי שהתרגום יכיר את ההקשר const translated = translateText(original, node); if (translated !== original && translated.trim() !== "") { node.textContent = " " + translated + " "; } } else if (node.nodeType === Node.ELEMENT_NODE) { if (['SCRIPT', 'STYLE', 'SVG', 'PATH'].includes(node.tagName)) return; if (node.dataset && node.dataset.msTranslated) return; const className = typeof node.className === 'string' ? node.className : ""; const isMailsuite = node.getAttribute('role') === 'tooltip' || className.includes('mailtrack') || className.includes('ms-'); if (isMailsuite) { node.style.setProperty('direction', 'rtl', 'important'); node.style.setProperty('text-align', 'right', 'important'); node.style.setProperty('unicode-bidi', 'plaintext', 'important'); if (node.dataset) node.dataset.msTranslated = "true"; } node.childNodes.forEach(processNode); } } function safeUpdate() { try { const targets = document.querySelectorAll('[role="tooltip"], [class*="mailtrack"], [class*="ms-"]'); targets.forEach(el => processNode(el)); } catch (e) {} } // מעקב אחרי שינויים בדף (כדי לתרגם הודעות שקופצות) const observer = new MutationObserver(safeUpdate); observer.observe(document.body, { childList: true, subtree: true }); // הזרקת CSS לתיקון כיווניות גלובלי לאלמנטים של מיילסוויט const style = document.createElement('style'); style.innerHTML = ` [role="tooltip"], .mailtrack-tooltip, [class*="ms-"] { direction: rtl !important; text-align: right !important; word-spacing: 1px !important; } `; document.head.appendChild(style); // הרצה ראשונית ומחזורית safeUpdate(); setInterval(safeUpdate, 3000); })();@I-believe קודם כל, יפה מאוד!
התרגום הרבה יותר משופר כמו שציינת...
(ותודה שהשארת קרדיט
)אם אפשר להעיר, בטולטיפ המקורי יש לינק להיסטוריית המעקב אבל הסקריפט משבש את הטולטיפ המקורי ומציג רק את הטקסט בלי הקישור המוטמע...
אני עבדתי עוד חתיכת זמן כדי שהוא יצמד לטולטיפ המקורי (שאני חושב שהוא עדין יותר ממה שנוצר מהסקריפט המעודכן - אבל על טעם וריח...) ורק יערוך את הטקסט של הסטטוס... -
-
@I-believe קודם כל, יפה מאוד!
התרגום הרבה יותר משופר כמו שציינת...
(ותודה שהשארת קרדיט
)אם אפשר להעיר, בטולטיפ המקורי יש לינק להיסטוריית המעקב אבל הסקריפט משבש את הטולטיפ המקורי ומציג רק את הטקסט בלי הקישור המוטמע...
אני עבדתי עוד חתיכת זמן כדי שהוא יצמד לטולטיפ המקורי (שאני חושב שהוא עדין יותר ממה שנוצר מהסקריפט המעודכן - אבל על טעם וריח...) ורק יערוך את הטקסט של הסטטוס...@יוסף-אלחנן כתב במדריך | תרגום הסטטוס של ה
️
️ במיילטראק 2:@I-believe קודם כל, יפה מאוד!
התרגום הרבה יותר משופר כמו שציינת...
(ותודה שהשארת קרדיט
)מגיע לך הרבה קרדיט... 🫡
אם אפשר להעיר, בטולטיפ המקורי יש לינק להיסטוריית המעקב אבל הסקריפט משבש את הטולטיפ המקורי ומציג רק את הטקסט בלי הקישור המוטמע...
אני עבדתי עוד חתיכת זמן כדי שהוא יצמד לטולטיפ המקורי (שאני חושב שהוא עדין יותר ממה שנוצר מהסקריפט המעודכן - אבל על טעם וריח...) ורק יערוך את הטקסט של הסטטוס...לא שמתי לב שאתה הצלחת להתגבר על הבעיה הזו, כמובן שהכל נעשה בעזרת צ'אט GPT, כך שאצטרך להתייעץ איתו על כך... אם אתה מזהה את הנקודה אשמח שתשתף אותי, ואעדכן.
עריכה: אני בדרך לפתרון, אעדכן בהמשך בפוסט הראשון.בעיקרון רציתי לכתוב את הפוסט כתגובה למדריך שלך, אך עדיין אין לי הרשאה להגיב שם.
-
@יוסף-אלחנן כתב במדריך | תרגום הסטטוס של ה
️
️ במיילטראק 2:@I-believe קודם כל, יפה מאוד!
התרגום הרבה יותר משופר כמו שציינת...
(ותודה שהשארת קרדיט
)מגיע לך הרבה קרדיט... 🫡
אם אפשר להעיר, בטולטיפ המקורי יש לינק להיסטוריית המעקב אבל הסקריפט משבש את הטולטיפ המקורי ומציג רק את הטקסט בלי הקישור המוטמע...
אני עבדתי עוד חתיכת זמן כדי שהוא יצמד לטולטיפ המקורי (שאני חושב שהוא עדין יותר ממה שנוצר מהסקריפט המעודכן - אבל על טעם וריח...) ורק יערוך את הטקסט של הסטטוס...לא שמתי לב שאתה הצלחת להתגבר על הבעיה הזו, כמובן שהכל נעשה בעזרת צ'אט GPT, כך שאצטרך להתייעץ איתו על כך... אם אתה מזהה את הנקודה אשמח שתשתף אותי, ואעדכן.
עריכה: אני בדרך לפתרון, אעדכן בהמשך בפוסט הראשון.בעיקרון רציתי לכתוב את הפוסט כתגובה למדריך שלך, אך עדיין אין לי הרשאה להגיב שם.
@I-believe קודם כל ממש תודה זה ממש טוב
רק זה אצלי עדיין באנגלית יש לך מושג מה יכול להיות הסיבה? -
@I-believe קודם כל ממש תודה זה ממש טוב
רק זה אצלי עדיין באנגלית יש לך מושג מה יכול להיות הסיבה?@מיכאל-הראל ריעננת את המייל?
מה אתה רואה כשאתה לוחץ על האייקון של התוסף?

-
@מיכאל-הראל ריעננת את המייל?
מה אתה רואה כשאתה לוחץ על האייקון של התוסף?

@יוסף-אלחנן כתב במדריך | תרגום הסטטוס של ה
️
️ במיילטראק 2:@מיכאל-הראל ריעננת את המייל?
מה אתה רואה כשאתה לוחץ על האייקון של התוסף?

ג''א מצטרף להודות על היוזמה.
אך גם לי נשאר באנגלית, רעננתי, ואני רואה אותו דבר כמוך בתוסף.
-
@מיכאל-הראל ריעננת את המייל?
מה אתה רואה כשאתה לוחץ על האייקון של התוסף?

@יוסף-אלחנן כן אבל עזוב עשיתי בסוף את snov io
תודה בכל אופן -
לבקשת @בנימין-מחשבים הסקריפט עודכן כעת בצורה מתוקנת עם שמירה על הקישורים.