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

1091
src/i18n/messages.rs Normal file

File diff suppressed because it is too large Load Diff

7
src/i18n/mod.rs Normal file
View File

@@ -0,0 +1,7 @@
pub mod messages;
pub mod translator;
pub use messages::Messages;
pub use translator::Translator;
pub use translator::translate_commit_type;
pub use translator::translate_changelog_category;

233
src/i18n/translator.rs Normal file
View File

@@ -0,0 +1,233 @@
use crate::config::Language;
pub struct Translator {
language: Language,
keep_types_english: bool,
keep_changelog_types_english: bool,
}
impl Translator {
pub fn new(language: Language, keep_types_english: bool, keep_changelog_types_english: bool) -> Self {
Self {
language,
keep_types_english,
keep_changelog_types_english,
}
}
pub fn translate_commit_type(&self, commit_type: &str) -> String {
if self.keep_types_english {
return commit_type.to_string();
}
match self.language {
Language::English => commit_type.to_string(),
Language::Chinese => self.translate_commit_type_zh(commit_type),
Language::Japanese => self.translate_commit_type_ja(commit_type),
Language::Korean => self.translate_commit_type_ko(commit_type),
Language::Spanish => self.translate_commit_type_es(commit_type),
Language::French => self.translate_commit_type_fr(commit_type),
Language::German => self.translate_commit_type_de(commit_type),
}
}
pub fn translate_changelog_category(&self, category: &str) -> String {
if self.keep_changelog_types_english {
return category.to_string();
}
match self.language {
Language::English => category.to_string(),
Language::Chinese => self.translate_changelog_category_zh(category),
Language::Japanese => self.translate_changelog_category_ja(category),
Language::Korean => self.translate_changelog_category_ko(category),
Language::Spanish => self.translate_changelog_category_es(category),
Language::French => self.translate_changelog_category_fr(category),
Language::German => self.translate_changelog_category_de(category),
}
}
fn translate_commit_type_zh(&self, commit_type: &str) -> String {
match commit_type {
"feat" => "新功能".to_string(),
"fix" => "修复".to_string(),
"docs" => "文档".to_string(),
"style" => "样式".to_string(),
"refactor" => "重构".to_string(),
"perf" => "性能".to_string(),
"test" => "测试".to_string(),
"build" => "构建".to_string(),
"ci" => "CI".to_string(),
"chore" => "杂项".to_string(),
"revert" => "回滚".to_string(),
_ => commit_type.to_string(),
}
}
fn translate_commit_type_ja(&self, commit_type: &str) -> String {
match commit_type {
"feat" => "機能".to_string(),
"fix" => "修正".to_string(),
"docs" => "ドキュメント".to_string(),
"style" => "スタイル".to_string(),
"refactor" => "リファクタリング".to_string(),
"perf" => "パフォーマンス".to_string(),
"test" => "テスト".to_string(),
"build" => "ビルド".to_string(),
"ci" => "CI".to_string(),
"chore" => "雑務".to_string(),
"revert" => "取り消し".to_string(),
_ => commit_type.to_string(),
}
}
fn translate_commit_type_ko(&self, commit_type: &str) -> String {
match commit_type {
"feat" => "기능".to_string(),
"fix" => "버그 수정".to_string(),
"docs" => "문서".to_string(),
"style" => "스타일".to_string(),
"refactor" => "리팩토링".to_string(),
"perf" => "성능".to_string(),
"test" => "테스트".to_string(),
"build" => "빌드".to_string(),
"ci" => "CI".to_string(),
"chore" => "기타".to_string(),
"revert" => "되돌리기".to_string(),
_ => commit_type.to_string(),
}
}
fn translate_commit_type_es(&self, commit_type: &str) -> String {
match commit_type {
"feat" => "nueva función".to_string(),
"fix" => "corrección".to_string(),
"docs" => "documentación".to_string(),
"style" => "estilo".to_string(),
"refactor" => "refactorización".to_string(),
"perf" => "rendimiento".to_string(),
"test" => "pruebas".to_string(),
"build" => "construcción".to_string(),
"ci" => "CI".to_string(),
"chore" => "tareas".to_string(),
"revert" => "revertir".to_string(),
_ => commit_type.to_string(),
}
}
fn translate_commit_type_fr(&self, commit_type: &str) -> String {
match commit_type {
"feat" => "nouvelle fonctionnalité".to_string(),
"fix" => "correction".to_string(),
"docs" => "documentation".to_string(),
"style" => "style".to_string(),
"refactor" => "refactorisation".to_string(),
"perf" => "performance".to_string(),
"test" => "tests".to_string(),
"build" => "construction".to_string(),
"ci" => "CI".to_string(),
"chore" => "tâches".to_string(),
"revert" => "rétablir".to_string(),
_ => commit_type.to_string(),
}
}
fn translate_commit_type_de(&self, commit_type: &str) -> String {
match commit_type {
"feat" => "Neue Funktion".to_string(),
"fix" => "Korrektur".to_string(),
"docs" => "Dokumentation".to_string(),
"style" => "Stil".to_string(),
"refactor" => "Refactoring".to_string(),
"perf" => "Leistung".to_string(),
"test" => "Tests".to_string(),
"build" => "Build".to_string(),
"ci" => "CI".to_string(),
"chore" => "Wartung".to_string(),
"revert" => "Zurücksetzen".to_string(),
_ => commit_type.to_string(),
}
}
fn translate_changelog_category_zh(&self, category: &str) -> String {
match category.to_lowercase().as_str() {
"added" => "新增".to_string(),
"changed" => "更改".to_string(),
"deprecated" => "弃用".to_string(),
"removed" => "移除".to_string(),
"fixed" => "修复".to_string(),
"security" => "安全".to_string(),
_ => category.to_string(),
}
}
fn translate_changelog_category_ja(&self, category: &str) -> String {
match category.to_lowercase().as_str() {
"added" => "追加".to_string(),
"changed" => "変更".to_string(),
"deprecated" => "非推奨".to_string(),
"removed" => "削除".to_string(),
"fixed" => "修正".to_string(),
"security" => "セキュリティ".to_string(),
_ => category.to_string(),
}
}
fn translate_changelog_category_ko(&self, category: &str) -> String {
match category.to_lowercase().as_str() {
"added" => "추가됨".to_string(),
"changed" => "변경됨".to_string(),
"deprecated" => "사용 중단".to_string(),
"removed" => "제거됨".to_string(),
"fixed" => "수정됨".to_string(),
"security" => "보안".to_string(),
_ => category.to_string(),
}
}
fn translate_changelog_category_es(&self, category: &str) -> String {
match category.to_lowercase().as_str() {
"added" => "Agregado".to_string(),
"changed" => "Cambiado".to_string(),
"deprecated" => "Obsoleto".to_string(),
"removed" => "Eliminado".to_string(),
"fixed" => "Corregido".to_string(),
"security" => "Seguridad".to_string(),
_ => category.to_string(),
}
}
fn translate_changelog_category_fr(&self, category: &str) -> String {
match category.to_lowercase().as_str() {
"added" => "Ajouté".to_string(),
"changed" => "Modifié".to_string(),
"deprecated" => "Obsolète".to_string(),
"removed" => "Supprimé".to_string(),
"fixed" => "Corrigé".to_string(),
"security" => "Sécurité".to_string(),
_ => category.to_string(),
}
}
fn translate_changelog_category_de(&self, category: &str) -> String {
match category.to_lowercase().as_str() {
"added" => "Hinzugefügt".to_string(),
"changed" => "Geändert".to_string(),
"deprecated" => "Veraltet".to_string(),
"removed" => "Entfernt".to_string(),
"fixed" => "Behoben".to_string(),
"security" => "Sicherheit".to_string(),
_ => category.to_string(),
}
}
}
pub fn translate_commit_type(commit_type: &str, language: Language, keep_english: bool) -> String {
let translator = Translator::new(language, keep_english, true);
translator.translate_commit_type(commit_type)
}
pub fn translate_changelog_category(category: &str, language: Language, keep_english: bool) -> String {
let translator = Translator::new(language, true, keep_english);
translator.translate_changelog_category(category)
}