summaryrefslogtreecommitdiff
path: root/scripts/frontend/extract_gettext_all.js
blob: a8c040b32d46985f449bc45ccab5a8d169b3eb16 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
const argumentsParser = require('commander');

const { GettextExtractor, JsExtractors } = require('gettext-extractor');
const {
  decorateJSParserWithVueSupport,
  decorateExtractorWithHelpers,
} = require('gettext-extractor-vue');
const ensureSingleLine = require('../../app/assets/javascripts/locale/ensure_single_line.js');

const { file, all, outputHelp } = argumentsParser
  .option('-f, --file <file>', 'Extract message from one single file')
  .option('-a, --all', 'Extract message from all js/vue files')
  .parse(process.argv);

const extractor = decorateExtractorWithHelpers(new GettextExtractor());

extractor.addMessageTransformFunction(ensureSingleLine);

const jsParser = extractor.createJsParser([
  // Place all the possible expressions to extract here:
  JsExtractors.callExpression('__', {
    arguments: {
      text: 0,
    },
  }),
  JsExtractors.callExpression('n__', {
    arguments: {
      text: 0,
      textPlural: 1,
    },
  }),
  JsExtractors.callExpression('s__', {
    arguments: {
      text: 0,
    },
  }),
]);

const vueParser = decorateJSParserWithVueSupport(jsParser);

function printJson() {
  const messages = extractor.getMessages().reduce((result, message) => {
    let text = message.text;
    if (message.textPlural) {
      text += `\u0000${message.textPlural}`;
    }

    message.references.forEach(reference => {
      const filename = reference.replace(/:\d+$/, '');

      if (!Array.isArray(result[filename])) {
        result[filename] = [];
      }

      result[filename].push([text, reference]);
    });

    return result;
  }, {});

  console.log(JSON.stringify(messages));
}

if (file) {
  vueParser.parseFile(file).then(() => printJson());
} else if (all) {
  vueParser.parseFilesGlob('{ee/app,app}/assets/javascripts/**/*.{js,vue}').then(() => printJson());
} else {
  console.warn('ERROR: Please use the script correctly:');
  outputHelp();
  process.exit(1);
}