From b719b3b66ec4893057df275e3871a6bd0029ac3c Mon Sep 17 00:00:00 2001
From: admin <344137771@qq.com>
Date: Sat, 10 Jan 2026 11:29:09 +0800
Subject: [PATCH] 1

---
 check-i18n-keys.js |  178 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 178 insertions(+), 0 deletions(-)

diff --git a/check-i18n-keys.js b/check-i18n-keys.js
new file mode 100644
index 0000000..848aae3
--- /dev/null
+++ b/check-i18n-keys.js
@@ -0,0 +1,178 @@
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+
+// 语言文件列表
+const languageFiles = [
+    'en.js',
+    'CN.js',
+    'zh-CN.js',
+    'Korean.js',
+    'Japanese.js',
+    'de.js',
+    'fr.js',
+    'es.js',
+    'pt.js',
+    'Italy.js',
+    'gr.js',
+    'vi.js',
+    'th.js',
+    'ga.js',
+    'nl.js',
+    'sv.js',
+    'da.js',
+    'no.js',
+    'fi.js',
+    'lb.js',
+    'ro.js',
+    'tur.js'
+];
+
+const modulesPath = path.join(__dirname, 'src', 'i18n', 'modules');
+
+// 提取键的函数
+function extractKeys(filePath) {
+    try {
+        const content = fs.readFileSync(filePath, 'utf-8');
+        const keys = new Set();
+        
+        // 匹配 'key': 或 "key": 的模式
+        const keyPattern = /['"]([^'"]+)['"]\s*:/g;
+        let match;
+        
+        while ((match = keyPattern.exec(content)) !== null) {
+            keys.add(match[1]);
+        }
+        
+        return keys;
+    } catch (error) {
+        console.error(`Error reading ${filePath}:`, error.message);
+        return new Set();
+    }
+}
+
+// 主检查函数
+function checkI18nKeys() {
+    console.log('开始检查多语言文件键的一致性...\n');
+    
+    // 读取英文文件作为基准
+    const enPath = path.join(modulesPath, 'en.js');
+    const enKeys = extractKeys(enPath);
+    console.log(`英文文件 (en.js) 包含 ${enKeys.size} 个键\n`);
+    
+    const results = {};
+    
+    // 检查每个语言文件
+    for (const langFile of languageFiles) {
+        if (langFile === 'en.js') continue; // 跳过英文文件本身
+        
+        const langPath = path.join(modulesPath, langFile);
+        const langKeys = extractKeys(langPath);
+        
+        // 找出缺失的键(在en.js中但不在当前文件中)
+        const missingKeys = [...enKeys].filter(key => !langKeys.has(key));
+        
+        // 找出多余的键(在当前文件中但不在en.js中)
+        const extraKeys = [...langKeys].filter(key => !enKeys.has(key));
+        
+        results[langFile] = {
+            totalKeys: langKeys.size,
+            missingKeys,
+            extraKeys,
+            missingCount: missingKeys.length,
+            extraCount: extraKeys.length
+        };
+    }
+    
+    // 生成报告
+    console.log('='.repeat(80));
+    console.log('检查结果报告');
+    console.log('='.repeat(80));
+    console.log(`基准文件 (en.js): ${enKeys.size} 个键\n`);
+    
+    let hasIssues = false;
+    
+    for (const [langFile, result] of Object.entries(results)) {
+        const status = result.missingCount === 0 && result.extraCount === 0 ? '✓' : '✗';
+        console.log(`${status} ${langFile}`);
+        console.log(`  总键数: ${result.totalKeys}`);
+        
+        if (result.missingCount > 0) {
+            hasIssues = true;
+            console.log(`  ❌ 缺失 ${result.missingCount} 个键:`);
+            result.missingKeys.slice(0, 10).forEach(key => {
+                console.log(`    - ${key}`);
+            });
+            if (result.missingKeys.length > 10) {
+                console.log(`    ... 还有 ${result.missingKeys.length - 10} 个键`);
+            }
+        }
+        
+        if (result.extraCount > 0) {
+            hasIssues = true;
+            console.log(`  ⚠️  多余 ${result.extraCount} 个键:`);
+            result.extraKeys.slice(0, 10).forEach(key => {
+                console.log(`    - ${key}`);
+            });
+            if (result.extraKeys.length > 10) {
+                console.log(`    ... 还有 ${result.extraKeys.length - 10} 个键`);
+            }
+        }
+        
+        if (result.missingCount === 0 && result.extraCount === 0) {
+            console.log(`  ✓ 所有键都匹配`);
+        }
+        
+        console.log('');
+    }
+    
+    // 生成详细报告文件
+    const reportPath = path.join(__dirname, 'i18n-keys-report.txt');
+    let reportContent = '多语言文件键一致性检查报告\n';
+    reportContent += '='.repeat(80) + '\n';
+    reportContent += `检查时间: ${new Date().toLocaleString('zh-CN')}\n`;
+    reportContent += `基准文件 (en.js): ${enKeys.size} 个键\n\n`;
+    
+    for (const [langFile, result] of Object.entries(results)) {
+        reportContent += `\n${'='.repeat(80)}\n`;
+        reportContent += `${langFile}\n`;
+        reportContent += `${'='.repeat(80)}\n`;
+        reportContent += `总键数: ${result.totalKeys}\n`;
+        reportContent += `缺失键数: ${result.missingCount}\n`;
+        reportContent += `多余键数: ${result.extraCount}\n\n`;
+        
+        if (result.missingCount > 0) {
+            reportContent += `缺失的键 (${result.missingCount} 个):\n`;
+            result.missingKeys.forEach(key => {
+                reportContent += `  - ${key}\n`;
+            });
+            reportContent += '\n';
+        }
+        
+        if (result.extraCount > 0) {
+            reportContent += `多余的键 (${result.extraCount} 个):\n`;
+            result.extraKeys.forEach(key => {
+                reportContent += `  - ${key}\n`;
+            });
+            reportContent += '\n';
+        }
+    }
+    
+    fs.writeFileSync(reportPath, reportContent, 'utf-8');
+    console.log(`详细报告已保存到: ${reportPath}\n`);
+    
+    if (hasIssues) {
+        console.log('⚠️  发现不一致的键,请查看上方报告或详细报告文件');
+        process.exit(1);
+    } else {
+        console.log('✓ 所有语言文件的键都与英文文件一致!');
+        process.exit(0);
+    }
+}
+
+// 运行检查
+checkI18nKeys();
+

--
Gitblit v1.9.3