mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2026-05-28 18:26:54 +00:00
feat: manual i18n sync tool (#52637)
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
import { exec } from 'child_process';
|
||||
import { readdir, stat } from 'fs/promises';
|
||||
import { join } from 'path';
|
||||
import { promisify } from 'util';
|
||||
|
||||
const asyncExec = promisify(exec);
|
||||
|
||||
const loadDirectory = async (path: string): Promise<string[]> => {
|
||||
const files: string[] = [];
|
||||
const status = await stat(path);
|
||||
if (status.isDirectory()) {
|
||||
const filesInDir = await readdir(path);
|
||||
for (const file of filesInDir) {
|
||||
files.push(...(await loadDirectory(join(path, file))));
|
||||
}
|
||||
} else {
|
||||
files.push(path);
|
||||
}
|
||||
return files;
|
||||
};
|
||||
|
||||
const syncChallenges = async () => {
|
||||
const ignore = ['.markdownlint.yaml', '_meta', 'english'];
|
||||
const basePath = join(process.cwd(), 'curriculum', 'challenges');
|
||||
const allLangs = await readdir(basePath);
|
||||
const filtered = allLangs.filter(lang => !ignore.includes(lang));
|
||||
// these will be paths
|
||||
const english = await loadDirectory(join(basePath, 'english'));
|
||||
for (const path of english) {
|
||||
for (const lang of filtered) {
|
||||
const targetPath = path.replace('english', lang);
|
||||
// we swallow the error here to detect if the file doesn't exist
|
||||
const status = await stat(targetPath).catch(() => null);
|
||||
if (!status) {
|
||||
console.log(`Syncing ${path.split('/english/')[1]}`);
|
||||
await asyncExec(`mkdir -p ${targetPath} && cp ${path} ${targetPath}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void (async () => {
|
||||
await syncChallenges();
|
||||
})();
|
||||
Reference in New Issue
Block a user