/* eslint no-console: 0 */ import fs from "fs"; import path from "path"; import yargs from "yargs"; import { copyAndroidTitle, removeUnsupportedDirectories, renameDirectories, } from "./i18ncli/fastlane"; import { jsonifyLocalizations, normalize, normalizeFileNames, supportedLocales, untranslatable, unused, validate, } from "./i18ncli/ftl"; // Write src/i18n/loadTranslations.ts, a file with a function that // statically loads translation files given a locale const writeLoadTranslations = async ( ) => { const locales = await supportedLocales( ); const outPath = path.join( __dirname, "..", "src", "i18n", "loadTranslations.ts" ); const out = fs.createWriteStream( outPath ); const repoRoot = path.join( __dirname, ".." ); const commentPath = path.relative( repoRoot, __filename ); out.write( `// AUTO-GENERATED. See ${commentPath}\n` ); out.write( "export default ( locale: string ): Record => {\n" ); locales.forEach( locale => out.write( ` if ( locale === "${locale}" ) { return require( "./l10n/${locale}.ftl.json" ); }\n`, ), ); out.write( " return require( \"./l10n/en.ftl.json\" );\n" ); out.write( "};\n" ); out.write( "\n" ); out.write( "export const SUPPORTED_LOCALES = [\n" ); out.write( locales.sort( ).map( l => ` "${l}",` ).join( "\n" ) ); out.write( "\n];\n" ); }; // eslint-disable-next-line no-unused-expressions, @typescript-eslint/no-unused-expressions yargs .usage( "Usage: $0 [args]" ) .option( "verbose", { alias: "v", type: "boolean", description: "Run with verbose logging", } ) .command( "build", "Prepare existing localizations for use in the app", // eslint-disable-next-line @typescript-eslint/no-empty-function ( ) => {}, async argv => { // Make sure all files are iNat locales before validating and // normalizing FT await normalizeFileNames( ); await validate( ); await normalize( ); await untranslatable( ); await unused( ); jsonifyLocalizations( argv ); writeLoadTranslations( ); }, ) .command( "checkify", "Prepend translations w/ ✅ to help see unglobalized text", ( ) => undefined, async argv => { jsonifyLocalizations( { ...argv, checkify: true } ); writeLoadTranslations( ); }, ) .command( "validate", "Validate source strings", ( ) => undefined, _argv => { validate( ); }, ) .command( "unused", "List unused translation keys", ( ) => undefined, _argv => { unused( ); }, ) .command( "untranslatable", "List translation keys in source code but not in strings.ftl", ( ) => undefined, _argv => { untranslatable( ); }, ) .command( "prepare-fastlane-metadata", "Prepare existing localizations for uploading metadata via Fastlane", // eslint-disable-next-line @typescript-eslint/no-empty-function ( ) => {}, async argv => { console.log( "Renaming directories..." ); await renameDirectories( argv ); console.log( "Removing unsupported directories..." ); await removeUnsupportedDirectories( argv ); console.log( "Copying Android title..." ); await copyAndroidTitle( argv ); }, ) .help( ) .argv;