@nbtca/prompt 1.0.5 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/config/data.d.ts +1 -1
  2. package/dist/config/data.js +1 -1
  3. package/dist/core/logo.d.ts +3 -3
  4. package/dist/core/logo.js +40 -40
  5. package/dist/core/logo.js.map +1 -1
  6. package/dist/core/menu.d.ts +3 -3
  7. package/dist/core/menu.d.ts.map +1 -1
  8. package/dist/core/menu.js +112 -67
  9. package/dist/core/menu.js.map +1 -1
  10. package/dist/core/ui.d.ts +11 -11
  11. package/dist/core/ui.js +15 -15
  12. package/dist/core/ui.js.map +1 -1
  13. package/dist/features/calendar.d.ts.map +1 -1
  14. package/dist/features/calendar.js +21 -15
  15. package/dist/features/calendar.js.map +1 -1
  16. package/dist/features/docs.d.ts.map +1 -1
  17. package/dist/features/docs.js +35 -29
  18. package/dist/features/docs.js.map +1 -1
  19. package/dist/features/repair.d.ts.map +1 -1
  20. package/dist/features/repair.js +6 -10
  21. package/dist/features/repair.js.map +1 -1
  22. package/dist/features/website.d.ts +3 -3
  23. package/dist/features/website.d.ts.map +1 -1
  24. package/dist/features/website.js +11 -9
  25. package/dist/features/website.js.map +1 -1
  26. package/dist/i18n/index.d.ts +140 -0
  27. package/dist/i18n/index.d.ts.map +1 -0
  28. package/dist/i18n/index.js +113 -0
  29. package/dist/i18n/index.js.map +1 -0
  30. package/dist/main.d.ts +2 -2
  31. package/dist/main.d.ts.map +1 -1
  32. package/dist/main.js +11 -10
  33. package/dist/main.js.map +1 -1
  34. package/package.json +1 -1
  35. package/src/config/data.ts +1 -1
  36. package/src/core/logo.ts +40 -40
  37. package/src/core/menu.ts +119 -67
  38. package/src/core/ui.ts +15 -15
  39. package/src/features/calendar.ts +23 -15
  40. package/src/features/docs.ts +35 -29
  41. package/src/features/repair.ts +6 -10
  42. package/src/features/website.ts +11 -9
  43. package/src/i18n/index.ts +236 -0
  44. package/src/i18n/locales/en.json +107 -0
  45. package/src/i18n/locales/zh.json +107 -0
  46. package/src/main.ts +11 -10
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Internationalization (i18n) System
3
+ * Multi-language support for the application
4
+ */
5
+ export type Language = 'zh' | 'en';
6
+ /**
7
+ * Translation structure
8
+ */
9
+ export interface Translations {
10
+ common: {
11
+ back: string;
12
+ exit: string;
13
+ cancel: string;
14
+ confirm: string;
15
+ loading: string;
16
+ error: string;
17
+ success: string;
18
+ goodbye: string;
19
+ };
20
+ menu: {
21
+ title: string;
22
+ events: string;
23
+ eventsDesc: string;
24
+ repair: string;
25
+ repairDesc: string;
26
+ docs: string;
27
+ docsDesc: string;
28
+ website: string;
29
+ websiteDesc: string;
30
+ github: string;
31
+ githubDesc: string;
32
+ about: string;
33
+ aboutDesc: string;
34
+ language: string;
35
+ languageDesc: string;
36
+ navigationHint: string;
37
+ chooseAction: string;
38
+ };
39
+ about: {
40
+ title: string;
41
+ project: string;
42
+ version: string;
43
+ description: string;
44
+ github: string;
45
+ website: string;
46
+ email: string;
47
+ features: string;
48
+ feature1: string;
49
+ feature2: string;
50
+ feature3: string;
51
+ feature4: string;
52
+ license: string;
53
+ author: string;
54
+ };
55
+ calendar: {
56
+ title: string;
57
+ subtitle: string;
58
+ loading: string;
59
+ noEvents: string;
60
+ error: string;
61
+ errorHint: string;
62
+ dateTime: string;
63
+ eventName: string;
64
+ location: string;
65
+ };
66
+ docs: {
67
+ title: string;
68
+ subtitle: string;
69
+ loading: string;
70
+ loadingDir: string;
71
+ chooseCategory: string;
72
+ currentDir: string;
73
+ chooseDoc: string;
74
+ emptyDir: string;
75
+ upToParent: string;
76
+ returnToMenu: string;
77
+ backToList: string;
78
+ reread: string;
79
+ openBrowser: string;
80
+ loadError: string;
81
+ errorHint: string;
82
+ openBrowserPrompt: string;
83
+ docCompleted: string;
84
+ chooseAction: string;
85
+ opening: string;
86
+ browserOpened: string;
87
+ browserError: string;
88
+ browserErrorHint: string;
89
+ retry: string;
90
+ pagerNotAvailable: string;
91
+ endOfDocument: string;
92
+ };
93
+ repair: {
94
+ title: string;
95
+ subtitle: string;
96
+ opening: string;
97
+ opened: string;
98
+ error: string;
99
+ errorHint: string;
100
+ };
101
+ website: {
102
+ opening: string;
103
+ opened: string;
104
+ error: string;
105
+ errorHint: string;
106
+ };
107
+ language: {
108
+ title: string;
109
+ currentLanguage: string;
110
+ selectLanguage: string;
111
+ zh: string;
112
+ en: string;
113
+ changed: string;
114
+ };
115
+ }
116
+ /**
117
+ * Load language preference from config file
118
+ */
119
+ export declare function loadLanguagePreference(): Language;
120
+ /**
121
+ * Save language preference to config file
122
+ */
123
+ export declare function saveLanguagePreference(language: Language): void;
124
+ /**
125
+ * Get current language
126
+ */
127
+ export declare function getCurrentLanguage(): Language;
128
+ /**
129
+ * Set current language
130
+ */
131
+ export declare function setLanguage(language: Language): void;
132
+ /**
133
+ * Get translations for current language
134
+ */
135
+ export declare function t(): Translations;
136
+ /**
137
+ * Clear translation cache (useful when switching languages)
138
+ */
139
+ export declare function clearTranslationCache(): void;
140
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Internationalization (i18n) System
3
+ * Multi-language support for the application
4
+ */
5
+ import fs from 'fs';
6
+ import path from 'path';
7
+ import { fileURLToPath } from 'url';
8
+ import { dirname } from 'path';
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = dirname(__filename);
11
+ /**
12
+ * Language configuration
13
+ */
14
+ let currentLanguage = 'zh'; // Default to Chinese
15
+ /**
16
+ * Get configuration directory path
17
+ */
18
+ function getConfigDir() {
19
+ const homeDir = process.env['HOME'] || process.env['USERPROFILE'] || '';
20
+ return path.join(homeDir, '.nbtca');
21
+ }
22
+ /**
23
+ * Get language configuration file path
24
+ */
25
+ function getLanguageConfigPath() {
26
+ return path.join(getConfigDir(), 'language.json');
27
+ }
28
+ /**
29
+ * Load language preference from config file
30
+ */
31
+ export function loadLanguagePreference() {
32
+ try {
33
+ const configPath = getLanguageConfigPath();
34
+ if (fs.existsSync(configPath)) {
35
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
36
+ if (config.language === 'zh' || config.language === 'en') {
37
+ currentLanguage = config.language;
38
+ }
39
+ }
40
+ }
41
+ catch (err) {
42
+ // If loading fails, use default (Chinese)
43
+ }
44
+ return currentLanguage;
45
+ }
46
+ /**
47
+ * Save language preference to config file
48
+ */
49
+ export function saveLanguagePreference(language) {
50
+ try {
51
+ const configDir = getConfigDir();
52
+ if (!fs.existsSync(configDir)) {
53
+ fs.mkdirSync(configDir, { recursive: true });
54
+ }
55
+ const configPath = getLanguageConfigPath();
56
+ fs.writeFileSync(configPath, JSON.stringify({ language }, null, 2));
57
+ currentLanguage = language;
58
+ }
59
+ catch (err) {
60
+ // Silently fail if we can't save preference
61
+ }
62
+ }
63
+ /**
64
+ * Get current language
65
+ */
66
+ export function getCurrentLanguage() {
67
+ return currentLanguage;
68
+ }
69
+ /**
70
+ * Set current language
71
+ */
72
+ export function setLanguage(language) {
73
+ currentLanguage = language;
74
+ saveLanguagePreference(language);
75
+ }
76
+ /**
77
+ * Load translation file
78
+ */
79
+ function loadTranslations(language) {
80
+ try {
81
+ const translationPath = path.join(__dirname, 'locales', `${language}.json`);
82
+ const content = fs.readFileSync(translationPath, 'utf-8');
83
+ return JSON.parse(content);
84
+ }
85
+ catch (err) {
86
+ // Fallback to Chinese if loading fails
87
+ const fallbackPath = path.join(__dirname, 'locales', 'zh.json');
88
+ const content = fs.readFileSync(fallbackPath, 'utf-8');
89
+ return JSON.parse(content);
90
+ }
91
+ }
92
+ /**
93
+ * Translation cache
94
+ */
95
+ let translationsCache = new Map();
96
+ /**
97
+ * Get translations for current language
98
+ */
99
+ export function t() {
100
+ if (!translationsCache.has(currentLanguage)) {
101
+ translationsCache.set(currentLanguage, loadTranslations(currentLanguage));
102
+ }
103
+ return translationsCache.get(currentLanguage);
104
+ }
105
+ /**
106
+ * Clear translation cache (useful when switching languages)
107
+ */
108
+ export function clearTranslationCache() {
109
+ translationsCache.clear();
110
+ }
111
+ // Initialize language preference on module load
112
+ loadLanguagePreference();
113
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"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"}
package/dist/main.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * NBTCA Welcome Tool
3
- * 极简启动流程
3
+ * Minimalist startup flow
4
4
  */
5
5
  /**
6
- * 主程序入口
6
+ * Main program entry point
7
7
  */
8
8
  export declare function main(): Promise<void>;
9
9
  //# sourceMappingURL=main.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA4B1C"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA4B1C"}
package/dist/main.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * NBTCA Welcome Tool
3
- * 极简启动流程
3
+ * Minimalist startup flow
4
4
  */
5
5
  import chalk from 'chalk';
6
6
  import { printLogo } from './core/logo.js';
@@ -8,31 +8,32 @@ import { printHeader, clearScreen } from './core/ui.js';
8
8
  import { showMainMenu } from './core/menu.js';
9
9
  import { APP_INFO } from './config/data.js';
10
10
  import { enableVimKeys } from './core/vim-keys.js';
11
+ import { t } from './i18n/index.js';
11
12
  /**
12
- * 主程序入口
13
+ * Main program entry point
13
14
  */
14
15
  export async function main() {
15
16
  try {
16
- // 0. 启用 Vim 键位支持
17
+ // Enable Vim key bindings
17
18
  enableVimKeys();
18
- // 1. 清屏
19
+ // Clear screen
19
20
  clearScreen();
20
- // 2. 显示Logo(智能降级)
21
+ // Display logo (smart fallback)
21
22
  await printLogo();
22
- // 3. 显示版本信息
23
+ // Display version info
23
24
  printHeader(`v${APP_INFO.version}`);
24
- // 4. 显示主菜单(循环)
25
+ // Show main menu (loop)
25
26
  await showMainMenu();
26
27
  }
27
28
  catch (err) {
28
- // 处理Ctrl+C退出
29
+ // Handle Ctrl+C exit
29
30
  if (err.message?.includes('SIGINT') || err.message?.includes('User force closed')) {
30
31
  console.log();
31
- console.log(chalk.dim('再见!'));
32
+ console.log(chalk.dim(t().common.goodbye));
32
33
  process.exit(0);
33
34
  }
34
35
  else {
35
- console.error('发生错误:', err);
36
+ console.error('Error occurred:', err);
36
37
  process.exit(1);
37
38
  }
38
39
  }
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,IAAI,CAAC;QACH,iBAAiB;QACjB,aAAa,EAAE,CAAC;QAEhB,QAAQ;QACR,WAAW,EAAE,CAAC;QAEd,kBAAkB;QAClB,MAAM,SAAS,EAAE,CAAC;QAElB,YAAY;QACZ,WAAW,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAEpC,eAAe;QACf,MAAM,YAAY,EAAE,CAAC;IAEvB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,aAAa;QACb,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAClF,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,IAAI,CAAC;QACH,0BAA0B;QAC1B,aAAa,EAAE,CAAC;QAEhB,eAAe;QACf,WAAW,EAAE,CAAC;QAEd,gCAAgC;QAChC,MAAM,SAAS,EAAE,CAAC;QAElB,uBAAuB;QACvB,WAAW,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAEpC,wBAAwB;QACxB,MAAM,YAAY,EAAE,CAAC;IAEvB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,qBAAqB;QACrB,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAClF,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nbtca/prompt",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -19,7 +19,7 @@ export const URLS = {
19
19
 
20
20
  export const APP_INFO = {
21
21
  name: 'Prompt',
22
- version: '1.0.2',
22
+ version: '1.0.6',
23
23
  description: '浙大宁波理工学院计算机协会',
24
24
  fullDescription: 'NBTCA Prompt - 极简命令行工具',
25
25
  author: 'm1ngsama <contact@m1ng.space>',
package/src/core/logo.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
- * 智能Logo显示模块
3
- * 尝试显示iTerm2图片格式logo,失败则降级到ASCII艺术字
2
+ * Smart logo display module
3
+ * Attempts to display iTerm2 image format logo, falls back to ASCII art
4
4
  */
5
5
 
6
6
  import { readFileSync } from 'fs';
@@ -12,20 +12,20 @@ const __filename = fileURLToPath(import.meta.url);
12
12
  const __dirname = dirname(__filename);
13
13
 
14
14
  /**
15
- * 创建蓝色主调的渐变效果
15
+ * Create blue-toned gradient effect
16
16
  */
17
17
  function createBlueGradient(text: string): string {
18
- // 使用蓝色系渐变:深蓝 -> 青色 -> 天蓝
18
+ // Blue gradient: deep blue -> sky blue -> cyan
19
19
  const blueGradient = gradient([
20
- { color: '#1e3a8a', pos: 0 }, // 深蓝
21
- { color: '#0ea5e9', pos: 0.5 }, // 天蓝
22
- { color: '#06b6d4', pos: 1 } // 青色
20
+ { color: '#1e3a8a', pos: 0 }, // Deep blue
21
+ { color: '#0ea5e9', pos: 0.5 }, // Sky blue
22
+ { color: '#06b6d4', pos: 1 } // Cyan
23
23
  ]);
24
24
  return blueGradient(text);
25
25
  }
26
26
 
27
27
  /**
28
- * 将十六进制颜色转换为RGB
28
+ * Convert hex color to RGB
29
29
  */
30
30
  function hexToRgb(hex: string): [number, number, number] {
31
31
  const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
@@ -35,7 +35,7 @@ function hexToRgb(hex: string): [number, number, number] {
35
35
  }
36
36
 
37
37
  /**
38
- * RGB转换为十六进制颜色
38
+ * Convert RGB to hex color
39
39
  */
40
40
  function rgbToHex(r: number, g: number, b: number): string {
41
41
  return '#' + [r, g, b].map(x => {
@@ -45,7 +45,7 @@ function rgbToHex(r: number, g: number, b: number): string {
45
45
  }
46
46
 
47
47
  /**
48
- * 在两个颜色之间进行线性插值
48
+ * Linear interpolation between two colors
49
49
  */
50
50
  function interpolateColor(color1: string, color2: string, factor: number): string {
51
51
  const [r1, g1, b1] = hexToRgb(color1);
@@ -59,45 +59,45 @@ function interpolateColor(color1: string, color2: string, factor: number): strin
59
59
  }
60
60
 
61
61
  /**
62
- * 缓动函数 - 平滑的进出效果
62
+ * Easing function - smooth in-out effect
63
63
  */
64
64
  function easeInOutSine(t: number): number {
65
65
  return -(Math.cos(Math.PI * t) - 1) / 2;
66
66
  }
67
67
 
68
68
  /**
69
- * 显示渐变动画效果(优化版 - 真正丝滑的动画)
69
+ * Display gradient animation effect (optimized - truly smooth animation)
70
70
  */
71
71
  async function animateGradient(text: string, duration: number = 1200): Promise<void> {
72
- const frames = 60; // 60帧实现真正的流畅动画
72
+ const frames = 60; // 60 frames for truly smooth animation
73
73
  const frameDelay = duration / frames;
74
74
 
75
- // 定义颜色序列 - 形成完整的蓝色系循环
75
+ // Define color sequence - forms complete blue spectrum cycle
76
76
  const colorSequence = [
77
- '#1e3a8a', // 深蓝
78
- '#2563eb', //
79
- '#3b82f6', // 亮蓝
80
- '#0ea5e9', // 天蓝
81
- '#06b6d4', // 青色
82
- '#14b8a6', // 青绿
83
- '#06b6d4', // 青色
84
- '#0ea5e9', // 天蓝
85
- '#3b82f6', // 亮蓝
86
- '#2563eb', //
87
- '#1e3a8a', // 深蓝
77
+ '#1e3a8a', // Deep blue
78
+ '#2563eb', // Blue
79
+ '#3b82f6', // Bright blue
80
+ '#0ea5e9', // Sky blue
81
+ '#06b6d4', // Cyan
82
+ '#14b8a6', // Teal
83
+ '#06b6d4', // Cyan
84
+ '#0ea5e9', // Sky blue
85
+ '#3b82f6', // Bright blue
86
+ '#2563eb', // Blue
87
+ '#1e3a8a', // Deep blue
88
88
  ];
89
89
 
90
90
  for (let i = 0; i < frames; i++) {
91
- // 使用平滑的正弦缓动
91
+ // Use smooth sine easing
92
92
  const progress = easeInOutSine(i / frames);
93
93
 
94
- // 计算在颜色序列中的位置
94
+ // Calculate position in color sequence
95
95
  const position = progress * (colorSequence.length - 1);
96
96
  const index1 = Math.floor(position);
97
97
  const index2 = Math.min(index1 + 1, colorSequence.length - 1);
98
98
  const localProgress = position - index1;
99
99
 
100
- // 在相邻颜色间插值,生成三个平滑过渡的颜色
100
+ // Interpolate between adjacent colors, generating three smoothly transitioning colors
101
101
  const color1 = interpolateColor(
102
102
  colorSequence[index1]!,
103
103
  colorSequence[index2]!,
@@ -120,44 +120,44 @@ async function animateGradient(text: string, duration: number = 1200): Promise<v
120
120
  localProgress
121
121
  );
122
122
 
123
- // 为当前帧创建渐变
123
+ // Create gradient for current frame
124
124
  const frameGradient = gradient(color1, color2, color3);
125
125
 
126
- // 清除当前行并显示新帧
126
+ // Clear current line and display new frame
127
127
  process.stdout.write('\r' + frameGradient(text));
128
128
 
129
129
  await new Promise(resolve => setTimeout(resolve, frameDelay));
130
130
  }
131
131
 
132
- // 最后显示静态的蓝色渐变
132
+ // Finally display static blue gradient
133
133
  process.stdout.write('\r' + createBlueGradient(text) + '\n');
134
134
  }
135
135
 
136
136
  /**
137
- * 尝试读取并显示logo文件
137
+ * Attempt to read and display logo file
138
138
  */
139
139
  export async function printLogo(): Promise<void> {
140
140
  try {
141
- // 尝试读取iTerm2图片格式logo
141
+ // Try to read iTerm2 image format logo
142
142
  const logoPath = join(__dirname, '../logo/logo.txt');
143
143
  const logoContent = readFileSync(logoPath, 'utf-8');
144
144
 
145
- // 如果成功读取且内容有效,直接显示
145
+ // If successfully read and content is valid, display directly
146
146
  if (logoContent && logoContent.length > 100) {
147
147
  console.log(logoContent);
148
148
  await printDescription();
149
149
  return;
150
150
  }
151
151
  } catch (error) {
152
- // iTerm2 logo读取失败,继续尝试ASCII logo
152
+ // iTerm2 logo read failed, continue trying ASCII logo
153
153
  }
154
154
 
155
- // 降级:显示ASCII艺术字logo
155
+ // Fallback: display ASCII art logo
156
156
  try {
157
157
  const asciiLogoPath = join(__dirname, '../logo/ascii-logo.txt');
158
158
  const asciiContent = readFileSync(asciiLogoPath, 'utf-8');
159
159
 
160
- // 使用渐变彩色显示ASCII logo
160
+ // Display ASCII logo with gradient colors
161
161
  console.log();
162
162
  const lines = asciiContent.split('\n').filter(line => line.trim());
163
163
  lines.forEach(line => {
@@ -166,7 +166,7 @@ export async function printLogo(): Promise<void> {
166
166
 
167
167
  await printDescription();
168
168
  } catch (error) {
169
- // 如果ASCII logo也失败,显示简单的文本logo
169
+ // If ASCII logo also fails, display simple text logo
170
170
  console.log();
171
171
  console.log(createBlueGradient(' NBTCA'));
172
172
  await printDescription();
@@ -174,14 +174,14 @@ export async function printLogo(): Promise<void> {
174
174
  }
175
175
 
176
176
  /**
177
- * 显示描述文字(带渐变动画)
177
+ * Display description text (with gradient animation)
178
178
  */
179
179
  async function printDescription(): Promise<void> {
180
180
  const tagline = 'To be at the intersection of technology and liberal arts.';
181
181
 
182
182
  console.log();
183
183
 
184
- // 显示渐变动画
184
+ // Display gradient animation
185
185
  await animateGradient(tagline, 1500);
186
186
 
187
187
  console.log();