poly-lexis 0.3.1 → 0.4.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../node_modules/tsup/assets/esm_shims.js","../../src/translations/utils/utils.ts","../../src/translations/core/schema.ts","../../src/translations/core/types.ts","../../src/translations/cli/init.ts","../../src/translations/cli/generate-types.ts","../../src/cli/translations.ts","../../src/translations/cli/add-key.ts","../../src/translations/utils/translator.ts","../../src/translations/utils/google-translate-provider.ts","../../src/translations/cli/init-interactive.ts","../../src/translations/cli/manage.ts","../../src/translations/cli/auto-fill.ts","../../src/translations/cli/validate.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { TranslationFile, TranslationFiles } from '../core/types.js';\n\n/**\n * Read all translation files for a specific language\n */\nexport function readTranslations(translationsPath: string, language: string): TranslationFiles {\n const langPath = path.join(translationsPath, language);\n\n if (!fs.existsSync(langPath)) {\n return {};\n }\n\n const files = fs.readdirSync(langPath).filter((f) => f.endsWith('.json'));\n const translations: TranslationFiles = {};\n\n for (const file of files) {\n const namespace = path.basename(file, '.json');\n const filePath = path.join(langPath, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n translations[namespace] = JSON.parse(content) as TranslationFile;\n }\n\n return translations;\n}\n\n/**\n * Write translation file for a specific language and namespace\n */\nexport function writeTranslation(\n translationsPath: string,\n language: string,\n namespace: string,\n translations: TranslationFile\n): void {\n const langPath = path.join(translationsPath, language);\n\n if (!fs.existsSync(langPath)) {\n fs.mkdirSync(langPath, { recursive: true });\n }\n\n const filePath = path.join(langPath, `${namespace}.json`);\n fs.writeFileSync(filePath, `${JSON.stringify(translations, null, 2)}\\n`, 'utf-8');\n}\n\n/**\n * Get all available languages from the translations directory\n */\nexport function getAvailableLanguages(translationsPath: string): string[] {\n if (!fs.existsSync(translationsPath)) {\n return [];\n }\n\n return fs\n .readdirSync(translationsPath, { withFileTypes: true })\n .filter((dirent) => dirent.isDirectory())\n .map((dirent) => dirent.name);\n}\n\n/**\n * Get all namespaces for a specific language\n */\nexport function getNamespaces(translationsPath: string, language: string): string[] {\n const langPath = path.join(translationsPath, language);\n\n if (!fs.existsSync(langPath)) {\n return [];\n }\n\n return fs\n .readdirSync(langPath)\n .filter((f) => f.endsWith('.json'))\n .map((f) => path.basename(f, '.json'));\n}\n\n/**\n * Check if a string contains interpolation variables (e.g., {{variable}})\n */\nexport function hasInterpolation(text: string): boolean {\n return /\\{\\{[^}]+\\}\\}/g.test(text);\n}\n\n/**\n * Extract interpolation variable names from a string\n */\nexport function extractVariables(text: string): string[] {\n const matches = text.match(/\\{\\{([^}]+)\\}\\}/g);\n if (!matches) return [];\n return matches.map((match) => match.replace(/\\{\\{|\\}\\}/g, '').trim());\n}\n\n/**\n * Validate that translated text has the same variables as source text\n */\nexport function validateVariables(sourceText: string, translatedText: string): boolean {\n const sourceVars = extractVariables(sourceText).sort();\n const translatedVars = extractVariables(translatedText).sort();\n\n if (sourceVars.length !== translatedVars.length) {\n return false;\n }\n\n return sourceVars.every((v, i) => v === translatedVars[i]);\n}\n\n/**\n * Sort object keys alphabetically\n */\nexport function sortKeys<T extends Record<string, unknown>>(obj: T): T {\n const sorted = {} as T;\n const keys = Object.keys(obj).sort();\n for (const key of keys) {\n sorted[key as keyof T] = obj[key as keyof T];\n }\n return sorted;\n}\n\n/**\n * Ensure translations path exists and has proper structure\n */\nexport function ensureTranslationsStructure(translationsPath: string, languages: string[]): void {\n if (!fs.existsSync(translationsPath)) {\n fs.mkdirSync(translationsPath, { recursive: true });\n }\n\n for (const lang of languages) {\n const langPath = path.join(translationsPath, lang);\n if (!fs.existsSync(langPath)) {\n fs.mkdirSync(langPath, { recursive: true });\n }\n }\n}\n","/**\n * Translation provider types\n */\nexport const TRANSLATION_PROVIDERS = ['deepl', 'google'] as const;\nexport type TranslationProviderType = (typeof TRANSLATION_PROVIDERS)[number];\n\n/**\n * DeepL supported target languages\n * Based on DeepL API v2 documentation\n */\nexport const DEEPL_LANGUAGES = [\n 'ar', // Arabic\n 'bg', // Bulgarian\n 'cs', // Czech\n 'da', // Danish\n 'de', // German\n 'el', // Greek\n 'en', // English (unspecified)\n 'en_gb', // English (British)\n 'en_us', // English (American)\n 'es', // Spanish\n 'es_419', // Spanish (Latin American)\n 'et', // Estonian\n 'fi', // Finnish\n 'fr', // French\n 'he', // Hebrew (next-gen models only)\n 'hu', // Hungarian\n 'id', // Indonesian\n 'it', // Italian\n 'ja', // Japanese\n 'ko', // Korean\n 'lt', // Lithuanian\n 'lv', // Latvian\n 'nb', // Norwegian Bokmål\n 'nl', // Dutch\n 'pl', // Polish\n 'pt', // Portuguese (unspecified)\n 'pt_br', // Portuguese (Brazilian)\n 'pt_pt', // Portuguese (excluding Brazilian)\n 'ro', // Romanian\n 'ru', // Russian\n 'sk', // Slovak\n 'sl', // Slovenian\n 'sv', // Swedish\n 'th', // Thai (next-gen models only)\n 'tr', // Turkish\n 'uk', // Ukrainian\n 'vi', // Vietnamese (next-gen models only)\n 'zh', // Chinese (unspecified)\n 'zh_hans', // Chinese (simplified)\n 'zh_hant' // Chinese (traditional)\n] as const;\n\n/**\n * Google Translate supported languages\n * Based on Google Cloud Translation API v2\n * Reference: https://docs.cloud.google.com/translate/docs/languages\n */\nexport const GOOGLE_LANGUAGES = [\n 'af', // Afrikaans\n 'sq', // Albanian\n 'am', // Amharic\n 'ar', // Arabic\n 'hy', // Armenian\n 'az', // Azerbaijani\n 'eu', // Basque\n 'be', // Belarusian\n 'bn', // Bengali\n 'bs', // Bosnian\n 'bg', // Bulgarian\n 'ca', // Catalan\n 'ceb', // Cebuano\n 'zh', // Chinese (Simplified)\n 'zh_cn', // Chinese (Simplified)\n 'zh_tw', // Chinese (Traditional)\n 'co', // Corsican\n 'hr', // Croatian\n 'cs', // Czech\n 'da', // Danish\n 'nl', // Dutch\n 'en', // English\n 'eo', // Esperanto\n 'et', // Estonian\n 'fi', // Finnish\n 'fr', // French\n 'fy', // Frisian\n 'gl', // Galician\n 'ka', // Georgian\n 'de', // German\n 'el', // Greek\n 'gu', // Gujarati\n 'ht', // Haitian Creole\n 'ha', // Hausa\n 'haw', // Hawaiian\n 'he', // Hebrew\n 'hi', // Hindi\n 'hmn', // Hmong\n 'hu', // Hungarian\n 'is', // Icelandic\n 'ig', // Igbo\n 'id', // Indonesian\n 'ga', // Irish\n 'it', // Italian\n 'ja', // Japanese\n 'jv', // Javanese\n 'kn', // Kannada\n 'kk', // Kazakh\n 'km', // Khmer\n 'rw', // Kinyarwanda\n 'ko', // Korean\n 'ku', // Kurdish\n 'ky', // Kyrgyz\n 'lo', // Lao\n 'la', // Latin\n 'lv', // Latvian\n 'lt', // Lithuanian\n 'lb', // Luxembourgish\n 'mk', // Macedonian\n 'mg', // Malagasy\n 'ms', // Malay\n 'ml', // Malayalam\n 'mt', // Maltese\n 'mi', // Maori\n 'mr', // Marathi\n 'mn', // Mongolian\n 'my', // Myanmar (Burmese)\n 'ne', // Nepali\n 'no', // Norwegian\n 'ny', // Nyanja (Chichewa)\n 'or', // Odia (Oriya)\n 'ps', // Pashto\n 'fa', // Persian\n 'pl', // Polish\n 'pt', // Portuguese\n 'pt_br', // Portuguese (Brazil)\n 'pa', // Punjabi\n 'ro', // Romanian\n 'ru', // Russian\n 'sm', // Samoan\n 'gd', // Scots Gaelic\n 'sr', // Serbian\n 'st', // Sesotho\n 'sn', // Shona\n 'sd', // Sindhi\n 'si', // Sinhala (Sinhalese)\n 'sk', // Slovak\n 'sl', // Slovenian\n 'so', // Somali\n 'es', // Spanish\n 'su', // Sundanese\n 'sw', // Swahili\n 'sv', // Swedish\n 'tl', // Tagalog (Filipino)\n 'tg', // Tajik\n 'ta', // Tamil\n 'tt', // Tatar\n 'te', // Telugu\n 'th', // Thai\n 'tr', // Turkish\n 'tk', // Turkmen\n 'uk', // Ukrainian\n 'ur', // Urdu\n 'ug', // Uyghur\n 'uz', // Uzbek\n 'vi', // Vietnamese\n 'cy', // Welsh\n 'xh', // Xhosa\n 'yi', // Yiddish\n 'yo', // Yoruba\n 'zu' // Zulu\n] as const;\n\n/**\n * All supported language codes (union of DeepL and Google Translate)\n */\nexport const SUPPORTED_LANGUAGES = Array.from(\n new Set([...DEEPL_LANGUAGES, ...GOOGLE_LANGUAGES])\n).sort() as readonly string[];\n\nexport type DeepLLanguage = (typeof DEEPL_LANGUAGES)[number];\nexport type GoogleLanguage = (typeof GOOGLE_LANGUAGES)[number];\nexport type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];\n\n/**\n * JSON Schema for .translationsrc.json\n */\nexport const TRANSLATION_CONFIG_SCHEMA = {\n title: 'Translation Configuration',\n description: 'Configuration for the translation management system',\n type: 'object',\n properties: {\n $schema: {\n type: 'string',\n description: 'JSON Schema reference'\n },\n translationsPath: {\n type: 'string',\n description: 'Path to the translations directory relative to project root',\n default: 'public/static/locales',\n examples: ['public/static/locales', 'src/locales', 'locales']\n },\n languages: {\n type: 'array',\n description: 'List of language codes to support',\n items: {\n type: 'string',\n enum: SUPPORTED_LANGUAGES\n },\n minItems: 1,\n uniqueItems: true,\n default: ['en']\n },\n sourceLanguage: {\n type: 'string',\n description: 'Source language for translations (usually \"en\")',\n enum: SUPPORTED_LANGUAGES,\n default: 'en'\n },\n typesOutputPath: {\n type: 'string',\n description: 'Path to output TypeScript types file',\n default: 'src/types/i18nTypes.ts',\n examples: ['src/types/i18nTypes.ts', 'src/types/translations.ts']\n },\n provider: {\n type: 'string',\n description: 'Translation provider to use (deepl or google)',\n enum: TRANSLATION_PROVIDERS,\n default: 'deepl'\n }\n },\n required: ['translationsPath', 'languages', 'sourceLanguage'],\n additionalProperties: false\n};\n\n/**\n * Validate if a language code is supported\n */\nexport function isValidLanguage(lang: string): lang is SupportedLanguage {\n return SUPPORTED_LANGUAGES.includes(lang as SupportedLanguage);\n}\n\n/**\n * Validate if a language is supported by DeepL\n */\nexport function isValidDeepLLanguage(lang: string): lang is DeepLLanguage {\n return DEEPL_LANGUAGES.includes(lang as DeepLLanguage);\n}\n\n/**\n * Validate if a language is supported by Google Translate\n */\nexport function isValidGoogleLanguage(lang: string): lang is GoogleLanguage {\n return GOOGLE_LANGUAGES.includes(lang as GoogleLanguage);\n}\n\n/**\n * Validate if a language is supported by a specific provider\n */\nexport function isValidLanguageForProvider(lang: string, provider: TranslationProviderType): boolean {\n switch (provider) {\n case 'deepl':\n return isValidDeepLLanguage(lang);\n case 'google':\n return isValidGoogleLanguage(lang);\n default:\n return false;\n }\n}\n\n/**\n * Validate languages array\n */\nexport function validateLanguages(languages: string[]): {\n valid: boolean;\n invalid: string[];\n} {\n const invalid = languages.filter((lang) => !isValidLanguage(lang));\n return {\n valid: invalid.length === 0,\n invalid\n };\n}\n\n/**\n * Validate languages array for a specific provider\n */\nexport function validateLanguagesForProvider(\n languages: string[],\n provider: TranslationProviderType\n): {\n valid: boolean;\n invalid: string[];\n} {\n const invalid = languages.filter((lang) => !isValidLanguageForProvider(lang, provider));\n return {\n valid: invalid.length === 0,\n invalid\n };\n}\n\n/**\n * Get supported languages for a specific provider\n */\nexport function getSupportedLanguages(provider: TranslationProviderType): readonly string[] {\n switch (provider) {\n case 'deepl':\n return DEEPL_LANGUAGES;\n case 'google':\n return GOOGLE_LANGUAGES;\n default:\n return [];\n }\n}\n","export interface TranslationConfig {\n /** Path to the translations directory (default: public/static/locales) */\n translationsPath?: string;\n /** Languages to support (default: ['en']) */\n languages?: string[];\n /** Source language for translations (default: 'en') */\n sourceLanguage?: string;\n /** Path to output i18n types (default: src/types/i18nTypes.ts) */\n typesOutputPath?: string;\n}\n\nexport interface TranslationEntry {\n namespace: string;\n key: string;\n value: string;\n}\n\nexport interface TranslationFile {\n [key: string]: string;\n}\n\nexport interface TranslationFiles {\n [namespace: string]: TranslationFile;\n}\n\nexport interface MissingTranslation {\n namespace: string;\n key: string;\n language: string;\n sourceValue: string;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n missing: MissingTranslation[];\n empty: MissingTranslation[];\n}\n\nexport const DEFAULT_CONFIG: Required<TranslationConfig> = {\n translationsPath: 'public/static/locales',\n languages: ['en'],\n sourceLanguage: 'en',\n typesOutputPath: 'src/types/i18nTypes.ts'\n};\n\nexport const DEFAULT_LANGUAGES = [\n 'en',\n 'fr',\n 'it',\n 'pl',\n 'es',\n 'pt',\n 'de',\n 'de_at',\n 'nl',\n 'sv',\n 'hu',\n 'cs',\n 'ja',\n 'zh_hk'\n] as const;\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { validateLanguages } from '../core/schema.js';\nimport type { TranslationConfig } from '../core/types.js';\nimport { DEFAULT_CONFIG, DEFAULT_LANGUAGES } from '../core/types.js';\nimport { ensureTranslationsStructure, getAvailableLanguages } from '../utils/utils.js';\n\n/**\n * Detect existing translation structure in common locations\n */\nexport function detectExistingTranslations(projectRoot: string): {\n path: string | null;\n languages: string[];\n} {\n const possiblePaths = ['public/static/locales', 'public/locales', 'src/locales', 'locales', 'i18n', 'translations'];\n\n for (const possiblePath of possiblePaths) {\n const fullPath = path.join(projectRoot, possiblePath);\n if (fs.existsSync(fullPath)) {\n const languages = getAvailableLanguages(fullPath);\n if (languages.length > 0) {\n return { path: possiblePath, languages };\n }\n }\n }\n\n return { path: null, languages: [] };\n}\n\n/**\n * Initialize translation structure for a project\n */\nexport function initTranslations(projectRoot: string, config: TranslationConfig = {}): void {\n console.log('=====');\n console.log('Initializing translation structure');\n console.log('=====');\n\n // Detect existing translations\n const existing = detectExistingTranslations(projectRoot);\n\n let finalConfig = { ...DEFAULT_CONFIG, ...config };\n\n // Use detected path and languages if found\n if (existing.path && existing.languages.length > 0) {\n console.log(`✓ Detected existing translations at: ${existing.path}`);\n console.log(`✓ Found languages: ${existing.languages.join(', ')}`);\n\n // Validate detected languages\n const validation = validateLanguages(existing.languages);\n if (!validation.valid) {\n console.log(`⚠️ Warning: Invalid language codes found: ${validation.invalid.join(', ')}`);\n console.log('These languages will be skipped.');\n }\n\n const validLanguages = existing.languages.filter((lang) => !validation.invalid.includes(lang));\n\n finalConfig = {\n ...finalConfig,\n translationsPath: existing.path,\n languages: validLanguages.length > 0 ? validLanguages : finalConfig.languages\n };\n }\n\n const translationsPath = path.join(projectRoot, finalConfig.translationsPath);\n const languages = finalConfig.languages.length > 0 ? finalConfig.languages : [...DEFAULT_LANGUAGES];\n\n console.log(`Project root: ${projectRoot}`);\n console.log(`Translations path: ${translationsPath}`);\n console.log(`Languages: ${languages.join(', ')}`);\n console.log('=====');\n\n // Validate languages\n const validation = validateLanguages(languages);\n if (!validation.valid) {\n throw new Error(`Invalid language codes: ${validation.invalid.join(', ')}`);\n }\n\n // Create directory structure\n ensureTranslationsStructure(translationsPath, languages);\n\n // Create sample translation files for English (source language)\n const sourceLanguage = finalConfig.sourceLanguage;\n const sourcePath = path.join(translationsPath, sourceLanguage);\n\n // Create a sample common.json if it doesn't exist\n const commonPath = path.join(sourcePath, 'common.json');\n if (!fs.existsSync(commonPath)) {\n const sampleTranslations = {\n LOADING: 'Loading',\n SAVE: 'Save',\n CANCEL: 'Cancel',\n SUBMIT: 'Submit',\n ERROR: 'Error',\n SUCCESS: 'Success'\n };\n\n fs.writeFileSync(commonPath, `${JSON.stringify(sampleTranslations, null, 2)}\\n`, 'utf-8');\n console.log(`Created sample file: ${commonPath}`);\n }\n\n // Create empty translation files for other languages\n for (const lang of languages) {\n if (lang === sourceLanguage) continue;\n\n const langCommonPath = path.join(translationsPath, lang, 'common.json');\n if (!fs.existsSync(langCommonPath)) {\n fs.writeFileSync(langCommonPath, '{}\\n', 'utf-8');\n console.log(`Created empty file: ${langCommonPath}`);\n }\n }\n\n // Create config file with schema reference\n const configPath = path.join(projectRoot, '.translationsrc.json');\n if (!fs.existsSync(configPath)) {\n const configContent = {\n $schema: './node_modules/@repo/env-scripts/dist/translations/core/translations-config.schema.json',\n translationsPath: finalConfig.translationsPath,\n languages,\n sourceLanguage,\n typesOutputPath: finalConfig.typesOutputPath\n };\n\n fs.writeFileSync(configPath, `${JSON.stringify(configContent, null, 2)}\\n`, 'utf-8');\n console.log(`Created config file: ${configPath}`);\n }\n\n console.log('=====');\n console.log('Translation structure initialized successfully!');\n console.log('=====');\n}\n\n/**\n * Load translation configuration from .translationsrc.json\n */\nexport function loadConfig(projectRoot: string): Required<TranslationConfig> {\n const configPath = path.join(projectRoot, '.translationsrc.json');\n\n if (!fs.existsSync(configPath)) {\n // Try to detect existing translations\n const existing = detectExistingTranslations(projectRoot);\n if (existing.path && existing.languages.length > 0) {\n console.log(`ℹ️ No config found, but detected translations at ${existing.path}`);\n return {\n ...DEFAULT_CONFIG,\n translationsPath: existing.path,\n languages: existing.languages\n };\n }\n return DEFAULT_CONFIG;\n }\n\n const configContent = fs.readFileSync(configPath, 'utf-8');\n const config = JSON.parse(configContent) as TranslationConfig;\n\n // Validate languages in config\n if (config.languages) {\n const validation = validateLanguages(config.languages);\n if (!validation.valid) {\n console.warn(`⚠️ Warning: Invalid language codes in config: ${validation.invalid.join(', ')}`);\n console.warn('Please update .translationsrc.json with valid language codes.');\n }\n }\n\n return { ...DEFAULT_CONFIG, ...config };\n}\n","import { execSync } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { getNamespaces, readTranslations } from '../utils/utils.js';\nimport { loadConfig } from './init.js';\n\nconst typeTemplate = (translationKeys: string[], namespaceKeys: string[]): string => `\n export const translationKeys = [${translationKeys.map((key) => `\"${key}\"`).join(', ')}] as const;\n export const namespaceKeys = [${namespaceKeys.map((key) => `\"${key}\"`).join(', ')}] as const;\n\n export type TranslationKey = typeof translationKeys[number];\n export type TranslationNamespace = typeof namespaceKeys[number];\n`;\n\n/**\n * Generate TypeScript types from translation files\n */\nexport function generateTranslationTypes(projectRoot: string = process.cwd()): void {\n console.log('=====');\n console.time('i18n types generated');\n console.log('Generating i18n types');\n console.log('=====');\n\n const config = loadConfig(projectRoot);\n const translationsPath = path.join(projectRoot, config.translationsPath);\n const sourceLanguage = config.sourceLanguage;\n const outputFilePath = path.join(projectRoot, config.typesOutputPath);\n\n const dirPath = path.join(translationsPath, sourceLanguage);\n\n // Check if the source language directory exists\n if (!fs.existsSync(dirPath)) {\n throw new Error(`Source language directory not found: ${dirPath}`);\n }\n\n // Get namespaces\n const namespaces = getNamespaces(translationsPath, sourceLanguage);\n\n if (namespaces.length === 0) {\n throw new Error(`No translation files found in ${dirPath}`);\n }\n\n // Read all translation files and collect keys\n const translations = readTranslations(translationsPath, sourceLanguage);\n let allKeys: string[] = [];\n\n for (const namespace of namespaces) {\n const keys = Object.keys(translations[namespace] || {});\n allKeys = allKeys.concat(keys);\n }\n\n // Ensure the output directory exists\n const outputDir = path.dirname(outputFilePath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n const typeString = typeTemplate(allKeys, namespaces);\n fs.writeFileSync(outputFilePath, typeString, 'utf8');\n\n console.log(`Generated types with ${allKeys.length} keys and ${namespaces.length} namespaces`);\n console.log(`Output: ${outputFilePath}`);\n\n // Format with Biome\n try {\n execSync(`pnpm biome format --write ${outputFilePath}`, {\n stdio: 'inherit',\n cwd: projectRoot\n });\n } catch {\n console.warn('Failed to format with Biome, continuing without formatting...');\n }\n\n console.timeEnd('i18n types generated');\n console.log('=====');\n}\n","import 'dotenv/config';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { parseArgs } from 'node:util';\nimport { confirm, input, select } from '@inquirer/prompts';\nimport { addTranslationKey } from '../translations/cli/add-key.js';\nimport { loadConfig } from '../translations/cli/init.js';\nimport { initTranslationsInteractive } from '../translations/cli/init-interactive.js';\nimport { manageTranslations } from '../translations/cli/manage.js';\nimport { getNamespaces } from '../translations/utils/utils.js';\n\nconst { values, positionals } = parseArgs({\n options: {\n 'auto-fill': {\n type: 'boolean',\n short: 'a',\n default: false\n },\n 'api-key': {\n type: 'string'\n },\n limit: {\n type: 'string',\n default: '1000'\n },\n language: {\n type: 'string',\n short: 'l'\n },\n 'skip-types': {\n type: 'boolean',\n default: false\n },\n 'dry-run': {\n type: 'boolean',\n short: 'd',\n default: false\n },\n namespace: {\n type: 'string',\n short: 'n'\n },\n key: {\n type: 'string',\n short: 'k'\n },\n value: {\n type: 'string',\n short: 'v'\n },\n help: {\n type: 'boolean',\n short: 'h'\n }\n },\n allowPositionals: true\n});\n\nif (values.help) {\n console.log(`\nUsage: translations [command] [options]\n\nSmart translation management - automatically handles initialization, validation,\nauto-filling, and type generation based on your project's current state.\n\nCommands:\n (none) Smart mode - validates, fills, and generates types\n add Add a new translation key\n\nOptions (Smart Mode):\n -a, --auto-fill Auto-fill missing translations with Google Translate\n --api-key <key> Google Translate API key (or set GOOGLE_TRANSLATE_API_KEY)\n -l, --language <lang> Process only this language\n --limit <number> Max translations to process (default: 1000)\n --skip-types Skip TypeScript type generation\n -d, --dry-run Preview changes without saving\n -h, --help Show this help\n\nOptions (Add Mode):\n -n, --namespace <name> Namespace for the translation\n -k, --key <key> Translation key\n -v, --value <value> Translation value in source language\n -a, --auto-fill Auto-translate to all languages\n\n (no options) Interactive mode - prompts for all inputs\n\nExamples:\n # Smart mode - check and validate translations\n translations\n\n # Smart mode - validate and auto-fill missing translations\n export GOOGLE_TRANSLATE_API_KEY=your_key\n translations --auto-fill\n\n # Smart mode - auto-fill only French translations\n translations --auto-fill --language fr\n\n # Preview what would be translated (dry-run)\n translations --auto-fill --dry-run\n\n # Add a new translation key (interactive mode)\n translations add\n\n # Add with flags (non-interactive)\n translations add --namespace common --key HELLO --value \"Hello\"\n\n # Add with auto-translation\n translations add -n common -k WELCOME -v \"Welcome\" --auto-fill\n\nWhat happens in smart mode:\n 1. Checks if translations are initialized (creates .translationsrc.json if needed)\n 2. Validates all translations against source language\n 3. Auto-fills missing translations if --auto-fill is provided\n 4. Generates TypeScript types (unless --skip-types)\n 5. Shows summary and next steps\n`);\n process.exit(0);\n}\n\nconst command = positionals[0];\n\n// Handle 'add' command\nif (command === 'add') {\n // Interactive mode if no options provided\n if (!values.namespace && !values.key && !values.value) {\n (async () => {\n try {\n console.log('\\n✨ Add a new translation key\\n');\n\n // Check if initialized\n const configPath = path.join(process.cwd(), '.translationsrc.json');\n const isInitialized = fs.existsSync(configPath);\n\n if (!isInitialized) {\n console.log('⚠️ Translation structure not initialized.');\n const shouldInit = await confirm({\n message: 'Would you like to initialize it now?',\n default: true\n });\n\n if (shouldInit) {\n await initTranslationsInteractive(process.cwd());\n console.log();\n } else {\n console.log('❌ Cannot add translations without initialization.');\n process.exit(1);\n }\n }\n\n // Load config to get existing namespaces\n const config = loadConfig(process.cwd());\n const translationsPath = path.join(process.cwd(), config.translationsPath);\n const existingNamespaces = getNamespaces(translationsPath, config.sourceLanguage);\n\n // Prompt for namespace\n let namespace: string;\n if (existingNamespaces.length > 0) {\n const namespaceChoice = await select({\n message: 'Select namespace:',\n choices: [\n ...existingNamespaces.map((ns) => ({ name: ns, value: ns })),\n { name: '➕ Create new namespace', value: '__new__' }\n ]\n });\n\n if (namespaceChoice === '__new__') {\n namespace = await input({\n message: 'Enter new namespace name:',\n validate: (value) => {\n if (!value.trim()) return 'Namespace is required';\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Namespace must contain only lowercase letters, numbers, and hyphens';\n }\n return true;\n }\n });\n } else {\n namespace = namespaceChoice;\n }\n } else {\n namespace = await input({\n message: 'Enter namespace name (e.g., common, members):',\n default: 'common',\n validate: (value) => {\n if (!value.trim()) return 'Namespace is required';\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Namespace must contain only lowercase letters, numbers, and hyphens';\n }\n return true;\n }\n });\n }\n\n // Prompt for key\n const key = await input({\n message: 'Enter translation key (UPPERCASE_SNAKE_CASE):',\n validate: (value) => {\n if (!value.trim()) return 'Key is required';\n if (!/^[A-Z0-9_]+$/.test(value)) {\n return 'Key should use UPPERCASE_SNAKE_CASE (e.g., SAVE_CHANGES)';\n }\n return true;\n },\n transformer: (value) => value.toUpperCase()\n });\n\n // Prompt for value\n const value = await input({\n message: `Enter ${config.sourceLanguage.toUpperCase()} translation:`,\n validate: (value) => {\n if (!value.trim()) return 'Translation value is required';\n return true;\n }\n });\n\n // Ask about auto-translation\n const autoTranslate = await confirm({\n message: `Auto-translate to ${config.languages.length - 1} other languages?`,\n default: true\n });\n\n let apiKey: string | undefined;\n if (autoTranslate) {\n apiKey = values['api-key'] || process.env.GOOGLE_TRANSLATE_API_KEY;\n if (!apiKey) {\n console.log('\\n⚠️ GOOGLE_TRANSLATE_API_KEY environment variable not found.');\n console.log('Skipping auto-translation. Set this variable to enable auto-translation.\\n');\n }\n }\n\n console.log();\n\n // Add the translation\n await addTranslationKey(process.cwd(), {\n namespace,\n key: key.toUpperCase(),\n value,\n autoTranslate: autoTranslate && !!apiKey,\n apiKey\n });\n\n console.log('\\n💡 Run \"translations\" to validate and generate types');\n } catch (error) {\n if ((error as { message?: string }).message === 'User force closed the prompt') {\n console.log('\\n❌ Cancelled');\n process.exit(0);\n }\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n })();\n } else {\n // Non-interactive mode with flags\n if (!values.namespace || !values.key || !values.value) {\n console.error('Error: --namespace, --key, and --value are required for add command');\n console.log('Use --help for usage information');\n process.exit(1);\n }\n\n const apiKey = values['api-key'] || process.env.GOOGLE_TRANSLATE_API_KEY;\n\n if (values['auto-fill'] && !apiKey) {\n console.error(\n 'Error: --api-key or GOOGLE_TRANSLATE_API_KEY environment variable is required for auto-translation'\n );\n process.exit(1);\n }\n\n addTranslationKey(process.cwd(), {\n namespace: values.namespace,\n key: values.key,\n value: values.value,\n autoTranslate: values['auto-fill'],\n apiKey\n })\n .then(() => {\n console.log('\\n💡 Run \"translations\" to validate and generate types');\n })\n .catch((error) => {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n });\n }\n} else if (command) {\n console.error(`Unknown command: ${command}`);\n console.log('Use --help for usage information');\n process.exit(1);\n} else {\n // Check if any flags were provided\n const hasFlags = values['auto-fill'] || values.language || values['skip-types'] || values['dry-run'];\n\n if (hasFlags) {\n // Flag mode - run with provided options\n const apiKey = values['api-key'] || process.env.GOOGLE_TRANSLATE_API_KEY;\n const limit = Number.parseInt(values.limit || '1000', 10);\n\n manageTranslations(process.cwd(), {\n autoFill: values['auto-fill'],\n apiKey,\n limit,\n language: values.language,\n skipTypes: values['skip-types'],\n dryRun: values['dry-run']\n })\n .then((isValid) => {\n if (!isValid) {\n process.exit(1);\n }\n })\n .catch((error) => {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n });\n } else {\n // Interactive menu mode - show options\n (async () => {\n try {\n const configPath = path.join(process.cwd(), '.translationsrc.json');\n const isInitialized = fs.existsSync(configPath);\n\n console.log('\\n🌍 Translation Management\\n');\n\n const action = await select({\n message: 'What would you like to do?',\n choices: [\n {\n name: '✨ Add a new translation key',\n value: 'add',\n description: 'Add a translation key to all languages'\n },\n {\n name: '🔍 Validate translations',\n value: 'validate',\n description: 'Check for missing or empty translations'\n },\n {\n name: '🤖 Auto-fill missing translations',\n value: 'autofill',\n description: 'Automatically translate missing keys with Google Translate'\n },\n {\n name: '📝 Generate TypeScript types',\n value: 'types',\n description: 'Generate types from translation files'\n },\n {\n name: '⚙️ Initialize/reconfigure',\n value: 'init',\n description: 'Set up or change translation configuration'\n },\n {\n name: '📊 Full check (validate + types)',\n value: 'full',\n description: 'Validate translations and generate types'\n }\n ]\n });\n\n console.log();\n\n if (action === 'add') {\n // Run add command in interactive mode\n if (!isInitialized) {\n console.log('⚠️ Translation structure not initialized.');\n const shouldInit = await confirm({\n message: 'Would you like to initialize it now?',\n default: true\n });\n\n if (shouldInit) {\n await initTranslationsInteractive(process.cwd());\n console.log();\n } else {\n console.log('❌ Cannot add translations without initialization.');\n process.exit(1);\n }\n }\n\n const config = loadConfig(process.cwd());\n const translationsPath = path.join(process.cwd(), config.translationsPath);\n const existingNamespaces = getNamespaces(translationsPath, config.sourceLanguage);\n\n let namespace: string;\n if (existingNamespaces.length > 0) {\n const namespaceChoice = await select({\n message: 'Select namespace:',\n choices: [\n ...existingNamespaces.map((ns) => ({ name: ns, value: ns })),\n { name: '➕ Create new namespace', value: '__new__' }\n ]\n });\n\n if (namespaceChoice === '__new__') {\n namespace = await input({\n message: 'Enter new namespace name:',\n validate: (value) => {\n if (!value.trim()) return 'Namespace is required';\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Namespace must contain only lowercase letters, numbers, and hyphens';\n }\n return true;\n }\n });\n } else {\n namespace = namespaceChoice;\n }\n } else {\n namespace = await input({\n message: 'Enter namespace name (e.g., common, members):',\n default: 'common',\n validate: (value) => {\n if (!value.trim()) return 'Namespace is required';\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Namespace must contain only lowercase letters, numbers, and hyphens';\n }\n return true;\n }\n });\n }\n\n const key = await input({\n message: 'Enter translation key (UPPERCASE_SNAKE_CASE):',\n validate: (value) => {\n if (!value.trim()) return 'Key is required';\n if (!/^[A-Z0-9_]+$/.test(value)) {\n return 'Key should use UPPERCASE_SNAKE_CASE (e.g., SAVE_CHANGES)';\n }\n return true;\n },\n transformer: (value) => value.toUpperCase()\n });\n\n const value = await input({\n message: `Enter ${config.sourceLanguage.toUpperCase()} translation:`,\n validate: (value) => {\n if (!value.trim()) return 'Translation value is required';\n return true;\n }\n });\n\n // Ask about auto-translation\n const autoTranslate = await confirm({\n message: `Auto-translate to ${config.languages.length - 1} other languages?`,\n default: true\n });\n\n let apiKey: string | undefined;\n if (autoTranslate) {\n apiKey = process.env.GOOGLE_TRANSLATE_API_KEY;\n if (!apiKey) {\n console.log('\\n⚠️ GOOGLE_TRANSLATE_API_KEY environment variable not found.');\n console.log('Skipping auto-translation. Set this variable to enable auto-translation.\\n');\n }\n }\n\n console.log();\n\n await addTranslationKey(process.cwd(), {\n namespace,\n key: key.toUpperCase(),\n value,\n autoTranslate: autoTranslate && !!apiKey,\n apiKey\n });\n\n console.log('\\n💡 Run \"translations\" again to validate and generate types');\n } else if (action === 'init') {\n await initTranslationsInteractive(process.cwd());\n } else if (action === 'validate') {\n await manageTranslations(process.cwd(), {\n skipTypes: true\n });\n } else if (action === 'autofill') {\n const apiKey = process.env.GOOGLE_TRANSLATE_API_KEY;\n if (!apiKey) {\n console.log('⚠️ GOOGLE_TRANSLATE_API_KEY environment variable not found.');\n console.log('Please set it to enable auto-translation.\\n');\n process.exit(1);\n }\n\n const shouldContinue = await confirm({\n message: 'This will auto-translate all missing keys. Continue?',\n default: true\n });\n\n if (shouldContinue) {\n await manageTranslations(process.cwd(), {\n autoFill: true,\n apiKey\n });\n }\n } else if (action === 'types') {\n console.log('📝 Generating TypeScript types...\\n');\n const { generateTranslationTypes } = await import('../translations/cli/generate-types.js');\n generateTranslationTypes(process.cwd());\n console.log('\\n✅ Types generated!\\n');\n } else if (action === 'full') {\n await manageTranslations(process.cwd());\n }\n } catch (error) {\n if ((error as { message?: string }).message === 'User force closed the prompt') {\n console.log('\\n❌ Cancelled');\n process.exit(0);\n }\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n })();\n }\n}\n","import * as path from 'node:path';\nimport type { TranslationEntry } from '../core/types.js';\nimport { translateText } from '../utils/translator.js';\nimport { readTranslations, sortKeys, writeTranslation } from '../utils/utils.js';\nimport { loadConfig } from './init.js';\n\ninterface AddKeyOptions {\n /** Namespace for the translation key */\n namespace: string;\n /** Translation key */\n key: string;\n /** Translation value (English) */\n value: string;\n /** Auto-translate to all languages */\n autoTranslate?: boolean;\n /** Google Translate API key */\n apiKey?: string;\n}\n\n/**\n * Add a new translation key to all languages\n */\nexport async function addTranslationKey(projectRoot: string, options: AddKeyOptions): Promise<void> {\n const config = loadConfig(projectRoot);\n const translationsPath = path.join(projectRoot, config.translationsPath);\n const { namespace, key, value, autoTranslate = false, apiKey } = options;\n\n console.log('=====');\n console.log('Adding translation key');\n console.log('=====');\n console.log(`Namespace: ${namespace}`);\n console.log(`Key: ${key}`);\n console.log(`Value (${config.sourceLanguage}): ${value}`);\n console.log('=====');\n\n // Add to source language\n const sourceLang = config.sourceLanguage;\n const sourceTranslations = readTranslations(translationsPath, sourceLang);\n\n if (!sourceTranslations[namespace]) {\n sourceTranslations[namespace] = {};\n }\n\n if (sourceTranslations[namespace][key]) {\n console.log(`⚠ Warning: Key \"${key}\" already exists in ${namespace}. Updating value.`);\n }\n\n sourceTranslations[namespace][key] = value;\n const sortedSource = sortKeys(sourceTranslations[namespace]);\n writeTranslation(translationsPath, sourceLang, namespace, sortedSource);\n console.log(`✓ Added to ${sourceLang}/${namespace}.json`);\n\n // Handle other languages\n const otherLanguages = config.languages.filter((lang) => lang !== sourceLang);\n\n if (autoTranslate && apiKey) {\n console.log('\\nAuto-translating to other languages...');\n\n for (const lang of otherLanguages) {\n try {\n const targetTranslations = readTranslations(translationsPath, lang);\n\n if (!targetTranslations[namespace]) {\n targetTranslations[namespace] = {};\n }\n\n // Only translate if key doesn't exist or is empty\n if (!targetTranslations[namespace][key] || targetTranslations[namespace][key].trim() === '') {\n const translated = await translateText(value, lang, sourceLang, apiKey);\n targetTranslations[namespace][key] = translated;\n const sorted = sortKeys(targetTranslations[namespace]);\n writeTranslation(translationsPath, lang, namespace, sorted);\n console.log(` ✓ ${lang}: \"${translated}\"`);\n\n // Small delay to avoid rate limiting\n await new Promise((resolve) => setTimeout(resolve, 100));\n } else {\n console.log(` - ${lang}: Already exists, skipping`);\n }\n } catch (error) {\n console.error(` ✗ ${lang}: Translation failed - ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n } else {\n // Add empty string to other languages\n console.log('\\nAdding empty values to other languages...');\n\n for (const lang of otherLanguages) {\n const targetTranslations = readTranslations(translationsPath, lang);\n\n if (!targetTranslations[namespace]) {\n targetTranslations[namespace] = {};\n }\n\n // Only add if key doesn't exist\n if (!targetTranslations[namespace][key]) {\n targetTranslations[namespace][key] = '';\n const sorted = sortKeys(targetTranslations[namespace]);\n writeTranslation(translationsPath, lang, namespace, sorted);\n console.log(` ✓ ${lang}/${namespace}.json`);\n } else {\n console.log(` - ${lang}/${namespace}.json: Already exists`);\n }\n }\n\n if (!autoTranslate) {\n console.log('\\nℹ Use --auto-translate flag to automatically translate to all languages');\n }\n }\n\n console.log('=====');\n console.log('Translation key added successfully!');\n console.log('=====');\n}\n\n/**\n * Add multiple translation keys at once\n */\nexport async function addTranslationKeys(\n projectRoot: string,\n entries: TranslationEntry[],\n autoTranslate: boolean = false,\n apiKey?: string\n): Promise<void> {\n console.log(`Adding ${entries.length} translation keys...`);\n\n for (const entry of entries) {\n await addTranslationKey(projectRoot, {\n namespace: entry.namespace,\n key: entry.key,\n value: entry.value,\n autoTranslate,\n apiKey\n });\n }\n}\n","/**\n * Translation utilities with support for custom translation providers\n * Only translates content outside of {{variable}} interpolations\n */\n\nimport { GoogleTranslateProvider } from './google-translate-provider';\nimport type { TranslationProvider } from './translator-interface';\n\n/**\n * Default translation provider (Google Translate)\n */\nconst defaultProvider: TranslationProvider = new GoogleTranslateProvider();\n\n/**\n * Custom translation provider (if set by user)\n */\nlet customProvider: TranslationProvider | null = null;\n\n/**\n * Set a custom translation provider\n * @param provider - Custom translation provider implementing TranslationProvider interface\n */\nexport function setTranslationProvider(provider: TranslationProvider): void {\n customProvider = provider;\n}\n\n/**\n * Get the active translation provider (custom or default)\n */\nexport function getTranslationProvider(): TranslationProvider {\n return customProvider || defaultProvider;\n}\n\n/**\n * Reset to the default Google Translate provider\n */\nexport function resetTranslationProvider(): void {\n customProvider = null;\n}\n\n/**\n * Translate text using the active translation provider\n * Preserves {{variable}} interpolations by temporarily replacing them\n *\n * @param text - Text to translate\n * @param targetLang - Target language code\n * @param sourceLang - Source language code (default: \"en\")\n * @param apiKey - API key for the translation service\n * @returns Promise resolving to translated text\n */\nexport async function translateText(\n text: string,\n targetLang: string,\n sourceLang: string = 'en',\n apiKey?: string\n): Promise<string> {\n const provider = getTranslationProvider();\n return provider.translate({\n text,\n sourceLang,\n targetLang,\n apiKey\n });\n}\n\n/**\n * Translate multiple texts in batch\n *\n * @param texts - Array of texts to translate\n * @param targetLang - Target language code\n * @param sourceLang - Source language code (default: \"en\")\n * @param apiKey - API key for the translation service\n * @param delayMs - Delay between requests in milliseconds (default: 100)\n * @returns Promise resolving to array of translated texts\n */\nexport async function translateBatch(\n texts: string[],\n targetLang: string,\n sourceLang: string = 'en',\n apiKey?: string,\n delayMs: number = 100\n): Promise<string[]> {\n const provider = getTranslationProvider();\n return provider.translateBatch(texts, sourceLang, targetLang, apiKey, delayMs);\n}\n","/**\n * Google Translate provider implementation\n * Uses Google Cloud Translation API v2\n */\n\nimport type { TranslateOptions, TranslationProvider } from './translator-interface';\n\ninterface GoogleTranslateResponse {\n data: {\n translations: Array<{\n translatedText: string;\n }>;\n };\n error?: {\n message: string;\n };\n}\n\n/**\n * Preserve {{variable}} interpolations by replacing with placeholders\n * Uses a format that Google Translate won't translate (uppercase + underscores + numbers)\n */\nfunction preserveVariables(text: string): {\n textWithPlaceholders: string;\n variableMap: Map<string, string>;\n} {\n const variableMap = new Map<string, string>();\n let placeholderIndex = 0;\n\n const textWithPlaceholders = text.replace(/\\{\\{([^}]+)\\}\\}/g, (match) => {\n // Use XXX prefix (not a real word in any language) to avoid translation\n const placeholder = `XXX_${placeholderIndex}_XXX`;\n variableMap.set(placeholder, match);\n placeholderIndex++;\n return placeholder;\n });\n\n return { textWithPlaceholders, variableMap };\n}\n\n/**\n * Restore original {{variable}} interpolations from placeholders\n */\nfunction restoreVariables(text: string, variableMap: Map<string, string>): string {\n let result = text;\n for (const [placeholder, original] of variableMap) {\n result = result.replace(new RegExp(placeholder, 'g'), original);\n }\n return result;\n}\n\n/**\n * Google Translate provider\n * Implements the TranslationProvider interface\n */\nexport class GoogleTranslateProvider implements TranslationProvider {\n async translate(options: TranslateOptions): Promise<string> {\n const { text, sourceLang, targetLang, apiKey } = options;\n\n if (!apiKey) {\n throw new Error(\n 'Google Translate API key is required. Set GOOGLE_TRANSLATE_API_KEY environment variable or provide apiKey in options.'\n );\n }\n\n // Extract and preserve interpolation variables\n const { textWithPlaceholders, variableMap } = preserveVariables(text);\n\n // Translate the text with placeholders\n const url = `https://translation.googleapis.com/language/translate/v2?key=${apiKey}`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n q: textWithPlaceholders,\n source: sourceLang,\n target: targetLang.split('_')[0], // Convert 'pt_BR' to 'pt'\n format: 'text'\n })\n });\n\n const data = (await response.json()) as GoogleTranslateResponse;\n\n if (data.error) {\n throw new Error(`Google Translate API error: ${data.error.message}`);\n }\n\n const translatedText = data.data.translations[0].translatedText;\n\n // Restore original interpolation variables\n return restoreVariables(translatedText, variableMap);\n }\n\n async translateBatch(\n texts: string[],\n sourceLang: string,\n targetLang: string,\n apiKey?: string,\n delayMs: number = 100\n ): Promise<string[]> {\n const results: string[] = [];\n\n for (const text of texts) {\n const translated = await this.translate({\n text,\n sourceLang,\n targetLang,\n apiKey\n });\n results.push(translated);\n\n // Add delay to avoid rate limiting\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n return results;\n }\n\n async validateConfig(): Promise<boolean> {\n const apiKey = process.env.GOOGLE_TRANSLATE_API_KEY;\n return !!apiKey;\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { checkbox, confirm, input } from '@inquirer/prompts';\nimport { SUPPORTED_LANGUAGES } from '../core/schema.js';\nimport type { TranslationConfig } from '../core/types.js';\nimport { DEFAULT_CONFIG } from '../core/types.js';\nimport { initTranslations } from './init.js';\n\n/**\n * Interactive initialization of translation structure\n */\nexport async function initTranslationsInteractive(projectRoot: string = process.cwd()): Promise<void> {\n console.log('\\n🌍 Translation System Setup\\n');\n\n // Check if already initialized\n const configPath = path.join(projectRoot, '.translationsrc.json');\n const alreadyExists = fs.existsSync(configPath);\n\n if (alreadyExists) {\n console.log('⚠️ Configuration file already exists at .translationsrc.json\\n');\n const shouldOverwrite = await confirm({\n message: 'Would you like to reconfigure?',\n default: false\n });\n\n if (!shouldOverwrite) {\n console.log('✓ Keeping existing configuration');\n return;\n }\n }\n\n // Detect existing translations\n const { detectExistingTranslations } = await import('./init.js');\n const existing = detectExistingTranslations(projectRoot);\n\n let translationsPath: string;\n let languages: string[];\n\n // Ask about translations path\n if (existing.path) {\n console.log(`✓ Found existing translations at: ${existing.path}`);\n const useExisting = await confirm({\n message: 'Use this location?',\n default: true\n });\n\n if (useExisting) {\n translationsPath = existing.path;\n } else {\n translationsPath = await input({\n message: 'Enter translations directory path:',\n default: DEFAULT_CONFIG.translationsPath,\n validate: (value) => {\n if (!value.trim()) return 'Path is required';\n return true;\n }\n });\n }\n } else {\n translationsPath = await input({\n message: 'Where should translations be stored?',\n default: DEFAULT_CONFIG.translationsPath,\n validate: (value) => {\n if (!value.trim()) return 'Path is required';\n return true;\n }\n });\n }\n\n // Ask about languages\n if (existing.languages.length > 0) {\n console.log(`✓ Found existing languages: ${existing.languages.join(', ')}`);\n const useExistingLangs = await confirm({\n message: 'Use these languages?',\n default: true\n });\n\n if (useExistingLangs) {\n languages = existing.languages;\n } else {\n languages = await selectLanguages();\n }\n } else {\n languages = await selectLanguages();\n }\n\n // Ask about source language\n const sourceLanguage = await input({\n message: 'What is your source language?',\n default: 'en',\n validate: (value) => {\n if (!SUPPORTED_LANGUAGES.includes(value as never)) {\n return `Invalid language code. Must be one of: ${SUPPORTED_LANGUAGES.join(', ')}`;\n }\n if (!languages.includes(value)) {\n return 'Source language must be in the list of supported languages';\n }\n return true;\n }\n });\n\n // Ask about types output path\n const typesOutputPath = await input({\n message: 'Where should TypeScript types be generated?',\n default: DEFAULT_CONFIG.typesOutputPath\n });\n\n // Summary\n console.log('\\n📋 Configuration Summary:');\n console.log(` Translations: ${translationsPath}`);\n console.log(` Languages: ${languages.join(', ')}`);\n console.log(` Source: ${sourceLanguage}`);\n console.log(` Types: ${typesOutputPath}`);\n\n const confirmInit = await confirm({\n message: '\\nProceed with initialization?',\n default: true\n });\n\n if (!confirmInit) {\n console.log('❌ Cancelled');\n return;\n }\n\n // Initialize with selected config\n const config: TranslationConfig = {\n translationsPath,\n languages,\n sourceLanguage,\n typesOutputPath\n };\n\n console.log();\n initTranslations(projectRoot, config);\n\n // Show helpful next steps\n console.log('\\n📝 Configuration saved to: .translationsrc.json');\n console.log('\\n💡 Next steps:');\n console.log(' 1. Run \"translations add\" to add your first translation key');\n console.log(' 2. Run \"translations\" to validate and generate types');\n console.log(' 3. Check the .translationsrc.json file for your configuration\\n');\n}\n\n/**\n * Helper to select languages interactively\n */\nasync function selectLanguages(): Promise<string[]> {\n const languageChoices = SUPPORTED_LANGUAGES.map((lang) => ({\n name: `${lang} - ${getLanguageName(lang)}`,\n value: lang,\n checked: lang === 'en' // English selected by default\n }));\n\n const selected = await checkbox({\n message: 'Select languages to support (space to select, enter to confirm):',\n choices: languageChoices,\n required: true,\n pageSize: 15,\n loop: false\n });\n\n return selected;\n}\n\n/**\n * Get human-readable language name\n */\nfunction getLanguageName(code: string): string {\n const names: Record<string, string> = {\n en: 'English',\n fr: 'French',\n it: 'Italian',\n pl: 'Polish',\n es: 'Spanish',\n pt: 'Portuguese',\n de: 'German',\n de_at: 'German (Austria)',\n nl: 'Dutch',\n sv: 'Swedish',\n hu: 'Hungarian',\n cs: 'Czech',\n ja: 'Japanese',\n zh_hk: 'Chinese (Hong Kong)',\n zh_cn: 'Chinese (Simplified)',\n ko: 'Korean',\n ru: 'Russian',\n ar: 'Arabic',\n he: 'Hebrew',\n tr: 'Turkish',\n da: 'Danish',\n fi: 'Finnish',\n no: 'Norwegian',\n pt_br: 'Portuguese (Brazil)'\n };\n return names[code] || code;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { autoFillTranslations } from './auto-fill.js';\nimport { generateTranslationTypes } from './generate-types.js';\nimport { initTranslations, loadConfig } from './init.js';\nimport { validateTranslations } from './validate.js';\n\nexport interface ManageTranslationsOptions {\n /** Auto-fill missing translations */\n autoFill?: boolean;\n /** Google Translate API key for auto-fill */\n apiKey?: string;\n /** Maximum translations to fill */\n limit?: number;\n /** Specific language to process */\n language?: string;\n /** Skip type generation */\n skipTypes?: boolean;\n /** Dry run mode */\n dryRun?: boolean;\n}\n\n/**\n * Smart translation management - handles init, validation, auto-fill, and type generation\n * based on the current state of the project\n * @returns true if translations are valid, false otherwise\n */\nexport async function manageTranslations(\n projectRoot: string = process.cwd(),\n options: ManageTranslationsOptions = {}\n): Promise<boolean> {\n const { autoFill = false, apiKey, limit = 1000, language, skipTypes = false, dryRun = false } = options;\n\n console.log('=====');\n console.log('Translation Management');\n console.log('=====');\n\n // Step 1: Check if initialized\n const configPath = path.join(projectRoot, '.translationsrc.json');\n const isInitialized = fs.existsSync(configPath);\n\n if (!isInitialized) {\n console.log('📁 No translation configuration found. Initializing...\\n');\n initTranslations(projectRoot);\n console.log('\\n✅ Initialization complete!\\n');\n } else {\n console.log('✓ Translation structure initialized\\n');\n }\n\n // Step 2: Load config\n const config = loadConfig(projectRoot);\n const translationsPath = path.join(projectRoot, config.translationsPath);\n\n // Check if source language directory exists\n const sourceLangPath = path.join(translationsPath, config.sourceLanguage);\n if (!fs.existsSync(sourceLangPath)) {\n console.log(`⚠️ Source language directory not found: ${sourceLangPath}`);\n console.log('Please add translation files to the source language directory.\\n');\n return false;\n }\n\n // Step 3: Validate translations\n console.log('🔍 Validating translations...\\n');\n const validationResult = validateTranslations(projectRoot);\n\n if (validationResult.valid) {\n console.log('\\n✅ All translations are complete!\\n');\n } else {\n const totalMissing = validationResult.missing.length + validationResult.empty.length;\n\n // Step 4: Auto-fill if requested\n if (autoFill) {\n if (!apiKey) {\n console.log('\\n⚠️ Auto-fill requested but no API key provided.');\n console.log('Set GOOGLE_TRANSLATE_API_KEY or pass --api-key to enable auto-fill.\\n');\n } else {\n console.log(`\\n🤖 Auto-filling ${totalMissing} missing translations...\\n`);\n await autoFillTranslations(projectRoot, {\n apiKey,\n limit,\n language,\n dryRun,\n delayMs: 100\n });\n\n // Re-validate after auto-fill\n if (!dryRun) {\n console.log('\\n🔍 Re-validating after auto-fill...\\n');\n const revalidation = validateTranslations(projectRoot);\n if (revalidation.valid) {\n console.log('\\n✅ All translations are now complete!\\n');\n }\n }\n }\n } else {\n console.log(`\\n💡 Tip: Run with --auto-fill to automatically translate missing keys.\\n`);\n }\n }\n\n // Step 5: Generate types\n if (!skipTypes && !dryRun) {\n console.log('📝 Generating TypeScript types...\\n');\n generateTranslationTypes(projectRoot);\n console.log('\\n✅ Types generated!\\n');\n } else if (skipTypes) {\n console.log('⏭️ Skipping type generation (--skip-types)\\n');\n } else if (dryRun) {\n console.log('⏭️ Skipping type generation (--dry-run)\\n');\n }\n\n // Summary\n console.log('=====');\n console.log('Summary');\n console.log('=====');\n console.log(`Configuration: ${configPath}`);\n console.log(`Translations: ${translationsPath}`);\n console.log(`Languages: ${config.languages.join(', ')}`);\n console.log(`Source language: ${config.sourceLanguage}`);\n\n if (!validationResult.valid && !autoFill) {\n console.log(`\\n⚠️ ${validationResult.missing.length} missing translations`);\n console.log(`⚠️ ${validationResult.empty.length} empty translations`);\n console.log('\\nNext steps:');\n console.log(' 1. Add missing translations manually, or');\n console.log(' 2. Run with --auto-fill to translate automatically');\n } else if (validationResult.valid) {\n console.log('\\n✅ All systems ready!');\n }\n\n console.log('=====\\n');\n\n // Return validation status (true if valid after all operations)\n if (autoFill && !dryRun && apiKey) {\n // Re-validate to get final status\n const finalValidation = validateTranslations(projectRoot);\n return finalValidation.valid;\n }\n\n return validationResult.valid;\n}\n","import * as path from 'node:path';\nimport { translateText } from '../utils/translator.js';\nimport { readTranslations, sortKeys, writeTranslation } from '../utils/utils.js';\nimport { loadConfig } from './init.js';\nimport { getMissingForLanguage } from './validate.js';\n\ninterface AutoFillOptions {\n /** Language to fill translations for */\n language?: string;\n /** Google Translate API key */\n apiKey?: string;\n /** Maximum number of translations to process */\n limit?: number;\n /** Delay between translations in milliseconds */\n delayMs?: number;\n /** Dry run - don't actually write translations */\n dryRun?: boolean;\n}\n\n/**\n * Automatically fill empty or missing translations for a language\n */\nexport async function autoFillTranslations(\n projectRoot: string = process.cwd(),\n options: AutoFillOptions = {}\n): Promise<void> {\n const config = loadConfig(projectRoot);\n const translationsPath = path.join(projectRoot, config.translationsPath);\n const { apiKey, limit = 1000, delayMs = 100, dryRun = false } = options;\n\n if (!apiKey) {\n throw new Error('Google Translate API key is required. Set GOOGLE_TRANSLATE_API_KEY or pass --api-key');\n }\n\n // Determine which languages to process\n const languagesToProcess = options.language\n ? [options.language]\n : config.languages.filter((lang) => lang !== config.sourceLanguage);\n\n console.log('=====');\n console.log('Auto-filling translations');\n console.log('=====');\n console.log(`Languages: ${languagesToProcess.join(', ')}`);\n console.log(`Limit: ${limit}`);\n console.log(`Dry run: ${dryRun}`);\n console.log('=====');\n\n let totalProcessed = 0;\n let totalTranslated = 0;\n\n for (const language of languagesToProcess) {\n if (totalProcessed >= limit) {\n console.log(`\\nReached limit of ${limit} translations`);\n break;\n }\n\n console.log(`\\nProcessing language: ${language}`);\n\n // Get missing and empty translations for this language\n const missing = getMissingForLanguage(projectRoot, language);\n\n if (missing.length === 0) {\n console.log(' No missing or empty translations');\n continue;\n }\n\n console.log(` Found ${missing.length} translations to fill`);\n\n // Process up to the remaining limit\n const remainingLimit = limit - totalProcessed;\n const itemsToProcess = missing.slice(0, remainingLimit);\n\n for (const item of itemsToProcess) {\n totalProcessed++;\n\n try {\n console.log(` [${totalProcessed}/${limit}] Translating ${item.namespace}.${item.key}`);\n console.log(` EN: \"${item.sourceValue}\"`);\n\n // Translate the text\n const translated = await translateText(item.sourceValue, language, config.sourceLanguage, apiKey);\n console.log(` ${language.toUpperCase()}: \"${translated}\"`);\n\n if (!dryRun) {\n // Read current translations\n const translations = readTranslations(translationsPath, language);\n\n if (!translations[item.namespace]) {\n translations[item.namespace] = {};\n }\n\n // Update the translation\n translations[item.namespace][item.key] = translated;\n const sorted = sortKeys(translations[item.namespace]);\n\n // Write back\n writeTranslation(translationsPath, language, item.namespace, sorted);\n console.log(' ✓ Saved');\n } else {\n console.log(' ✓ Dry run - not saved');\n }\n\n totalTranslated++;\n\n // Delay to avoid rate limiting\n if (delayMs > 0 && totalProcessed < limit) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n } catch (error) {\n console.error(` ✗ Error: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n }\n\n console.log('\\n=====');\n console.log(`Total processed: ${totalProcessed}`);\n console.log(`Total translated: ${totalTranslated}`);\n if (dryRun) {\n console.log('⚠ Dry run - no changes were saved');\n }\n console.log('=====');\n}\n\n/**\n * Fill translations for a specific namespace and language\n */\nexport async function fillNamespace(\n projectRoot: string,\n language: string,\n namespace: string,\n apiKey: string\n): Promise<void> {\n const config = loadConfig(projectRoot);\n const translationsPath = path.join(projectRoot, config.translationsPath);\n\n console.log(`Filling translations for ${language}/${namespace}.json`);\n\n // Read source and target translations\n const sourceTranslations = readTranslations(translationsPath, config.sourceLanguage);\n const targetTranslations = readTranslations(translationsPath, language);\n\n const sourceKeys = sourceTranslations[namespace] || {};\n const targetKeys = targetTranslations[namespace] || {};\n\n let count = 0;\n\n for (const [key, sourceValue] of Object.entries(sourceKeys)) {\n const targetValue = targetKeys[key];\n\n // Skip if already has value\n if (targetValue && targetValue.trim() !== '') {\n continue;\n }\n\n console.log(` Translating ${key}...`);\n const translated = await translateText(sourceValue, language, config.sourceLanguage, apiKey);\n targetKeys[key] = translated;\n count++;\n\n // Small delay\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n // Write back\n if (count > 0) {\n const sorted = sortKeys(targetKeys);\n writeTranslation(translationsPath, language, namespace, sorted);\n console.log(`✓ Filled ${count} translations`);\n } else {\n console.log('No translations to fill');\n }\n}\n","import * as path from 'node:path';\nimport type { MissingTranslation, ValidationResult } from '../core/types.js';\nimport { getAvailableLanguages, getNamespaces, readTranslations } from '../utils/utils.js';\nimport { loadConfig } from './init.js';\n\n/**\n * Validate all translations against the source language\n * Checks for missing keys and empty values\n */\nexport function validateTranslations(projectRoot: string = process.cwd()): ValidationResult {\n const config = loadConfig(projectRoot);\n const translationsPath = path.join(projectRoot, config.translationsPath);\n const sourceLanguage = config.sourceLanguage;\n\n const missing: MissingTranslation[] = [];\n const empty: MissingTranslation[] = [];\n\n // Read source translations\n const sourceTranslations = readTranslations(translationsPath, sourceLanguage);\n const sourceNamespaces = getNamespaces(translationsPath, sourceLanguage);\n\n // Get all available languages\n const languages = getAvailableLanguages(translationsPath).filter((lang) => lang !== sourceLanguage);\n\n console.log('=====');\n console.log('Validating translations');\n console.log('=====');\n console.log(`Source language: ${sourceLanguage}`);\n console.log(`Target languages: ${languages.join(', ')}`);\n console.log(`Namespaces: ${sourceNamespaces.join(', ')}`);\n console.log('=====');\n\n // Validate each language\n for (const language of languages) {\n const targetTranslations = readTranslations(translationsPath, language);\n\n // Check each namespace\n for (const namespace of sourceNamespaces) {\n const sourceKeys = sourceTranslations[namespace] || {};\n const targetKeys = targetTranslations[namespace] || {};\n\n // Check for missing or empty translations\n for (const [key, sourceValue] of Object.entries(sourceKeys)) {\n const targetValue = targetKeys[key];\n\n // Missing key in target language\n if (targetValue === undefined) {\n missing.push({\n namespace,\n key,\n language,\n sourceValue\n });\n }\n // Empty value in target language\n else if (typeof targetValue === 'string' && targetValue.trim() === '') {\n empty.push({\n namespace,\n key,\n language,\n sourceValue\n });\n }\n }\n }\n }\n\n const valid = missing.length === 0 && empty.length === 0;\n\n if (valid) {\n console.log('✓ All translations are valid!');\n } else {\n if (missing.length > 0) {\n console.log(`\\n⚠ Found ${missing.length} missing translations:`);\n for (const item of missing.slice(0, 10)) {\n console.log(` ${item.language}/${item.namespace}.json -> ${item.key}`);\n }\n if (missing.length > 10) {\n console.log(` ... and ${missing.length - 10} more`);\n }\n }\n\n if (empty.length > 0) {\n console.log(`\\n⚠ Found ${empty.length} empty translations:`);\n for (const item of empty.slice(0, 10)) {\n console.log(` ${item.language}/${item.namespace}.json -> ${item.key}`);\n }\n if (empty.length > 10) {\n console.log(` ... and ${empty.length - 10} more`);\n }\n }\n }\n\n console.log('=====');\n\n return { valid, missing, empty };\n}\n\n/**\n * Get all missing or empty translations for a specific language\n */\nexport function getMissingForLanguage(\n projectRoot: string,\n language: string\n): Array<MissingTranslation & { type: 'missing' | 'empty' }> {\n const result = validateTranslations(projectRoot);\n const items = [\n ...result.missing.filter((m) => m.language === language).map((m) => ({ ...m, type: 'missing' as const })),\n ...result.empty.filter((e) => e.language === language).map((e) => ({ ...e, type: 'empty' as const }))\n ];\n\n return items;\n}\n"],"mappings":"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AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,IACF;AAOO,IAAM,mBAAmB;AAAA,MAC9B;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AA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","names":["path","fs","path","validation","fs","path","fs","path","confirm","input","path","fs","path","detectExistingTranslations","fs","path","path","path","confirm","input","value","generateTranslationTypes"]}
1
+ {"version":3,"sources":["../../node_modules/tsup/assets/esm_shims.js","../../src/translations/core/schema.ts","../../src/translations/utils/language-fallback.ts","../../src/translations/utils/utils.ts","../../src/translations/core/types.ts","../../src/translations/cli/init.ts","../../src/translations/cli/generate-types.ts","../../src/cli/translations.ts","../../src/translations/cli/add-key.ts","../../src/translations/utils/translator.ts","../../src/translations/utils/google-translate-provider.ts","../../src/translations/cli/init-interactive.ts","../../src/translations/cli/manage.ts","../../src/translations/cli/auto-fill.ts","../../src/translations/utils/deepl-translate-provider.ts","../../src/translations/cli/validate.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * Translation provider types\n */\nexport const TRANSLATION_PROVIDERS = ['deepl', 'google'] as const;\nexport type TranslationProviderType = (typeof TRANSLATION_PROVIDERS)[number];\n\n/**\n * DeepL supported target languages\n * Based on DeepL API v2 documentation\n */\nexport const DEEPL_LANGUAGES = [\n 'ar', // Arabic\n 'bg', // Bulgarian\n 'cs', // Czech\n 'da', // Danish\n 'de', // German\n 'el', // Greek\n 'en', // English (unspecified)\n 'en_gb', // English (British)\n 'en_us', // English (American)\n 'es', // Spanish\n 'es_419', // Spanish (Latin American)\n 'et', // Estonian\n 'fi', // Finnish\n 'fr', // French\n 'he', // Hebrew (next-gen models only)\n 'hu', // Hungarian\n 'id', // Indonesian\n 'it', // Italian\n 'ja', // Japanese\n 'ko', // Korean\n 'lt', // Lithuanian\n 'lv', // Latvian\n 'nb', // Norwegian Bokmål\n 'nl', // Dutch\n 'pl', // Polish\n 'pt', // Portuguese (unspecified)\n 'pt_br', // Portuguese (Brazilian)\n 'pt_pt', // Portuguese (excluding Brazilian)\n 'ro', // Romanian\n 'ru', // Russian\n 'sk', // Slovak\n 'sl', // Slovenian\n 'sv', // Swedish\n 'th', // Thai (next-gen models only)\n 'tr', // Turkish\n 'uk', // Ukrainian\n 'vi', // Vietnamese (next-gen models only)\n 'zh', // Chinese (unspecified)\n 'zh_hans', // Chinese (simplified)\n 'zh_hant' // Chinese (traditional)\n] as const;\n\n/**\n * Google Translate supported languages\n * Based on Google Cloud Translation API v2\n * Reference: https://docs.cloud.google.com/translate/docs/languages\n */\nexport const GOOGLE_LANGUAGES = [\n 'af', // Afrikaans\n 'sq', // Albanian\n 'am', // Amharic\n 'ar', // Arabic\n 'hy', // Armenian\n 'az', // Azerbaijani\n 'eu', // Basque\n 'be', // Belarusian\n 'bn', // Bengali\n 'bs', // Bosnian\n 'bg', // Bulgarian\n 'ca', // Catalan\n 'ceb', // Cebuano\n 'zh', // Chinese (Simplified)\n 'zh_cn', // Chinese (Simplified)\n 'zh_tw', // Chinese (Traditional)\n 'co', // Corsican\n 'hr', // Croatian\n 'cs', // Czech\n 'da', // Danish\n 'nl', // Dutch\n 'en', // English\n 'eo', // Esperanto\n 'et', // Estonian\n 'fi', // Finnish\n 'fr', // French\n 'fy', // Frisian\n 'gl', // Galician\n 'ka', // Georgian\n 'de', // German\n 'el', // Greek\n 'gu', // Gujarati\n 'ht', // Haitian Creole\n 'ha', // Hausa\n 'haw', // Hawaiian\n 'he', // Hebrew\n 'hi', // Hindi\n 'hmn', // Hmong\n 'hu', // Hungarian\n 'is', // Icelandic\n 'ig', // Igbo\n 'id', // Indonesian\n 'ga', // Irish\n 'it', // Italian\n 'ja', // Japanese\n 'jv', // Javanese\n 'kn', // Kannada\n 'kk', // Kazakh\n 'km', // Khmer\n 'rw', // Kinyarwanda\n 'ko', // Korean\n 'ku', // Kurdish\n 'ky', // Kyrgyz\n 'lo', // Lao\n 'la', // Latin\n 'lv', // Latvian\n 'lt', // Lithuanian\n 'lb', // Luxembourgish\n 'mk', // Macedonian\n 'mg', // Malagasy\n 'ms', // Malay\n 'ml', // Malayalam\n 'mt', // Maltese\n 'mi', // Maori\n 'mr', // Marathi\n 'mn', // Mongolian\n 'my', // Myanmar (Burmese)\n 'ne', // Nepali\n 'no', // Norwegian\n 'ny', // Nyanja (Chichewa)\n 'or', // Odia (Oriya)\n 'ps', // Pashto\n 'fa', // Persian\n 'pl', // Polish\n 'pt', // Portuguese\n 'pt_br', // Portuguese (Brazil)\n 'pa', // Punjabi\n 'ro', // Romanian\n 'ru', // Russian\n 'sm', // Samoan\n 'gd', // Scots Gaelic\n 'sr', // Serbian\n 'st', // Sesotho\n 'sn', // Shona\n 'sd', // Sindhi\n 'si', // Sinhala (Sinhalese)\n 'sk', // Slovak\n 'sl', // Slovenian\n 'so', // Somali\n 'es', // Spanish\n 'su', // Sundanese\n 'sw', // Swahili\n 'sv', // Swedish\n 'tl', // Tagalog (Filipino)\n 'tg', // Tajik\n 'ta', // Tamil\n 'tt', // Tatar\n 'te', // Telugu\n 'th', // Thai\n 'tr', // Turkish\n 'tk', // Turkmen\n 'uk', // Ukrainian\n 'ur', // Urdu\n 'ug', // Uyghur\n 'uz', // Uzbek\n 'vi', // Vietnamese\n 'cy', // Welsh\n 'xh', // Xhosa\n 'yi', // Yiddish\n 'yo', // Yoruba\n 'zu' // Zulu\n] as const;\n\n/**\n * All supported language codes (union of DeepL and Google Translate)\n */\nexport const SUPPORTED_LANGUAGES = Array.from(\n new Set([...DEEPL_LANGUAGES, ...GOOGLE_LANGUAGES])\n).sort() as readonly string[];\n\nexport type DeepLLanguage = (typeof DEEPL_LANGUAGES)[number];\nexport type GoogleLanguage = (typeof GOOGLE_LANGUAGES)[number];\nexport type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];\n\n/**\n * JSON Schema for .translationsrc.json\n */\nexport const TRANSLATION_CONFIG_SCHEMA = {\n title: 'Translation Configuration',\n description: 'Configuration for the translation management system',\n type: 'object',\n properties: {\n $schema: {\n type: 'string',\n description: 'JSON Schema reference'\n },\n translationsPath: {\n type: 'string',\n description: 'Path to the translations directory relative to project root',\n default: 'public/static/locales',\n examples: ['public/static/locales', 'src/locales', 'locales']\n },\n languages: {\n type: 'array',\n description: 'List of language codes to support',\n items: {\n type: 'string',\n enum: SUPPORTED_LANGUAGES\n },\n minItems: 1,\n uniqueItems: true,\n default: ['en']\n },\n sourceLanguage: {\n type: 'string',\n description: 'Source language for translations (usually \"en\")',\n enum: SUPPORTED_LANGUAGES,\n default: 'en'\n },\n typesOutputPath: {\n type: 'string',\n description: 'Path to output TypeScript types file',\n default: 'src/types/i18nTypes.ts',\n examples: ['src/types/i18nTypes.ts', 'src/types/translations.ts']\n },\n provider: {\n type: 'string',\n description: 'Translation provider to use (deepl or google)',\n enum: TRANSLATION_PROVIDERS,\n default: 'deepl'\n },\n useFallbackLanguages: {\n type: 'boolean',\n description: 'Enable automatic language fallback for unsupported regional variants (e.g., de_at -> de)',\n default: false\n }\n },\n required: ['translationsPath', 'languages', 'sourceLanguage'],\n additionalProperties: false\n};\n\n/**\n * Validate if a language code is supported\n */\nexport function isValidLanguage(lang: string): lang is SupportedLanguage {\n return SUPPORTED_LANGUAGES.includes(lang as SupportedLanguage);\n}\n\n/**\n * Validate if a language is supported by DeepL\n */\nexport function isValidDeepLLanguage(lang: string): lang is DeepLLanguage {\n return DEEPL_LANGUAGES.includes(lang as DeepLLanguage);\n}\n\n/**\n * Validate if a language is supported by Google Translate\n */\nexport function isValidGoogleLanguage(lang: string): lang is GoogleLanguage {\n return GOOGLE_LANGUAGES.includes(lang as GoogleLanguage);\n}\n\n/**\n * Validate if a language is supported by a specific provider\n */\nexport function isValidLanguageForProvider(lang: string, provider: TranslationProviderType): boolean {\n switch (provider) {\n case 'deepl':\n return isValidDeepLLanguage(lang);\n case 'google':\n return isValidGoogleLanguage(lang);\n default:\n return false;\n }\n}\n\n/**\n * Validate languages array\n */\nexport function validateLanguages(languages: string[]): {\n valid: boolean;\n invalid: string[];\n} {\n const invalid = languages.filter((lang) => !isValidLanguage(lang));\n return {\n valid: !invalid.length,\n invalid\n };\n}\n\n/**\n * Validate languages array for a specific provider\n */\nexport function validateLanguagesForProvider(\n languages: string[],\n provider: TranslationProviderType\n): {\n valid: boolean;\n invalid: string[];\n} {\n const invalid = languages.filter((lang) => !isValidLanguageForProvider(lang, provider));\n return {\n valid: !invalid.length,\n invalid\n };\n}\n\n/**\n * Get supported languages for a specific provider\n */\nexport function getSupportedLanguages(provider: TranslationProviderType): readonly string[] {\n switch (provider) {\n case 'deepl':\n return DEEPL_LANGUAGES;\n case 'google':\n return GOOGLE_LANGUAGES;\n default:\n return [];\n }\n}\n\n/**\n * Re-export language fallback utilities for convenience\n */\nexport {\n getFallbackMappings,\n type LanguageFallbackResult,\n logLanguageFallback,\n resolveLanguageWithFallback\n} from '../utils/language-fallback.js';\n","/**\n * Language fallback utilities\n * Provides intelligent fallback logic for unsupported language codes\n */\n\nimport type { DeepLLanguage, GoogleLanguage, TranslationProviderType } from '../core/schema.js';\nimport { DEEPL_LANGUAGES, GOOGLE_LANGUAGES } from '../core/schema.js';\n\n/**\n * Language fallback mapping\n * Maps unsupported language codes to their fallback alternatives\n * Format: unsupported_code -> [fallback_1, fallback_2, ...]\n */\nconst LANGUAGE_FALLBACK_MAP: Record<string, string[]> = {\n // German variants\n de_at: ['de'], // Austrian German -> German\n de_ch: ['de'], // Swiss German -> German\n de_de: ['de'], // Standard German -> German\n\n // English variants\n en_gb: ['en'], // British English -> English\n en_us: ['en'], // American English -> English\n en_au: ['en'], // Australian English -> English\n en_ca: ['en'], // Canadian English -> English\n en_nz: ['en'], // New Zealand English -> English\n\n // Chinese variants (Hong Kong, Taiwan -> Traditional)\n zh_hk: ['zh_hant', 'zh'], // Hong Kong Chinese -> Traditional Chinese -> Chinese\n zh_tw: ['zh_hant', 'zh'], // Taiwan Chinese -> Traditional Chinese -> Chinese\n zh_mo: ['zh_hant', 'zh'], // Macau Chinese -> Traditional Chinese -> Chinese\n\n // Chinese variants (Mainland, Singapore -> Simplified)\n zh_cn: ['zh_hans', 'zh'], // Mainland Chinese -> Simplified Chinese -> Chinese\n zh_sg: ['zh_hans', 'zh'], // Singapore Chinese -> Simplified Chinese -> Chinese\n\n // Portuguese variants\n pt_pt: ['pt'], // European Portuguese -> Portuguese\n pt_ao: ['pt'], // Angolan Portuguese -> Portuguese\n pt_mz: ['pt'], // Mozambican Portuguese -> Portuguese\n\n // Spanish variants (Latin America)\n es_mx: ['es_419', 'es'], // Mexican Spanish -> Latin American Spanish -> Spanish\n es_ar: ['es_419', 'es'], // Argentine Spanish -> Latin American Spanish -> Spanish\n es_co: ['es_419', 'es'], // Colombian Spanish -> Latin American Spanish -> Spanish\n es_cl: ['es_419', 'es'], // Chilean Spanish -> Latin American Spanish -> Spanish\n es_pe: ['es_419', 'es'], // Peruvian Spanish -> Latin American Spanish -> Spanish\n es_ve: ['es_419', 'es'], // Venezuelan Spanish -> Latin American Spanish -> Spanish\n es_ec: ['es_419', 'es'], // Ecuadorian Spanish -> Latin American Spanish -> Spanish\n es_gt: ['es_419', 'es'], // Guatemalan Spanish -> Latin American Spanish -> Spanish\n es_cu: ['es_419', 'es'], // Cuban Spanish -> Latin American Spanish -> Spanish\n es_do: ['es_419', 'es'], // Dominican Spanish -> Latin American Spanish -> Spanish\n es_hn: ['es_419', 'es'], // Honduran Spanish -> Latin American Spanish -> Spanish\n es_ni: ['es_419', 'es'], // Nicaraguan Spanish -> Latin American Spanish -> Spanish\n es_sv: ['es_419', 'es'], // Salvadoran Spanish -> Latin American Spanish -> Spanish\n es_cr: ['es_419', 'es'], // Costa Rican Spanish -> Latin American Spanish -> Spanish\n es_pa: ['es_419', 'es'], // Panamanian Spanish -> Latin American Spanish -> Spanish\n es_uy: ['es_419', 'es'], // Uruguayan Spanish -> Latin American Spanish -> Spanish\n es_py: ['es_419', 'es'], // Paraguayan Spanish -> Latin American Spanish -> Spanish\n es_bo: ['es_419', 'es'], // Bolivian Spanish -> Latin American Spanish -> Spanish\n\n // Spanish (European)\n es_es: ['es'], // European Spanish -> Spanish\n\n // French variants\n fr_ca: ['fr'], // Canadian French -> French\n fr_ch: ['fr'], // Swiss French -> French\n fr_be: ['fr'], // Belgian French -> French\n fr_fr: ['fr'], // Standard French -> French\n\n // Norwegian variants\n no: ['nb'], // Norwegian -> Norwegian Bokmål\n nn: ['nb'], // Norwegian Nynorsk -> Norwegian Bokmål\n\n // Other regional variants\n it_ch: ['it'], // Swiss Italian -> Italian\n nl_be: ['nl'], // Belgian Dutch (Flemish) -> Dutch\n sv_fi: ['sv'], // Finland Swedish -> Swedish\n ar_ae: ['ar'], // UAE Arabic -> Arabic\n ar_sa: ['ar'], // Saudi Arabic -> Arabic\n ar_eg: ['ar'] // Egyptian Arabic -> Arabic\n};\n\n/**\n * Result of language fallback resolution\n */\nexport interface LanguageFallbackResult {\n /** The resolved language code to use */\n resolvedLanguage: string;\n /** Whether a fallback was used */\n usedFallback: boolean;\n /** The original language code requested */\n originalLanguage: string;\n /** Chain of fallback attempts made */\n fallbackChain?: string[];\n}\n\n/**\n * Resolve language code with fallback logic\n * Tries to find a supported language for the given provider\n *\n * @param language - Original language code requested\n * @param provider - Translation provider type ('deepl' or 'google')\n * @param enableFallback - Whether to enable fallback logic (default: true)\n * @returns LanguageFallbackResult with resolved language and metadata\n */\nexport function resolveLanguageWithFallback(\n language: string,\n provider: TranslationProviderType,\n enableFallback = true\n): LanguageFallbackResult {\n const normalizedLanguage = language.toLowerCase();\n const supportedLanguages = getSupportedLanguagesForProvider(provider);\n\n // Check if the original language is supported\n if (isLanguageSupported(normalizedLanguage, supportedLanguages)) {\n return {\n resolvedLanguage: normalizedLanguage,\n usedFallback: false,\n originalLanguage: language\n };\n }\n\n // If fallback is disabled, return original language\n if (!enableFallback) {\n return {\n resolvedLanguage: normalizedLanguage,\n usedFallback: false,\n originalLanguage: language\n };\n }\n\n // Try fallback chain\n const fallbackChain = LANGUAGE_FALLBACK_MAP[normalizedLanguage] || [];\n\n for (const fallbackLang of fallbackChain) {\n if (isLanguageSupported(fallbackLang, supportedLanguages)) {\n return {\n resolvedLanguage: fallbackLang,\n usedFallback: true,\n originalLanguage: language,\n fallbackChain: [normalizedLanguage, ...fallbackChain]\n };\n }\n }\n\n // If no fallback found, try extracting base language (before underscore)\n const baseLang = normalizedLanguage.split('_')[0];\n if (baseLang !== normalizedLanguage && isLanguageSupported(baseLang, supportedLanguages)) {\n return {\n resolvedLanguage: baseLang,\n usedFallback: true,\n originalLanguage: language,\n fallbackChain: [normalizedLanguage, baseLang]\n };\n }\n\n // No supported language found, return original (will likely fail at API level)\n return {\n resolvedLanguage: normalizedLanguage,\n usedFallback: false,\n originalLanguage: language\n };\n}\n\n/**\n * Get supported languages for a specific provider\n */\nfunction getSupportedLanguagesForProvider(provider: TranslationProviderType): readonly string[] {\n switch (provider) {\n case 'deepl':\n return DEEPL_LANGUAGES;\n case 'google':\n return GOOGLE_LANGUAGES;\n default:\n return [];\n }\n}\n\n/**\n * Check if a language is supported by checking against the supported list\n */\nfunction isLanguageSupported(language: string, supportedLanguages: readonly string[]): boolean {\n return supportedLanguages.includes(language as DeepLLanguage | GoogleLanguage);\n}\n\n/**\n * Log fallback information to console\n * Informs user when a language fallback is being used\n */\nexport function logLanguageFallback(result: LanguageFallbackResult, provider: TranslationProviderType): void {\n if (result.usedFallback) {\n console.warn(\n `⚠️ Language fallback: '${result.originalLanguage}' is not supported by ${provider}, using '${result.resolvedLanguage}' instead`\n );\n if (result.fallbackChain && result.fallbackChain.length > 2) {\n console.warn(` Fallback chain: ${result.fallbackChain.join(' → ')}`);\n }\n }\n}\n\n/**\n * Get all registered fallback mappings\n * Useful for debugging and documentation\n */\nexport function getFallbackMappings(): Record<string, string[]> {\n return { ...LANGUAGE_FALLBACK_MAP };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { TranslationFile, TranslationFiles } from '../core/types.js';\n\n/**\n * Read all translation files for a specific language\n */\nexport function readTranslations(translationsPath: string, language: string): TranslationFiles {\n const langPath = path.join(translationsPath, language);\n\n if (!fs.existsSync(langPath)) {\n return {};\n }\n\n const files = fs.readdirSync(langPath).filter((f) => f.endsWith('.json'));\n const translations: TranslationFiles = {};\n\n for (const file of files) {\n const namespace = path.basename(file, '.json');\n const filePath = path.join(langPath, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n translations[namespace] = JSON.parse(content) as TranslationFile;\n }\n\n return translations;\n}\n\n/**\n * Write translation file for a specific language and namespace\n */\nexport function writeTranslation(\n translationsPath: string,\n language: string,\n namespace: string,\n translations: TranslationFile\n): void {\n const langPath = path.join(translationsPath, language);\n\n if (!fs.existsSync(langPath)) {\n fs.mkdirSync(langPath, { recursive: true });\n }\n\n const filePath = path.join(langPath, `${namespace}.json`);\n fs.writeFileSync(filePath, `${JSON.stringify(translations, null, 2)}\\n`, 'utf-8');\n}\n\n/**\n * Get all available languages from the translations directory\n */\nexport function getAvailableLanguages(translationsPath: string): string[] {\n if (!fs.existsSync(translationsPath)) {\n return [];\n }\n\n return fs\n .readdirSync(translationsPath, { withFileTypes: true })\n .filter((dirent) => dirent.isDirectory())\n .map((dirent) => dirent.name);\n}\n\n/**\n * Get all namespaces for a specific language\n */\nexport function getNamespaces(translationsPath: string, language: string): string[] {\n const langPath = path.join(translationsPath, language);\n\n if (!fs.existsSync(langPath)) {\n return [];\n }\n\n return fs\n .readdirSync(langPath)\n .filter((f) => f.endsWith('.json'))\n .map((f) => path.basename(f, '.json'));\n}\n\n/**\n * Check if a string contains interpolation variables (e.g., {{variable}})\n */\nexport function hasInterpolation(text: string): boolean {\n return /\\{\\{[^}]+\\}\\}/g.test(text);\n}\n\n/**\n * Extract interpolation variable names from a string\n */\nexport function extractVariables(text: string): string[] {\n const matches = text.match(/\\{\\{([^}]+)\\}\\}/g);\n if (!matches) return [];\n return matches.map((match) => match.replace(/\\{\\{|\\}\\}/g, '').trim());\n}\n\n/**\n * Validate that translated text has the same variables as source text\n */\nexport function validateVariables(sourceText: string, translatedText: string): boolean {\n const sourceVars = extractVariables(sourceText).sort();\n const translatedVars = extractVariables(translatedText).sort();\n\n if (sourceVars.length !== translatedVars.length) {\n return false;\n }\n\n return sourceVars.every((v, i) => v === translatedVars[i]);\n}\n\n/**\n * Sort object keys alphabetically\n */\nexport function sortKeys<T extends Record<string, unknown>>(obj: T): T {\n const sorted = {} as T;\n const keys = Object.keys(obj).sort();\n for (const key of keys) {\n sorted[key as keyof T] = obj[key as keyof T];\n }\n return sorted;\n}\n\n/**\n * Ensure translations path exists and has proper structure\n */\nexport function ensureTranslationsStructure(translationsPath: string, languages: string[]): void {\n if (!fs.existsSync(translationsPath)) {\n fs.mkdirSync(translationsPath, { recursive: true });\n }\n\n for (const lang of languages) {\n const langPath = path.join(translationsPath, lang);\n if (!fs.existsSync(langPath)) {\n fs.mkdirSync(langPath, { recursive: true });\n }\n }\n}\n\n/**\n * Create an empty translation structure from a source translation file\n * All values are set to empty strings, preserving the key structure\n */\nexport function createEmptyTranslationStructure(sourceFile: TranslationFile): TranslationFile {\n const result: TranslationFile = {};\n\n for (const key of Object.keys(sourceFile)) {\n result[key] = '';\n }\n\n return result;\n}\n\nexport interface SyncResult {\n createdFolders: string[];\n createdFiles: Array<{ language: string; namespace: string; path: string }>;\n skippedFiles: Array<{ language: string; namespace: string; reason: string }>;\n}\n\n/**\n * Synchronize translation structure based on source language\n * - Ensures all configured languages have folders\n * - Ensures all namespaces from source language exist in target languages\n * - Creates files with empty values matching source structure\n */\nexport function syncTranslationStructure(\n translationsPath: string,\n languages: string[],\n sourceLanguage: string\n): SyncResult {\n const result: SyncResult = {\n createdFolders: [],\n createdFiles: [],\n skippedFiles: []\n };\n\n // 1. Ensure all language folders exist\n ensureTranslationsStructure(translationsPath, languages);\n\n // 2. Get all namespaces from source language\n const sourceNamespaces = getNamespaces(translationsPath, sourceLanguage);\n\n if (!sourceNamespaces.length) {\n return result; // No namespaces to sync\n }\n\n // 3. Read source translations once\n const sourceTranslations = readTranslations(translationsPath, sourceLanguage);\n\n // 4. Sync each target language\n const targetLanguages = languages.filter((lang) => lang !== sourceLanguage);\n\n for (const language of targetLanguages) {\n for (const namespace of sourceNamespaces) {\n const filePath = path.join(translationsPath, language, `${namespace}.json`);\n\n // Check if file already exists\n if (fs.existsSync(filePath)) {\n result.skippedFiles.push({\n language,\n namespace,\n reason: 'already exists'\n });\n continue;\n }\n\n // Create empty structure from source\n const sourceFile = sourceTranslations[namespace] || {};\n const emptyStructure = createEmptyTranslationStructure(sourceFile);\n\n // Write the file\n writeTranslation(translationsPath, language, namespace, emptyStructure);\n\n result.createdFiles.push({\n language,\n namespace,\n path: filePath\n });\n }\n }\n\n return result;\n}\n","import type { TranslationProviderType } from './schema.js';\n\nexport interface TranslationConfig {\n /** Path to the translations directory (default: public/static/locales) */\n translationsPath?: string;\n /** Languages to support (default: ['en']) */\n languages?: string[];\n /** Source language for translations (default: 'en') */\n sourceLanguage?: string;\n /** Path to output i18n types (default: src/types/i18nTypes.ts) */\n typesOutputPath?: string;\n /** Translation provider to use (default: 'deepl') */\n provider?: TranslationProviderType;\n /** Enable automatic language fallback for unsupported regional variants (default: true) */\n useFallbackLanguages?: boolean;\n}\n\nexport interface TranslationEntry {\n namespace: string;\n key: string;\n value: string;\n}\n\nexport interface TranslationFile {\n [key: string]: string;\n}\n\nexport interface TranslationFiles {\n [namespace: string]: TranslationFile;\n}\n\nexport interface MissingTranslation {\n namespace: string;\n key: string;\n language: string;\n sourceValue: string;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n missing: MissingTranslation[];\n empty: MissingTranslation[];\n}\n\nexport const DEFAULT_CONFIG: Required<TranslationConfig> = {\n translationsPath: 'public/static/locales',\n languages: ['en'],\n sourceLanguage: 'en',\n typesOutputPath: 'src/types/i18nTypes.ts',\n provider: 'google',\n useFallbackLanguages: true\n};\n\nexport const DEFAULT_LANGUAGES = ['en', 'fr', 'it', 'pl', 'es', 'pt', 'de', 'nl', 'sv', 'hu', 'cs', 'ja'] as const;\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { validateLanguages } from '../core/schema.js';\nimport type { TranslationConfig } from '../core/types.js';\nimport { DEFAULT_CONFIG, DEFAULT_LANGUAGES } from '../core/types.js';\nimport { ensureTranslationsStructure, getAvailableLanguages, syncTranslationStructure } from '../utils/utils.js';\n\n/**\n * Detect existing translation structure in common locations\n */\nexport function detectExistingTranslations(projectRoot: string): {\n path: string | null;\n languages: string[];\n} {\n const possiblePaths = ['public/static/locales', 'public/locales', 'src/locales', 'locales', 'i18n', 'translations'];\n\n for (const possiblePath of possiblePaths) {\n const fullPath = path.join(projectRoot, possiblePath);\n if (fs.existsSync(fullPath)) {\n const languages = getAvailableLanguages(fullPath);\n if (languages.length > 0) {\n return { path: possiblePath, languages };\n }\n }\n }\n\n return { path: null, languages: [] };\n}\n\n/**\n * Initialize translation structure for a project\n */\nexport function initTranslations(projectRoot: string, config: TranslationConfig = {}): void {\n console.log('=====');\n console.log('Initializing translation structure');\n console.log('=====');\n\n // Detect existing translations\n const existing = detectExistingTranslations(projectRoot);\n\n let finalConfig = { ...DEFAULT_CONFIG, ...config };\n\n // Use detected path and languages if found\n if (existing.path && existing.languages.length > 0) {\n console.log(`✓ Detected existing translations at: ${existing.path}`);\n console.log(`✓ Found languages: ${existing.languages.join(', ')}`);\n\n // Validate detected languages\n const validation = validateLanguages(existing.languages);\n if (!validation.valid) {\n console.log(`⚠️ Warning: Invalid language codes found: ${validation.invalid.join(', ')}`);\n console.log('These languages will be skipped.');\n }\n\n const validLanguages = existing.languages.filter((lang) => !validation.invalid.includes(lang));\n\n finalConfig = {\n ...finalConfig,\n translationsPath: existing.path,\n languages: validLanguages.length > 0 ? validLanguages : finalConfig.languages\n };\n }\n\n const translationsPath = path.join(projectRoot, finalConfig.translationsPath);\n const languages = finalConfig.languages.length > 0 ? finalConfig.languages : [...DEFAULT_LANGUAGES];\n\n console.log(`Project root: ${projectRoot}`);\n console.log(`Translations path: ${translationsPath}`);\n console.log(`Languages: ${languages.join(', ')}`);\n console.log('=====');\n\n // Validate languages\n const validation = validateLanguages(languages);\n if (!validation.valid) {\n throw new Error(`Invalid language codes: ${validation.invalid.join(', ')}`);\n }\n\n // Create directory structure\n ensureTranslationsStructure(translationsPath, languages);\n\n // Create sample translation files for English (source language)\n const sourceLanguage = finalConfig.sourceLanguage;\n const sourcePath = path.join(translationsPath, sourceLanguage);\n\n // Create a sample common.json if it doesn't exist\n const commonPath = path.join(sourcePath, 'common.json');\n if (!fs.existsSync(commonPath)) {\n const sampleTranslations = {\n LOADING: 'Loading',\n SAVE: 'Save',\n CANCEL: 'Cancel',\n SUBMIT: 'Submit',\n ERROR: 'Error',\n SUCCESS: 'Success'\n };\n\n fs.writeFileSync(commonPath, `${JSON.stringify(sampleTranslations, null, 2)}\\n`, 'utf-8');\n console.log(`Created sample file: ${commonPath}`);\n }\n\n // Sync all namespaces from source to target languages\n console.log('\\nSynchronizing translation structure...');\n const syncResult = syncTranslationStructure(translationsPath, languages, sourceLanguage);\n\n if (syncResult.createdFiles.length > 0) {\n console.log(`Created ${syncResult.createdFiles.length} namespace files in target languages`);\n const languageGroups = new Set(syncResult.createdFiles.map((f) => f.language));\n for (const lang of languageGroups) {\n const langFiles = syncResult.createdFiles.filter((f) => f.language === lang);\n console.log(` ${lang}: ${langFiles.map((f) => f.namespace).join(', ')}`);\n }\n }\n\n // Create config file with schema reference\n const configPath = path.join(projectRoot, '.translationsrc.json');\n if (!fs.existsSync(configPath)) {\n const configContent = {\n $schema: './node_modules/poly-lexis/dist/translations/core/translations-config.schema.json',\n translationsPath: finalConfig.translationsPath,\n languages,\n sourceLanguage,\n typesOutputPath: finalConfig.typesOutputPath,\n provider: finalConfig.provider\n };\n\n fs.writeFileSync(configPath, `${JSON.stringify(configContent, null, 2)}\\n`, 'utf-8');\n console.log(`Created config file: ${configPath}`);\n }\n\n console.log('=====');\n console.log('Translation structure initialized successfully!');\n console.log('=====');\n}\n\n/**\n * Load translation configuration from .translationsrc.json\n */\nexport function loadConfig(projectRoot: string): Required<TranslationConfig> {\n const configPath = path.join(projectRoot, '.translationsrc.json');\n\n if (!fs.existsSync(configPath)) {\n // Try to detect existing translations\n const existing = detectExistingTranslations(projectRoot);\n if (existing.path && existing.languages.length > 0) {\n console.log(`ℹ️ No config found, but detected translations at ${existing.path}`);\n return {\n ...DEFAULT_CONFIG,\n translationsPath: existing.path,\n languages: existing.languages\n };\n }\n return DEFAULT_CONFIG;\n }\n\n const configContent = fs.readFileSync(configPath, 'utf-8');\n const config = JSON.parse(configContent) as TranslationConfig;\n\n // Validate languages in config\n if (config.languages) {\n const validation = validateLanguages(config.languages);\n if (!validation.valid) {\n console.warn(`⚠️ Warning: Invalid language codes in config: ${validation.invalid.join(', ')}`);\n console.warn('Please update .translationsrc.json with valid language codes.');\n }\n }\n\n return { ...DEFAULT_CONFIG, ...config };\n}\n","import { execSync } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { getNamespaces, readTranslations } from '../utils/utils.js';\nimport { loadConfig } from './init.js';\n\nconst typeTemplate = (translationKeys: string[], namespaceKeys: string[]): string => `\n export const translationKeys = [${translationKeys.map((key) => `\"${key}\"`).join(', ')}] as const;\n export const namespaceKeys = [${namespaceKeys.map((key) => `\"${key}\"`).join(', ')}] as const;\n\n export type TranslationKey = typeof translationKeys[number];\n export type TranslationNamespace = typeof namespaceKeys[number];\n`;\n\n/**\n * Generate TypeScript types from translation files\n */\nexport function generateTranslationTypes(projectRoot: string = process.cwd()): void {\n console.log('=====');\n console.time('i18n types generated');\n console.log('Generating i18n types');\n console.log('=====');\n\n const config = loadConfig(projectRoot);\n const translationsPath = path.join(projectRoot, config.translationsPath);\n const sourceLanguage = config.sourceLanguage;\n const outputFilePath = path.join(projectRoot, config.typesOutputPath);\n\n const dirPath = path.join(translationsPath, sourceLanguage);\n\n // Check if the source language directory exists\n if (!fs.existsSync(dirPath)) {\n throw new Error(`Source language directory not found: ${dirPath}`);\n }\n\n // Get namespaces\n const namespaces = getNamespaces(translationsPath, sourceLanguage);\n\n if (!namespaces.length) {\n throw new Error(`No translation files found in ${dirPath}`);\n }\n\n // Read all translation files and collect keys\n const translations = readTranslations(translationsPath, sourceLanguage);\n let allKeys: string[] = [];\n\n for (const namespace of namespaces) {\n const keys = Object.keys(translations[namespace] || {});\n allKeys = allKeys.concat(keys);\n }\n\n // Ensure the output directory exists\n const outputDir = path.dirname(outputFilePath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n const typeString = typeTemplate(allKeys, namespaces);\n fs.writeFileSync(outputFilePath, typeString, 'utf8');\n\n console.log(`Generated types with ${allKeys.length} keys and ${namespaces.length} namespaces`);\n console.log(`Output: ${outputFilePath}`);\n\n // Format with Biome\n try {\n execSync(`pnpm biome format --write ${outputFilePath}`, {\n stdio: 'inherit',\n cwd: projectRoot\n });\n } catch {\n console.warn('Failed to format with Biome, continuing without formatting...');\n }\n\n console.timeEnd('i18n types generated');\n console.log('=====');\n}\n","import 'dotenv/config';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { parseArgs } from 'node:util';\nimport { confirm, input, select } from '@inquirer/prompts';\nimport { addTranslationKey } from '../translations/cli/add-key.js';\nimport { loadConfig } from '../translations/cli/init.js';\nimport { initTranslationsInteractive } from '../translations/cli/init-interactive.js';\nimport { manageTranslations } from '../translations/cli/manage.js';\nimport { getNamespaces } from '../translations/utils/utils.js';\n\nconst { values, positionals } = parseArgs({\n options: {\n 'auto-fill': {\n type: 'boolean',\n short: 'a',\n default: false\n },\n 'api-key': {\n type: 'string'\n },\n limit: {\n type: 'string',\n default: '1000'\n },\n language: {\n type: 'string',\n short: 'l'\n },\n 'skip-types': {\n type: 'boolean',\n default: false\n },\n 'dry-run': {\n type: 'boolean',\n short: 'd',\n default: false\n },\n namespace: {\n type: 'string',\n short: 'n'\n },\n key: {\n type: 'string',\n short: 'k'\n },\n value: {\n type: 'string',\n short: 'v'\n },\n help: {\n type: 'boolean',\n short: 'h'\n }\n },\n allowPositionals: true\n});\n\nif (values.help) {\n console.log(`\nUsage: translations [command] [options]\n\nSmart translation management - automatically handles initialization, validation,\nauto-filling, and type generation based on your project's current state.\n\nCommands:\n (none) Smart mode - validates, fills, and generates types\n add Add a new translation key\n\nOptions (Smart Mode):\n -a, --auto-fill Auto-fill missing translations with DeepL or Google Translate\n --api-key <key> Translation API key (or set DEEPL_API_KEY/GOOGLE_TRANSLATE_API_KEY)\n -l, --language <lang> Process only this language\n --limit <number> Max translations to process (default: 1000)\n --skip-types Skip TypeScript type generation\n -d, --dry-run Preview changes without saving\n -h, --help Show this help\n\nOptions (Add Mode):\n -n, --namespace <name> Namespace for the translation\n -k, --key <key> Translation key\n -v, --value <value> Translation value in source language\n -a, --auto-fill Auto-translate to all languages\n\n (no options) Interactive mode - prompts for all inputs\n\nExamples:\n # Smart mode - check and validate translations\n translations\n\n # Smart mode - validate and auto-fill missing translations (DeepL)\n export DEEPL_API_KEY=your_key\n translations --auto-fill\n\n # Smart mode - validate and auto-fill missing translations (Google)\n export GOOGLE_TRANSLATE_API_KEY=your_key\n translations --auto-fill\n\n # Smart mode - auto-fill only French translations\n translations --auto-fill --language fr\n\n # Preview what would be translated (dry-run)\n translations --auto-fill --dry-run\n\n # Add a new translation key (interactive mode)\n translations add\n\n # Add with flags (non-interactive)\n translations add --namespace common --key HELLO --value \"Hello\"\n\n # Add with auto-translation\n translations add -n common -k WELCOME -v \"Welcome\" --auto-fill\n\nWhat happens in smart mode:\n 1. Checks if translations are initialized (creates .translationsrc.json if needed)\n 2. Validates all translations against source language\n 3. Auto-fills missing translations if --auto-fill is provided\n 4. Generates TypeScript types (unless --skip-types)\n 5. Shows summary and next steps\n`);\n process.exit(0);\n}\n\nconst command = positionals[0];\n\n// Handle 'add' command\nif (command === 'add') {\n // Interactive mode if no options provided\n if (!values.namespace && !values.key && !values.value) {\n (async () => {\n try {\n console.log('\\n✨ Add a new translation key\\n');\n\n // Check if initialized\n const configPath = path.join(process.cwd(), '.translationsrc.json');\n const isInitialized = fs.existsSync(configPath);\n\n if (!isInitialized) {\n console.log('⚠️ Translation structure not initialized.');\n const shouldInit = await confirm({\n message: 'Would you like to initialize it now?',\n default: true\n });\n\n if (shouldInit) {\n await initTranslationsInteractive(process.cwd());\n console.log();\n } else {\n console.log('❌ Cannot add translations without initialization.');\n process.exit(1);\n }\n }\n\n // Load config to get existing namespaces\n const config = loadConfig(process.cwd());\n const translationsPath = path.join(process.cwd(), config.translationsPath);\n const existingNamespaces = getNamespaces(translationsPath, config.sourceLanguage);\n\n // Prompt for namespace\n let namespace: string;\n if (existingNamespaces.length > 0) {\n const namespaceChoice = await select({\n message: 'Select namespace:',\n choices: [\n ...existingNamespaces.map((ns) => ({ name: ns, value: ns })),\n { name: '➕ Create new namespace', value: '__new__' }\n ]\n });\n\n if (namespaceChoice === '__new__') {\n namespace = await input({\n message: 'Enter new namespace name:',\n validate: (value) => {\n if (!value.trim()) return 'Namespace is required';\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Namespace must contain only lowercase letters, numbers, and hyphens';\n }\n return true;\n }\n });\n } else {\n namespace = namespaceChoice;\n }\n } else {\n namespace = await input({\n message: 'Enter namespace name (e.g., common, members):',\n default: 'common',\n validate: (value) => {\n if (!value.trim()) return 'Namespace is required';\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Namespace must contain only lowercase letters, numbers, and hyphens';\n }\n return true;\n }\n });\n }\n\n // Prompt for key\n const key = await input({\n message: 'Enter translation key (UPPERCASE_SNAKE_CASE):',\n validate: (value) => {\n if (!value.trim()) return 'Key is required';\n if (!/^[A-Z0-9_]+$/.test(value)) {\n return 'Key should use UPPERCASE_SNAKE_CASE (e.g., SAVE_CHANGES)';\n }\n return true;\n },\n transformer: (value) => value.toUpperCase()\n });\n\n // Prompt for value\n const value = await input({\n message: `Enter ${config.sourceLanguage.toUpperCase()} translation:`,\n validate: (value) => {\n if (!value.trim()) return 'Translation value is required';\n return true;\n }\n });\n\n // Ask about auto-translation\n const autoTranslate = await confirm({\n message: `Auto-translate to ${config.languages.length - 1} other languages?`,\n default: true\n });\n\n let apiKey: string | undefined;\n if (autoTranslate) {\n const provider = config.provider || 'deepl';\n const envVarName = provider === 'google' ? 'GOOGLE_TRANSLATE_API_KEY' : 'DEEPL_API_KEY';\n apiKey = values['api-key'] || process.env[envVarName];\n if (!apiKey) {\n console.log(`\\n⚠️ ${envVarName} environment variable not found.`);\n console.log('Skipping auto-translation. Set this variable to enable auto-translation.\\n');\n }\n }\n\n console.log();\n\n // Add the translation\n await addTranslationKey(process.cwd(), {\n namespace,\n key: key.toUpperCase(),\n value,\n autoTranslate: autoTranslate && !!apiKey,\n apiKey\n });\n\n console.log('\\n💡 Run \"translations\" to validate and generate types');\n } catch (error) {\n if ((error as { message?: string }).message === 'User force closed the prompt') {\n console.log('\\n❌ Cancelled');\n process.exit(0);\n }\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n })();\n } else {\n // Non-interactive mode with flags\n if (!values.namespace || !values.key || !values.value) {\n console.error('Error: --namespace, --key, and --value are required for add command');\n console.log('Use --help for usage information');\n process.exit(1);\n }\n\n const config = loadConfig(process.cwd());\n const provider = config.provider || 'deepl';\n const envVarName = provider === 'google' ? 'GOOGLE_TRANSLATE_API_KEY' : 'DEEPL_API_KEY';\n const apiKey = values['api-key'] || process.env[envVarName];\n\n if (values['auto-fill'] && !apiKey) {\n console.error(`Error: --api-key or ${envVarName} environment variable is required for auto-translation`);\n process.exit(1);\n }\n\n addTranslationKey(process.cwd(), {\n namespace: values.namespace,\n key: values.key,\n value: values.value,\n autoTranslate: values['auto-fill'],\n apiKey\n })\n .then(() => {\n console.log('\\n💡 Run \"translations\" to validate and generate types');\n })\n .catch((error) => {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n });\n }\n} else if (command) {\n console.error(`Unknown command: ${command}`);\n console.log('Use --help for usage information');\n process.exit(1);\n} else {\n // Check if any flags were provided\n const hasFlags = values['auto-fill'] || values.language || values['skip-types'] || values['dry-run'];\n\n if (hasFlags) {\n // Flag mode - run with provided options\n const configPath = path.join(process.cwd(), '.translationsrc.json');\n const config = fs.existsSync(configPath) ? loadConfig(process.cwd()) : { provider: 'deepl' };\n const provider = config.provider || 'deepl';\n const envVarName = provider === 'google' ? 'GOOGLE_TRANSLATE_API_KEY' : 'DEEPL_API_KEY';\n const apiKey = values['api-key'] || process.env[envVarName];\n const limit = Number.parseInt(values.limit || '1000', 10);\n\n manageTranslations(process.cwd(), {\n autoFill: values['auto-fill'],\n apiKey,\n limit,\n language: values.language,\n skipTypes: values['skip-types'],\n dryRun: values['dry-run']\n })\n .then((isValid) => {\n if (!isValid) {\n process.exit(1);\n }\n })\n .catch((error) => {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n });\n } else {\n // Interactive menu mode - show options\n (async () => {\n try {\n const configPath = path.join(process.cwd(), '.translationsrc.json');\n const isInitialized = fs.existsSync(configPath);\n\n console.log('\\n🌍 Translation Management\\n');\n\n const action = await select({\n message: 'What would you like to do?',\n choices: [\n {\n name: '✨ Add a new translation key',\n value: 'add',\n description: 'Add a translation key to all languages'\n },\n {\n name: '🔍 Validate translations',\n value: 'validate',\n description: 'Check for missing or empty translations'\n },\n {\n name: '🤖 Auto-fill missing translations',\n value: 'autofill',\n description: 'Automatically translate missing keys with DeepL or Google Translate'\n },\n {\n name: '📝 Generate TypeScript types',\n value: 'types',\n description: 'Generate types from translation files'\n },\n {\n name: '⚙️ Initialize/reconfigure',\n value: 'init',\n description: 'Set up or change translation configuration'\n },\n {\n name: '📊 Full check (validate + types)',\n value: 'full',\n description: 'Validate translations and generate types'\n }\n ]\n });\n\n console.log();\n\n if (action === 'add') {\n // Run add command in interactive mode\n if (!isInitialized) {\n console.log('⚠️ Translation structure not initialized.');\n const shouldInit = await confirm({\n message: 'Would you like to initialize it now?',\n default: true\n });\n\n if (shouldInit) {\n await initTranslationsInteractive(process.cwd());\n console.log();\n } else {\n console.log('❌ Cannot add translations without initialization.');\n process.exit(1);\n }\n }\n\n const config = loadConfig(process.cwd());\n const translationsPath = path.join(process.cwd(), config.translationsPath);\n const existingNamespaces = getNamespaces(translationsPath, config.sourceLanguage);\n\n let namespace: string;\n if (existingNamespaces.length > 0) {\n const namespaceChoice = await select({\n message: 'Select namespace:',\n choices: [\n ...existingNamespaces.map((ns) => ({ name: ns, value: ns })),\n { name: '➕ Create new namespace', value: '__new__' }\n ]\n });\n\n if (namespaceChoice === '__new__') {\n namespace = await input({\n message: 'Enter new namespace name:',\n validate: (value) => {\n if (!value.trim()) return 'Namespace is required';\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Namespace must contain only lowercase letters, numbers, and hyphens';\n }\n return true;\n }\n });\n } else {\n namespace = namespaceChoice;\n }\n } else {\n namespace = await input({\n message: 'Enter namespace name (e.g., common, members):',\n default: 'common',\n validate: (value) => {\n if (!value.trim()) return 'Namespace is required';\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Namespace must contain only lowercase letters, numbers, and hyphens';\n }\n return true;\n }\n });\n }\n\n const key = await input({\n message: 'Enter translation key (UPPERCASE_SNAKE_CASE):',\n validate: (value) => {\n if (!value.trim()) return 'Key is required';\n if (!/^[A-Z0-9_]+$/.test(value)) {\n return 'Key should use UPPERCASE_SNAKE_CASE (e.g., SAVE_CHANGES)';\n }\n return true;\n },\n transformer: (value) => value.toUpperCase()\n });\n\n const value = await input({\n message: `Enter ${config.sourceLanguage.toUpperCase()} translation:`,\n validate: (value) => {\n if (!value.trim()) return 'Translation value is required';\n return true;\n }\n });\n\n // Ask about auto-translation\n const autoTranslate = await confirm({\n message: `Auto-translate to ${config.languages.length - 1} other languages?`,\n default: true\n });\n\n let apiKey: string | undefined;\n if (autoTranslate) {\n const provider = config.provider || 'deepl';\n const envVarName = provider === 'google' ? 'GOOGLE_TRANSLATE_API_KEY' : 'DEEPL_API_KEY';\n apiKey = process.env[envVarName];\n if (!apiKey) {\n console.log(`\\n⚠️ ${envVarName} environment variable not found.`);\n console.log('Skipping auto-translation. Set this variable to enable auto-translation.\\n');\n }\n }\n\n console.log();\n\n await addTranslationKey(process.cwd(), {\n namespace,\n key: key.toUpperCase(),\n value,\n autoTranslate: autoTranslate && !!apiKey,\n apiKey\n });\n\n console.log('\\n💡 Run \"translations\" again to validate and generate types');\n } else if (action === 'init') {\n await initTranslationsInteractive(process.cwd());\n } else if (action === 'validate') {\n await manageTranslations(process.cwd(), {\n skipTypes: true\n });\n } else if (action === 'autofill') {\n const config = loadConfig(process.cwd());\n const provider = config.provider || 'deepl';\n const envVarName = provider === 'google' ? 'GOOGLE_TRANSLATE_API_KEY' : 'DEEPL_API_KEY';\n const apiKey = process.env[envVarName];\n if (!apiKey) {\n console.log(`⚠️ ${envVarName} environment variable not found.`);\n console.log('Please set it to enable auto-translation.\\n');\n process.exit(1);\n }\n\n const shouldContinue = await confirm({\n message: 'This will auto-translate all missing keys. Continue?',\n default: true\n });\n\n if (shouldContinue) {\n await manageTranslations(process.cwd(), {\n autoFill: true,\n apiKey\n });\n }\n } else if (action === 'types') {\n console.log('📝 Generating TypeScript types...\\n');\n const { generateTranslationTypes } = await import('../translations/cli/generate-types.js');\n generateTranslationTypes(process.cwd());\n console.log('\\n✅ Types generated!\\n');\n } else if (action === 'full') {\n await manageTranslations(process.cwd());\n }\n } catch (error) {\n if ((error as { message?: string }).message === 'User force closed the prompt') {\n console.log('\\n❌ Cancelled');\n process.exit(0);\n }\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n })();\n }\n}\n","import * as path from 'node:path';\nimport type { TranslationEntry } from '../core/types.js';\nimport { translateText } from '../utils/translator.js';\nimport { readTranslations, sortKeys, writeTranslation } from '../utils/utils.js';\nimport { loadConfig } from './init.js';\n\ninterface AddKeyOptions {\n /** Namespace for the translation key */\n namespace: string;\n /** Translation key */\n key: string;\n /** Translation value (English) */\n value: string;\n /** Auto-translate to all languages */\n autoTranslate?: boolean;\n /** Google Translate API key */\n apiKey?: string;\n}\n\n/**\n * Add a new translation key to all languages\n */\nexport async function addTranslationKey(projectRoot: string, options: AddKeyOptions): Promise<void> {\n const config = loadConfig(projectRoot);\n const translationsPath = path.join(projectRoot, config.translationsPath);\n const { namespace, key, value, autoTranslate = false, apiKey } = options;\n\n console.log('=====');\n console.log('Adding translation key');\n console.log('=====');\n console.log(`Namespace: ${namespace}`);\n console.log(`Key: ${key}`);\n console.log(`Value (${config.sourceLanguage}): ${value}`);\n console.log('=====');\n\n // Add to source language\n const sourceLang = config.sourceLanguage;\n const sourceTranslations = readTranslations(translationsPath, sourceLang);\n\n if (!sourceTranslations[namespace]) {\n sourceTranslations[namespace] = {};\n }\n\n if (sourceTranslations[namespace][key]) {\n console.log(`⚠ Warning: Key \"${key}\" already exists in ${namespace}. Updating value.`);\n }\n\n sourceTranslations[namespace][key] = value;\n const sortedSource = sortKeys(sourceTranslations[namespace]);\n writeTranslation(translationsPath, sourceLang, namespace, sortedSource);\n console.log(`✓ Added to ${sourceLang}/${namespace}.json`);\n\n // Handle other languages\n const otherLanguages = config.languages.filter((lang) => lang !== sourceLang);\n\n if (autoTranslate && apiKey) {\n console.log('\\nAuto-translating to other languages...');\n\n for (const lang of otherLanguages) {\n try {\n const targetTranslations = readTranslations(translationsPath, lang);\n\n if (!targetTranslations[namespace]) {\n targetTranslations[namespace] = {};\n }\n\n // Only translate if key doesn't exist or is empty\n if (!targetTranslations[namespace][key] || targetTranslations[namespace][key].trim() === '') {\n const translated = await translateText(value, lang, sourceLang, apiKey);\n targetTranslations[namespace][key] = translated;\n const sorted = sortKeys(targetTranslations[namespace]);\n writeTranslation(translationsPath, lang, namespace, sorted);\n console.log(` ✓ ${lang}: \"${translated}\"`);\n\n // Small delay to avoid rate limiting\n await new Promise((resolve) => setTimeout(resolve, 100));\n } else {\n console.log(` - ${lang}: Already exists, skipping`);\n }\n } catch (error) {\n console.error(` ✗ ${lang}: Translation failed - ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n } else {\n // Add empty string to other languages\n console.log('\\nAdding empty values to other languages...');\n\n for (const lang of otherLanguages) {\n const targetTranslations = readTranslations(translationsPath, lang);\n\n if (!targetTranslations[namespace]) {\n targetTranslations[namespace] = {};\n }\n\n // Only add if key doesn't exist\n if (!targetTranslations[namespace][key]) {\n targetTranslations[namespace][key] = '';\n const sorted = sortKeys(targetTranslations[namespace]);\n writeTranslation(translationsPath, lang, namespace, sorted);\n console.log(` ✓ ${lang}/${namespace}.json`);\n } else {\n console.log(` - ${lang}/${namespace}.json: Already exists`);\n }\n }\n\n if (!autoTranslate) {\n console.log('\\nℹ Use --auto-translate flag to automatically translate to all languages');\n }\n }\n\n console.log('=====');\n console.log('Translation key added successfully!');\n console.log('=====');\n}\n\n/**\n * Add multiple translation keys at once\n */\nexport async function addTranslationKeys(\n projectRoot: string,\n entries: TranslationEntry[],\n autoTranslate: boolean = false,\n apiKey?: string\n): Promise<void> {\n console.log(`Adding ${entries.length} translation keys...`);\n\n for (const entry of entries) {\n await addTranslationKey(projectRoot, {\n namespace: entry.namespace,\n key: entry.key,\n value: entry.value,\n autoTranslate,\n apiKey\n });\n }\n}\n","/**\n * Translation utilities with support for custom translation providers\n * Only translates content outside of {{variable}} interpolations\n */\n\nimport { GoogleTranslateProvider } from './google-translate-provider';\nimport type { TranslationProvider } from './translator-interface';\n\n/**\n * Default translation provider (Google Translate)\n */\nconst defaultProvider: TranslationProvider = new GoogleTranslateProvider();\n\n/**\n * Custom translation provider (if set by user)\n */\nlet customProvider: TranslationProvider | null = null;\n\n/**\n * Set a custom translation provider\n * @param provider - Custom translation provider implementing TranslationProvider interface\n */\nexport function setTranslationProvider(provider: TranslationProvider): void {\n customProvider = provider;\n}\n\n/**\n * Get the active translation provider (custom or default)\n */\nexport function getTranslationProvider(): TranslationProvider {\n return customProvider || defaultProvider;\n}\n\n/**\n * Reset to the default Google Translate provider\n */\nexport function resetTranslationProvider(): void {\n customProvider = null;\n}\n\n/**\n * Translate text using the active translation provider\n * Preserves {{variable}} interpolations by temporarily replacing them\n *\n * @param text - Text to translate\n * @param targetLang - Target language code\n * @param sourceLang - Source language code (default: \"en\")\n * @param apiKey - API key for the translation service\n * @param useFallbackLanguages - Enable automatic language fallback (default: true)\n * @returns Promise resolving to translated text\n */\nexport async function translateText(\n text: string,\n targetLang: string,\n sourceLang: string = 'en',\n apiKey?: string,\n useFallbackLanguages = true\n): Promise<string> {\n const provider = getTranslationProvider();\n return provider.translate({\n text,\n sourceLang,\n targetLang,\n apiKey,\n useFallbackLanguages\n });\n}\n\n/**\n * Translate multiple texts in batch\n *\n * @param texts - Array of texts to translate\n * @param targetLang - Target language code\n * @param sourceLang - Source language code (default: \"en\")\n * @param apiKey - API key for the translation service\n * @param delayMs - Delay between requests in milliseconds (default: 100)\n * @returns Promise resolving to array of translated texts\n */\nexport async function translateBatch(\n texts: string[],\n targetLang: string,\n sourceLang: string = 'en',\n apiKey?: string,\n delayMs: number = 100\n): Promise<string[]> {\n const provider = getTranslationProvider();\n return provider.translateBatch(texts, sourceLang, targetLang, apiKey, delayMs);\n}\n","/**\n * Google Translate provider implementation\n * Uses Google Cloud Translation API v2\n */\n\nimport { logLanguageFallback, resolveLanguageWithFallback } from './language-fallback.js';\nimport type { TranslateOptions, TranslationProvider } from './translator-interface';\n\ninterface GoogleTranslateResponse {\n data: {\n translations: Array<{\n translatedText: string;\n }>;\n };\n error?: {\n message: string;\n };\n}\n\n/**\n * Preserve {{variable}} interpolations by replacing with placeholders\n * Uses a format that Google Translate won't translate (uppercase + underscores + numbers)\n */\nfunction preserveVariables(text: string): {\n textWithPlaceholders: string;\n variableMap: Map<string, string>;\n} {\n const variableMap = new Map<string, string>();\n let placeholderIndex = 0;\n\n const textWithPlaceholders = text.replace(/\\{\\{([^}]+)\\}\\}/g, (match) => {\n // Use XXX prefix (not a real word in any language) to avoid translation\n const placeholder = `XXX_${placeholderIndex}_XXX`;\n variableMap.set(placeholder, match);\n placeholderIndex++;\n return placeholder;\n });\n\n return { textWithPlaceholders, variableMap };\n}\n\n/**\n * Restore original {{variable}} interpolations from placeholders\n */\nfunction restoreVariables(text: string, variableMap: Map<string, string>): string {\n let result = text;\n for (const [placeholder, original] of variableMap) {\n result = result.replace(new RegExp(placeholder, 'g'), original);\n }\n return result;\n}\n\n/**\n * Google Translate provider\n * Implements the TranslationProvider interface\n */\nexport class GoogleTranslateProvider implements TranslationProvider {\n async translate(options: TranslateOptions): Promise<string> {\n const { text, sourceLang, targetLang, apiKey, useFallbackLanguages = true } = options;\n\n if (!apiKey) {\n throw new Error(\n 'Google Translate API key is required. Set GOOGLE_TRANSLATE_API_KEY environment variable or provide apiKey in options.'\n );\n }\n\n // Resolve target language with fallback\n const targetLangResult = resolveLanguageWithFallback(targetLang, 'google', useFallbackLanguages);\n logLanguageFallback(targetLangResult, 'google');\n\n // Resolve source language with fallback (if provided)\n let resolvedSourceLang: string | undefined;\n if (sourceLang) {\n const sourceLangResult = resolveLanguageWithFallback(sourceLang, 'google', useFallbackLanguages);\n logLanguageFallback(sourceLangResult, 'google');\n resolvedSourceLang = sourceLangResult.resolvedLanguage;\n }\n\n // Extract and preserve interpolation variables\n const { textWithPlaceholders, variableMap } = preserveVariables(text);\n\n // Translate the text with placeholders\n const url = `https://translation.googleapis.com/language/translate/v2?key=${apiKey}`;\n\n // For Google Translate, use base language code (before underscore) for regional variants\n // e.g., 'pt_br' -> 'pt', but keep the full code if it's in the supported list\n const sourceForGoogle = resolvedSourceLang?.includes('_') ? resolvedSourceLang.split('_')[0] : resolvedSourceLang;\n\n const targetForGoogle = targetLangResult.resolvedLanguage.includes('_')\n ? targetLangResult.resolvedLanguage.split('_')[0]\n : targetLangResult.resolvedLanguage;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n q: textWithPlaceholders,\n source: sourceForGoogle,\n target: targetForGoogle,\n format: 'text'\n })\n });\n\n const data = (await response.json()) as GoogleTranslateResponse;\n\n if (data.error) {\n throw new Error(`Google Translate API error: ${data.error.message}`);\n }\n\n const translatedText = data.data.translations[0].translatedText;\n\n // Restore original interpolation variables\n return restoreVariables(translatedText, variableMap);\n }\n\n async translateBatch(\n texts: string[],\n sourceLang: string,\n targetLang: string,\n apiKey?: string,\n delayMs: number = 100\n ): Promise<string[]> {\n const results: string[] = [];\n\n for (const text of texts) {\n const translated = await this.translate({\n text,\n sourceLang,\n targetLang,\n apiKey\n });\n results.push(translated);\n\n // Add delay to avoid rate limiting\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n return results;\n }\n\n async validateConfig(): Promise<boolean> {\n const apiKey = process.env.GOOGLE_TRANSLATE_API_KEY;\n return !!apiKey;\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { checkbox, confirm, input, select } from '@inquirer/prompts';\nimport { SUPPORTED_LANGUAGES, type TranslationProviderType } from '../core/schema.js';\nimport type { TranslationConfig } from '../core/types.js';\nimport { DEFAULT_CONFIG } from '../core/types.js';\nimport { initTranslations } from './init.js';\n\n/**\n * Interactive initialization of translation structure\n */\nexport async function initTranslationsInteractive(projectRoot: string = process.cwd()): Promise<void> {\n console.log('\\n🌍 Translation System Setup\\n');\n\n // Check if already initialized\n const configPath = path.join(projectRoot, '.translationsrc.json');\n const alreadyExists = fs.existsSync(configPath);\n\n if (alreadyExists) {\n console.log('⚠️ Configuration file already exists at .translationsrc.json\\n');\n const shouldOverwrite = await confirm({\n message: 'Would you like to reconfigure?',\n default: false\n });\n\n if (!shouldOverwrite) {\n console.log('✓ Keeping existing configuration');\n return;\n }\n }\n\n // Detect existing translations\n const { detectExistingTranslations } = await import('./init.js');\n const existing = detectExistingTranslations(projectRoot);\n\n let translationsPath: string;\n let languages: string[];\n\n // Ask about translations path\n if (existing.path) {\n console.log(`✓ Found existing translations at: ${existing.path}`);\n const useExisting = await confirm({\n message: 'Use this location?',\n default: true\n });\n\n if (useExisting) {\n translationsPath = existing.path;\n } else {\n translationsPath = await input({\n message: 'Enter translations directory path:',\n default: DEFAULT_CONFIG.translationsPath,\n validate: (value) => {\n if (!value.trim()) return 'Path is required';\n return true;\n }\n });\n }\n } else {\n translationsPath = await input({\n message: 'Where should translations be stored?',\n default: DEFAULT_CONFIG.translationsPath,\n validate: (value) => {\n if (!value.trim()) return 'Path is required';\n return true;\n }\n });\n }\n\n // Ask about languages\n if (existing.languages.length > 0) {\n console.log(`✓ Found existing languages: ${existing.languages.join(', ')}`);\n const useExistingLangs = await confirm({\n message: 'Use these languages?',\n default: true\n });\n\n if (useExistingLangs) {\n languages = existing.languages;\n } else {\n languages = await selectLanguages();\n }\n } else {\n languages = await selectLanguages();\n }\n\n // Ask about source language\n const sourceLanguage = await input({\n message: 'What is your source language?',\n default: 'en',\n validate: (value) => {\n if (!SUPPORTED_LANGUAGES.includes(value as never)) {\n return `Invalid language code. Must be one of: ${SUPPORTED_LANGUAGES.join(', ')}`;\n }\n if (!languages.includes(value)) {\n return 'Source language must be in the list of supported languages';\n }\n return true;\n }\n });\n\n // Ask about types output path\n const typesOutputPath = await input({\n message: 'Where should TypeScript types be generated?',\n default: DEFAULT_CONFIG.typesOutputPath\n });\n\n // Ask about translation provider\n const provider = await select<TranslationProviderType>({\n message: 'Which translation provider would you like to use?',\n choices: [\n {\n name: 'DeepL (recommended)',\n value: 'deepl',\n description: 'High-quality translations, requires DEEPL_API_KEY'\n },\n {\n name: 'Google Translate',\n value: 'google',\n description: 'Google Cloud Translation API, requires GOOGLE_TRANSLATE_API_KEY'\n }\n ],\n default: 'deepl'\n });\n\n // Summary\n console.log('\\n📋 Configuration Summary:');\n console.log(` Translations: ${translationsPath}`);\n console.log(` Languages: ${languages.join(', ')}`);\n console.log(` Source: ${sourceLanguage}`);\n console.log(` Types: ${typesOutputPath}`);\n console.log(` Provider: ${provider}`);\n\n const confirmInit = await confirm({\n message: '\\nProceed with initialization?',\n default: true\n });\n\n if (!confirmInit) {\n console.log('❌ Cancelled');\n return;\n }\n\n // Initialize with selected config\n const config: TranslationConfig = {\n translationsPath,\n languages,\n sourceLanguage,\n typesOutputPath,\n provider\n };\n\n console.log();\n initTranslations(projectRoot, config);\n\n // Show helpful next steps\n console.log('\\n📝 Configuration saved to: .translationsrc.json');\n console.log('\\n💡 Next steps:');\n console.log(' 1. Run \"translations add\" to add your first translation key');\n console.log(' 2. Run \"translations\" to validate and generate types');\n console.log(' 3. Check the .translationsrc.json file for your configuration\\n');\n}\n\n/**\n * Helper to select languages interactively\n */\nasync function selectLanguages(): Promise<string[]> {\n const languageChoices = SUPPORTED_LANGUAGES.map((lang) => ({\n name: `${lang} - ${getLanguageName(lang)}`,\n value: lang,\n checked: lang === 'en' // English selected by default\n }));\n\n const selected = await checkbox({\n message: 'Select languages to support (space to select, enter to confirm):',\n choices: languageChoices,\n required: true,\n pageSize: 15,\n loop: false\n });\n\n return selected;\n}\n\n/**\n * Get human-readable language name\n */\nfunction getLanguageName(code: string): string {\n const names: Record<string, string> = {\n en: 'English',\n fr: 'French',\n it: 'Italian',\n pl: 'Polish',\n es: 'Spanish',\n pt: 'Portuguese',\n de: 'German',\n de_at: 'German (Austria)',\n nl: 'Dutch',\n sv: 'Swedish',\n hu: 'Hungarian',\n cs: 'Czech',\n ja: 'Japanese',\n zh_hk: 'Chinese (Hong Kong)',\n zh_cn: 'Chinese (Simplified)',\n ko: 'Korean',\n ru: 'Russian',\n ar: 'Arabic',\n he: 'Hebrew',\n tr: 'Turkish',\n da: 'Danish',\n fi: 'Finnish',\n no: 'Norwegian',\n pt_br: 'Portuguese (Brazil)'\n };\n return names[code] || code;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { syncTranslationStructure } from '../utils/utils.js';\nimport { autoFillTranslations } from './auto-fill.js';\nimport { generateTranslationTypes } from './generate-types.js';\nimport { initTranslations, loadConfig } from './init.js';\nimport { validateTranslations } from './validate.js';\n\nexport interface ManageTranslationsOptions {\n /** Auto-fill missing translations */\n autoFill?: boolean;\n /** Google Translate API key for auto-fill */\n apiKey?: string;\n /** Maximum translations to fill */\n limit?: number;\n /** Specific language to process */\n language?: string;\n /** Skip type generation */\n skipTypes?: boolean;\n /** Dry run mode */\n dryRun?: boolean;\n}\n\n/**\n * Smart translation management - handles init, validation, auto-fill, and type generation\n * based on the current state of the project\n * @returns true if translations are valid, false otherwise\n */\nexport async function manageTranslations(\n projectRoot: string = process.cwd(),\n options: ManageTranslationsOptions = {}\n): Promise<boolean> {\n const { autoFill = false, apiKey, limit = 1000, language, skipTypes = false, dryRun = false } = options;\n\n console.log('=====');\n console.log('Translation Management');\n console.log('=====');\n\n // Step 1: Check if initialized\n const configPath = path.join(projectRoot, '.translationsrc.json');\n const isInitialized = fs.existsSync(configPath);\n\n if (!isInitialized) {\n console.log('📁 No translation configuration found. Initializing...\\n');\n initTranslations(projectRoot);\n console.log('\\n✅ Initialization complete!\\n');\n } else {\n console.log('✓ Translation structure initialized\\n');\n }\n\n // Step 2: Load config\n const config = loadConfig(projectRoot);\n const translationsPath = path.join(projectRoot, config.translationsPath);\n\n // Check if source language directory exists\n const sourceLangPath = path.join(translationsPath, config.sourceLanguage);\n if (!fs.existsSync(sourceLangPath)) {\n console.log(`⚠️ Source language directory not found: ${sourceLangPath}`);\n console.log('Please add translation files to the source language directory.\\n');\n return false;\n }\n\n // Step 2.5: Sync translation structure\n console.log('🔄 Synchronizing translation structure...\\n');\n const syncResult = syncTranslationStructure(translationsPath, config.languages, config.sourceLanguage);\n\n if (syncResult.createdFiles.length > 0) {\n console.log(`✓ Created ${syncResult.createdFiles.length} namespace files\\n`);\n } else {\n console.log('✓ Translation structure is already synchronized\\n');\n }\n\n // Step 3: Validate translations\n console.log('🔍 Validating translations...\\n');\n const validationResult = validateTranslations(projectRoot);\n\n if (validationResult.valid) {\n console.log('\\n✅ All translations are complete!\\n');\n } else {\n const totalMissing = validationResult.missing.length + validationResult.empty.length;\n\n // Step 4: Auto-fill if requested\n if (autoFill) {\n if (!apiKey) {\n const provider = config.provider || 'deepl';\n const envVarName = provider === 'google' ? 'GOOGLE_TRANSLATE_API_KEY' : 'DEEPL_API_KEY';\n console.log('\\n⚠️ Auto-fill requested but no API key provided.');\n console.log(`Set ${envVarName} or pass --api-key to enable auto-fill.\\n`);\n } else {\n console.log(`\\n🤖 Auto-filling ${totalMissing} missing translations...\\n`);\n await autoFillTranslations(projectRoot, {\n apiKey,\n limit,\n language,\n dryRun,\n delayMs: 100\n });\n\n // Re-validate after auto-fill\n if (!dryRun) {\n console.log('\\n🔍 Re-validating after auto-fill...\\n');\n const revalidation = validateTranslations(projectRoot);\n if (revalidation.valid) {\n console.log('\\n✅ All translations are now complete!\\n');\n }\n }\n }\n } else {\n console.log(`\\n💡 Tip: Run with --auto-fill to automatically translate missing keys.\\n`);\n }\n }\n\n // Step 5: Generate types\n if (!skipTypes && !dryRun) {\n console.log('📝 Generating TypeScript types...\\n');\n generateTranslationTypes(projectRoot);\n console.log('\\n✅ Types generated!\\n');\n } else if (skipTypes) {\n console.log('⏭️ Skipping type generation (--skip-types)\\n');\n } else if (dryRun) {\n console.log('⏭️ Skipping type generation (--dry-run)\\n');\n }\n\n // Summary\n console.log('=====');\n console.log('Summary');\n console.log('=====');\n console.log(`Configuration: ${configPath}`);\n console.log(`Translations: ${translationsPath}`);\n console.log(`Languages: ${config.languages.join(', ')}`);\n console.log(`Source language: ${config.sourceLanguage}`);\n\n if (!validationResult.valid && !autoFill) {\n console.log(`\\n⚠️ ${validationResult.missing.length} missing translations`);\n console.log(`⚠️ ${validationResult.empty.length} empty translations`);\n console.log('\\nNext steps:');\n console.log(' 1. Add missing translations manually, or');\n console.log(' 2. Run with --auto-fill to translate automatically');\n } else if (validationResult.valid) {\n console.log('\\n✅ All systems ready!');\n }\n\n console.log('=====\\n');\n\n // Return validation status (true if valid after all operations)\n if (autoFill && !dryRun && apiKey) {\n // Re-validate to get final status\n const finalValidation = validateTranslations(projectRoot);\n return finalValidation.valid;\n }\n\n return validationResult.valid;\n}\n","import * as path from 'node:path';\nimport { DeepLTranslateProvider } from '../utils/deepl-translate-provider.js';\nimport { GoogleTranslateProvider } from '../utils/google-translate-provider.js';\nimport { getTranslationProvider, setTranslationProvider, translateText } from '../utils/translator.js';\nimport { readTranslations, sortKeys, syncTranslationStructure, writeTranslation } from '../utils/utils.js';\nimport { loadConfig } from './init.js';\nimport { getMissingForLanguage } from './validate.js';\n\ninterface AutoFillOptions {\n /** Language to fill translations for */\n language?: string;\n /** Translation API key (for DeepL or Google Translate) */\n apiKey?: string;\n /** Maximum number of translations to process */\n limit?: number;\n /** Delay between translations in milliseconds */\n delayMs?: number;\n /** Dry run - don't actually write translations */\n dryRun?: boolean;\n}\n\n/**\n * Automatically fill empty or missing translations for a language\n */\nexport async function autoFillTranslations(\n projectRoot: string = process.cwd(),\n options: AutoFillOptions = {}\n): Promise<void> {\n const config = loadConfig(projectRoot);\n const translationsPath = path.join(projectRoot, config.translationsPath);\n const { apiKey, limit = 1000, delayMs = 100, dryRun = false } = options;\n\n // Set up the translation provider based on config (only if not already set by user)\n const currentProvider = getTranslationProvider();\n const isDefaultGoogleProvider = currentProvider.constructor.name === 'GoogleTranslateProvider';\n\n // Only set provider if user hasn't already set a custom one\n if (isDefaultGoogleProvider) {\n const provider = config.provider || 'deepl';\n if (provider === 'deepl') {\n setTranslationProvider(new DeepLTranslateProvider());\n } else {\n setTranslationProvider(new GoogleTranslateProvider());\n }\n }\n\n if (!apiKey) {\n const provider = config.provider || 'deepl';\n const envVarName = provider === 'google' ? 'GOOGLE_TRANSLATE_API_KEY' : 'DEEPL_API_KEY';\n throw new Error(`Translation API key is required. Set ${envVarName} or pass --api-key`);\n }\n\n // Determine which languages to process\n const languagesToProcess = options.language\n ? [options.language]\n : config.languages.filter((lang) => lang !== config.sourceLanguage);\n\n // Sync structure before auto-filling to ensure all files exist\n console.log('🔄 Synchronizing translation structure...');\n const syncResult = syncTranslationStructure(translationsPath, config.languages, config.sourceLanguage);\n\n if (syncResult.createdFiles.length > 0) {\n console.log(`Created ${syncResult.createdFiles.length} namespace files\\n`);\n }\n\n console.log('=====');\n console.log('Auto-filling translations');\n console.log('=====');\n console.log(`Languages: ${languagesToProcess.join(', ')}`);\n console.log(`Limit: ${limit}`);\n console.log(`Dry run: ${dryRun}`);\n console.log('=====');\n\n let totalProcessed = 0;\n let totalTranslated = 0;\n\n for (const language of languagesToProcess) {\n if (totalProcessed >= limit) {\n console.log(`\\nReached limit of ${limit} translations`);\n break;\n }\n\n console.log(`\\nProcessing language: ${language}`);\n\n // Get missing and empty translations for this language\n const missing = getMissingForLanguage(projectRoot, language);\n\n if (!missing.length) {\n console.log(' No missing or empty translations');\n continue;\n }\n\n console.log(` Found ${missing.length} translations to fill`);\n\n // Process up to the remaining limit\n const remainingLimit = limit - totalProcessed;\n const itemsToProcess = missing.slice(0, remainingLimit);\n\n for (const item of itemsToProcess) {\n totalProcessed++;\n\n try {\n console.log(` [${totalProcessed}/${limit}] Translating ${item.namespace}.${item.key}`);\n console.log(` EN: \"${item.sourceValue}\"`);\n\n // Translate the text\n const translated = await translateText(\n item.sourceValue,\n language,\n config.sourceLanguage,\n apiKey,\n config.useFallbackLanguages ?? true\n );\n console.log(` ${language.toUpperCase()}: \"${translated}\"`);\n\n if (!dryRun) {\n // Read current translations\n const translations = readTranslations(translationsPath, language);\n\n if (!translations[item.namespace]) {\n translations[item.namespace] = {};\n }\n\n // Update the translation\n translations[item.namespace][item.key] = translated;\n const sorted = sortKeys(translations[item.namespace]);\n\n // Write back\n writeTranslation(translationsPath, language, item.namespace, sorted);\n console.log(' ✓ Saved');\n } else {\n console.log(' ✓ Dry run - not saved');\n }\n\n totalTranslated++;\n\n // Delay to avoid rate limiting\n if (delayMs > 0 && totalProcessed < limit) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n } catch (error) {\n console.error(` ✗ Error: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n }\n\n console.log('\\n=====');\n console.log(`Total processed: ${totalProcessed}`);\n console.log(`Total translated: ${totalTranslated}`);\n if (dryRun) {\n console.log('⚠ Dry run - no changes were saved');\n }\n console.log('=====');\n}\n\n/**\n * Fill translations for a specific namespace and language\n */\nexport async function fillNamespace(\n projectRoot: string,\n language: string,\n namespace: string,\n apiKey: string\n): Promise<void> {\n const config = loadConfig(projectRoot);\n const translationsPath = path.join(projectRoot, config.translationsPath);\n\n // Set up the translation provider based on config (only if not already set by user)\n const currentProvider = getTranslationProvider();\n const isDefaultGoogleProvider = currentProvider.constructor.name === 'GoogleTranslateProvider';\n\n // Only set provider if user hasn't already set a custom one\n if (isDefaultGoogleProvider) {\n const provider = config.provider || 'deepl';\n if (provider === 'deepl') {\n setTranslationProvider(new DeepLTranslateProvider());\n } else {\n setTranslationProvider(new GoogleTranslateProvider());\n }\n }\n\n console.log(`Filling translations for ${language}/${namespace}.json`);\n\n // Read source and target translations\n const sourceTranslations = readTranslations(translationsPath, config.sourceLanguage);\n const targetTranslations = readTranslations(translationsPath, language);\n\n const sourceKeys = sourceTranslations[namespace] || {};\n const targetKeys = targetTranslations[namespace] || {};\n\n let count = 0;\n\n for (const [key, sourceValue] of Object.entries(sourceKeys)) {\n const targetValue = targetKeys[key];\n\n // Skip if already has value\n if (targetValue && targetValue.trim() !== '') {\n continue;\n }\n\n console.log(` Translating ${key}...`);\n const translated = await translateText(\n sourceValue,\n language,\n config.sourceLanguage,\n apiKey,\n config.useFallbackLanguages ?? true\n );\n targetKeys[key] = translated;\n count++;\n\n // Small delay\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n // Write back\n if (count > 0) {\n const sorted = sortKeys(targetKeys);\n writeTranslation(translationsPath, language, namespace, sorted);\n console.log(`✓ Filled ${count} translations`);\n } else {\n console.log('No translations to fill');\n }\n}\n","/**\n * DeepL Translate provider implementation\n * Uses DeepL Translation API v2\n */\n\nimport { logLanguageFallback, resolveLanguageWithFallback } from './language-fallback.js';\nimport type { TranslateOptions, TranslationProvider } from './translator-interface';\n\ninterface DeepLTranslateResponse {\n translations: Array<{\n detected_source_language: string;\n text: string;\n }>;\n}\n\ninterface DeepLErrorResponse {\n message?: string;\n}\n\n/**\n * Preserve {{variable}} interpolations by replacing with placeholders\n * Uses a format that DeepL won't translate (uppercase + underscores + numbers)\n */\nfunction preserveVariables(text: string): {\n textWithPlaceholders: string;\n variableMap: Map<string, string>;\n} {\n const variableMap = new Map<string, string>();\n let placeholderIndex = 0;\n\n const textWithPlaceholders = text.replace(/\\{\\{([^}]+)\\}\\}/g, (match) => {\n // Use XXX prefix (not a real word in any language) to avoid translation\n const placeholder = `XXX_${placeholderIndex}_XXX`;\n variableMap.set(placeholder, match);\n placeholderIndex++;\n return placeholder;\n });\n\n return { textWithPlaceholders, variableMap };\n}\n\n/**\n * Restore original {{variable}} interpolations from placeholders\n */\nfunction restoreVariables(text: string, variableMap: Map<string, string>): string {\n let result = text;\n for (const [placeholder, original] of variableMap) {\n result = result.replace(new RegExp(placeholder, 'g'), original);\n }\n return result;\n}\n\n/**\n * Convert language code format from underscore to hyphen (e.g., 'pt_BR' to 'PT-BR')\n * DeepL uses uppercase language codes with hyphens for regional variants\n */\nfunction normalizeLanguageCode(langCode: string): string {\n return langCode.replace('_', '-').toUpperCase();\n}\n\n/**\n * DeepL Translate provider\n * Implements the TranslationProvider interface\n */\nexport class DeepLTranslateProvider implements TranslationProvider {\n private readonly isFreeApi: boolean;\n\n constructor(isFreeApi = false) {\n this.isFreeApi = isFreeApi;\n }\n\n private getApiEndpoint(): string {\n return this.isFreeApi ? 'https://api-free.deepl.com/v2/translate' : 'https://api.deepl.com/v2/translate';\n }\n\n async translate(options: TranslateOptions): Promise<string> {\n const { text, sourceLang, targetLang, apiKey, useFallbackLanguages = true } = options;\n\n if (!apiKey) {\n throw new Error(\n 'DeepL API key is required. Set DEEPL_API_KEY environment variable or provide apiKey in options.'\n );\n }\n\n // Resolve target language with fallback\n const targetLangResult = resolveLanguageWithFallback(targetLang, 'deepl', useFallbackLanguages);\n logLanguageFallback(targetLangResult, 'deepl');\n\n // Resolve source language with fallback (if provided)\n let resolvedSourceLang: string | undefined;\n if (sourceLang) {\n const sourceLangResult = resolveLanguageWithFallback(sourceLang, 'deepl', useFallbackLanguages);\n logLanguageFallback(sourceLangResult, 'deepl');\n resolvedSourceLang = sourceLangResult.resolvedLanguage;\n }\n\n // Extract and preserve interpolation variables\n const { textWithPlaceholders, variableMap } = preserveVariables(text);\n\n // Prepare request body\n const body = {\n text: [textWithPlaceholders],\n target_lang: normalizeLanguageCode(targetLangResult.resolvedLanguage),\n ...(resolvedSourceLang && { source_lang: normalizeLanguageCode(resolvedSourceLang) })\n };\n\n const response = await fetch(this.getApiEndpoint(), {\n method: 'POST',\n headers: {\n Authorization: `DeepL-Auth-Key ${apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(body)\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as DeepLErrorResponse;\n throw new Error(`DeepL API error: ${errorData.message || response.statusText} (${response.status})`);\n }\n\n const data = (await response.json()) as DeepLTranslateResponse;\n\n if (!data.translations || data.translations.length === 0) {\n throw new Error('DeepL API returned no translations');\n }\n\n const translatedText = data.translations[0].text;\n\n // Restore original interpolation variables\n return restoreVariables(translatedText, variableMap);\n }\n\n async translateBatch(\n texts: string[],\n sourceLang: string,\n targetLang: string,\n apiKey?: string,\n delayMs = 100\n ): Promise<string[]> {\n const results: string[] = [];\n\n for (const text of texts) {\n const translated = await this.translate({\n text,\n sourceLang,\n targetLang,\n apiKey\n });\n results.push(translated);\n\n // Add delay to avoid rate limiting\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n return results;\n }\n\n async validateConfig(): Promise<boolean> {\n const apiKey = process.env.DEEPL_API_KEY;\n return !!apiKey;\n }\n}\n","import * as path from 'node:path';\nimport type { MissingTranslation, ValidationResult } from '../core/types.js';\nimport { getNamespaces, readTranslations, syncTranslationStructure } from '../utils/utils.js';\nimport { loadConfig } from './init.js';\n\n/**\n * Validate all translations against the source language\n * Checks for missing keys and empty values\n */\nexport function validateTranslations(projectRoot: string = process.cwd()): ValidationResult {\n const config = loadConfig(projectRoot);\n const translationsPath = path.join(projectRoot, config.translationsPath);\n const sourceLanguage = config.sourceLanguage;\n\n const missing: MissingTranslation[] = [];\n const empty: MissingTranslation[] = [];\n\n // Read source translations\n const sourceTranslations = readTranslations(translationsPath, sourceLanguage);\n const sourceNamespaces = getNamespaces(translationsPath, sourceLanguage);\n\n // CRITICAL: Use config languages instead of filesystem languages\n // This ensures we validate ALL configured languages, not just ones on disk\n const languages = config.languages.filter((lang) => lang !== sourceLanguage);\n\n // Sync structure before validation to ensure all files exist\n const syncResult = syncTranslationStructure(translationsPath, config.languages, sourceLanguage);\n\n if (syncResult.createdFiles.length > 0) {\n console.log(`Created ${syncResult.createdFiles.length} missing namespace files during sync`);\n }\n\n console.log('=====');\n console.log('Validating translations');\n console.log('=====');\n console.log(`Source language: ${sourceLanguage}`);\n console.log(`Target languages: ${languages.join(', ')}`);\n console.log(`Namespaces: ${sourceNamespaces.join(', ')}`);\n console.log('=====');\n\n // Validate each language\n for (const language of languages) {\n const targetTranslations = readTranslations(translationsPath, language);\n\n // Check each namespace\n for (const namespace of sourceNamespaces) {\n const sourceKeys = sourceTranslations[namespace] || {};\n const targetKeys = targetTranslations[namespace] || {};\n\n // Check for missing or empty translations\n for (const [key, sourceValue] of Object.entries(sourceKeys)) {\n const targetValue = targetKeys[key];\n\n // Missing key in target language\n if (targetValue === undefined) {\n missing.push({\n namespace,\n key,\n language,\n sourceValue\n });\n }\n // Empty value in target language\n else if (typeof targetValue === 'string' && targetValue.trim() === '') {\n empty.push({\n namespace,\n key,\n language,\n sourceValue\n });\n }\n }\n }\n }\n\n const valid = !missing.length && !empty.length;\n\n if (valid) {\n console.log('✓ All translations are valid!');\n } else {\n if (missing.length > 0) {\n console.log(`\\n⚠ Found ${missing.length} missing translations:`);\n for (const item of missing.slice(0, 10)) {\n console.log(` ${item.language}/${item.namespace}.json -> ${item.key}`);\n }\n if (missing.length > 10) {\n console.log(` ... and ${missing.length - 10} more`);\n }\n }\n\n if (empty.length > 0) {\n console.log(`\\n⚠ Found ${empty.length} empty translations:`);\n for (const item of empty.slice(0, 10)) {\n console.log(` ${item.language}/${item.namespace}.json -> ${item.key}`);\n }\n if (empty.length > 10) {\n console.log(` ... and ${empty.length - 10} more`);\n }\n }\n }\n\n console.log('=====');\n\n return { valid, missing, empty };\n}\n\n/**\n * Get all missing or empty translations for a specific language\n */\nexport function getMissingForLanguage(\n projectRoot: string,\n language: string\n): Array<MissingTranslation & { type: 'missing' | 'empty' }> {\n const result = validateTranslations(projectRoot);\n const items = [\n ...result.missing.filter((m) => m.language === language).map((m) => ({ ...m, type: 'missing' as const })),\n ...result.empty.filter((e) => e.language === language).map((e) => ({ ...e, type: 'empty' as const }))\n ];\n\n return items;\n}\n"],"mappings":";;;;;;;;;;;;AACA,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAF9B;AAAA;AAAA;AAAA;AAAA;;;ACmPO,SAAS,gBAAgB,MAAyC;AACvE,SAAO,oBAAoB,SAAS,IAAyB;AAC/D;AAiCO,SAAS,kBAAkB,WAGhC;AACA,QAAM,UAAU,UAAU,OAAO,CAAC,SAAS,CAAC,gBAAgB,IAAI,CAAC;AACjE,SAAO;AAAA,IACL,OAAO,CAAC,QAAQ;AAAA,IAChB;AAAA,EACF;AACF;AA/RA,IAUa,iBAgDA,kBAqHA;AA/Kb;AAAA;AAAA;AAAA;AAmUA;AAzTO,IAAM,kBAAkB;AAAA,MAC7B;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,IACF;AAOO,IAAM,mBAAmB;AAAA,MAC9B;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;A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","names":["path","fs","path","validation","fs","path","fs","path","confirm","input","select","path","fs","path","detectExistingTranslations","fs","path","path","preserveVariables","restoreVariables","path","confirm","select","input","value","generateTranslationTypes"]}