// ==UserScript==
// @name Intelino Scratch Hebrew
// @name:en Intelino Scratch Hebrew
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Translates the single train intelino extention for the scratch programming language at scratch.intelino.com
// @description:en Translates the single train intelino extention for the scratch programming language at scratch.intelino.com
// @author [email protected]
// @match https://scratch.intelino.com/
// @icon https://www.google.com/s2/favicons?sz=64&domain=intelino.com
// @grant none
// @license https://github.com/yhirshhorn/Intelino-Scratch-Hebrew/blob/main/LICENSE
// ==/UserScript==
(function() {
'use strict';
// Select the node that will be observed for mutations
let targetNode = document.body;
// Options for the observer (which mutations to observe)
const config = { attributes: true, childList: true, subtree: true };
// Callback function to execute when mutations are observed
const callback = (_m, _o) => {
translate();
};
// Create an observer instance linked to the callback function
const observer = new MutationObserver(callback);
// Start observing the target node for configured mutations
observer.observe(targetNode, config);
function getKey(e) {
if (e.matches("text")) {
return e.innerHTML;
} else {
return e.innerText;
}
}
function setKey(e, value) {
if (e.matches("text")) {
e.innerHTML = value;
} else {
e.innerText = value;
}
}
function translate() {
document.querySelectorAll("text, div.goog-menuitem-content").forEach(e => {
let key = getKey(e);
// Caution: if the string literal in next line apprears to be empty, it isn't.
// it contains the 202b unicode character: https://unicode-explorer.com/c/202B
// TODO: find a way to use HTML entity or some other visual representation of
// this character such that it is not ignored by JS in processing.
if (key[0] === "") {
key = key.substring(1);
}
// Caution: if the string literal in next line apprears to be empty, it isn't.
// it contains the 202c unicode character: https://unicode-explorer.com/c/202C
// TODO: find a way to use HTML entity or some other visual representation of
// this character such that it is not ignored by JS in processing.
if (key[key.length - 1] === "") {
key = key.substring(0, key.length - 1);
}
// Caution: if the string literals in next lines apprear empty, they arn't.
// it contains the 202b and 202c unicode characters:
// https://unicode-explorer.com/c/202B & https://unicode-explorer.com/c/202C
// TODO: find a way to use HTML entity or some other visual representation of
// these characters such that they are not ignored by JS in processing.
if (dictionary.has(key)) {
setKey(e, "" + dictionary.get(key) + "");
}
});
}
let dictionary = new Map();
dictionary.set("when movement", "כשכיוון התנועה הוא");
dictionary.set("forward", "קדימה");
dictionary.set("backward", "אחורה");
dictionary.set("paused", "עצירה זמנית");
dictionary.set("stopped", "עצירה מלאה");
dictionary.set("stop driving", "עצור.י");
dictionary.set("when distance >=", "כשהמרחק >=");
dictionary.set("cm", "ס\"מ");
dictionary.set("cm/s", "סמ\"ש");
dictionary.set("drive", "סע.י");
dictionary.set("cm at", "ס\"מ ב");
dictionary.set("at", "ב");
dictionary.set("when train sees", "כשהרכבת רואה");
dictionary.set("pause driving for", "עצור.י למשך");
dictionary.set("speed (cm/s)", "מהירות (סמ\"ש)");
dictionary.set("distance (cm)", "מרחק (ס\"מ)");
dictionary.set("reset distance", "אפס.י מרחק");
dictionary.set("direction", "כיוון");
dictionary.set("decouple wagon", "נתק.י קרון");
dictionary.set("set", "הגדר.י ל");
dictionary.set("top LED", "לד עליון");
dictionary.set("top LED", "לד עליון");
dictionary.set("headlights", "פנסים קדמיים");
dictionary.set("taillights", "פנסים אחוריים");
dictionary.set("color to", "את הצבע");
dictionary.set("hue to", "את הגון");
dictionary.set("seconds", "שניות");
dictionary.set("red (1)", "אדום (1)");
dictionary.set("sensor color", "צבע החיישן");
dictionary.set("on", "פועל");
dictionary.set("off", "כבוי");
dictionary.set("lights", "אורות");
dictionary.set("when", "כאשר");
dictionary.set("feedback sounds", "צלילי משוב");
dictionary.set("action snap commands", "פקודות צמדני פעולה");
dictionary.set("seen", "נראה");
dictionary.set("none (0)", "ללא (0)");
dictionary.set("white (7)", "לבן (7)");
dictionary.set("none (0)", "ללא (0)");
dictionary.set("black (0)", "שחור (0)");
dictionary.set("red (1)", "אדום (1)");
dictionary.set("green (2)", "ירוק (2)");
dictionary.set("yellow (3)", "צהוב (3)");
dictionary.set("blue (4)", "כחול (4)");
dictionary.set("magenta (5)", "מג'נטה (5)");
dictionary.set("cyan (6)", "ציאן (6)");
dictionary.set("white (7)", "לבן (7)");
dictionary.set("clear stored custom commands", "שכח.י פקודות מותאמות אישית");
dictionary.set("left", "שמאלה");
dictionary.set("right", "ימינה");
dictionary.set("straight", "ישר");
dictionary.set("default", "ברירת מחדל");
dictionary.set("last decision", "ההחלטה הקודמת");
dictionary.set("next decision", "ההחלטה הבאה");
dictionary.set("on next split go", "בפיצול הבא פנה.י");
dictionary.set("when on a split track", "כאשר בפיצול, עקוב.עקבי");
dictionary.set("RGB to", "אי\"כ ל");
})();