77 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| const fs = require('fs');
 | |
| const fse = require('fs-extra');
 | |
| 
 | |
| const DIR = 'dist/_locales/';
 | |
| const RX_LNG_CODE = /^\w\w(_\w{2,3})?$/; // like `en` or `en_GB`
 | |
| 
 | |
| const makeFileName = lng => `${DIR}${lng}/messages.json`;
 | |
| const readLngJson = lng => fse.readJsonSync(makeFileName(lng));
 | |
| const sortAlpha = ([a], [b]) => a < b ? -1 : a > b;
 | |
| 
 | |
| const src = readLngJson('en');
 | |
| for (const val of Object.values(src)) {
 | |
|   const {placeholders} = val;
 | |
|   if (placeholders) {
 | |
|     const sorted = {};
 | |
|     for (const [k, v] of Object.entries(placeholders).sort(sortAlpha)) {
 | |
|       sorted[k] = v;
 | |
|     }
 | |
|     val.placeholders = sorted;
 | |
|   }
 | |
| }
 | |
| 
 | |
| let numTotal = 0;
 | |
| let numFixed = 0;
 | |
| 
 | |
| for (const /**@type Dirent*/ entry of fs.readdirSync(DIR, {withFileTypes: true})) {
 | |
|   const lng = entry.name;
 | |
|   if (lng !== 'en' && entry.isDirectory() && RX_LNG_CODE.test(lng)) {
 | |
|     numFixed += fixLngFile(lng) ? 1 : 0;
 | |
|     numTotal++;
 | |
|   }
 | |
| }
 | |
| console.log(`${numFixed} files fixed out of ${numTotal}`);
 | |
| 
 | |
| function fixLngFile(lng) {
 | |
|   let numUnknown = 0;
 | |
|   let numUntranslated = 0;
 | |
|   let numVarsFixed = 0;
 | |
|   const json = readLngJson(lng);
 | |
|   const res = {};
 | |
|   for (const [key, val] of Object.entries(json).sort(sortAlpha)) {
 | |
|     const {placeholders, message} = src[key] || {};
 | |
|     if (!message) {
 | |
|       numUnknown++;
 | |
|     } else if (!val.message || val.message === message) {
 | |
|       numUntranslated++;
 | |
|     } else {
 | |
|       delete val.description;
 | |
|       if (placeholders && !val.placeholders) {
 | |
|         numVarsFixed++;
 | |
|         val.placeholders = placeholders;
 | |
|       }
 | |
|       res[key] = val;
 | |
|     }
 | |
|   }
 | |
|   const jsonStr = JSON.stringify(json, null, 2);
 | |
|   const resStr = JSON.stringify(res, null, 2);
 | |
|   if (resStr !== jsonStr) {
 | |
|     let err;
 | |
|     if (resStr === '{}') {
 | |
|       fs.rmdirSync(`${DIR}${lng}`, {recursive: true});
 | |
|       err = 'no translations -> deleted';
 | |
|     } else {
 | |
|       fse.outputFileSync(makeFileName(lng), resStr + '\n');
 | |
|       err = [
 | |
|         numUnknown && `${numUnknown} unknown (dropped)`,
 | |
|         numUntranslated && `${numUntranslated} untranslated (dropped)`,
 | |
|         numVarsFixed && `${numVarsFixed} missing placeholders (restored)`,
 | |
|       ].filter(Boolean).join(', ');
 | |
|     }
 | |
|     if (err) console.log(`${lng}: ${err}`);
 | |
|     return err;
 | |
|   }
 | |
| }
 |