diff --git a/scripts/unused-translations.js b/scripts/unused-translations.js new file mode 100644 index 000000000..8cb2fbc75 --- /dev/null +++ b/scripts/unused-translations.js @@ -0,0 +1,138 @@ +var Messages = require("../www/common/translations/messages.json"); +var Exec = require("child_process").exec; + +var ignoreLines = function (source, pattern) { + if (!pattern.test(source)) { return source; } + return source.split('\n') + .map(function (line) { + if (pattern.test(line)) { return ''; } + return line; + }) + .filter(Boolean) + .join("\n"); +}; + +var GENERATED_PATTERNS = [ + /(admin|settings)_.*(Hint|Title|Button)/, + /settings_colortheme/, + /loading_(state|drive|pad)_/, + /(admin|notifications|support|team|settings)_cat_/, + /features_f/, +]; +var isPossiblyGenerated = function (key) { + return GENERATED_PATTERNS.some(function (patt) { + return patt.test(key); + }); +}; + +var grep = function (pattern, cb) { + var exclude = [ + 'www/common/translations/*', + 'www/common/onlyoffice/*', + 'www/lib/*', + 'www/common/pdfjs/*', + '*.css', + 'www/common/highlight/*', + '*.min.js', + '.lesshintrc', + 'CHANGELOG.md', + 'LICENSE', + 'package*.json', + 'www/debug/chainpad.dist.js', + 'www/pad/mathjax/*', + 'www/common/hyperscript.js', + 'www/common/jscolor.js', + './/scripts/*', + './lib/*', + './docs/*', + './github/*', + '*.svg', + '*.md', + './config/*', + ].map(function (patt) { + return "':(exclude)" + patt + "'"; + }).join(' '); + + // grep this repository, ignoring binary files and excluding anything matching the above patterns + var ignoreBinaries= '--binary-files=without-match '; + var command = 'git grep ' + pattern + " -- ':/' " + exclude; + + Exec(command, function (err, stdout, stderr) { + if (err && err.code === 1 && err.killed === false) { + if (isPossiblyGenerated(pattern)) { + return cb(void 0, true, 'POSSIBLY_GENERATED'); + } + return cb(void 0, true, "NOT_FOUND", stdout); + } + stdout = ignoreLines(stdout, /Binary file/); + + if (err) { + if (err.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER') { + return cb(void 0, true, 'TOO_MUCH', stdout); + } + return void cb(err); + } + if (/data\-localization/.test(stdout)) { + return cb(void 0, true, "DATA_LOCALIZATION", stdout); + } + if (/(Messages|Msg|messages)\./.test(stdout)) { + return cb(void 0, false); + } + + //console.log(pattern, arguments); + cb(void 0, true, 'OTHER', stdout); + }); +}; + +var keys = Object.keys(Messages).sort(); +var total = keys.length; + +var limit = total; + +var lineCount = function (s) { + var i = 0; + s.replace(/\n/g, function () { i++; return ''; }); + return i; +}; + +var conditionallyPrintContent = function (output) { + if (!output) { return; } + if (lineCount(output) < 12) { + output.split('\n').map(function (line) { + if (!line) { return; } + console.log('\t> ' + line); + }); + //console.log(output); + console.log(); + } else { + console.log("\t> too much content to print"); + } +}; + +var next = function () { + var key = keys[0]; + if (!key) { return; } + keys.shift(); + + if (!limit--) { return void console.log("[DONE]"); } + + grep(key, function (err, flagged, reason, output) { + if (err) { + return; + console.error("[%s]", key, err); + console.log(); + } else if (!flagged) { + + } else if (reason === 'OTHER') { + console.log('[%s] flagged for [OTHER]', key); + conditionallyPrintContent(output); + } else { + console.log("[%s] flagged for [%s]", key, reason || '???'); + conditionallyPrintContent(output); + } + + next(); + }); +}; + +next();