Skip to content

Commit 8bb37d6

Browse files
committed
Add messages2tsv.js and tsv2messages.js
1 parent 11b1a92 commit 8bb37d6

2 files changed

Lines changed: 101 additions & 0 deletions

File tree

tools/messages2tsv.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
const fs = require('fs');
2+
3+
function writeTSV(messages, stream) {
4+
const langCodes = getLangCodes(messages);
5+
const messageKeys = getAllMessageKeys(messages, langCodes);
6+
// Header
7+
stream.write("keys");
8+
for (const lang of langCodes) {
9+
stream.write(`\t${lang}`);
10+
}
11+
stream.write("\n");
12+
// Messages
13+
for (const key of messageKeys) {
14+
stream.write(key);
15+
for (const lang of langCodes) {
16+
stream.write("\t");
17+
if (Object.hasOwn(messages[lang], key)) {
18+
stream.write(messages[lang][key]);
19+
} else {
20+
stream.write("MISSING");
21+
}
22+
}
23+
stream.write("\n");
24+
}
25+
}
26+
27+
function getLangCodes(messages) {
28+
return Object.keys(messages).sort();
29+
}
30+
31+
function getAllMessageKeys(messages, langCodes) {
32+
const messageKeys = new Set();
33+
for (const lang of langCodes) {
34+
for (const key of Object.keys(messages[lang])) {
35+
messageKeys.add(key);
36+
}
37+
}
38+
return Array.from(messageKeys).sort();
39+
}
40+
41+
if (process.argv.length !== 4) {
42+
process.stderr.write("usage: messages2tsv.js output-file input-file\n");
43+
process.exit(2);
44+
}
45+
46+
const outputFilename = process.argv[2];
47+
const inputFilename = process.argv[3];
48+
49+
const messages = JSON.parse(fs.readFileSync(inputFilename, {encoding: 'utf8'}));
50+
const outStream = fs.createWriteStream(outputFilename, {encoding: 'utf8'});
51+
52+
writeTSV(messages, outStream);

tools/tsv2messages.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
const fs = require('fs');
2+
const readline = require('readline');
3+
4+
function readMessagesFromTSV(stream, callback) {
5+
let langCodes = [];
6+
const messages = {};
7+
8+
const rl = readline.createInterface({
9+
input: stream,
10+
crlfDelay: Infinity
11+
});
12+
13+
let firstLine = true;
14+
rl.on('line', (line) => {
15+
const cols = line.split("\t");
16+
if (firstLine) {
17+
langCodes = cols.slice(1);
18+
for (const lang of langCodes) {
19+
messages[lang] = {};
20+
}
21+
firstLine = false;
22+
} else {
23+
if (cols.length > 0) {
24+
const key = cols[0];
25+
for (let i = 0; i < langCodes.length; i++) {
26+
messages[langCodes[i]][key] = cols[i+1];
27+
}
28+
}
29+
}
30+
});
31+
32+
rl.on('close', () => {
33+
callback(messages);
34+
});
35+
}
36+
37+
if (process.argv.length !== 4) {
38+
process.stderr.write("usage: tsv2messages.js output-file input-file\n");
39+
process.exit(2);
40+
}
41+
42+
const outputFilename = process.argv[2];
43+
const inputFilename = process.argv[3];
44+
45+
const inStream = fs.createReadStream(inputFilename, {encoding: 'utf8'});
46+
47+
readMessagesFromTSV(inStream, (messages) => {
48+
fs.writeFileSync(outputFilename, JSON.stringify(messages, null, 4), {encoding: 'utf8'});
49+
});

0 commit comments

Comments
 (0)