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

Commit 5d406a2

Browse files
kovalchukqINTERLOGIC\yeko
and
INTERLOGIC\yeko
authored
Copy|merge exiting ftl files on run import|export commands (#13)
Co-authored-by: INTERLOGIC\yeko <[email protected]>
1 parent ba9a2d1 commit 5d406a2

File tree

3 files changed

+45
-21
lines changed

3 files changed

+45
-21
lines changed

src/cli/commands/export.ts

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { stream } from 'fast-glob'
22
import { promises as fs, existsSync } from 'fs'
3-
import {resolve, dirname, join, relative} from 'path'
3+
import { dirname, join, relative, extname} from 'path'
44
import unixify from 'unixify'
55
import { getVueMessages, mergeFtl } from '../..'
66

@@ -14,24 +14,34 @@ const log = console.log.bind(console)
1414

1515
export const run = async (flags: Options) => {
1616
let count = 0
17-
for await (const file of stream(unixify(flags.inDir) + '/**', {ignore: ['**/node_modules']})) {
17+
for await (const file of stream(unixify(flags.inDir) + '/**', {ignore: ['**/node_modules', unixify(flags.outDir)]})) {
1818
count ++
1919
const data = await fs.readFile(file)
20+
const isVueFile = extname(file.toString()) === '.vue'
21+
const isFtlFile = extname(file.toString()) === '.ftl'
22+
if(isVueFile) {
23+
const vueMessages = getVueMessages(data.toString())
24+
for (const { locale, source, messages } of vueMessages) {
25+
const outputPath = join(flags.outDir, locale, relative(flags.inDir, `${file}.ftl`))
26+
await fs.mkdir(dirname(outputPath), { recursive: true })
27+
if (flags.clean || !existsSync(outputPath)) {
28+
await fs.writeFile(outputPath, source)
29+
} else {
30+
const existingFtlData = await fs.readFile(outputPath)
2031

21-
const vueMessages = getVueMessages(data.toString())
22-
for (const { locale, source, messages } of vueMessages) {
23-
const outputPath = join(flags.outDir, locale, relative(flags.inDir, `${file}.ftl`))
24-
await fs.mkdir(dirname(outputPath), { recursive: true })
25-
if (flags.clean || !existsSync(outputPath)) {
26-
await fs.writeFile(outputPath, source)
27-
} else {
28-
const existingFtlData = await fs.readFile(outputPath)
29-
30-
const newData = mergeFtl(existingFtlData.toString(), messages)
32+
const newData = mergeFtl(existingFtlData.toString(), messages)
3133

32-
await fs.writeFile(outputPath, newData)
34+
await fs.writeFile(outputPath, newData)
35+
}
3336
}
3437
}
38+
else if(isFtlFile) {
39+
const fileData = file.toString().split('.')
40+
const locale = fileData[fileData.length - 2]
41+
const outputPath = join(flags.outDir, locale, relative(flags.inDir, `${file}`))
42+
await fs.mkdir(dirname(outputPath), { recursive: true })
43+
await fs.copyFile(file, outputPath)
44+
}
3545
}
3646

3747
log(`Extracted messages from ${count} files`)

src/cli/commands/import.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { stream } from 'fast-glob'
22
import { promises as fs } from 'fs'
3-
import { resolve, dirname, basename, extname, sep, relative, join } from 'path'
3+
import { dirname, basename, extname, sep, relative, join } from 'path'
44
import unixify from 'unixify'
5-
import { getFtlMessages, mergeVue } from '../..'
5+
import {getFtlMessages, mergeFtl, mergeVue} from '../..'
66

77
interface Options {
88
outDir: string,
@@ -17,20 +17,34 @@ export const run = async (flags: Options) => {
1717
count ++
1818
const fileString = file.toString()
1919
const fileDirName= dirname(file.toString())
20-
2120
const vueComponentName = basename(fileString).replace(extname(fileString), '')
2221
const outputPath = join(relative(flags.inDir, fileDirName), vueComponentName)
2322
const [locale, ...rest] = outputPath.split(sep)
2423
const realOutputPath = join(flags.outDir, rest.join(sep))
2524

26-
const vueFile = await fs.readFile(realOutputPath)
2725
const data = await fs.readFile(file)
2826
const ftlMessages = getFtlMessages(data.toString())
29-
const newData = mergeVue(vueFile.toString(), locale, ftlMessages)
3027

31-
await fs.writeFile(realOutputPath, newData)
28+
if(checkExistingFtlFile(file.toString())) {
29+
const existingFtlData = await fs.readFile(realOutputPath + '.ftl')
30+
const newData = mergeFtl(existingFtlData.toString(), ftlMessages)
31+
32+
await fs.writeFile(realOutputPath + '.ftl', newData)
33+
}
34+
else {
35+
const vueFile = await fs.readFile(realOutputPath)
36+
const newData = mergeVue(vueFile.toString(), locale, ftlMessages)
37+
38+
await fs.writeFile(realOutputPath, newData)
39+
}
3240
}
3341

3442
log(`Imported messages to ${count} files`)
3543
}
3644

45+
const checkExistingFtlFile = (file: string):boolean => {
46+
const fileData = file.split('.')
47+
const locale = fileData[fileData.length - 2]
48+
return extname(file) === '.ftl' && locale !== 'vue'
49+
}
50+

src/cli/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ import { run as runImport } from './commands/import'
77
const cli = cac('fluent-vue')
88

99
cli
10-
.command('export', 'Exports translation from Vue.js SFC files into ftl files.')
10+
.command('export', 'Exports translation from Vue.js SFC files into ftl files and copy existing ftl files.')
1111
.option('--in-dir', 'Input directory with vue files', { default: 'example/' })
1212
.option('--out-dir', 'Output directory for extracted ftl files', { default: 'translations/' })
1313
.option('--clean', 'Whether to clean output directory', { default: true })
1414
.action(runExport)
1515

1616
cli
17-
.command('import', 'Import translation from ftl files into Vue.js SFC')
17+
.command('import', 'Import translation from ftl files into Vue.js SFC and merge existing ftl files.')
1818
.option('--in-dir', 'Input directory with ftl files', { default: 'translations/' })
1919
.option('--out-dir', 'Output directory for extracted vue files', { default: 'example/' })
2020
.action(runImport)

0 commit comments

Comments
 (0)