{"version":3,"sources":["../src/config/default.config.ts","../src/utils/fs.ts","../src/utils/logger.ts","../src/config/index.ts","../src/translation/providers/baidu.ts","../src/translation/queue.ts","../src/translation/cache.ts","../src/translation/manager.ts","../src/translation/cli.ts","../src/index.ts","../src/cli.ts","../src/ast/index.ts","../src/gen-key-value.ts","../src/utils/import-manager.ts","../src/utils/pattern.ts","../package.json","../src/utils/config-validator.ts"],"sourcesContent":["import { I18nConfig } from './type';\n\n// 默认配置\nexport const defaultConfig: I18nConfig = {\n  // 基础语言配置\n  locale: 'zh-CN',\n  fallbackLocale: 'en-US',\n  outputDir: 'locales',\n  // tempDir: undefined,  // 可选，不设置则直接修改源文件\n\n  // 文件处理配置\n  include: [\n    'src/**/*.{js,jsx,ts,tsx}',\n    'pages/**/*.{js,jsx,ts,tsx}',\n    'components/**/*.{js,jsx,ts,tsx}',\n  ],\n\n  exclude: [\n    'node_modules/**',\n    'dist/**',\n    'build/**',\n    '**/*.test.{js,jsx,ts,tsx}',\n    '**/*.spec.{js,jsx,ts,tsx}',\n  ],\n\n  // Key 生成配置\n  keyGeneration: {\n    maxChineseLength: 10, // 最大汉字长度\n    hashLength: 6, // 哈希长度\n    maxRetryCount: 5, // 最大重试次数\n    reuseExistingKey: true, // 默认重复使用相同文案的key\n    duplicateKeySuffix: 'hash', // 重复key后缀模式，默认hash\n    keyPrefix: '', // key前缀，默认为空\n    separator: '_', // 连接符，默认下划线\n    pinyinOptions: {\n      // 拼音转换选项\n      toneType: 'none', // 不带声调\n      type: 'array', // 返回数组格式\n    },\n  },\n\n  // 输出配置\n  output: {\n    prettyJson: true, // 格式化 JSON 输出\n    localeFileName: '{locale}.json', // 语言文件名格式\n  },\n\n  // 日志配置\n  logging: {\n    enabled: true, // 默认启用日志\n    level: 'normal', // 默认正常级别\n  },\n\n  // 替换配置\n  replacement: {\n    functionName: '$t', // 默认替换函数名\n    quoteType: 'single', // 默认使用单引号\n    autoImport: {\n      enabled: false, // 默认不启用自动引入\n      insertPosition: 'afterImports', // 默认在import语句后插入\n      imports: {},\n    },\n  },\n\n  // 翻译配置\n  translation: {\n    enabled: false, // 默认不启用翻译功能\n    provider: 'baidu', // 默认使用百度翻译\n    defaultSourceLang: 'zh', // 默认源语言：中文\n    defaultTargetLang: 'en', // 默认目标语言：英文\n    concurrency: 5, // 默认并发数：5 (降低并发数避免API限制)\n    retryTimes: 3, // 默认重试次数：3次（不包括第一次）\n    retryDelay: 1000, // 默认重试延迟：1秒\n    batchDelay: 500, // 默认批次延迟：0.5秒\n    baidu: {\n      appid: '', // 需要用户配置\n      key: '', // 需要用户配置\n    },\n  },\n};\n","import * as fs from 'fs-extra';\nimport * as path from 'path';\nimport fg, { Options } from 'fast-glob';\n\n/**\n * 读取文件内容\n */\nexport function readFile(filePath: string, encoding: BufferEncoding = 'utf-8'): Promise<string> {\n  const absPath = path.resolve(process.cwd(), filePath);\n  return fs.readFile(absPath, encoding);\n}\n\n/**\n * 写入文件内容\n */\nexport function writeFile(filePath: string, data: string | Buffer): Promise<void> {\n  const absPath = path.resolve(process.cwd(), filePath);\n  return fs.outputFile(absPath, data);\n}\n\n/**\n * 写入文件内容，支持 tempDir 配置\n * @param filePath 原始文件路径\n * @param data 文件内容\n * @param tempDir 临时目录，如果配置则写入到临时目录，否则写入原始位置\n */\nexport function writeFileWithTempDir(\n  filePath: string,\n  data: string | Buffer,\n  tempDir?: string\n): Promise<void> {\n  let targetPath: string;\n\n  if (tempDir) {\n    // 如果配置了 tempDir，则在 tempDir 下按照原始路径结构生成文件\n    const relativePath = path.relative(process.cwd(), filePath);\n    targetPath = path.resolve(process.cwd(), tempDir, relativePath);\n  } else {\n    // 如果没有配置 tempDir，则直接写入原始文件\n    targetPath = path.resolve(process.cwd(), filePath);\n  }\n\n  return fs.outputFile(targetPath, data);\n}\n\n/**\n * 创建目录\n */\nexport function ensureDir(dirPath: string): Promise<void> {\n  const absPath = path.resolve(process.cwd(), dirPath);\n  return fs.ensureDir(absPath);\n}\n\n/**\n * 遍历目录下所有文件，支持glob模式和过滤参数\n */\nexport function findFiles(pattern: string | string[], options: Options = {}): Promise<string[]> {\n  return fg(pattern, { dot: true, ...options, cwd: process.cwd() });\n}\n\n/**\n * 根据 include/exclude 参数筛选目标文件，所有路径以 CLI 执行目录为根目录\n * @param include 需要包含的文件模式（glob数组或字符串）\n * @param exclude 需要排除的文件模式（glob数组或字符串）\n */\nexport function findTargetFiles(include: string[], exclude: string[] = []): Promise<string[]> {\n  // // 处理排除模式，使其能够匹配任意层级的目录\n  // const processedExclude = exclude.map((pattern) => {\n  //   // 如果模式已经以 **/ 开头，则不处理\n  //   if (pattern.startsWith('**/')) {\n  //     return pattern;\n  //   }\n\n  //   // 处理带有 /** 后缀的模式（如 node_modules/**）\n  //   // 将其转换为 **/node_modules/** 以匹配任意层级\n  //   if (pattern.includes('/') && pattern.endsWith('/**')) {\n  //     const dirName = pattern.slice(0, -3); // 去掉 '/**'\n  //     return `**/${dirName}/**`;\n  //   }\n\n  //   // 如果模式包含完整路径（包含 /），则不处理\n  //   if (pattern.includes('/')) {\n  //     return pattern;\n  //   }\n\n  //   // 为不带路径分隔符的模式添加 **/ 前缀，使其可以匹配任意层级的目录\n  //   return `**/${pattern}`;\n  // });\n\n  return fg(include, { ignore: exclude, dot: true, cwd: process.cwd() });\n}\n\n/**\n * 检查文件是否存在\n * @param filePath 文件路径\n */\nexport function fileExists(filePath: string): boolean {\n  const absPath = path.resolve(process.cwd(), filePath);\n  return fs.existsSync(absPath);\n}\n\n/**\n * 同步读取 JSON 文件内容\n * @param filePath JSON 文件路径\n */\nexport function readJsonSync(filePath: string): unknown {\n  const absPath = path.resolve(process.cwd(), filePath);\n  return fs.readJsonSync(absPath);\n}\n\n/**\n * 异步读取 JSON 文件内容\n * @param filePath JSON 文件路径\n * @param defaultValue 文件不存在时的默认值\n */\nexport async function readJson<T = unknown>(filePath: string, defaultValue?: T): Promise<T> {\n  try {\n    const content = await readFile(filePath, 'utf-8');\n    return JSON.parse(content) as T;\n  } catch (error) {\n    if (defaultValue !== undefined) {\n      return defaultValue;\n    }\n    throw error;\n  }\n}\n\n/**\n * 异步写入 JSON 文件内容\n * @param filePath JSON 文件路径\n * @param data 要写入的数据\n * @param pretty 是否格式化输出，默认为 true\n */\nexport function writeJson(filePath: string, data: unknown, pretty: boolean = true): Promise<void> {\n  const content = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\n  return writeFile(filePath, content);\n}\n","import { ConfigManager } from '../config';\n\nexport class Logger {\n  private static getLogLevel(): string {\n    try {\n      const config = ConfigManager.get();\n      return config.logging?.level ?? 'normal';\n    } catch {\n      // 如果ConfigManager未初始化，使用默认值\n      return 'normal';\n    }\n  }\n\n  private static shouldLog(level: 'minimal' | 'normal' | 'verbose'): boolean {\n    const currentLevel = this.getLogLevel();\n\n    if (currentLevel === 'minimal') {\n      return level === 'minimal';\n    } else if (currentLevel === 'normal') {\n      return level !== 'verbose';\n    } else if (currentLevel === 'verbose') {\n      return true;\n    }\n\n    return false;\n  }\n\n  static success(message: string, level: 'minimal' | 'normal' | 'verbose' = 'normal'): void {\n    if (this.shouldLog(level)) {\n      console.log(`✅ ${message}`);\n    }\n  }\n\n  static info(message: string, level: 'minimal' | 'normal' | 'verbose' = 'normal'): void {\n    if (this.shouldLog(level)) {\n      console.log(`ℹ️  ${message}`);\n    }\n  }\n\n  static warn(message: string, level: 'minimal' | 'normal' | 'verbose' = 'normal'): void {\n    if (this.shouldLog(level)) {\n      console.warn(`⚠️  ${message}`);\n    }\n  }\n\n  static error(message: string, level: 'minimal' | 'normal' | 'verbose' = 'normal'): void {\n    if (this.shouldLog(level)) {\n      console.error(`❌ ${message}`);\n    }\n  }\n\n  static verbose(message: string): void {\n    this.info(message, 'verbose');\n  }\n}\n","import { merge } from 'lodash';\nimport { I18nConfig } from './type';\nimport { defaultConfig } from './default.config';\nimport { fileExists, readJsonSync } from '../utils/fs';\nimport { Logger } from '../utils/logger';\n\n/**\n * 验证配置对象的有效性\n */\nfunction validateConfig(config: I18nConfig): void {\n  const errors: string[] = [];\n\n  // 验证必需字段\n  if (!config.include || !Array.isArray(config.include) || config.include.length === 0) {\n    errors.push('include 字段必须是非空数组');\n  }\n\n  if (!config.outputDir || typeof config.outputDir !== 'string') {\n    errors.push('outputDir 字段必须是有效的字符串路径');\n  }\n\n  if (!config.locale || typeof config.locale !== 'string') {\n    errors.push('locale 字段必须是有效的语言代码');\n  }\n\n  // 验证翻译配置\n  if (config.translation?.enabled) {\n    if (!config.translation.provider) {\n      errors.push('启用翻译时必须指定 translation.provider');\n    }\n\n    if (config.translation.provider === 'baidu') {\n      if (!config.translation.baidu?.appid || !config.translation.baidu?.key) {\n        errors.push('使用百度翻译时必须配置 translation.baidu.appid 和 translation.baidu.key');\n      }\n    }\n  }\n\n  // 验证日志级别\n  if (config.logging?.level && !['minimal', 'normal', 'verbose'].includes(config.logging.level)) {\n    errors.push('logging.level 必须是 minimal、normal 或 verbose 之一');\n  }\n\n  if (errors.length > 0) {\n    Logger.error('配置验证失败:', 'minimal');\n    errors.forEach(error => Logger.error(`  - ${error}`, 'minimal'));\n    throw new Error(`配置验证失败: ${errors.join('; ')}`);\n  }\n}\n\nexport function loadConfig(customConfigPath?: string): I18nConfig {\n  let userConfig: Partial<I18nConfig> = {};\n\n  if (customConfigPath) {\n    if (fileExists(customConfigPath)) {\n      Logger.verbose(`加载配置文件: ${customConfigPath}`);\n      try {\n        userConfig = readJsonSync(customConfigPath) as Partial<I18nConfig>;\n        Logger.verbose('配置文件加载成功');\n      } catch (error) {\n        throw new Error(`配置文件解析失败: ${error}`);\n      }\n    } else {\n      Logger.warn(`配置文件不存在: ${customConfigPath}，使用默认配置`);\n    }\n  }\n\n  const finalConfig = merge({}, defaultConfig, userConfig) as I18nConfig;\n\n  // 验证最终配置\n  validateConfig(finalConfig);\n\n  Logger.verbose('配置验证通过');\n  return finalConfig;\n}\n\n// ConfigManager 单例\nclass ConfigManagerClass {\n  private config: I18nConfig | null = null;\n\n  init(config: I18nConfig): void {\n    this.config = config;\n  }\n\n  get(): I18nConfig {\n    if (!this.config) {\n      throw new Error('ConfigManager: config not initialized!');\n    }\n    return this.config;\n  }\n}\n\nexport const ConfigManager = new ConfigManagerClass();\n","import { TranslationProvider, TranslationResult } from '../index';\nimport { Logger } from '../../utils/logger';\nimport baiduTranslateService from 'baidu-translate-service';\n\ninterface BaiduTranslateConfig {\n  appid: string;\n  key: string;\n}\n\ninterface BaiduTranslateResponse {\n  from: string;\n  to: string;\n  trans_result: Array<{\n    src: string;\n    dst: string;\n  }>;\n  error_code?: string;\n  error_msg?: string;\n}\n\nexport class BaiduTranslationProvider implements TranslationProvider {\n  public readonly name = 'baidu';\n  private config: BaiduTranslateConfig;\n\n  constructor(config: BaiduTranslateConfig) {\n    this.config = config;\n    Logger.verbose(`百度翻译提供者初始化完成，appid: ${config.appid ? '已配置' : '未配置'}`);\n  }\n\n  async translate(\n    text: string,\n    from: string = 'auto',\n    to: string = 'en'\n  ): Promise<TranslationResult> {\n    if (!this.isConfigured()) {\n      throw new Error('百度翻译服务未配置，请设置 appid 和 key');\n    }\n\n    try {\n      const mappedFrom = this.mapLanguageCode(from);\n      const mappedTo = this.mapLanguageCode(to);\n      Logger.verbose(`发起百度翻译请求: ${mappedFrom} -> ${mappedTo}, 文本长度: ${text.length}`);\n\n      const response: BaiduTranslateResponse = await baiduTranslateService({\n        appid: this.config.appid,\n        key: this.config.key,\n        q: text,\n        from: mappedFrom,\n        to: mappedTo,\n      });\n\n      if (response.error_code) {\n        throw new Error(`百度翻译API错误: ${response.error_code} - ${response.error_msg}`);\n      }\n\n      if (!response.trans_result || response.trans_result.length === 0) {\n        throw new Error('翻译结果为空');\n      }\n\n      const translatedText = response.trans_result.map((item) => item.dst).join('\\n');\n\n      Logger.verbose(`翻译成功: \"${text}\" -> \"${translatedText}\"`);\n\n      return {\n        originalText: text,\n        translatedText,\n        sourceLanguage: response.from,\n        targetLanguage: response.to,\n        provider: this.name,\n      };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n      Logger.error(`百度翻译失败: ${errorMessage}`);\n      throw error;\n    }\n  }\n\n  isConfigured(): boolean {\n    return !!(this.config.appid && this.config.key);\n  }\n\n  getSupportedLanguages(): string[] {\n    return [\n      'auto',\n      'zh',\n      'en',\n      'yue',\n      'wyw',\n      'jp',\n      'kor',\n      'fra',\n      'spa',\n      'th',\n      'ara',\n      'ru',\n      'pt',\n      'de',\n      'it',\n      'el',\n      'nl',\n      'pl',\n      'bul',\n      'est',\n      'dan',\n      'fin',\n      'cs',\n      'rom',\n      'slo',\n      'swe',\n      'hu',\n      'cht',\n      'vie',\n    ];\n  }\n\n  /**\n   * 映射语言代码到百度翻译API支持的格式\n   */\n  private mapLanguageCode(lang: string): string {\n    const langMap: Record<string, string> = {\n      'zh-CN': 'zh',\n      'zh-TW': 'cht',\n      'en-US': 'en',\n      ja: 'jp',\n      ko: 'kor',\n      fr: 'fra',\n      es: 'spa',\n      ar: 'ara',\n      ru: 'ru',\n      pt: 'pt',\n      de: 'de',\n      it: 'it',\n      nl: 'nl',\n      pl: 'pl',\n      sv: 'swe',\n      vi: 'vie',\n    };\n\n    return langMap[lang] ?? lang;\n  }\n}\n","import { Logger } from '../utils/logger';\n\nexport interface QueueTask<T> {\n  id: string;\n  execute: () => Promise<T>;\n  maxRetries: number;\n  retryDelay: number;\n  currentRetry?: number;\n}\n\nexport interface QueueStats {\n  total: number;\n  pending: number;\n  completed: number;\n  failed: number;\n  inProgress: number;\n}\n\n/**\n * 翻译队列，用于控制并发和重试逻辑\n */\nexport class TranslationQueue {\n  private readonly concurrency: number;\n  private tasks: QueueTask<unknown>[] = [];\n  private completedResults: Map<string, unknown> = new Map();\n  private failedTasks: Map<string, Error> = new Map();\n  private stats: QueueStats = {\n    total: 0,\n    pending: 0,\n    completed: 0,\n    failed: 0,\n    inProgress: 0,\n  };\n  private batchDelay: number = 0; // 批次间延迟（毫秒）\n  private isApiLimited: boolean = false; // API限制状态标志\n  private apiLimitResetTime: number = 0; // API限制重置时间\n\n  constructor(concurrency: number = 10) {\n    this.concurrency = concurrency;\n  }\n\n  /**\n   * 添加任务到队列\n   */\n  addTask<T>(task: QueueTask<T>): void {\n    task.currentRetry = 0;\n    this.tasks.push(task as QueueTask<unknown>);\n    this.stats.total++;\n    this.stats.pending++;\n  }\n\n  /**\n   * 设置批次间延迟时间（毫秒）\n   */\n  setBatchDelay(delay: number): void {\n    this.batchDelay = delay;\n  }\n\n  /**\n   * 执行所有任务，返回结果映射\n   */\n  async executeAll(): Promise<Map<string, unknown>> {\n    Logger.info(`开始执行翻译队列，并发数: ${this.concurrency}，任务总数: ${this.stats.total}`);\n\n    this.completedResults.clear();\n    this.failedTasks.clear();\n\n    const workers: Promise<void>[] = [];\n\n    // 启动固定数量的worker\n    for (let i = 0; i < Math.min(this.concurrency, this.tasks.length); i++) {\n      workers.push(this.worker());\n    }\n\n    // 等待所有worker完成\n    await Promise.all(workers);\n\n    return this.completedResults;\n  }\n\n  /**\n   * 工作线程，负责执行任务队列中的任务\n   */\n  private async worker(): Promise<void> {\n    while (this.tasks.length > 0) {\n      // 检查API限制状态\n      if (this.isApiLimited) {\n        const now = Date.now();\n        if (now < this.apiLimitResetTime) {\n          // API处于限制状态，等待重置\n          const waitTime = this.apiLimitResetTime - now;\n          Logger.warn(`API速率限制中，等待 ${Math.ceil(waitTime / 1000)} 秒后继续...`);\n          await this.delay(waitTime);\n          this.isApiLimited = false;\n        }\n      }\n\n      const task = this.tasks.shift();\n      if (!task) continue;\n\n      this.stats.pending--;\n      this.stats.inProgress++;\n\n      try {\n        // 执行任务\n        const result = await task.execute();\n\n        // 记录成功结果\n        this.completedResults.set(task.id, result);\n        this.stats.completed++;\n        this.stats.inProgress--;\n\n        Logger.verbose(`任务 ${task.id} 执行成功`);\n\n        // 添加批次间延迟，避免API限制\n        if (this.batchDelay > 0) {\n          await this.delay(this.batchDelay);\n        }\n      } catch (error) {\n        const errorMessage = error instanceof Error ? error.message : String(error);\n\n        // 检测API限制错误\n        if (this.isApiLimitError(errorMessage)) {\n          this.handleApiLimitError();\n\n          // 放回队列头部，等待API限制解除后重试\n          this.tasks.unshift(task);\n          this.stats.pending++;\n        } else {\n          Logger.error(`任务 ${task.id} 执行失败: ${errorMessage}`);\n\n          // 检查是否还可以重试\n          if ((task.currentRetry ?? 0) < task.maxRetries) {\n            task.currentRetry = (task.currentRetry ?? 0) + 1;\n            Logger.warn(\n              `任务 ${task.id} 执行失败，准备第 ${task.currentRetry} 次重试: ${errorMessage}`\n            );\n\n            // 等待重试延迟时间\n            await this.delay(task.retryDelay);\n\n            // 放回队列末尾，等待重试\n            this.tasks.push(task);\n            this.stats.pending++;\n          } else {\n            // 重试次数用尽，记录最终失败\n            const finalError = error instanceof Error ? error : new Error(String(error));\n            this.failedTasks.set(task.id, finalError);\n            this.stats.failed++;\n          }\n        }\n\n        this.stats.inProgress--;\n      }\n    }\n  }\n\n  /**\n   * 检测是否为API限制错误\n   */\n  private isApiLimitError(errorMessage: string): boolean {\n    // 根据错误消息判断是否为API限制错误\n    return (\n      errorMessage.includes('API错误: 54003') ||\n      errorMessage.includes('Invalid Access Limit') ||\n      errorMessage.includes('rate limit') ||\n      errorMessage.includes('too many requests')\n    );\n  }\n\n  /**\n   * 处理API限制错误\n   */\n  private handleApiLimitError(): void {\n    // API限制，设置标志并计算恢复时间\n    this.isApiLimited = true;\n    // 设置60秒的API限制冷却时间\n    const cooldownTime = 60 * 1000;\n    this.apiLimitResetTime = Date.now() + cooldownTime;\n\n    Logger.warn(`检测到API速率限制，将暂停 ${cooldownTime / 1000} 秒后继续`);\n  }\n\n  /**\n   * 获取已完成任务的结果\n   */\n  getCompletedResults(): Map<string, unknown> {\n    return this.completedResults;\n  }\n\n  /**\n   * 获取失败任务的错误信息\n   */\n  getFailedTasks(): Map<string, Error> {\n    return this.failedTasks;\n  }\n\n  /**\n   * 获取队列统计信息\n   */\n  getStats(): QueueStats {\n    return { ...this.stats };\n  }\n\n  /**\n   * Promise延迟等待\n   */\n  private delay(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n}\n","import { Logger } from '../utils/logger';\n\nexport interface TranslationCacheItem {\n  originalText: string;\n  translatedText: string;\n  sourceLanguage: string;\n  targetLanguage: string;\n  provider: string;\n  timestamp: number;\n}\n\n/**\n * 翻译缓存管理器\n * 简单的内存缓存，用于存储和检索已翻译过的文本，避免重复调用翻译API\n */\nexport class TranslationCache {\n  private static instance: TranslationCache;\n  private cache: Map<string, TranslationCacheItem> = new Map();\n\n  private constructor() {\n    // 单例模式，私有构造函数\n  }\n\n  /**\n   * 获取翻译缓存管理器实例\n   */\n  public static getInstance(): TranslationCache {\n    if (!TranslationCache.instance) {\n      TranslationCache.instance = new TranslationCache();\n      Logger.verbose('初始化翻译内存缓存');\n    }\n    return TranslationCache.instance;\n  }\n\n  /**\n   * 从缓存中获取翻译结果\n   */\n  public get(\n    text: string,\n    from: string,\n    to: string,\n    provider: string\n  ): TranslationCacheItem | null {\n    const key = this.generateCacheKey(text, from, to, provider);\n    const cached = this.cache.get(key);\n\n    if (cached) {\n      Logger.verbose(`缓存命中: \"${text}\" (${from} -> ${to})`);\n      return cached;\n    }\n\n    return null;\n  }\n\n  /**\n   * 将翻译结果存入缓存\n   */\n  public set(\n    text: string,\n    translatedText: string,\n    from: string,\n    to: string,\n    provider: string\n  ): void {\n    const key = this.generateCacheKey(text, from, to, provider);\n\n    this.cache.set(key, {\n      originalText: text,\n      translatedText,\n      sourceLanguage: from,\n      targetLanguage: to,\n      provider,\n      timestamp: Date.now(),\n    });\n  }\n\n  /**\n   * 清空缓存\n   */\n  public clear(): void {\n    this.cache.clear();\n    Logger.verbose('翻译缓存已清空');\n  }\n\n  /**\n   * 获取缓存大小\n   */\n  public size(): number {\n    return this.cache.size;\n  }\n\n  /**\n   * 生成缓存键\n   */\n  private generateCacheKey(text: string, from: string, to: string, provider: string): string {\n    // 使用源文本、源语言、目标语言和提供者生成唯一键\n    return `${provider}:${from}:${to}:${text}`;\n  }\n}\n","import { TranslationProvider, TranslationResult, TranslationConfig } from './index';\nimport { BaiduTranslationProvider } from './providers/baidu';\nimport { Logger } from '../utils/logger';\nimport { TranslationQueue } from './queue';\nimport { readJson, writeJson, fileExists } from '../utils/fs';\nimport { TranslationCache } from './cache';\nimport * as path from 'path';\n\nexport class TranslationManager {\n  private providers: Map<string, TranslationProvider> = new Map();\n  private config: TranslationConfig;\n  private cache: TranslationCache;\n\n  constructor(config: TranslationConfig) {\n    this.config = config;\n    Logger.verbose(`初始化翻译管理器，提供者: ${config.provider}，并发数: ${config.concurrency}`);\n\n    // 初始化缓存\n    this.cache = TranslationCache.getInstance();\n\n    this.initializeProviders();\n  }\n\n  private initializeProviders(): void {\n    // 初始化百度翻译服务\n    if (this.config.baidu?.appid && this.config.baidu?.key) {\n      const baiduProvider = new BaiduTranslationProvider({\n        appid: this.config.baidu.appid,\n        key: this.config.baidu.key,\n      });\n      this.providers.set('baidu', baiduProvider);\n      Logger.verbose('百度翻译服务已初始化');\n    }\n\n    // TODO: 可以在这里添加其他翻译服务提供者\n    // if (this.config.custom) {\n    //   const customProvider = new CustomTranslationProvider(this.config.custom);\n    //   this.providers.set('custom', customProvider);\n    // }\n  }\n\n  /**\n   * 翻译文本\n   */\n  async translate(\n    text: string,\n    from: string = this.config.defaultSourceLang ?? 'auto',\n    to: string = this.config.defaultTargetLang ?? 'en'\n  ): Promise<TranslationResult> {\n    if (!this.config.enabled) {\n      throw new Error('翻译服务未启用');\n    }\n\n    const provider = this.providers.get(this.config.provider);\n    if (!provider) {\n      throw new Error(`翻译服务提供者 '${this.config.provider}' 未找到或未配置`);\n    }\n\n    if (!provider.isConfigured()) {\n      throw new Error(`翻译服务提供者 '${this.config.provider}' 配置不完整`);\n    }\n\n    const providerName = provider.name ?? this.config.provider;\n\n    // 先检查缓存是否存在\n    const cachedResult = this.cache.get(text, from, to, providerName);\n    if (cachedResult) {\n      Logger.info(`[缓存] 翻译: \"${text}\" -> \"${cachedResult.translatedText}\"`);\n      return {\n        originalText: cachedResult.originalText,\n        translatedText: cachedResult.translatedText,\n        sourceLanguage: cachedResult.sourceLanguage,\n        targetLanguage: cachedResult.targetLanguage,\n        provider: cachedResult.provider,\n      };\n    }\n\n    Logger.verbose(`使用 ${providerName} 翻译: \"${text}\" (${from} -> ${to})`);\n\n    try {\n      const result = await provider.translate(text, from, to);\n      Logger.info(`翻译完成: \"${text}\" -> \"${result.translatedText}\"`);\n\n      // 翻译完成后存入缓存\n      this.cache.set(text, result.translatedText, from, to, providerName);\n\n      return result;\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n      Logger.error(`翻译失败: ${errorMessage}`);\n      throw error;\n    }\n  }\n\n  /**\n   * 批量翻译文本数组\n   */\n  async translateBatch(\n    texts: string[],\n    from: string = this.config.defaultSourceLang ?? 'auto',\n    to: string = this.config.defaultTargetLang ?? 'en'\n  ): Promise<TranslationResult[]> {\n    if (!this.config.enabled) {\n      throw new Error('翻译服务未启用');\n    }\n\n    // 优化API调用参数\n    const concurrency = Math.min(this.config.concurrency ?? 5, 5); // 限制最大并发为5\n    const retryTimes = this.config.retryTimes ?? 3;\n    const retryDelay = Math.max(this.config.retryDelay ?? 1000, 1000); // 至少1秒的重试延迟\n    const batchDelay = Math.max(this.config.batchDelay ?? 500, 500); // 至少0.5秒的批次延迟\n\n    Logger.info(\n      `开始批量翻译，文本数量: ${texts.length}，并发数: ${concurrency}，重试次数: ${retryTimes}`,\n      'normal'\n    );\n    Logger.verbose(`翻译方向: ${from} -> ${to}`);\n\n    // 检查哪些文本已经在缓存中\n    const providerName = this.config.provider;\n    const textsToTranslate: string[] = [];\n    const cachedResults: Map<string, TranslationResult> = new Map();\n\n    for (let i = 0; i < texts.length; i++) {\n      const text = texts[i];\n      if (!text) continue;\n\n      const cachedResult = this.cache.get(text, from || 'auto', to || 'en', providerName);\n\n      if (cachedResult) {\n        // 使用缓存结果\n        Logger.verbose(`[缓存] 文本 ${i + 1}/${texts.length}: \"${text}\"`);\n        cachedResults.set(`translate_${i}`, {\n          originalText: cachedResult.originalText,\n          translatedText: cachedResult.translatedText,\n          sourceLanguage: cachedResult.sourceLanguage,\n          targetLanguage: cachedResult.targetLanguage,\n          provider: cachedResult.provider,\n        });\n      } else {\n        // 需要翻译\n        textsToTranslate.push(text);\n      }\n    }\n\n    // 创建翻译队列\n    const queue = new TranslationQueue(concurrency);\n    queue.setBatchDelay(batchDelay);\n\n    // 添加需要翻译的文本到队列\n    for (let i = 0; i < texts.length; i++) {\n      if (!cachedResults.has(`translate_${i}`)) {\n        const text = texts[i];\n        if (!text) continue;\n\n        queue.addTask({\n          id: `translate_${i}`,\n          execute: () => this.translate(text, from || 'auto', to || 'en'),\n          maxRetries: retryTimes,\n          retryDelay: retryDelay,\n        });\n      }\n    }\n\n    Logger.info(`需要翻译的文本: ${textsToTranslate.length}，从缓存加载: ${cachedResults.size}`);\n\n    // 如果所有文本都在缓存中，则直接返回\n    if (textsToTranslate.length === 0) {\n      Logger.info(`所有文本都从缓存加载，跳过API调用`);\n      const results: TranslationResult[] = [];\n      for (let i = 0; i < texts.length; i++) {\n        const result = cachedResults.get(`translate_${i}`);\n        if (result) {\n          results.push(result);\n        }\n      }\n      return results;\n    }\n\n    // 执行所有任务\n    const completedResults = await queue.executeAll();\n\n    // 整理结果\n    const results: TranslationResult[] = [];\n    const failedTasks = queue.getFailedTasks();\n\n    for (let i = 0; i < texts.length; i++) {\n      const taskId = `translate_${i}`;\n\n      // 如果是缓存结果\n      if (cachedResults.has(taskId)) {\n        const result = cachedResults.get(taskId);\n        if (result) {\n          results.push(result);\n        }\n        continue;\n      }\n\n      // 如果是API请求结果\n      const result = completedResults.get(taskId) as TranslationResult | undefined;\n\n      if (result) {\n        results.push(result);\n      } else {\n        const error = failedTasks.get(taskId);\n        const errorMessage = error?.message ?? '未知错误';\n        const currentText = texts[i];\n        if (currentText) {\n          Logger.error(`文本 \"${currentText}\" 翻译失败: ${errorMessage}`);\n          // 为失败的翻译创建一个占位结果\n          results.push({\n            originalText: currentText,\n            translatedText: currentText, // 失败时返回原文\n            sourceLanguage: from || 'auto',\n            targetLanguage: to || 'en',\n            provider: this.config.provider,\n          });\n        }\n      }\n    }\n\n    const stats = queue.getStats();\n    Logger.info(\n      `批量翻译完成，成功: ${stats.completed}，失败: ${stats.failed}，总计: ${texts.length}，使用缓存: ${cachedResults.size}`\n    );\n\n    return results;\n  }\n\n  /**\n   * 翻译语言文件（JSON）\n   * 此方法整合了原来的translateJsonFile和translateLanguageFiles\n   * 支持增量翻译和实时写入结果\n   */\n  async translateLanguageFile(\n    sourcePath: string,\n    targetLocale: string,\n    from: string = this.config.defaultSourceLang ?? 'auto',\n    to: string = this.config.defaultTargetLang ?? 'en',\n    incrementalMode: boolean = true // 是否增量翻译模式\n  ): Promise<{\n    outputPath: string;\n    totalCount: number;\n    successCount: number;\n    skippedCount: number;\n  }> {\n    if (!fileExists(sourcePath)) {\n      throw new Error(`源语言文件不存在: ${sourcePath}`);\n    }\n\n    Logger.info(`📖 读取JSON文件: ${sourcePath}`);\n\n    // 解析源文件\n    const sourceContent = await readJson<Record<string, unknown>>(sourcePath);\n    const totalSourceItems = Object.keys(sourceContent).length;\n\n    // 生成正确的目标文件名，使用targetLocale，如\"en-US.json\"而不是\"zh-CN.en.json\"\n    const outputPath = path.join(path.dirname(sourcePath), `${targetLocale}.json`);\n\n    // 如果是增量翻译模式，先尝试读取已有的翻译文件\n    let existingTranslations: Record<string, unknown> = {};\n    let skippedCount = 0;\n    if (incrementalMode && fileExists(outputPath)) {\n      Logger.info(`增量翻译模式: 加载已有的翻译文件 ${outputPath}`);\n      try {\n        existingTranslations = await readJson<Record<string, unknown>>(outputPath);\n        Logger.info(`已加载 ${Object.keys(existingTranslations).length} 个已翻译的项`);\n      } catch (error) {\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        Logger.warn(`读取已有翻译文件失败: ${errorMessage}，将创建新文件`);\n        existingTranslations = {};\n      }\n    }\n\n    // 提取需要翻译的文本\n    const keysToTranslate: string[] = [];\n    const textsToTranslate: string[] = [];\n    const finalTranslations: Record<string, unknown> = { ...existingTranslations };\n\n    // 分析源文件，确定哪些需要翻译\n    for (const key in sourceContent) {\n      const value = sourceContent[key];\n      // 只翻译字符串类型的值\n      if (typeof value === 'string') {\n        if (incrementalMode && key in existingTranslations && existingTranslations[key]) {\n          // 如果已经翻译过，并且是增量模式，则跳过\n          Logger.verbose(`跳过已翻译的键: ${key}`);\n          skippedCount++;\n          continue;\n        }\n        keysToTranslate.push(key);\n        textsToTranslate.push(value);\n      } else {\n        // 非字符串值直接复制\n        finalTranslations[key] = value;\n      }\n    }\n\n    // 所有需要翻译的新条目数\n    const needTranslateCount = textsToTranslate.length;\n\n    if (needTranslateCount === 0) {\n      Logger.info(`没有需要翻译的新文本，保留所有已翻译内容`);\n      // 依然写入文件，以确保输出文件存在\n      await writeJson(outputPath, finalTranslations, true);\n      return {\n        outputPath,\n        totalCount: totalSourceItems,\n        successCount: 0, // 没有新翻译，成功数为0\n        skippedCount: skippedCount, // 返回跳过的数量\n      };\n    }\n\n    Logger.info(`🔄 开始翻译 ${needTranslateCount} 个文本条目...`);\n\n    // 批量翻译文本\n    const results = await this.translateBatch(textsToTranslate, from, to);\n\n    // 处理翻译结果\n    let successCount = 0;\n    const realTimeWriteInterval = 50; // 每翻译50个条目写入一次文件\n\n    for (let i = 0; i < results.length; i++) {\n      const key = keysToTranslate[i];\n      const result = results[i];\n\n      if (\n        key &&\n        typeof key === 'string' &&\n        result &&\n        result.translatedText !== result.originalText\n      ) {\n        finalTranslations[key] = result.translatedText;\n        successCount++;\n      } else if (key && typeof key === 'string') {\n        // 翻译失败或未变化，保留原文\n        finalTranslations[key] = sourceContent[key];\n      }\n\n      // 实时写入文件，防止在大量翻译时因错误丢失已翻译内容\n      if ((i + 1) % realTimeWriteInterval === 0 || i === results.length - 1) {\n        try {\n          await writeJson(outputPath, finalTranslations, true);\n          Logger.verbose(`实时保存翻译结果到 ${outputPath}，已处理 ${i + 1}/${results.length}`);\n        } catch (error) {\n          const errorMessage = error instanceof Error ? error.message : String(error);\n          Logger.warn(`实时保存翻译结果失败: ${errorMessage}`);\n        }\n      }\n    }\n\n    // 最终保存结果\n    await writeJson(outputPath, finalTranslations, true);\n\n    // 移除冗余日志输出，由CLI层负责统一输出\n    Logger.verbose(`翻译完成，结果保存到: ${outputPath}`);\n\n    return {\n      outputPath,\n      totalCount: totalSourceItems,\n      successCount,\n      skippedCount,\n    };\n  }\n\n  /**\n   * 检查服务是否可用\n   */\n  isAvailable(): boolean {\n    if (!this.config.enabled) {\n      return false;\n    }\n\n    const provider = this.providers.get(this.config.provider);\n    return provider ? provider.isConfigured() : false;\n  }\n\n  /**\n   * 获取当前提供者支持的语言\n   */\n  getSupportedLanguages(): string[] {\n    const provider = this.providers.get(this.config.provider);\n    return provider ? provider.getSupportedLanguages() : [];\n  }\n\n  /**\n   * 获取可用的翻译服务提供者列表\n   */\n  getAvailableProviders(): string[] {\n    return Array.from(this.providers.keys()).filter((name) => {\n      const provider = this.providers.get(name);\n      return provider?.isConfigured() ?? false;\n    });\n  }\n\n  /**\n   * 获取缓存状态\n   */\n  getCacheStatus(): { size: number } {\n    return {\n      size: this.cache.size(),\n    };\n  }\n\n  /**\n   * 清除缓存\n   */\n  clearCache(): void {\n    this.cache.clear();\n    Logger.info('翻译缓存已清空');\n  }\n}\n","import { ConfigManager, loadConfig } from '../config';\nimport { TranslationManager } from './manager';\nimport { readFile, fileExists } from '../utils/fs';\nimport { Logger } from '../utils/logger';\nimport * as path from 'path';\n\ninterface TranslateOptions {\n  config: string;\n  from?: string;\n  to?: string;\n  input?: string;\n  json?: string;\n  batch?: boolean;\n  test?: boolean;\n  incremental?: boolean; // 增量翻译选项，默认启用\n}\n\nexport async function translateCommand(options: TranslateOptions): Promise<void> {\n  // 加载配置\n  const config = loadConfig(options.config);\n  ConfigManager.init(config);\n\n  if (!config.translation?.enabled) {\n    Logger.info('翻译功能未启用，请在配置文件中设置 translation.enabled = true', 'normal');\n    return;\n  }\n\n  // 初始化翻译管理器\n  const translationManager = new TranslationManager({\n    enabled: config.translation.enabled,\n    provider: config.translation.provider ?? 'baidu',\n    defaultSourceLang: config.translation.defaultSourceLang ?? 'zh',\n    defaultTargetLang: config.translation.defaultTargetLang ?? 'en',\n    concurrency: config.translation.concurrency ?? 5,\n    retryTimes: config.translation.retryTimes ?? 3,\n    retryDelay: config.translation.retryDelay ?? 1000,\n    batchDelay: config.translation.batchDelay ?? 500,\n    baidu:\n      config.translation.baidu?.appid && config.translation.baidu?.key\n        ? {\n          appid: config.translation.baidu.appid,\n          key: config.translation.baidu.key,\n        }\n        : undefined,\n    custom:\n      config.translation.custom?.endpoint && config.translation.custom?.apiKey\n        ? {\n          endpoint: config.translation.custom.endpoint,\n          apiKey: config.translation.custom.apiKey,\n        }\n        : undefined,\n  });\n\n  if (!translationManager.isAvailable()) {\n    Logger.error('翻译服务不可用，请检查配置', 'minimal');\n    Logger.info('百度翻译需要配置 appid 和 key', 'normal');\n    return;\n  }\n\n  // 确定翻译方向\n  const defaultSourceLang = config.translation.defaultSourceLang ?? 'zh';\n  const defaultTargetLang = config.translation.defaultTargetLang ?? config.fallbackLocale ?? 'en';\n  const from = options.from ?? defaultSourceLang;\n  const to = options.to ?? defaultTargetLang;\n\n  // 增量翻译模式，默认启用\n  const incrementalMode = options.incremental !== false;\n\n  try {\n    // 根据不同的选项执行相应的翻译操作\n    if (options.test && options.input) {\n      await handleTranslateTest(translationManager, options.input, from, to);\n    } else if (options.json) {\n      await handleTranslateJsonFile(translationManager, options.json, from, to, incrementalMode);\n    } else if (options.batch) {\n      await handleTranslateBatchFiles(translationManager, from, to, incrementalMode);\n    } else if (options.input) {\n      await handleTranslateInput(translationManager, options.input, from, to);\n    } else {\n      // 没有传递任何参数时，使用默认行为：读取配置的outputDir下的默认语言文件\n      const outputDir = config.outputDir ?? 'locales';\n      const sourceLocale = config.locale ?? 'zh-CN';\n      const targetLocale = config.fallbackLocale ?? 'en-US';\n\n      Logger.info(\n        `未指定翻译内容，将从 ${outputDir} 目录读取 ${sourceLocale}.json 文件并翻译成 ${targetLocale}`,\n        'normal'\n      );\n\n      const sourceLang = sourceLocale.split('-')[0] || 'zh'; // 提取语言代码，如zh-CN -> zh\n      const targetLang = targetLocale.split('-')[0] || 'en'; // 提取语言代码，如en-US -> en\n\n      try {\n        const sourcePath = path.join(outputDir, `${sourceLocale}.json`);\n        if (!fileExists(sourcePath)) {\n          throw new Error(`源语言文件不存在: ${sourcePath}，请先运行生成命令创建源语言文件`);\n        }\n\n        Logger.info(`📖 从源语言文件读取: ${sourcePath}`);\n\n        const { outputPath, totalCount, successCount, skippedCount } =\n          await translationManager.translateLanguageFile(\n            sourcePath,\n            targetLocale,\n            sourceLang,\n            targetLang,\n            incrementalMode\n          );\n\n        Logger.success(`✅ 翻译完成，结果保存到: ${outputPath}`, 'normal');\n        if (skippedCount > 0) {\n          if (successCount > 0) {\n            Logger.info(\n              `📊 成功翻译: ${successCount}项新内容，跳过已翻译项: ${skippedCount}项，共${totalCount}项`,\n              'normal'\n            );\n          } else {\n            Logger.info(\n              `📊 无新内容需要翻译，已有翻译项: ${skippedCount}项，共${totalCount}项`,\n              'normal'\n            );\n          }\n        } else {\n          Logger.info(`📊 成功翻译: ${successCount}/${totalCount}项`, 'normal');\n        }\n      } catch (error) {\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        Logger.error(`翻译失败: ${errorMessage}`, 'minimal');\n        showUsageHelp();\n      }\n    }\n  } catch (error) {\n    const errorMessage = error instanceof Error ? error.message : String(error);\n    Logger.error(`翻译失败: ${errorMessage}`, 'minimal');\n    process.exit(1);\n  }\n}\n\n/**\n * 测试翻译单个文本\n */\nasync function handleTranslateTest(\n  manager: TranslationManager,\n  text: string,\n  from: string,\n  to: string\n): Promise<void> {\n  Logger.info(`测试翻译模式 (${from} -> ${to})`, 'normal');\n  Logger.info(`原文: ${text}`, 'normal');\n\n  const result = await manager.translate(text, from, to);\n  Logger.success(`译文: ${result.translatedText}`, 'normal');\n  Logger.info(`提供者: ${result.provider}`, 'normal');\n}\n\n/**\n * 翻译指定的JSON文件\n */\nasync function handleTranslateJsonFile(\n  manager: TranslationManager,\n  jsonPath: string,\n  from: string,\n  to: string,\n  incremental: boolean = true\n): Promise<void> {\n  // 推导目标语言的Locale\n  const targetLocale = ConfigManager.get().fallbackLocale || 'en-US';\n\n  const { outputPath, totalCount, successCount, skippedCount } =\n    await manager.translateLanguageFile(jsonPath, targetLocale, from, to, incremental);\n\n  Logger.success(`✅ 翻译完成，结果保存到: ${outputPath}`, 'normal');\n  if (skippedCount > 0) {\n    if (successCount > 0) {\n      Logger.info(\n        `📊 成功翻译: ${successCount}项新内容，跳过已翻译项: ${skippedCount}项，共${totalCount}项`,\n        'normal'\n      );\n    } else {\n      Logger.info(\n        `📊 无新内容需要翻译，已有翻译项: ${skippedCount}项，共${totalCount}项`,\n        'normal'\n      );\n    }\n  } else {\n    Logger.info(`📊 成功翻译: ${successCount}/${totalCount}项`, 'normal');\n  }\n}\n\n/**\n * 批量翻译语言文件\n */\nasync function handleTranslateBatchFiles(\n  manager: TranslationManager,\n  from: string,\n  to: string,\n  incremental: boolean = true\n): Promise<void> {\n  const config = ConfigManager.get();\n  const outputDir = config.outputDir ?? './locales';\n  const sourceLocale = config.locale ?? from;\n  const targetLocale = config.fallbackLocale ?? 'en-US';\n\n  const sourcePath = path.join(outputDir, `${sourceLocale}.json`);\n  if (!fileExists(sourcePath)) {\n    throw new Error(`源语言文件不存在: ${sourcePath}，请先运行生成命令创建源语言文件`);\n  }\n\n  Logger.info(`📖 从源语言文件读取: ${sourcePath}`);\n\n  const { outputPath, totalCount, successCount, skippedCount } =\n    await manager.translateLanguageFile(sourcePath, targetLocale, from, to, incremental);\n\n  Logger.success(`✅ 批量翻译完成，结果保存到: ${outputPath}`, 'normal');\n  if (skippedCount > 0) {\n    if (successCount > 0) {\n      Logger.info(\n        `📊 成功翻译: ${successCount}项新内容，跳过已翻译项: ${skippedCount}项，共${totalCount}项`,\n        'normal'\n      );\n    } else {\n      Logger.info(\n        `📊 无新内容需要翻译，已有翻译项: ${skippedCount}项，共${totalCount}项`,\n        'normal'\n      );\n    }\n  } else {\n    Logger.info(`📊 成功翻译: ${successCount}/${totalCount}项`, 'normal');\n  }\n}\n\n/**\n * 翻译输入的文本或文件\n */\nasync function handleTranslateInput(\n  manager: TranslationManager,\n  input: string,\n  from: string,\n  to: string\n): Promise<void> {\n  let text = input;\n\n  // 检查是否是文件路径\n  if (fileExists(input)) {\n    try {\n      text = await readFile(input, 'utf-8');\n      Logger.info(`从文件读取内容: ${input}`);\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n      throw new Error(`读取文件失败: ${errorMessage}`);\n    }\n  }\n\n  Logger.info(`正在翻译 (${from} -> ${to})...`, 'normal');\n  const result = await manager.translate(text, from, to);\n\n  Logger.info('翻译结果:', 'normal');\n  Logger.info(`原文 (${result.sourceLanguage}): ${result.originalText}`, 'normal');\n  Logger.success(`译文 (${result.targetLanguage}): ${result.translatedText}`, 'normal');\n  Logger.info(`提供者: ${result.provider}`, 'verbose');\n}\n\n/**\n * 显示使用帮助\n */\nfunction showUsageHelp(): void {\n  Logger.error('请指定翻译内容：', 'minimal');\n  Logger.info('   使用 -i 指定文本或文件路径', 'normal');\n  Logger.info('   使用 -j 指定JSON文件路径', 'normal');\n  Logger.info('   使用 --batch 批量翻译语言文件', 'normal');\n  Logger.info('   使用 --test -i \"文本\" 测试翻译', 'normal');\n  Logger.info('   使用 --incremental=false 禁用增量翻译模式', 'normal');\n}\n","// CLI工具入口文件\nimport './cli';\nexport * from './ast';\nexport * from './config';\nexport * from './gen-key-value';\nexport * from './utils/fs';\n","import { Command } from 'commander';\n// 处理CommonJS兼容性\nconst inquirer = require('inquirer').default ?? require('inquirer');\nimport { loadConfig, ConfigManager } from './config';\nimport { scanAndReplaceAll } from './ast';\nimport { writeJson } from './utils/fs';\nimport { defaultConfig } from './config/default.config';\nimport { version } from '../package.json';\nimport { Logger } from './utils/logger';\nimport { ConfigValidator } from './utils/config-validator';\n\nconst program = new Command();\n\nprogram\n  .name('i18n-xy')\n  .description('自动提取React项目中的中文字符串并国际化')\n  .version(version);\n\nprogram\n  .command('init')\n  .description('初始化i18n配置')\n  .action(async () => {\n    const answers = await inquirer.prompt([\n      {\n        type: 'input',\n        name: 'outputDir',\n        message: '请输入国际化文件输出目录:',\n        default: 'locales',\n      },\n      {\n        type: 'input',\n        name: 'configPath',\n        message: '请输入配置文件保存路径:',\n        default: './i18n.config.json',\n      },\n    ]);\n\n    const config = {\n      ...defaultConfig,\n      outputDir: answers.outputDir,\n    };\n\n    try {\n      await writeJson(answers.configPath, config, true);\n      Logger.success(`配置文件已生成: ${answers.configPath}`, 'minimal');\n      Logger.info('你可以根据项目需求修改配置文件。', 'normal');\n    } catch (error) {\n      Logger.error(`配置文件生成失败: ${error}`, 'minimal');\n      process.exit(1);\n    }\n  });\n\nprogram\n  .command('extract')\n  .description('提取中文并生成i18n key-value')\n  .option('-c, --config <path>', '指定配置文件路径', './i18n.config.json')\n  .action(async (options) => {\n    try {\n      Logger.info(`开始加载配置文件: ${options.config}`, 'verbose');\n      const config = loadConfig(options.config);\n      ConfigManager.init(config);\n\n      // 执行配置验证\n      const validation = ConfigValidator.validateConfigUsage();\n      if (!validation.isValid) {\n        Logger.error('配置验证失败，无法继续执行', 'minimal');\n        process.exit(1);\n      }\n\n      ConfigValidator.checkConfigConsistency();\n      Logger.info('配置加载完成，开始执行提取与替换流程...', 'normal');\n      await scanAndReplaceAll();\n      Logger.success('提取与替换流程已完成', 'minimal');\n    } catch (error) {\n      Logger.error(`提取过程中发生错误: ${error}`, 'minimal');\n      process.exit(1);\n    }\n  });\n\nprogram\n  .command('translate')\n  .description('翻译中文字符串到其他语言')\n  .option('-c, --config <path>', '指定配置文件路径', './i18n.config.json')\n  .option('-f, --from <from>', '源语言代码（如：zh, en, auto）')\n  .option('-t, --to <to>', '目标语言代码（如：en, zh, ja, ko）')\n  .option('-i, --input <input>', '要翻译的文本或文件路径')\n  .option('-j, --json <json>', '指定要翻译的JSON文件路径')\n  .option('--batch', '批量翻译语言文件（从配置的源语言文件翻译）')\n  .option('--test', '测试模式：翻译单个文本')\n  .action(async (options) => {\n    try {\n      Logger.info('开始执行翻译命令...', 'verbose');\n      const { translateCommand } = await import('./translation/cli');\n      await translateCommand(options);\n    } catch (error) {\n      Logger.error(`翻译失败: ${error}`, 'minimal');\n      process.exit(1);\n    }\n  });\n\nprogram.parse();\n","import { parse } from '@babel/parser';\nimport * as t from '@babel/types';\nimport { findTargetFiles, readFile, writeFileWithTempDir } from '../utils/fs';\nimport { ConfigManager } from '../config';\nimport { createI18nKey, initI18nCache, flushI18nCache } from '../gen-key-value';\nimport { Logger } from '../utils/logger';\nimport { ImportManager } from '../utils/import-manager';\n\n// 简单的require导入，只针对有兼容性问题的模块\nconst traverse = require('@babel/traverse').default;\nconst generate = require('@babel/generator').default;\n\n// 中文字符正则\nconst CHINESE_RE = /[\\u4e00-\\u9fa5]/;\n\n/**\n * 检查节点是否在不应该替换的位置\n * 包括：TypeScript 类型位置、对象属性键、import/export 语句等\n */\nfunction isInTypePosition(path: any): boolean {\n  let current = path;\n\n  while (current) {\n    const parent = current.parent;\n    const parentPath = current.parentPath;\n\n    if (!parent || !parentPath) break;\n\n    // 检查是否是对象属性的键\n    if (t.isObjectProperty(parent) && parent.key === current.node) {\n      return true;\n    }\n\n    // 检查是否是对象方法的键\n    if (t.isObjectMethod(parent) && parent.key === current.node) {\n      return true;\n    }\n\n    // 检查是否在 import/export 语句中\n    if (\n      t.isImportDeclaration(parent) ||\n      t.isExportDeclaration(parent) ||\n      t.isImportSpecifier(parent) ||\n      t.isExportSpecifier(parent)\n    ) {\n      return true;\n    }\n\n    // 检查各种 TypeScript 类型上下文\n    if (\n      t.isTSTypeAnnotation(parent) || // : string\n      t.isTSLiteralType(parent) || // type T = \"literal\"\n      t.isTSUnionType(parent) || // \"a\" | \"b\"\n      t.isTSIntersectionType(parent) || // A & B\n      t.isTSTypeReference(parent) || // SomeType<T>\n      t.isTSTypeLiteral(parent) || // { key: \"value\" }\n      t.isTSInterfaceDeclaration(parent) || // interface I {}\n      t.isTSTypeAliasDeclaration(parent) || // type T = ...\n      t.isTSEnumDeclaration(parent) || // enum E {}\n      t.isTSEnumMember(parent) || // A = \"value\"  -- 但需要特殊处理枚举成员的值\n      t.isTSPropertySignature(parent) || // { prop: \"type\" }\n      t.isTSMethodSignature(parent) || // { method(): \"return\" }\n      t.isTSCallSignatureDeclaration(parent) || // { (): \"return\" }\n      t.isTSConstructSignatureDeclaration(parent) || // { new(): \"type\" }\n      t.isTSIndexSignature(parent) || // { [key: string]: \"value\" }\n      t.isTSMappedType(parent) || // { [K in keyof T]: \"value\" }\n      t.isTSConditionalType(parent) || // T extends \"literal\" ? A : B\n      t.isTSInferType(parent) || // infer R\n      t.isTSTypeParameter(parent) || // <T extends \"literal\">\n      t.isTSTypeParameterDeclaration(parent) // <T = \"default\">\n    ) {\n      // 特殊处理: 枚举成员值需要进行替换，但枚举成员名称不需要\n      if (t.isTSEnumMember(parent) && parent.initializer === current.node) {\n        return false; // 枚举成员的值需要替换，所以不在类型位置\n      }\n      return true;\n    }\n\n    // 检查是否在泛型参数中\n    if (t.isTSTypeParameterInstantiation(parent)) {\n      return true;\n    }\n\n    // 检查是否在类属性的键位置\n    if (t.isClassProperty(parent) && parent.key === current.node) {\n      return true;\n    }\n\n    // 检查是否在成员表达式的属性位置 (obj.property)\n    if (t.isMemberExpression(parent) && parent.property === current.node && !parent.computed) {\n      return true;\n    }\n\n    // 向上遍历\n    current = parentPath;\n  }\n\n  return false;\n}\n\n/**\n * 检查字符串是否包含中文\n */\nfunction containsChinese(str: string): boolean {\n  return CHINESE_RE.test(str);\n}\n\n/**\n * 创建国际化替换表达式\n */\nfunction createI18nCallExpression(\n  functionName: string,\n  key: string,\n  quoteType: 'single' | 'double'\n): t.CallExpression {\n  const keyNode = t.stringLiteral(key);\n\n  // 当需要双引号时，确保节点具有正确的引号类型\n  if (quoteType === 'double' && keyNode.extra) {\n    keyNode.extra = { ...keyNode.extra, raw: `\"${key}\"`, rawValue: key };\n  }\n\n  return t.callExpression(t.identifier(functionName), [keyNode]);\n}\n\n/**\n * 处理字符串字面量\n */\nfunction handleStringLiteral(\n  path: any,\n  functionName: string,\n  quoteType: 'single' | 'double'\n): boolean {\n  // 跳过类型定义位置的字符串字面量\n  if (isInTypePosition(path)) {\n    return false;\n  }\n\n  const stringValue = path.node.value;\n  if (stringValue && typeof stringValue === 'string' && containsChinese(stringValue)) {\n    const key = createI18nKey(stringValue);\n\n    // 根据配置创建带有适当引号类型的函数调用\n    const callExpression = createI18nCallExpression(functionName, key, quoteType);\n    path.replaceWith(callExpression);\n\n    return true;\n  }\n\n  return false;\n}\n\nexport async function scanAndReplaceAll(): Promise<void> {\n  const config = ConfigManager.get();\n\n  Logger.info('开始扫描和替换中文字符串...', 'normal');\n  Logger.verbose(`配置信息: \n    - include: ${JSON.stringify(config.include)}\n    - exclude: ${JSON.stringify(config.exclude)}\n    - outputDir: ${config.outputDir}\n    - locale: ${config.locale}\n    - tempDir: ${config.tempDir || '无'}`);\n\n  Logger.info('初始化i18n缓存...', 'verbose');\n  await initI18nCache();\n\n  Logger.info('搜索目标文件...', 'verbose');\n  const files = await findTargetFiles(config.include, config.exclude);\n\n  if (files.length === 0) {\n    Logger.warn('没有找到匹配的文件', 'normal');\n    return;\n  }\n\n  Logger.info(`找到 ${files.length} 个文件需要处理`, 'normal');\n  Logger.verbose(`文件列表: ${files.join(', ')}`);\n\n  // 获取替换配置\n  const functionName = config.replacement?.functionName ?? '$t';\n  const quoteType = config.replacement?.quoteType ?? 'single';\n  const autoImportEnabled = config.replacement?.autoImport?.enabled ?? false;\n  const insertPosition = config.replacement?.autoImport?.insertPosition ?? 'afterImports';\n  const imports = config.replacement?.autoImport?.imports ?? {};\n\n  Logger.verbose(`替换配置:\n    - 函数名: ${functionName}\n    - 引号类型: ${quoteType}\n    - 自动导入: ${autoImportEnabled ? '启用' : '禁用'}\n    - 插入位置: ${insertPosition}`);\n\n  // 统计变量\n  let processedCount = 0;\n  let modifiedCount = 0;\n  let totalReplacements = 0;\n\n  // 创建import管理器实例\n  const importManager = new ImportManager();\n\n  for (const file of files) {\n    processedCount++;\n    Logger.info(`[${processedCount}/${files.length}] 处理文件: ${file}`, 'verbose');\n    Logger.verbose(`正在处理文件: ${file}`);\n    const code = await readFile(file, 'utf-8');\n\n    let ast;\n    try {\n      ast = parse(code, {\n        sourceType: 'unambiguous',\n        plugins: ['jsx', 'typescript', 'classProperties', 'decorators-legacy', 'dynamicImport'],\n      });\n    } catch (error) {\n      Logger.warn(`解析文件失败: ${file}`, 'minimal');\n      Logger.verbose(`错误详情: ${error}`);\n      continue;\n    }\n\n    // 重置import管理器状态\n    importManager.reset();\n\n    // 跟踪是否发生了替换\n    let hasReplacement = false;\n    let fileReplacements = 0;\n\n    traverse(ast, {\n      // 处理普通字符串字面量\n      StringLiteral(path: any) {\n        if (handleStringLiteral(path, functionName, quoteType)) {\n          hasReplacement = true;\n          fileReplacements++;\n          const stringValue = path.node.value;\n          Logger.verbose(\n            `替换字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${stringValue}${quoteType === 'single' ? \"'\" : '\"'})`\n          );\n        }\n      },\n\n      // 处理模板字符串元素\n      TemplateElement(path: any) {\n        // 跳过类型定义位置的模板字符串\n        if (isInTypePosition(path)) {\n          return;\n        }\n\n        const raw = path.node.value?.raw;\n        if (raw && typeof raw === 'string' && containsChinese(raw)) {\n          // 替换所有中文片段为${$t('key')}，保留非中文和插值\n          const SEPARATOR = '\\u{1F4D6}'; // 使用书本emoji作为分隔符，避免控制字符问题\n          const replaced = raw.replace(\n            /[\\u4e00-\\u9fa5]+/g,\n            (match: string) => `${SEPARATOR}${match}${SEPARATOR}`\n          );\n          const parts = replaced\n            .split(new RegExp(`${SEPARATOR}([\\\\u4e00-\\\\u9fa5]+)${SEPARATOR}`, 'g'))\n            .filter(Boolean);\n          let result = '';\n\n          // 根据配置选择引号类型\n          const quoteChar = quoteType === 'single' ? \"'\" : '\"';\n\n          for (const part of parts) {\n            if (/^[\\u4e00-\\u9fa5]+$/.test(part)) {\n              const key = createI18nKey(part);\n              result += '${' + functionName + '(' + quoteChar + key + quoteChar + ')}';\n            } else {\n              result += part;\n            }\n          }\n          path.node.value.raw = result;\n          path.node.value.cooked = result;\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(`替换模板字符串中的中文片段`);\n        }\n      },\n\n      // 处理模板字符串\n      TemplateLiteral(path: any) {\n        // 特殊处理像 `计数器：${count}次` 这样的模板字符串\n        if (\n          path.node.expressions &&\n          path.node.expressions.length === 1 &&\n          path.node.quasis &&\n          path.node.quasis.length === 2\n        ) {\n          const firstQuasi = path.node.quasis[0];\n          const secondQuasi = path.node.quasis[1];\n          const expr = path.node.expressions[0];\n\n          // 确保所有需要的元素都存在，并且 expr 是表达式类型\n          if (\n            firstQuasi?.value &&\n            firstQuasi.value.raw !== undefined &&\n            secondQuasi?.value &&\n            secondQuasi.value.raw !== undefined &&\n            expr &&\n            t.isExpression(expr)\n          ) {\n            // 特殊处理字符串字面量表达式，如 `标题：${'中文标题'}`\n            if (t.isStringLiteral(expr) && containsChinese(expr.value)) {\n              const exprValue = expr.value;\n              const exprKey = createI18nKey(exprValue);\n              const exprCallExpression = createI18nCallExpression(functionName, exprKey, quoteType);\n\n              // 检查第一个 quasi 是否包含中文\n              if (containsChinese(firstQuasi.value.raw) && firstQuasi.value.raw.trim() !== '') {\n                const firstKey = createI18nKey(firstQuasi.value.raw);\n                const firstCallExpression = createI18nCallExpression(\n                  functionName,\n                  firstKey,\n                  quoteType\n                );\n\n                // 如果第二个 quasi 也包含中文\n                if (containsChinese(secondQuasi.value.raw) && secondQuasi.value.raw.trim() !== '') {\n                  const secondKey = createI18nKey(secondQuasi.value.raw);\n                  const secondCallExpression = createI18nCallExpression(\n                    functionName,\n                    secondKey,\n                    quoteType\n                  );\n\n                  // 创建一个表达式拼接：$t('key1') + $t('exprKey') + $t('key2')\n                  const result1 = t.binaryExpression('+', firstCallExpression, exprCallExpression);\n                  const result = t.binaryExpression('+', result1, secondCallExpression);\n\n                  path.replaceWith(result);\n                  hasReplacement = true;\n                  fileReplacements++;\n                  Logger.verbose(\n                    `替换模板字符串中的中文字符串和前后缀: \\`${firstQuasi.value.raw}\\${${exprValue}}${secondQuasi.value.raw}\\``\n                  );\n                } else {\n                  // 创建一个表达式拼接：$t('key1') + $t('exprKey')\n                  const result = t.binaryExpression('+', firstCallExpression, exprCallExpression);\n\n                  path.replaceWith(result);\n                  hasReplacement = true;\n                  fileReplacements++;\n                  Logger.verbose(\n                    `替换模板字符串中的中文字符串和前缀: \\`${firstQuasi.value.raw}\\${${exprValue}}\\``\n                  );\n                }\n              }\n              // 检查第二个 quasi 是否包含中文，第一个 quasi 是否为空或不包含中文\n              else if (\n                containsChinese(secondQuasi.value.raw) &&\n                secondQuasi.value.raw.trim() !== ''\n              ) {\n                const secondKey = createI18nKey(secondQuasi.value.raw);\n                const secondCallExpression = createI18nCallExpression(\n                  functionName,\n                  secondKey,\n                  quoteType\n                );\n\n                // 创建一个表达式拼接：$t('exprKey') + $t('key2')\n                const result = t.binaryExpression('+', exprCallExpression, secondCallExpression);\n\n                path.replaceWith(result);\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换模板字符串中的中文字符串和后缀: \\`\\${${exprValue}}${secondQuasi.value.raw}\\``\n                );\n              } else {\n                // 如果前后缀都不包含中文，只替换表达式部分\n                path.replaceWith(exprCallExpression);\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(`替换模板字符串中的中文字符串: \\`\\${${exprValue}}\\``);\n              }\n\n              // 已经处理过了，不需要继续下面的处理\n              return;\n            }\n\n            // 检查第一个 quasi 是否包含中文，第二个 quasi 是否为空或不包含中文\n            if (containsChinese(firstQuasi.value.raw) && firstQuasi.value.raw.trim() !== '') {\n              const chineseText = firstQuasi.value.raw;\n              const key = createI18nKey(chineseText);\n\n              // 如果第二个 quasi 也包含中文，则需要分别处理\n              if (containsChinese(secondQuasi.value.raw) && secondQuasi.value.raw.trim() !== '') {\n                const secondKey = createI18nKey(secondQuasi.value.raw);\n\n                // 创建一个表达式拼接：$t('key1') + expr + $t('key2')\n                const callExpression1 = createI18nCallExpression(functionName, key, quoteType);\n                const callExpression2 = createI18nCallExpression(\n                  functionName,\n                  secondKey,\n                  quoteType\n                );\n                const result1 = t.binaryExpression('+', callExpression1, expr);\n                const result = t.binaryExpression('+', result1, callExpression2);\n\n                path.replaceWith(result);\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换模板字符串中的前后缀中文: \\`${chineseText}\\${expr}${secondQuasi.value.raw}\\` -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'}) + expr + ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${secondKey}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              } else {\n                // 创建一个表达式拼接：$t('key') + expr\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                const result = t.binaryExpression('+', callExpression, expr);\n\n                path.replaceWith(result);\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换模板字符串中的前缀中文: \\`${chineseText}\\${expr}\\` -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'}) + expr`\n                );\n              }\n            }\n            // 检查第二个 quasi 是否包含中文，第一个 quasi 是否为空或不包含中文\n            else if (\n              containsChinese(secondQuasi.value.raw) &&\n              secondQuasi.value.raw.trim() !== ''\n            ) {\n              const chineseText = secondQuasi.value.raw;\n              const key = createI18nKey(chineseText);\n\n              // 创建一个表达式拼接：expr + $t('key')\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              const result = t.binaryExpression('+', expr, callExpression);\n\n              path.replaceWith(result);\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换模板字符串中的后缀中文: \\`\\${expr}${chineseText}\\` -> expr + ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            }\n          }\n        }\n\n        // 检查表达式部分是否包含需要替换的字符串字面量\n        if (path.node.expressions) {\n          path.node.expressions.forEach((expr: any, index: number) => {\n            if (expr && t.isStringLiteral(expr) && containsChinese(expr.value)) {\n              const stringValue = expr.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换模板字符串表达式中的字符串\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              path.node.expressions[index] = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换模板字符串表达式中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            } else if (expr && t.isTemplateLiteral(expr)) {\n              // 处理嵌套的模板字符串\n              if (expr.expressions) {\n                expr.expressions.forEach((nestedExpr: any, nestedIndex: number) => {\n                  if (\n                    nestedExpr &&\n                    t.isStringLiteral(nestedExpr) &&\n                    containsChinese(nestedExpr.value)\n                  ) {\n                    const stringValue = nestedExpr.value;\n                    const key = createI18nKey(stringValue);\n\n                    // 替换嵌套模板字符串中的表达式\n                    const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                    expr.expressions[nestedIndex] = callExpression;\n\n                    hasReplacement = true;\n                    fileReplacements++;\n                    Logger.verbose(\n                      `替换嵌套模板字符串表达式中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                    );\n                  }\n                });\n              }\n\n              // 处理嵌套模板字符串的 quasis 部分\n              if (expr.quasis) {\n                expr.quasis.forEach((quasi: any) => {\n                  if (\n                    quasi?.value &&\n                    quasi.value.raw !== undefined &&\n                    containsChinese(quasi.value.raw) &&\n                    quasi.value.raw.trim() !== ''\n                  ) {\n                    // 这里我们不直接替换，而是在外层处理\n                    Logger.verbose(`检测到嵌套模板字符串中的中文，将在外层处理`);\n                  }\n                });\n              }\n            }\n          });\n        }\n\n        // 对于完整的模板字符串，可能需要直接替换整个模板字符串\n        if (\n          path.node.expressions &&\n          path.node.expressions.length === 0 &&\n          path.node.quasis &&\n          path.node.quasis.length === 1\n        ) {\n          const firstQuasi = path.node.quasis[0];\n          if (firstQuasi?.value && firstQuasi.value.raw !== undefined) {\n            const templateValue = firstQuasi.value.raw;\n            if (containsChinese(templateValue) && !isInTypePosition(path)) {\n              const key = createI18nKey(templateValue);\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              path.replaceWith(callExpression);\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换完整模板字符串: \\`${templateValue}\\` -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            }\n          }\n        }\n\n        // 处理模板字符串中的中文部分，即使有表达式也能处理\n        if (path.node.quasis && path.node.quasis.length > 0) {\n          let hasChinesePart = false;\n\n          // 检查是否有中文部分\n          for (const quasi of path.node.quasis) {\n            if (quasi?.value && quasi.value.raw !== undefined && containsChinese(quasi.value.raw)) {\n              hasChinesePart = true;\n              break;\n            }\n          }\n\n          // 如果有中文部分，需要将模板字符串转换为多个表达式的拼接\n          if (hasChinesePart && !isInTypePosition(path)) {\n            // 创建一个数组来存储转换后的表达式部分\n            const parts = [];\n\n            // 处理每个模板部分\n            for (let i = 0; i < path.node.quasis.length; i++) {\n              const quasi = path.node.quasis[i];\n              if (quasi?.value && quasi.value.raw !== undefined) {\n                const raw = quasi.value.raw;\n\n                // 如果这部分包含中文，则替换\n                if (containsChinese(raw) && raw.trim() !== '') {\n                  const key = createI18nKey(raw);\n                  const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                  parts.push(callExpression);\n                } else if (raw.trim() !== '') {\n                  // 否则保留原始字符串\n                  parts.push(t.stringLiteral(raw));\n                }\n              }\n\n              // 添加表达式部分（如果有）\n              if (path.node.expressions && i < path.node.expressions.length) {\n                const expr = path.node.expressions[i];\n                if (expr) {\n                  // 特殊处理字符串字面量表达式\n                  if (t.isStringLiteral(expr) && containsChinese(expr.value)) {\n                    const key = createI18nKey(expr.value);\n                    const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                    parts.push(callExpression);\n                  } else {\n                    parts.push(expr);\n                  }\n                }\n              }\n            }\n\n            // 创建一个二元表达式来连接所有部分\n            if (parts.length > 0) {\n              let result = parts[0];\n              for (let i = 1; i < parts.length; i++) {\n                result = t.binaryExpression('+', result, parts[i]);\n              }\n\n              path.replaceWith(result);\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(`替换包含中文的模板字符串为表达式拼接`);\n            }\n          }\n        }\n      },\n\n      // 处理JSX文本节点\n      JSXText(path: any) {\n        const textValue = path.node.value;\n        if (textValue && typeof textValue === 'string' && containsChinese(textValue)) {\n          const trimmedValue = textValue.trim();\n          if (trimmedValue) {\n            // 确保trim后不是空字符串\n            const key = createI18nKey(trimmedValue);\n\n            // 创建JSX表达式容器\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            path.replaceWith(t.jsxExpressionContainer(callExpression));\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换JSX文本: \"${trimmedValue}\" -> {${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})}`\n            );\n          }\n        }\n      },\n\n      // 处理JSX属性\n      JSXAttribute(path: any) {\n        if (\n          t.isStringLiteral(path.node.value) &&\n          path.node.value.value &&\n          typeof path.node.value.value === 'string' &&\n          containsChinese(path.node.value.value)\n        ) {\n          const attributeValue = path.node.value.value;\n          const key = createI18nKey(attributeValue);\n\n          // 创建JSX表达式容器作为属性值\n          const callExpression = createI18nCallExpression(functionName, key, quoteType);\n          path.node.value = t.jsxExpressionContainer(callExpression);\n\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(\n            `替换JSX属性: \"${attributeValue}\" -> {${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})}`\n          );\n        }\n      },\n\n      // 处理JSX表达式容器中的字符串字面量\n      JSXExpressionContainer(path: any) {\n        const expression = path.node.expression;\n        if (t.isStringLiteral(expression) && containsChinese(expression.value)) {\n          const stringValue = expression.value;\n          const key = createI18nKey(stringValue);\n\n          // 替换表达式容器中的字符串\n          const callExpression = createI18nCallExpression(functionName, key, quoteType);\n          path.node.expression = callExpression;\n\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(\n            `替换JSX表达式容器中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n          );\n        }\n        // 处理JSX表达式容器中的模板字符串\n        else if (t.isTemplateLiteral(expression)) {\n          let hasChineseInTemplate = false;\n\n          // 检查模板字符串的静态部分\n          expression.quasis.forEach((quasi: any) => {\n            if (containsChinese(quasi.value.raw)) {\n              hasChineseInTemplate = true;\n            }\n          });\n\n          // 检查模板字符串的表达式部分\n          expression.expressions.forEach((expr: any) => {\n            if (t.isStringLiteral(expr) && containsChinese(expr.value)) {\n              hasChineseInTemplate = true;\n            }\n          });\n\n          // 如果模板字符串包含中文，需要递归处理\n          if (hasChineseInTemplate) {\n            // 这里不直接替换，因为 traverse 会自动访问到这个模板字符串\n            Logger.verbose(`检测到JSX表达式容器中的模板字符串包含中文，将递归处理`);\n          }\n        }\n        // 处理JSX表达式容器中的三元表达式\n        else if (t.isConditionalExpression(expression)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个三元表达式\n          Logger.verbose(`检测到JSX表达式容器中的三元表达式，将递归处理`);\n        }\n      },\n\n      // 处理三元表达式中的字符串\n      ConditionalExpression(path: any) {\n        // 处理三元表达式的测试部分\n        if (t.isStringLiteral(path.node.test) && containsChinese(path.node.test.value)) {\n          const stringValue = path.node.test.value;\n          const key = createI18nKey(stringValue);\n\n          // 替换三元表达式测试部分的字符串\n          const callExpression = createI18nCallExpression(functionName, key, quoteType);\n          path.node.test = callExpression;\n\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(\n            `替换三元表达式测试部分的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n          );\n        }\n\n        // 处理三元表达式的结果部分\n        ['consequent', 'alternate'].forEach((key) => {\n          const node = path.node[key];\n\n          // 处理直接的字符串字面量\n          if (t.isStringLiteral(node) && containsChinese(node.value)) {\n            const stringValue = node.value;\n            const i18nKey = createI18nKey(stringValue);\n\n            // 替换三元表达式结果中的字符串\n            const callExpression = createI18nCallExpression(functionName, i18nKey, quoteType);\n            path.node[key] = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换三元表达式中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${i18nKey}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n          // 处理模板字符串\n          else if (t.isTemplateLiteral(node)) {\n            // 如果模板字符串只有一个表达式和两个 quasis，并且其中一个 quasi 包含中文\n            if (node.expressions.length === 1 && node.quasis.length === 2) {\n              const firstQuasi = node.quasis[0];\n              const secondQuasi = node.quasis[1];\n              const expr = node.expressions[0];\n\n              // 确保所有需要的元素都存在，并且 expr 是表达式类型\n              if (firstQuasi && secondQuasi && expr && t.isExpression(expr)) {\n                // 检查第一个 quasi 是否包含中文\n                if (containsChinese(firstQuasi.value.raw) && firstQuasi.value.raw.trim() !== '') {\n                  const chineseText = firstQuasi.value.raw;\n                  const key = createI18nKey(chineseText);\n\n                  // 创建一个表达式拼接：$t('key') + expr\n                  const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                  const result = t.binaryExpression('+', callExpression, expr);\n\n                  path.node[key] = result;\n                  hasReplacement = true;\n                  fileReplacements++;\n                  Logger.verbose(\n                    `替换三元表达式中模板字符串的前缀中文: \\`${chineseText}\\${expr}\\` -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'}) + expr`\n                  );\n                }\n\n                // 检查第二个 quasi 是否包含中文\n                if (containsChinese(secondQuasi.value.raw) && secondQuasi.value.raw.trim() !== '') {\n                  const chineseText = secondQuasi.value.raw;\n                  const key = createI18nKey(chineseText);\n\n                  // 创建一个表达式拼接：expr + $t('key')\n                  const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                  const result = t.binaryExpression('+', expr, callExpression);\n\n                  path.node[key] = result;\n                  hasReplacement = true;\n                  fileReplacements++;\n                  Logger.verbose(\n                    `替换三元表达式中模板字符串的后缀中文: \\`\\${expr}${chineseText}\\` -> expr + ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                  );\n                }\n              }\n            }\n            // 对于更复杂的模板字符串，递归处理\n            else {\n              // 这里不直接替换，因为 traverse 会自动访问到这个模板字符串\n              Logger.verbose(`检测到三元表达式中的复杂模板字符串，将递归处理`);\n            }\n          }\n          // 处理嵌套的三元表达式\n          else if (t.isConditionalExpression(node)) {\n            // 这里不直接替换，因为 traverse 会自动访问到这个嵌套的三元表达式\n            Logger.verbose(`检测到嵌套的三元表达式，将递归处理`);\n          }\n        });\n      },\n\n      // 处理对象属性的值\n      ObjectProperty(path: any) {\n        const valueNode = path.node.value;\n\n        // 只处理值部分，键名不处理\n        if (\n          t.isStringLiteral(valueNode) &&\n          !path.node.computed &&\n          containsChinese(valueNode.value)\n        ) {\n          // 判断是否在特殊上下文中（如TypeScript类型）\n          if (!isInTypePosition(path.get('value'))) {\n            const stringValue = valueNode.value;\n            const key = createI18nKey(stringValue);\n\n            // 替换对象属性值\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            path.node.value = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换对象属性值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n        }\n      },\n\n      // 处理对象表达式中的属性\n      ObjectExpression(path: any) {\n        path.node.properties.forEach((property: any) => {\n          if (\n            t.isObjectProperty(property) &&\n            t.isStringLiteral(property.value) &&\n            containsChinese(property.value.value)\n          ) {\n            // 确保不在类型位置\n            if (!isInTypePosition(path)) {\n              const stringValue = property.value.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换对象表达式中的字符串属性值\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              property.value = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换对象表达式中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            }\n          }\n          // 处理嵌套对象\n          else if (t.isObjectProperty(property) && t.isObjectExpression(property.value)) {\n            // 递归处理嵌套对象的属性\n            property.value.properties.forEach((nestedProp: any) => {\n              if (\n                t.isObjectProperty(nestedProp) &&\n                t.isStringLiteral(nestedProp.value) &&\n                containsChinese(nestedProp.value.value)\n              ) {\n                const stringValue = nestedProp.value.value;\n                const key = createI18nKey(stringValue);\n\n                // 替换嵌套对象中的字符串属性值\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                nestedProp.value = callExpression;\n\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换嵌套对象中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              }\n            });\n          }\n        });\n      },\n\n      // 处理函数调用参数中的对象表达式\n      CallExpression(path: any) {\n        // 处理 useState 调用的初始值\n        if (t.isIdentifier(path.node.callee) && path.node.callee.name === 'useState') {\n          // useState 调用通常只有一个参数，即初始值\n          if (path.node.arguments.length === 1) {\n            const initialValue = path.node.arguments[0];\n\n            // 处理字符串字面量作为初始值\n            if (t.isStringLiteral(initialValue) && containsChinese(initialValue.value)) {\n              const stringValue = initialValue.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换 useState 初始值\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              path.node.arguments[0] = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换 useState 初始值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            }\n            // 处理模板字符串作为初始值\n            else if (t.isTemplateLiteral(initialValue)) {\n              // 这里不直接替换，因为 traverse 会自动访问到这个模板字符串\n              Logger.verbose(`检测到 useState 初始值为模板字符串，将递归处理`);\n            }\n            // 处理对象表达式作为初始值\n            else if (t.isObjectExpression(initialValue)) {\n              // 这里不直接替换，因为 traverse 会自动访问到这个对象表达式\n              Logger.verbose(`检测到 useState 初始值为对象表达式，将递归处理`);\n            }\n            // 处理数组表达式作为初始值\n            else if (t.isArrayExpression(initialValue)) {\n              // 这里不直接替换，因为 traverse 会自动访问到这个数组表达式\n              Logger.verbose(`检测到 useState 初始值为数组表达式，将递归处理`);\n            }\n          }\n        }\n\n        // 处理 setState 调用\n        if (\n          t.isCallExpression(path.node.callee) &&\n          t.isMemberExpression(path.node.callee.callee) &&\n          t.isIdentifier(path.node.callee.callee.property) &&\n          path.node.callee.callee.property.name === 'useState'\n        ) {\n          // setState 调用通常只有一个参数\n          if (path.node.arguments.length === 1) {\n            const setValue = path.node.arguments[0];\n\n            // 处理字符串字面量作为设置值\n            if (t.isStringLiteral(setValue) && containsChinese(setValue.value)) {\n              const stringValue = setValue.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换 setState 参数\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              path.node.arguments[0] = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换 setState 参数: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            }\n          }\n        }\n\n        // 处理 setError 等 setter 函数调用\n        if (\n          t.isIdentifier(path.node.callee) &&\n          path.node.callee.name.startsWith('set') &&\n          path.node.callee.name.length > 3 &&\n          path.node.callee.name[3].toUpperCase() === path.node.callee.name[3]\n        ) {\n          // setter 调用通常只有一个参数\n          if (path.node.arguments.length === 1) {\n            const setValue = path.node.arguments[0];\n\n            // 处理字符串字面量作为设置值\n            if (t.isStringLiteral(setValue) && containsChinese(setValue.value)) {\n              const stringValue = setValue.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换 setter 参数\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              path.node.arguments[0] = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换 setter 函数参数: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            }\n            // 处理模板字符串作为设置值\n            else if (t.isTemplateLiteral(setValue)) {\n              // 这里不直接替换，因为 traverse 会自动访问到这个模板字符串\n              Logger.verbose(`检测到 setter 函数参数为模板字符串，将递归处理`);\n            }\n            // 处理对象表达式作为设置值\n            else if (t.isObjectExpression(setValue)) {\n              // 这里不直接替换，因为 traverse 会自动访问到这个对象表达式\n              Logger.verbose(`检测到 setter 函数参数为对象表达式，将递归处理`);\n            }\n          }\n        }\n\n        // 处理函数调用的标识符\n        if (\n          t.isIdentifier(path.node.callee) &&\n          ['alert', 'confirm', 'prompt'].includes(path.node.callee.name)\n        ) {\n          // 特殊处理常见的浏览器API\n          path.node.arguments.forEach((arg: any, index: number) => {\n            if (t.isStringLiteral(arg) && containsChinese(arg.value)) {\n              const stringValue = arg.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换浏览器API调用参数\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              path.node.arguments[index] = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换${path.node.callee.name}调用参数: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            }\n          });\n        }\n\n        // 处理所有函数调用参数\n        path.node.arguments.forEach((arg: any, index: number) => {\n          if (t.isStringLiteral(arg) && containsChinese(arg.value)) {\n            // 确保不在类型参数中\n            if (!isInTypePosition(path.get(`arguments.${index}`))) {\n              const stringValue = arg.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换函数调用参数\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              path.node.arguments[index] = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换函数调用参数: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            }\n          }\n\n          // 处理对象表达式参数\n          if (t.isObjectExpression(arg)) {\n            arg.properties.forEach((prop: any) => {\n              if (\n                t.isObjectProperty(prop) &&\n                t.isStringLiteral(prop.value) &&\n                containsChinese(prop.value.value)\n              ) {\n                const stringValue = prop.value.value;\n                const key = createI18nKey(stringValue);\n\n                // 替换对象表达式参数中的字符串\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                prop.value = callExpression;\n\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换函数调用对象参数中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              }\n\n              // 处理嵌套对象\n              if (t.isObjectProperty(prop) && t.isObjectExpression(prop.value)) {\n                prop.value.properties.forEach((nestedProp: any) => {\n                  if (\n                    t.isObjectProperty(nestedProp) &&\n                    t.isStringLiteral(nestedProp.value) &&\n                    containsChinese(nestedProp.value.value)\n                  ) {\n                    const stringValue = nestedProp.value.value;\n                    const key = createI18nKey(stringValue);\n\n                    // 替换嵌套对象中的字符串\n                    const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                    nestedProp.value = callExpression;\n\n                    hasReplacement = true;\n                    fileReplacements++;\n                    Logger.verbose(\n                      `替换函数调用嵌套对象中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                    );\n                  }\n                });\n              }\n            });\n          }\n        });\n      },\n\n      // 处理变量声明\n      VariableDeclarator(path: any) {\n        const init = path.node.init;\n        if (t.isStringLiteral(init) && containsChinese(init.value)) {\n          const stringValue = init.value;\n          const key = createI18nKey(stringValue);\n\n          // 替换变量初始值\n          const callExpression = createI18nCallExpression(functionName, key, quoteType);\n          path.node.init = callExpression;\n\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(\n            `替换变量初始值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n          );\n        }\n        // 处理变量初始值为模板字符串的情况\n        else if (t.isTemplateLiteral(init)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个模板字符串\n          Logger.verbose(`检测到变量初始值为模板字符串，将递归处理`);\n        }\n        // 处理变量初始值为对象表达式的情况\n        else if (t.isObjectExpression(init)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个对象表达式\n          Logger.verbose(`检测到变量初始值为对象表达式，将递归处理`);\n        }\n        // 处理变量初始值为数组表达式的情况\n        else if (t.isArrayExpression(init)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个数组表达式\n          Logger.verbose(`检测到变量初始值为数组表达式，将递归处理`);\n        }\n        // 处理变量初始值为函数调用的情况\n        else if (t.isCallExpression(init)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个函数调用\n          Logger.verbose(`检测到变量初始值为函数调用，将递归处理`);\n        }\n        // 处理变量初始值为三元表达式的情况\n        else if (t.isConditionalExpression(init)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个三元表达式\n          Logger.verbose(`检测到变量初始值为三元表达式，将递归处理`);\n        }\n      },\n\n      // 处理数组表达式中的字符串元素\n      ArrayExpression(path: any) {\n        path.node.elements.forEach((element: any, index: number) => {\n          if (t.isStringLiteral(element) && containsChinese(element.value)) {\n            const stringValue = element.value;\n            const key = createI18nKey(stringValue);\n\n            // 替换数组元素\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            path.node.elements[index] = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换数组元素: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n\n          // 处理数组中的对象元素\n          if (t.isObjectExpression(element)) {\n            element.properties.forEach((prop: any) => {\n              if (\n                t.isObjectProperty(prop) &&\n                t.isStringLiteral(prop.value) &&\n                containsChinese(prop.value.value)\n              ) {\n                const stringValue = prop.value.value;\n                const key = createI18nKey(stringValue);\n\n                // 替换数组中对象属性的字符串值\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                prop.value = callExpression;\n\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换数组中对象属性的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              }\n              // 处理数组中嵌套对象的嵌套属性\n              else if (t.isObjectProperty(prop) && t.isObjectExpression(prop.value)) {\n                prop.value.properties.forEach((nestedProp: any) => {\n                  if (\n                    t.isObjectProperty(nestedProp) &&\n                    t.isStringLiteral(nestedProp.value) &&\n                    containsChinese(nestedProp.value.value)\n                  ) {\n                    const stringValue = nestedProp.value.value;\n                    const key = createI18nKey(stringValue);\n\n                    // 替换嵌套对象中的字符串\n                    const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                    nestedProp.value = callExpression;\n\n                    hasReplacement = true;\n                    fileReplacements++;\n                    Logger.verbose(\n                      `替换数组中嵌套对象的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                    );\n                  }\n                });\n              }\n            });\n          }\n        });\n      },\n\n      // 处理成员表达式赋值\n      AssignmentExpression(path: any) {\n        // 处理形如 obj.prop = '中文' 的情况\n        if (\n          t.isMemberExpression(path.node.left) &&\n          t.isStringLiteral(path.node.right) &&\n          containsChinese(path.node.right.value)\n        ) {\n          const stringValue = path.node.right.value;\n          const key = createI18nKey(stringValue);\n\n          // 替换赋值表达式右侧的字符串\n          const callExpression = createI18nCallExpression(functionName, key, quoteType);\n          path.node.right = callExpression;\n\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(\n            `替换成员表达式赋值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n          );\n        }\n        // 处理形如 obj.prop = `模板字符串` 的情况\n        else if (t.isMemberExpression(path.node.left) && t.isTemplateLiteral(path.node.right)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个模板字符串\n          Logger.verbose(`检测到成员表达式赋值中的模板字符串，将递归处理`);\n        }\n        // 处理形如 obj.prop = { key: '中文' } 的情况\n        else if (t.isMemberExpression(path.node.left) && t.isObjectExpression(path.node.right)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个对象表达式\n          Logger.verbose(`检测到成员表达式赋值中的对象表达式，将递归处理`);\n        }\n        // 处理形如 obj.prop = ['中文'] 的情况\n        else if (t.isMemberExpression(path.node.left) && t.isArrayExpression(path.node.right)) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个数组表达式\n          Logger.verbose(`检测到成员表达式赋值中的数组表达式，将递归处理`);\n        }\n        // 处理形如 obj.prop = condition ? '中文1' : '中文2' 的情况\n        else if (\n          t.isMemberExpression(path.node.left) &&\n          t.isConditionalExpression(path.node.right)\n        ) {\n          // 这里不直接替换，因为 traverse 会自动访问到这个三元表达式\n          Logger.verbose(`检测到成员表达式赋值中的三元表达式，将递归处理`);\n        }\n      },\n\n      // 处理 switch/case 语句中的字符串\n      SwitchCase(path: any) {\n        // 处理 case '中文': 这种情况\n        if (t.isStringLiteral(path.node.test) && containsChinese(path.node.test.value)) {\n          const stringValue = path.node.test.value;\n          const key = createI18nKey(stringValue);\n\n          // 替换 case 表达式中的字符串\n          const callExpression = createI18nCallExpression(functionName, key, quoteType);\n          path.node.test = callExpression;\n\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(\n            `替换 switch/case 中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n          );\n        }\n\n        // 处理 case 语句块中的字符串字面量\n        path.node.consequent.forEach((statement: any) => {\n          if (\n            t.isReturnStatement(statement) &&\n            t.isStringLiteral(statement.argument) &&\n            containsChinese(statement.argument.value)\n          ) {\n            const stringValue = statement.argument.value;\n            const key = createI18nKey(stringValue);\n\n            // 替换 return 语句中的字符串\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            statement.argument = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换 case 语句块中 return 语句的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n\n          // 处理 case 语句块中的表达式语句\n          if (\n            t.isExpressionStatement(statement) &&\n            t.isStringLiteral(statement.expression) &&\n            containsChinese(statement.expression.value)\n          ) {\n            const stringValue = statement.expression.value;\n            const key = createI18nKey(stringValue);\n\n            // 替换表达式语句中的字符串\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            statement.expression = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换 case 语句块中表达式语句的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n        });\n      },\n\n      // 处理枚举成员的值\n      TSEnumMember(path: any) {\n        const initializer = path.node.initializer;\n\n        // 只处理枚举成员的值部分\n        if (t.isStringLiteral(initializer) && containsChinese(initializer.value)) {\n          const stringValue = initializer.value;\n          const key = createI18nKey(stringValue);\n\n          // 替换枚举成员的值\n          const callExpression = createI18nCallExpression(functionName, key, quoteType);\n          path.node.initializer = callExpression;\n\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(\n            `替换枚举成员值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n          );\n        }\n      },\n\n      // 处理类属性的默认值\n      ClassProperty(path: any) {\n        const valueNode = path.node.value;\n\n        // 只处理值部分，键名不处理\n        if (valueNode && t.isStringLiteral(valueNode) && containsChinese(valueNode.value)) {\n          const stringValue = valueNode.value;\n          const key = createI18nKey(stringValue);\n\n          // 替换类属性默认值\n          const callExpression = createI18nCallExpression(functionName, key, quoteType);\n          path.node.value = callExpression;\n\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(\n            `替换类属性默认值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n          );\n        }\n      },\n\n      // 处理函数参数默认值\n      AssignmentPattern(path: any) {\n        // 只处理默认值部分，参数名不处理\n        if (t.isStringLiteral(path.node.right) && containsChinese(path.node.right.value)) {\n          // 确保不在类型声明中\n          if (!isInTypePosition(path)) {\n            const stringValue = path.node.right.value;\n            const key = createI18nKey(stringValue);\n\n            // 替换函数参数默认值\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            path.node.right = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换函数参数默认值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n        } else if (t.isTemplateLiteral(path.node.right)) {\n          // 处理模板字符串作为默认值的情况\n          let hasChineseInTemplate = false;\n\n          // 检查模板字符串的静态部分\n          path.node.right.quasis.forEach((quasi: any) => {\n            if (containsChinese(quasi.value.raw)) {\n              hasChineseInTemplate = true;\n            }\n          });\n\n          // 检查模板字符串的表达式部分\n          path.node.right.expressions.forEach((expr: any) => {\n            if (t.isStringLiteral(expr) && containsChinese(expr.value)) {\n              hasChineseInTemplate = true;\n            }\n          });\n\n          // 如果模板字符串包含中文，需要递归处理\n          if (hasChineseInTemplate) {\n            // 这里不直接替换，因为 traverse 会自动访问到这个模板字符串\n            Logger.verbose(`检测到函数参数默认值中的模板字符串包含中文，将递归处理`);\n          }\n        }\n      },\n\n      // 处理函数参数，包括对象解构中的默认值\n      ObjectPattern(path: any) {\n        // 处理对象解构模式中的属性\n        path.node.properties.forEach((property: any) => {\n          // 检查是否有默认值\n          if (\n            t.isObjectProperty(property) &&\n            t.isAssignmentPattern(property.value) &&\n            t.isStringLiteral(property.value.right) &&\n            containsChinese(property.value.right.value)\n          ) {\n            const stringValue = property.value.right.value;\n            const key = createI18nKey(stringValue);\n\n            // 替换对象解构中的默认值\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            property.value.right = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换对象解构参数默认值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n        });\n      },\n\n      // 处理函数声明参数\n      FunctionDeclaration(path: any) {\n        // 处理函数参数中的对象解构模式\n        path.node.params.forEach((param: any) => {\n          if (t.isObjectPattern(param)) {\n            param.properties.forEach((property: any) => {\n              if (\n                t.isAssignmentPattern(property.value) &&\n                t.isStringLiteral(property.value.right) &&\n                containsChinese(property.value.right.value)\n              ) {\n                const stringValue = property.value.right.value;\n                const key = createI18nKey(stringValue);\n\n                // 替换对象解构参数默认值\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                property.value.right = callExpression;\n\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换函数声明中的对象解构参数默认值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              }\n            });\n          }\n        });\n      },\n\n      // 处理函数表达式参数\n      FunctionExpression(path: any) {\n        // 处理函数参数中的对象解构模式\n        path.node.params.forEach((param: any) => {\n          if (t.isObjectPattern(param)) {\n            param.properties.forEach((property: any) => {\n              if (\n                t.isAssignmentPattern(property.value) &&\n                t.isStringLiteral(property.value.right) &&\n                containsChinese(property.value.right.value)\n              ) {\n                const stringValue = property.value.right.value;\n                const key = createI18nKey(stringValue);\n\n                // 替换对象解构参数默认值\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                property.value.right = callExpression;\n\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换函数表达式中的对象解构参数默认值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              }\n            });\n          }\n        });\n      },\n\n      // 处理箭头函数参数\n      ArrowFunctionExpression(path: any) {\n        // 处理箭头函数参数中的对象解构模式\n        path.node.params.forEach((param: any) => {\n          if (t.isObjectPattern(param)) {\n            param.properties.forEach((property: any) => {\n              if (\n                t.isAssignmentPattern(property.value) &&\n                t.isStringLiteral(property.value.right) &&\n                containsChinese(property.value.right.value)\n              ) {\n                const stringValue = property.value.right.value;\n                const key = createI18nKey(stringValue);\n\n                // 替换对象解构参数默认值\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                property.value.right = callExpression;\n\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换箭头函数中的对象解构参数默认值: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              }\n            });\n          }\n        });\n      },\n\n      // 处理console.log等方法调用内的字符串\n      MemberExpression(path: any) {\n        // 特殊处理 console.log 调用\n        if (\n          t.isIdentifier(path.node.object) &&\n          path.node.object.name === 'console' &&\n          t.isIdentifier(path.node.property)\n        ) {\n          // 获取console方法调用的父节点\n          const parent = path.parent;\n          if (t.isCallExpression(parent)) {\n            // 处理参数中的字符串\n            parent.arguments.forEach((arg: any, index: number) => {\n              if (t.isStringLiteral(arg) && containsChinese(arg.value)) {\n                const stringValue = arg.value;\n                const key = createI18nKey(stringValue);\n\n                // 替换console.log参数\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                parent.arguments[index] = callExpression;\n\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换console方法参数: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              }\n            });\n          }\n        }\n      },\n\n      // 处理类方法中的字符串字面量\n      ClassMethod(path: any) {\n        // 遍历方法体中的所有语句\n        path.node.body.body.forEach((statement: any) => {\n          // 处理return语句中的字符串字面量\n          if (\n            t.isReturnStatement(statement) &&\n            t.isStringLiteral(statement.argument) &&\n            containsChinese(statement.argument.value)\n          ) {\n            const stringValue = statement.argument.value;\n            const key = createI18nKey(stringValue);\n\n            // 替换return语句中的字符串\n            const callExpression = createI18nCallExpression(functionName, key, quoteType);\n            statement.argument = callExpression;\n\n            hasReplacement = true;\n            fileReplacements++;\n            Logger.verbose(\n              `替换类方法中return语句的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n            );\n          }\n\n          // 处理表达式语句中的字符串字面量\n          if (t.isExpressionStatement(statement)) {\n            // 处理方法调用中的字符串参数\n            if (t.isCallExpression(statement.expression)) {\n              statement.expression.arguments.forEach((arg: any, argIndex: number) => {\n                if (t.isStringLiteral(arg) && containsChinese(arg.value)) {\n                  const stringValue = arg.value;\n                  const key = createI18nKey(stringValue);\n\n                  // 替换方法调用参数中的字符串\n                  const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                  // 使用类型断言确保TypeScript知道这是一个CallExpression\n                  (statement.expression as t.CallExpression).arguments[argIndex] = callExpression;\n\n                  hasReplacement = true;\n                  fileReplacements++;\n                  Logger.verbose(\n                    `替换类方法中方法调用参数的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                  );\n                }\n\n                // 处理new表达式中的字符串参数\n                if (t.isNewExpression(arg)) {\n                  // 使用类型断言解决TypeScript类型问题\n                  const newExpr = arg as t.NewExpression & { arguments: t.Expression[] };\n                  if (newExpr.arguments) {\n                    newExpr.arguments.forEach((newArg: any, newArgIndex: number) => {\n                      if (t.isStringLiteral(newArg) && containsChinese(newArg.value)) {\n                        const stringValue = newArg.value;\n                        const key = createI18nKey(stringValue);\n\n                        // 替换new表达式参数中的字符串\n                        const callExpression = createI18nCallExpression(\n                          functionName,\n                          key,\n                          quoteType\n                        );\n                        newExpr.arguments[newArgIndex] = callExpression;\n\n                        hasReplacement = true;\n                        fileReplacements++;\n                        Logger.verbose(\n                          `替换类方法中new表达式参数的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                        );\n                      }\n                    });\n                  }\n                }\n              });\n            }\n          }\n        });\n      },\n\n      // 处理new表达式中的字符串参数\n      NewExpression(path: any) {\n        // 使用类型断言和交叉类型解决TypeScript类型问题\n        const node = path.node as t.NewExpression & { arguments: t.Expression[] };\n\n        if (node.arguments && Array.isArray(node.arguments)) {\n          node.arguments.forEach((arg: any, index: number) => {\n            if (t.isStringLiteral(arg) && containsChinese(arg.value)) {\n              const stringValue = arg.value;\n              const key = createI18nKey(stringValue);\n\n              // 替换new表达式参数中的字符串\n              const callExpression = createI18nCallExpression(functionName, key, quoteType);\n              node.arguments[index] = callExpression;\n\n              hasReplacement = true;\n              fileReplacements++;\n              Logger.verbose(\n                `替换new表达式参数中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n              );\n            } else if (t.isTemplateLiteral(arg)) {\n              // 处理模板字符串参数，traverse会自动处理\n              Logger.verbose(`检测到new表达式中的模板字符串参数，将递归处理`);\n            }\n          });\n        }\n      },\n\n      // 处理throw语句\n      ThrowStatement(path: any) {\n        const argument = path.node.argument;\n\n        // 处理直接 throw '中文'\n        if (t.isStringLiteral(argument) && containsChinese(argument.value)) {\n          const stringValue = argument.value;\n          const key = createI18nKey(stringValue);\n\n          // 替换throw语句中的字符串\n          const callExpression = createI18nCallExpression(functionName, key, quoteType);\n          path.node.argument = callExpression;\n\n          hasReplacement = true;\n          fileReplacements++;\n          Logger.verbose(\n            `替换throw语句中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n          );\n        }\n\n        // 处理 throw new Error('中文')\n        if (t.isNewExpression(argument)) {\n          const newExpr = argument as t.NewExpression & { arguments: t.Expression[] };\n\n          if (newExpr.arguments && Array.isArray(newExpr.arguments)) {\n            newExpr.arguments.forEach((arg: any, index: number) => {\n              if (t.isStringLiteral(arg) && containsChinese(arg.value)) {\n                const stringValue = arg.value;\n                const key = createI18nKey(stringValue);\n\n                // 替换Error构造函数中的字符串\n                const callExpression = createI18nCallExpression(functionName, key, quoteType);\n                newExpr.arguments[index] = callExpression;\n\n                hasReplacement = true;\n                fileReplacements++;\n                Logger.verbose(\n                  `替换throw new Error()中的字符串: \"${stringValue}\" -> ${functionName}(${quoteType === 'single' ? \"'\" : '\"'}${key}${quoteType === 'single' ? \"'\" : '\"'})`\n                );\n              } else if (t.isTemplateLiteral(arg)) {\n                // 处理模板字符串，traverse会自动处理\n                Logger.verbose(`检测到throw new Error()中的模板字符串，将递归处理`);\n              }\n            });\n          }\n        }\n      },\n    });\n\n    // 使用import管理器插入import语句\n    importManager.insertImportIfNeeded(\n      ast,\n      file,\n      autoImportEnabled,\n      hasReplacement,\n      imports,\n      insertPosition\n    );\n\n    // 只有在发生替换时才输出文件\n    if (hasReplacement) {\n      // 生成代码时考虑引号配置\n      const generateOptions = {\n        retainLines: true,\n        // 设置引号类型\n        jsescOption: {\n          quotes: quoteType,\n        },\n      };\n\n      let output = generate(ast, generateOptions, code).code;\n\n      // 使用import管理器添加空行\n      output = importManager.addEmptyLineToOutput(output);\n\n      await writeFileWithTempDir(file, output, config.tempDir);\n      modifiedCount++;\n      totalReplacements += fileReplacements;\n      Logger.info(`文件 ${file} 处理完成，替换了 ${fileReplacements} 个中文字符串`, 'normal');\n      if (config.tempDir) {\n        Logger.verbose(`修改后的文件保存到: ${config.tempDir}/${file}`);\n      }\n    } else {\n      Logger.verbose(`文件 ${file} 无需修改`);\n    }\n    await flushI18nCache();\n  }\n\n  // 输出最终统计结果\n  Logger.success(`扫描和替换完成！`, 'minimal');\n  Logger.info(`统计信息:`, 'normal');\n  Logger.info(`  - 处理文件总数: ${processedCount}`, 'normal');\n  Logger.info(`  - 修改文件数量: ${modifiedCount}`, 'normal');\n  Logger.info(`  - 替换字符串总数: ${totalReplacements}`, 'normal');\n\n  if (modifiedCount > 0) {\n    Logger.info(`国际化处理完成，共有 ${modifiedCount} 个文件被修改`, 'normal');\n    if (config.tempDir) {\n      Logger.info(`修改后的文件保存在临时目录: ${config.tempDir}`, 'normal');\n    }\n  } else {\n    Logger.info('没有文件需要修改', 'normal');\n  }\n}\n","import { ensureDir, readJson, writeJson } from './utils/fs';\nimport { pinyin } from 'pinyin-pro';\nimport * as path from 'path';\nimport { ConfigManager } from './config';\nimport stringHash from 'string-hash';\nimport { Logger } from './utils/logger';\n\ninterface KeyValueMap {\n  [key: string]: string;\n}\n\ninterface ValueKeyMap {\n  [value: string]: string;\n}\n\n// 内存缓存\nlet keyValueCache: KeyValueMap = {};\nlet valueKeyCache: ValueKeyMap = {}; // 新增：文案到key的反向映射\nlet outputFilePath = '';\n\n// 初始化缓存和文件\nexport async function initI18nCache(): Promise<void> {\n  const config = ConfigManager.get();\n  const outputDir = config.outputDir ?? 'locales';\n  await ensureDir(outputDir);\n\n  // 使用配置中的locale和文件名模式，而不是硬编码\n  const localeFileName = config.output?.localeFileName ?? '{locale}.json';\n  const fileName = localeFileName.replace('{locale}', config.locale ?? 'zh-CN');\n  outputFilePath = path.join(outputDir, fileName);\n\n  // 使用新的 readJson 函数，带默认值\n  keyValueCache = await readJson<KeyValueMap>(outputFilePath, {});\n\n  // 构建反向映射缓存：文案 -> key\n  valueKeyCache = {};\n  for (const [key, value] of Object.entries(keyValueCache)) {\n    valueKeyCache[value] = key;\n  }\n\n  const existingKeyCount = Object.keys(keyValueCache).length;\n\n  if (existingKeyCount > 0) {\n    Logger.verbose(`加载了 ${existingKeyCount} 个已存在的翻译键`);\n  }\n\n  // 如果文件不存在，初始化写入\n  await writeJson(outputFilePath, keyValueCache);\n}\n\nfunction toShortHash(text: string): string {\n  const config = ConfigManager.get();\n  const hashLength = config.keyGeneration?.hashLength ?? 6;\n  return stringHash(text).toString(36).slice(0, hashLength);\n}\n\n/**\n * 生成唯一的key，处理重复情况\n */\nfunction generateUniqueKey(baseKey: string, text: string): string {\n  const config = ConfigManager.get();\n  const separator = config.keyGeneration?.separator ?? '_';\n  const maxRetry = config.keyGeneration?.maxRetryCount ?? 5;\n\n  // 如果baseKey不重复，直接返回\n  if (!keyValueCache[baseKey]) {\n    return baseKey;\n  }\n\n  // 添加hash后缀处理重复key\n  let finalKey = baseKey + separator + toShortHash(text);\n  let tryCount = 0;\n\n  while (keyValueCache[finalKey] && tryCount < maxRetry) {\n    finalKey = baseKey + separator + toShortHash(text + Math.random().toString());\n    tryCount++;\n  }\n\n  if (tryCount >= maxRetry) {\n    Logger.warn(`生成唯一key失败，达到最大重试次数: ${baseKey}`);\n    // 使用时间戳作为最后的备选方案\n    finalKey = baseKey + separator + Date.now().toString(36);\n  }\n\n  return finalKey;\n}\n\nexport function createI18nKey(text: string): string {\n  const config = ConfigManager.get();\n  const reuseExistingKey = config.keyGeneration?.reuseExistingKey ?? true;\n\n  // 如果配置为重复使用相同文案的key，先检查文案是否已存在\n  if (reuseExistingKey && valueKeyCache[text]) {\n    Logger.verbose(`重复使用已存在文案的key: \"${valueKeyCache[text]}\" for \"${text}\"`);\n    return valueKeyCache[text];\n  }\n\n  // 提取所有汉字，截取前N个\n  const maxLength = config.keyGeneration?.maxChineseLength ?? 10;\n  const han = (text.match(/[\\u4e00-\\u9fa5]+/g)?.join('') ?? '').slice(0, maxLength);\n\n  if (!han) {\n    return '';\n  }\n\n  // 获取配置\n  const pinyinOptions = config.keyGeneration?.pinyinOptions ?? { toneType: 'none', type: 'array' };\n  const separator = config.keyGeneration?.separator ?? '_';\n  const keyPrefix = config.keyGeneration?.keyPrefix ?? '';\n\n  // 生成基础key\n  const baseKey = (\n    pinyin(han, {\n      toneType: pinyinOptions.toneType ?? 'none',\n      type: 'array'\n    }) ?? []).\n    join(separator);\n\n  if (!baseKey) {\n    return '';\n  }\n\n  // 构建完整key（添加前缀）\n  const keyWithPrefix = keyPrefix ? `${keyPrefix}${separator}${baseKey}` : baseKey;\n\n  // 生成唯一key（处理重复）\n  const finalKey = generateUniqueKey(keyWithPrefix, text);\n\n  // 缓存到内存（双向映射）\n  keyValueCache[finalKey] = text;\n  valueKeyCache[text] = finalKey;\n\n  return finalKey;\n}\n\n// 可选：写回文件\nexport async function flushI18nCache(): Promise<void> {\n  if (outputFilePath) {\n    const config = ConfigManager.get();\n    const prettyJson = config.output?.prettyJson ?? true;\n    await writeJson(outputFilePath, keyValueCache, prettyJson);\n    const keyCount = Object.keys(keyValueCache).length;\n    Logger.info(`已保存 ${keyCount} 个翻译键到 ${outputFilePath}`, 'normal');\n  }\n}","import { parse } from '@babel/parser';\nimport * as t from '@babel/types';\nimport { Logger } from './logger';\nimport { findMatchingImport } from './pattern';\n\n// 简单的require导入，只针对有兼容性问题的模块\nconst generate = require('@babel/generator').default;\n\n/**\n * 检查是否已经存在相同的import语句\n * @param ast AST对象\n * @param importStatement import语句字符串\n * @returns 是否已存在\n */\nfunction hasExistingImport(ast: any, importStatement: string): boolean {\n  try {\n    const importAst = parse(importStatement, {\n      sourceType: 'module',\n      plugins: ['jsx', 'typescript']\n    });\n\n    if (!importAst.program?.body || importAst.program.body.length === 0) {\n      return false;\n    }\n\n    const newStatements = importAst.program.body;\n    const existingStatements = ast.program.body;\n\n    // 检查每个新语句是否已存在\n    for (const newStmt of newStatements) {\n      let found = false;\n      for (const existingStmt of existingStatements) {\n        // 比较AST节点的字符串表示（简单但有效的方法）\n        const newCode = generate(newStmt, { minified: true }).code;\n        const existingCode = generate(existingStmt, { minified: true }).code;\n        if (newCode === existingCode) {\n          found = true;\n          break;\n        }\n      }\n      if (!found) {\n        return false; // 有新语句不存在\n      }\n    }\n    return true; // 所有语句都已存在\n  } catch (error) {\n    Logger.verbose(`检查import重复时出错: ${error}`);\n    return false;\n  }\n}\n\n/**\n * 在AST中添加import语句（支持不同插入位置）\n * @param ast AST对象\n * @param importStatement import语句字符串\n * @param insertPosition 插入位置 'top' | 'afterImports'\n */\nfunction addImportToAST(\n  ast: any,\n  importStatement: string,\n  insertPosition: 'top' | 'afterImports' = 'afterImports'\n): void {\n  try {\n    // 检查是否已存在相同的import语句\n    if (hasExistingImport(ast, importStatement)) {\n      Logger.verbose('Import语句已存在，跳过插入');\n      return;\n    }\n\n    // 解析import语句为AST节点\n    const importAst = parse(importStatement, {\n      sourceType: 'module',\n      plugins: ['jsx', 'typescript']\n    });\n\n    // 将解析出的语句添加到指定位置\n    if (importAst.program?.body && importAst.program.body.length > 0) {\n      let insertIndex = 0;\n\n      if (insertPosition === 'afterImports') {\n        // 在现有import语句之后插入\n        for (let i = 0; i < ast.program.body.length; i++) {\n          if (t.isImportDeclaration(ast.program.body[i])) {\n            insertIndex = i + 1;\n          } else {\n            break;\n          }\n        }\n      } else {\n        // 在文件顶部插入\n        insertIndex = 0;\n      }\n\n      // 插入新的语句\n      ast.program.body.splice(insertIndex, 0, ...importAst.program.body);\n\n      Logger.verbose(`Import语句已插入到位置: ${insertPosition}`);\n    }\n  } catch (error) {\n    Logger.warn(`无法解析import语句: ${importStatement}`);\n    Logger.verbose(`错误详情: ${error}`);\n  }\n}\n\n/**\n * 在生成的代码中为import语句后添加空行\n * 由于@babel/generator会重新格式化代码，需要在生成后处理\n * @param code 生成的代码字符串\n * @param importStatement 插入的import语句内容\n * @returns 处理后的代码字符串\n */\nfunction addEmptyLineAfterImport(code: string, importStatement: string): string {\n  // 清理import语句，移除可能的换行符和多余空格\n  const cleanImportStatement = importStatement.replace(/;\\s*$/g, ';').trim();\n\n  // 在代码中找到该import语句的位置\n  const importIndex = code.indexOf(cleanImportStatement);\n  if (importIndex === -1) {\n    Logger.verbose('未在生成的代码中找到import语句，跳过空行添加');\n    return code;\n  }\n\n  // 找到import语句的结束位置（分号后）\n  const importEndIndex = importIndex + cleanImportStatement.length;\n\n  // 检查import语句后是否直接跟着其他代码（没有换行）\n  const charAfterImport = code.charAt(importEndIndex);\n  if (charAfterImport && charAfterImport !== '\\n' && charAfterImport !== '\\r') {\n    // import语句后直接跟着其他代码，需要先添加换行，再添加空行\n    // 同时去掉后续代码开头可能的空格，避免多余的缩进\n    const restCode = code.substring(importEndIndex);\n    const trimmedRestCode = restCode.replace(/^[ \\t]*/, ''); // 移除开头的空格和制表符\n    return code.substring(0, importEndIndex) + '\\n\\n' + trimmedRestCode;\n  }\n\n  // 找到import语句行的实际结束位置（换行符位置）\n  let lineEndIndex = importEndIndex;\n  while (lineEndIndex < code.length && code.charAt(lineEndIndex) !== '\\n') {\n    lineEndIndex++;\n  }\n\n  if (lineEndIndex >= code.length) {\n    // 如果import是文件最后一行，添加空行\n    return code + '\\n';\n  }\n\n  // 检查import行后是否已有空行\n  const nextLineStart = lineEndIndex + 1;\n  if (nextLineStart >= code.length) {\n    // 文件结束，添加空行\n    return code + '\\n';\n  }\n\n  const nextLineEnd = code.indexOf('\\n', nextLineStart);\n  const nextLine = nextLineEnd === -1 ?\n    code.substring(nextLineStart) :\n    code.substring(nextLineStart, nextLineEnd);\n\n  // 如果下一行不是空行，插入空行\n  if (nextLine.trim() !== '') {\n    return code.substring(0, lineEndIndex + 1) + '\\n' + code.substring(lineEndIndex + 1);\n  }\n\n  return code;\n}\n\n/**\n * Import管理器 - 封装import插入相关的逻辑\n * \n * 功能：\n * - 管理单个文件的import插入状态\n * - 按需插入import语句到AST\n * - 为生成的代码添加空行格式\n * \n * 使用示例：\n * ```typescript\n * const importManager = new ImportManager();\n * \n * // 处理每个文件时重置状态\n * importManager.reset();\n * \n * // 在AST遍历后插入import\n * importManager.insertImportIfNeeded(ast, file, config...);\n * \n * // 在代码生成后添加空行\n * const finalCode = importManager.addEmptyLineToOutput(generatedCode);\n * ```\n */\nexport class ImportManager {\n  private hasImportInserted = false;\n  private insertedImportStatement = '';\n\n  /**\n   * 重置状态（处理新文件时调用）\n   */\n  reset(): void {\n    this.hasImportInserted = false;\n    this.insertedImportStatement = '';\n  }\n\n  /**\n   * 按需插入import语句\n   * @param ast AST对象\n   * @param file 文件路径\n   * @param autoImportEnabled 是否启用自动导入\n   * @param hasReplacement 是否发生了替换\n   * @param imports import配置\n   * @param insertPosition 插入位置\n   */\n  insertImportIfNeeded(\n    ast: any,\n    file: string,\n    autoImportEnabled: boolean,\n    hasReplacement: boolean,\n    imports: any,\n    insertPosition: 'top' | 'afterImports'\n  ): void {\n    if (!this.hasImportInserted && autoImportEnabled && hasReplacement) {\n      const importStatement = findMatchingImport(file, imports);\n      if (importStatement) {\n        Logger.verbose(`为文件 ${file} 添加import语句: ${importStatement.trim()}`);\n        addImportToAST(ast, importStatement, insertPosition);\n        this.hasImportInserted = true;\n        this.insertedImportStatement = importStatement;\n      } else {\n        Logger.warn(`文件 ${file} 需要import语句但未找到匹配的import配置`, 'normal');\n      }\n    }\n  }\n\n  /**\n   * 为输出代码添加空行（如果插入了import语句）\n   * @param output 生成的代码字符串\n   * @returns 处理后的代码字符串\n   */\n  addEmptyLineToOutput(output: string): string {\n    if (this.hasImportInserted && this.insertedImportStatement) {\n      const result = addEmptyLineAfterImport(output, this.insertedImportStatement);\n      if (result !== output) {\n        Logger.verbose(`已为import语句后添加空行`);\n      }\n      return result;\n    }\n    return output;\n  }\n\n  /**\n   * 检查是否已插入import语句\n   */\n  get isImportInserted(): boolean {\n    return this.hasImportInserted;\n  }\n\n  /**\n   * 获取插入的import语句内容\n   */\n  get insertedStatement(): string {\n    return this.insertedImportStatement;\n  }\n} ","import { Logger } from \"./logger\";\nimport micromatch from 'micromatch';\n\n/**\n * 使用micromatch进行glob模式匹配\n * 支持完整的glob语法，包括 *, **, {}, [], ! 等\n */\nexport function matchPattern(pattern: string, filePath: string): boolean {\n  try {\n    return micromatch.isMatch(filePath, pattern);\n  } catch (error) {\n    Logger.warn(`模式匹配出错 - pattern: ${pattern}, filePath: ${filePath}, error: ${error}`);\n    return false;\n  }\n}\n\n/**\n * 从配置中找到匹配文件路径的import配置\n */\nexport function findMatchingImport(\n  filePath: string,\n  imports: { [pattern: string]: { importStatement: string } } = {}\n): string | null {\n  Logger.verbose(`findMatchingImport: ${filePath}`);\n\n  // 获取所有模式，按优先级排序（更具体的模式优先）\n  const patterns = Object.keys(imports).sort((a, b) => {\n    // 优先级：具体路径 > 带扩展名的模式 > 通用模式\n    const scoreA = getPatternSpecificity(a);\n    const scoreB = getPatternSpecificity(b);\n    return scoreB - scoreA;\n  });\n\n  for (const pattern of patterns) {\n    if (matchPattern(pattern, filePath)) {\n      Logger.verbose(`匹配到模式: ${pattern} -> ${filePath}`);\n      return imports[pattern]?.importStatement || null;\n    }\n  }\n\n  Logger.verbose(`未找到匹配的import配置: ${filePath}`);\n  return null;\n}\n\n/**\n * 计算模式的具体性分数（分数越高越具体）\n */\nfunction getPatternSpecificity(pattern: string): number {\n  let score = 0;\n\n  // 没有通配符的路径分数更高\n  if (!pattern.includes('*')) {\n    score += 100;\n  }\n\n  // 有具体扩展名的分数更高\n  if (pattern.includes('.{') || pattern.match(/\\.\\w+$/)) {\n    score += 50;\n  }\n\n  // 路径层级越深分数越高\n  score += (pattern.match(/\\//g)?.length || 0) * 10;\n\n  // ** 通配符降低分数\n  score -= (pattern.match(/\\*\\*/g)?.length || 0) * 20;\n\n  // * 通配符降低分数\n  score -= (pattern.match(/(?<!\\*)\\*(?!\\*)/g)?.length || 0) * 5;\n\n  return score;\n}\n","{\n  \"name\": \"i18n-xy\",\n  \"version\": \"0.0.14\",\n  \"description\": \"自动提取React项目中的中文字符串并进行国际化的CLI工具\",\n  \"main\": \"dist/index.js\",\n  \"types\": \"dist/index.d.ts\",\n  \"type\": \"module\",\n  \"bin\": {\n    \"i18n-xy\": \"dist/cli.cjs\",\n    \"i18nx\": \"dist/cli.cjs\"\n  },\n  \"files\": [\n    \"dist\",\n    \"README.md\"\n  ],\n  \"engines\": {\n    \"node\": \">=16.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"build\": \"tsup\",\n    \"dev\": \"tsup --watch\",\n    \"lint\": \"eslint src --ext .ts,.tsx --fix\",\n    \"lint:check\": \"eslint src --ext .ts,.tsx\",\n    \"type-check\": \"tsc --noEmit\",\n    \"prepublishOnly\": \"pnpm run build\",\n    \"postpack\": \"echo '✅ 打包完成，可以使用 npm publish 发布'\",\n    \"extract\": \"rm -rf dist output locales test/temp coverage && pnpm build &&node dist/cli.cjs extract\"\n  },\n  \"keywords\": [\n    \"i18n\",\n    \"internationalization\",\n    \"localization\",\n    \"l10n\",\n    \"translation\",\n    \"react\",\n    \"vue\",\n    \"angular\",\n    \"frontend\",\n    \"cli\",\n    \"command-line-tool\",\n    \"development-tool\",\n    \"build-tool\",\n    \"typescript\",\n    \"javascript\",\n    \"jsx\",\n    \"tsx\",\n    \"babel\",\n    \"ast\",\n    \"abstract-syntax-tree\",\n    \"code-transformation\",\n    \"string-extraction\",\n    \"extraction\",\n    \"automation\",\n    \"chinese\",\n    \"chinese-characters\",\n    \"pinyin\",\n    \"chinese-to-pinyin\",\n    \"multilingual\",\n    \"language-files\",\n    \"json-generation\",\n    \"locale\",\n    \"text-processing\",\n    \"parser\",\n    \"generator\",\n    \"codemod\",\n    \"refactoring\"\n  ],\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"\"\n  },\n  \"devDependencies\": {\n    \"@babel/cli\": \"^7.27.2\",\n    \"@babel/core\": \"^7.27.4\",\n    \"@types/babel__generator\": \"^7.27.0\",\n    \"@types/babel__traverse\": \"^7.20.7\",\n    \"@types/fs-extra\": \"^11.0.4\",\n    \"@types/inquirer\": \"^9.0.8\",\n    \"@types/lodash\": \"^4.17.18\",\n    \"@types/micromatch\": \"^4.0.9\",\n    \"@types/node\": \"^24.0.3\",\n    \"@types/string-hash\": \"^1.1.3\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.13.0\",\n    \"@typescript-eslint/parser\": \"^8.13.0\",\n    \"eslint\": \"^9.15.0\",\n    \"eslint-config-prettier\": \"^9.1.0\",\n    \"eslint-plugin-prettier\": \"^5.2.1\",\n    \"prettier\": \"^3.3.3\",\n    \"tsup\": \"^8.5.0\",\n    \"typescript\": \"^5.8.3\"\n  },\n  \"dependencies\": {\n    \"@babel/generator\": \"^7.27.5\",\n    \"@babel/parser\": \"^7.27.5\",\n    \"@babel/traverse\": \"^7.27.4\",\n    \"@babel/types\": \"^7.27.6\",\n    \"baidu-translate-service\": \"^2.2.4\",\n    \"commander\": \"^14.0.0\",\n    \"fast-glob\": \"^3.3.3\",\n    \"fs-extra\": \"^11.3.0\",\n    \"inquirer\": \"^12.6.3\",\n    \"lodash\": \"^4.17.21\",\n    \"micromatch\": \"^4.0.8\",\n    \"pinyin-pro\": \"^3.26.0\",\n    \"string-hash\": \"^1.1.3\"\n  }\n}\n","import { ConfigManager } from '../config';\nimport { Logger } from './logger';\n\n/**\n * 配置一致性检查工具\n * 用于验证所有配置项是否正确使用，没有硬编码值\n */\nexport class ConfigValidator {\n\n  /**\n   * 检查配置的一致性和完整性\n   */\n  static validateConfigUsage(): {\n    isValid: boolean;\n    errors: string[];\n    warnings: string[];\n  } {\n    const errors: string[] = [];\n    const warnings: string[] = [];\n\n    try {\n      const config = ConfigManager.get();\n\n      // 检查必需配置\n      if (!config.include || config.include.length === 0) {\n        errors.push('配置项 include 不能为空');\n      }\n\n      if (!config.outputDir) {\n        errors.push('配置项 outputDir 不能为空');\n      }\n\n      if (!config.locale) {\n        errors.push('配置项 locale 不能为空');\n      }\n\n      // 检查翻译配置一致性\n      if (config.translation?.enabled) {\n        if (!config.translation.provider) {\n          errors.push('启用翻译时必须指定 provider');\n        }\n\n        if (config.translation.provider === 'baidu') {\n          if (!config.translation.baidu?.appid || !config.translation.baidu?.key) {\n            warnings.push('百度翻译服务缺少 appid 或 key 配置');\n          }\n        }\n      }\n\n      // 检查key生成配置\n      if (config.keyGeneration) {\n        if (config.keyGeneration.maxChineseLength && config.keyGeneration.maxChineseLength <= 0) {\n          warnings.push('maxChineseLength 应该大于0');\n        }\n\n        if (config.keyGeneration.hashLength && config.keyGeneration.hashLength <= 0) {\n          warnings.push('hashLength 应该大于0');\n        }\n      }\n\n      // 检查日志配置\n      if (config.logging?.level && !['minimal', 'normal', 'verbose'].includes(config.logging.level)) {\n        errors.push('logging.level 必须是 minimal、normal 或 verbose 之一');\n      }\n\n      // 检查输出配置\n      if (config.output?.localeFileName && !config.output.localeFileName.includes('{locale}')) {\n        warnings.push('localeFileName 建议包含 {locale} 占位符');\n      }\n\n    } catch (error) {\n      errors.push(`配置检查时发生错误: ${error}`);\n    }\n\n    const isValid = errors.length === 0;\n\n    if (!isValid) {\n      Logger.error('配置验证失败:', 'minimal');\n      errors.forEach(error => Logger.error(`  - ${error}`, 'minimal'));\n    }\n\n    if (warnings.length > 0) {\n      Logger.warn('配置警告:', 'normal');\n      warnings.forEach(warning => Logger.warn(`  - ${warning}`, 'normal'));\n    }\n\n    if (isValid && warnings.length === 0) {\n      Logger.verbose('配置验证通过，无警告');\n    }\n\n    return { isValid, errors, warnings };\n  }\n\n  /**\n   * 检查是否存在配置与代码不一致的问题\n   */\n  static checkConfigConsistency(): void {\n    const config = ConfigManager.get();\n\n    Logger.verbose('检查配置一致性...');\n\n    // 检查文件名生成是否使用了配置\n    const expectedFileName = (config.output?.localeFileName ?? '{locale}.json')\n      .replace('{locale}', config.locale);\n    Logger.verbose(`预期的语言文件名: ${expectedFileName}`);\n\n    // 检查替换函数名是否一致\n    const functionName = config.replacement?.functionName ?? '$t';\n    Logger.verbose(`预期的替换函数名: ${functionName}`);\n\n    // 检查目录配置\n    Logger.verbose(`输出目录: ${config.outputDir}`);\n    if (config.tempDir) {\n      Logger.verbose(`临时目录: ${config.tempDir}`);\n    }\n\n    Logger.verbose('配置一致性检查完成');\n  }\n} "],"mappings":"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","names":["readFile","ensureDir","fg","readJsonSync","readJsonSync","baiduTranslateService","resolve","path","results","result","readFile","path","ensureDir","readFile","readJsonSync","import_parser","t","path","ensureDir","stringHash","micromatch","generate","path","callExpression","readFile","_a","key","translateCommand"]}