feat: feat: add multilingual output support for commit, tag, and changelog commands

This commit is contained in:
2026-02-01 12:06:12 +00:00
parent c3cd01dbcd
commit 0cbd975748
11 changed files with 1710 additions and 105 deletions

View File

@@ -3,7 +3,7 @@ use clap::{Parser, Subcommand};
use colored::Colorize;
use dialoguer::{Confirm, Input, Select};
use crate::config::manager::ConfigManager;
use crate::config::{Language, manager::ConfigManager};
use crate::config::CommitFormat;
/// Mask API key with asterisks for security
@@ -146,7 +146,25 @@ enum ConfigSubcommand {
/// Path
path: String,
},
/// Set output language
SetLanguage {
/// Language code (en, zh, ja, ko, es, fr, de)
language: Option<String>,
},
/// Set whether to keep commit types in English
SetKeepTypesEnglish {
/// Keep types in English (true/false)
keep: bool,
},
/// Set whether to keep changelog types in English
SetKeepChangelogTypesEnglish {
/// Keep types in English (true/false)
keep: bool,
},
/// Reset configuration to defaults
Reset {
/// Skip confirmation
@@ -196,6 +214,9 @@ impl ConfigCommand {
Some(ConfigSubcommand::SetCommitFormat { format }) => self.set_commit_format(format).await,
Some(ConfigSubcommand::SetVersionPrefix { prefix }) => self.set_version_prefix(prefix).await,
Some(ConfigSubcommand::SetChangelogPath { path }) => self.set_changelog_path(path).await,
Some(ConfigSubcommand::SetLanguage { language }) => self.set_language(language.as_deref()).await,
Some(ConfigSubcommand::SetKeepTypesEnglish { keep }) => self.set_keep_types_english(*keep).await,
Some(ConfigSubcommand::SetKeepChangelogTypesEnglish { keep }) => self.set_keep_changelog_types_english(*keep).await,
Some(ConfigSubcommand::Reset { force }) => self.reset(*force).await,
Some(ConfigSubcommand::Export { output }) => self.export_config(output.as_deref()).await,
Some(ConfigSubcommand::Import { file }) => self.import_config(file).await,
@@ -268,6 +289,12 @@ impl ConfigCommand {
println!(" GPG sign: {}", if config.tag.gpg_sign { "yes".green() } else { "no".red() });
println!(" Include changelog: {}", if config.tag.include_changelog { "yes".green() } else { "no".red() });
println!("\n{}", "Language Configuration:".bold());
let language = manager.get_language().unwrap_or(Language::English);
println!(" Output language: {}", language.display_name().cyan());
println!(" Keep commit types in English: {}", if manager.keep_types_english() { "yes".green() } else { "no".red() });
println!(" Keep changelog types in English: {}", if manager.keep_changelog_types_english() { "yes".green() } else { "no".red() });
println!("\n{}", "Changelog Configuration:".bold());
println!(" Path: {}", config.changelog.path);
println!(" Auto-generate: {}", if config.changelog.auto_generate { "yes".green() } else { "no".red() });
@@ -706,6 +733,54 @@ impl ConfigCommand {
Ok(())
}
async fn set_language(&self, language: Option<&str>) -> Result<()> {
let mut manager = ConfigManager::new()?;
let language_code = if let Some(lang) = language {
lang.to_string()
} else {
let languages = vec![
Language::English,
Language::Chinese,
Language::Japanese,
Language::Korean,
Language::Spanish,
Language::French,
Language::German,
];
let language_names: Vec<String> = languages.iter().map(|l| l.display_name().to_string()).collect();
let idx = Select::new()
.with_prompt("Select language")
.items(&language_names)
.default(0)
.interact()?;
languages[idx].to_code().to_string()
};
manager.set_output_language(language_code.clone());
manager.save()?;
println!("{} Set output language to {}", "".green(), language_code.cyan());
Ok(())
}
async fn set_keep_types_english(&self, keep: bool) -> Result<()> {
let mut manager = ConfigManager::new()?;
manager.set_keep_types_english(keep);
manager.save()?;
let status = if keep { "enabled" } else { "disabled" };
println!("{} Keep commit types in English: {}", "".green(), status);
Ok(())
}
async fn set_keep_changelog_types_english(&self, keep: bool) -> Result<()> {
let mut manager = ConfigManager::new()?;
manager.set_keep_changelog_types_english(keep);
manager.save()?;
let status = if keep { "enabled" } else { "disabled" };
println!("{} Keep changelog types in English: {}", "".green(), status);
Ok(())
}
async fn reset(&self, force: bool) -> Result<()> {
if !force {
let confirm = Confirm::new()