66 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // 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.js');
 | |
| 
 | |
| 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 => /\.js(?:on)?$/.test(filename) && !/defaultMessages|whitelist|index/.test(filename)
 | |
|   );
 | |
|   const outPath = resolve('tmp', 'locales', entry);
 | |
| 
 | |
|   rimraf.sync(outPath);
 | |
|   mkdirp.sync(outPath);
 | |
| 
 | |
|   locales.forEach(function (locale) {
 | |
|     const localeName = locale.replace(/\.js(?:on)?$/, '');
 | |
|     const localePath = join(outPath, `${localeName}.js`);
 | |
|     const baseLocale = localeName.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/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}/${localeName}.js
 | |
| // automatically generated by generateLocalePacks.js
 | |
| //
 | |
| 
 | |
| import messages from '../../../${flavour.locales}/${locale.replace(/\.js$/, '')}';
 | |
| import localeData from '${localeDataPath}';
 | |
| import { setLocale } from 'locales';
 | |
| 
 | |
| setLocale({
 | |
|   localeData,
 | |
|   messages,
 | |
| });
 | |
| `;
 | |
|     writeFileSync(localePath, localeContent, 'utf8');
 | |
|     map[`locales/${entry}/${localeName}`] = localePath;
 | |
|   });
 | |
| 
 | |
|   return map;
 | |
| }, {});
 |