chore(i18n): 统一多语言输出与新增三家 LLM 提供商支持

This commit is contained in:
2026-02-01 14:10:29 +00:00
parent cf268ebe0f
commit a5ae12f061
6 changed files with 58 additions and 49 deletions

View File

@@ -1,39 +1,22 @@
# Changelog
## v1.0.1 更新日志
All notable changes to this project will be documented in this file.
### ✨ 新功能
- 新增 `test3.txt`,支持中文输出测试
- `generator` 模块新增 `language` 参数,可指定提交信息语言
- `commit``tag` 命令新增自动 push 功能
- 提交、标签及变更日志命令现支持多语言输出
- 新增 Kimi、DeepSeek、OpenRouter 三家 LLM 提供商支持
- 首次创建仓库,完成 0.1.0 版本基础功能
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
### 🐞 错误修复
- 修复 `git/commit.rs` 中的提交错误信息问题
- 修复 Git2 错误处理逻辑(仓库打开功能暂不可用)
- 统一代码风格(`rustfmt` 修正)
## [Unreleased]
### 📚 文档
- 更新 README补充新的安装方式与 CLI 选项说明
- 优化 README 内容,新增 LLM 提供商介绍
### Added
- Initial release of QuiCommit
- AI-powered commit message generation using LLM APIs (OpenAI, Anthropic) or local Ollama
- Support for Conventional Commits and @commitlint formats
- Multiple Git profile management with SSH and GPG support
- Smart tag generation with semantic version bumping
- Automatic changelog generation
- Interactive CLI with beautiful prompts and previews
- Encrypted storage for sensitive data
- Cross-platform support (Linux, macOS, Windows)
### Features
- **Commit Generation**: Automatically generate conventional commit messages from git diffs
- **Profile Management**: Switch between multiple Git identities for different contexts
- **Tag Management**: Create annotated tags with AI-generated release notes
- **Changelog**: Generate and maintain changelog in Keep a Changelog format
- **Security**: Encrypt SSH passphrases and API keys
- **Interactive UI**: Beautiful CLI with prompts and previews
## [0.1.0] - 2026-01-30
### Added
- Initial project structure
- Core functionality for git operations
- LLM integration
- Configuration management
- CLI interface
### 🔧 其他变更
- 新增个人访问令牌、使用统计与配置校验功能
- 添加 `test2.txt` 占位文件

View File

@@ -135,7 +135,7 @@ impl CommitCommand {
} else if self.manual || self.message.is_some() {
// Manual commit
self.create_manual_commit(format)?
} else if config.commit.auto_generate && !self.yes {
} else if config.commit.auto_generate {
// AI-generated commit
self.generate_commit(&repo, format, &messages).await?
} else {
@@ -262,13 +262,12 @@ impl CommitCommand {
let language_str = &config.language.output_language;
let language = Language::from_str(language_str).unwrap_or(Language::English);
// Debug: print language info
eprintln!("DEBUG: Language config: '{}', parsed as: {:?}", language_str, language);
let generated = if self.yes {
// Non-interactive mode: generate directly
generator.generate_commit_from_repo(repo, format, language).await?
} else {
// Interactive mode: allow user to review and regenerate
generator.generate_commit_interactive(repo, format, language).await?
};

View File

@@ -125,11 +125,18 @@ impl LlmClient {
) -> Result<GeneratedCommit> {
let system_prompt = get_commit_system_prompt(format, language);
// Debug: print system prompt info
eprintln!("DEBUG: System prompt language: {:?}", language);
eprintln!("DEBUG: System prompt (first 200 chars): {}...", &system_prompt.chars().take(200).collect::<String>());
let prompt = format!("{}", diff);
// Add language instruction to the prompt
let language_instruction = match language {
Language::Chinese => "\n\n请用中文生成提交消息。",
Language::Japanese => "\n\n日本語でコミットメッセージを生成してください。",
Language::Korean => "\n\n한국어로 커밋 메시지를 생성하세요.",
Language::Spanish => "\n\nPor favor, genera el mensaje de commit en español.",
Language::French => "\n\nVeuillez générer le message de commit en français.",
Language::German => "\n\nBitte generieren Sie die Commit-Nachricht auf Deutsch.",
Language::English => "",
};
let prompt = format!("{}{}", diff, language_instruction);
let response = self.provider.generate_with_system(system_prompt, &prompt).await?;
self.parse_commit_response(&response, format)
@@ -144,7 +151,19 @@ impl LlmClient {
) -> Result<String> {
let system_prompt = get_tag_system_prompt(language);
let commits_text = commits.join("\n");
let prompt = format!("Version: {}\n\nCommits:\n{}", version, commits_text);
// Add language instruction to the prompt
let language_instruction = match language {
Language::Chinese => "\n\n请用中文生成标签消息。",
Language::Japanese => "\n\n日本語でタグメッセージを生成してください。",
Language::Korean => "\n\n한국어로 태그 메시지를 생성하세요.",
Language::Spanish => "\n\nPor favor, genera el mensaje de etiqueta en español.",
Language::French => "\n\nVeuillez générer le message de balise en français.",
Language::German => "\n\nBitte generieren Sie die Tag-Nachricht auf Deutsch.",
Language::English => "",
};
let prompt = format!("Version: {}\n\nCommits:\n{}{}", version, commits_text, language_instruction);
self.provider.generate_with_system(system_prompt, &prompt).await
}
@@ -164,7 +183,18 @@ impl LlmClient {
.collect::<Vec<_>>()
.join("\n");
let prompt = format!("Version: {}\n\nCommits:\n{}", version, commits_text);
// Add language instruction to the prompt
let language_instruction = match language {
Language::Chinese => "\n\n请用中文生成变更日志。",
Language::Japanese => "\n\n日本語で変更ログを生成してください。",
Language::Korean => "\n\n한국어로 변경 로그를 생성하세요.",
Language::Spanish => "\n\nPor favor, genera el registro de cambios en español.",
Language::French => "\n\nVeuillez générer le journal des modifications en français.",
Language::German => "\n\nBitte generieren Sie das Changelog auf Deutsch.",
Language::English => "",
};
let prompt = format!("Version: {}\n\nCommits:\n{}{}", version, commits_text, language_instruction);
self.provider.generate_with_system(system_prompt, &prompt).await
}

View File

@@ -1 +0,0 @@
test

View File

@@ -1 +0,0 @@
test language

View File

@@ -1 +0,0 @@
test chinese output