Skip to main content

cargo_plot/
i18n.rs

1use std::env;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, clap::ValueEnum)]
4pub enum Lang {
5    Pl,
6    En,
7}
8
9impl Lang {
10    pub fn detect() -> Self {
11        if env::var("LANG")
12            .unwrap_or_default()
13            .to_lowercase()
14            .starts_with("pl")
15        {
16            Self::Pl
17        } else {
18            Self::En
19        }
20    }
21}
22
23pub struct I18n {
24    pub lang: Lang,
25}
26
27impl I18n {
28    pub fn new(lang: Option<Lang>) -> Self {
29        Self {
30            lang: lang.unwrap_or_else(Lang::detect),
31        }
32    }
33
34    // =====================================================================
35    // 1. TOP - TEKST OGÓLNY
36    // =====================================================================
37    pub fn save_success(&self, name: &str, path: &str) -> String {
38        match self.lang {
39            Lang::Pl => format!("💾 Pomyślnie zapisano {} do pliku: {}", name, path),
40            Lang::En => format!("💾 Successfully saved {} to file: {}", name, path),
41        }
42    }
43    pub fn save_err(&self, name: &str, path: &str, err: &str) -> String {
44        match self.lang {
45            Lang::Pl => format!("❌ Błąd zapisu {} do pliku {}: {}", name, path, err),
46            Lang::En => format!("❌ Error saving {} to file {}: {}", name, path, err),
47        }
48    }
49    pub fn dir_create_err(&self, dir: &str, err: &str) -> String {
50        match self.lang {
51            Lang::Pl => format!("❌ Błąd: Nie można utworzyć katalogu {} ({})", dir, err),
52            Lang::En => format!("❌ Error: Cannot create directory {} ({})", dir, err),
53        }
54    }
55
56    // =====================================================================
57    // 2. LIB / CORE - LOGIKA BAZOWA
58    // =====================================================================
59    pub fn skip_binary(&self) -> &'static str {
60        match self.lang {
61            Lang::Pl => "> *(Plik binarny/graficzny - pominięto zawartość)*",
62            Lang::En => "> *(Binary/graphic file - content skipped)*",
63        }
64    }
65    pub fn read_err(&self) -> &'static str {
66        match self.lang {
67            Lang::Pl => "> *(Błąd odczytu / plik nie jest UTF-8)*",
68            Lang::En => "> *(Read error / file is not UTF-8)*",
69        }
70    }
71
72    pub fn footer_tool(&self) -> &str {
73        match self.lang {
74            Lang::Pl => "Narzędzie",
75            _ => "Tool",
76        }
77    }
78    pub fn footer_input(&self) -> &str {
79        match self.lang {
80            Lang::Pl => "Folder",
81            _ => "Input",
82        }
83    }
84    pub fn footer_cmd(&self) -> &str {
85        match self.lang {
86            Lang::Pl => "Komenda",
87            _ => "Command",
88        }
89    }
90    pub fn footer_tag(&self) -> &str {
91        match self.lang {
92            Lang::Pl => "Tag",
93            _ => "TimeTag",
94        }
95    }
96    pub fn footer_links(&self) -> &str {
97        match self.lang {
98            Lang::Pl => "Linki",
99            _ => "Links",
100        }
101    }
102    pub fn footer_help(&self) -> &str {
103        match self.lang {
104            Lang::Pl => "Pomoc",
105            _ => "Help",
106        }
107    }
108
109    // =====================================================================
110    // 3. CLI - INTERFEJS TERMINALOWY
111    // =====================================================================
112    pub fn cli_base_abs(&self, path: &str) -> String {
113        match self.lang {
114            Lang::Pl => format!("📂 Baza terminala (Absolutna): {}", path),
115            Lang::En => format!("📂 Terminal base (Absolute): {}", path),
116        }
117    }
118    pub fn cli_target_abs(&self, path: &str) -> String {
119        match self.lang {
120            Lang::Pl => format!("📂 Cel skanowania (Absolutna): {}", path),
121            Lang::En => format!("📂 Scan target (Absolute): {}", path),
122        }
123    }
124    pub fn cli_target_rel(&self, path: &str) -> String {
125        match self.lang {
126            Lang::Pl => format!("📂 Cel skanowania (Relatywna): {}", path),
127            Lang::En => format!("📂 Scan target (Relative): {}", path),
128        }
129    }
130    pub fn cli_case_sensitive(&self, val: bool) -> String {
131        match self.lang {
132            Lang::Pl => format!("🔠 Wrażliwość na litery: {}", val),
133            Lang::En => format!("🔠 Case sensitive: {}", val),
134        }
135    }
136    pub fn cli_patterns_raw(&self, pat: &str) -> String {
137        match self.lang {
138            Lang::Pl => format!("🔍 Wzorce (RAW): {}", pat),
139            Lang::En => format!("🔍 Patterns (RAW): {}", pat),
140        }
141    }
142    pub fn cli_patterns_tok(&self, pat: &str) -> String {
143        match self.lang {
144            Lang::Pl => format!("⚙️ Wzorce (TOK): {}", pat),
145            Lang::En => format!("⚙️ Patterns (TOK): {}", pat),
146        }
147    }
148    pub fn cli_summary_matched(&self, count: usize, total: usize) -> String {
149        match self.lang {
150            Lang::Pl => format!("📊 Podsumowanie: Dopasowano {} z {} ścieżek.", count, total),
151            Lang::En => format!("📊 Summary: Matched {} of {} paths.", count, total),
152        }
153    }
154    pub fn cli_summary_rejected(&self, count: usize, total: usize) -> String {
155        match self.lang {
156            Lang::Pl => format!("📊 Podsumowanie: Odrzucono {} z {} ścieżek.", count, total),
157            Lang::En => format!("📊 Summary: Rejected {} of {} paths.", count, total),
158        }
159    }
160}