log/src/translator/mod.rs
2025-06-06 03:18:20 +09:00

123 lines
3.8 KiB
Rust

pub mod ollama_translator;
pub mod markdown_parser;
use anyhow::Result;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TranslationConfig {
pub source_lang: String,
pub target_lang: String,
pub ollama_endpoint: String,
pub model: String,
pub preserve_code: bool,
pub preserve_links: bool,
}
impl Default for TranslationConfig {
fn default() -> Self {
Self {
source_lang: "ja".to_string(),
target_lang: "en".to_string(),
ollama_endpoint: "http://localhost:11434".to_string(),
model: "qwen2.5:latest".to_string(),
preserve_code: true,
preserve_links: true,
}
}
}
#[derive(Debug, Clone)]
pub enum MarkdownSection {
Text(String),
Code(String, Option<String>), // content, language
Header(String, u8), // content, level (1-6)
Link(String, String), // text, url
Image(String, String), // alt, url
Table(String),
List(String),
Quote(String),
}
pub trait Translator {
async fn translate(&self, content: &str, config: &TranslationConfig) -> Result<String>;
async fn translate_markdown(&self, content: &str, config: &TranslationConfig) -> Result<String>;
async fn translate_sections(&self, sections: Vec<MarkdownSection>, config: &TranslationConfig) -> Result<Vec<MarkdownSection>>;
}
pub struct TranslationResult {
pub original: String,
pub translated: String,
pub source_lang: String,
pub target_lang: String,
pub model: String,
pub metrics: TranslationMetrics,
}
#[derive(Debug, Clone, Default)]
pub struct TranslationMetrics {
pub character_count: usize,
pub word_count: usize,
pub translation_time_ms: u64,
pub sections_translated: usize,
pub sections_preserved: usize,
}
pub struct LanguageMapping {
pub mappings: HashMap<String, LanguageInfo>,
}
#[derive(Debug, Clone)]
pub struct LanguageInfo {
pub name: String,
pub code: String,
pub ollama_prompt: String,
}
impl LanguageMapping {
pub fn new() -> Self {
let mut mappings = HashMap::new();
// 主要言語の設定
mappings.insert("ja".to_string(), LanguageInfo {
name: "Japanese".to_string(),
code: "ja".to_string(),
ollama_prompt: "You are a professional Japanese translator specializing in technical documentation.".to_string(),
});
mappings.insert("en".to_string(), LanguageInfo {
name: "English".to_string(),
code: "en".to_string(),
ollama_prompt: "You are a professional English translator specializing in technical documentation.".to_string(),
});
mappings.insert("zh".to_string(), LanguageInfo {
name: "Chinese".to_string(),
code: "zh".to_string(),
ollama_prompt: "You are a professional Chinese translator specializing in technical documentation.".to_string(),
});
mappings.insert("ko".to_string(), LanguageInfo {
name: "Korean".to_string(),
code: "ko".to_string(),
ollama_prompt: "You are a professional Korean translator specializing in technical documentation.".to_string(),
});
mappings.insert("es".to_string(), LanguageInfo {
name: "Spanish".to_string(),
code: "es".to_string(),
ollama_prompt: "You are a professional Spanish translator specializing in technical documentation.".to_string(),
});
Self { mappings }
}
pub fn get_language_info(&self, code: &str) -> Option<&LanguageInfo> {
self.mappings.get(code)
}
pub fn get_supported_languages(&self) -> Vec<String> {
self.mappings.keys().cloned().collect()
}
}