mirror of
				https://codeberg.org/yeentown/barkey.git
				synced 2025-10-23 09:44:51 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			59 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import locales from './index.js';
 | |
| 
 | |
| const showUntranslated = process.argv[2] == '-v';
 | |
| 
 | |
| let valid = true;
 | |
| 
 | |
| function writeError(type, lang, tree, data) {
 | |
| 	process.stderr.write(JSON.stringify({ type, lang, tree, data }));
 | |
| 	process.stderr.write('\n');
 | |
| 	valid = false;
 | |
| }
 | |
| 
 | |
| function verify(expected, actual, lang, trace) {
 | |
| 	for (let key in expected) {
 | |
| 		if (!Object.prototype.hasOwnProperty.call(actual, key)) {
 | |
| 			continue;
 | |
| 		}
 | |
| 		if (typeof expected[key] === 'object') {
 | |
| 			if (typeof actual[key] !== 'object') {
 | |
| 				writeError('mismatched_type', lang, trace ? `${trace}.${key}` : key, { expected: 'object', actual: typeof actual[key] });
 | |
| 				continue;
 | |
| 			}
 | |
| 			verify(expected[key], actual[key], lang, trace ? `${trace}.${key}` : key);
 | |
| 		} else if (typeof expected[key] === 'string') {
 | |
| 			switch (typeof actual[key]) {
 | |
| 				case 'object':
 | |
| 					writeError('mismatched_type', lang, trace ? `${trace}.${key}` : key, { expected: 'string', actual: 'object' });
 | |
| 					break;
 | |
| 				case 'undefined':
 | |
| 					continue;
 | |
| 				case 'string':
 | |
| 					const expectedParameters = new Set(expected[key].match(/\{[^}]+\}/g)?.map((s) => s.slice(1, -1)));
 | |
| 					const actualParameters = new Set(actual[key].match(/\{[^}]+\}/g)?.map((s) => s.slice(1, -1)));
 | |
| 					for (let parameter of expectedParameters) {
 | |
| 						if (!actualParameters.has(parameter)) {
 | |
| 							writeError('missing_parameter', lang, trace ? `${trace}.${key}` : key, { parameter });
 | |
| 						}
 | |
| 					}
 | |
| 
 | |
| 				if (showUntranslated && actual[key] == expected[key]) {
 | |
| 					writeError('untranslated', lang, trace ? `${trace}.${key}` : key, { original: expected[key] });
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| const { ['ja-JP']: original, ...verifiees } = locales;
 | |
| 
 | |
| for (let lang in verifiees) {
 | |
| 	if (!Object.prototype.hasOwnProperty.call(locales, lang)) {
 | |
| 		continue;
 | |
| 	}
 | |
| 	verify(original, verifiees[lang], lang);
 | |
| }
 | |
| 
 | |
| if (!valid) {
 | |
| 	process.exit(1);
 | |
| }
 |