@djangocfg/i18n 2.1.177 → 2.1.179
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/dist/cli/index.mjs +13 -1
- package/dist/cli/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/cli/commands/translate.ts +15 -1
package/dist/cli/index.mjs
CHANGED
|
@@ -497,7 +497,19 @@ var translateCommand = defineCommand({
|
|
|
497
497
|
consola.info(`Directory: ${localesDir}`);
|
|
498
498
|
const sourceData = await loadLocale(config, sourceLocale);
|
|
499
499
|
const startTime = Date.now();
|
|
500
|
-
const
|
|
500
|
+
const topLevelKeys = Object.keys(sourceData);
|
|
501
|
+
const translated = {};
|
|
502
|
+
for (const section of topLevelKeys) {
|
|
503
|
+
const sectionData = sourceData[section];
|
|
504
|
+
consola.info(` [${section}] translating...`);
|
|
505
|
+
const sectionTranslated = await translateJson(
|
|
506
|
+
sectionData,
|
|
507
|
+
targetLocale,
|
|
508
|
+
sourceLocale
|
|
509
|
+
);
|
|
510
|
+
translated[section] = sectionTranslated;
|
|
511
|
+
consola.success(` [${section}] done`);
|
|
512
|
+
}
|
|
501
513
|
const elapsed = ((Date.now() - startTime) / 1e3).toFixed(1);
|
|
502
514
|
consola.success(`Translated in ${elapsed}s`);
|
|
503
515
|
if (config.fileExtension === ".ts") {
|
package/dist/cli/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/utils/locales.ts","../../src/cli/utils/translator.ts","../../src/cli/commands/list.ts","../../src/cli/commands/check.ts","../../src/cli/commands/add.ts","../../src/cli/commands/translate.ts","../../src/cli/commands/sync.ts","../../src/cli/index.ts"],"names":["path2","consola","defineCommand","path3","path4","indent","path5","path6","setNestedValue"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Locale file utilities for CLI\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { consola } from 'consola';\nimport { createJiti } from 'jiti';\n\n// Create jiti instance for loading TypeScript files at runtime\nconst jiti = createJiti(import.meta.url);\n\nexport interface LocaleConfig {\n dir: string;\n fileExtension: '.ts' | '.json';\n locales: string[];\n}\n\n/**\n * Detect locale configuration from directory\n */\nexport function detectLocaleConfig(dir: string): LocaleConfig {\n if (!fs.existsSync(dir)) {\n throw new Error(`Directory not found: ${dir}`);\n }\n\n const files = fs.readdirSync(dir);\n\n // Check for .ts or .json files\n const tsFiles = files.filter((f) => f.endsWith('.ts') && f !== 'index.ts');\n const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n const fileExtension = tsFiles.length > 0 ? '.ts' : '.json';\n const localeFiles = fileExtension === '.ts' ? tsFiles : jsonFiles;\n\n const locales = localeFiles\n .map((f) => f.replace(fileExtension, ''))\n .sort((a, b) => {\n if (a === 'en') return -1;\n if (b === 'en') return 1;\n return a.localeCompare(b);\n });\n\n return { dir, fileExtension, locales };\n}\n\n/**\n * Get default locales directory (package locales)\n */\nexport function getDefaultLocalesDir(): string {\n // Try to find package root\n let current = process.cwd();\n\n while (current !== '/') {\n const packageJson = path.join(current, 'package.json');\n if (fs.existsSync(packageJson)) {\n const pkg = JSON.parse(fs.readFileSync(packageJson, 'utf-8'));\n if (pkg.name === '@djangocfg/i18n') {\n return path.join(current, 'src', 'locales');\n }\n }\n current = path.dirname(current);\n }\n\n // Fallback: relative to CLI file\n return path.resolve(__dirname, '../../locales');\n}\n\n/**\n * Get export name for locale (handles pt-BR -> ptBR)\n */\nexport function getExportName(locale: string): string {\n if (locale === 'pt-BR') return 'ptBR';\n return locale;\n}\n\n/**\n * Load locale translations\n */\nexport async function loadLocale(\n config: LocaleConfig,\n locale: string\n): Promise<Record<string, unknown>> {\n const filePath = path.join(config.dir, `${locale}${config.fileExtension}`);\n\n if (!fs.existsSync(filePath)) {\n throw new Error(`Locale file not found: ${filePath}`);\n }\n\n if (config.fileExtension === '.json') {\n const content = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(content);\n }\n\n // TypeScript file - use jiti for runtime TypeScript loading\n try {\n const module = await jiti.import(filePath);\n const exportName = getExportName(locale);\n return (module as Record<string, unknown>)[exportName] ?? (module as Record<string, unknown>).default ?? {};\n } catch (error) {\n consola.error(`Failed to load ${locale}:`, error);\n return {};\n }\n}\n\n/**\n * Read locale file content (for editing)\n */\nexport function readLocaleFile(\n config: LocaleConfig,\n locale: string\n): { content: string; exportName: string } {\n const filePath = path.join(config.dir, `${locale}${config.fileExtension}`);\n\n if (!fs.existsSync(filePath)) {\n throw new Error(`Locale file not found: ${filePath}`);\n }\n\n const content = fs.readFileSync(filePath, 'utf-8');\n\n if (config.fileExtension === '.json') {\n return { content, exportName: '' };\n }\n\n const exportMatch = content.match(/export const (\\w+)/);\n if (!exportMatch) {\n throw new Error(`Could not find export in ${locale}${config.fileExtension}`);\n }\n\n return { content, exportName: exportMatch[1] };\n}\n\n/**\n * Write locale file\n */\nexport function writeLocaleFile(\n config: LocaleConfig,\n locale: string,\n content: string\n): void {\n const filePath = path.join(config.dir, `${locale}${config.fileExtension}`);\n fs.writeFileSync(filePath, content, 'utf-8');\n}\n\n/**\n * Get all keys from object as dot-notation paths\n */\nexport function getAllKeys(\n obj: Record<string, unknown>,\n prefix = ''\n): Array<{ path: string; value: unknown }> {\n const keys: Array<{ path: string; value: unknown }> = [];\n\n for (const [key, value] of Object.entries(obj)) {\n const fullPath = prefix ? `${prefix}.${key}` : key;\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n keys.push(...getAllKeys(value as Record<string, unknown>, fullPath));\n } else {\n keys.push({ path: fullPath, value });\n }\n }\n\n return keys;\n}\n\n/**\n * Get value at nested path\n */\nexport function getValueAtPath(obj: Record<string, unknown>, keyPath: string): unknown {\n const keys = keyPath.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current === null || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return current;\n}\n\n/**\n * Set value at nested path\n */\nexport function setValueAtPath(\n obj: Record<string, unknown>,\n keyPath: string,\n value: unknown\n): void {\n const keys = keyPath.split('.');\n let current = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n}\n","/**\n * LLM Translator utility for i18n CLI\n *\n * Uses @djangocfg/llm for translations\n */\n\nimport { createLLMClient, createTranslator, type JsonTranslator } from '@djangocfg/llm';\n\n/** Default API key for testing */\nconst DEFAULT_API_KEY = 'test-api-key';\n\nlet translator: JsonTranslator | null = null;\n\n/**\n * Get or create translator instance\n */\nexport function getTranslator(): JsonTranslator {\n if (!translator) {\n // Use env key or default test key\n const apiKey = process.env.SDKROUTER_API_KEY ||\n process.env.OPENAI_API_KEY ||\n process.env.ANTHROPIC_API_KEY ||\n DEFAULT_API_KEY;\n\n const llm = createLLMClient({\n provider: 'sdkrouter',\n apiKey\n });\n translator = createTranslator(llm);\n }\n return translator;\n}\n\n/**\n * Translate text to target language\n */\nexport async function translateText(\n text: string,\n targetLocale: string,\n sourceLocale: string = 'en'\n): Promise<string> {\n const t = getTranslator();\n return t.translateText(text, targetLocale, { sourceLanguage: sourceLocale });\n}\n\n/**\n * Translate JSON object to target language\n */\nexport async function translateJson<T extends Record<string, unknown>>(\n data: T,\n targetLocale: string,\n sourceLocale: string = 'en'\n): Promise<T> {\n const t = getTranslator();\n const result = await t.translate(data, targetLocale, { sourceLanguage: sourceLocale });\n return result.data;\n}\n\n/**\n * Translate to multiple languages in parallel\n */\nexport async function translateToMany<T extends Record<string, unknown>>(\n data: T,\n targetLocales: string[],\n sourceLocale: string = 'en'\n): Promise<Map<string, T>> {\n const t = getTranslator();\n const results = await t.translateToMany(data, targetLocales, { sourceLanguage: sourceLocale });\n\n const output = new Map<string, T>();\n for (const [locale, result] of results) {\n output.set(locale, result.data);\n }\n return output;\n}\n\n/**\n * Get translator stats\n */\nexport function getTranslatorStats(): {\n memorySize: number;\n hits: number;\n misses: number;\n languagePairs: Array<{ pair: string; translations: number }>;\n} | null {\n if (!translator) return null;\n return translator.getStats();\n}\n\n/**\n * Clear translator cache\n */\nexport function clearTranslatorCache() {\n if (translator) {\n translator.clearCache();\n }\n}\n","/**\n * List/search translation keys\n */\n\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport * as path from 'node:path';\nimport {\n detectLocaleConfig,\n getDefaultLocalesDir,\n loadLocale,\n getAllKeys,\n} from '../utils';\n\nexport const listCommand = defineCommand({\n meta: {\n name: 'list',\n description: 'List and search translation keys',\n },\n args: {\n pattern: {\n type: 'positional',\n description: 'Search pattern (optional)',\n required: false,\n },\n dir: {\n type: 'string',\n alias: 'd',\n description: 'Locales directory',\n },\n locale: {\n type: 'string',\n alias: 'l',\n description: 'Locale to inspect (default: en)',\n default: 'en',\n },\n values: {\n type: 'boolean',\n alias: 'v',\n description: 'Show values',\n default: false,\n },\n },\n async run({ args }) {\n const localesDir = args.dir\n ? path.resolve(process.cwd(), args.dir)\n : getDefaultLocalesDir();\n\n try {\n const config = detectLocaleConfig(localesDir);\n const locale = args.locale || 'en';\n\n if (!config.locales.includes(locale)) {\n consola.error(`Locale \"${locale}\" not found. Available: ${config.locales.join(', ')}`);\n return;\n }\n\n consola.info(`Loading ${locale} from ${localesDir}`);\n const translations = await loadLocale(config, locale);\n const allKeys = getAllKeys(translations);\n\n // Filter by pattern\n const pattern = args.pattern?.toLowerCase();\n const filtered = pattern\n ? allKeys.filter(\n (k) =>\n k.path.toLowerCase().includes(pattern) ||\n String(k.value).toLowerCase().includes(pattern)\n )\n : allKeys;\n\n // Display\n consola.log('');\n consola.info(`Found ${filtered.length} keys${pattern ? ` matching \"${pattern}\"` : ''}`);\n consola.log('');\n\n for (const { path: keyPath, value } of filtered) {\n if (args.values) {\n consola.log(` ${keyPath}: ${JSON.stringify(value)}`);\n } else {\n consola.log(` ${keyPath}`);\n }\n }\n\n consola.log('');\n consola.info(`Total: ${filtered.length} / ${allKeys.length} keys`);\n } catch (error) {\n consola.error(error);\n }\n },\n});\n","/**\n * Check for missing translation keys\n */\n\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport * as path from 'node:path';\nimport {\n detectLocaleConfig,\n getDefaultLocalesDir,\n loadLocale,\n getAllKeys,\n getValueAtPath,\n} from '../utils';\n\nexport const checkCommand = defineCommand({\n meta: {\n name: 'check',\n description: 'Find missing translation keys across locales',\n },\n args: {\n dir: {\n type: 'string',\n alias: 'd',\n description: 'Locales directory',\n },\n base: {\n type: 'string',\n alias: 'b',\n description: 'Base locale to compare against',\n default: 'en',\n },\n fix: {\n type: 'boolean',\n description: 'Show suggested fixes',\n default: false,\n },\n },\n async run({ args }) {\n const localesDir = args.dir\n ? path.resolve(process.cwd(), args.dir)\n : getDefaultLocalesDir();\n\n try {\n const config = detectLocaleConfig(localesDir);\n const baseLocale = args.base || 'en';\n\n if (!config.locales.includes(baseLocale)) {\n consola.error(`Base locale \"${baseLocale}\" not found.`);\n return;\n }\n\n consola.info(`Checking locales in ${localesDir}`);\n consola.info(`Base locale: ${baseLocale}`);\n consola.log('');\n\n // Load base locale\n const baseTranslations = await loadLocale(config, baseLocale);\n const baseKeys = getAllKeys(baseTranslations);\n\n let totalMissing = 0;\n const missingByLocale: Record<string, string[]> = {};\n\n // Check each locale\n for (const locale of config.locales) {\n if (locale === baseLocale) continue;\n\n const translations = await loadLocale(config, locale);\n const missing: string[] = [];\n\n for (const { path: keyPath } of baseKeys) {\n const value = getValueAtPath(translations, keyPath);\n if (value === undefined) {\n missing.push(keyPath);\n }\n }\n\n if (missing.length > 0) {\n missingByLocale[locale] = missing;\n totalMissing += missing.length;\n }\n }\n\n // Report\n if (totalMissing === 0) {\n consola.success('All locales have all keys!');\n return;\n }\n\n consola.warn(`Found ${totalMissing} missing keys`);\n consola.log('');\n\n for (const [locale, missing] of Object.entries(missingByLocale)) {\n consola.log(`${locale} (${missing.length} missing):`);\n for (const key of missing.slice(0, 10)) {\n consola.log(` - ${key}`);\n }\n if (missing.length > 10) {\n consola.log(` ... and ${missing.length - 10} more`);\n }\n consola.log('');\n }\n\n // Summary\n consola.box({\n title: 'Summary',\n message: [\n `Base: ${baseLocale} (${baseKeys.length} keys)`,\n `Checked: ${config.locales.length - 1} locales`,\n `Missing: ${totalMissing} total`,\n ].join('\\n'),\n });\n } catch (error) {\n consola.error(error);\n }\n },\n});\n","/**\n * Add translation key to all locales\n */\n\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport * as path from 'node:path';\nimport {\n detectLocaleConfig,\n getDefaultLocalesDir,\n readLocaleFile,\n writeLocaleFile,\n getValueAtPath,\n loadLocale,\n} from '../utils';\n\nexport const addCommand = defineCommand({\n meta: {\n name: 'add',\n description: 'Add a translation key to all locales',\n },\n args: {\n key: {\n type: 'positional',\n description: 'Key path (e.g., \"tools.tour.next\")',\n required: true,\n },\n translations: {\n type: 'positional',\n description: 'JSON object with translations (e.g., \\'{\"en\":\"Next\",\"ru\":\"Далее\"}\\')',\n required: true,\n },\n dir: {\n type: 'string',\n alias: 'd',\n description: 'Locales directory',\n },\n force: {\n type: 'boolean',\n alias: 'f',\n description: 'Overwrite existing keys',\n default: false,\n },\n },\n async run({ args }) {\n const localesDir = args.dir\n ? path.resolve(process.cwd(), args.dir)\n : getDefaultLocalesDir();\n\n try {\n const config = detectLocaleConfig(localesDir);\n const keyPath = args.key;\n\n // Parse translations\n let translations: Record<string, string>;\n try {\n translations = JSON.parse(args.translations);\n } catch {\n consola.error('Invalid JSON for translations');\n consola.log('Example: \\'{\"en\":\"Next\",\"ru\":\"Далее\"}\\'');\n return;\n }\n\n consola.info(`Adding key: ${keyPath}`);\n consola.info(`Directory: ${localesDir}`);\n consola.log('');\n\n const keyParts = keyPath.split('.');\n let updated = 0;\n let skipped = 0;\n\n for (const locale of config.locales) {\n const translation = translations[locale];\n\n if (!translation) {\n consola.warn(` ${locale}: No translation provided, skipping`);\n skipped++;\n continue;\n }\n\n // Check if key exists\n const existing = await loadLocale(config, locale);\n const existingValue = getValueAtPath(existing, keyPath);\n\n if (existingValue !== undefined && !args.force) {\n consola.warn(` ${locale}: Key exists, use --force to overwrite`);\n skipped++;\n continue;\n }\n\n // Read and update file\n const { content, exportName } = readLocaleFile(config, locale);\n\n if (config.fileExtension === '.json') {\n // JSON file\n const json = JSON.parse(content);\n setNestedValue(json, keyParts, translation);\n writeLocaleFile(config, locale, JSON.stringify(json, null, 2));\n } else {\n // TypeScript file - use regex to insert\n const newContent = insertKeyIntoTS(content, exportName, keyParts, translation);\n writeLocaleFile(config, locale, newContent);\n }\n\n consola.success(` ${locale}: Added \"${translation}\"`);\n updated++;\n }\n\n consola.log('');\n consola.box({\n title: 'Result',\n message: `Updated: ${updated}, Skipped: ${skipped}`,\n });\n } catch (error) {\n consola.error(error);\n }\n },\n});\n\n/**\n * Set nested value in object\n */\nfunction setNestedValue(obj: Record<string, unknown>, keys: string[], value: string): void {\n let current = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n current[keys[keys.length - 1]] = value;\n}\n\n/**\n * Insert key into TypeScript locale file\n */\nfunction insertKeyIntoTS(\n content: string,\n exportName: string,\n keyParts: string[],\n value: string\n): string {\n // Find the object for the first key part\n const firstKey = keyParts[0];\n const restKeys = keyParts.slice(1);\n\n // Check if top-level key exists\n const topLevelRegex = new RegExp(`(${firstKey}:\\\\s*\\\\{)`, 'g');\n const hasTopLevel = topLevelRegex.test(content);\n\n if (!hasTopLevel) {\n // Add new top-level key before closing brace\n const closingBrace = content.lastIndexOf('}');\n const indent = ' ';\n const newEntry = buildNestedEntry(keyParts, value, indent);\n return (\n content.slice(0, closingBrace) + '\\n' + newEntry + '\\n' + content.slice(closingBrace)\n );\n }\n\n // Navigate to the right nesting level and insert\n // This is a simplified approach - for complex cases, consider AST parsing\n let insertPoint = content.indexOf(`${firstKey}:`);\n if (insertPoint === -1) return content;\n\n // Find the opening brace for this section\n let braceCount = 0;\n let foundStart = false;\n let insertIndex = insertPoint;\n\n for (let i = insertPoint; i < content.length; i++) {\n if (content[i] === '{') {\n braceCount++;\n foundStart = true;\n } else if (content[i] === '}') {\n braceCount--;\n if (foundStart && braceCount === 0) {\n // Insert before this closing brace\n insertIndex = i;\n break;\n }\n }\n }\n\n // Build the entry\n const indent = ' '; // 4 spaces for nested\n const entry = restKeys.length === 0\n ? `${indent}${keyParts[keyParts.length - 1]}: '${escapeQuotes(value)}',`\n : buildNestedEntry(restKeys, value, indent);\n\n return content.slice(0, insertIndex) + '\\n' + entry + '\\n ' + content.slice(insertIndex);\n}\n\n/**\n * Build nested entry string\n */\nfunction buildNestedEntry(keys: string[], value: string, baseIndent: string): string {\n if (keys.length === 1) {\n return `${baseIndent}${keys[0]}: '${escapeQuotes(value)}',`;\n }\n\n const [first, ...rest] = keys;\n const nestedContent = buildNestedEntry(rest, value, baseIndent + ' ');\n return `${baseIndent}${first}: {\\n${nestedContent}\\n${baseIndent}},`;\n}\n\n/**\n * Escape single quotes in value\n */\nfunction escapeQuotes(value: string): string {\n return value.replace(/'/g, \"\\\\'\");\n}\n","/**\n * Translate text or JSON using LLM\n */\n\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport {\n detectLocaleConfig,\n getDefaultLocalesDir,\n loadLocale,\n readLocaleFile,\n writeLocaleFile,\n getExportName,\n translateText,\n translateJson,\n getTranslatorStats,\n} from '../utils';\n\nexport const translateCommand = defineCommand({\n meta: {\n name: 'translate',\n description: 'Translate text or locale file using LLM',\n },\n args: {\n text: {\n type: 'positional',\n description: 'Text to translate or locale code (e.g., \"Hello\" or \"ru\")',\n required: false,\n },\n dir: {\n type: 'string',\n alias: 'd',\n description: 'Locales directory',\n },\n from: {\n type: 'string',\n alias: 'f',\n description: 'Source locale (default: en)',\n default: 'en',\n },\n to: {\n type: 'string',\n alias: 't',\n description: 'Target locales (comma-separated, e.g., \"ru,ko,ja\")',\n },\n json: {\n type: 'boolean',\n alias: 'j',\n description: 'Output as JSON',\n default: false,\n },\n file: {\n type: 'boolean',\n description: 'Translate entire locale file',\n default: false,\n },\n stats: {\n type: 'boolean',\n alias: 's',\n description: 'Show translation cache stats',\n default: false,\n },\n },\n async run({ args }) {\n // Show stats\n if (args.stats) {\n const stats = getTranslatorStats();\n if (stats) {\n consola.info('Translation Cache Stats:');\n consola.log(` Memory size: ${stats.memorySize}`);\n consola.log(` Hits: ${stats.hits}`);\n consola.log(` Misses: ${stats.misses}`);\n if (stats.languagePairs.length > 0) {\n consola.log(' Language pairs:');\n for (const { pair, translations } of stats.languagePairs) {\n consola.log(` ${pair}: ${translations} translations`);\n }\n }\n } else {\n consola.info('No translations performed yet.');\n }\n return;\n }\n\n const localesDir = args.dir\n ? path.resolve(process.cwd(), args.dir)\n : getDefaultLocalesDir();\n\n try {\n const config = detectLocaleConfig(localesDir);\n const sourceLocale = args.from || 'en';\n\n // Determine target locales\n let targetLocales: string[];\n if (args.to) {\n targetLocales = args.to.split(',').map((l) => l.trim());\n } else {\n // All locales except source\n targetLocales = config.locales.filter((l) => l !== sourceLocale);\n }\n\n // Translate entire file\n if (args.file || (args.text && config.locales.includes(args.text))) {\n const targetLocale = args.text || targetLocales[0];\n if (!targetLocale) {\n consola.error('Please specify target locale');\n return;\n }\n\n consola.info(`Translating ${sourceLocale} -> ${targetLocale}`);\n consola.info(`Directory: ${localesDir}`);\n\n const sourceData = await loadLocale(config, sourceLocale);\n const startTime = Date.now();\n\n const translated = await translateJson(sourceData, targetLocale, sourceLocale);\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n consola.success(`Translated in ${elapsed}s`);\n\n // Write to file\n if (config.fileExtension === '.ts') {\n const exportName = getExportName(targetLocale);\n const { content } = readLocaleFile(config, targetLocale);\n const jsonStr = JSON.stringify(translated, null, 2);\n // Replace the exported object (from `export const X... = {` to end of file)\n const newContent = content.replace(\n /(export const \\w+[^=]*=\\s*)\\{[\\s\\S]*$/,\n `$1${jsonStr};\\n`\n );\n const finalContent = newContent !== content\n ? newContent\n : `import type { DocsTranslations } from './en';\\n\\nexport const ${exportName}: DocsTranslations = ${jsonStr};\\n`;\n writeLocaleFile(config, targetLocale, finalContent);\n consola.success(`Written to ${targetLocale}.ts`);\n } else {\n writeLocaleFile(config, targetLocale, JSON.stringify(translated, null, 2));\n consola.success(`Written to ${targetLocale}.json`);\n }\n\n if (args.json) {\n console.log(JSON.stringify(translated, null, 2));\n } else {\n // Show sample\n const sample = JSON.stringify(translated, null, 2).slice(0, 300);\n consola.log(sample + (sample.length >= 300 ? '\\n...' : ''));\n }\n\n return;\n }\n\n // Translate text\n const text = args.text;\n if (!text) {\n consola.error('Please provide text to translate or use --file flag');\n consola.log('');\n consola.log('Examples:');\n consola.log(' pnpm i18n translate \"Hello World\" --to ru,ko');\n consola.log(' pnpm i18n translate --file --to ru');\n consola.log(' pnpm i18n translate ru # Translate en.ts to ru');\n return;\n }\n\n consola.info(`Translating: \"${text}\"`);\n consola.log('');\n\n const translations: Record<string, string> = {\n [sourceLocale]: text,\n };\n\n for (const locale of targetLocales) {\n try {\n const translated = await translateText(text, locale, sourceLocale);\n translations[locale] = translated;\n consola.log(` ${locale}: ${translated}`);\n } catch (error) {\n consola.warn(` ${locale}: [FAILED] ${error instanceof Error ? error.message : error}`);\n }\n }\n\n consola.log('');\n if (args.json) {\n console.log(JSON.stringify(translations, null, 2));\n } else {\n consola.log('Copy-paste JSON:');\n console.log(JSON.stringify(translations));\n }\n } catch (error) {\n consola.error(error);\n }\n },\n});\n","/**\n * Sync translation keys across locales using LLM\n *\n * Uses batch translation for efficiency - all missing keys\n * are translated in a single LLM call per locale.\n */\n\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport * as path from 'node:path';\nimport {\n detectLocaleConfig,\n getDefaultLocalesDir,\n loadLocale,\n getAllKeys,\n getValueAtPath,\n readLocaleFile,\n writeLocaleFile,\n translateJson,\n getTranslatorStats,\n} from '../utils';\n\nexport const syncCommand = defineCommand({\n meta: {\n name: 'sync',\n description: 'Sync missing keys from base locale to all others using LLM',\n },\n args: {\n dir: {\n type: 'string',\n alias: 'd',\n description: 'Locales directory',\n },\n base: {\n type: 'string',\n alias: 'b',\n description: 'Base locale',\n default: 'en',\n },\n to: {\n type: 'string',\n alias: 't',\n description: 'Target locales (comma-separated). Default: all except base',\n },\n dry: {\n type: 'boolean',\n description: 'Dry run - show what would be changed',\n default: false,\n },\n translate: {\n type: 'boolean',\n alias: 'T',\n description: 'Translate missing values using LLM (default: add [TODO] placeholders)',\n default: false,\n },\n stats: {\n type: 'boolean',\n alias: 's',\n description: 'Show translation stats after sync',\n default: false,\n },\n },\n async run({ args }) {\n const localesDir = args.dir\n ? path.resolve(process.cwd(), args.dir)\n : getDefaultLocalesDir();\n\n try {\n const config = detectLocaleConfig(localesDir);\n const baseLocale = args.base || 'en';\n\n if (!config.locales.includes(baseLocale)) {\n consola.error(`Base locale \"${baseLocale}\" not found.`);\n return;\n }\n\n // Determine target locales\n let targetLocales: string[];\n if (args.to) {\n targetLocales = args.to.split(',').map((l) => l.trim());\n } else {\n targetLocales = config.locales.filter((l) => l !== baseLocale);\n }\n\n consola.info(`Syncing locales from ${baseLocale}`);\n consola.info(`Directory: ${localesDir}`);\n consola.info(`Targets: ${targetLocales.join(', ')}`);\n if (args.dry) consola.info('(Dry run - no changes will be made)');\n if (args.translate) consola.info('(LLM batch translation enabled)');\n consola.log('');\n\n // Load base locale\n const baseTranslations = await loadLocale(config, baseLocale);\n const baseKeys = getAllKeys(baseTranslations);\n\n let totalAdded = 0;\n let totalTranslated = 0;\n\n for (const locale of targetLocales) {\n if (!config.locales.includes(locale)) {\n consola.warn(`Locale \"${locale}\" not found, skipping`);\n continue;\n }\n\n const translations = await loadLocale(config, locale);\n const missing: Array<{ path: string; value: unknown }> = [];\n\n for (const { path: keyPath, value } of baseKeys) {\n const localeValue = getValueAtPath(translations, keyPath);\n if (localeValue === undefined) {\n missing.push({ path: keyPath, value });\n }\n }\n\n if (missing.length === 0) {\n consola.success(`${locale}: All keys present`);\n continue;\n }\n\n consola.warn(`${locale}: ${missing.length} missing keys`);\n\n if (args.dry) {\n for (const { path: keyPath, value } of missing.slice(0, 5)) {\n consola.log(` + ${keyPath}: ${JSON.stringify(value)}`);\n }\n if (missing.length > 5) {\n consola.log(` ... and ${missing.length - 5} more`);\n }\n continue;\n }\n\n // Actually sync\n const { content } = readLocaleFile(config, locale);\n\n if (config.fileExtension === '.json') {\n const json = JSON.parse(content);\n\n if (args.translate) {\n // Batch translate all missing keys at once\n const toTranslate: Record<string, string> = {};\n for (const { path: keyPath, value } of missing) {\n if (typeof value === 'string') {\n toTranslate[keyPath] = value;\n }\n }\n\n if (Object.keys(toTranslate).length > 0) {\n consola.info(` Translating ${Object.keys(toTranslate).length} texts...`);\n const startTime = Date.now();\n\n try {\n // Single LLM call for all texts\n const translated = await translateJson(toTranslate, locale, baseLocale);\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n consola.success(` Translated in ${elapsed}s`);\n\n // Apply translations\n for (const { path: keyPath, value } of missing) {\n if (typeof value === 'string' && translated[keyPath]) {\n setNestedValue(json, keyPath.split('.'), translated[keyPath]);\n totalTranslated++;\n } else {\n // Non-string or failed - add TODO\n const fallback = typeof value === 'string' ? `[TODO] ${value}` : JSON.stringify(value);\n setNestedValue(json, keyPath.split('.'), fallback);\n }\n }\n } catch (error) {\n consola.error(` Translation failed: ${error instanceof Error ? error.message : error}`);\n // Fallback to TODO placeholders\n for (const { path: keyPath, value } of missing) {\n const fallback = typeof value === 'string' ? `[TODO] ${value}` : JSON.stringify(value);\n setNestedValue(json, keyPath.split('.'), fallback);\n }\n }\n }\n } else {\n // No translation - add [TODO] placeholders\n for (const { path: keyPath, value } of missing) {\n const newValue = typeof value === 'string' ? `[TODO] ${value}` : JSON.stringify(value);\n setNestedValue(json, keyPath.split('.'), newValue);\n }\n }\n\n writeLocaleFile(config, locale, JSON.stringify(json, null, 2));\n totalAdded += missing.length;\n consola.success(` Added ${missing.length} keys`);\n } else {\n // TypeScript - more complex\n consola.warn(` TypeScript sync not fully implemented. Use JSON or 'add' command.`);\n continue;\n }\n }\n\n consola.log('');\n if (args.dry) {\n consola.info('Dry run complete. Use without --dry to apply changes.');\n } else {\n consola.success(`Sync complete. Added ${totalAdded} keys total.`);\n if (args.translate && totalTranslated > 0) {\n consola.info(`Translated ${totalTranslated} values using LLM (batch mode).`);\n }\n }\n\n // Show stats\n if (args.stats) {\n const stats = getTranslatorStats();\n if (stats && stats.memorySize > 0) {\n consola.log('');\n consola.info('Translation Cache:');\n consola.log(` Cached: ${stats.memorySize} | Hits: ${stats.hits} | Misses: ${stats.misses}`);\n }\n }\n } catch (error) {\n consola.error(error);\n }\n },\n});\n\n/**\n * Set nested value in object\n */\nfunction setNestedValue(obj: Record<string, unknown>, keys: string[], value: string): void {\n let current = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n current[keys[keys.length - 1]] = value;\n}\n","#!/usr/bin/env node\n/**\n * i18n CLI - Unified tool for managing translations\n *\n * Usage:\n * pnpm i18n list [pattern] - List/search keys\n * pnpm i18n check - Find missing keys\n * pnpm i18n add <key> <json> - Add key to all locales\n * pnpm i18n translate <text> - Generate translation JSON\n * pnpm i18n sync - Sync keys across locales\n * pnpm i18n init <dir> - Initialize i18n in a directory\n *\n * Can work with:\n * - Package locales (default): packages/i18n/src/locales\n * - App locales: --dir apps/studio/i18n/locales\n */\n\nimport { defineCommand, runMain } from 'citty';\nimport { consola } from 'consola';\n\nimport { listCommand } from './commands/list';\nimport { checkCommand } from './commands/check';\nimport { addCommand } from './commands/add';\nimport { translateCommand } from './commands/translate';\nimport { syncCommand } from './commands/sync';\n\nconst main = defineCommand({\n meta: {\n name: 'i18n',\n version: '1.0.0',\n description: 'CLI for managing i18n translations',\n },\n subCommands: {\n list: listCommand,\n check: checkCommand,\n add: addCommand,\n translate: translateCommand,\n sync: syncCommand,\n },\n setup() {\n consola.box('i18n CLI');\n },\n});\n\nrunMain(main);\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/utils/locales.ts","../../src/cli/utils/translator.ts","../../src/cli/commands/list.ts","../../src/cli/commands/check.ts","../../src/cli/commands/add.ts","../../src/cli/commands/translate.ts","../../src/cli/commands/sync.ts","../../src/cli/index.ts"],"names":["path2","consola","defineCommand","path3","path4","indent","path5","path6","setNestedValue"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Locale file utilities for CLI\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { consola } from 'consola';\nimport { createJiti } from 'jiti';\n\n// Create jiti instance for loading TypeScript files at runtime\nconst jiti = createJiti(import.meta.url);\n\nexport interface LocaleConfig {\n dir: string;\n fileExtension: '.ts' | '.json';\n locales: string[];\n}\n\n/**\n * Detect locale configuration from directory\n */\nexport function detectLocaleConfig(dir: string): LocaleConfig {\n if (!fs.existsSync(dir)) {\n throw new Error(`Directory not found: ${dir}`);\n }\n\n const files = fs.readdirSync(dir);\n\n // Check for .ts or .json files\n const tsFiles = files.filter((f) => f.endsWith('.ts') && f !== 'index.ts');\n const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n const fileExtension = tsFiles.length > 0 ? '.ts' : '.json';\n const localeFiles = fileExtension === '.ts' ? tsFiles : jsonFiles;\n\n const locales = localeFiles\n .map((f) => f.replace(fileExtension, ''))\n .sort((a, b) => {\n if (a === 'en') return -1;\n if (b === 'en') return 1;\n return a.localeCompare(b);\n });\n\n return { dir, fileExtension, locales };\n}\n\n/**\n * Get default locales directory (package locales)\n */\nexport function getDefaultLocalesDir(): string {\n // Try to find package root\n let current = process.cwd();\n\n while (current !== '/') {\n const packageJson = path.join(current, 'package.json');\n if (fs.existsSync(packageJson)) {\n const pkg = JSON.parse(fs.readFileSync(packageJson, 'utf-8'));\n if (pkg.name === '@djangocfg/i18n') {\n return path.join(current, 'src', 'locales');\n }\n }\n current = path.dirname(current);\n }\n\n // Fallback: relative to CLI file\n return path.resolve(__dirname, '../../locales');\n}\n\n/**\n * Get export name for locale (handles pt-BR -> ptBR)\n */\nexport function getExportName(locale: string): string {\n if (locale === 'pt-BR') return 'ptBR';\n return locale;\n}\n\n/**\n * Load locale translations\n */\nexport async function loadLocale(\n config: LocaleConfig,\n locale: string\n): Promise<Record<string, unknown>> {\n const filePath = path.join(config.dir, `${locale}${config.fileExtension}`);\n\n if (!fs.existsSync(filePath)) {\n throw new Error(`Locale file not found: ${filePath}`);\n }\n\n if (config.fileExtension === '.json') {\n const content = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(content);\n }\n\n // TypeScript file - use jiti for runtime TypeScript loading\n try {\n const module = await jiti.import(filePath);\n const exportName = getExportName(locale);\n return (module as Record<string, unknown>)[exportName] ?? (module as Record<string, unknown>).default ?? {};\n } catch (error) {\n consola.error(`Failed to load ${locale}:`, error);\n return {};\n }\n}\n\n/**\n * Read locale file content (for editing)\n */\nexport function readLocaleFile(\n config: LocaleConfig,\n locale: string\n): { content: string; exportName: string } {\n const filePath = path.join(config.dir, `${locale}${config.fileExtension}`);\n\n if (!fs.existsSync(filePath)) {\n throw new Error(`Locale file not found: ${filePath}`);\n }\n\n const content = fs.readFileSync(filePath, 'utf-8');\n\n if (config.fileExtension === '.json') {\n return { content, exportName: '' };\n }\n\n const exportMatch = content.match(/export const (\\w+)/);\n if (!exportMatch) {\n throw new Error(`Could not find export in ${locale}${config.fileExtension}`);\n }\n\n return { content, exportName: exportMatch[1] };\n}\n\n/**\n * Write locale file\n */\nexport function writeLocaleFile(\n config: LocaleConfig,\n locale: string,\n content: string\n): void {\n const filePath = path.join(config.dir, `${locale}${config.fileExtension}`);\n fs.writeFileSync(filePath, content, 'utf-8');\n}\n\n/**\n * Get all keys from object as dot-notation paths\n */\nexport function getAllKeys(\n obj: Record<string, unknown>,\n prefix = ''\n): Array<{ path: string; value: unknown }> {\n const keys: Array<{ path: string; value: unknown }> = [];\n\n for (const [key, value] of Object.entries(obj)) {\n const fullPath = prefix ? `${prefix}.${key}` : key;\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n keys.push(...getAllKeys(value as Record<string, unknown>, fullPath));\n } else {\n keys.push({ path: fullPath, value });\n }\n }\n\n return keys;\n}\n\n/**\n * Get value at nested path\n */\nexport function getValueAtPath(obj: Record<string, unknown>, keyPath: string): unknown {\n const keys = keyPath.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current === null || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return current;\n}\n\n/**\n * Set value at nested path\n */\nexport function setValueAtPath(\n obj: Record<string, unknown>,\n keyPath: string,\n value: unknown\n): void {\n const keys = keyPath.split('.');\n let current = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n}\n","/**\n * LLM Translator utility for i18n CLI\n *\n * Uses @djangocfg/llm for translations\n */\n\nimport { createLLMClient, createTranslator, type JsonTranslator } from '@djangocfg/llm';\n\n/** Default API key for testing */\nconst DEFAULT_API_KEY = 'test-api-key';\n\nlet translator: JsonTranslator | null = null;\n\n/**\n * Get or create translator instance\n */\nexport function getTranslator(): JsonTranslator {\n if (!translator) {\n // Use env key or default test key\n const apiKey = process.env.SDKROUTER_API_KEY ||\n process.env.OPENAI_API_KEY ||\n process.env.ANTHROPIC_API_KEY ||\n DEFAULT_API_KEY;\n\n const llm = createLLMClient({\n provider: 'sdkrouter',\n apiKey\n });\n translator = createTranslator(llm);\n }\n return translator;\n}\n\n/**\n * Translate text to target language\n */\nexport async function translateText(\n text: string,\n targetLocale: string,\n sourceLocale: string = 'en'\n): Promise<string> {\n const t = getTranslator();\n return t.translateText(text, targetLocale, { sourceLanguage: sourceLocale });\n}\n\n/**\n * Translate JSON object to target language\n */\nexport async function translateJson<T extends Record<string, unknown>>(\n data: T,\n targetLocale: string,\n sourceLocale: string = 'en'\n): Promise<T> {\n const t = getTranslator();\n const result = await t.translate(data, targetLocale, { sourceLanguage: sourceLocale });\n return result.data;\n}\n\n/**\n * Translate to multiple languages in parallel\n */\nexport async function translateToMany<T extends Record<string, unknown>>(\n data: T,\n targetLocales: string[],\n sourceLocale: string = 'en'\n): Promise<Map<string, T>> {\n const t = getTranslator();\n const results = await t.translateToMany(data, targetLocales, { sourceLanguage: sourceLocale });\n\n const output = new Map<string, T>();\n for (const [locale, result] of results) {\n output.set(locale, result.data);\n }\n return output;\n}\n\n/**\n * Get translator stats\n */\nexport function getTranslatorStats(): {\n memorySize: number;\n hits: number;\n misses: number;\n languagePairs: Array<{ pair: string; translations: number }>;\n} | null {\n if (!translator) return null;\n return translator.getStats();\n}\n\n/**\n * Clear translator cache\n */\nexport function clearTranslatorCache() {\n if (translator) {\n translator.clearCache();\n }\n}\n","/**\n * List/search translation keys\n */\n\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport * as path from 'node:path';\nimport {\n detectLocaleConfig,\n getDefaultLocalesDir,\n loadLocale,\n getAllKeys,\n} from '../utils';\n\nexport const listCommand = defineCommand({\n meta: {\n name: 'list',\n description: 'List and search translation keys',\n },\n args: {\n pattern: {\n type: 'positional',\n description: 'Search pattern (optional)',\n required: false,\n },\n dir: {\n type: 'string',\n alias: 'd',\n description: 'Locales directory',\n },\n locale: {\n type: 'string',\n alias: 'l',\n description: 'Locale to inspect (default: en)',\n default: 'en',\n },\n values: {\n type: 'boolean',\n alias: 'v',\n description: 'Show values',\n default: false,\n },\n },\n async run({ args }) {\n const localesDir = args.dir\n ? path.resolve(process.cwd(), args.dir)\n : getDefaultLocalesDir();\n\n try {\n const config = detectLocaleConfig(localesDir);\n const locale = args.locale || 'en';\n\n if (!config.locales.includes(locale)) {\n consola.error(`Locale \"${locale}\" not found. Available: ${config.locales.join(', ')}`);\n return;\n }\n\n consola.info(`Loading ${locale} from ${localesDir}`);\n const translations = await loadLocale(config, locale);\n const allKeys = getAllKeys(translations);\n\n // Filter by pattern\n const pattern = args.pattern?.toLowerCase();\n const filtered = pattern\n ? allKeys.filter(\n (k) =>\n k.path.toLowerCase().includes(pattern) ||\n String(k.value).toLowerCase().includes(pattern)\n )\n : allKeys;\n\n // Display\n consola.log('');\n consola.info(`Found ${filtered.length} keys${pattern ? ` matching \"${pattern}\"` : ''}`);\n consola.log('');\n\n for (const { path: keyPath, value } of filtered) {\n if (args.values) {\n consola.log(` ${keyPath}: ${JSON.stringify(value)}`);\n } else {\n consola.log(` ${keyPath}`);\n }\n }\n\n consola.log('');\n consola.info(`Total: ${filtered.length} / ${allKeys.length} keys`);\n } catch (error) {\n consola.error(error);\n }\n },\n});\n","/**\n * Check for missing translation keys\n */\n\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport * as path from 'node:path';\nimport {\n detectLocaleConfig,\n getDefaultLocalesDir,\n loadLocale,\n getAllKeys,\n getValueAtPath,\n} from '../utils';\n\nexport const checkCommand = defineCommand({\n meta: {\n name: 'check',\n description: 'Find missing translation keys across locales',\n },\n args: {\n dir: {\n type: 'string',\n alias: 'd',\n description: 'Locales directory',\n },\n base: {\n type: 'string',\n alias: 'b',\n description: 'Base locale to compare against',\n default: 'en',\n },\n fix: {\n type: 'boolean',\n description: 'Show suggested fixes',\n default: false,\n },\n },\n async run({ args }) {\n const localesDir = args.dir\n ? path.resolve(process.cwd(), args.dir)\n : getDefaultLocalesDir();\n\n try {\n const config = detectLocaleConfig(localesDir);\n const baseLocale = args.base || 'en';\n\n if (!config.locales.includes(baseLocale)) {\n consola.error(`Base locale \"${baseLocale}\" not found.`);\n return;\n }\n\n consola.info(`Checking locales in ${localesDir}`);\n consola.info(`Base locale: ${baseLocale}`);\n consola.log('');\n\n // Load base locale\n const baseTranslations = await loadLocale(config, baseLocale);\n const baseKeys = getAllKeys(baseTranslations);\n\n let totalMissing = 0;\n const missingByLocale: Record<string, string[]> = {};\n\n // Check each locale\n for (const locale of config.locales) {\n if (locale === baseLocale) continue;\n\n const translations = await loadLocale(config, locale);\n const missing: string[] = [];\n\n for (const { path: keyPath } of baseKeys) {\n const value = getValueAtPath(translations, keyPath);\n if (value === undefined) {\n missing.push(keyPath);\n }\n }\n\n if (missing.length > 0) {\n missingByLocale[locale] = missing;\n totalMissing += missing.length;\n }\n }\n\n // Report\n if (totalMissing === 0) {\n consola.success('All locales have all keys!');\n return;\n }\n\n consola.warn(`Found ${totalMissing} missing keys`);\n consola.log('');\n\n for (const [locale, missing] of Object.entries(missingByLocale)) {\n consola.log(`${locale} (${missing.length} missing):`);\n for (const key of missing.slice(0, 10)) {\n consola.log(` - ${key}`);\n }\n if (missing.length > 10) {\n consola.log(` ... and ${missing.length - 10} more`);\n }\n consola.log('');\n }\n\n // Summary\n consola.box({\n title: 'Summary',\n message: [\n `Base: ${baseLocale} (${baseKeys.length} keys)`,\n `Checked: ${config.locales.length - 1} locales`,\n `Missing: ${totalMissing} total`,\n ].join('\\n'),\n });\n } catch (error) {\n consola.error(error);\n }\n },\n});\n","/**\n * Add translation key to all locales\n */\n\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport * as path from 'node:path';\nimport {\n detectLocaleConfig,\n getDefaultLocalesDir,\n readLocaleFile,\n writeLocaleFile,\n getValueAtPath,\n loadLocale,\n} from '../utils';\n\nexport const addCommand = defineCommand({\n meta: {\n name: 'add',\n description: 'Add a translation key to all locales',\n },\n args: {\n key: {\n type: 'positional',\n description: 'Key path (e.g., \"tools.tour.next\")',\n required: true,\n },\n translations: {\n type: 'positional',\n description: 'JSON object with translations (e.g., \\'{\"en\":\"Next\",\"ru\":\"Далее\"}\\')',\n required: true,\n },\n dir: {\n type: 'string',\n alias: 'd',\n description: 'Locales directory',\n },\n force: {\n type: 'boolean',\n alias: 'f',\n description: 'Overwrite existing keys',\n default: false,\n },\n },\n async run({ args }) {\n const localesDir = args.dir\n ? path.resolve(process.cwd(), args.dir)\n : getDefaultLocalesDir();\n\n try {\n const config = detectLocaleConfig(localesDir);\n const keyPath = args.key;\n\n // Parse translations\n let translations: Record<string, string>;\n try {\n translations = JSON.parse(args.translations);\n } catch {\n consola.error('Invalid JSON for translations');\n consola.log('Example: \\'{\"en\":\"Next\",\"ru\":\"Далее\"}\\'');\n return;\n }\n\n consola.info(`Adding key: ${keyPath}`);\n consola.info(`Directory: ${localesDir}`);\n consola.log('');\n\n const keyParts = keyPath.split('.');\n let updated = 0;\n let skipped = 0;\n\n for (const locale of config.locales) {\n const translation = translations[locale];\n\n if (!translation) {\n consola.warn(` ${locale}: No translation provided, skipping`);\n skipped++;\n continue;\n }\n\n // Check if key exists\n const existing = await loadLocale(config, locale);\n const existingValue = getValueAtPath(existing, keyPath);\n\n if (existingValue !== undefined && !args.force) {\n consola.warn(` ${locale}: Key exists, use --force to overwrite`);\n skipped++;\n continue;\n }\n\n // Read and update file\n const { content, exportName } = readLocaleFile(config, locale);\n\n if (config.fileExtension === '.json') {\n // JSON file\n const json = JSON.parse(content);\n setNestedValue(json, keyParts, translation);\n writeLocaleFile(config, locale, JSON.stringify(json, null, 2));\n } else {\n // TypeScript file - use regex to insert\n const newContent = insertKeyIntoTS(content, exportName, keyParts, translation);\n writeLocaleFile(config, locale, newContent);\n }\n\n consola.success(` ${locale}: Added \"${translation}\"`);\n updated++;\n }\n\n consola.log('');\n consola.box({\n title: 'Result',\n message: `Updated: ${updated}, Skipped: ${skipped}`,\n });\n } catch (error) {\n consola.error(error);\n }\n },\n});\n\n/**\n * Set nested value in object\n */\nfunction setNestedValue(obj: Record<string, unknown>, keys: string[], value: string): void {\n let current = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n current[keys[keys.length - 1]] = value;\n}\n\n/**\n * Insert key into TypeScript locale file\n */\nfunction insertKeyIntoTS(\n content: string,\n exportName: string,\n keyParts: string[],\n value: string\n): string {\n // Find the object for the first key part\n const firstKey = keyParts[0];\n const restKeys = keyParts.slice(1);\n\n // Check if top-level key exists\n const topLevelRegex = new RegExp(`(${firstKey}:\\\\s*\\\\{)`, 'g');\n const hasTopLevel = topLevelRegex.test(content);\n\n if (!hasTopLevel) {\n // Add new top-level key before closing brace\n const closingBrace = content.lastIndexOf('}');\n const indent = ' ';\n const newEntry = buildNestedEntry(keyParts, value, indent);\n return (\n content.slice(0, closingBrace) + '\\n' + newEntry + '\\n' + content.slice(closingBrace)\n );\n }\n\n // Navigate to the right nesting level and insert\n // This is a simplified approach - for complex cases, consider AST parsing\n let insertPoint = content.indexOf(`${firstKey}:`);\n if (insertPoint === -1) return content;\n\n // Find the opening brace for this section\n let braceCount = 0;\n let foundStart = false;\n let insertIndex = insertPoint;\n\n for (let i = insertPoint; i < content.length; i++) {\n if (content[i] === '{') {\n braceCount++;\n foundStart = true;\n } else if (content[i] === '}') {\n braceCount--;\n if (foundStart && braceCount === 0) {\n // Insert before this closing brace\n insertIndex = i;\n break;\n }\n }\n }\n\n // Build the entry\n const indent = ' '; // 4 spaces for nested\n const entry = restKeys.length === 0\n ? `${indent}${keyParts[keyParts.length - 1]}: '${escapeQuotes(value)}',`\n : buildNestedEntry(restKeys, value, indent);\n\n return content.slice(0, insertIndex) + '\\n' + entry + '\\n ' + content.slice(insertIndex);\n}\n\n/**\n * Build nested entry string\n */\nfunction buildNestedEntry(keys: string[], value: string, baseIndent: string): string {\n if (keys.length === 1) {\n return `${baseIndent}${keys[0]}: '${escapeQuotes(value)}',`;\n }\n\n const [first, ...rest] = keys;\n const nestedContent = buildNestedEntry(rest, value, baseIndent + ' ');\n return `${baseIndent}${first}: {\\n${nestedContent}\\n${baseIndent}},`;\n}\n\n/**\n * Escape single quotes in value\n */\nfunction escapeQuotes(value: string): string {\n return value.replace(/'/g, \"\\\\'\");\n}\n","/**\n * Translate text or JSON using LLM\n */\n\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport {\n detectLocaleConfig,\n getDefaultLocalesDir,\n loadLocale,\n readLocaleFile,\n writeLocaleFile,\n getExportName,\n translateText,\n translateJson,\n getTranslatorStats,\n} from '../utils';\n\nexport const translateCommand = defineCommand({\n meta: {\n name: 'translate',\n description: 'Translate text or locale file using LLM',\n },\n args: {\n text: {\n type: 'positional',\n description: 'Text to translate or locale code (e.g., \"Hello\" or \"ru\")',\n required: false,\n },\n dir: {\n type: 'string',\n alias: 'd',\n description: 'Locales directory',\n },\n from: {\n type: 'string',\n alias: 'f',\n description: 'Source locale (default: en)',\n default: 'en',\n },\n to: {\n type: 'string',\n alias: 't',\n description: 'Target locales (comma-separated, e.g., \"ru,ko,ja\")',\n },\n json: {\n type: 'boolean',\n alias: 'j',\n description: 'Output as JSON',\n default: false,\n },\n file: {\n type: 'boolean',\n description: 'Translate entire locale file',\n default: false,\n },\n stats: {\n type: 'boolean',\n alias: 's',\n description: 'Show translation cache stats',\n default: false,\n },\n },\n async run({ args }) {\n // Show stats\n if (args.stats) {\n const stats = getTranslatorStats();\n if (stats) {\n consola.info('Translation Cache Stats:');\n consola.log(` Memory size: ${stats.memorySize}`);\n consola.log(` Hits: ${stats.hits}`);\n consola.log(` Misses: ${stats.misses}`);\n if (stats.languagePairs.length > 0) {\n consola.log(' Language pairs:');\n for (const { pair, translations } of stats.languagePairs) {\n consola.log(` ${pair}: ${translations} translations`);\n }\n }\n } else {\n consola.info('No translations performed yet.');\n }\n return;\n }\n\n const localesDir = args.dir\n ? path.resolve(process.cwd(), args.dir)\n : getDefaultLocalesDir();\n\n try {\n const config = detectLocaleConfig(localesDir);\n const sourceLocale = args.from || 'en';\n\n // Determine target locales\n let targetLocales: string[];\n if (args.to) {\n targetLocales = args.to.split(',').map((l) => l.trim());\n } else {\n // All locales except source\n targetLocales = config.locales.filter((l) => l !== sourceLocale);\n }\n\n // Translate entire file\n if (args.file || (args.text && config.locales.includes(args.text))) {\n const targetLocale = args.text || targetLocales[0];\n if (!targetLocale) {\n consola.error('Please specify target locale');\n return;\n }\n\n consola.info(`Translating ${sourceLocale} -> ${targetLocale}`);\n consola.info(`Directory: ${localesDir}`);\n\n const sourceData = await loadLocale(config, sourceLocale);\n const startTime = Date.now();\n\n // Translate section-by-section to avoid LLM output truncation on large files\n const topLevelKeys = Object.keys(sourceData);\n const translated: Record<string, unknown> = {};\n\n for (const section of topLevelKeys) {\n const sectionData = sourceData[section];\n consola.info(` [${section}] translating...`);\n const sectionTranslated = await translateJson(\n sectionData as Record<string, unknown>,\n targetLocale,\n sourceLocale,\n );\n translated[section] = sectionTranslated;\n consola.success(` [${section}] done`);\n }\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n consola.success(`Translated in ${elapsed}s`);\n\n // Write to file\n if (config.fileExtension === '.ts') {\n const exportName = getExportName(targetLocale);\n const { content } = readLocaleFile(config, targetLocale);\n const jsonStr = JSON.stringify(translated, null, 2);\n // Replace the exported object (from `export const X... = {` to end of file)\n const newContent = content.replace(\n /(export const \\w+[^=]*=\\s*)\\{[\\s\\S]*$/,\n `$1${jsonStr};\\n`\n );\n const finalContent = newContent !== content\n ? newContent\n : `import type { DocsTranslations } from './en';\\n\\nexport const ${exportName}: DocsTranslations = ${jsonStr};\\n`;\n writeLocaleFile(config, targetLocale, finalContent);\n consola.success(`Written to ${targetLocale}.ts`);\n } else {\n writeLocaleFile(config, targetLocale, JSON.stringify(translated, null, 2));\n consola.success(`Written to ${targetLocale}.json`);\n }\n\n if (args.json) {\n console.log(JSON.stringify(translated, null, 2));\n } else {\n // Show sample\n const sample = JSON.stringify(translated, null, 2).slice(0, 300);\n consola.log(sample + (sample.length >= 300 ? '\\n...' : ''));\n }\n\n return;\n }\n\n // Translate text\n const text = args.text;\n if (!text) {\n consola.error('Please provide text to translate or use --file flag');\n consola.log('');\n consola.log('Examples:');\n consola.log(' pnpm i18n translate \"Hello World\" --to ru,ko');\n consola.log(' pnpm i18n translate --file --to ru');\n consola.log(' pnpm i18n translate ru # Translate en.ts to ru');\n return;\n }\n\n consola.info(`Translating: \"${text}\"`);\n consola.log('');\n\n const translations: Record<string, string> = {\n [sourceLocale]: text,\n };\n\n for (const locale of targetLocales) {\n try {\n const translated = await translateText(text, locale, sourceLocale);\n translations[locale] = translated;\n consola.log(` ${locale}: ${translated}`);\n } catch (error) {\n consola.warn(` ${locale}: [FAILED] ${error instanceof Error ? error.message : error}`);\n }\n }\n\n consola.log('');\n if (args.json) {\n console.log(JSON.stringify(translations, null, 2));\n } else {\n consola.log('Copy-paste JSON:');\n console.log(JSON.stringify(translations));\n }\n } catch (error) {\n consola.error(error);\n }\n },\n});\n","/**\n * Sync translation keys across locales using LLM\n *\n * Uses batch translation for efficiency - all missing keys\n * are translated in a single LLM call per locale.\n */\n\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport * as path from 'node:path';\nimport {\n detectLocaleConfig,\n getDefaultLocalesDir,\n loadLocale,\n getAllKeys,\n getValueAtPath,\n readLocaleFile,\n writeLocaleFile,\n translateJson,\n getTranslatorStats,\n} from '../utils';\n\nexport const syncCommand = defineCommand({\n meta: {\n name: 'sync',\n description: 'Sync missing keys from base locale to all others using LLM',\n },\n args: {\n dir: {\n type: 'string',\n alias: 'd',\n description: 'Locales directory',\n },\n base: {\n type: 'string',\n alias: 'b',\n description: 'Base locale',\n default: 'en',\n },\n to: {\n type: 'string',\n alias: 't',\n description: 'Target locales (comma-separated). Default: all except base',\n },\n dry: {\n type: 'boolean',\n description: 'Dry run - show what would be changed',\n default: false,\n },\n translate: {\n type: 'boolean',\n alias: 'T',\n description: 'Translate missing values using LLM (default: add [TODO] placeholders)',\n default: false,\n },\n stats: {\n type: 'boolean',\n alias: 's',\n description: 'Show translation stats after sync',\n default: false,\n },\n },\n async run({ args }) {\n const localesDir = args.dir\n ? path.resolve(process.cwd(), args.dir)\n : getDefaultLocalesDir();\n\n try {\n const config = detectLocaleConfig(localesDir);\n const baseLocale = args.base || 'en';\n\n if (!config.locales.includes(baseLocale)) {\n consola.error(`Base locale \"${baseLocale}\" not found.`);\n return;\n }\n\n // Determine target locales\n let targetLocales: string[];\n if (args.to) {\n targetLocales = args.to.split(',').map((l) => l.trim());\n } else {\n targetLocales = config.locales.filter((l) => l !== baseLocale);\n }\n\n consola.info(`Syncing locales from ${baseLocale}`);\n consola.info(`Directory: ${localesDir}`);\n consola.info(`Targets: ${targetLocales.join(', ')}`);\n if (args.dry) consola.info('(Dry run - no changes will be made)');\n if (args.translate) consola.info('(LLM batch translation enabled)');\n consola.log('');\n\n // Load base locale\n const baseTranslations = await loadLocale(config, baseLocale);\n const baseKeys = getAllKeys(baseTranslations);\n\n let totalAdded = 0;\n let totalTranslated = 0;\n\n for (const locale of targetLocales) {\n if (!config.locales.includes(locale)) {\n consola.warn(`Locale \"${locale}\" not found, skipping`);\n continue;\n }\n\n const translations = await loadLocale(config, locale);\n const missing: Array<{ path: string; value: unknown }> = [];\n\n for (const { path: keyPath, value } of baseKeys) {\n const localeValue = getValueAtPath(translations, keyPath);\n if (localeValue === undefined) {\n missing.push({ path: keyPath, value });\n }\n }\n\n if (missing.length === 0) {\n consola.success(`${locale}: All keys present`);\n continue;\n }\n\n consola.warn(`${locale}: ${missing.length} missing keys`);\n\n if (args.dry) {\n for (const { path: keyPath, value } of missing.slice(0, 5)) {\n consola.log(` + ${keyPath}: ${JSON.stringify(value)}`);\n }\n if (missing.length > 5) {\n consola.log(` ... and ${missing.length - 5} more`);\n }\n continue;\n }\n\n // Actually sync\n const { content } = readLocaleFile(config, locale);\n\n if (config.fileExtension === '.json') {\n const json = JSON.parse(content);\n\n if (args.translate) {\n // Batch translate all missing keys at once\n const toTranslate: Record<string, string> = {};\n for (const { path: keyPath, value } of missing) {\n if (typeof value === 'string') {\n toTranslate[keyPath] = value;\n }\n }\n\n if (Object.keys(toTranslate).length > 0) {\n consola.info(` Translating ${Object.keys(toTranslate).length} texts...`);\n const startTime = Date.now();\n\n try {\n // Single LLM call for all texts\n const translated = await translateJson(toTranslate, locale, baseLocale);\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n consola.success(` Translated in ${elapsed}s`);\n\n // Apply translations\n for (const { path: keyPath, value } of missing) {\n if (typeof value === 'string' && translated[keyPath]) {\n setNestedValue(json, keyPath.split('.'), translated[keyPath]);\n totalTranslated++;\n } else {\n // Non-string or failed - add TODO\n const fallback = typeof value === 'string' ? `[TODO] ${value}` : JSON.stringify(value);\n setNestedValue(json, keyPath.split('.'), fallback);\n }\n }\n } catch (error) {\n consola.error(` Translation failed: ${error instanceof Error ? error.message : error}`);\n // Fallback to TODO placeholders\n for (const { path: keyPath, value } of missing) {\n const fallback = typeof value === 'string' ? `[TODO] ${value}` : JSON.stringify(value);\n setNestedValue(json, keyPath.split('.'), fallback);\n }\n }\n }\n } else {\n // No translation - add [TODO] placeholders\n for (const { path: keyPath, value } of missing) {\n const newValue = typeof value === 'string' ? `[TODO] ${value}` : JSON.stringify(value);\n setNestedValue(json, keyPath.split('.'), newValue);\n }\n }\n\n writeLocaleFile(config, locale, JSON.stringify(json, null, 2));\n totalAdded += missing.length;\n consola.success(` Added ${missing.length} keys`);\n } else {\n // TypeScript - more complex\n consola.warn(` TypeScript sync not fully implemented. Use JSON or 'add' command.`);\n continue;\n }\n }\n\n consola.log('');\n if (args.dry) {\n consola.info('Dry run complete. Use without --dry to apply changes.');\n } else {\n consola.success(`Sync complete. Added ${totalAdded} keys total.`);\n if (args.translate && totalTranslated > 0) {\n consola.info(`Translated ${totalTranslated} values using LLM (batch mode).`);\n }\n }\n\n // Show stats\n if (args.stats) {\n const stats = getTranslatorStats();\n if (stats && stats.memorySize > 0) {\n consola.log('');\n consola.info('Translation Cache:');\n consola.log(` Cached: ${stats.memorySize} | Hits: ${stats.hits} | Misses: ${stats.misses}`);\n }\n }\n } catch (error) {\n consola.error(error);\n }\n },\n});\n\n/**\n * Set nested value in object\n */\nfunction setNestedValue(obj: Record<string, unknown>, keys: string[], value: string): void {\n let current = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n current[keys[keys.length - 1]] = value;\n}\n","#!/usr/bin/env node\n/**\n * i18n CLI - Unified tool for managing translations\n *\n * Usage:\n * pnpm i18n list [pattern] - List/search keys\n * pnpm i18n check - Find missing keys\n * pnpm i18n add <key> <json> - Add key to all locales\n * pnpm i18n translate <text> - Generate translation JSON\n * pnpm i18n sync - Sync keys across locales\n * pnpm i18n init <dir> - Initialize i18n in a directory\n *\n * Can work with:\n * - Package locales (default): packages/i18n/src/locales\n * - App locales: --dir apps/studio/i18n/locales\n */\n\nimport { defineCommand, runMain } from 'citty';\nimport { consola } from 'consola';\n\nimport { listCommand } from './commands/list';\nimport { checkCommand } from './commands/check';\nimport { addCommand } from './commands/add';\nimport { translateCommand } from './commands/translate';\nimport { syncCommand } from './commands/sync';\n\nconst main = defineCommand({\n meta: {\n name: 'i18n',\n version: '1.0.0',\n description: 'CLI for managing i18n translations',\n },\n subCommands: {\n list: listCommand,\n check: checkCommand,\n add: addCommand,\n translate: translateCommand,\n sync: syncCommand,\n },\n setup() {\n consola.box('i18n CLI');\n },\n});\n\nrunMain(main);\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@djangocfg/i18n",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.179",
|
|
4
4
|
"description": "Lightweight i18n library for @djangocfg packages with built-in translations for English, Russian, and Korean",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"i18n",
|
|
@@ -72,13 +72,13 @@
|
|
|
72
72
|
"react": "^18.0.0 || ^19.0.0"
|
|
73
73
|
},
|
|
74
74
|
"dependencies": {
|
|
75
|
-
"@djangocfg/llm": "^2.1.
|
|
75
|
+
"@djangocfg/llm": "^2.1.179",
|
|
76
76
|
"citty": "^0.1.6",
|
|
77
77
|
"consola": "^3.4.0",
|
|
78
78
|
"jiti": "^2.4.2"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
|
-
"@djangocfg/typescript-config": "^2.1.
|
|
81
|
+
"@djangocfg/typescript-config": "^2.1.179",
|
|
82
82
|
"@types/node": "^25.2.3",
|
|
83
83
|
"@types/react": "^19.1.0",
|
|
84
84
|
"eslint": "^9.37.0",
|
|
@@ -115,7 +115,21 @@ export const translateCommand = defineCommand({
|
|
|
115
115
|
const sourceData = await loadLocale(config, sourceLocale);
|
|
116
116
|
const startTime = Date.now();
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
// Translate section-by-section to avoid LLM output truncation on large files
|
|
119
|
+
const topLevelKeys = Object.keys(sourceData);
|
|
120
|
+
const translated: Record<string, unknown> = {};
|
|
121
|
+
|
|
122
|
+
for (const section of topLevelKeys) {
|
|
123
|
+
const sectionData = sourceData[section];
|
|
124
|
+
consola.info(` [${section}] translating...`);
|
|
125
|
+
const sectionTranslated = await translateJson(
|
|
126
|
+
sectionData as Record<string, unknown>,
|
|
127
|
+
targetLocale,
|
|
128
|
+
sourceLocale,
|
|
129
|
+
);
|
|
130
|
+
translated[section] = sectionTranslated;
|
|
131
|
+
consola.success(` [${section}] done`);
|
|
132
|
+
}
|
|
119
133
|
|
|
120
134
|
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
121
135
|
consola.success(`Translated in ${elapsed}s`);
|