Skip to content
This repository was archived by the owner on Jan 6, 2024. It is now read-only.

Copy or merge existing ftl files on run import or export commands #13

Merged
merged 1 commit into from
Feb 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 23 additions & 13 deletions src/cli/commands/export.ts
Original file line number Diff line number Diff line change
@@ -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 '../..'

Expand All @@ -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`)
Expand Down
26 changes: 20 additions & 6 deletions src/cli/commands/import.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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'
}

4 changes: 2 additions & 2 deletions src/cli/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down