83 lines
2.4 KiB
TypeScript
83 lines
2.4 KiB
TypeScript
import fs from 'fs';
|
|
import path from 'path';
|
|
|
|
const LOCALES_DIR = path.join( __dirname, '..', 'locales', 'en' );
|
|
const GENERATED_DIR = path.join( __dirname, '..', 'src', 'locales', 'generated' );
|
|
|
|
function toPascalCase( name: string ): string
|
|
{
|
|
return name
|
|
.split( /[-_]/ )
|
|
.map( part => part.charAt( 0 ).toUpperCase() + part.slice( 1 ) )
|
|
.join( '' );
|
|
}
|
|
|
|
function toMemberName( fileName: string ): string
|
|
{
|
|
const withUnderscores = fileName.replace( /\./g, '_' );
|
|
return withUnderscores.replace( /-([a-zA-Z])/g, ( _, c: string ) => c.toUpperCase() );
|
|
}
|
|
|
|
function generateDir( absLocaleDir: string, enRoot: string, absOutDir: string, className: string ): void
|
|
{
|
|
const files: { memberName: string; relativePath: string }[] = [];
|
|
const dirs: { dirName: string; childClassName: string }[] = [];
|
|
|
|
for ( const entry of fs.readdirSync( absLocaleDir ) )
|
|
{
|
|
if ( entry.endsWith( '.md' ) ) continue;
|
|
|
|
const abs = path.join( absLocaleDir, entry );
|
|
|
|
if ( fs.statSync( abs ).isDirectory() )
|
|
{
|
|
const childClassName = toPascalCase( entry );
|
|
dirs.push( { dirName: entry, childClassName } );
|
|
generateDir( abs, enRoot, path.join( absOutDir, entry ), childClassName );
|
|
}
|
|
else
|
|
{
|
|
const rel = path.relative( enRoot, abs ).replace( /\\/g, '/' );
|
|
files.push( { memberName: toMemberName( entry ), relativePath: rel } );
|
|
}
|
|
}
|
|
|
|
const lines: string[] = [];
|
|
lines.push( '// Auto-generated by localeGenerator — do not edit manually.' );
|
|
|
|
if ( dirs.length > 0 )
|
|
{
|
|
lines.push( '' );
|
|
|
|
for ( const { dirName, childClassName } of dirs )
|
|
{
|
|
lines.push( `import { ${childClassName} } from './${dirName}/${childClassName}.js';` );
|
|
}
|
|
}
|
|
|
|
lines.push( '' );
|
|
lines.push( `export class ${className}` );
|
|
lines.push( '{' );
|
|
|
|
for ( const { memberName, relativePath } of files )
|
|
{
|
|
lines.push( ` static readonly ${memberName} = '${relativePath}';` );
|
|
}
|
|
|
|
for ( const { childClassName } of dirs )
|
|
{
|
|
lines.push( ` static readonly ${childClassName} = ${childClassName};` );
|
|
}
|
|
|
|
lines.push( '}' );
|
|
|
|
fs.mkdirSync( absOutDir, { recursive: true } );
|
|
fs.writeFileSync( path.join( absOutDir, `${className}.ts` ), lines.join( '\n' ) + '\n', 'utf8' );
|
|
}
|
|
|
|
export function generateLocales(): void
|
|
{
|
|
if ( !fs.existsSync( LOCALES_DIR ) ) return;
|
|
generateDir( LOCALES_DIR, LOCALES_DIR, GENERATED_DIR, 'Locales' );
|
|
}
|