@dmvicent3/tcli
Version:
A CLI tool for managing translations in projects using next-translate
49 lines (48 loc) • 1.72 kB
JavaScript
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, } from 'fs';
import { join } from 'path';
export function ensureDir(path) {
if (!existsSync(path)) {
mkdirSync(path, { recursive: true });
}
}
export function loadTranslationFile(langDir, lang, namespace) {
const filePath = join(langDir, lang, `${namespace}.json`);
if (!existsSync(filePath))
return {};
return JSON.parse(readFileSync(filePath, 'utf-8'));
}
export function saveTranslationFile(langDir, lang, namespace, data) {
const langPath = join(langDir, lang);
ensureDir(langPath);
const sorted = sortObjectKeys(data);
const filePath = join(langPath, `${namespace}.json`);
writeFileSync(filePath, JSON.stringify(sorted, null, 2));
}
function sortObjectKeys(obj) {
if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {
return obj;
}
const sorted = {};
Object.keys(obj)
.sort()
.forEach((key) => {
sorted[key] = sortObjectKeys(obj[key]);
});
return sorted;
}
export function scanExistingStructure(langDir) {
if (!existsSync(langDir))
return { langs: [], namespaces: [] };
const langs = readdirSync(langDir, { withFileTypes: true })
.filter((dirent) => dirent.isDirectory())
.map((dirent) => dirent.name);
const namespaces = new Set();
langs.forEach((lang) => {
const langPath = join(langDir, lang);
const files = readdirSync(langPath)
.filter((file) => file.endsWith('.json'))
.map((file) => file.replace('.json', ''));
files.forEach((ns) => namespaces.add(ns));
});
return { langs, namespaces: Array.from(namespaces) };
}