From 1b266f7279d74fca6e71e3de4fe9d7b94dc2ac96 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 19 Jan 2022 11:09:12 +0000 Subject: [PATCH] Better support for translation, added some more common translations to German translation --- bin/language_scan.js | 66 ++++++++++++++++++++++++++++++++++---------- core | 2 +- lang/de_DE.json | 8 +++++- 3 files changed, 60 insertions(+), 16 deletions(-) diff --git a/bin/language_scan.js b/bin/language_scan.js index 5ab25428c..43d8cfc09 100755 --- a/bin/language_scan.js +++ b/bin/language_scan.js @@ -6,9 +6,19 @@ See https://github.com/espruino/BangleApps/issues/1311 */ var IGNORE_STRINGS = [ - "5x5", + "5x5","6x8","6x8:2","12x20","---","...", "5x9Numeric7Seg", - "Vector" + "Vector", + "sortorder","tl","tr" +]; + +var IGNORE_FUNCTION_PARAMS = [ + "read", + "readJSON", + "require", + "setFont", + "on", + "RegExp", ]; var BASEDIR = __dirname+"/../"; @@ -40,7 +50,11 @@ try{ } // Given a string value, work out if it's obviously not a text string -function isNotString(s) { +function isNotString(s, wasFnCall) { + // wasFnCall is set to the function name if 's' is the first argument to a function + if (wasFnCall && IGNORE_FUNCTION_PARAMS.includes(wasFnCall)) return true; + if (s=="Storage") console.log("isNotString",s,wasFnCall); + if (s.length<2) return true; // too short if (s.length>40) return true; // too long if (s[0]=="#") return true; // a color @@ -51,53 +65,77 @@ function isNotString(s) { return false; } +function getTextFromString(s) { + return s.replace(/^([.<>\- ]*)([^<>\!\?]*?)([.<>\!\?\- ]*)$/,"$2"); +} + // A string that *could* be translated? var untranslatedStrings = []; // Strings that are marked with 'LANG' var translatedStrings = []; +function addString(list, str, file) { + str = getTextFromString(str); + var entry = list.find(e => e.str==str); + if (!entry) { + entry = { str:str, uses:0, files : [] }; + list.push(entry); + } + entry.uses++; + if (!entry.files.includes(file)) + entry.files.push(file) +} + console.log("Scanning apps..."); +//apps = apps.filter(a=>a.id=="wid_edit"); apps.forEach((app,appIdx) => { var appDir = APPSDIR+app.id+"/"; app.storage.forEach((file) => { if (!file.url || !file.name.endsWith(".js")) return; - var fileContents = fs.readFileSync(appDir+file.url).toString(); + var filePath = appDir+file.url; + var fileContents = fs.readFileSync(filePath).toString(); var lex = Espruino.Core.Utils.getLexer(fileContents); var lastIdx = 0; + var wasFnCall = undefined; // set to 'setFont' if we're at soemthing like setFont(".." var tok = lex.next(); while (tok!==undefined) { var previousString = fileContents.substring(lastIdx, tok.startIdx); + //console.log(wasFnCall,tok.type,tok.value); if (tok.type=="STRING") { if (previousString.includes("/*LANG*/")) { // translated! - if (!translatedStrings.includes(tok.value)) - translatedStrings.push(tok.value); + addString(translatedStrings, tok.value, filePath); } else { // untranslated - potential to translate? - if (!isNotString(tok.value)) { - if (!untranslatedStrings.includes(tok.value)) - untranslatedStrings.push(tok.value); + if (!isNotString(tok.value, wasFnCall)) { + addString(untranslatedStrings, tok.value, filePath); } } - } + } else if (tok.value!="(") wasFnCall=undefined; + if (tok.type=="ID") wasFnCall=tok.value; lastIdx = tok.endIdx; tok = lex.next(); } }); }); -untranslatedStrings.sort(); -translatedStrings.sort(); +untranslatedStrings.sort((a,b)=>a.uses - b.uses); +translatedStrings.sort((a,b)=>a.uses - b.uses); +untranslatedStrings.filter(e => e.uses>2); // ignore individual uses var report = ""; -/* // too many! don't output these +// too many! don't output these log("Possible English Strings that could be translated"); log("================================================================="); log(""); log("Add these to IGNORE_STRINGS if the don't make sense..."); log(""); -log(untranslatedStrings.map(s=>JSON.stringify(s)).join(",\n"));*/ +log(untranslatedStrings.map(e=>`${JSON.stringify(e.str)} (${e.uses} uses)`).join("\n")); log(""); var languages = JSON.parse(fs.readFileSync(BASEDIR+"/lang/index.json").toString()); languages.forEach(language => { + if (language.code=="en_GB") { + console.log("Ignoring "+language.code); + return; + } console.log("Scanning "+language.code); log(language.code); log("=========="); diff --git a/core b/core index 649489412..daedea685 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 649489412e27ef770bc0c8ed12cfca6a17a98c0d +Subproject commit daedea685620abea71c0f876b234fe1dd553d3a2 diff --git a/lang/de_DE.json b/lang/de_DE.json index 80d0e74bb..6eb25eb9c 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -14,7 +14,13 @@ "Sleep" : "Schlummern", "Alarms" : "Wecker", "New Alarm" : "Neuer Wecker", - "ALARM!" : "ALARM!" + "ALARM!" : "ALARM!", + "Yes" : "Ja", + "No" : "Nein", + "On" : "Auf", + "Off" : "aus", + "Ok" : "OK", + "Back" : "zurück" }, "alarm": { "//":"App-specific overrides",