@nbtca/prompt 1.0.4 → 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 (48) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +45 -3
  3. package/dist/config/data.d.ts +1 -1
  4. package/dist/config/data.js +1 -1
  5. package/dist/core/logo.d.ts +3 -3
  6. package/dist/core/logo.js +40 -40
  7. package/dist/core/logo.js.map +1 -1
  8. package/dist/core/menu.d.ts +3 -3
  9. package/dist/core/menu.d.ts.map +1 -1
  10. package/dist/core/menu.js +112 -67
  11. package/dist/core/menu.js.map +1 -1
  12. package/dist/core/ui.d.ts +11 -11
  13. package/dist/core/ui.js +15 -15
  14. package/dist/core/ui.js.map +1 -1
  15. package/dist/features/calendar.d.ts.map +1 -1
  16. package/dist/features/calendar.js +21 -15
  17. package/dist/features/calendar.js.map +1 -1
  18. package/dist/features/docs.d.ts.map +1 -1
  19. package/dist/features/docs.js +104 -44
  20. package/dist/features/docs.js.map +1 -1
  21. package/dist/features/repair.d.ts.map +1 -1
  22. package/dist/features/repair.js +6 -10
  23. package/dist/features/repair.js.map +1 -1
  24. package/dist/features/website.d.ts +3 -3
  25. package/dist/features/website.d.ts.map +1 -1
  26. package/dist/features/website.js +11 -9
  27. package/dist/features/website.js.map +1 -1
  28. package/dist/i18n/index.d.ts +140 -0
  29. package/dist/i18n/index.d.ts.map +1 -0
  30. package/dist/i18n/index.js +113 -0
  31. package/dist/i18n/index.js.map +1 -0
  32. package/dist/main.d.ts +2 -2
  33. package/dist/main.d.ts.map +1 -1
  34. package/dist/main.js +11 -10
  35. package/dist/main.js.map +1 -1
  36. package/package.json +1 -1
  37. package/src/config/data.ts +1 -1
  38. package/src/core/logo.ts +40 -40
  39. package/src/core/menu.ts +119 -67
  40. package/src/core/ui.ts +15 -15
  41. package/src/features/calendar.ts +23 -15
  42. package/src/features/docs.ts +116 -45
  43. package/src/features/repair.ts +6 -10
  44. package/src/features/website.ts +11 -9
  45. package/src/i18n/index.ts +236 -0
  46. package/src/i18n/locales/en.json +107 -0
  47. package/src/i18n/locales/zh.json +107 -0
  48. package/src/main.ts +11 -10
package/CHANGELOG.md CHANGED
@@ -1,5 +1,53 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## [1.0.5] - 2025-12-10
4
+
5
+ ### Fixed
6
+ - **Knowledge Base 403 Error**: Resolved GitHub API rate limiting issue that caused 403 errors when browsing documentation
7
+ - Added GitHub token authentication support via `GITHUB_TOKEN` or `GH_TOKEN` environment variables
8
+ - Improved error messages with rate limit information and reset time
9
+ - Increased rate limit from 60 to 5000 requests per hour when using a token
10
+
11
+ ### Added
12
+ - **Pager-Style Document Viewer**: Documents now open in a pager (similar to vim/journalctl/less)
13
+ - Natural scrolling navigation with arrow keys, Space, j/k (vim-style), and q to quit
14
+ - Content doesn't flood the terminal anymore
15
+ - Better reading experience for long documents
16
+ - Automatic fallback to direct output if pager is unavailable
17
+ - **Re-read Document Option**: Added ability to re-read a document after viewing without going back to the list
18
+ - **Environment Variable Support**:
19
+ - `GITHUB_TOKEN` or `GH_TOKEN` for GitHub API authentication
20
+ - `PAGER` for custom pager selection (defaults to `less`)
21
+
22
+ ### Improved
23
+ - Enhanced error handling with detailed rate limit diagnostics
24
+ - Better user feedback when rate limits are reached
25
+ - Clearer instructions for resolving authentication issues
26
+
27
+ ### Technical Details
28
+ - Added `displayInPager()` function for spawning system pager processes
29
+ - Enhanced `fetchGitHubDirectory()` with conditional token authentication
30
+ - Updated documentation viewer workflow for better UX
31
+
32
+ ## [1.0.4] - 2025-12-10
33
+
34
+ ### Enhanced
35
+ - **Smooth Slogan Animation**: Implemented true color interpolation for buttery smooth gradient animation
36
+ - Increased frame rate from 24 to 60 FPS for ultra-smooth motion
37
+ - Changed easing from cubic to sine wave for more natural transitions
38
+ - Dynamically generate gradients per frame instead of using pre-defined set
39
+ - Eliminates staggered/jumping effect in the slogan text animation
40
+
41
+ ### Technical Details
42
+ - Added `hexToRgb()`, `rgbToHex()`, and `interpolateColor()` functions for mathematical color blending
43
+ - Implemented `easeInOutSine()` easing function for smooth acceleration/deceleration
44
+ - Each frame now uses unique, mathematically interpolated colors
45
+
46
+ ## [1.0.3] - 2025-11-27
47
+
48
+ ### Changed
49
+ - Version alignment and bug fixes
50
+
3
51
  ## [1.0.2] - 2025-11-27
4
52
 
5
53
  ### Added
package/README.md CHANGED
@@ -13,9 +13,10 @@ NBTCA Prompt is a minimalist command-line interface tool designed for the Comput
13
13
 
14
14
  - View upcoming association events (30-day calendar)
15
15
  - Access repair service information
16
- - Browse technical documentation from terminal
16
+ - Browse technical documentation from terminal with pager support (vim/journalctl style)
17
17
  - Quick links to official website and GitHub
18
18
  - Minimalist design with maximum terminal compatibility
19
+ - Smooth gradient animations for enhanced visual experience
19
20
 
20
21
  ## Installation
21
22
 
@@ -131,11 +132,25 @@ src/
131
132
 
132
133
  The knowledge base viewer features:
133
134
 
134
- - Direct GitHub repository access
135
+ - Direct GitHub repository access with authentication support
136
+ - Pager-style document reading (similar to vim/journalctl/less)
135
137
  - VitePress syntax cleaning
136
- - Terminal Markdown rendering
138
+ - Terminal Markdown rendering with color support
137
139
  - Browser fallback option
138
140
  - Directory tree navigation
141
+ - Improved error handling with rate limit detection
142
+
143
+ ### GitHub Token Configuration (Optional)
144
+
145
+ To avoid GitHub API rate limits when browsing documentation, you can set a GitHub token:
146
+
147
+ ```bash
148
+ export GITHUB_TOKEN="your_github_token_here"
149
+ # or
150
+ export GH_TOKEN="your_github_token_here"
151
+ ```
152
+
153
+ Without a token, you have 60 requests per hour. With a token, you get 5000 requests per hour.
139
154
 
140
155
  ### Supported Formats
141
156
 
@@ -163,6 +178,10 @@ ASCII-based UI elements ensure rendering on any terminal emulator.
163
178
 
164
179
  ## Common Issues
165
180
 
181
+ ### Q: Getting 403 error when browsing documentation?
182
+
183
+ A: This is due to GitHub API rate limiting. Set a `GITHUB_TOKEN` environment variable to increase your rate limit from 60 to 5000 requests per hour. See the [GitHub Token Configuration](#github-token-configuration-optional) section above.
184
+
166
185
  ### Q: Auto-restart when using `pnpm run dev:watch`?
167
186
 
168
187
  A: This is expected behavior. Use `pnpm run dev` for interactive testing.
@@ -171,6 +190,10 @@ A: This is expected behavior. Use `pnpm run dev` for interactive testing.
171
190
 
172
191
  A: Select the Exit option from menu, or press Ctrl+C.
173
192
 
193
+ ### Q: How to navigate documents in the pager?
194
+
195
+ A: Use arrow keys, Space (page down), 'j/k' (vim-style), or 'q' to quit the pager.
196
+
174
197
  ### Q: Changes not reflected?
175
198
 
176
199
  A: If using `pnpm start`, rebuild with `pnpm run build` first.
@@ -206,6 +229,25 @@ MIT License - See LICENSE file for details
206
229
 
207
230
  ## Changelog
208
231
 
232
+ ### v1.0.5 (2025-12-10)
233
+
234
+ - **Fixed**: Knowledge Base 403 error due to GitHub API rate limiting
235
+ - **Added**: GitHub token authentication support (GITHUB_TOKEN/GH_TOKEN)
236
+ - **Added**: Pager-style document viewer (vim/journalctl/less style)
237
+ - **Added**: "Re-read document" option after viewing
238
+ - **Improved**: Better error messages with rate limit information
239
+ - **Improved**: Document reading experience with scroll navigation
240
+
241
+ ### v1.0.4 (2025-12-10)
242
+
243
+ - **Enhanced**: Smooth slogan animation with true color interpolation
244
+ - **Improved**: 60 FPS animation with sine easing for natural transitions
245
+ - **Technical**: Added hexToRgb, rgbToHex, and interpolateColor functions
246
+
247
+ ### v1.0.3 (2025-11-27)
248
+
249
+ - Version alignment and bug fixes
250
+
209
251
  ### v1.0.1 (2025-11-27)
210
252
 
211
253
  - Added terminal documentation viewer
@@ -12,7 +12,7 @@ export declare const URLS: {
12
12
  };
13
13
  export declare const APP_INFO: {
14
14
  readonly name: "Prompt";
15
- readonly version: "1.0.2";
15
+ readonly version: "1.0.6";
16
16
  readonly description: "浙大宁波理工学院计算机协会";
17
17
  readonly fullDescription: "NBTCA Prompt - 极简命令行工具";
18
18
  readonly author: "m1ngsama <contact@m1ng.space>";
@@ -15,7 +15,7 @@ export const URLS = {
15
15
  };
16
16
  export const APP_INFO = {
17
17
  name: 'Prompt',
18
- version: '1.0.2',
18
+ version: '1.0.6',
19
19
  description: '浙大宁波理工学院计算机协会',
20
20
  fullDescription: 'NBTCA Prompt - 极简命令行工具',
21
21
  author: 'm1ngsama <contact@m1ng.space>',
@@ -1,9 +1,9 @@
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
- * 尝试读取并显示logo文件
6
+ * Attempt to read and display logo file
7
7
  */
8
8
  export declare function printLogo(): Promise<void>;
9
9
  //# sourceMappingURL=logo.d.ts.map
package/dist/core/logo.js 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
  import { readFileSync } from 'fs';
6
6
  import { fileURLToPath } from 'url';
@@ -9,19 +9,19 @@ import gradient from 'gradient-string';
9
9
  const __filename = fileURLToPath(import.meta.url);
10
10
  const __dirname = dirname(__filename);
11
11
  /**
12
- * 创建蓝色主调的渐变效果
12
+ * Create blue-toned gradient effect
13
13
  */
14
14
  function createBlueGradient(text) {
15
- // 使用蓝色系渐变:深蓝 -> 青色 -> 天蓝
15
+ // Blue gradient: deep blue -> sky blue -> cyan
16
16
  const blueGradient = gradient([
17
- { color: '#1e3a8a', pos: 0 }, // 深蓝
18
- { color: '#0ea5e9', pos: 0.5 }, // 天蓝
19
- { color: '#06b6d4', pos: 1 } // 青色
17
+ { color: '#1e3a8a', pos: 0 }, // Deep blue
18
+ { color: '#0ea5e9', pos: 0.5 }, // Sky blue
19
+ { color: '#06b6d4', pos: 1 } // Cyan
20
20
  ]);
21
21
  return blueGradient(text);
22
22
  }
23
23
  /**
24
- * 将十六进制颜色转换为RGB
24
+ * Convert hex color to RGB
25
25
  */
26
26
  function hexToRgb(hex) {
27
27
  const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
@@ -30,7 +30,7 @@ function hexToRgb(hex) {
30
30
  : [0, 0, 0];
31
31
  }
32
32
  /**
33
- * RGB转换为十六进制颜色
33
+ * Convert RGB to hex color
34
34
  */
35
35
  function rgbToHex(r, g, b) {
36
36
  return '#' + [r, g, b].map(x => {
@@ -39,7 +39,7 @@ function rgbToHex(r, g, b) {
39
39
  }).join('');
40
40
  }
41
41
  /**
42
- * 在两个颜色之间进行线性插值
42
+ * Linear interpolation between two colors
43
43
  */
44
44
  function interpolateColor(color1, color2, factor) {
45
45
  const [r1, g1, b1] = hexToRgb(color1);
@@ -50,40 +50,40 @@ function interpolateColor(color1, color2, factor) {
50
50
  return rgbToHex(r, g, b);
51
51
  }
52
52
  /**
53
- * 缓动函数 - 平滑的进出效果
53
+ * Easing function - smooth in-out effect
54
54
  */
55
55
  function easeInOutSine(t) {
56
56
  return -(Math.cos(Math.PI * t) - 1) / 2;
57
57
  }
58
58
  /**
59
- * 显示渐变动画效果(优化版 - 真正丝滑的动画)
59
+ * Display gradient animation effect (optimized - truly smooth animation)
60
60
  */
61
61
  async function animateGradient(text, duration = 1200) {
62
- const frames = 60; // 60帧实现真正的流畅动画
62
+ const frames = 60; // 60 frames for truly smooth animation
63
63
  const frameDelay = duration / frames;
64
- // 定义颜色序列 - 形成完整的蓝色系循环
64
+ // Define color sequence - forms complete blue spectrum cycle
65
65
  const colorSequence = [
66
- '#1e3a8a', // 深蓝
67
- '#2563eb', //
68
- '#3b82f6', // 亮蓝
69
- '#0ea5e9', // 天蓝
70
- '#06b6d4', // 青色
71
- '#14b8a6', // 青绿
72
- '#06b6d4', // 青色
73
- '#0ea5e9', // 天蓝
74
- '#3b82f6', // 亮蓝
75
- '#2563eb', //
76
- '#1e3a8a', // 深蓝
66
+ '#1e3a8a', // Deep blue
67
+ '#2563eb', // Blue
68
+ '#3b82f6', // Bright blue
69
+ '#0ea5e9', // Sky blue
70
+ '#06b6d4', // Cyan
71
+ '#14b8a6', // Teal
72
+ '#06b6d4', // Cyan
73
+ '#0ea5e9', // Sky blue
74
+ '#3b82f6', // Bright blue
75
+ '#2563eb', // Blue
76
+ '#1e3a8a', // Deep blue
77
77
  ];
78
78
  for (let i = 0; i < frames; i++) {
79
- // 使用平滑的正弦缓动
79
+ // Use smooth sine easing
80
80
  const progress = easeInOutSine(i / frames);
81
- // 计算在颜色序列中的位置
81
+ // Calculate position in color sequence
82
82
  const position = progress * (colorSequence.length - 1);
83
83
  const index1 = Math.floor(position);
84
84
  const index2 = Math.min(index1 + 1, colorSequence.length - 1);
85
85
  const localProgress = position - index1;
86
- // 在相邻颜色间插值,生成三个平滑过渡的颜色
86
+ // Interpolate between adjacent colors, generating three smoothly transitioning colors
87
87
  const color1 = interpolateColor(colorSequence[index1], colorSequence[index2], localProgress);
88
88
  const nextIndex1 = Math.min(index2, colorSequence.length - 1);
89
89
  const nextIndex2 = Math.min(nextIndex1 + 1, colorSequence.length - 1);
@@ -91,24 +91,24 @@ async function animateGradient(text, duration = 1200) {
91
91
  const nextIndex3 = Math.min(nextIndex2, colorSequence.length - 1);
92
92
  const nextIndex4 = Math.min(nextIndex3 + 1, colorSequence.length - 1);
93
93
  const color3 = interpolateColor(colorSequence[nextIndex3], colorSequence[nextIndex4], localProgress);
94
- // 为当前帧创建渐变
94
+ // Create gradient for current frame
95
95
  const frameGradient = gradient(color1, color2, color3);
96
- // 清除当前行并显示新帧
96
+ // Clear current line and display new frame
97
97
  process.stdout.write('\r' + frameGradient(text));
98
98
  await new Promise(resolve => setTimeout(resolve, frameDelay));
99
99
  }
100
- // 最后显示静态的蓝色渐变
100
+ // Finally display static blue gradient
101
101
  process.stdout.write('\r' + createBlueGradient(text) + '\n');
102
102
  }
103
103
  /**
104
- * 尝试读取并显示logo文件
104
+ * Attempt to read and display logo file
105
105
  */
106
106
  export async function printLogo() {
107
107
  try {
108
- // 尝试读取iTerm2图片格式logo
108
+ // Try to read iTerm2 image format logo
109
109
  const logoPath = join(__dirname, '../logo/logo.txt');
110
110
  const logoContent = readFileSync(logoPath, 'utf-8');
111
- // 如果成功读取且内容有效,直接显示
111
+ // If successfully read and content is valid, display directly
112
112
  if (logoContent && logoContent.length > 100) {
113
113
  console.log(logoContent);
114
114
  await printDescription();
@@ -116,13 +116,13 @@ export async function printLogo() {
116
116
  }
117
117
  }
118
118
  catch (error) {
119
- // iTerm2 logo读取失败,继续尝试ASCII logo
119
+ // iTerm2 logo read failed, continue trying ASCII logo
120
120
  }
121
- // 降级:显示ASCII艺术字logo
121
+ // Fallback: display ASCII art logo
122
122
  try {
123
123
  const asciiLogoPath = join(__dirname, '../logo/ascii-logo.txt');
124
124
  const asciiContent = readFileSync(asciiLogoPath, 'utf-8');
125
- // 使用渐变彩色显示ASCII logo
125
+ // Display ASCII logo with gradient colors
126
126
  console.log();
127
127
  const lines = asciiContent.split('\n').filter(line => line.trim());
128
128
  lines.forEach(line => {
@@ -131,19 +131,19 @@ export async function printLogo() {
131
131
  await printDescription();
132
132
  }
133
133
  catch (error) {
134
- // 如果ASCII logo也失败,显示简单的文本logo
134
+ // If ASCII logo also fails, display simple text logo
135
135
  console.log();
136
136
  console.log(createBlueGradient(' NBTCA'));
137
137
  await printDescription();
138
138
  }
139
139
  }
140
140
  /**
141
- * 显示描述文字(带渐变动画)
141
+ * Display description text (with gradient animation)
142
142
  */
143
143
  async function printDescription() {
144
144
  const tagline = 'To be at the intersection of technology and liberal arts.';
145
145
  console.log();
146
- // 显示渐变动画
146
+ // Display gradient animation
147
147
  await animateGradient(tagline, 1500);
148
148
  console.log();
149
149
  }
@@ -1 +1 @@
1
- {"version":3,"file":"logo.js","sourceRoot":"","sources":["../../src/core/logo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logo.js","sourceRoot":"","sources":["../../src/core/logo.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  /**
2
- * 极简菜单系统
3
- * 6大核心功能菜单
2
+ * Minimalist menu system
3
+ * Six core feature menus
4
4
  */
5
5
  /**
6
- * 显示主菜单
6
+ * Display main menu
7
7
  */
8
8
  export declare function showMainMenu(): Promise<void>;
9
9
  //# sourceMappingURL=menu.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/core/menu.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqDH;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAyClD"}
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/core/menu.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8DH;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA2ClD"}
package/dist/core/menu.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
- * 极简菜单系统
3
- * 6大核心功能菜单
2
+ * Minimalist menu system
3
+ * Six core feature menus
4
4
  */
5
5
  import inquirer from 'inquirer';
6
6
  import chalk from 'chalk';
@@ -10,83 +10,93 @@ import { showDocsMenu } from '../features/docs.js';
10
10
  import { openHomepage, openGithub } from '../features/website.js';
11
11
  import { printDivider, printNewLine } from './ui.js';
12
12
  import { APP_INFO, URLS } from '../config/data.js';
13
+ import { t, getCurrentLanguage, setLanguage, clearTranslationCache } from '../i18n/index.js';
13
14
  /**
14
- * 主菜单选项
15
+ * Get main menu options
15
16
  */
16
- const MAIN_MENU = [
17
- {
18
- name: '[*] Recent Events ' + chalk.gray('查看最近30天的社团活动'),
19
- value: 'events',
20
- short: 'Recent Events'
21
- },
22
- {
23
- name: '[*] Repair Service ' + chalk.gray('电脑维修、软件安装'),
24
- value: 'repair',
25
- short: 'Repair Service'
26
- },
27
- {
28
- name: '[*] Knowledge Base ' + chalk.gray('技术文档、教程资源'),
29
- value: 'docs',
30
- short: 'Knowledge Base'
31
- },
32
- {
33
- name: '[*] Official Website ' + chalk.gray('访问NBTCA主页'),
34
- value: 'website',
35
- short: 'Official Website'
36
- },
37
- {
38
- name: '[*] GitHub ' + chalk.gray('开源项目与代码'),
39
- value: 'github',
40
- short: 'GitHub'
41
- },
42
- {
43
- name: '[?] About ' + chalk.gray('项目信息与帮助'),
44
- value: 'about',
45
- short: 'About'
46
- },
47
- new inquirer.Separator(' '),
48
- {
49
- name: chalk.dim('[x] Exit'),
50
- value: 'exit',
51
- short: 'Exit'
52
- }
53
- ];
17
+ function getMainMenuOptions() {
18
+ const trans = t();
19
+ return [
20
+ {
21
+ name: '[*] ' + trans.menu.events.padEnd(16) + ' ' + chalk.gray(trans.menu.eventsDesc),
22
+ value: 'events',
23
+ short: trans.menu.events
24
+ },
25
+ {
26
+ name: '[*] ' + trans.menu.repair.padEnd(16) + ' ' + chalk.gray(trans.menu.repairDesc),
27
+ value: 'repair',
28
+ short: trans.menu.repair
29
+ },
30
+ {
31
+ name: '[*] ' + trans.menu.docs.padEnd(16) + ' ' + chalk.gray(trans.menu.docsDesc),
32
+ value: 'docs',
33
+ short: trans.menu.docs
34
+ },
35
+ {
36
+ name: '[*] ' + trans.menu.website.padEnd(16) + ' ' + chalk.gray(trans.menu.websiteDesc),
37
+ value: 'website',
38
+ short: trans.menu.website
39
+ },
40
+ {
41
+ name: '[*] ' + trans.menu.github.padEnd(16) + ' ' + chalk.gray(trans.menu.githubDesc),
42
+ value: 'github',
43
+ short: trans.menu.github
44
+ },
45
+ {
46
+ name: '[?] ' + trans.menu.about.padEnd(16) + ' ' + chalk.gray(trans.menu.aboutDesc),
47
+ value: 'about',
48
+ short: trans.menu.about
49
+ },
50
+ {
51
+ name: '[⚙] ' + trans.menu.language.padEnd(16) + ' ' + chalk.gray(trans.menu.languageDesc),
52
+ value: 'language',
53
+ short: trans.menu.language
54
+ },
55
+ new inquirer.Separator(' '),
56
+ {
57
+ name: chalk.dim('[x] ' + trans.common.exit),
58
+ value: 'exit',
59
+ short: trans.common.exit
60
+ }
61
+ ];
62
+ }
54
63
  /**
55
- * 显示主菜单
64
+ * Display main menu
56
65
  */
57
66
  export async function showMainMenu() {
58
67
  while (true) {
59
68
  try {
69
+ const trans = t();
60
70
  // Show keybinding hints
61
- console.log(chalk.dim(' Navigation: j/k or ↑/↓ | Jump: g/G | Quit: q or Ctrl+C'));
71
+ console.log(chalk.dim(' ' + trans.menu.navigationHint));
62
72
  console.log();
63
73
  const { action } = await inquirer.prompt([
64
74
  {
65
75
  type: 'list',
66
76
  name: 'action',
67
- message: '选择功能',
68
- choices: MAIN_MENU,
77
+ message: trans.menu.chooseAction,
78
+ choices: getMainMenuOptions(),
69
79
  pageSize: 15,
70
80
  loop: false
71
81
  }
72
82
  ]);
73
- // 处理用户选择
83
+ // Handle user selection
74
84
  if (action === 'exit') {
75
85
  console.log();
76
- console.log(chalk.dim('再见!'));
86
+ console.log(chalk.dim(trans.common.goodbye));
77
87
  process.exit(0);
78
88
  }
79
89
  await handleAction(action);
80
- // 操作完成后显示分隔线
90
+ // Show divider after operation
81
91
  printNewLine();
82
92
  printDivider();
83
93
  printNewLine();
84
94
  }
85
95
  catch (err) {
86
- // 处理Ctrl+C退出
96
+ // Handle Ctrl+C exit
87
97
  if (err.message?.includes('User force closed')) {
88
98
  console.log();
89
- console.log(chalk.dim('再见!'));
99
+ console.log(chalk.dim(t().common.goodbye));
90
100
  process.exit(0);
91
101
  }
92
102
  throw err;
@@ -94,7 +104,7 @@ export async function showMainMenu() {
94
104
  }
95
105
  }
96
106
  /**
97
- * 处理用户操作
107
+ * Handle user action
98
108
  */
99
109
  async function handleAction(action) {
100
110
  switch (action) {
@@ -116,33 +126,68 @@ async function handleAction(action) {
116
126
  case 'about':
117
127
  showAbout();
118
128
  break;
129
+ case 'language':
130
+ await showLanguageMenu();
131
+ break;
119
132
  default:
120
- console.log(chalk.gray('未知操作'));
133
+ console.log(chalk.gray('Unknown action'));
121
134
  }
122
135
  }
123
136
  /**
124
- * 显示关于信息
137
+ * Display about information
125
138
  */
126
139
  function showAbout() {
140
+ const trans = t();
141
+ console.log();
142
+ console.log(chalk.bold('>> ' + trans.about.title));
143
+ console.log();
144
+ console.log(chalk.dim(trans.about.project.padEnd(12)) + APP_INFO.name);
145
+ console.log(chalk.dim(trans.about.version.padEnd(12)) + `v${APP_INFO.version}`);
146
+ console.log(chalk.dim(trans.about.description.padEnd(12)) + APP_INFO.fullDescription);
127
147
  console.log();
128
- console.log(chalk.bold('>> About NBTCA'));
148
+ console.log(chalk.dim(trans.about.github.padEnd(12)) + chalk.cyan(APP_INFO.repository));
149
+ console.log(chalk.dim(trans.about.website.padEnd(12)) + chalk.cyan(URLS.homepage));
150
+ console.log(chalk.dim(trans.about.email.padEnd(12)) + chalk.cyan(URLS.email));
129
151
  console.log();
130
- console.log(chalk.dim('Project ') + APP_INFO.name);
131
- console.log(chalk.dim('Version ') + `v${APP_INFO.version}`);
132
- console.log(chalk.dim('Description ') + APP_INFO.fullDescription);
152
+ console.log(chalk.dim(trans.about.features));
153
+ console.log(' ' + trans.about.feature1);
154
+ console.log(' ' + trans.about.feature2);
155
+ console.log(' ' + trans.about.feature3);
156
+ console.log(' ' + trans.about.feature4);
133
157
  console.log();
134
- console.log(chalk.dim('GitHub ') + chalk.cyan(APP_INFO.repository));
135
- console.log(chalk.dim('Website ') + chalk.cyan(URLS.homepage));
136
- console.log(chalk.dim('Email ') + chalk.cyan(URLS.email));
158
+ console.log(chalk.dim(trans.about.license.padEnd(12)) + 'MIT License');
159
+ console.log(chalk.dim(trans.about.author.padEnd(12)) + 'm1ngsama');
137
160
  console.log();
138
- console.log(chalk.dim('Features:'));
139
- console.log(' - View recent association events');
140
- console.log(' - Online repair service');
141
- console.log(' - Technical knowledge base access');
142
- console.log(' - Quick access to website and GitHub');
161
+ }
162
+ /**
163
+ * Display language selection menu
164
+ */
165
+ async function showLanguageMenu() {
166
+ const trans = t();
167
+ const currentLang = getCurrentLanguage();
143
168
  console.log();
144
- console.log(chalk.dim('License ') + 'MIT License');
145
- console.log(chalk.dim('Author ') + 'm1ngsama');
169
+ console.log(chalk.bold('>> ' + trans.language.title));
146
170
  console.log();
171
+ console.log(chalk.dim(trans.language.currentLanguage + ': ') + chalk.cyan(trans.language[currentLang]));
172
+ console.log();
173
+ const { language } = await inquirer.prompt([
174
+ {
175
+ type: 'list',
176
+ name: 'language',
177
+ message: trans.language.selectLanguage,
178
+ choices: [
179
+ { name: trans.language.zh, value: 'zh' },
180
+ { name: trans.language.en, value: 'en' }
181
+ ],
182
+ default: currentLang
183
+ }
184
+ ]);
185
+ if (language !== currentLang) {
186
+ setLanguage(language);
187
+ clearTranslationCache();
188
+ console.log();
189
+ console.log(chalk.green('✓ ' + t().language.changed));
190
+ console.log();
191
+ }
147
192
  }
148
193
  //# sourceMappingURL=menu.js.map