lr-i18n
Version:
Allows to connect your `Laravel` Framework localization files with `React`.
82 lines (69 loc) • 2.27 kB
text/typescript
import fs from 'fs';
import path from 'path';
import { fromString } from 'php-array-reader';
import { dirnameSanitize } from './helper';
/**
*
* Parse array of PHP file.
*
* @param dirname
*/
export default function parser(dirname: string): { path: string; basename: string }[] {
const sanitizedDirname = dirnameSanitize(dirname);
if (!fs.existsSync(sanitizedDirname)) {
return [];
}
return fs
.readdirSync(sanitizedDirname)
.filter((locale) => fs.statSync(path.join(sanitizedDirname, locale)).isDirectory())
.sort()
.map((locale) => {
const translations = convertToDottedKey(getObjectTranslation(path.join(sanitizedDirname, locale)));
return { locale, trans: translations };
})
.filter(({ trans }) => Object.keys(trans).length > 0)
.map(({ locale, trans }) => {
const basename = `php_${locale}.json`;
fs.writeFileSync(path.join(sanitizedDirname, basename), JSON.stringify(trans));
return { basename, path: path.join(sanitizedDirname, basename) };
});
}
/**
*
* @param source
* @param target
* @param keys
*/
function convertToDottedKey(
source: Record<string, unknown>,
target: Record<string, string> = {},
keys: string[] = []
): Record<string, string> {
Object.entries(source).forEach(([key, value]) => {
const newPrefix = [...keys, key];
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
convertToDottedKey(value as Record<string, unknown>, target, newPrefix);
} else {
target[newPrefix.join('.')] = value as string;
}
});
return target;
}
/**
*
* @param dirname
*/
function getObjectTranslation(dirname: string): Record<string, unknown> {
const translations: Record<string, unknown> = {};
fs.readdirSync(dirname).forEach((basename) => {
const absoluteFile = path.join(dirname, basename);
const key = basename.replace(/\.\w+$/, '');
if (fs.statSync(absoluteFile).isDirectory()) {
translations[key] = getObjectTranslation(absoluteFile);
} else {
const fileContent = fs.readFileSync(absoluteFile, 'utf-8');
translations[key] = fromString(fileContent);
}
});
return translations;
}