Mailspring/scripts/find-strings.js
Ben Gotow 149b389508
Replace Babel with TypeScript compiler, switch entire app to TypeScript 🎉 (#1404)
* Switch to using Typescript instead of Babel

* Switch all es6 / jsx file extensions to ts / tsx

* Convert Utils to a TS module from module.exports style module

* Move everything from module.exports to typescript exports

* Define .d.ts files for mailspring-exports and component kit… Yes it seems this is the best option :(

* Load up on those @types

* Synthesize TS types from PropTypes for standard components

* Add types to Model classes and move constructor constants to instance vars

* 9800 => 7700 TS errors

* 7700 => 5600 TS errors

* 5600 => 5330 TS errors

* 5330 => 4866 TS errors

* 4866 => 4426 TS errors

* 4426 => 2411 TS errors

* 2411 > 1598 TS errors

* 1598 > 769 TS errors

* 769 > 129 TS errors

* 129 > 22 TS errors

* Fix runtime errors

* More runtime error fixes

* Remove support for custom .es6 file extension

* Remove a few odd remaining references to Nylas

* Don’t ship Typescript support in the compiled app for now

* Fix issues in compiled app - module resolution in TS is case sensitive?

* README updates

* Fix a few more TS errors

* Make “No Signature” option clickable + selectable

* Remove flicker when saving file and reloading keymaps

* Fix mail rule item height in preferences

* Fix missing spacing in thread sharing popover

* Fix scrollbar ticks being nested incorrectly

* Add Japanese as a manually reviewed language

* Prevent the thread list from “sticking”

* Re-use Sheet when switching root tabs, prevent sidebar from resetting

* Ensure specs run

* Update package configuration to avoid shpping types

* Turn eslint back on - we will opt-in to the TS rules one by one
2019-03-04 11:03:12 -08:00

90 lines
2.7 KiB
JavaScript

const fs = require('fs');
const path = require('path');
let files = [];
const PATH_TO_LANG = __dirname + '/../app/lang';
const PATH_TO_ENGLISH = `${PATH_TO_LANG}/en.json`;
function collectFiles(dir) {
fs.readdirSync(dir).forEach(file => {
const p = path.join(dir, file);
if (fs.lstatSync(p).isDirectory()) {
collectFiles(p);
} else if (p.endsWith('.js') || p.endsWith('.jsx') || p.endsWith('.ts') || p.endsWith('.tsx')) {
files.push(p);
}
});
}
function writeTerms(terms, destPath) {
const ordered = {};
Object.keys(terms)
.sort()
.forEach(function(key) {
ordered[key] = terms[key];
});
fs.writeFileSync(destPath, JSON.stringify(ordered, null, 2));
}
collectFiles(__dirname + '/../app/src');
collectFiles(__dirname + '/../app/internal_packages');
collectFiles(__dirname + '/../app/menus');
let sourceTerms = [];
let found = 0;
const start = /localized(?:ReactFragment)?\((['`"]{1})/g;
files.forEach(file => {
let js = fs.readFileSync(file).toString();
js = js.replace(/ *\n */g, '');
let match = null;
while ((match = start.exec(js))) {
const paren = match[1];
const startIndex = match.index + match[0].length;
const end = new RegExp(`[^\\${paren}]${paren}`);
const endIndex = end.exec(js.substr(startIndex)).index + startIndex + 1;
let base = js.substr(startIndex, endIndex - startIndex);
// Replace "\n" in the string with an actual \n, simulating what JS would do
// when evaluating it in quotes.
base = base.replace(/\\n/g, '\n').replace(/\\r/g, '\r');
found += 1;
sourceTerms[base] = base;
}
});
console.log('\nUpdating en.json to match strings in source:');
console.log(`- ${found} localized() calls, ${Object.keys(sourceTerms).length} strings`);
writeTerms(sourceTerms, PATH_TO_ENGLISH);
// Open other localization files, remove unneeded entries
// and summarize localization progress
console.log('\nPruning localized strings files:');
console.log('\nLang\t\tStrings\t\t\tPercent');
console.log('------------------------------------------------');
fs.readdirSync(PATH_TO_LANG).forEach(filename => {
if (!filename.endsWith('.json')) return;
const localePath = path.join(PATH_TO_LANG, filename);
const localized = JSON.parse(fs.readFileSync(localePath).toString());
const inuse = {};
Object.keys(localized).forEach(term => {
if (sourceTerms[term]) {
inuse[term] = localized[term];
}
});
writeTerms(inuse, localePath);
const c = Object.keys(inuse).length;
const t = Object.keys(sourceTerms).length;
const lang = path.basename(filename, '.json');
console.log(
`- ${lang}\t${lang.length < 6 ? '\t' : ''}${c}\t/ ${t}\t\t${Math.round(c / t * 100)}%`
);
});