about summary refs log tree commit diff
path: root/config/webpack/generateLocalePacks.js
blob: a943589f74c595563f4fbd665a7985060910e604 (plain) (blame)
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
// To avoid adding a lot of boilerplate, locale packs are
// automatically generated here. These are written into the tmp/
// directory and then used to generate locale_en.js, locale_fr.js, etc.

const fs = require('fs');
const path = require('path');
const rimraf = require('rimraf');
const mkdirp = require('mkdirp');

const localesJsonPath = path.join(__dirname, '../../app/javascript/mastodon/locales');
const locales = fs.readdirSync(localesJsonPath).filter(filename => {
  return /\.json$/.test(filename) &&
    !/defaultMessages/.test(filename) &&
    !/whitelist/.test(filename);
}).map(filename => filename.replace(/\.json$/, ''));

const outPath = path.join(__dirname, '../../tmp/packs');

rimraf.sync(outPath);
mkdirp.sync(outPath);

const outPaths = [];

locales.forEach(locale => {
  const localePath = path.join(outPath, `locale_${locale}.js`);
  const baseLocale = locale.split('-')[0]; // e.g. 'zh-TW' -> 'zh'
  const localeDataPath = [
    // first try react-intl
    `../../node_modules/react-intl/locale-data/${baseLocale}.js`,
    // then check locales/locale-data
    `../../app/javascript/mastodon/locales/locale-data/${baseLocale}.js`,
    // fall back to English (this is what react-intl does anyway)
    '../../node_modules/react-intl/locale-data/en.js',
  ].filter(filename => fs.existsSync(path.join(outPath, filename)))
    .map(filename => filename.replace(/..\/..\/node_modules\//, ''))[0];

  let glitchInject = `
const mergedMessages = messages;
`;

  const glitchPath = `../../app/javascript/glitch/locales/${locale}.json`;
  if (fs.existsSync(path.join(outPath, glitchPath))) {
    glitchInject = `
import glitchMessages from ${JSON.stringify(glitchPath)};

let mergedMessages = messages;
Object.keys(glitchMessages).forEach(function (key) {
   mergedMessages[key] = glitchMessages[key];
});

`;
  }

  const localeContent = `//
// locale_${locale}.js
// automatically generated by generateLocalePacks.js
//
import messages from '../../app/javascript/mastodon/locales/${locale}.json';
import localeData from ${JSON.stringify(localeDataPath)};
import { setLocale } from 'locales';
${glitchInject}
setLocale({messages: mergedMessages, localeData: localeData});
`;
  fs.writeFileSync(localePath, localeContent, 'utf8');
  outPaths.push(localePath);
});

module.exports = outPaths;