UNPKG

3.46 kBJavaScriptView Raw
1
2const https = require('https');
3const fs = require('fs');
4const _ = require('lodash');
5const async = require('async');
6const csvWriter = require('csv-write-stream');
7
8const config = require('../src/config');
9
10const readJson = (path, callback) => {
11 fs.readFile(path, (err, data) => {
12 callback(err, JSON.parse(data));
13 });
14};
15
16//
17const parseJson = (json) => {
18 const translations = {};
19 // parse
20 json.feed.entry.forEach(entry => {
21 const key = _.get(entry, 'gsx$key.$t');
22 config.i18n.whitelist.forEach((lang) => {
23 const value = _.get(entry, `gsx$${lang}.$t`);
24 if (value) {
25 _.setWith(translations, `${lang}.${key}`, value, Object);
26 }
27 });
28 });
29 return translations;
30};
31
32const writeTranslationFiles = (translations) => {
33 // write translation files
34 config.i18n.whitelist.forEach((lang) => {
35 const dir = `./locales/${lang}`;
36 if (!fs.existsSync(dir)) {
37 console.warn('Missing directory: ' + dir);
38 return;
39 }
40 translations[lang]._meta = {
41 generated_at: new Date(),
42 lang
43 };
44 const data = JSON.stringify(translations[lang], null, 2);
45 const filename = `${dir}/translation.json`;
46 console.log(`Writing ${filename}`);
47
48 fs.writeFileSync(filename, data );
49 });
50}
51
52
53// verbs
54const verbs = {
55
56 // igo i18n update
57 update: function(args, callback) {
58 if (!config.i18n.spreadsheet_id) {
59 return callback('Missing config.i18n.spreadsheet_id');
60 }
61 const url = `https://spreadsheets.google.com/feeds/list/${config.i18n.spreadsheet_id}/default/public/values?alt=json`;
62
63 // request json data
64 https.get(url, (resp) => {
65 let body = '';
66
67 resp.on('data', (chunk) => {
68 body += chunk;
69 });
70
71 resp.on('end', () => {
72 const json = JSON.parse(body);
73 //console.dir(json);
74
75 const translations = parseJson(json);
76 writeTranslationFiles(translations);
77
78 callback();
79 })
80
81
82 }).on('error', callback);
83 },
84
85 // igo i18n csv
86 csv: function(args, callback) {
87 const langs = config.i18n.whitelist;
88 async.mapSeries(langs, (lang, callback) => {
89 readJson(`./locales/${lang}/translation.json`, callback);
90 }, (err, translations) => {
91 const keys = [];
92
93 // build keys
94 const traverse = (obj, parents) => {
95 for (const key in obj) {
96 const val = obj[key];
97 if (_.isObject(val)) {
98 traverse(obj[key], parents.concat([key]));
99 } else if (_.isString(val)) {
100 keys.push(parents.concat([key]).join('.'));
101 }
102 }
103 };
104 traverse(translations[0], []);
105
106 // build csv
107 const writer = csvWriter({ headers: [ 'key' ].concat(langs) });
108
109 writer.pipe(fs.createWriteStream('./translations.csv'))
110 keys.forEach(key => {
111 const row = _.map(translations, translation => _.get(translation, key))
112 writer.write([ key ].concat(row))
113 });
114
115 writer.end()
116 console.log(keys.length + ' lines written');
117 callback();
118 });
119 }
120
121};
122
123// igo i18n
124module.exports = function(argv) {
125 var args = argv._;
126 config.init();
127
128 if (args.length > 1 && verbs[args[1]]) {
129 verbs[args[1]](args, function(err) {
130 console.log(err || 'Done.');
131 // process.exit(0);
132 });
133 } else {
134 console.error('ERROR: Wrong options');
135 console.error('Usage: igo i18n [update|csv]')
136 }
137
138
139};