poly-lexis 0.2.0 → 0.2.1

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,12 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  var __defProp = Object.defineProperty;
3
3
  var __getOwnPropNames = Object.getOwnPropertyNames;
4
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
5
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
6
- }) : x)(function(x) {
7
- if (typeof require !== "undefined") return require.apply(this, arguments);
8
- throw Error('Dynamic require of "' + x + '" is not supported');
9
- });
10
4
  var __esm = (fn, res) => function __init() {
11
5
  return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
12
6
  };
@@ -546,7 +540,7 @@ __export(generate_types_exports, {
546
540
  generateTranslationTypes: () => generateTranslationTypes
547
541
  });
548
542
  import { execSync } from "child_process";
549
- import * as fs3 from "fs";
543
+ import * as fs4 from "fs";
550
544
  import * as path8 from "path";
551
545
  function generateTranslationTypes(projectRoot = process.cwd()) {
552
546
  console.log("=====");
@@ -558,7 +552,7 @@ function generateTranslationTypes(projectRoot = process.cwd()) {
558
552
  const sourceLanguage = config.sourceLanguage;
559
553
  const outputFilePath = path8.join(projectRoot, config.typesOutputPath);
560
554
  const dirPath = path8.join(translationsPath, sourceLanguage);
561
- if (!fs3.existsSync(dirPath)) {
555
+ if (!fs4.existsSync(dirPath)) {
562
556
  throw new Error(`Source language directory not found: ${dirPath}`);
563
557
  }
564
558
  const namespaces = getNamespaces(translationsPath, sourceLanguage);
@@ -572,11 +566,11 @@ function generateTranslationTypes(projectRoot = process.cwd()) {
572
566
  allKeys = allKeys.concat(keys);
573
567
  }
574
568
  const outputDir = path8.dirname(outputFilePath);
575
- if (!fs3.existsSync(outputDir)) {
576
- fs3.mkdirSync(outputDir, { recursive: true });
569
+ if (!fs4.existsSync(outputDir)) {
570
+ fs4.mkdirSync(outputDir, { recursive: true });
577
571
  }
578
572
  const typeString = typeTemplate(allKeys, namespaces);
579
- fs3.writeFileSync(outputFilePath, typeString, "utf8");
573
+ fs4.writeFileSync(outputFilePath, typeString, "utf8");
580
574
  console.log(`Generated types with ${allKeys.length} keys and ${namespaces.length} namespaces`);
581
575
  console.log(`Output: ${outputFilePath}`);
582
576
  try {
@@ -610,7 +604,7 @@ var init_generate_types = __esm({
610
604
  // src/cli/translations.ts
611
605
  init_esm_shims();
612
606
  import "dotenv/config";
613
- import * as fs5 from "fs";
607
+ import * as fs6 from "fs";
614
608
  import * as path10 from "path";
615
609
  import { parseArgs } from "util";
616
610
  import { confirm as confirm2, input as input2, select } from "@inquirer/prompts";
@@ -792,12 +786,13 @@ init_esm_shims();
792
786
  init_schema();
793
787
  init_types();
794
788
  init_init();
789
+ import * as fs3 from "fs";
795
790
  import * as path5 from "path";
796
791
  import { checkbox, confirm, input } from "@inquirer/prompts";
797
792
  async function initTranslationsInteractive(projectRoot = process.cwd()) {
798
793
  console.log("\n\u{1F30D} Translation System Setup\n");
799
794
  const configPath = path5.join(projectRoot, ".translationsrc.json");
800
- const alreadyExists = __require("fs").existsSync(configPath);
795
+ const alreadyExists = fs3.existsSync(configPath);
801
796
  if (alreadyExists) {
802
797
  console.log("\u26A0\uFE0F Configuration file already exists at .translationsrc.json\n");
803
798
  const shouldOverwrite = await confirm({
@@ -947,7 +942,7 @@ function getLanguageName(code) {
947
942
 
948
943
  // src/translations/cli/manage.ts
949
944
  init_esm_shims();
950
- import * as fs4 from "fs";
945
+ import * as fs5 from "fs";
951
946
  import * as path9 from "path";
952
947
 
953
948
  // src/translations/cli/auto-fill.ts
@@ -1119,7 +1114,7 @@ async function manageTranslations(projectRoot = process.cwd(), options = {}) {
1119
1114
  console.log("Translation Management");
1120
1115
  console.log("=====");
1121
1116
  const configPath = path9.join(projectRoot, ".translationsrc.json");
1122
- const isInitialized = fs4.existsSync(configPath);
1117
+ const isInitialized = fs5.existsSync(configPath);
1123
1118
  if (!isInitialized) {
1124
1119
  console.log("\u{1F4C1} No translation configuration found. Initializing...\n");
1125
1120
  initTranslations(projectRoot);
@@ -1130,7 +1125,7 @@ async function manageTranslations(projectRoot = process.cwd(), options = {}) {
1130
1125
  const config = loadConfig(projectRoot);
1131
1126
  const translationsPath = path9.join(projectRoot, config.translationsPath);
1132
1127
  const sourceLangPath = path9.join(translationsPath, config.sourceLanguage);
1133
- if (!fs4.existsSync(sourceLangPath)) {
1128
+ if (!fs5.existsSync(sourceLangPath)) {
1134
1129
  console.log(`\u26A0\uFE0F Source language directory not found: ${sourceLangPath}`);
1135
1130
  console.log("Please add translation files to the source language directory.\n");
1136
1131
  return;
@@ -1314,7 +1309,7 @@ if (command === "add") {
1314
1309
  try {
1315
1310
  console.log("\n\u2728 Add a new translation key\n");
1316
1311
  const configPath = path10.join(process.cwd(), ".translationsrc.json");
1317
- const isInitialized = fs5.existsSync(configPath);
1312
+ const isInitialized = fs6.existsSync(configPath);
1318
1313
  if (!isInitialized) {
1319
1314
  console.log("\u26A0\uFE0F Translation structure not initialized.");
1320
1315
  const shouldInit = await confirm2({
@@ -1466,7 +1461,7 @@ if (command === "add") {
1466
1461
  (async () => {
1467
1462
  try {
1468
1463
  const configPath = path10.join(process.cwd(), ".translationsrc.json");
1469
- const isInitialized = fs5.existsSync(configPath);
1464
+ const isInitialized = fs6.existsSync(configPath);
1470
1465
  console.log("\n\u{1F30D} Translation Management\n");
1471
1466
  const action = await select({
1472
1467
  message: "What would you like to do?",
@@ -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 * Supported language codes for translations\n * Based on Google Translate API supported languages (ISO 639-1 and regional variants)\n * Complete list of all languages supported by Google Cloud Translation API\n */\nexport const SUPPORTED_LANGUAGES = [\n 'af', // Afrikaans\n 'sq', // Albanian\n 'am', // Amharic\n 'ar', // Arabic\n 'hy', // Armenian\n 'as', // Assamese\n 'ay', // Aymara\n 'az', // Azerbaijani\n 'bm', // Bambara\n 'eu', // Basque\n 'be', // Belarusian\n 'bn', // Bengali\n 'bho', // Bhojpuri\n 'bs', // Bosnian\n 'bg', // Bulgarian\n 'ca', // Catalan\n 'ceb', // Cebuano\n 'ny', // Chichewa\n 'zh', // Chinese (Simplified) - Google uses 'zh' or 'zh-CN'\n 'zh_cn', // Chinese (Simplified) - alternative format\n 'zh_tw', // Chinese (Traditional)\n 'co', // Corsican\n 'hr', // Croatian\n 'cs', // Czech\n 'da', // Danish\n 'dv', // Dhivehi\n 'doi', // Dogri\n 'nl', // Dutch\n 'en', // English\n 'eo', // Esperanto\n 'et', // Estonian\n 'ee', // Ewe\n 'tl', // Filipino (Tagalog)\n 'fi', // Finnish\n 'fr', // French\n 'gl', // Galician\n 'ka', // Georgian\n 'de', // German\n 'el', // Greek\n 'gn', // Guarani\n 'gu', // Gujarati\n 'ht', // Haitian Creole\n 'ha', // Hausa\n 'haw', // Hawaiian\n 'iw', // Hebrew (legacy code, 'he' is preferred)\n 'he', // Hebrew\n 'hi', // Hindi\n 'hmn', // Hmong\n 'hu', // Hungarian\n 'is', // Icelandic\n 'ig', // Igbo\n 'ilo', // Ilocano\n 'id', // Indonesian\n 'ga', // Irish\n 'it', // Italian\n 'ja', // Japanese\n 'jw', // Javanese\n 'kn', // Kannada\n 'kk', // Kazakh\n 'km', // Khmer\n 'rw', // Kinyarwanda\n 'gom', // Konkani\n 'ko', // Korean\n 'kri', // Krio\n 'ku', // Kurdish (Kurmanji)\n 'ckb', // Kurdish (Sorani)\n 'ky', // Kyrgyz\n 'lo', // Lao\n 'la', // Latin\n 'lv', // Latvian\n 'ln', // Lingala\n 'lt', // Lithuanian\n 'lg', // Luganda\n 'lb', // Luxembourgish\n 'mk', // Macedonian\n 'mai', // Maithili\n 'mg', // Malagasy\n 'ms', // Malay\n 'ml', // Malayalam\n 'mt', // Maltese\n 'mi', // Maori\n 'mr', // Marathi\n 'mni', // Meiteilon (Manipuri)\n 'lus', // Mizo\n 'mn', // Mongolian\n 'my', // Myanmar (Burmese)\n 'ne', // Nepali\n 'no', // Norwegian\n 'or', // Odia\n 'om', // Oromo\n 'ps', // Pashto\n 'fa', // Persian\n 'pl', // Polish\n 'pt', // Portuguese\n 'pt_br', // Portuguese (Brazil)\n 'pa', // Punjabi\n 'qu', // Quechua\n 'ro', // Romanian\n 'ru', // Russian\n 'sm', // Samoan\n 'sa', // Sanskrit\n 'gd', // Scottish Gaelic\n 'sr', // Serbian\n 'st', // Sesotho\n 'sn', // Shona\n 'sd', // Sindhi\n 'si', // Sinhala\n 'sk', // Slovak\n 'sl', // Slovenian\n 'so', // Somali\n 'es', // Spanish\n 'su', // Sundanese\n 'sw', // Swahili\n 'sv', // Swedish\n 'tg', // Tajik\n 'ta', // Tamil\n 'tt', // Tatar\n 'te', // Telugu\n 'th', // Thai\n 'ti', // Tigrinya\n 'ts', // Tsonga\n 'tr', // Turkish\n 'tk', // Turkmen\n 'ak', // Twi\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\nexport type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];\n\n/**\n * JSON Schema for .translationsrc.json\n */\nexport const TRANSLATION_CONFIG_SCHEMA = {\n $schema: 'http://json-schema.org/draft-07/schema#',\n title: 'Translation Configuration',\n description: 'Configuration for the translation management system',\n type: 'object',\n properties: {\n translationsPath: {\n type: 'string',\n description: 'Path to the translations directory relative to project root',\n default: 'public/static/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 },\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 }\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 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","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 }).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 */\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 const placeholder = `__PLACEHOLDER_${placeholderIndex}__`;\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 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 = require('node: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 */\nexport async function manageTranslations(\n projectRoot: string = process.cwd(),\n options: ManageTranslationsOptions = {}\n): Promise<void> {\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;\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","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;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;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","names":["path","fs","path","validation","fs","path","fs","path","confirm","input","path","path","detectExistingTranslations","fs","path","path","path","confirm","input","value","generateTranslationTypes"]}
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 * Supported language codes for translations\n * Based on Google Translate API supported languages (ISO 639-1 and regional variants)\n * Complete list of all languages supported by Google Cloud Translation API\n */\nexport const SUPPORTED_LANGUAGES = [\n 'af', // Afrikaans\n 'sq', // Albanian\n 'am', // Amharic\n 'ar', // Arabic\n 'hy', // Armenian\n 'as', // Assamese\n 'ay', // Aymara\n 'az', // Azerbaijani\n 'bm', // Bambara\n 'eu', // Basque\n 'be', // Belarusian\n 'bn', // Bengali\n 'bho', // Bhojpuri\n 'bs', // Bosnian\n 'bg', // Bulgarian\n 'ca', // Catalan\n 'ceb', // Cebuano\n 'ny', // Chichewa\n 'zh', // Chinese (Simplified) - Google uses 'zh' or 'zh-CN'\n 'zh_cn', // Chinese (Simplified) - alternative format\n 'zh_tw', // Chinese (Traditional)\n 'co', // Corsican\n 'hr', // Croatian\n 'cs', // Czech\n 'da', // Danish\n 'dv', // Dhivehi\n 'doi', // Dogri\n 'nl', // Dutch\n 'en', // English\n 'eo', // Esperanto\n 'et', // Estonian\n 'ee', // Ewe\n 'tl', // Filipino (Tagalog)\n 'fi', // Finnish\n 'fr', // French\n 'gl', // Galician\n 'ka', // Georgian\n 'de', // German\n 'el', // Greek\n 'gn', // Guarani\n 'gu', // Gujarati\n 'ht', // Haitian Creole\n 'ha', // Hausa\n 'haw', // Hawaiian\n 'iw', // Hebrew (legacy code, 'he' is preferred)\n 'he', // Hebrew\n 'hi', // Hindi\n 'hmn', // Hmong\n 'hu', // Hungarian\n 'is', // Icelandic\n 'ig', // Igbo\n 'ilo', // Ilocano\n 'id', // Indonesian\n 'ga', // Irish\n 'it', // Italian\n 'ja', // Japanese\n 'jw', // Javanese\n 'kn', // Kannada\n 'kk', // Kazakh\n 'km', // Khmer\n 'rw', // Kinyarwanda\n 'gom', // Konkani\n 'ko', // Korean\n 'kri', // Krio\n 'ku', // Kurdish (Kurmanji)\n 'ckb', // Kurdish (Sorani)\n 'ky', // Kyrgyz\n 'lo', // Lao\n 'la', // Latin\n 'lv', // Latvian\n 'ln', // Lingala\n 'lt', // Lithuanian\n 'lg', // Luganda\n 'lb', // Luxembourgish\n 'mk', // Macedonian\n 'mai', // Maithili\n 'mg', // Malagasy\n 'ms', // Malay\n 'ml', // Malayalam\n 'mt', // Maltese\n 'mi', // Maori\n 'mr', // Marathi\n 'mni', // Meiteilon (Manipuri)\n 'lus', // Mizo\n 'mn', // Mongolian\n 'my', // Myanmar (Burmese)\n 'ne', // Nepali\n 'no', // Norwegian\n 'or', // Odia\n 'om', // Oromo\n 'ps', // Pashto\n 'fa', // Persian\n 'pl', // Polish\n 'pt', // Portuguese\n 'pt_br', // Portuguese (Brazil)\n 'pa', // Punjabi\n 'qu', // Quechua\n 'ro', // Romanian\n 'ru', // Russian\n 'sm', // Samoan\n 'sa', // Sanskrit\n 'gd', // Scottish Gaelic\n 'sr', // Serbian\n 'st', // Sesotho\n 'sn', // Shona\n 'sd', // Sindhi\n 'si', // Sinhala\n 'sk', // Slovak\n 'sl', // Slovenian\n 'so', // Somali\n 'es', // Spanish\n 'su', // Sundanese\n 'sw', // Swahili\n 'sv', // Swedish\n 'tg', // Tajik\n 'ta', // Tamil\n 'tt', // Tatar\n 'te', // Telugu\n 'th', // Thai\n 'ti', // Tigrinya\n 'ts', // Tsonga\n 'tr', // Turkish\n 'tk', // Turkmen\n 'ak', // Twi\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\nexport type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];\n\n/**\n * JSON Schema for .translationsrc.json\n */\nexport const TRANSLATION_CONFIG_SCHEMA = {\n $schema: 'http://json-schema.org/draft-07/schema#',\n title: 'Translation Configuration',\n description: 'Configuration for the translation management system',\n type: 'object',\n properties: {\n translationsPath: {\n type: 'string',\n description: 'Path to the translations directory relative to project root',\n default: 'public/static/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 },\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 }\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 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","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 }).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 */\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 const placeholder = `__PLACEHOLDER_${placeholderIndex}__`;\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 */\nexport async function manageTranslations(\n projectRoot: string = process.cwd(),\n options: ManageTranslationsOptions = {}\n): Promise<void> {\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;\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","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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AAA,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","path","fs","path","detectExistingTranslations","fs","path","path","path","confirm","input","value","generateTranslationTypes"]}
package/dist/index.js CHANGED
@@ -1,11 +1,5 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __getOwnPropNames = Object.getOwnPropertyNames;
3
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
4
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
5
- }) : x)(function(x) {
6
- if (typeof require !== "undefined") return require.apply(this, arguments);
7
- throw Error('Dynamic require of "' + x + '" is not supported');
8
- });
9
3
  var __esm = (fn, res) => function __init() {
10
4
  return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
11
5
  };
@@ -1013,12 +1007,13 @@ init_init();
1013
1007
  init_schema();
1014
1008
  init_types();
1015
1009
  init_init();
1010
+ import * as fs4 from "fs";
1016
1011
  import * as path7 from "path";
1017
1012
  import { checkbox, confirm, input } from "@inquirer/prompts";
1018
1013
  async function initTranslationsInteractive(projectRoot = process.cwd()) {
1019
1014
  console.log("\n\u{1F30D} Translation System Setup\n");
1020
1015
  const configPath = path7.join(projectRoot, ".translationsrc.json");
1021
- const alreadyExists = __require("fs").existsSync(configPath);
1016
+ const alreadyExists = fs4.existsSync(configPath);
1022
1017
  if (alreadyExists) {
1023
1018
  console.log("\u26A0\uFE0F Configuration file already exists at .translationsrc.json\n");
1024
1019
  const shouldOverwrite = await confirm({
@@ -1167,7 +1162,7 @@ function getLanguageName(code) {
1167
1162
  }
1168
1163
 
1169
1164
  // src/translations/cli/manage.ts
1170
- import * as fs4 from "fs";
1165
+ import * as fs5 from "fs";
1171
1166
  import * as path8 from "path";
1172
1167
  init_init();
1173
1168
  async function manageTranslations(projectRoot = process.cwd(), options = {}) {
@@ -1176,7 +1171,7 @@ async function manageTranslations(projectRoot = process.cwd(), options = {}) {
1176
1171
  console.log("Translation Management");
1177
1172
  console.log("=====");
1178
1173
  const configPath = path8.join(projectRoot, ".translationsrc.json");
1179
- const isInitialized = fs4.existsSync(configPath);
1174
+ const isInitialized = fs5.existsSync(configPath);
1180
1175
  if (!isInitialized) {
1181
1176
  console.log("\u{1F4C1} No translation configuration found. Initializing...\n");
1182
1177
  initTranslations(projectRoot);
@@ -1187,7 +1182,7 @@ async function manageTranslations(projectRoot = process.cwd(), options = {}) {
1187
1182
  const config = loadConfig(projectRoot);
1188
1183
  const translationsPath = path8.join(projectRoot, config.translationsPath);
1189
1184
  const sourceLangPath = path8.join(translationsPath, config.sourceLanguage);
1190
- if (!fs4.existsSync(sourceLangPath)) {
1185
+ if (!fs5.existsSync(sourceLangPath)) {
1191
1186
  console.log(`\u26A0\uFE0F Source language directory not found: ${sourceLangPath}`);
1192
1187
  console.log("Please add translation files to the source language directory.\n");
1193
1188
  return;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/translations/utils/utils.ts","../src/translations/core/schema.ts","../src/translations/core/types.ts","../src/translations/cli/init.ts","../src/translations/cli/add-key.ts","../src/translations/utils/google-translate-provider.ts","../src/translations/utils/translator.ts","../src/translations/cli/auto-fill.ts","../src/translations/cli/validate.ts","../src/translations/cli/generate-types.ts","../src/translations/index.ts","../src/translations/cli/init-interactive.ts","../src/translations/cli/manage.ts"],"sourcesContent":["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 * Supported language codes for translations\n * Based on Google Translate API supported languages (ISO 639-1 and regional variants)\n * Complete list of all languages supported by Google Cloud Translation API\n */\nexport const SUPPORTED_LANGUAGES = [\n 'af', // Afrikaans\n 'sq', // Albanian\n 'am', // Amharic\n 'ar', // Arabic\n 'hy', // Armenian\n 'as', // Assamese\n 'ay', // Aymara\n 'az', // Azerbaijani\n 'bm', // Bambara\n 'eu', // Basque\n 'be', // Belarusian\n 'bn', // Bengali\n 'bho', // Bhojpuri\n 'bs', // Bosnian\n 'bg', // Bulgarian\n 'ca', // Catalan\n 'ceb', // Cebuano\n 'ny', // Chichewa\n 'zh', // Chinese (Simplified) - Google uses 'zh' or 'zh-CN'\n 'zh_cn', // Chinese (Simplified) - alternative format\n 'zh_tw', // Chinese (Traditional)\n 'co', // Corsican\n 'hr', // Croatian\n 'cs', // Czech\n 'da', // Danish\n 'dv', // Dhivehi\n 'doi', // Dogri\n 'nl', // Dutch\n 'en', // English\n 'eo', // Esperanto\n 'et', // Estonian\n 'ee', // Ewe\n 'tl', // Filipino (Tagalog)\n 'fi', // Finnish\n 'fr', // French\n 'gl', // Galician\n 'ka', // Georgian\n 'de', // German\n 'el', // Greek\n 'gn', // Guarani\n 'gu', // Gujarati\n 'ht', // Haitian Creole\n 'ha', // Hausa\n 'haw', // Hawaiian\n 'iw', // Hebrew (legacy code, 'he' is preferred)\n 'he', // Hebrew\n 'hi', // Hindi\n 'hmn', // Hmong\n 'hu', // Hungarian\n 'is', // Icelandic\n 'ig', // Igbo\n 'ilo', // Ilocano\n 'id', // Indonesian\n 'ga', // Irish\n 'it', // Italian\n 'ja', // Japanese\n 'jw', // Javanese\n 'kn', // Kannada\n 'kk', // Kazakh\n 'km', // Khmer\n 'rw', // Kinyarwanda\n 'gom', // Konkani\n 'ko', // Korean\n 'kri', // Krio\n 'ku', // Kurdish (Kurmanji)\n 'ckb', // Kurdish (Sorani)\n 'ky', // Kyrgyz\n 'lo', // Lao\n 'la', // Latin\n 'lv', // Latvian\n 'ln', // Lingala\n 'lt', // Lithuanian\n 'lg', // Luganda\n 'lb', // Luxembourgish\n 'mk', // Macedonian\n 'mai', // Maithili\n 'mg', // Malagasy\n 'ms', // Malay\n 'ml', // Malayalam\n 'mt', // Maltese\n 'mi', // Maori\n 'mr', // Marathi\n 'mni', // Meiteilon (Manipuri)\n 'lus', // Mizo\n 'mn', // Mongolian\n 'my', // Myanmar (Burmese)\n 'ne', // Nepali\n 'no', // Norwegian\n 'or', // Odia\n 'om', // Oromo\n 'ps', // Pashto\n 'fa', // Persian\n 'pl', // Polish\n 'pt', // Portuguese\n 'pt_br', // Portuguese (Brazil)\n 'pa', // Punjabi\n 'qu', // Quechua\n 'ro', // Romanian\n 'ru', // Russian\n 'sm', // Samoan\n 'sa', // Sanskrit\n 'gd', // Scottish Gaelic\n 'sr', // Serbian\n 'st', // Sesotho\n 'sn', // Shona\n 'sd', // Sindhi\n 'si', // Sinhala\n 'sk', // Slovak\n 'sl', // Slovenian\n 'so', // Somali\n 'es', // Spanish\n 'su', // Sundanese\n 'sw', // Swahili\n 'sv', // Swedish\n 'tg', // Tajik\n 'ta', // Tamil\n 'tt', // Tatar\n 'te', // Telugu\n 'th', // Thai\n 'ti', // Tigrinya\n 'ts', // Tsonga\n 'tr', // Turkish\n 'tk', // Turkmen\n 'ak', // Twi\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\nexport type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];\n\n/**\n * JSON Schema for .translationsrc.json\n */\nexport const TRANSLATION_CONFIG_SCHEMA = {\n $schema: 'http://json-schema.org/draft-07/schema#',\n title: 'Translation Configuration',\n description: 'Configuration for the translation management system',\n type: 'object',\n properties: {\n translationsPath: {\n type: 'string',\n description: 'Path to the translations directory relative to project root',\n default: 'public/static/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 },\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 }\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 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","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 * 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 * 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 */\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 const placeholder = `__PLACEHOLDER_${placeholderIndex}__`;\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","/**\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","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","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","/**\n * Translation management utilities\n *\n * This module provides a complete solution for managing i18n translations:\n * - Initialize translation structure\n * - Add and translate new keys\n * - Validate translations\n * - Auto-fill missing translations\n * - Generate TypeScript types\n */\n\n// CLI commands\nexport * from './cli/add-key.js';\nexport * from './cli/auto-fill.js';\nexport * from './cli/generate-types.js';\nexport * from './cli/init.js';\nexport * from './cli/init-interactive.js';\nexport * from './cli/manage.js';\nexport * from './cli/validate.js';\n\n// Core types and schemas\nexport * from './core/schema.js';\nexport * from './core/types.js';\nexport * from './utils/google-translate-provider.js';\n// Utilities\nexport * from './utils/translator.js';\nexport * from './utils/translator-interface.js';\nexport * from './utils/utils.js';\n","import * 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 = require('node: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 */\nexport async function manageTranslations(\n projectRoot: string = process.cwd(),\n options: ManageTranslationsOptions = {}\n): Promise<void> {\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;\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"],"mappings":";;;;;;;;;;;;;;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AAMf,SAAS,iBAAiB,kBAA0B,UAAoC;AAC7F,QAAM,WAAgB,UAAK,kBAAkB,QAAQ;AAErD,MAAI,CAAI,cAAW,QAAQ,GAAG;AAC5B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAW,eAAY,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC;AACxE,QAAM,eAAiC,CAAC;AAExC,aAAW,QAAQ,OAAO;AACxB,UAAM,YAAiB,cAAS,MAAM,OAAO;AAC7C,UAAM,WAAgB,UAAK,UAAU,IAAI;AACzC,UAAM,UAAa,gBAAa,UAAU,OAAO;AACjD,iBAAa,SAAS,IAAI,KAAK,MAAM,OAAO;AAAA,EAC9C;AAEA,SAAO;AACT;AAKO,SAAS,iBACd,kBACA,UACA,WACA,cACM;AACN,QAAM,WAAgB,UAAK,kBAAkB,QAAQ;AAErD,MAAI,CAAI,cAAW,QAAQ,GAAG;AAC5B,IAAG,aAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C;AAEA,QAAM,WAAgB,UAAK,UAAU,GAAG,SAAS,OAAO;AACxD,EAAG,iBAAc,UAAU,GAAG,KAAK,UAAU,cAAc,MAAM,CAAC,CAAC;AAAA,GAAM,OAAO;AAClF;AAKO,SAAS,sBAAsB,kBAAoC;AACxE,MAAI,CAAI,cAAW,gBAAgB,GAAG;AACpC,WAAO,CAAC;AAAA,EACV;AAEA,SACG,eAAY,kBAAkB,EAAE,eAAe,KAAK,CAAC,EACrD,OAAO,CAAC,WAAW,OAAO,YAAY,CAAC,EACvC,IAAI,CAAC,WAAW,OAAO,IAAI;AAChC;AAKO,SAAS,cAAc,kBAA0B,UAA4B;AAClF,QAAM,WAAgB,UAAK,kBAAkB,QAAQ;AAErD,MAAI,CAAI,cAAW,QAAQ,GAAG;AAC5B,WAAO,CAAC;AAAA,EACV;AAEA,SACG,eAAY,QAAQ,EACpB,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,EACjC,IAAI,CAAC,MAAW,cAAS,GAAG,OAAO,CAAC;AACzC;AAKO,SAAS,iBAAiB,MAAuB;AACtD,SAAO,iBAAiB,KAAK,IAAI;AACnC;AAKO,SAAS,iBAAiB,MAAwB;AACvD,QAAM,UAAU,KAAK,MAAM,kBAAkB;AAC7C,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,SAAO,QAAQ,IAAI,CAAC,UAAU,MAAM,QAAQ,cAAc,EAAE,EAAE,KAAK,CAAC;AACtE;AAKO,SAAS,kBAAkB,YAAoB,gBAAiC;AACrF,QAAM,aAAa,iBAAiB,UAAU,EAAE,KAAK;AACrD,QAAM,iBAAiB,iBAAiB,cAAc,EAAE,KAAK;AAE7D,MAAI,WAAW,WAAW,eAAe,QAAQ;AAC/C,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,MAAM,CAAC,GAAG,MAAM,MAAM,eAAe,CAAC,CAAC;AAC3D;AAKO,SAAS,SAA4C,KAAW;AACrE,QAAM,SAAS,CAAC;AAChB,QAAM,OAAO,OAAO,KAAK,GAAG,EAAE,KAAK;AACnC,aAAW,OAAO,MAAM;AACtB,WAAO,GAAc,IAAI,IAAI,GAAc;AAAA,EAC7C;AACA,SAAO;AACT;AAKO,SAAS,4BAA4B,kBAA0B,WAA2B;AAC/F,MAAI,CAAI,cAAW,gBAAgB,GAAG;AACpC,IAAG,aAAU,kBAAkB,EAAE,WAAW,KAAK,CAAC;AAAA,EACpD;AAEA,aAAW,QAAQ,WAAW;AAC5B,UAAM,WAAgB,UAAK,kBAAkB,IAAI;AACjD,QAAI,CAAI,cAAW,QAAQ,GAAG;AAC5B,MAAG,aAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,IAC5C;AAAA,EACF;AACF;AApIA;AAAA;AAAA;AAAA;AAAA;;;AC2LO,SAAS,gBAAgB,MAAyC;AACvE,SAAO,oBAAoB,SAAS,IAAyB;AAC/D;AAKO,SAAS,kBAAkB,WAGhC;AACA,QAAM,UAAU,UAAU,OAAO,CAAC,SAAS,CAAC,gBAAgB,IAAI,CAAC;AACjE,SAAO;AAAA,IACL,OAAO,QAAQ,WAAW;AAAA,IAC1B;AAAA,EACF;AACF;AA3MA,IAKa,qBA8IA;AAnJb;AAAA;AAAA;AAKO,IAAM,sBAAsB;AAAA,MACjC;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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","names":["fs","path","validation","path","path","path","fs","path","path","detectExistingTranslations","fs","path"]}
1
+ {"version":3,"sources":["../src/translations/utils/utils.ts","../src/translations/core/schema.ts","../src/translations/core/types.ts","../src/translations/cli/init.ts","../src/translations/cli/add-key.ts","../src/translations/utils/google-translate-provider.ts","../src/translations/utils/translator.ts","../src/translations/cli/auto-fill.ts","../src/translations/cli/validate.ts","../src/translations/cli/generate-types.ts","../src/translations/index.ts","../src/translations/cli/init-interactive.ts","../src/translations/cli/manage.ts"],"sourcesContent":["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 * Supported language codes for translations\n * Based on Google Translate API supported languages (ISO 639-1 and regional variants)\n * Complete list of all languages supported by Google Cloud Translation API\n */\nexport const SUPPORTED_LANGUAGES = [\n 'af', // Afrikaans\n 'sq', // Albanian\n 'am', // Amharic\n 'ar', // Arabic\n 'hy', // Armenian\n 'as', // Assamese\n 'ay', // Aymara\n 'az', // Azerbaijani\n 'bm', // Bambara\n 'eu', // Basque\n 'be', // Belarusian\n 'bn', // Bengali\n 'bho', // Bhojpuri\n 'bs', // Bosnian\n 'bg', // Bulgarian\n 'ca', // Catalan\n 'ceb', // Cebuano\n 'ny', // Chichewa\n 'zh', // Chinese (Simplified) - Google uses 'zh' or 'zh-CN'\n 'zh_cn', // Chinese (Simplified) - alternative format\n 'zh_tw', // Chinese (Traditional)\n 'co', // Corsican\n 'hr', // Croatian\n 'cs', // Czech\n 'da', // Danish\n 'dv', // Dhivehi\n 'doi', // Dogri\n 'nl', // Dutch\n 'en', // English\n 'eo', // Esperanto\n 'et', // Estonian\n 'ee', // Ewe\n 'tl', // Filipino (Tagalog)\n 'fi', // Finnish\n 'fr', // French\n 'gl', // Galician\n 'ka', // Georgian\n 'de', // German\n 'el', // Greek\n 'gn', // Guarani\n 'gu', // Gujarati\n 'ht', // Haitian Creole\n 'ha', // Hausa\n 'haw', // Hawaiian\n 'iw', // Hebrew (legacy code, 'he' is preferred)\n 'he', // Hebrew\n 'hi', // Hindi\n 'hmn', // Hmong\n 'hu', // Hungarian\n 'is', // Icelandic\n 'ig', // Igbo\n 'ilo', // Ilocano\n 'id', // Indonesian\n 'ga', // Irish\n 'it', // Italian\n 'ja', // Japanese\n 'jw', // Javanese\n 'kn', // Kannada\n 'kk', // Kazakh\n 'km', // Khmer\n 'rw', // Kinyarwanda\n 'gom', // Konkani\n 'ko', // Korean\n 'kri', // Krio\n 'ku', // Kurdish (Kurmanji)\n 'ckb', // Kurdish (Sorani)\n 'ky', // Kyrgyz\n 'lo', // Lao\n 'la', // Latin\n 'lv', // Latvian\n 'ln', // Lingala\n 'lt', // Lithuanian\n 'lg', // Luganda\n 'lb', // Luxembourgish\n 'mk', // Macedonian\n 'mai', // Maithili\n 'mg', // Malagasy\n 'ms', // Malay\n 'ml', // Malayalam\n 'mt', // Maltese\n 'mi', // Maori\n 'mr', // Marathi\n 'mni', // Meiteilon (Manipuri)\n 'lus', // Mizo\n 'mn', // Mongolian\n 'my', // Myanmar (Burmese)\n 'ne', // Nepali\n 'no', // Norwegian\n 'or', // Odia\n 'om', // Oromo\n 'ps', // Pashto\n 'fa', // Persian\n 'pl', // Polish\n 'pt', // Portuguese\n 'pt_br', // Portuguese (Brazil)\n 'pa', // Punjabi\n 'qu', // Quechua\n 'ro', // Romanian\n 'ru', // Russian\n 'sm', // Samoan\n 'sa', // Sanskrit\n 'gd', // Scottish Gaelic\n 'sr', // Serbian\n 'st', // Sesotho\n 'sn', // Shona\n 'sd', // Sindhi\n 'si', // Sinhala\n 'sk', // Slovak\n 'sl', // Slovenian\n 'so', // Somali\n 'es', // Spanish\n 'su', // Sundanese\n 'sw', // Swahili\n 'sv', // Swedish\n 'tg', // Tajik\n 'ta', // Tamil\n 'tt', // Tatar\n 'te', // Telugu\n 'th', // Thai\n 'ti', // Tigrinya\n 'ts', // Tsonga\n 'tr', // Turkish\n 'tk', // Turkmen\n 'ak', // Twi\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\nexport type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];\n\n/**\n * JSON Schema for .translationsrc.json\n */\nexport const TRANSLATION_CONFIG_SCHEMA = {\n $schema: 'http://json-schema.org/draft-07/schema#',\n title: 'Translation Configuration',\n description: 'Configuration for the translation management system',\n type: 'object',\n properties: {\n translationsPath: {\n type: 'string',\n description: 'Path to the translations directory relative to project root',\n default: 'public/static/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 },\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 }\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 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","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 * 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 * 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 */\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 const placeholder = `__PLACEHOLDER_${placeholderIndex}__`;\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","/**\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","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","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","/**\n * Translation management utilities\n *\n * This module provides a complete solution for managing i18n translations:\n * - Initialize translation structure\n * - Add and translate new keys\n * - Validate translations\n * - Auto-fill missing translations\n * - Generate TypeScript types\n */\n\n// CLI commands\nexport * from './cli/add-key.js';\nexport * from './cli/auto-fill.js';\nexport * from './cli/generate-types.js';\nexport * from './cli/init.js';\nexport * from './cli/init-interactive.js';\nexport * from './cli/manage.js';\nexport * from './cli/validate.js';\n\n// Core types and schemas\nexport * from './core/schema.js';\nexport * from './core/types.js';\nexport * from './utils/google-translate-provider.js';\n// Utilities\nexport * from './utils/translator.js';\nexport * from './utils/translator-interface.js';\nexport * from './utils/utils.js';\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 */\nexport async function manageTranslations(\n projectRoot: string = process.cwd(),\n options: ManageTranslationsOptions = {}\n): Promise<void> {\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;\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"],"mappings":"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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,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","names":["fs","path","validation","path","path","path","fs","path","fs","path","detectExistingTranslations","fs","path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "poly-lexis",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "A powerful CLI and library for managing i18n translations with validation, auto-translation, and TypeScript type generation",
5
5
  "private": false,
6
6
  "type": "module",