add a 'disable spell checker' checkbox and rename settings
authorRaphaël Jakse <raphael.trivabble@jakse.fr>
Wed, 7 Oct 2020 18:10:46 +0000 (20:10 +0200)
committerRaphaël Jakse <raphael.trivabble@jakse.fr>
Wed, 7 Oct 2020 18:16:36 +0000 (20:16 +0200)
l10n/po/fr/trivabble.po
l10n/pot/trivabble.pot
public/index.html
public/trivabble.js
server/trivabble-server.js

index d46f707bea1134aa0c86fa8fcfc2e33205ef99f2..162aa113800bcc43c908453d68eea6fa087f69d0 100644 (file)
@@ -225,3 +225,6 @@ msgstr  "Astuce !"
 
 msgid "Next tip"
 msgstr "Astuce suivante"
+
+msgid  "Disable the spell checker"
+msgstr "Désactiver la vérification orthographique"
\ No newline at end of file
index c0d9408333fbc9d4e29c326d5c92c42fe99455bd..9fb9dc9bf86d8bf6568b60e24d368752af8fe8bc 100644 (file)
@@ -230,3 +230,6 @@ msgstr ""
 
 msgid "Next tip"
 msgstr ""
+
+msgid "Disable the spell checker"
+msgstr ""
\ No newline at end of file
index e5924b201b97161bcfdc11d000b60c3a1aed9a5f..165cc22c20b1d8fde6adefa70422355ff5ee75e2 100644 (file)
                     <p><label><input type="checkbox" id="tiles-sound" /><span data-l10n="text-content">Sound of the tiles</span></label></p>
                     <p><label><input type="checkbox" id="msg-sound" /><span data-l10n="text-content">Sound of messages</span></label></p>
                 </div>
+                <div>
+                    <p id="disable-spell-checker-p" hide="true">
+                        <label>
+                            <input type="checkbox" id="disable-spell-checker" />
+                            <span data-l10n="text-content">Disable the spell checker</span>
+                        </label>
+                    </p>
+                </div>
                 <div>
                     <p>
                         <label for="double-tap-duration" data-l10n="text-content">Double tap duration:</label>
index ccfd03dbe8b35ad007f9a690f25e8a2c3e9e8e44..3d8b69a974ab2a885c9d76963999377967f659a9 100644 (file)
     setConf("FLASH_LIGHT_DURATION",  middle("FLASH_LIGHT_DURATIONS"));
     setConf("FLASH_LIGHT_COLOR",     "#ee6633");
 
-    function isSetting(key) {
-        return Object.prototype.hasOwnProperty.call(Conf, key) ||
-            Object.prototype.hasOwnProperty.call(localStorage, key);
-    }
-
     function getSetting(key) {
         let type;
         let value;
         }
 
         /* try to retrieve value from localstorage */
-        if (Object.prototype.hasOwnProperty.call(localStorage, key)) {
-            value = localStorage.getItem(key);
+        if (Object.prototype.hasOwnProperty.call(localStorage, "trivabble" + key)) {
+            value = localStorage.getItem("trivabble" + key);
 
             /* get type from localStorage if no default is set */
             if (typeof type === "undefined") {
-                if (Object.prototype.hasOwnProperty.call(localStorage, key + "_type")) {
-                    type = localStorage.getItem(key + "_type");
+                if (Object.prototype.hasOwnProperty.call(localStorage, "trivabble" + key + "_type")) {
+                    type = localStorage.getItem("trivabble" + key + "_type");
                 } else {
                     type = "string";
                 }
 
         /* try to retrieve type from localstorage */
         if (typeof type === "undefined") {
-            if (Object.prototype.hasOwnProperty.call(localStorage, key)) {
-                type = localStorage.getItem(key + "_type");
+            if (Object.prototype.hasOwnProperty.call(localStorage, "trivabble" + key)) {
+                type = localStorage.getItem("trivabble" + key + "_type");
             }
         }
 
                 (type === "number") ||
                 (type === "object") ||
                 (type === "string")) {
-                localStorage.setItem(key, value);
+                localStorage.setItem("trivabble" + key, value);
 
                 /* store type into localstorage if no default value in configuration */
                 if (!Object.prototype.hasOwnProperty.call(Conf, key)) {
-                    localStorage.setItem(key + "_type", type);
+                    localStorage.setItem("trivabble" + key + "_type", type);
                 }
             } else {
                 console.error("Unsupported type");
     }
 
     function migrateSetting(key, type) {
-        if (Object.prototype.hasOwnProperty.call(localStorage, key)) {
-            localStorage.setItem(key + "_type", type);
+        if (Object.prototype.hasOwnProperty.call(localStorage, "trivabble" + key)) {
+            localStorage.setItem("trivabble" + key + "_type", type);
         }
     }
 
-    migrateSetting("spellCheckerEnabled", "boolean");
-    migrateSetting("trivabbleGameNumber", "number");
-    migrateSetting("trivabbleBoardLang", "string");
-    migrateSetting("trivabbleGameNumber", "number");
-    migrateSetting("trivabbleLang", "string");
-    migrateSetting("trivabblePlayerName", "string");
+    migrateSetting("SpellCheckerEnabledOnce", "boolean");
+    migrateSetting("DisableSpellChecker", "boolean");
+    migrateSetting("GameNumber", "number");
+    migrateSetting("BoardLang", "string");
+    migrateSetting("GameNumber", "number");
+    migrateSetting("Lang", "string");
+    migrateSetting("PlayerName", "string");
 
     const _ = (window.libD && libD.l10n) ? libD.l10n() : function (s) {
         return s;
             return;
         }
 
-        if (!force && !getSetting("spellCheckerEnabled")) {
+        if (!force && !getSetting("SpellCheckerEnabledOnce")) {
             myConfirm(
                 _("Spell checking requires Trivabble to download a dictionary. Do you confirm?"),
                 function () {
-                    setSetting("spellCheckerEnabled", true);
+                    setSetting("SpellCheckerEnabledOnce", true);
                     getDictionary(code, callback, true);
                 }
             );
         switch (key) {
             case "playerName":
                 name.textContent = value;
-                setSetting("trivabblePlayerName", value);
+                setSetting("PlayerName", value);
                 break;
             case "gameNumber":
                 document.getElementById("number").textContent = value;
-                setSetting("trivabbleGameNumber", value);
+                setSetting("GameNumber", value);
                 break;
             case "boardLang":
                 document.getElementById("board-lang").value = value;
-                setSetting("trivabbleBoardLang", value);
+                setSetting("BoardLang", value);
                 break;
         }
     }
                 myAlert(
                     format(
                         _("You are about to leave the current game. To recover it, please note its number: {0}"),
-                        getSetting("trivabbleGameNumber")
+                        getSetting("GameNumber")
                     ),
                     f
                 );
 
         chatMessages.scrollTop = chatMessages.scrollHeight;
 
-        if (sender && sender !== getSetting("trivabblePlayerName")) {
+        if (sender && sender !== getSetting("PlayerName")) {
             if (getSetting("ENABLE_MSG_SOUND")) {
                 audioChat.play();
             }
                 case "changeBoardLang": {
                     const newLang = boardLangSelect.querySelector("[value=" + msg.specialMsg.newBoardLang + "]").textContent;
                     infoMessage(
-                        (msg.sender === getSetting("trivabblePlayerName"))
+                        (msg.sender === getSetting("PlayerName"))
                             ? format(_("You changed the language of the board to {0}"), newLang)
                             : format(_("{0} changed the language of the board to {1}"), msg.sender, newLang)
                     );
                 }
 
                 if (data.to === "board") {
-                    setCell(data.indexTo, data.letter, Object.prototype.hasOwnProperty.call(data, "player") && data.player !== getSetting("trivabblePlayerName"));
+                    setCell(data.indexTo, data.letter, Object.prototype.hasOwnProperty.call(data, "player") && data.player !== getSetting("PlayerName"));
                 } else if (data.to === "rack") {
                     setRackCell(data.indexTo, data.letter);
                 }
                 break;
             case "setCell":
-                setCell(data.indexTo, data.letter, Object.prototype.hasOwnProperty.call(data, "player") && data.player !== getSetting("trivabblePlayerName"));
+                setCell(data.indexTo, data.letter, Object.prototype.hasOwnProperty.call(data, "player") && data.player !== getSetting("PlayerName"));
                 if ((data.letter !== "") && (currentTilePlayed[data.indexTo] === "-")) {
                     currentTilePlayed[data.indexTo] = data.letter;
                 }
 
     function cmdsWithContext(cmds) {
         return {
-            gameNumber: getSetting("trivabbleGameNumber") || "",
-            playerName: getSetting("trivabblePlayerName"),
-            boardLang: getSetting("trivabbleBoardLang"),
+            gameNumber: getSetting("GameNumber") || "",
+            playerName: getSetting("PlayerName"),
+            boardLang: getSetting("BoardLang"),
             version: VERSION,
             cmds: cmds
         };
         checkGameInProgress(
             function () {
                 myPrompt(
-                    _("To join a game, please give the number which is displayed on your adversary(ies)' screen.\nIf you do not know it, ask them.\n\nWarning: your adversary must not take your number, (s)he must keep his/her own. If you whish to recover your current game, please not the following number: {0}.").replace("{0}", getSetting("trivabbleGameNumber")),
+                    _("To join a game, please give the number which is displayed on your adversary(ies)' screen.\nIf you do not know it, ask them.\n\nWarning: your adversary must not take your number, (s)he must keep his/her own. If you whish to recover your current game, please not the following number: {0}.").replace("{0}", getSetting("GameNumber")),
                     function (n) {
                         n = parseInt(n);
                         if (isNaN(n)) {
                             myAlert(_("It seems your did not give a correct number, or you clicked on “Cancel”. As a result, the current game continues, if any. To join a game, click on “Join a game” again."));
                         } else {
-                            setSetting("trivabbleGameNumber", n);
+                            setSetting("GameNumber", n);
                             location.reload();
                         }
                     }
             _("To change your name, enter a new one. You can keep using your current name by cancelling. Please note that if you change your name and you have games in progress, you will not be able to keep playing them anymore unless you get back to your current name."),
             function (newName) {
                 if (newName && newName.trim()) {
-                    setSetting("trivabblePlayerName", newName.trim());
-                    name.textContent = getSetting("trivabblePlayerName");
+                    setSetting("PlayerName", newName.trim());
+                    name.textContent = getSetting("PlayerName");
                 }
             },
-            getSetting("trivabblePlayerNamer")
+            getSetting("PlayerNamer")
         );
     }
 
     function startGame(number) {
         if (number) {
-            setSetting("trivabbleGameNumber", number);
+            setSetting("GameNumber", number);
         }
         startConnection();
     }
                 sendCmds([{cmd: "changeBoard", lang: code}]);
             },
             function () {
-                boardLangSelect.value = getSetting("trivabbleBoardLang");
+                boardLangSelect.value = getSetting("BoardLang");
             }
         );
     }
     }
 
     function checkSpellingClicked() {
-        if (getSetting("spellCheckerEnabled") === "false") {
+        if (getSetting("SpellCheckerEnabledOnce") === "false") {
             return;
         }
 
-        getDictionary(getSetting("trivabbleBoardLang"), checkSpelling);
+        getDictionary(getSetting("BoardLang"), checkSpelling);
     }
 
     function checkSpelling(dictionary) {
         }
     }
 
-    function initSpellChecker() {
-        if (getSetting("ENABLE_SPELL_CHECKER")) {
-            document.getElementById("check-spelling").hidden = false;
-            document.getElementById("info-spell-checking").hidden = false;
-        } else {
-            document.getElementById("check-spelling").hidden = true;
-            document.getElementById("info-spell-checking").hidden = true;
+    function toggleSpellChecker(e) {
+        const disabled = !getSetting("ENABLE_SPELL_CHECKER") || document.getElementById("disable-spell-checker").checked;
+        document.getElementById("check-spelling").hidden = disabled;
+        document.getElementById("info-spell-checking").hidden = disabled;
+        if (e) {
+            setSetting("DisableSpellChecker", disabled);
         }
     }
 
+    function initSpellChecker() {
+        document.getElementById("disable-spell-checker-p").hidden = !getSetting("ENABLE_SPELL_CHECKER");
+        document.getElementById("disable-spell-checker").checked = getSetting("DisableSpellChecker");
+        toggleSpellChecker();
+    }
+
     function translateDuration(x, values) {
         if (x < 0) {
             return null;
     }
 
     function repromptName(f) {
-        if (getSetting("trivabblePlayerName") && getSetting("trivabblePlayerName").trim()) {
+        if (getSetting("PlayerName") && getSetting("PlayerName").trim()) {
             f();
         } else {
             myPrompt(
                 _("It seems your did not give your name. You need to do it for the game to run properly."),
                 function (name) {
                     if (name && name.trim()) {
-                        setSetting("trivabblePlayerName", name.trim());
+                        setSetting("PlayerName", name.trim());
                     }
 
                     repromptName(f);
             );
         });
 
-        boardLangSelect.value = getSetting("trivabbleBoardLang");
+        boardLangSelect.value = getSetting("BoardLang");
     }
 
     function langSelectionChange(e) {
         document.getElementById("btn-settings").onclick = showSettings;
         document.getElementById("btn-settings-close").onclick = hideSettings;
         document.getElementById("next-help-msg").onclick = nextHelpMessage;
+        document.getElementById("disable-spell-checker").onclick = toggleSpellChecker;
         window.addEventListener("keydown", function (e) {
             if (e.key === "Escape") {
                 document.querySelector(".modal").classList.remove("show-modal");
     }
 
     function initGame() {
-        if (!getSetting("trivabblePlayerName")) {
+        if (!getSetting("PlayerName")) {
             myPrompt(
                 _("Hello! To begin, enter your name. Your adversaries will see this name when you play with them."),
                 function (name) {
                     if (name && name.trim()) {
-                        setSetting("trivabblePlayerName", name);
+                        setSetting("PlayerName", name);
                     }
                     repromptName(initGame);
                 }
             return;
         }
 
-        name.textContent = getSetting("trivabblePlayerName");
+        name.textContent = getSetting("PlayerName");
 
         const letters = "ABCDEFGHIJKLMNO";
 
 
         row.appendChild(board.rows[0].cells[0].cloneNode(false));
 
-        if (getSetting("trivabbleGameNumber")) {
-            document.getElementById("number").textContent = getSetting("trivabbleGameNumber");
+        if (getSetting("GameNumber")) {
+            document.getElementById("number").textContent = getSetting("GameNumber");
         }
 
-        if (getSetting("trivabbleBoardLang")) {
-            document.getElementById("board-lang").value = getSetting("trivabbleBoardLang");
+        if (getSetting("BoardLang")) {
+            document.getElementById("board-lang").value = getSetting("BoardLang");
         }
 
-        startGame(getSetting("trivabbleGameNumber"));
+        startGame(getSetting("GameNumber"));
     }
 
     function initLang() {
index 02e205a00d309683a360335ae2fc00d6ae9e4486..54666ce127cf240e293d39f9c9ef99baf1b57eb0 100644 (file)
@@ -1007,7 +1007,7 @@ function handleRequest(request, response) {
                             "style-src 'self'; " +
                             "img-src 'self'; " +
                             (disableCSP ? "" : "connect-src 'self' " + (
-                                // uzbl (like Safari 9 / iPad 2) does not like unsecure websockets on the
+                                // uzbl (like Safari 9 / iPad 2) does not like insecure websockets on the
                                 // same port with connect-src 'self'
                                 // See https://github.com/w3c/webappsec-csp/issues/7
                                 "ws://" + host + ":" + port + " " +