{"_id":"i18n-google","_rev":"32-c18b63dfde3c558db2791f19ef84f2f5","name":"i18n-google","dist-tags":{"latest":"0.3.3"},"versions":{"1.0.0":{"name":"i18n-google","version":"1.0.0","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@1.0.0","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"6f84abda8c18e6a152d75e09faf1d3e916540f44","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-1.0.0.tgz","fileCount":25,"integrity":"sha512-TdC0kUyyTD02WYMVJc+ssg/wuGOxoaWjfiwCkm3EUjIhqzOWOrQI3YqOJ5vk17l2CQk3HZL7FSLJauwwSI+uJQ==","signatures":[{"sig":"MEUCID2a5uZdgDwMSkkqMTBBQkoF/xDar+LatO05pzTUkhwTAiEAx+emVSCVW/fxNJSelNsA9u7v7VYHhKvSi04/c1BpwOg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102958},"main":"dist/scan.js","types":"dist/scan.d.ts","gitHead":"da51532927fdfd2a3ec2ef06a2419c0a890009ef","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"jwgkkk","email":"jack.jin.min@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.2.4","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"20.11.1","dependencies":{"minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^0.15.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/minimatch":"^5.1.2","@types/jscodeshift":"^0.11.11"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_1.0.0_1749549623334_0.5839653692483482","host":"s3://npm-registry-packages-npm-production"}},"0.0.1":{"name":"i18n-google","version":"0.0.1","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.0.1","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"84eeaecd115fab5c7e52828283cd407fe522c39e","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.0.1.tgz","fileCount":25,"integrity":"sha512-kVvkylWxyhfzg8vHf9WUGXl3qHlTYgboC7os3xKZ06lxhqVf3KSIbjGXQGIMe8fLhiZhVC/T/yYHiWyMYT2UQA==","signatures":[{"sig":"MEUCIQC/wpor227FgC35oohA7hW2kPAUZj/m8pRTyFb0INo/1wIgLrQEn52yTo7PMpAG20ViHcWppecKK4zffLBOHdxOx0c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102958},"main":"dist/scan.js","types":"dist/scan.d.ts","gitHead":"da51532927fdfd2a3ec2ef06a2419c0a890009ef","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"jwgkkk","email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.2.4","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"20.11.1","dependencies":{"minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^0.15.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/minimatch":"^5.1.2","@types/jscodeshift":"^0.11.11"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.0.1_1749549713216_0.08146158534274361","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"i18n-google","version":"0.2.0","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.0","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"751294456a199081e6531b68d95389bb341643cc","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.0.tgz","fileCount":22,"integrity":"sha512-cQvw0l+R9DQRLU+ALGCVHZzKG6LS+QbeSnyoX2Bxnkl9BtVUPMNXVBKohYGCw6JgqmcXo1bAB/gbhQxj7h3ALg==","signatures":[{"sig":"MEUCIETFBllajZkmDfn5aCKHk+GMALCPpKsnD3qHtq73yf2uAiEA/vT9Ms4r1Ini7lr8nwc7ymKvruuawfsHSjIgIVkwWfs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183685},"main":"dist/scan.js","types":"dist/scan.d.ts","gitHead":"fe3c86676b3d2538cb72eabed2d1f2783ede16af","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"jwgkkk","actor":{"name":"jwgkkk","type":"user","email":"jack.jin.min@gmail.com"},"email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.2.4","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"20.11.1","dependencies":{"ora":"^6.3.1","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.0_1750747587377_0.060127220513670476","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"i18n-google","version":"0.2.1","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.1","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"2dba544fefa556ecc472b593a0adae1593d80f92","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.1.tgz","fileCount":22,"integrity":"sha512-Kwzlf7qhLvTdRPNBwcMjWC/h4SXx/EtuUoAPU3GY4ZcDuOLjpUNQevkLHH8HfB/h5ShFLYF/wlf2GEfzzqeHTA==","signatures":[{"sig":"MEUCIQDvs/1PBIHockboQvJX+YdryNNxfo9bISdZewSEKd/1iwIgV+KiqHdD7AlDfzhG3BiQKl+rMP97rVxW2/+mlKA2aVI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185794},"main":"dist/scan.js","gitHead":"693f2bf839d9ae9554336e28cdfa72496d58e933","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"jwgkkk","actor":{"name":"jwgkkk","type":"user","email":"jack.jin.min@gmail.com"},"email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.2.4","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"20.11.1","dependencies":{"ora":"^6.3.1","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.1_1750819778674_0.5102625999624604","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"i18n-google","version":"0.2.2","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.2","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js","i18n-google-sync":"dist/sync.js"},"dist":{"shasum":"bc5b5d66ed7fc43dfd4c4ca76341c776686b7c8f","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.2.tgz","fileCount":21,"integrity":"sha512-EHMMqdPQKDy9RCZsztkleLrXAgEosFFEXa6Tkq8g62dIad9L1K54ZEn94kBLLCLXVPBL9jZdcUGABJlLEnspOA==","signatures":[{"sig":"MEUCIQCM7790ELbu38sT9yfbQkYXSsyL7TeJtpLAuYNV4lQA5wIgbypBmiTT0ng66pGVcaqme4gI9wNjCPOBRCAhS1tQwHo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":178598},"main":"dist/scan.js","gitHead":"8238e58e5de4a818a86f33d500b2d9f406aa1a4d","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"jwgkkk","actor":{"name":"jwgkkk","type":"user","email":"jack.jin.min@gmail.com"},"email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.2.4","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"20.11.1","dependencies":{"ora":"^6.3.1","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.2_1750823335092_0.5125613251248988","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"i18n-google","version":"0.2.3","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.3","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js","i18n-google-sync":"dist/sync.js"},"dist":{"shasum":"e48dccf2948bec61f3b15c7a2aab688ea56d076a","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.3.tgz","fileCount":22,"integrity":"sha512-EDzZznbx0oinAWstH0ZI2X+GMLEduk/W4fBBxQme2CVZd1xNI3R9/EvOGzr0d/RTc0xZB1wfhEW32HhibZT+lg==","signatures":[{"sig":"MEUCIQCnAWnh+jYfUKVGxjXByQ1wUYGDfRcaPkSL06/QpSOObQIgAK813PFzNAlmJUEbYqfGifup9DxcMJ0lTWXqPhTblgM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":186842},"main":"dist/scan.js","gitHead":"e84f74d6fbe6cab4133e0025b0f201697452f62b","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"jwgkkk","actor":{"name":"jwgkkk","type":"user","email":"jack.jin.min@gmail.com"},"email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.2.4","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"20.11.1","dependencies":{"ora":"^6.3.1","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.3_1750834648576_0.6567327871175537","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"i18n-google","version":"0.2.4","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.4","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js","i18n-google-sync":"dist/sync.js"},"dist":{"shasum":"6b214a2e9f0c0be9eedeebadf77409bb448eb3e2","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.4.tgz","fileCount":21,"integrity":"sha512-dmTZlbPFi5aL0wH65GeUAsGmAgxp8kv3OwWbS0U5qpubh3Iz86q2II6EoF1ZWEcLdAXzUhjcYa1chfx1eZ6z2A==","signatures":[{"sig":"MEUCIC3+SEKnrb0VWGk95PLKfKmMWcbGgHdandkHKxc5TAmHAiEAuFW6PakfScC6/Rcw7Hl81naHyJT46lAtvPSdF3KESko=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175230},"main":"dist/scan.js","gitHead":"e84f74d6fbe6cab4133e0025b0f201697452f62b","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"jwgkkk","actor":{"name":"jwgkkk","type":"user","email":"jack.jin.min@gmail.com"},"email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.2.4","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"20.11.1","dependencies":{"ora":"^6.3.1","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.4_1750834786200_0.9333182455396927","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"i18n-google","version":"0.2.5","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.5","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js","i18n-google-sync":"dist/sync.js"},"dist":{"shasum":"0cff1756d09837315a7037cbfe363cfdfa82209a","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.5.tgz","fileCount":21,"integrity":"sha512-oTgjt9//TpN3Zpkhuft3ljMc+bVNXUr9XMs9OZ2BReaThoStVSngdLmSOHWogy8G+6ti0XeZy1nLIUbMRmtJWw==","signatures":[{"sig":"MEYCIQCESjno75ziY/bMzLNk9mGGLqMLREvCnp7MfqwxkpyMMgIhAPTg5J+cmmgAjntrnLN4GEkAZFmQepsYPR4JyxN1amIM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175961},"main":"dist/scan.js","gitHead":"981945c2d64a18a5bac80b92b53e387bab5090da","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"jwgkkk","actor":{"name":"jwgkkk","type":"user","email":"jack.jin.min@gmail.com"},"email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.2.4","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"20.11.1","dependencies":{"ora":"^6.3.1","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.5_1750919392825_0.8703043073025263","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"i18n-google","version":"0.2.6","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.6","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js","i18n-google-sync":"dist/sync.js"},"dist":{"shasum":"e0243d940bb892d088f6f1f238997f7ca1dadb26","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.6.tgz","fileCount":21,"integrity":"sha512-Tdgqg1DvbvKouSuoBBYVgMVmFh0VhTANbF7HOj37MiL1vAYaWBtgLPK5SBaCmJRBHGkyl5hMk5zUceISFhHz8A==","signatures":[{"sig":"MEYCIQC8KDBgKLwBdbEMqACVNNoNPwdlbnlO/pipR48ygHOUIQIhAMLtqTCwvNXIS9BrLsauvt/4I0siD6VuHo3sZ71jW6wE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175952},"main":"dist/scan.js","gitHead":"62695057fe19619619a441c4b4197c4b310b8ba8","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"jwgkkk","actor":{"name":"jwgkkk","type":"user","email":"jack.jin.min@gmail.com"},"email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.2.4","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"20.11.1","dependencies":{"ora":"^6.3.1","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.6_1750939328147_0.12601676420846442","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"name":"i18n-google","version":"0.2.7","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.7","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js","i18n-google-sync":"dist/sync.js"},"dist":{"shasum":"3c5af3fcbdf67e159a06e156389977dbec8633e8","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.7.tgz","fileCount":21,"integrity":"sha512-8jR2qrgZuPWftIcq7XRA4RC/yl3NFqUQ85KW9iHYAyyZ2pkx3G80A1smNUAvKNnppPBerMf3CrzYci8rvOwbLQ==","signatures":[{"sig":"MEUCIGJUcT7T6Ce5n1lVIPjj0Rq6Pw7MEI37ARsOI5NAXjZ4AiEAreBFVYCJJ8VmeNEA93AlfymoZ6eJUGDxOklS7MZ7iM8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175976},"main":"dist/scan.js","gitHead":"d544b5cf471f4c7da5b4099f6a73ba74fcb55e0c","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"jwgkkk","actor":{"name":"jwgkkk","type":"user","email":"jack.jin.min@gmail.com"},"email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.2.4","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"20.11.1","dependencies":{"ora":"^6.3.1","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.7_1751002823733_0.041987398878238213","host":"s3://npm-registry-packages-npm-production"}},"0.2.8":{"name":"i18n-google","version":"0.2.8","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.8","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js","i18n-google-sync":"dist/sync.js"},"dist":{"shasum":"bd7a1cd6daa151a269277264471a96541092a081","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.8.tgz","fileCount":21,"integrity":"sha512-bMY5tneDGQcRbWllL6/NCY9Kyr+apaMOlxZ3i174LrUAtUfh2lqiziw332uGaxLDxYmYdr8GDtV6jOBKO2v3Cg==","signatures":[{"sig":"MEUCIQDTPsKI/705kH76hUnXQdqRYewY5CQqltgW2EonUo1gHQIgahTSNRbgMt3lgOvF/hZt70flHT4nqn2witYvVgI7R5s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":164186},"main":"dist/scan.js","gitHead":"76a627dcf930cb68103cfd30ef77662c73cd7512","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"tsc","prepublishOnly":"npm run build","publish:release":"./publish.sh"},"_npmUser":{"name":"jwgkkk","actor":{"name":"jwgkkk","type":"user","email":"jack.jin.min@gmail.com"},"email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.2.4","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"20.11.1","dependencies":{"ora":"^6.3.1","openai":"^5.8.2","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.8_1751283079524_0.986660499225088","host":"s3://npm-registry-packages-npm-production"}},"0.2.9":{"name":"i18n-google","version":"0.2.9","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.9","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"a1c7671a8b05f42c6b5b2fbe7762a1a83f90dbe9","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.9.tgz","fileCount":21,"integrity":"sha512-RLUbz1muwkJz49URh+r8tQjRUXL9RJW6QVu1ens0pMMOMPzDwcS8whX2yBHKibRoYbMbj1Mitp1AYGXSqPmTjQ==","signatures":[{"sig":"MEUCIQCURHNNlEu6dpukNichmGwfRwxEbExma2yWRVEMBoYRAAIgCtFgUIodjNrhkAFtLoqVQNBbXaACqKPuywkFX+IiWJw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161468},"main":"dist/scan.js","gitHead":"f52bc852f4c467747c965ca42dfa28f513858795","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"tsc","prepublishOnly":"npm run build","publish:release":"./publish.sh"},"_npmUser":{"name":"jwgkkk","actor":{"name":"jwgkkk","type":"user","email":"jack.jin.min@gmail.com"},"email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.9.2","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"23.7.0","dependencies":{"ora":"^6.3.1","openai":"^5.8.2","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.9_1751362297840_0.34254392891870533","host":"s3://npm-registry-packages-npm-production"}},"0.2.15":{"name":"i18n-google","version":"0.2.15","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.15","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"4ca48250cdd1877a11b2b7652197fee5883c51cc","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.15.tgz","fileCount":21,"integrity":"sha512-lhLpENaZuRF1qeimj221q8vSF4+sZ9s+ZiSz/k7cfnBKlBz6WNCYLgSy5bQqLKpBQsCK5UALKxX/UKlc31XsVw==","signatures":[{"sig":"MEUCIF2RgE027q+5KszAlTS3RpArPdv4KeVmiFa9n/ZRTyWuAiEAp9fGeuNoxInDz7lywvO2Tn0zeQXP0vFzKm3fE3zNZn0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161475},"main":"dist/scan.js","gitHead":"483df0ff0e3bed6755609b92f89871fdd127843e","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"tsc","prepublishOnly":"npm run build","publish:release":"./publish.sh"},"_npmUser":{"name":"jwgkkk","actor":{"name":"jwgkkk","type":"user","email":"jack.jin.min@gmail.com"},"email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.9.2","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"23.7.0","dependencies":{"ora":"^6.3.1","openai":"^5.8.2","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.15_1751527128492_0.30016392550158755","host":"s3://npm-registry-packages-npm-production"}},"0.2.16":{"name":"i18n-google","version":"0.2.16","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.16","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"1d2ba94660a0d4f607428954c528c8a6f0b28f0e","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.16.tgz","fileCount":21,"integrity":"sha512-AHMz5+wnWT7j2mVyq8Wyaq5STVUgLdAENlLnUv5RJB5TZ4j1+mEmFIdd7XMnJHFuroWQ0bS434Rgo+BfP8A/wg==","signatures":[{"sig":"MEUCIQDYAvWFwcpPjhPX6QYe+GTCQRgNbdSkUxSw4ZbX2sdffQIgT4A11YFBN+BaE/lYo6C3WcnhsE+GZofEH9aYJx2NQ/A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":163753},"main":"dist/scan.js","gitHead":"816a7ef8e842bacbf113e7ec377e4df8fa8a428c","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"tsc","prepublishOnly":"npm run build","publish:release":"./publish.sh"},"_npmUser":{"name":"jwgkkk","actor":{"name":"jwgkkk","type":"user","email":"jack.jin.min@gmail.com"},"email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.9.2","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"23.7.0","dependencies":{"ora":"^6.3.1","openai":"^5.8.2","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.16_1751527994626_0.9905896675724146","host":"s3://npm-registry-packages-npm-production"}},"0.2.17":{"name":"i18n-google","version":"0.2.17","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.17","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"49dd18522c40a7acde04dadb21c59eea411cb168","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.17.tgz","fileCount":21,"integrity":"sha512-SFlKyZVqjJgPlaaCRP673VdusMQqYssI7KIz+OgV4TyEX2rV0L4S97nh/pnRAF4ue3hrlfL4/i4UDXoDPeusvw==","signatures":[{"sig":"MEUCIQDZAATaWRBpTTKGp8y990mey0rgJkNoP8O/O/CGBZZVowIgCEZ7DDDqjkQYJbVJtat1oPuMi6LZgaX58FYobZfggvY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":163741},"main":"dist/scan.js","gitHead":"a8c09656b45124278d7bdbfad58b0892cbdd555f","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"tsc","prepublishOnly":"npm run build","publish:release":"./publish.sh"},"_npmUser":{"name":"jwgkkk","actor":{"name":"jwgkkk","type":"user","email":"jack.jin.min@gmail.com"},"email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.9.2","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"23.7.0","dependencies":{"ora":"^6.3.1","openai":"^5.8.2","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.17_1751529621870_0.9847346977277305","host":"s3://npm-registry-packages-npm-production"}},"0.2.18":{"name":"i18n-google","version":"0.2.18","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.18","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"fe2b7c22dff7d777a23449efa715e4dafdd50b8e","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.18.tgz","fileCount":21,"integrity":"sha512-PqPCfxG0Fi4fdXZjt9qs2rj1+3OadrogFpTKlr/D3xYQ6kh26ylZXsjtvxLCEhZ8afKlNfuKJEolRHUAQ3B2qw==","signatures":[{"sig":"MEUCIHYiWUHpvTLqXg9LdhJrV1sS51OTwBwollHlNOBdKhdSAiEAtOEpqU8rK9xp8LlInWWw+6Lxrmz3jWQmlggM9ID8JRQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":162944},"main":"dist/scan.js","gitHead":"4b2f10928263f9aeb9f0f7966844d93cb2ae5d16","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"tsc","prepublishOnly":"npm run build","publish:release":"./publish.sh"},"_npmUser":{"name":"jwgkkk","email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.9.2","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"23.7.0","dependencies":{"ora":"^6.3.1","openai":"^5.8.2","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.18_1752416756147_0.17357032804871442","host":"s3://npm-registry-packages-npm-production"}},"0.2.19":{"name":"i18n-google","version":"0.2.19","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.19","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"a834500dce6684f5bce4bbc7cb7ffb1a36780294","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.19.tgz","fileCount":20,"integrity":"sha512-XeiqQsX4GFr0yrB82xV1eYB+lUqBBgXTWG6Xpq2znDn5tMVTuTq18CaEuzI5Lh5kGexJEuo5tQIahJiFXozefg==","signatures":[{"sig":"MEQCID7Sy2RHUQs8okcSqxGGEECxDgrwawT/u36ET4UkocfFAiAHh3ZrYtSsa5i8HE/zAavi9sQ7AKUnWdHAAxUsi7tC9w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":159847},"main":"dist/scan.js","gitHead":"2db3e13103cb75ca438ae1574f1908d871a3a050","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"rm -rf dist && tsc","prepublishOnly":"npm run build","publish:release":"./publish.sh"},"_npmUser":{"name":"jwgkkk","email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.9.2","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"23.7.0","dependencies":{"ora":"^6.3.1","openai":"^5.8.2","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.19_1752734839944_0.8888120563729862","host":"s3://npm-registry-packages-npm-production"}},"0.2.20":{"name":"i18n-google","version":"0.2.20","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.20","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"aa908f4732118ca4ca54c39a88c67acfb71f4e41","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.20.tgz","fileCount":20,"integrity":"sha512-juKGXYtNKXsKpYzv7G2/YRwbamux5Eh9dqLRuCS9oDQrm815O9FLF9whsbFrbKITEBkG/ykL+hdM98fKfAIgMA==","signatures":[{"sig":"MEUCIQCLWsCB0ZsrCJGj79M9JhinXcvet+Wafk9ZCyZozBBLZAIgGs2Wfq+nrPe89md/e/AwMOhevTmOLgNmm9neudDMqWM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":160306},"main":"dist/scan.js","gitHead":"70dedba1907eed4c2fe65bcbb64ba8ceda1ce5e8","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"rm -rf dist && tsc","prepublishOnly":"npm run build","publish:release":"./publish.sh"},"_npmUser":{"name":"jwgkkk","email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.9.2","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"23.7.0","dependencies":{"ora":"^6.3.1","openai":"^5.8.2","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.20_1752738075004_0.3501313222161746","host":"s3://npm-registry-packages-npm-production"}},"0.2.21":{"name":"i18n-google","version":"0.2.21","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.21","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"11b4ccbe8c4178586769ac50a0084c6df1e0ac5f","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.21.tgz","fileCount":20,"integrity":"sha512-GAFsU3C+Wd9sfDJ9TygWVG29cYie+J74Uv3uiKCG1NDS7A/k2tnbDQn+HDP8k/U8+3jhq9xzqTDPaFU/uSdGDw==","signatures":[{"sig":"MEUCICrwRIfwGqclkn35LPcmqzp+GpL5NWROAJgT6Xn2u/nYAiEAlLgf24DD4DWgwEzxG9Csc4DMlid14yKLsG/8V5hRltQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188658},"main":"dist/scan.js","gitHead":"3aff6edc0b849cdd0e042b05e7d46d526f7ea8fd","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"rm -rf dist && tsc","prepublishOnly":"npm run build","publish:release":"./publish.sh"},"_npmUser":{"name":"jwgkkk","email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.9.2","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"23.7.0","dependencies":{"ora":"^6.3.1","openai":"^5.8.2","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.21_1753671685736_0.9408953265208937","host":"s3://npm-registry-packages-npm-production"}},"0.2.22":{"name":"i18n-google","version":"0.2.22","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.22","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"326dbb8e468598921fdff186995698136e141075","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.22.tgz","fileCount":20,"integrity":"sha512-vW8CpBnrTf3XwCeeSQDIIcs6LK5VhMqAPQB/rBLYvPcpiyHcL89XNuVmgwzV9g1lZ45qlKRpIQAxT1G9hU1KmQ==","signatures":[{"sig":"MEUCIGzMc6WmdFvL8YJbiq9hFC/aBgMDQI9Xq0PxwcjUSTtBAiEAvdErqGkODBwQMS9+fcQr90T3Jwb3L9unkllAQynN3us=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":189221},"main":"dist/scan.js","gitHead":"289c9cb495fd1512d98457b84847c229ef68190c","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"rm -rf dist && tsc","prepublishOnly":"npm run build","publish:release":"./publish.sh"},"_npmUser":{"name":"jwgkkk","email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.9.2","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"23.7.0","dependencies":{"ora":"^6.3.1","openai":"^5.8.2","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.22_1753675490323_0.23796081951989123","host":"s3://npm-registry-packages-npm-production"}},"0.2.23":{"name":"i18n-google","version":"0.2.23","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.2.23","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"ae00e6d1c37189779010797577419f3307e9a28f","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.2.23.tgz","fileCount":20,"integrity":"sha512-4b/l6NZobAbMI+rstqs6Ap81PrisPfqszReYl3xhVkgp50be7KRe40uHPYtaWPKS1QJTl75gaXkH3/CAoI2ciw==","signatures":[{"sig":"MEYCIQCR0GMqbQ2e504we2N0KOmImzAAy8DHNg74Qu0B1g8YMgIhANlowDUKBQcSzgSrMhQw7bbX5O20kEwPgC1Oxn6zUxwh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192141},"main":"dist/scan.js","gitHead":"d18bffeb793029206c0138b8fd67bcc68ae61cb6","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"rm -rf dist && tsc","prepublishOnly":"npm run build","publish:release":"./publish.sh"},"_npmUser":{"name":"jwgkkk","email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.9.2","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"23.7.0","dependencies":{"ora":"^6.3.1","openai":"^5.8.2","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.2.23_1753690566008_0.6418664423401981","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"i18n-google","version":"0.3.0","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.3.0","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"1c55e7842df0a6006e3324c9758048fd342d1e01","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.3.0.tgz","fileCount":24,"integrity":"sha512-hxngc1T6PZlV0LGayrAY/FOAqLNz6jQHv2/huLx0cLTW1nqyX1DRPsNX3UjtbaUQtC3XoK6vQcuSgIBvJSvo8w==","signatures":[{"sig":"MEQCIGq3iQ1Aj9YSEy+q1RBB2iChMDsp2fvAwmu2KsJvMhYkAiAS6GnY1yMUM9yKbycJ1BQsNMf5NbNUABsRhFY4ElfYJg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187880},"main":"dist/scan.js","gitHead":"7efa790bdf6bf2123e33f217f40941d58f9dfdd4","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"rm -rf dist && tsc","prepublishOnly":"npm run build","publish:release":"./publish.sh"},"_npmUser":{"name":"jwgkkk","email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.9.2","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"23.7.0","dependencies":{"ora":"^6.3.1","openai":"^5.8.2","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.3.0_1755676676085_0.2604201027005755","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"i18n-google","version":"0.3.1","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.3.1","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"d269736bc8fd747a0e50cb3baddb36e8493ee575","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.3.1.tgz","fileCount":24,"integrity":"sha512-uH1lTKye0glC5AQoIa9J+zD+T1BRdopuPWkZDJorDei+r5o0O/kyTDJ+Xc4tc8iI6GPwZMiDLO+s7RXsh1iLBw==","signatures":[{"sig":"MEUCICavUwzbgYnQJKB6LSeHPDlEo/g3YQ/94zMdSWejDC25AiEA41ruCSqhHpCYGXmC1KpAbPmWlmHtyuqSfCTpiWUQ9Dk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188577},"main":"dist/scan.js","gitHead":"3e69d6f02b36b8e0c47985375cdd50ff626d1ef7","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"rm -rf dist && tsc","prepublishOnly":"npm run build","publish:release":"./publish.sh"},"_npmUser":{"name":"jwgkkk","email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.9.2","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"23.7.0","dependencies":{"ora":"^6.3.1","openai":"^5.8.2","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.3.1_1755685184518_0.1478989451162449","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"i18n-google","version":"0.3.2","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"author":{"name":"jwgkkk"},"license":"MIT","_id":"i18n-google@0.3.2","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"homepage":"https://github.com/947776795/i18n-google#readme","bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"bin":{"i18n-google":"dist/scan.js"},"dist":{"shasum":"4794902afc6e14c3169f609ae100c4dc9f375aa8","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.3.2.tgz","fileCount":26,"integrity":"sha512-b7UB7zMVItPZ7I+bkMGbf6BrWK0beR6DnivQPJ5U4gRU9ybNPGg5A+IOI+7v5jVRsDOGXzY6NkWY90cBgphKhg==","signatures":[{"sig":"MEUCIEtAF6alt12LfkEEOyLHVR8cjDEAhUaZEpx4gXH85qNTAiEAs6hLTvIDT9XMao0WVHEcuGCU4bDDM6FgscznBo2T7Uw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":218689},"main":"dist/scan.js","gitHead":"106ef285e364b0779b84109218c74fe245d2e33f","scripts":{"dev":"ts-node scan.ts","scan":"node dist/scan.js","test":"jest","build":"rm -rf dist && tsc","prepublishOnly":"npm run build","publish:release":"./publish.sh"},"_npmUser":{"name":"jwgkkk","email":"jack.jin.min@gmail.com"},"repository":{"url":"git+https://github.com/947776795/i18n-google.git","type":"git"},"_npmVersion":"10.9.2","description":"I18n scanning system with Google Sheets integration","directories":{},"_nodeVersion":"23.7.0","dependencies":{"ora":"^6.3.1","openai":"^5.8.2","inquirer":"^12.6.3","ast-types":"^0.16.1","minimatch":"^10.0.1","googleapis":"^129.0.0","jscodeshift":"^17.3.0","google-spreadsheet":"^5.0.2","google-auth-library":"^10.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ora":"^3.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/inquirer":"^9.0.8","@types/minimatch":"^5.1.2","@types/jscodeshift":"^17.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18n-google_0.3.2_1756710118646_0.5105958914249835","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"i18n-google","version":"0.3.3","description":"I18n scanning system with Google Sheets integration","main":"dist/scan.js","bin":{"i18n-google":"dist/scan.js"},"keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"repository":{"type":"git","url":"git+https://github.com/947776795/i18n-google.git"},"bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"homepage":"https://github.com/947776795/i18n-google#readme","scripts":{"build":"rm -rf dist && tsc","scan":"node dist/scan.js","dev":"ts-node scan.ts","test":"jest","prepublishOnly":"npm run build","publish:release":"./publish.sh"},"author":{"name":"jwgkkk"},"license":"MIT","dependencies":{"ast-types":"^0.16.1","google-auth-library":"^10.3.0","google-spreadsheet":"^5.0.2","googleapis":"^129.0.0","inquirer":"^12.6.3","jscodeshift":"^17.3.0","minimatch":"^10.0.1","openai":"^5.8.2","ora":"^6.3.1","update-notifier":"^7.3.1"},"devDependencies":{"@types/inquirer":"^9.0.8","@types/jest":"^29.5.12","@types/jscodeshift":"^17.3.0","@types/minimatch":"^5.1.2","@types/node":"^20.11.24","@types/ora":"^3.2.0","@types/update-notifier":"^6.0.8","jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","typescript":"^5.3.3"},"_id":"i18n-google@0.3.3","gitHead":"3943154ee3327812079bdf15af070d3dee6786ec","_nodeVersion":"23.7.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-WzQ4XudMVx42nCz06AitPQt4FWEXX8OL4kYnXB7kep/Lo2dnQDsySmS5DpEKKa54tG1unNNZ0/Uh4+0BhTICBA==","shasum":"062b40123f7a23ec7daa6f10fe76511935393d75","tarball":"https://registry.npmjs.org/i18n-google/-/i18n-google-0.3.3.tgz","fileCount":27,"unpackedSize":223920,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDA8kJyV3fblDIElC7kGEPfaBOpYqyINdWUc1OcVzBCjAIhAKnStBytvIG6b7DW+yiJjXKLbnsJ9SuZqNN7FqILczGI"}]},"_npmUser":{"name":"jwgkkk","email":"jack.jin.min@gmail.com"},"directories":{},"maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/i18n-google_0.3.3_1760347497928_0.8135073463463061"},"_hasShrinkwrap":false}},"time":{"created":"2025-06-10T10:00:23.333Z","modified":"2025-10-13T09:24:58.307Z","1.0.0":"2025-06-10T10:00:23.549Z","0.0.1":"2025-06-10T10:01:53.390Z","0.2.0":"2025-06-24T06:46:27.556Z","0.2.1":"2025-06-25T02:49:38.853Z","0.2.2":"2025-06-25T03:48:55.312Z","0.2.3":"2025-06-25T06:57:28.756Z","0.2.4":"2025-06-25T06:59:46.411Z","0.2.5":"2025-06-26T06:29:53.023Z","0.2.6":"2025-06-26T12:02:08.397Z","0.2.7":"2025-06-27T05:40:23.892Z","0.2.10":"2025-06-30T11:11:26.176Z","0.2.11":"2025-06-30T11:11:36.354Z","0.2.12":"2025-06-30T11:11:45.686Z","0.2.8":"2025-06-30T11:31:19.801Z","0.2.9":"2025-07-01T09:31:38.043Z","0.2.15":"2025-07-03T07:18:48.671Z","0.2.16":"2025-07-03T07:33:14.833Z","0.2.17":"2025-07-03T08:00:22.071Z","0.2.18":"2025-07-13T14:25:56.353Z","0.2.19":"2025-07-17T06:47:20.167Z","0.2.20":"2025-07-17T07:41:15.176Z","0.2.21":"2025-07-28T03:01:25.924Z","0.2.22":"2025-07-28T04:04:50.512Z","0.2.23":"2025-07-28T08:16:06.211Z","0.3.0":"2025-08-20T07:57:56.287Z","0.3.1":"2025-08-20T10:19:44.705Z","0.3.2":"2025-09-01T07:01:58.849Z","0.3.3":"2025-10-13T09:24:58.127Z"},"bugs":{"url":"https://github.com/947776795/i18n-google/issues"},"author":{"name":"jwgkkk"},"license":"MIT","homepage":"https://github.com/947776795/i18n-google#readme","keywords":["i18n","internationalization","google-sheets","translation","automation","jscodeshift","typescript"],"repository":{"type":"git","url":"git+https://github.com/947776795/i18n-google.git"},"description":"I18n scanning system with Google Sheets integration","maintainers":[{"name":"jwgkkk","email":"jack.jin.min@gmail.com"}],"readme":"# i18n-google\n\n🚀 **企业级国际化自动化解决方案**\n\n一个功能强大的国际化代码转换工具，提供从代码扫描到翻译管理的完整自动化流程。支持智能代码转换、模块化翻译管理、Google Sheets 同步和智能键清理等企业级功能。\n\n## ✨ 核心特性\n\n### 🔄 智能代码转换\n\n- **自动文本识别**：智能识别字符串字面量、模板字符串和 JSX 文本节点\n- **AST 级转换**：基于 jscodeshift 的精确代码转换，保证语法正确性\n- **上下文感知**：智能处理 JSX 和普通 JavaScript 不同上下文\n- **灵活标记系统**：支持自定义开始和结尾标记符号\n- **🆕 组件插值支持**：智能处理 JSX 中的 HTML 标签和 React 组件混合翻译\n\n### 📦 模块化翻译管理\n\n- **文件路径映射**：基于源文件路径自动生成对应的翻译文件结构\n- **完整记录系统**：统一的翻译数据管理格式，支持版本控制\n- **增量合并策略**：智能合并本地和远程翻译数据\n- **LLM 集成翻译**：自动调用大语言模型进行新键翻译\n\n### 🧠 智能键清理系统\n\n- **深度代码分析**：扫描所有源代码，精确识别真正使用的翻译键\n- **安全删除机制**：删除前自动备份，支持一键恢复\n- **交互式确认**：友好的命令行界面，完全掌控清理过程\n- **强制保留配置**：支持配置重要键，避免误删\n\n### ☁️ Google Sheets 双向同步\n\n- **实时同步**：与 Google Sheets 双向同步翻译内容\n- **冲突解决**：智能处理本地和远程数据冲突\n- **批量操作**：支持大规模翻译数据的高效同步\n- **版本标记**：使用 mark 字段进行版本控制\n\n### 💬 企业级用户体验\n\n- **进度可视化**：实时显示操作进度和详细统计\n- **交互式界面**：友好的命令行交互，支持多级确认\n- **详细报告**：完整的操作统计和结果摘要\n- **错误处理**：分类错误处理和智能恢复机制\n- **🆕 自动更新提醒**：智能检测远程 npm 版本更新，及时通知用户升级\n\n### 🔧 技术特性\n\n- **TypeScript 支持**：完全使用 TypeScript 编写，提供完整类型安全\n- **模块化架构**：清晰的分层架构，易于扩展和维护\n- **性能优化**：并行处理、增量更新、内存优化\n- **多语言支持**：支持任意数量的目标语言\n- **🆕 高测试覆盖率**：核心模块达到 95%+ 的测试覆盖率，确保代码质量\n- **🆕 增强的LLM翻译**：支持重试机制、超时控制、术语表集成\n- **🆕 统一架构优化**：简化的Google Sheets集成，减少37%的重复代码\n\n## 🚀 快速开始\n\n### 安装\n\n```bash\n# 全局安装\nnpm install -g i18n-google\n\n# 项目安装\nnpm install i18n-google\n```\n\n### 基础配置\n\n在项目根目录创建 `i18n.config.js` 配置文件：\n\n```javascript\nmodule.exports = {\n  // 基础配置\n  rootDir: \"./src\", // 扫描根目录\n  outputDir: \"./src/translate\", // 翻译文件输出目录\n  languages: [\"en\", \"zh-CN\", \"es\"], // 支持的语言列表\n  include: [\"js\", \"jsx\", \"ts\", \"tsx\"], // 包含的文件类型\n\n  // 标记符号配置\n  startMarker: \"~\", // 开始标记\n  endMarker: \"~\", // 结尾标记\n\n  // 文件过滤\n  ignore: [\"**/test/**\", \"**/node_modules/**\", \"**/*.test.*\"],\n\n  // Google Sheets 同步（可选）\n  spreadsheetId: \"your-google-sheet-id\",\n  sheetName: \"translations\",\n  keyFile: \"./serviceAccountKeyFile.json\",\n  sheetsReadRange: \"A1:Z10000\", // Google Sheets 读取范围\n  sheetsMaxRows: 10000, // Sheets 最大行数\n\n  // 智能清理配置\n  forceKeepKeys: {\n    \"components/Header.ts\": [\"brand_name\", \"navigation_menu\"],\n    \"pages/auth.ts\": [\"login_title\", \"session_expired\"],\n  },\n\n  // LLM 翻译配置\n  apiKey: \"your-openai-api-key\", // 用于自动翻译新键\n  \n  // 🆕 增强的LLM翻译配置\n  llmRetries: 3,              // LLM翻译重试次数，默认3\n  llmTimeout: 30000,          // LLM翻译超时时间（毫秒），默认30000\n  llmTemperature: 0.2,        // LLM翻译温度参数，默认0.2\n  llmModel: \"qwen-turbo\",     // LLM模型名称，默认qwen-turbo\n  \n  // 🆕 术语表配置\n  enableGlossary: true,                    // 启用术语表支持，默认false\n  glossarySpreadsheetId: \"your-sheet-id\", // 术语表Google Sheets ID\n  glossarySheetName: \"terms\",             // 术语表sheet名称，默认terms\n\n  // 高级配置\n  logLevel: \"normal\", // silent | normal | verbose\n};\n```\n\n### 立即使用\n\n```bash\n# 运行扫描\ni18n-google\n\n# 或通过 npx\nnpx i18n-google\n\n# 项目中使用\nnpm run scan\n```\n\n## ⚙️ 详细配置\n\n### 基础配置选项\n\n| 选项          | 类型     | 默认值                    | 说明                      |\n| ------------- | -------- | ------------------------- | ------------------------- |\n| `rootDir`     | string   | `\"./src\"`                 | 要扫描的根目录            |\n| `outputDir`   | string   | `\"./src/translate\"`       | 翻译文件输出目录          |\n| `languages`   | string[] | `[\"en\"]`                  | 支持的语言列表            |\n| `include`     | string[] | `[\"js\",\"jsx\",\"ts\",\"tsx\"]` | 要包含的文件扩展名        |\n| `ignore`      | string[] | `[]`                      | 要忽略的文件/目录匹配模式 |\n| `startMarker` | string   | `\"~\"`                     | 开始标记符号              |\n| `endMarker`   | string   | `\"~\"`                     | 结尾标记符号              |\n\n### Google Sheets 配置\n\n| 选项              | 类型   | 说明                        |\n| ----------------- | ------ | --------------------------- |\n| `spreadsheetId`   | string | Google Sheets 文档 ID       |\n| `sheetName`       | string | 工作表名称                  |\n| `keyFile`         | string | Google 服务账号密钥文件路径 |\n| `sheetsReadRange` | string | Google Sheets 读取范围      |\n| `sheetsMaxRows`   | number | Sheets 最大行数限制         |\n\n### 智能清理配置\n\n| 选项            | 类型   | 说明             |\n| --------------- | ------ | ---------------- |\n| `forceKeepKeys` | object | 强制保留的键配置 |\n\n**forceKeepKeys 配置示例：**\n\n```javascript\n// 按模块配置强制保留的键（精确匹配）\nforceKeepKeys: {\n  \"components/Header.ts\": [\"brand_name\", \"navigation_menu\"],\n  \"pages/auth.ts\": [\"login_title\", \"session_expired\"],\n  \"utils/constants.ts\": [\"API_BASE_URL\", \"CONFIG_VERSION\"]\n}\n```\n\n### LLM 翻译配置\n\n| 选项     | 类型   | 默认值 | 说明                              |\n| -------- | ------ | ------ | --------------------------------- |\n| `apiKey` | string | -      | OpenAI API 密钥，用于自动翻译新键 |\n\n### 🆕 增强的 LLM 翻译配置\n\n| 选项              | 类型   | 默认值        | 说明                           |\n| ----------------- | ------ | ------------- | ------------------------------ |\n| `llmRetries`      | number | `3`           | LLM翻译失败重试次数            |\n| `llmTimeout`      | number | `30000`       | LLM翻译请求超时时间（毫秒）    |\n| `llmTemperature`  | number | `0.2`         | LLM翻译温度参数，控制翻译一致性 |\n| `llmModel`        | string | `qwen-turbo`  | LLM模型名称                    |\n\n### 🆕 术语表配置\n\n| 选项                     | 类型    | 默认值   | 说明                              |\n| ------------------------ | ------- | -------- | --------------------------------- |\n| `enableGlossary`         | boolean | `false`  | 是否启用术语表功能                |\n| `glossarySpreadsheetId`  | string  | -        | 术语表Google Sheets文档ID         |\n| `glossarySheetName`      | string  | `terms`  | 术语表工作表名称                  |\n\n**术语表 Google Sheets 格式：**\n\n| en      | zh       | es          | ko         | vi         | tr       | fr       |\n|---------|----------|-------------|------------|------------|----------|----------|\n| Login   | 登录     | Iniciar sesión | 로그인  | Đăng nhập  | Giriş yap | Se connecter |\n| API     | 接口     | API         | API        | API        | API      | API      |\n| Hello   | 你好     | Hola        | 안녕하세요 | Xin chào   | Merhaba  | Bonjour  |\n\n### 高级配置\n\n| 选项          | 类型   | 默认值     | 说明                                    |\n| ------------- | ------ | ---------- | --------------------------------------- |\n| `logLevel`    | string | `\"normal\"` | 日志级别：`silent`\\|`normal`\\|`verbose` |\n| `concurrency` | number | `5`        | 并发处理数量                            |\n| `maxFileSize` | number | `1MB`      | 单文件最大处理大小                      |\n| `encoding`    | string | `\"utf8\"`   | 文件编码格式                            |\n\n### 日志级别说明\n\n- **`silent`**：静默模式，不输出任何日志信息，适用于 CI/CD 环境\n- **`normal`**（推荐）：标准模式，输出关键操作信息和用户友好提示\n- **`verbose`**：详细模式，输出完整的调试信息，适用于开发和问题排查\n\n## 🏗️ 技术架构\n\n### 系统架构图\n\n```mermaid\ngraph TB\n    A[用户配置] --> B[I18nScanner 主控制器]\n    B --> C[FileScanner 文件扫描器]\n    B --> D[GoogleSheetsSync 远程同步]\n    B --> E[TranslationManager 翻译管理器]\n    B --> F[DeleteService 清理服务]\n    B --> G[UserInteraction 用户交互]\n\n    C --> H[FileTransformer 文件转换器]\n    H --> I[AstTransformer AST转换器]\n\n    E --> J[完整记录系统]\n    E --> K[模块化文件生成]\n    E --> L[LLM翻译集成]\n\n    F --> M[无用键检测]\n    F --> N[安全删除机制]\n\n    D --> O[Google Sheets API]\n\n    style B fill:#e3f2fd,stroke:#1976d2,stroke-width:3px\n    style E fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px\n    style F fill:#fff9c4,stroke:#f57c00,stroke-width:2px\n    style D fill:#e8f5e8,stroke:#388e3c,stroke-width:2px\n```\n\n### 核心模块说明\n\n#### 🎯 I18nScanner - 主控制器\n\n- **职责**：协调整个扫描和转换流程\n- **功能**：配置验证、流程编排、错误处理\n- **位置**：[`src/core/I18nScanner.ts`](src/core/I18nScanner.ts)\n\n#### 📁 FileScanner - 文件扫描器\n\n- **职责**：文件系统扫描和过滤\n- **功能**：递归目录扫描、文件类型过滤、忽略规则处理\n- **位置**：[`src/core/FileScanner.ts`](src/core/FileScanner.ts)\n\n#### 🔄 AstTransformer - AST 转换器\n\n- **职责**：基于 jscodeshift 的代码转换\n- **功能**：AST 解析、节点识别、代码替换、导入注入\n- **🆕 组件插值处理**：智能解析和转换 JSX 中的混合内容\n- **测试覆盖率**：95.44% 语句覆盖率，98.21% 函数覆盖率\n- **位置**：[`src/core/AstTransformer.ts`](src/core/AstTransformer.ts)\n\n#### 📦 TranslationManager - 翻译管理器\n\n- **职责**：翻译数据的统一管理\n- **功能**：完整记录维护、模块化文件生成、增量合并\n- **位置**：[`src/core/TranslationManager.ts`](src/core/TranslationManager.ts)\n\n#### 🧹 DeleteService - 智能清理服务\n\n- **职责**：无用翻译键的检测和清理\n- **功能**：深度代码分析、安全删除、备份恢复\n- **位置**：[`src/core/DeleteService.ts`](src/core/DeleteService.ts)\n\n#### ☁️ GoogleSheetsSync - 远程同步\n\n- **职责**：与 Google Sheets 的双向数据同步\n- **功能**：API 集成、数据格式转换、冲突解决\n- **位置**：[`src/core/GoogleSheetsSync.ts`](src/core/GoogleSheetsSync.ts)\n\n### 数据流程\n\n```mermaid\nsequenceDiagram\n    participant U as 用户\n    participant S as I18nScanner\n    participant F as FileScanner\n    participant T as AstTransformer\n    participant M as TranslationManager\n    participant G as GoogleSheetsSync\n    participant D as DeleteService\n\n    U->>S: 启动扫描\n    S->>G: 拉取远程数据\n    G-->>S: 返回翻译数据\n    S->>F: 扫描项目文件\n    F-->>S: 返回文件列表\n    S->>T: 转换代码文件\n    T-->>S: 返回转换结果\n    S->>M: 生成翻译文件\n    M-->>S: 完成文件生成\n    S->>D: 检测无用键\n    D->>U: 交互式确认\n    U-->>D: 用户选择\n    D-->>S: 清理完成\n    S->>G: 推送更新数据\n    G-->>S: 同步完成\n```\n\n## 📝 处理模式\n\n本工具支持三种文本处理模式：\n\n### 1. 标记符号模式\n\n适用于字符串字面量和模板字符串，需要用标记符号包围文本：\n\n#### 标记符号示例\n\n**使用波浪线标记（默认）**\n\n```javascript\n// 配置\nstartMarker: \"~\";\nendMarker: \"~\";\n\n// 代码中的用法\nconst message = \"~Hello World~\";\nconst template = `~Hello ${user.name}!~`;\n```\n\n**使用自定义标记**\n\n```javascript\n// 配置\nstartMarker: \"T_\";\nendMarker: \"_T\";\n\n// 代码中的用法\nconst message = \"T_Hello World_T\";\nconst template = `T_Hello ${user.name}!_T`;\n```\n\n**使用双括号标记**\n\n```javascript\n// 配置\nstartMarker: \"[[\";\nendMarker: \"]]\";\n\n// 代码中的用法\nconst message = \"[[Hello World]]\";\nconst template = `[[Hello ${user.name}!]]`;\n```\n\n### 2. JSX 纯文本模式\n\n自动处理 JSX 元素中的纯文本节点，无需标记符号：\n\n```jsx\n// 自动处理的 JSX 文本\n<div>\n  Hello World {/* 会被自动转换 */}\n  <p>Welcome to our app</p> {/* 会被自动转换 */}\n  <span>{\"~Marked text~\"}</span> {/* 标记模式处理 */}\n</div>\n```\n\n### 3. 🆕 JSX 组件插值模式\n\n**新特性**：智能处理包含 HTML 标签和 React 组件的复杂翻译文本：\n\n```jsx\n// 组件插值处理 - 支持混合内容\n<div>~Welcome <strong>{name}</strong>, click <Link to=\"/help\">here</Link> for help~</div>\n\n// 转换后：\n<div>{I18n.t(\"welcome_message\", { \n  var0: name,\n  el0: text => <strong>{text}</strong>,\n  el1: text => <Link to=\"/help\">{text}</Link>\n})}</div>\n```\n\n**支持的组件插值功能：**\n- **HTML 标签插值**：`<strong>`、`<em>`、`<span>` 等\n- **React 组件插值**：`<Link>`、`<Button>`、自定义组件等\n- **属性完整保持**：所有 props 和事件处理器都会被保留\n- **嵌套元素处理**：支持合理的嵌套结构（采用平铺策略）\n- **变量和组件混合**：同时支持变量插值和组件插值\n\n## 🔄 转换示例\n\n### 转换前\n\n```javascript\nconst message = \"~Hello World~\";\nconst template = `~Hello ${user.name}!~`;\nconst greeting = \"Normal text\"; // 不会被转换（没有标记符号）\n\nfunction Component() {\n  return (\n    <div>\n      Pure JSX Text {/* 会被转换（JSX纯文本） */}\n      <p title=\"~Attribute~\">Welcome</p> {/* title属性和文本都会被转换 */}\n      {/* 🆕 组件插值示例 */}\n      <div>~Click <Link to=\"/help\" className=\"link\">here</Link> for <strong>help</strong>~</div>\n    </div>\n  );\n}\n```\n\n### 转换后\n\n```javascript\nimport { I18nUtil } from \"@utils/i18n\";\nimport Translations from \"@translate/Component\";\n\nconst I18n = I18nUtil.createScoped(Translations);\n\nconst message = I18n.t(\"a1b2c3d4\");\nconst template = I18n.t(\"e5f6g7h8\", { var0: user.name });\nconst greeting = \"Normal text\";\n\nfunction Component() {\n  return (\n    <div>\n      {I18n.t(\"f9g0h1i2\")}\n      <p title={I18n.t(\"j3k4l5m6\")}>{I18n.t(\"n7o8p9q0\")}</p>\n      {/* 🆕 组件插值转换结果 */}\n      <div>{I18n.t(\"click_help_message\", {\n        el0: text => React.createElement(Link, { to: \"/help\", className: \"link\" }, text),\n        el1: text => React.createElement(\"strong\", null, text)\n      })}</div>\n    </div>\n  );\n}\n```\n\n### 🆕 复杂组件插值示例\n\n```jsx\n// 转换前：复杂的混合内容\n<div>~Welcome <strong>{user.name}</strong>, you have <Badge count={notifications}>{count}</Badge> new messages. <Button onClick={handleRead} variant=\"primary\">Read now</Button>~</div>\n\n// 转换后：智能拆解和重组\n<div>{I18n.t(\"welcome_notifications\", {\n  var0: user.name,\n  var1: count,\n  el0: text => <strong>{text}</strong>,\n  el1: text => <Badge count={notifications}>{text}</Badge>,\n  el2: text => <Button onClick={handleRead} variant=\"primary\">{text}</Button>\n})}</div>\n\n// 翻译文件中的文本：\n// \"Welcome <el0>%{var0}</el0>, you have <el1>%{var1}</el1> new messages. <el2>Read now</el2>\"\n```\n\n## 🔧 核心处理逻辑\n\n1. **字符串检测**：\n\n   - 标记模式：检测以 `startMarker` 开头和 `endMarker` 结尾的字符串\n   - JSX 模式：自动检测 JSX 元素中的纯文本节点\n\n2. **格式化处理**：自动去除开始和结尾的标记符号\n\n3. **翻译键生成**：基于文件路径和文本内容生成 MD5 哈希键\n\n4. **智能替换**：\n   - 在 JSX 中包装为 `{I18n.t(key)}`\n   - 在普通 JS 中直接替换为 `I18n.t(key)`\n   - 模板字符串转换为带参数的调用\n\n## 📋 模板字符串处理\n\n对于包含变量的模板字符串：\n\n```javascript\n// 原始代码\n`~Hello ${name}, you have ${count} items~`;\n\n// 转换为\nI18n.t(\"hash123\", { var0: name, var1: count });\n\n// 翻译文本存储为\n(\"Hello %{var0}, you have %{var1} items\");\n```\n\n## 🆕 组件插值详解\n\n### 工作原理\n\n组件插值功能通过以下步骤实现：\n\n1. **AST 解析**：识别标记文本中的 JSX 元素和变量\n2. **元素提取**：将 HTML 标签和 React 组件提取为独立的工厂函数\n3. **文本模板化**：生成包含占位符的翻译文本\n4. **运行时渲染**：使用工厂函数重构完整的 JSX 结构\n\n### 支持的元素类型\n\n```jsx\n// HTML 标签\n~Click <strong>here</strong>~ \n// → \"Click <el0>here</el0>\"\n\n// React 组件  \n~Visit <Link to=\"/home\">homepage</Link>~\n// → \"Visit <el0>homepage</el0>\"\n\n// 自闭合标签\n~Icon <Icon name=\"star\" /> here~\n// → \"Icon <el0/> here\"\n\n// 复杂属性\n~Click <Button onClick={handler} disabled={loading}>Submit</Button>~\n// → \"Click <el0>Submit</el0>\"\n```\n\n### 属性处理\n\n- **静态属性**：`className=\"btn\"` → `className: \"btn\"`\n- **动态属性**：`onClick={handler}` → `onClick: handler`\n- **布尔属性**：`disabled` → `disabled: true`\n- **复杂表达式**：`style={{color: 'red'}}` → `style: {color: 'red'}`\n- **扩展属性**：`{...props}` （会被过滤，保留其他属性）\n\n### I18nUtil 增强\n\n为了支持组件插值，`I18nUtil` 类已扩展支持：\n\n```typescript\n// 自动检测并处理元素插值\nI18n.t(\"template_with_elements\", {\n  var0: userName,\n  el0: (text) => <strong>{text}</strong>,\n  el1: (text) => <Link to=\"/help\">{text}</Link>\n})\n\n// 返回完整的 React 节点树\n```\n\n## ⚙️ 工作原理\n\n### 处理流程图\n\n```mermaid\nflowchart LR\n    A[\"🚀 开始扫描\"] --> B[\"⚙️ 加载配置\"]\n    B --> C[\"📁 扫描文件\"]\n    C --> D[\"🔍 解析 AST\"]\n\n    D --> E[\"📝 识别文本节点\"]\n\n    subgraph \"处理模式\"\n        E --> F1[\"🏷️ 标记字符串<br/>~text~\"]\n        E --> F2[\"📄 JSX纯文本<br/><div>text</div>\"]\n        E --> F3[\"🔗 模板字符串<br/>`~Hello ${name}~`\"]\n    end\n\n    F1 --> G[\"🔑 生成键值\"]\n    F2 --> G\n    F3 --> G\n\n    G --> H[\"🔄 替换调用<br/>I18n.t()\"]\n    H --> I[\"📦 添加导入\"]\n    I --> J[\"💾 保存文件\"]\n\n    J --> K[\"📋 生成翻译\"]\n    K --> L[\"☁️ 同步远程\"]\n    L --> M[\"✅ 完成\"]\n\n    style A fill:#e3f2fd,stroke:#1976d2,stroke-width:2px\n    style M fill:#c8e6c9,stroke:#388e3c,stroke-width:2px\n    style F1 fill:#fff9c4,stroke:#f57c00,stroke-width:2px\n    style F2 fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px\n    style F3 fill:#e8f5e8,stroke:#388e3c,stroke-width:2px\n    style G fill:#fce4ec,stroke:#c2185b,stroke-width:2px\n    style H fill:#e1f5fe,stroke:#0277bd,stroke-width:2px\n```\n\n### 详细步骤\n\n1. **文件扫描**: 根据配置递归扫描指定目录下的文件\n2. **内容识别**: 使用标记符号或 JSX 文本节点检测需要国际化的文案\n3. **代码转换**: 使用 jscodeshift 将识别的文案替换为 `I18n.t(key)` 调用\n4. **导入注入**: 自动添加 I18n 相关的导入语句\n5. **翻译生成**: 为每种语言生成对应的 JSON 翻译文件\n6. **远程同步**: 与 Google Sheets 双向同步翻译内容\n\n## ☁️ Google Sheets 配置\n\n### 设置步骤\n\n1. 创建 Google Cloud 项目并启用 Google Sheets API\n2. 创建服务账号并下载密钥文件\n3. 将密钥文件保存为 `serviceAccountKeyFile.json`\n4. 与服务账号邮箱共享您的 Google Sheets\n\n### 数据格式\n\nGoogle Sheets 中的数据格式：\n\n```\n| key | en | zh-CN | es | fr | mark |\n|-----|----|----|----|----|------|\n| [components/Header.ts][Welcome] | Welcome | 欢迎 | Bienvenido | Bienvenue | 0 |\n| [pages/home.ts][Get Started] | Get Started | 开始使用 | Comenzar | Commencer | 1 |\n```\n\n## 🧹 智能键清理功能\n\n### 功能特性\n\n- 🔍 **深度代码分析**：扫描所有代码文件，识别真正使用的翻译键\n- 🛡️ **安全机制**：删除前自动创建备份，支持一键恢复\n- 💬 **交互式界面**：友好的命令行交互，让您完全掌控清理过程\n- 📊 **详细报告**：显示清理统计和操作详情\n- ⚙️ **灵活配置**：支持强制保留特定键，避免误删\n\n### 使用场景\n\n- 🗑️ **项目重构后**：清理不再使用的旧翻译键\n- 📦 **版本发布前**：减少翻译文件大小，提升加载性能\n- 🔄 **定期维护**：保持翻译文件的整洁和最新状态\n- 👥 **团队协作**：统一清理标准，避免翻译冗余\n\n### 交互式清理界面\n\n```bash\n🔍 发现 15 个可删除的无用翻译Key\n\n? 请选择删除方式:\n❯ 🗑️ 全部删除 (15 个Key)\n  🎯 手动选择要删除的Key\n  ❌ 跳过删除\n\n# 手动选择界面\n? 请选择要删除的Key (共15个) - 使用空格选择，回车确认\n❯ ◯   1. [components/OldComponent.ts][deprecated_message]\n  ◯   2. [pages/removed.ts][old_title]\n  ◯   3. [utils/helper.ts][unused_text]\n```\n\n### 删除预览\n\n清理操作会生成预览文件供用户确认：\n\n```\nsrc/translate/\n├── delete-preview-2024-01-15T14-30-25-123Z.json  # 删除预览文件\n├── components/\n│   ├── Header.ts\n│   └── Button.ts\n└── i18n-complete-record.json                      # 完整翻译记录\n```\n\n## 📦 模块化翻译管理\n\n### 完整记录系统\n\n```typescript\n// 数据结构\ninterface CompleteTranslationRecord {\n  [translationPath: string]: {\n    [translationKey: string]: {\n      [languageKey: string]: string;\n    } & {\n      mark?: number; // 标记字段，用于版本控制\n    };\n  };\n}\n\n// 实际数据示例\n{\n  \"components/Header.ts\": {\n    \"Welcome\": {\n      \"en\": \"Welcome\",\n      \"zh-CN\": \"欢迎\",\n      \"es\": \"Bienvenido\",\n      \"mark\": 0\n    },\n    \"Hello %{var0}\": {\n      \"en\": \"Hello %{var0}\",\n      \"zh-CN\": \"你好 %{var0}\",\n      \"es\": \"Hola %{var0}\",\n      \"mark\": 0\n    }\n  }\n}\n```\n\n### 模块化文件生成\n\n```typescript\n// 自动生成的翻译文件结构\nsrc/\n├── components/\n│   ├── Header.tsx          // 源文件\n│   └── Button.tsx\n└── translate/              // 翻译文件目录\n    └── components/\n        ├── Header.ts       // 对应的翻译文件\n        └── Button.ts\n```\n\n### 生成的翻译文件格式\n\n```typescript\n// src/translate/components/Header.ts\nconst translations = {\n  en: {\n    Welcome: \"Welcome\",\n    \"Hello %{var0}\": \"Hello %{var0}\",\n    \"Click to continue\": \"Click to continue\",\n  },\n  \"zh-CN\": {\n    Welcome: \"欢迎\",\n    \"Hello %{var0}\": \"你好 %{var0}\",\n    \"Click to continue\": \"点击继续\",\n  },\n  es: {\n    Welcome: \"Bienvenido\",\n    \"Hello %{var0}\": \"Hola %{var0}\",\n    \"Click to continue\": \"Haz clic para continuar\",\n  },\n};\n\nexport default translations;\n```\n\n## 💻 使用方法\n\n### 命令行使用\n\n```bash\n# 全局安装后\ni18n-google\n\n# 或通过 npx\nnpx i18n-google\n\n# 项目中使用\nnpm run scan\n```\n\n### 🆕 自动更新提醒\n\n工具会在每次运行时自动检查 npm 仓库中是否有新版本可用。当有更新时，会显示如下提示：\n\n```bash\n┌───────────────────────────────────────────────────┐\n│                                                   │\n│   Update available 0.3.2 → 0.4.0                 │\n│   Run npm install -g i18n-google to update       │\n│                                                   │\n└───────────────────────────────────────────────────┘\n```\n\n**配置选项：**\n\n```bash\n# 禁用更新检查（通过环境变量）\nNO_UPDATE_NOTIFIER=1 i18n-google\n\n# 或在 shell 配置文件中永久禁用\nexport NO_UPDATE_NOTIFIER=1\n```\n\n**检查机制：**\n- 默认每 24 小时检查一次更新\n- 检查过程在后台异步执行，不影响工具性能\n- 检查结果会被缓存，避免频繁请求\n- 网络错误会静默处理，不影响正常使用\n\n### 编程使用\n\n```typescript\nimport { I18nScanner } from \"i18n-google\";\nimport config from \"./i18n.config.js\";\n\nconst scanner = new I18nScanner(config);\nawait scanner.scan();\n```\n\n### 运行时输出示例\n\n```bash\n🚀 开始国际化扫描...\n☁️ 从远端拉取翻译数据... ✅\n🔧 初始化翻译管理器... ✅\n📁 扫描项目文件... ✅ (找到 45 个文件)\n🔍 分析文件引用... ✅ (发现 128 个引用)\n🗑️ 检测无用Key... ✅ (发现 12 个无用Key)\n\n📊 扫描结果摘要\n==================================================\n📁 处理文件数: 45\n🔑 总翻译Key数: 128\n✨ 新增Key数: 8\n🗑️ 无用Key数: 12\n⏱️ 执行时间: 2.3s\n==================================================\n```\n\n## 📄 生成的翻译文件\n\n### 模块化格式\n\n`src/translate/components/Header.ts`:\n\n```typescript\nexport default {\n  en: {\n    Welcome: \"Welcome\",\n    Navigation: \"Navigation\",\n  },\n  \"zh-CN\": {\n    Welcome: \"欢迎\",\n    Navigation: \"导航\",\n  },\n};\n```\n\n## 📚 最佳实践\n\n### 🎯 项目集成建议\n\n**1. 渐进式集成**\n\n```bash\n# 第一步：小范围测试\nrootDir: \"./src/components/common\"  # 先测试公共组件\n\n# 第二步：扩大范围\nrootDir: \"./src/components\"         # 扩展到所有组件\n\n# 第三步：全项目覆盖\nrootDir: \"./src\"                    # 覆盖整个项目\n```\n\n**2. 标记符号选择**\n\n```javascript\n// 推荐：使用简洁明了的标记\nstartMarker: \"~\";\nendMarker: \"~\";\n\n// 避免：与现有代码冲突的标记\nstartMarker: \"{{\"; // 可能与模板语法冲突\nendMarker: \"}}\";\n```\n\n**3. 强制保留键配置**\n\n```javascript\nforceKeepKeys: {\n  \"components/Modal.ts\": [\n    \"confirm_dialog\",    // 确认对话框\n    \"cancel_button\"      // 取消按钮\n  ],\n  \"utils/errors.ts\": [\n    \"network_error\",     // 网络错误\n    \"validation_failed\"  // 验证失败\n  ]\n}\n```\n\n### 🔧 性能优化建议\n\n**1. 优化忽略规则**\n\n```javascript\nignore: [\n  \"**/node_modules/**\", // 必须忽略\n  \"**/dist/**\", // 构建输出\n  \"**/coverage/**\", // 测试覆盖率\n  \"**/*.test.*\", // 测试文件\n  \"**/*.spec.*\", // 规范文件\n  \"**/storybook-static/**\", // Storybook 输出\n];\n```\n\n### 🚀 CI/CD 集成\n\n**GitHub Actions 示例**\n\n```yaml\nname: i18n Check\non: [push, pull_request]\n\njobs:\n  i18n-check:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - uses: actions/setup-node@v3\n        with:\n          node-version: \"18\"\n\n      - name: Install dependencies\n        run: npm ci\n\n      - name: Run i18n scan\n        run: npx i18n-google\n        env:\n          GOOGLE_SHEETS_API_KEY: ${{ secrets.GOOGLE_SHEETS_API_KEY }}\n```\n\n## 🔍 故障排除\n\n### 常见问题解决\n\n**1. Google Sheets 连接失败**\n\n```bash\n# 错误信息\nError: Unable to connect to Google Sheets API\n\n# 解决方案\n✅ 检查服务账号密钥文件路径\n✅ 确认 Google Sheets API 已启用\n✅ 验证工作表共享权限\n✅ 检查网络连接\n```\n\n**2. 文件转换失败**\n\n```bash\n# 错误信息\nError: Failed to transform file: syntax error\n\n# 解决方案\n✅ 检查文件语法是否正确\n✅ 确认文件编码为 UTF-8\n✅ 验证 jscodeshift 兼容性\n✅ 查看详细错误日志 (logLevel: \"verbose\")\n```\n\n**3. 翻译键冲突**\n\n```bash\n# 错误信息\nWarning: Duplicate translation key detected\n\n# 解决方案\n✅ 检查是否有重复的翻译文本\n✅ 确认文件路径映射正确\n✅ 使用强制保留键避免误删\n✅ 手动解决冲突后重新运行\n```\n\n**4. 内存不足**\n\n```bash\n# 错误信息\nError: JavaScript heap out of memory\n\n# 解决方案\n✅ 减少并发数量 (concurrency: 3)\n✅ 增加 Node.js 内存限制\n✅ 分批处理大型项目\n✅ 优化忽略规则减少文件数量\n```\n\n### 调试技巧\n\n**1. 启用详细日志**\n\n```javascript\n// 配置文件\nlogLevel: \"verbose\"\n\n// 或环境变量\nDEBUG=i18n-google:* npx i18n-google\n```\n\n**2. 分步骤测试**\n\n```bash\n# 只测试文件扫描\ni18n-google --dry-run\n\n# 只测试特定目录\nrootDir: \"./src/components/Button\"\n\n# 跳过远程同步\nspreadsheetId: \"\"  # 留空跳过同步\n```\n\n**3. 备份验证**\n\n```bash\n# 检查备份文件\nls -la src/translate/backup/\n\n# 恢复备份（如需要）\ncp -r src/translate/backup/latest/* src/translate/\n```\n\n## 🌟 企业级特性\n\n### 大规模项目支持\n\n- **批量处理**：支持处理数千个文件的大型项目\n- **增量更新**：只处理变更的文件，提升效率\n- **内存优化**：智能内存管理，避免内存溢出\n- **并发控制**：可配置的并发数量，平衡速度和资源使用\n\n### 团队协作功能\n\n- **统一配置**：团队共享配置文件，保证一致性\n- **版本控制**：翻译数据版本标记，支持回滚\n- **冲突解决**：智能处理多人协作时的数据冲突\n- **权限管理**：基于 Google Sheets 的细粒度权限控制\n\n### 质量保证\n\n- **类型安全**：完整的 TypeScript 支持\n- **错误处理**：分类错误处理和智能恢复\n- **数据验证**：翻译数据完整性验证\n- **自动备份**：操作前自动备份，支持一键恢复\n- **🆕 高测试覆盖率**：核心模块 95%+ 测试覆盖率，确保代码质量\n- **🆕 TDD 开发**：遵循测试驱动开发，新功能 100% 测试覆盖\n\n### 🆕 新增功能\n\n#### 🎯 组件插值支持\n- **智能JSX解析**：自动处理复杂的 JSX 混合内容翻译\n- **统一元素处理**：HTML 标签和 React 组件的一致化处理\n- **属性完整保持**：所有组件属性和事件处理器完整保留\n- **运行时优化**：智能的元素工厂和 React Fragment 渲染\n\n#### 🚀 增强的LLM翻译系统\n- **重试机制**：3次可配置重试，确保99%+翻译成功率\n- **超时控制**：30秒可配置超时，避免请求阻塞\n- **温度控制**：0.2温度参数确保翻译一致性\n- **模型优化**：使用qwen-turbo提升性能和降低成本\n- **术语表集成**：Google Sheets术语表自动应用，确保术语一致性\n\n#### 🏗️ 架构优化\n- **统一Google Sheets客户端**：减少37%的重复代码\n- **简化错误处理**：统一的错误分类和处理机制\n- **代码复用**：GlossaryManager和GoogleSheetsSync共享核心逻辑\n- **测试增强**：95%+测试覆盖率，TDD开发流程保证质量\n\n## 📈 性能指标\n\n### 处理能力\n\n- **文件处理速度**：平均 50-100 文件/秒\n- **翻译键生成**：平均 1000+ 键/秒\n- **Google Sheets 同步**：支持 10,000+ 行数据\n- **内存使用**：典型项目 < 500MB\n\n### 扩展性\n\n- **项目规模**：支持 10,000+ 文件的大型项目\n- **翻译键数量**：支持 100,000+ 翻译键\n- **语言数量**：支持 50+ 目标语言\n- **并发处理**：最高支持 10 个并发任务\n\n## 🎯 优势总结\n\n- **🚀 高效自动化**：一键完成从代码扫描到翻译文件生成的全流程\n- **🧠 智能处理**：基于 AST 的精确代码转换和智能键清理\n- **📦 模块化管理**：文件路径映射的模块化翻译文件组织\n- **☁️ 云端同步**：与 Google Sheets 的实时双向同步\n- **🛡️ 企业级可靠性**：完整的错误处理、备份恢复和类型安全\n- **👥 团队协作友好**：统一配置、版本控制和权限管理\n- **🔧 高度可配置**：灵活的配置选项适应各种项目需求\n- **📊 可视化体验**：友好的命令行界面和详细的操作报告\n- **🆕 组件插值支持**：业界领先的 JSX 混合内容智能处理\n- **🆕 增强翻译引擎**：重试机制、超时控制、术语表集成，99%+翻译成功率\n- **🆕 架构优化**：减少37%重复代码，统一Google Sheets集成\n- **🆕 高质量保证**：95%+ 测试覆盖率，TDD 开发流程确保代码可靠性\n- **🆕 自动更新提醒**：智能版本检查，确保用户始终使用最新功能和修复\n\n## 🛠️ 开发\n\n### 安装依赖\n\n```bash\nnpm install\n```\n\n### 构建项目\n\n```bash\nnpm run build\n```\n\n### 运行测试\n\n```bash\n# 运行所有测试\nnpm test\n\n# 运行测试并查看覆盖率\nnpm test -- --coverage\n\n# 运行特定测试文件\nnpm test -- src/core/__tests__/AstTransformer.test.ts\n```\n\n### 🆕 测试覆盖率\n\n项目维护高质量的测试覆盖率：\n\n- **AstTransformer.ts**: 95.44% 语句覆盖率，98.21% 函数覆盖率\n- **核心功能全覆盖**：包括组件插值、边界情况处理等\n- **持续集成**：每次提交都会运行完整的测试套件\n\n### 开发模式\n\n```bash\nnpm run dev\n```\n\n## 📄 许可证\n\nISC License\n\n## 🤝 贡献\n\n欢迎提交 Issue 和 Pull Request！\n\n### 贡献指南\n\n1. Fork 本仓库\n2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)\n3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)\n4. 推送到分支 (`git push origin feature/AmazingFeature`)\n5. 开启 Pull Request\n\n## 💬 支持\n\n如果您在使用过程中遇到问题，请：\n\n1. **查看文档**：仔细阅读配置说明和最佳实践\n2. **检查配置**：验证 `i18n.config.js` 配置是否正确\n3. **启用调试**：使用 `logLevel: \"verbose\"` 获取详细信息\n4. **查看示例**：参考项目中的示例配置\n5. **提交 Issue**：详细描述问题和环境信息\n\n### 获取帮助\n\n- 📖 [文档](README.md)\n- 🐛 [问题反馈](https://github.com/your-repo/issues)\n- 💡 [功能建议](https://github.com/your-repo/issues/new?template=feature_request.md)\n- 📧 [邮件支持](mailto:support@example.com)\n\n---\n\n## 国际化方案对比分析：i18n-google vs. 主流库\n\n本文档是对 `i18n-google`、现代的 `next-intl` 以及经典的 `next-i18next` 进行的最终、全面的对比总结，涵盖了设计哲学、核心功能、开发体验及潜在缺陷。\n\n---\n\n### 一、核心设计哲学\n\n> #### 🪄 i18n-google (本项目): “自动化魔法” + 工作流编排器\n>\n> 一个功能全面、高度集成的解决方案，旨在通过一个 `scan` 命令完成“同步-扫描-转换-清理-生成-同步”的完整闭环。其核心是**自动化**和对源代码的**直接转换 (codemod)**。\n\n> #### 🤝 `next-intl`: “交互式引导” + 现代开发者工具集\n>\n> 一套轻量、正交的工具（库、API、IDE 插件），让开发者在编码过程中，通过**实时反馈**和**主动标记**的方式完成 i18n 工作。其核心是**开发者体验**和与 **Next.js App Router** 的无缝集成。\n\n> #### 🌱 `next-i18next`: “成熟生态” + 经典配置驱动\n>\n> 依托于久经考验的 `i18next` 生态，提供了一套功能丰富、高度可配置的解决方案。在 **Pages Router** 中表现极其稳定，但在 App Router 中的集成不如 `next-intl` 原生。\n\n---\n\n### 二、功能特性横向对比\n\n| 特性               | i18n-google (本项目)                   | `next-intl`                        | `next-i18next`                           |\n| :----------------- | :------------------------------------- | :--------------------------------- | :--------------------------------------- |\n| **提取 ✍️**        | **自动代码重写** (`scan` 脚本)         | **手动标记** + **IDE 实时创建**    | **手动标记** + **命令行提取** / IDE 创建 |\n| **体验 😊**        | **批处理模式** (开发时无感)            | **实时交互模式** (IDE 引导)        | **混合模式** (IDE 或命令行)              |\n| **密钥 🔑**        | **基于内容** (e.g., `t('你好')`)       | **基于 ID** (e.g., `t('welcome')`) | **基于 ID** (e.g., `t('welcome')`)       |\n| **模块化 📦**      | **基于文件路径** (自动镜像 `src` 目录) | **基于命名空间** (开发者手动指定)  | **基于命名空间** (开发者手动指定)        |\n| **性能 ⚡️**       | **仅按模块加载** (存在性能缺陷)        | **按模块 + 按语言加载** (性能最优) | **按模块 + 按语言加载** (性能优秀)       |\n| **清理 🧹**        | **内置核心功能** (带预览)              | 依赖社区工具                       | 依赖社区工具                             |\n| **协作 🤝**        | **内置 Google Sheets 同步**            | 灵活集成各种 TMS (需配置)          | 灵活集成各种 TMS (生态成熟)              |\n| **App Router 🧭**  | 自定义实现 (兼容性待定)                | **最佳** (专为 App Router 设计)    | **一般** (集成相对繁琐)                  |\n| **侵入性 🔬**      | **高** (脚本作为 codemod 重写源码)     | **低** (生态工具只读源码，不修改)  | **低** (生态工具只读源码，不修改)        |\n| **老项目迁移成本** | **极低** (脚本自动化改造)              | **极高** (需要大量手动重构)        | **极高** (需要大量手动重构)              |\n| **🆕 组件插值** | **内置智能处理** (自动JSX解析)       | **手动实现** (需要开发者自定义)    | **手动实现** (需要开发者自定义)        |\n| **🆕 测试质量** | **95%+ 覆盖率** (TDD开发流程)        | **中等** (依赖社区测试)           | **高** (成熟生态丰富测试)              |\n| **🆕 翻译引擎** | **企业级** (重试+超时+术语表)        | **基础** (需要自行增强)           | **基础** (需要自行增强)                |\n| **🆕 架构质量** | **统一优化** (减少37%重复代码)       | **精简** (轻量化设计)            | **成熟** (久经考验)                   |\n\n---\n\n### 三、总结与展望\n\n#### i18n-google (本项目)\n\n- **✅ 优点**:\n  - **极低的成熟项目迁移成本**: `scan` 脚本的核心优势在于能**自动化**地为已存的大量硬编码文本进行国际化改造，这是主流库手动重构方式无法比拟的。\n  - **自动化程度极高**: 一键完成从代码转换到云同步的全流程。\n  - **强大的维护功能**: 内置的无用 Key 清理是巨大优势。\n  - **对开发者透明**: 在编码阶段，心智负担几乎为零。\n  - **🆕 组件插值领先**: 业界首个实现自动化 JSX 混合内容处理的国际化工具。\n  - **🆕 企业级翻译引擎**: 重试机制、超时控制、术语表集成，确保99%+翻译成功率。\n  - **🆕 架构统一优化**: 减少37%重复代码，统一Google Sheets集成，显著提升维护性。\n  - **🆕 高质量保证**: 95%+ 测试覆盖率，TDD 开发流程确保代码健壮性。\n- **❌ 当前缺点**:\n  - **性能瓶颈**: 模块化文件未按语言分割，导致客户端加载了不必要的翻译数据。\n  - **工作流割裂**: 批处理模式缺乏实时反馈。\n  - **密钥脆弱**: 基于内容的密钥在文案变更时会导致所有翻译失效。\n- **🚀 改进建议**:\n  1.  **重构生成逻辑**，实现按语言生成独立的翻译文件，并改造 `I18nUtil` 以支持动态加载，解决性能瓶颈。\n  2.  **配置 i18n Ally**，引入 IDE 实时反馈，弥补工作流割裂问题。\n  3.  **升级密钥策略**，改为脚本自动生成稳定的 ID，增强系统健壮性。\n\n#### next-intl\n\n- **✅ 优点**:\n  - **性能最佳**: 真正的按需加载。\n  - **开发体验流畅**: 与 IDE 和 App Router 的结合天衣无缝。\n  - **类型安全**: 提供了优秀的 TypeScript 支持。\n- **❌ 缺点**:\n  - **生态相对年轻**: 相比 `i18next`，工具链和插件选择较少。\n  - **功能相对精简**: 像无用 Key 清理这样的高级功能需要自己动手或寻找社区方案。\n\n#### next-i18next\n\n- **✅ 优点**:\n  - **生态极其成熟**: 拥有庞大的插件、工具和社区支持。\n  - **高度可配置**: 提供了丰富的选项来满足各种复杂场景。\n  - **稳定可靠**: 在 Pages Router 时代是绝对的王者。\n- **❌ 缺点**:\n  - **与 App Router 的适配不佳**: 其设计哲学与 App Router 的服务器组件模式不完全匹配，集成成本高。\n  - **API 相对繁琐**: 配置和使用上比 `next-intl` 更复杂。\n\n综上所述，`i18n-google` 是一个功能强大的企业级工具，尤其在自动化和维护性上表现出色。**🆕 随着组件插值功能的加入，成为业界首个实现自动化 JSX 混合内容处理的国际化工具**，在技术上具备了领先优势。其主要的改进方向是**提升性能**和**优化开发体验**。通过借鉴 `next-intl` 的“按需加载”和“IDE 实时交互”理念，您的方案有潜力成为一个集两家之长、既自动化又高效的顶级国际化解决方案。\n\n---\n\n#### 附注：关于“侵入性”的精确定义\n\n“侵入性”在此处特指国际化工具是否会**修改开发者编写的源代码**。\n\n- **高侵入性 (High Intrusiveness)**：指工具（如本项目的 `scan` 脚本）会作为代码转换器 (codemod) 运行，自动将代码中的裸露字符串（`'你好'`）重写为函数调用（`t('你好')`）。开发者编写的并非最终代码。\n- **低侵入性 (Low Intrusiveness)**：指工具（如 `i18n-ally` 或 `i18next-parser`）只会**读取**源代码来识别 `t()` 函数调用，以提供辅助功能（如创建缺失的 key），但**绝不会修改**开发者已经写好的代码。开发者编写的代码即是最终代码。\n\n`next-intl` 和 `next-i18next` 库本身不提供提取功能，其生态工具遵循的是低侵入性原则。\n","readmeFilename":"README.md"}