99
1010 "github.com/spf13/cobra"
1111 "github.com/studyzy/aicli/pkg/config"
12+ "github.com/studyzy/aicli/pkg/i18n"
1213)
1314
1415const (
@@ -20,8 +21,8 @@ const (
2021
2122var initCmd = & cobra.Command {
2223 Use : "init" ,
23- Short : "初始化配置" ,
24- Long : ` 引导用户设置 LLM 配置并生成配置文件 ~/.aicli.json` ,
24+ Short : "初始化配置 / Initialize configuration " ,
25+ Long : " 引导用户设置 LLM 配置并生成配置文件 ~/.aicli.json / Guide user to set up LLM configuration" ,
2526 RunE : runInit ,
2627}
2728
@@ -30,6 +31,10 @@ func init() {
3031}
3132
3233func runInit (cmd * cobra.Command , args []string ) error {
34+ // 初始化 i18n (在配置文件加载前使用默认配置)
35+ cfg := config .Default ()
36+ i18n .Init (cfg )
37+
3338 reader := bufio .NewReader (os .Stdin )
3439
3540 configPath , err := getConfigPath ()
@@ -41,12 +46,10 @@ func runInit(cmd *cobra.Command, args []string) error {
4146 return err
4247 }
4348
44- fmt .Println ("欢迎使用 aicli 配置向导!" )
45- fmt .Println ("我们将引导您完成基本配置。" )
49+ fmt .Println (i18n . T ( i18n . MsgWelcomeInit ) )
50+ fmt .Println (i18n . T ( i18n . MsgInitGuide ) )
4651 fmt .Println ()
4752
48- cfg := config .Default ()
49-
5053 if err := configureProvider (reader , cfg ); err != nil {
5154 return err
5255 }
@@ -69,31 +72,32 @@ func getConfigPath() (string, error) {
6972
7073 homeDir , err := os .UserHomeDir ()
7174 if err != nil {
72- return "" , fmt .Errorf ("获取用户主目录失败 : %w" , err )
75+ return "" , fmt .Errorf ("%s : %w" , i18n . T ( i18n . ErrGetUserHome ) , err )
7376 }
7477 return homeDir + "/.aicli.json" , nil
7578}
7679
7780func checkExistingConfig (reader * bufio.Reader , configPath string ) error {
7881 if _ , err := os .Stat (configPath ); err == nil {
79- fmt .Printf ("配置文件 %s 已存在。\n " , configPath )
80- if ! promptBool (reader , "是否覆盖?" , false ) {
81- fmt .Println ("操作已取消。" )
82- return fmt .Errorf ("用户取消操作" )
82+ msg := i18n .T (i18n .MsgConfigExists , configPath )
83+ fmt .Printf ("%s\n " , msg )
84+ if ! promptBool (reader , i18n .T (i18n .PromptOverwriteConfig ), false ) {
85+ fmt .Println (i18n .T (i18n .MsgOperationCancelled ))
86+ return fmt .Errorf ("%s" , i18n .T (i18n .ErrUserCancelled ))
8387 }
8488 }
8589 return nil
8690}
8791
8892func configureProvider (reader * bufio.Reader , cfg * config.Config ) error {
89- fmt .Println ("请选择 LLM 提供商 :" )
90- fmt .Println ("1. OpenAI (GPT-4, GPT-3.5)" )
91- fmt .Println ("2. Anthropic (Claude)" )
92- fmt .Println ("3. Local (Ollama, LocalAI)" )
93- fmt .Println ("4. DeepSeek (深度求索)" )
94- fmt .Println ("5. Other (兼容 OpenAI 协议)" )
93+ fmt .Println (i18n . T ( i18n . PromptSelectProvider ) + " :" )
94+ fmt .Println (i18n . T ( i18n . InitProviderOpenAI ) )
95+ fmt .Println (i18n . T ( i18n . InitProviderAnthropic ) )
96+ fmt .Println (i18n . T ( i18n . InitProviderLocal ) )
97+ fmt .Println (i18n . T ( i18n . InitProviderDeepSeek ) )
98+ fmt .Println (i18n . T ( i18n . InitProviderOther ) )
9599
96- providerChoice := prompt (reader , "请输入序号 [1-5]" , "1" )
100+ providerChoice := prompt (reader , i18n . T ( i18n . PromptInputChoice ) + " [1-5]" , "1" )
97101
98102 switch providerChoice {
99103 case "1" :
@@ -117,7 +121,7 @@ func configureProvider(reader *bufio.Reader, cfg *config.Config) error {
117121 cfg .LLM .Model = "gpt-3.5-turbo"
118122 cfg .LLM .APIBase = apiBaseOpenAI
119123 default :
120- fmt .Println ("无效的选择,默认使用 OpenAI" )
124+ fmt .Println (i18n . T ( i18n . MsgDefaultUseOpenAI ) )
121125 cfg .LLM .Provider = providerOpenAI
122126 }
123127
@@ -126,34 +130,37 @@ func configureProvider(reader *bufio.Reader, cfg *config.Config) error {
126130
127131func configureAPI (reader * bufio.Reader , cfg * config.Config ) error {
128132 if cfg .LLM .Provider != providerLocal {
129- cfg .LLM .APIKey = prompt (reader , "请输入 API Key" , "" )
133+ cfg .LLM .APIKey = prompt (reader , i18n . T ( i18n . PromptEnterAPIKey ) , "" )
130134 if cfg .LLM .APIKey == "" {
131- fmt .Println ("警告: API Key 为空,您可能需要在环境变量 AICLI_API_KEY 中设置。" )
135+ fmt .Println (i18n . T ( i18n . WarnAPIKeyEmpty ) )
132136 }
133137 }
134138
135- cfg .LLM .Model = prompt (reader , fmt .Sprintf ("请输入模型名称 (默认: %s)" , cfg .LLM .Model ), cfg .LLM .Model )
136- cfg .LLM .APIBase = prompt (reader , fmt .Sprintf ("请输入 API Base URL (默认: %s)" , cfg .LLM .APIBase ), cfg .LLM .APIBase )
139+ modelPrompt := fmt .Sprintf ("%s (%s: %s)" , i18n .T (i18n .PromptEnterModel ), i18n .T (i18n .MsgDefault ), cfg .LLM .Model )
140+ cfg .LLM .Model = prompt (reader , modelPrompt , cfg .LLM .Model )
141+
142+ apiBasePrompt := fmt .Sprintf ("%s (%s: %s)" , i18n .T (i18n .PromptEnterAPIBase ), i18n .T (i18n .MsgDefault ), cfg .LLM .APIBase )
143+ cfg .LLM .APIBase = prompt (reader , apiBasePrompt , cfg .LLM .APIBase )
137144
138145 return nil
139146}
140147
141148func configureOtherSettings (reader * bufio.Reader , cfg * config.Config ) error {
142- fmt .Println ("\n --- 其他设置 ---" )
143- cfg .Safety .EnableChecks = promptBool (reader , "是否启用危险命令安全检查?" , true )
144- cfg .History .Enabled = promptBool (reader , "是否启用历史记录?" , true )
149+ fmt .Println ("\n " + i18n . T ( i18n . MsgOtherSettings ) )
150+ cfg .Safety .EnableChecks = promptBool (reader , i18n . T ( i18n . PromptEnableCheck ) , true )
151+ cfg .History .Enabled = promptBool (reader , i18n . T ( i18n . PromptEnableHistory ) , true )
145152 return nil
146153}
147154
148155func saveConfig (cfg * config.Config , configPath string ) error {
149- fmt .Println ("\n 正在保存配置..." )
156+ fmt .Println ("\n " + i18n . T ( i18n . MsgSavingConfig ) )
150157 if err := cfg .Save (configPath ); err != nil {
151- return fmt .Errorf ("保存配置失败 : %w" , err )
158+ return fmt .Errorf ("%s : %w" , i18n . T ( i18n . ErrSaveConfig ) , err )
152159 }
153160
154- fmt .Printf ( "配置已成功保存到 %s \n " , configPath )
155- fmt .Println ("现在您可以开始使用 aicli 了!" )
156- fmt .Println ("示例: aicli \" 查询我的公网IP \" " )
161+ fmt .Println ( i18n . T ( i18n . MsgConfigSaved , configPath ) )
162+ fmt .Println (i18n . T ( i18n . MsgNowCanUse ) )
163+ fmt .Println (i18n . T ( i18n . MsgExampleUsage ) )
157164
158165 return nil
159166}
0 commit comments