diff --git a/src/cli/commands/export.ts b/src/cli/commands/export.ts index 5750129..0dea6b0 100644 --- a/src/cli/commands/export.ts +++ b/src/cli/commands/export.ts @@ -1,6 +1,6 @@ import { stream } from 'fast-glob' import { promises as fs, existsSync } from 'fs' -import {resolve, dirname, join, relative} from 'path' +import { dirname, join, relative, extname} from 'path' import unixify from 'unixify' import { getVueMessages, mergeFtl } from '../..' @@ -14,24 +14,34 @@ const log = console.log.bind(console) export const run = async (flags: Options) => { let count = 0 - for await (const file of stream(unixify(flags.inDir) + '/**', {ignore: ['**/node_modules']})) { + for await (const file of stream(unixify(flags.inDir) + '/**', {ignore: ['**/node_modules', unixify(flags.outDir)]})) { count ++ const data = await fs.readFile(file) + const isVueFile = extname(file.toString()) === '.vue' + const isFtlFile = extname(file.toString()) === '.ftl' + if(isVueFile) { + const vueMessages = getVueMessages(data.toString()) + for (const { locale, source, messages } of vueMessages) { + const outputPath = join(flags.outDir, locale, relative(flags.inDir, `${file}.ftl`)) + await fs.mkdir(dirname(outputPath), { recursive: true }) + if (flags.clean || !existsSync(outputPath)) { + await fs.writeFile(outputPath, source) + } else { + const existingFtlData = await fs.readFile(outputPath) - const vueMessages = getVueMessages(data.toString()) - for (const { locale, source, messages } of vueMessages) { - const outputPath = join(flags.outDir, locale, relative(flags.inDir, `${file}.ftl`)) - await fs.mkdir(dirname(outputPath), { recursive: true }) - if (flags.clean || !existsSync(outputPath)) { - await fs.writeFile(outputPath, source) - } else { - const existingFtlData = await fs.readFile(outputPath) - - const newData = mergeFtl(existingFtlData.toString(), messages) + const newData = mergeFtl(existingFtlData.toString(), messages) - await fs.writeFile(outputPath, newData) + await fs.writeFile(outputPath, newData) + } } } + else if(isFtlFile) { + const fileData = file.toString().split('.') + const locale = fileData[fileData.length - 2] + const outputPath = join(flags.outDir, locale, relative(flags.inDir, `${file}`)) + await fs.mkdir(dirname(outputPath), { recursive: true }) + await fs.copyFile(file, outputPath) + } } log(`Extracted messages from ${count} files`) diff --git a/src/cli/commands/import.ts b/src/cli/commands/import.ts index d2fcfeb..193f499 100644 --- a/src/cli/commands/import.ts +++ b/src/cli/commands/import.ts @@ -1,8 +1,8 @@ import { stream } from 'fast-glob' import { promises as fs } from 'fs' -import { resolve, dirname, basename, extname, sep, relative, join } from 'path' +import { dirname, basename, extname, sep, relative, join } from 'path' import unixify from 'unixify' -import { getFtlMessages, mergeVue } from '../..' +import {getFtlMessages, mergeFtl, mergeVue} from '../..' interface Options { outDir: string, @@ -17,20 +17,34 @@ export const run = async (flags: Options) => { count ++ const fileString = file.toString() const fileDirName= dirname(file.toString()) - const vueComponentName = basename(fileString).replace(extname(fileString), '') const outputPath = join(relative(flags.inDir, fileDirName), vueComponentName) const [locale, ...rest] = outputPath.split(sep) const realOutputPath = join(flags.outDir, rest.join(sep)) - const vueFile = await fs.readFile(realOutputPath) const data = await fs.readFile(file) const ftlMessages = getFtlMessages(data.toString()) - const newData = mergeVue(vueFile.toString(), locale, ftlMessages) - await fs.writeFile(realOutputPath, newData) + if(checkExistingFtlFile(file.toString())) { + const existingFtlData = await fs.readFile(realOutputPath + '.ftl') + const newData = mergeFtl(existingFtlData.toString(), ftlMessages) + + await fs.writeFile(realOutputPath + '.ftl', newData) + } + else { + const vueFile = await fs.readFile(realOutputPath) + const newData = mergeVue(vueFile.toString(), locale, ftlMessages) + + await fs.writeFile(realOutputPath, newData) + } } log(`Imported messages to ${count} files`) } +const checkExistingFtlFile = (file: string):boolean => { + const fileData = file.split('.') + const locale = fileData[fileData.length - 2] + return extname(file) === '.ftl' && locale !== 'vue' +} + diff --git a/src/cli/index.ts b/src/cli/index.ts index a5651ce..3d4c350 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -7,14 +7,14 @@ import { run as runImport } from './commands/import' const cli = cac('fluent-vue') cli - .command('export', 'Exports translation from Vue.js SFC files into ftl files.') + .command('export', 'Exports translation from Vue.js SFC files into ftl files and copy existing ftl files.') .option('--in-dir', 'Input directory with vue files', { default: 'example/' }) .option('--out-dir', 'Output directory for extracted ftl files', { default: 'translations/' }) .option('--clean', 'Whether to clean output directory', { default: true }) .action(runExport) cli - .command('import', 'Import translation from ftl files into Vue.js SFC') + .command('import', 'Import translation from ftl files into Vue.js SFC and merge existing ftl files.') .option('--in-dir', 'Input directory with ftl files', { default: 'translations/' }) .option('--out-dir', 'Output directory for extracted vue files', { default: 'example/' }) .action(runImport)