#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Language {
English,
Chinese,
}
impl Language {
pub fn get_text(&self, key: &str) -> &'static str {
match self {
Language::English => crate::locale::texts::get_english_text(key),
Language::Chinese => crate::locale::texts::get_chinese_text(key),
}
}
pub fn format_text(&self, key: &str, args: &[(&str, &str)]) -> String {
let mut s = self.get_text(key).to_string();
for (name, value) in args {
s = s.replace(&format!("{{{}}}", name), value);
}
s
}
pub fn name(&self) -> &'static str {
match self {
Language::English => "English",
Language::Chinese => "Chinese",
}
}
#[allow(dead_code)]
pub fn code(&self) -> &'static str {
match self {
Language::English => "en",
Language::Chinese => "zh",
}
}
#[allow(dead_code)]
pub fn is_chinese(&self) -> bool {
matches!(self, Language::Chinese)
}
#[allow(dead_code)]
pub fn is_english(&self) -> bool {
matches!(self, Language::English)
}
}
impl std::fmt::Display for Language {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.name())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_language_names() {
assert_eq!(Language::English.name(), "English");
assert_eq!(Language::Chinese.name(), "Chinese");
}
#[test]
fn test_language_codes() {
assert_eq!(Language::English.code(), "en");
assert_eq!(Language::Chinese.code(), "zh");
}
#[test]
fn test_language_checks() {
assert!(Language::English.is_english());
assert!(!Language::English.is_chinese());
assert!(Language::Chinese.is_chinese());
assert!(!Language::Chinese.is_english());
}
#[test]
fn test_language_display() {
assert_eq!(format!("{}", Language::English), "English");
assert_eq!(format!("{}", Language::Chinese), "Chinese");
}
#[test]
fn test_format_text_single_named_placeholder() {
let out = Language::English.format_text("package_error", &[
("name", "ripgrep"),
("error", "boom"),
]);
assert_eq!(out, "ripgrep: boom");
}
#[test]
fn test_format_text_multi_named_placeholders_no_collision() {
let out = Language::English.format_text("package_updated_version", &[
("name", "ripgrep"),
("old", "13.0.0"),
("new", "14.1.0"),
]);
assert_eq!(out, "ripgrep 13.0.0 -> 14.1.0");
}
#[test]
fn test_format_text_missing_arg_leaves_placeholder() {
let out = Language::English.format_text("package_update_failed", &[
("name", "tokei"),
]);
assert_eq!(out, "tokei failed (exit code: {code})");
}
#[test]
fn test_format_text_works_for_chinese_template() {
let out = Language::Chinese.format_text("retry_attempt", &[
("attempt", "2"),
("name", "cargo-fresh"),
]);
assert_eq!(out, "第 2 次重试 cargo-fresh");
}
}