| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- /**
- * JSON 排序脚本
- * 对 locale JSON 文件按 key 字母顺序排序
- *
- * 使用方法:
- * node scripts/sort-json.cjs # 排序所有 locale 文件
- * node scripts/sort-json.cjs src/locales/en.json # 排序指定文件
- * node scripts/sort-json.cjs --check # 检查是否已排序(不修改)
- */
- const fs = require('fs')
- const path = require('path')
- // 配置
- const LOCALES_DIR = path.join(__dirname, '../src/locales')
- const LOCALE_FILES = ['en.json', 'zh-cn.json']
- /**
- * 读取并解析 JSON 文件
- */
- function readJSONFile(filePath) {
- try {
- const content = fs.readFileSync(filePath, 'utf-8')
- return JSON.parse(content)
- } catch (error) {
- console.error(`❌ 读取文件失败: ${filePath}`)
- console.error(error.message)
- return null
- }
- }
- /**
- * 按 key 排序 JSON 对象
- */
- function sortJSON(obj) {
- const sorted = {}
- const keys = Object.keys(obj).sort((a, b) => a.localeCompare(b, 'zh-CN'))
- for (const key of keys) {
- sorted[key] = obj[key]
- }
- return sorted
- }
- /**
- * 检查 JSON 是否已排序
- */
- function isJSONSorted(obj) {
- const keys = Object.keys(obj)
- const sortedKeys = [...keys].sort((a, b) => a.localeCompare(b, 'zh-CN'))
- return keys.every((key, index) => key === sortedKeys[index])
- }
- /**
- * 保存 JSON 文件
- */
- function saveJSONFile(filePath, data) {
- const content = JSON.stringify(data, null, 2) + '\n'
- fs.writeFileSync(filePath, content, 'utf-8')
- }
- /**
- * 处理单个文件
- */
- function processFile(filePath, checkOnly = false) {
- const fileName = path.basename(filePath)
- if (!fs.existsSync(filePath)) {
- console.log(`⚠️ 文件不存在: ${fileName}`)
- return false
- }
- const data = readJSONFile(filePath)
- if (!data) return false
- const keyCount = Object.keys(data).length
- if (isJSONSorted(data)) {
- console.log(`✅ ${fileName} (${keyCount} keys) - 已排序`)
- return true
- }
- if (checkOnly) {
- console.log(`❌ ${fileName} (${keyCount} keys) - 未排序`)
- return false
- }
- const sorted = sortJSON(data)
- saveJSONFile(filePath, sorted)
- console.log(`✅ ${fileName} (${keyCount} keys) - 已排序并保存`)
- return true
- }
- /**
- * 处理所有 locale 文件
- */
- function processAllFiles(checkOnly = false) {
- console.log('\n📦 处理 locale 文件...\n')
- let allSorted = true
- for (const file of LOCALE_FILES) {
- const filePath = path.join(LOCALES_DIR, file)
- const result = processFile(filePath, checkOnly)
- if (!result) allSorted = false
- }
- console.log('')
- if (checkOnly && !allSorted) {
- console.log('💡 运行 "pnpm run i18n" 来排序文件\n')
- process.exit(1)
- }
- return allSorted
- }
- // 主逻辑
- const args = process.argv.slice(2)
- const checkOnly = args.includes('--check')
- const targetFile = args.find((arg) => arg.endsWith('.json'))
- if (targetFile) {
- // 处理指定文件
- const filePath = path.isAbsolute(targetFile) ? targetFile : path.join(process.cwd(), targetFile)
- processFile(filePath, checkOnly)
- } else {
- // 处理所有文件
- processAllFiles(checkOnly)
- }
|