10.10综合交易所原始源码_移动端
1
admin
2026-01-10 b719b3b66ec4893057df275e3871a6bd0029ac3c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
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();