about summary refs log tree commit diff
path: root/config/webpack/generateLocalePacks.js
blob: fedf0c7a153bd1b4eff206c044c89294c0e5545f (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
71
72
73
74
// A message from upstream:
// ========================
// 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.

// Glitch note:
// ============
// This code has been entirely rewritten to support glitch flavours.
// However, the underlying process is exactly the same.

const { existsSync, readdirSync, writeFileSync } = require('fs');
const { join, resolve } = require('path');
const rimraf = require('rimraf');
const mkdirp = require('mkdirp');
const { flavours } = require('./configuration');

module.exports = Object.keys(flavours).reduce(function (map, entry) {
  const flavour = flavours[entry];
  if (!flavour.locales) {
    return map;
  }
  const locales = readdirSync(flavour.locales).filter(filename => {
    return /\.json$/.test(filename) &&
      !/defaultMessages/.test(filename) &&
      !/whitelist/.test(filename);
  }).map(filename => filename.replace(/\.json$/, ''));

  let inherited_locales_path = null;
  if (flavour.inherit_locales && flavours[flavour.inherit_locales]?.locales) {
    inherited_locales_path = flavours[flavour.inherit_locales]?.locales;
  }

  const outPath = resolve('tmp', 'locales', entry);

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

  locales.forEach(function (locale) {
    const localePath = join(outPath, `${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 => existsSync(filename),
    ).map(
      filename => filename.replace(/(?:node_modules|app\/javascript)\//, ''),
    )[0];
    const localeContent = `//
// locales/${entry}/${locale}.js
// automatically generated by generateLocalePacks.js
//

${inherited_locales_path ? `import inherited from '../../../${inherited_locales_path}/${locale}.json';` : ''}
import messages from '../../../${flavour.locales}/${locale}.json';
import localeData from '${localeDataPath}';
import { setLocale } from 'locales';

setLocale({
  localeData,
  ${inherited_locales_path ? 'messages: Object.assign({}, inherited, messages)' : 'messages'},
});
`;
    writeFileSync(localePath, localeContent, 'utf8');
    map[`locales/${entry}/${locale}`] = localePath;
  });

  return map;
}, {});