transcripto-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +576 -0
- package/dist/cli/generate.d.ts +2 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +416 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +43 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +81 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/report.d.ts +2 -0
- package/dist/cli/report.d.ts.map +1 -0
- package/dist/cli/report.js +137 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/scan.d.ts +2 -0
- package/dist/cli/scan.d.ts.map +1 -0
- package/dist/cli/scan.js +62 -0
- package/dist/cli/scan.js.map +1 -0
- package/dist/cli/watch-i18n.d.ts +2 -0
- package/dist/cli/watch-i18n.d.ts.map +1 -0
- package/dist/cli/watch-i18n.js +73 -0
- package/dist/cli/watch-i18n.js.map +1 -0
- package/dist/cli/watch.d.ts +2 -0
- package/dist/cli/watch.d.ts.map +1 -0
- package/dist/cli/watch.js +147 -0
- package/dist/cli/watch.js.map +1 -0
- package/dist/core/i18nGenerator.d.ts +16 -0
- package/dist/core/i18nGenerator.d.ts.map +1 -0
- package/dist/core/i18nGenerator.js +139 -0
- package/dist/core/i18nGenerator.js.map +1 -0
- package/dist/core/projectScanner.d.ts +12 -0
- package/dist/core/projectScanner.d.ts.map +1 -0
- package/dist/core/projectScanner.js +53 -0
- package/dist/core/projectScanner.js.map +1 -0
- package/dist/core/stringExtractor.d.ts +21 -0
- package/dist/core/stringExtractor.d.ts.map +1 -0
- package/dist/core/stringExtractor.js +268 -0
- package/dist/core/stringExtractor.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/package.json +44 -0
- package/src/cli/generate.ts +422 -0
- package/src/cli/index.ts +50 -0
- package/src/cli/init.ts +96 -0
- package/src/cli/report.ts +160 -0
- package/src/cli/scan.ts +69 -0
- package/src/cli/watch-i18n.ts +77 -0
- package/src/cli/watch.ts +129 -0
- package/src/core/i18nGenerator.ts +127 -0
- package/src/core/projectScanner.ts +62 -0
- package/src/core/stringExtractor.ts +276 -0
- package/src/index.ts +7 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.reportCommand = reportCommand;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
async function reportCommand() {
|
|
10
|
+
console.log(chalk_1.default.blue('📊 Generating localization report...'));
|
|
11
|
+
try {
|
|
12
|
+
const report = await generateReport();
|
|
13
|
+
displayReport(report);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
console.error(chalk_1.default.red('❌ Report generation failed:'), error);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function generateReport() {
|
|
21
|
+
// Load extracted strings
|
|
22
|
+
const strings = await loadExtractedStrings();
|
|
23
|
+
// Load config
|
|
24
|
+
const config = await loadConfig();
|
|
25
|
+
// Load existing translations
|
|
26
|
+
const translations = await loadTranslations(config.i18n.languages);
|
|
27
|
+
// Calculate metrics
|
|
28
|
+
const filesScanned = new Set(strings.map(s => s.filePath)).size;
|
|
29
|
+
const stringsByFile = {};
|
|
30
|
+
strings.forEach(str => {
|
|
31
|
+
const fileName = str.filePath.split('/').pop() || str.filePath;
|
|
32
|
+
stringsByFile[fileName] = (stringsByFile[fileName] || 0) + 1;
|
|
33
|
+
});
|
|
34
|
+
// Check missing translations
|
|
35
|
+
const missingTranslations = [];
|
|
36
|
+
for (const lang of config.i18n.languages) {
|
|
37
|
+
if (lang !== 'en' && (!translations[lang] || Object.keys(translations[lang]).length < strings.length)) {
|
|
38
|
+
missingTranslations.push(lang);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const coverage = strings.length > 0
|
|
42
|
+
? Math.round((translations.en ? Object.keys(translations.en).length : 0) / strings.length * 100)
|
|
43
|
+
: 0;
|
|
44
|
+
return {
|
|
45
|
+
totalStrings: strings.length,
|
|
46
|
+
filesScanned,
|
|
47
|
+
languages: config.i18n.languages,
|
|
48
|
+
coverage,
|
|
49
|
+
missingTranslations,
|
|
50
|
+
stringsByFile
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function displayReport(report) {
|
|
54
|
+
console.log(chalk_1.default.green('\n📈 Transcripto Localization Report'));
|
|
55
|
+
console.log(chalk_1.default.gray('='.repeat(40)));
|
|
56
|
+
console.log(chalk_1.default.white(`\n📝 Total Strings: ${report.totalStrings}`));
|
|
57
|
+
console.log(chalk_1.default.white(`📁 Files Scanned: ${report.filesScanned}`));
|
|
58
|
+
console.log(chalk_1.default.white(`🌐 Languages: ${report.languages.join(', ')}`));
|
|
59
|
+
// Coverage with color coding
|
|
60
|
+
let coverageColor = chalk_1.default.red;
|
|
61
|
+
if (report.coverage >= 80)
|
|
62
|
+
coverageColor = chalk_1.default.green;
|
|
63
|
+
else if (report.coverage >= 50)
|
|
64
|
+
coverageColor = chalk_1.default.yellow;
|
|
65
|
+
console.log(coverageColor(`📊 Coverage: ${report.coverage}%`));
|
|
66
|
+
// Missing translations
|
|
67
|
+
if (report.missingTranslations.length > 0) {
|
|
68
|
+
console.log(chalk_1.default.red(`\n⚠️ Missing Translations: ${report.missingTranslations.join(', ')}`));
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
console.log(chalk_1.default.green('\n✅ All languages have complete translations'));
|
|
72
|
+
}
|
|
73
|
+
// Strings by file
|
|
74
|
+
if (Object.keys(report.stringsByFile).length > 0) {
|
|
75
|
+
console.log(chalk_1.default.white('\n📋 Strings by File:'));
|
|
76
|
+
const sortedFiles = Object.entries(report.stringsByFile)
|
|
77
|
+
.sort(([, a], [, b]) => b - a)
|
|
78
|
+
.slice(0, 10);
|
|
79
|
+
sortedFiles.forEach(([file, count]) => {
|
|
80
|
+
console.log(chalk_1.default.gray(` ${file}: ${count} strings`));
|
|
81
|
+
});
|
|
82
|
+
if (Object.keys(report.stringsByFile).length > 10) {
|
|
83
|
+
console.log(chalk_1.default.gray(` ... and ${Object.keys(report.stringsByFile).length - 10} more files`));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Recommendations
|
|
87
|
+
console.log(chalk_1.default.white('\n💡 Recommendations:'));
|
|
88
|
+
if (report.totalStrings === 0) {
|
|
89
|
+
console.log(chalk_1.default.yellow(' • Run "transcripto scan" to extract UI strings'));
|
|
90
|
+
}
|
|
91
|
+
else if (report.coverage < 100) {
|
|
92
|
+
console.log(chalk_1.default.yellow(' • Run "transcripto generate" to update translation files'));
|
|
93
|
+
}
|
|
94
|
+
if (report.missingTranslations.length > 0) {
|
|
95
|
+
console.log(chalk_1.default.yellow(' • Run "npx lingo.dev@latest run" to generate missing translations'));
|
|
96
|
+
}
|
|
97
|
+
if (report.totalStrings > 0 && report.coverage === 100) {
|
|
98
|
+
console.log(chalk_1.default.green(' • Localization is complete! 🎉'));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function loadExtractedStrings() {
|
|
102
|
+
try {
|
|
103
|
+
const content = await fs_1.promises.readFile('.transcripto/extracted-strings.json', 'utf-8');
|
|
104
|
+
return JSON.parse(content);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function loadConfig() {
|
|
111
|
+
try {
|
|
112
|
+
const configContent = await fs_1.promises.readFile('.transcripto/config.json', 'utf-8');
|
|
113
|
+
return JSON.parse(configContent);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
return {
|
|
117
|
+
i18n: {
|
|
118
|
+
languages: ['en', 'hi', 'kn'],
|
|
119
|
+
outputDir: './src/i18n'
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async function loadTranslations(languages) {
|
|
125
|
+
const translations = {};
|
|
126
|
+
for (const lang of languages) {
|
|
127
|
+
try {
|
|
128
|
+
const content = await fs_1.promises.readFile(`./src/i18n/${lang}.json`, 'utf-8');
|
|
129
|
+
translations[lang] = JSON.parse(content);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
translations[lang] = {};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return translations;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/cli/report.ts"],"names":[],"mappings":";;;;;AAaA,sCAWC;AAxBD,2BAAoC;AACpC,kDAA0B;AAYnB,KAAK,UAAU,aAAa;IACjC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAEhE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QACtC,aAAa,CAAC,MAAM,CAAC,CAAC;IAExB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc;IAC3B,yBAAyB;IACzB,MAAM,OAAO,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAE7C,cAAc;IACd,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,6BAA6B;IAC7B,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEnE,oBAAoB;IACpB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,MAAM,aAAa,GAA2B,EAAE,CAAC;IAEjD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACpB,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC;QAC/D,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,6BAA6B;IAC7B,MAAM,mBAAmB,GAAa,EAAE,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACtG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;QACjC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC;QAChG,CAAC,CAAC,CAAC,CAAC;IAEN,OAAO;QACL,YAAY,EAAE,OAAO,CAAC,MAAM;QAC5B,YAAY;QACZ,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS;QAChC,QAAQ;QACR,mBAAmB;QACnB,aAAa;KACd,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,MAAkB;IACvC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uBAAuB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,qBAAqB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iBAAiB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAEzE,6BAA6B;IAC7B,IAAI,aAAa,GAAG,eAAK,CAAC,GAAG,CAAC;IAC9B,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE;QAAE,aAAa,GAAG,eAAK,CAAC,KAAK,CAAC;SAClD,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE;QAAE,aAAa,GAAG,eAAK,CAAC,MAAM,CAAC;IAE7D,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,gBAAgB,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAE/D,uBAAuB;IACvB,IAAI,MAAM,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,+BAA+B,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACjG,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,kBAAkB;IAClB,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;aACrD,IAAI,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;aAC3B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEhB,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YACpC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAElD,IAAI,MAAM,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,kDAAkD,CAAC,CAAC,CAAC;IAChF,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,4DAA4D,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,MAAM,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,qEAAqE,CAAC,CAAC,CAAC;IACnG,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB;IACjC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,qCAAqC,EAAE,OAAO,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE;gBACJ,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;gBAC7B,SAAS,EAAE,YAAY;aACxB;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,SAAmB;IACjD,MAAM,YAAY,GAA2C,EAAE,CAAC;IAEhE,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,cAAc,IAAI,OAAO,EAAE,OAAO,CAAC,CAAC;YACtE,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/cli/scan.ts"],"names":[],"mappings":"AAKA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA+CjD"}
|
package/dist/cli/scan.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.scanCommand = scanCommand;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const projectScanner_1 = require("../core/projectScanner");
|
|
10
|
+
const stringExtractor_1 = require("../core/stringExtractor");
|
|
11
|
+
async function scanCommand() {
|
|
12
|
+
console.log(chalk_1.default.blue('🔍 Scanning project for UI text strings...'));
|
|
13
|
+
try {
|
|
14
|
+
// Load config
|
|
15
|
+
const config = await loadConfig();
|
|
16
|
+
// Initialize scanner and extractor
|
|
17
|
+
const scanner = new projectScanner_1.ProjectScanner();
|
|
18
|
+
const extractor = new stringExtractor_1.StringExtractor();
|
|
19
|
+
// Scan project
|
|
20
|
+
const files = await scanner.scanProject();
|
|
21
|
+
console.log(chalk_1.default.gray(`📁 Found ${files.length} files to scan`));
|
|
22
|
+
// Extract strings
|
|
23
|
+
const strings = await extractor.extractStrings(files);
|
|
24
|
+
// Save results
|
|
25
|
+
await fs_1.promises.writeFile('.transcripto/extracted-strings.json', JSON.stringify(strings, null, 2), 'utf-8');
|
|
26
|
+
console.log(chalk_1.default.green(`✅ Extracted ${strings.length} UI text strings`));
|
|
27
|
+
if (strings.length > 0) {
|
|
28
|
+
console.log(chalk_1.default.yellow('\n📝 Sample extracted strings:'));
|
|
29
|
+
strings.slice(0, 5).forEach((str, index) => {
|
|
30
|
+
console.log(chalk_1.default.white(` ${index + 1}. "${str.text}" → ${str.key}`));
|
|
31
|
+
console.log(chalk_1.default.gray(` from ${str.filePath}:${str.line}`));
|
|
32
|
+
});
|
|
33
|
+
if (strings.length > 5) {
|
|
34
|
+
console.log(chalk_1.default.gray(` ... and ${strings.length - 5} more`));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
console.log(chalk_1.default.yellow('\n🎯 Next steps:'));
|
|
38
|
+
console.log(chalk_1.default.white(' transcripto generate - Generate i18n files from extracted strings'));
|
|
39
|
+
console.log(chalk_1.default.white(' transcripto replace - Replace inline text with constants'));
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.error(chalk_1.default.red('❌ Scan failed:'), error);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function loadConfig() {
|
|
47
|
+
try {
|
|
48
|
+
const configContent = await fs_1.promises.readFile('.transcripto/config.json', 'utf-8');
|
|
49
|
+
return JSON.parse(configContent);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
console.warn(chalk_1.default.yellow('⚠️ No .transcripto/config.json found, using defaults'));
|
|
53
|
+
return {
|
|
54
|
+
scan: {
|
|
55
|
+
extensions: ['.ts', '.tsx', '.js', '.jsx', '.html'],
|
|
56
|
+
exclude: ['node_modules', 'dist', 'build', '.git', 'coverage'],
|
|
57
|
+
minStringLength: 2
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/cli/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch-i18n.d.ts","sourceRoot":"","sources":["../../src/cli/watch-i18n.ts"],"names":[],"mappings":"AAOA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CA2DtD"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.watchI18nCommand = watchI18nCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const chokidar_1 = __importDefault(require("chokidar"));
|
|
10
|
+
const i18nGenerator_1 = require("../core/i18nGenerator");
|
|
11
|
+
async function watchI18nCommand() {
|
|
12
|
+
console.log(chalk_1.default.cyan('👁️ Starting i18n file watcher...'));
|
|
13
|
+
console.log(chalk_1.default.gray('📁 Monitoring: ./i18n/en.json'));
|
|
14
|
+
console.log(chalk_1.default.gray('🔄 Auto-translating on changes...\n'));
|
|
15
|
+
// Ensure i18n directory exists
|
|
16
|
+
try {
|
|
17
|
+
await fs_1.promises.mkdir('./i18n', { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Directory already exists
|
|
21
|
+
}
|
|
22
|
+
// Initial translation if en.json exists
|
|
23
|
+
try {
|
|
24
|
+
const enContent = await fs_1.promises.readFile('./i18n/en.json', 'utf-8');
|
|
25
|
+
const translations = JSON.parse(enContent);
|
|
26
|
+
const keys = Object.keys(translations);
|
|
27
|
+
if (keys.length > 0) {
|
|
28
|
+
console.log(chalk_1.default.yellow('📝 Found existing translations, running initial translation...'));
|
|
29
|
+
await runTranslation();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
console.log(chalk_1.default.yellow('📝 No existing en.json found, waiting for file creation...'));
|
|
34
|
+
}
|
|
35
|
+
// Watch for changes in en.json
|
|
36
|
+
const watcher = chokidar_1.default.watch('./i18n/en.json', {
|
|
37
|
+
persistent: true,
|
|
38
|
+
ignoreInitial: true
|
|
39
|
+
});
|
|
40
|
+
watcher.on('change', async () => {
|
|
41
|
+
console.log(chalk_1.default.cyan('\n🔄 File changed: ./i18n/en.json'));
|
|
42
|
+
console.log(chalk_1.default.yellow('🌐 Running auto-translation...'));
|
|
43
|
+
try {
|
|
44
|
+
await runTranslation();
|
|
45
|
+
console.log(chalk_1.default.green('✅ Auto-translation completed!'));
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.error(chalk_1.default.red('❌ Auto-translation failed:'), error);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
watcher.on('add', async () => {
|
|
52
|
+
console.log(chalk_1.default.cyan('\n📁 File created: ./i18n/en.json'));
|
|
53
|
+
console.log(chalk_1.default.yellow('🌐 Running initial translation...'));
|
|
54
|
+
try {
|
|
55
|
+
await runTranslation();
|
|
56
|
+
console.log(chalk_1.default.green('✅ Initial translation completed!'));
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.error(chalk_1.default.red('❌ Initial translation failed:'), error);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
console.log(chalk_1.default.green('🎉 Watcher started successfully!'));
|
|
63
|
+
console.log(chalk_1.default.gray('💡 Add new keys to ./i18n/en.json and they will be auto-translated'));
|
|
64
|
+
console.log(chalk_1.default.gray('⏹️ Press Ctrl+C to stop watching\n'));
|
|
65
|
+
}
|
|
66
|
+
async function runTranslation() {
|
|
67
|
+
const generator = new i18nGenerator_1.I18nGenerator();
|
|
68
|
+
// Generate lingo.dev config for root/i18n
|
|
69
|
+
await generator.generateLingoDevConfig();
|
|
70
|
+
// Run lingo.dev translation
|
|
71
|
+
await generator.runLingoDev();
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=watch-i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch-i18n.js","sourceRoot":"","sources":["../../src/cli/watch-i18n.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"AASA,wBAAsB,YAAY,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C9D"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.watchCommand = watchCommand;
|
|
40
|
+
const fs_1 = require("fs");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const chokidar = __importStar(require("chokidar"));
|
|
43
|
+
const i18nGenerator_1 = require("../core/i18nGenerator");
|
|
44
|
+
const projectScanner_1 = require("../core/projectScanner");
|
|
45
|
+
const stringExtractor_1 = require("../core/stringExtractor");
|
|
46
|
+
async function watchCommand(options) {
|
|
47
|
+
console.log(chalk_1.default.blue('👁️ Starting Transcripto file watcher...'));
|
|
48
|
+
const yes = options.yes || false;
|
|
49
|
+
if (yes) {
|
|
50
|
+
console.log(chalk_1.default.yellow('🤖 Running in non-interactive mode (--yes)'));
|
|
51
|
+
}
|
|
52
|
+
// Initial setup
|
|
53
|
+
await setupProject(yes);
|
|
54
|
+
// Watch for file changes
|
|
55
|
+
const watcher = chokidar.watch([
|
|
56
|
+
'src/**/*.{ts,tsx,js,jsx}',
|
|
57
|
+
'!src/i18n/**/*',
|
|
58
|
+
'!dist/**/*',
|
|
59
|
+
'!node_modules/**/*'
|
|
60
|
+
], {
|
|
61
|
+
ignored: /node_modules/,
|
|
62
|
+
persistent: true,
|
|
63
|
+
ignoreInitial: true
|
|
64
|
+
});
|
|
65
|
+
console.log(chalk_1.default.green('📁 Watching for changes in src/ directory...'));
|
|
66
|
+
console.log(chalk_1.default.gray('💡 Press Ctrl+C to stop watching'));
|
|
67
|
+
watcher.on('change', async (filePath) => {
|
|
68
|
+
console.log(chalk_1.default.yellow(`\n📝 File changed: ${filePath}`));
|
|
69
|
+
await handleFileChange(filePath, yes);
|
|
70
|
+
});
|
|
71
|
+
watcher.on('add', async (filePath) => {
|
|
72
|
+
console.log(chalk_1.default.yellow(`\n➕ File added: ${filePath}`));
|
|
73
|
+
await handleFileChange(filePath, yes);
|
|
74
|
+
});
|
|
75
|
+
// Handle process termination
|
|
76
|
+
process.on('SIGINT', () => {
|
|
77
|
+
console.log(chalk_1.default.cyan('\n👋 Stopping Transcripto watcher...'));
|
|
78
|
+
watcher.close();
|
|
79
|
+
process.exit(0);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async function setupProject(yes) {
|
|
83
|
+
try {
|
|
84
|
+
// Check if project is initialized
|
|
85
|
+
try {
|
|
86
|
+
await fs_1.promises.access('.transcripto');
|
|
87
|
+
console.log(chalk_1.default.green('✅ Transcripto project already initialized'));
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
console.log(chalk_1.default.yellow('🔧 Initializing Transcripto project...'));
|
|
91
|
+
const { initCommand } = await Promise.resolve().then(() => __importStar(require('./init')));
|
|
92
|
+
await initCommand();
|
|
93
|
+
}
|
|
94
|
+
// Initial scan and generation
|
|
95
|
+
console.log(chalk_1.default.blue('🔍 Performing initial scan...'));
|
|
96
|
+
await performFullWorkflow(yes);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
console.error(chalk_1.default.red('❌ Setup failed:'), error);
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async function handleFileChange(filePath, yes) {
|
|
104
|
+
try {
|
|
105
|
+
console.log(chalk_1.default.cyan('🔄 Updating translations...'));
|
|
106
|
+
// Perform full workflow
|
|
107
|
+
await performFullWorkflow(yes);
|
|
108
|
+
console.log(chalk_1.default.green('✅ Translations updated successfully!'));
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.error(chalk_1.default.red('❌ Update failed:'), error);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function performFullWorkflow(yes) {
|
|
115
|
+
// Scan for strings
|
|
116
|
+
const scanner = new projectScanner_1.ProjectScanner();
|
|
117
|
+
const files = await scanner.scanProject('./src');
|
|
118
|
+
const extractor = new stringExtractor_1.StringExtractor();
|
|
119
|
+
const strings = await extractor.extractStrings(files);
|
|
120
|
+
if (strings.length === 0) {
|
|
121
|
+
console.log(chalk_1.default.yellow('⚠️ No strings found'));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// Generate i18n files using same config as generate command
|
|
125
|
+
const generator = new i18nGenerator_1.I18nGenerator();
|
|
126
|
+
const config = {
|
|
127
|
+
outputDir: './i18n', // Changed to root folder
|
|
128
|
+
languages: ['en'], // Start with just English, lingo.dev will add more
|
|
129
|
+
constantsFile: '', // No constants file needed
|
|
130
|
+
keyPrefix: ''
|
|
131
|
+
};
|
|
132
|
+
await generator.generateI18nFiles(strings, config);
|
|
133
|
+
await generator.generateLingoDevConfig(); // Let lingo.dev decide target languages
|
|
134
|
+
// Run lingo.dev automatically
|
|
135
|
+
try {
|
|
136
|
+
await generator.runLingoDev();
|
|
137
|
+
console.log(chalk_1.default.green('🌐 lingo.dev translations completed!'));
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
console.log(chalk_1.default.yellow('⚠️ lingo.dev failed, continuing...'));
|
|
141
|
+
}
|
|
142
|
+
// Replace strings with constants
|
|
143
|
+
// const replacer = new TextReplacer();
|
|
144
|
+
// await replacer.replaceInFiles(strings);
|
|
145
|
+
console.log(chalk_1.default.green(`✅ Processed ${strings.length} strings`));
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ExtractedString } from './stringExtractor';
|
|
2
|
+
export interface I18nConfig {
|
|
3
|
+
outputDir: string;
|
|
4
|
+
languages: string[];
|
|
5
|
+
constantsFile: string;
|
|
6
|
+
keyPrefix: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class I18nGenerator {
|
|
9
|
+
private readonly defaultConfig;
|
|
10
|
+
generateI18nFiles(strings: ExtractedString[], config?: Partial<I18nConfig>): Promise<void>;
|
|
11
|
+
private generateTranslationFile;
|
|
12
|
+
generateLingoDevConfig(): Promise<void>;
|
|
13
|
+
runLingoDev(): Promise<void>;
|
|
14
|
+
private initializeLingoDev;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=i18nGenerator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18nGenerator.d.ts","sourceRoot":"","sources":["../../src/core/i18nGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAK5B;IAEI,iBAAiB,CACrB,OAAO,EAAE,eAAe,EAAE,EAC1B,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAC/B,OAAO,CAAC,IAAI,CAAC;YAYF,uBAAuB;IAiB/B,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBvC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;YAgCpB,kBAAkB;CAqBjC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.I18nGenerator = void 0;
|
|
40
|
+
const fs_1 = require("fs");
|
|
41
|
+
const path_1 = __importDefault(require("path"));
|
|
42
|
+
class I18nGenerator {
|
|
43
|
+
constructor() {
|
|
44
|
+
this.defaultConfig = {
|
|
45
|
+
outputDir: './i18n', // Changed to root folder
|
|
46
|
+
languages: ['en', 'hi', 'kn'],
|
|
47
|
+
constantsFile: './src/i18n/constants.ts',
|
|
48
|
+
keyPrefix: ''
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async generateI18nFiles(strings, config = {}) {
|
|
52
|
+
const finalConfig = { ...this.defaultConfig, ...config };
|
|
53
|
+
// Create output directory
|
|
54
|
+
await fs_1.promises.mkdir(finalConfig.outputDir, { recursive: true });
|
|
55
|
+
// Generate translation files only (no constants file)
|
|
56
|
+
for (const language of finalConfig.languages) {
|
|
57
|
+
await this.generateTranslationFile(strings, language, finalConfig);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async generateTranslationFile(strings, language, config) {
|
|
61
|
+
const translations = {};
|
|
62
|
+
for (const str of strings) {
|
|
63
|
+
translations[str.key] = str.text;
|
|
64
|
+
}
|
|
65
|
+
const filePath = path_1.default.join(config.outputDir, `${language}.json`);
|
|
66
|
+
const content = JSON.stringify(translations, null, 2);
|
|
67
|
+
await fs_1.promises.writeFile(filePath, content, 'utf-8');
|
|
68
|
+
}
|
|
69
|
+
async generateLingoDevConfig() {
|
|
70
|
+
// First, delete any existing lingo.dev config to ensure clean setup
|
|
71
|
+
try {
|
|
72
|
+
await fs_1.promises.unlink('.lingodev.json');
|
|
73
|
+
console.log('🗑️ Removed existing lingo.dev config');
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Config doesn't exist, that's fine
|
|
77
|
+
}
|
|
78
|
+
// Let lingo.dev handle target languages automatically - don't specify any
|
|
79
|
+
const config = {
|
|
80
|
+
source: './i18n/en.json', // Changed to root folder
|
|
81
|
+
// target: [] - Let lingo.dev decide automatically
|
|
82
|
+
output: './i18n', // Changed to root folder
|
|
83
|
+
format: 'json'
|
|
84
|
+
};
|
|
85
|
+
const content = JSON.stringify(config, null, 2);
|
|
86
|
+
await fs_1.promises.writeFile('.lingodev.json', content, 'utf-8');
|
|
87
|
+
console.log('📁 Created lingo.dev config with automatic language selection');
|
|
88
|
+
}
|
|
89
|
+
async runLingoDev() {
|
|
90
|
+
const { spawn } = await Promise.resolve().then(() => __importStar(require('child_process')));
|
|
91
|
+
// First, initialize lingo.dev if not already done
|
|
92
|
+
try {
|
|
93
|
+
await fs_1.promises.access('i18n.json');
|
|
94
|
+
console.log('📁 lingo.dev already initialized');
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
console.log('🔧 Initializing lingo.dev...');
|
|
98
|
+
await this.initializeLingoDev();
|
|
99
|
+
}
|
|
100
|
+
// Then run lingo.dev
|
|
101
|
+
return new Promise((resolve, reject) => {
|
|
102
|
+
const process = spawn('npx', ['lingo.dev@latest', 'run'], {
|
|
103
|
+
stdio: 'inherit',
|
|
104
|
+
shell: true
|
|
105
|
+
});
|
|
106
|
+
process.on('close', (code) => {
|
|
107
|
+
if (code === 0) {
|
|
108
|
+
console.log('✅ lingo.dev translations completed successfully!');
|
|
109
|
+
resolve();
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
reject(new Error(`lingo.dev process exited with code ${code}`));
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
process.on('error', reject);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
async initializeLingoDev() {
|
|
119
|
+
const { spawn } = await Promise.resolve().then(() => __importStar(require('child_process')));
|
|
120
|
+
return new Promise((resolve, reject) => {
|
|
121
|
+
const process = spawn('npx', ['lingo.dev@latest', 'init'], {
|
|
122
|
+
stdio: 'inherit',
|
|
123
|
+
shell: true
|
|
124
|
+
});
|
|
125
|
+
process.on('close', (code) => {
|
|
126
|
+
if (code === 0) {
|
|
127
|
+
console.log('✅ lingo.dev initialized successfully');
|
|
128
|
+
resolve();
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
reject(new Error(`lingo.dev init failed with code ${code}`));
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
process.on('error', reject);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.I18nGenerator = I18nGenerator;
|
|
139
|
+
//# sourceMappingURL=i18nGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18nGenerator.js","sourceRoot":"","sources":["../../src/core/i18nGenerator.ts"],"names":[],"mappings":"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"}
|