Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 0 additions & 52 deletions apps/desktop-tauri/src-tauri/src/commands/bridge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -831,56 +831,4 @@ mod tests {
"8% • Resets in 2h 05m"
);
}

#[test]
fn japanese_tray_status_label_has_no_english_reset_text() {
use codexbar::settings::Language;

let window = snapshot_window_with(
13.0,
Some(300),
Some(chrono::Utc::now() + chrono::Duration::minutes(125)),
None,
);

let label = compact_tray_status_label(&window, Language::Japanese);

assert!(label.contains("リセットまで"), "{label}");
assert!(!label.to_ascii_lowercase().contains("resets in"), "{label}");
assert!(label.contains("13%"), "{label}");
}

#[test]
fn japanese_tray_status_strips_english_fallback_reset_prefix() {
use codexbar::settings::Language;

let window =
snapshot_window_with(8.0, Some(300), None, Some("Resets in 2h 05m".to_string()));

let label = compact_tray_status_label(&window, Language::Japanese);

assert!(label.contains("リセットまで"), "{label}");
assert!(!label.to_ascii_lowercase().contains("resets in"), "{label}");
assert!(label.contains("2h 05m"), "{label}");
}

#[test]
fn tray_status_label_relocalizes_without_refetch() {
let window = snapshot_window_with(
13.0,
Some(300),
Some(chrono::Utc::now() + chrono::Duration::minutes(125)),
None,
);

let english = compact_tray_status_label(&window, Language::English);
let japanese = compact_tray_status_label(&window, Language::Japanese);

assert!(english.contains("Resets in"), "{english}");
assert!(japanese.contains("リセットまで"), "{japanese}");
assert!(
!japanese.to_ascii_lowercase().contains("resets in"),
"{japanese}"
);
}
}
12 changes: 0 additions & 12 deletions apps/desktop-tauri/src-tauri/src/commands/chart.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1103,18 +1103,6 @@ mod tests {
);
}

#[test]
fn japanese_estimate_note_is_localized() {
assert_eq!(
localized_estimate_note("codex", Language::Japanese),
"ローカルログから推定したもので、請求書と異なる場合があります"
);
assert_eq!(
localized_estimate_note("claude", Language::Japanese),
"ClaudeのローカルログからAPIレートで推定したもので、トークン総数が請求書と異なる場合があります"
);
}

#[test]
fn english_estimate_note_is_localized() {
assert_eq!(
Expand Down
44 changes: 0 additions & 44 deletions apps/desktop-tauri/src-tauri/src/commands/locale_cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,50 +109,6 @@ mod locale_tests {
assert_eq!(bundle.entries.len(), locale::LocaleKey::ALL.len());
}

#[test]
fn locale_strings_roundtrip_chinese() {
let bundle = locale_strings_for(Language::Chinese);
assert_eq!(bundle.language, "chinese");
assert_eq!(
bundle.entries.get("TabGeneral").map(String::as_str),
Some("通用")
);
assert_eq!(bundle.entries.len(), locale::LocaleKey::ALL.len());
}

#[test]
fn locale_strings_roundtrip_traditional_chinese() {
let bundle = locale_strings_for(Language::ChineseTraditional);
assert_eq!(bundle.language, "chinesetraditional");
assert_eq!(
bundle.entries.get("TabGeneral").map(String::as_str),
Some("一般")
);
assert_eq!(bundle.entries.len(), locale::LocaleKey::ALL.len());
}

#[test]
fn locale_strings_roundtrip_japanese() {
let bundle = locale_strings_for(Language::Japanese);
assert_eq!(bundle.language, "japanese");
assert_eq!(
bundle.entries.get("TabGeneral").map(String::as_str),
Some("一般")
);
assert_eq!(bundle.entries.len(), locale::LocaleKey::ALL.len());
}

#[test]
fn locale_strings_roundtrip_korean() {
let bundle = locale_strings_for(Language::Korean);
assert_eq!(bundle.language, "korean");
assert_eq!(
bundle.entries.get("TabGeneral").map(String::as_str),
Some("일반")
);
assert_eq!(bundle.entries.len(), locale::LocaleKey::ALL.len());
}

#[test]
fn locale_strings_contains_every_variant() {
let bundle = locale_strings_for(Language::English);
Expand Down
14 changes: 0 additions & 14 deletions apps/desktop-tauri/src-tauri/src/proof_harness.rs
Original file line number Diff line number Diff line change
Expand Up @@ -816,20 +816,6 @@ mod tests {
assert!(snapshot.menu_items.iter().any(|item| item == &about_label));
}

#[test]
fn native_menu_snapshot_uses_settings_language() {
let providers = Vec::new();
let settings = codexbar::settings::Settings {
ui_language: codexbar::settings::Language::Japanese,
..Default::default()
};

let (_, items) = native_menu_snapshot_for_settings(&providers, &settings, "tray");

assert!(items.iter().any(|item| item == "すべて更新"));
assert!(!items.iter().any(|item| item == "Refresh Usage"));
}

#[test]
fn about_path_snapshot_clears_on_failure() {
let _guard = MENU_LOCK.lock().unwrap();
Expand Down
38 changes: 9 additions & 29 deletions apps/desktop-tauri/src-tauri/src/tray_bridge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1583,43 +1583,23 @@ mod tests {
}

#[test]
fn japanese_tooltip_localizes_error_status() {
let mut claude = fake_snapshot("claude", "Claude", 13.0);
claude.error = Some("network timeout".to_string());

let tooltip = build_tooltip(&[&claude], codexbar::settings::Language::Japanese, true);

assert!(tooltip.contains("エラー"), "{tooltip}");
assert!(!tooltip.contains(": error ("), "{tooltip}");
}

#[test]
fn tray_labels_relocalize_on_language_change_without_refetch() {
fn tray_tooltip_is_compact_and_language_neutral() {
let mut claude = fake_snapshot("claude", "Claude", 13.0);
claude.primary.resets_at =
Some((chrono::Utc::now() + chrono::Duration::hours(2)).to_rfc3339());

// The native tooltip is intentionally compact and language-neutral
// (percent + a universal d/h/m reset) so every provider fits, so it no
// longer carries the localized "Resets in" text.
let english_tooltip =
build_tooltip(&[&claude], codexbar::settings::Language::English, true);
assert!(
english_tooltip.contains("Claude · Session (5h) · 13%"),
"{english_tooltip}"
);
// (percent + a universal d/h/m reset) so every provider fits.
let tooltip = build_tooltip(&[&claude], codexbar::settings::Language::English, true);
assert!(tooltip.contains("Claude · Session (5h) · 13%"), "{tooltip}");
assert!(
!english_tooltip.to_ascii_lowercase().contains("resets in"),
"{english_tooltip}"
!tooltip.to_ascii_lowercase().contains("resets in"),
"{tooltip}"
);

// The tray *menu* status labels still relocalize without a refetch.
let (_, english_label) =
provider_status_label(&claude, codexbar::settings::Language::English);
let (_, japanese_label) =
provider_status_label(&claude, codexbar::settings::Language::Japanese);
assert!(english_label.contains("Resets in"), "{english_label}");
assert!(japanese_label.contains("リセットまで"), "{japanese_label}");
// The tray menu status labels carry the reset text.
let (_, label) = provider_status_label(&claude, codexbar::settings::Language::English);
assert!(label.contains("Resets in"), "{label}");
}

#[test]
Expand Down
12 changes: 2 additions & 10 deletions apps/desktop-tauri/src-tauri/src/tray_menu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -441,22 +441,14 @@ mod tests {
}

#[test]
fn tray_menu_static_labels_follow_language_but_provider_names_stay_raw() {
fn tray_menu_provider_names_stay_raw() {
let menu = build_tray_menu_with(
&sample_provider_catalog(),
&[],
&both_enabled(),
false,
Language::Japanese,
Language::English,
);
let items = proof_menu_items(&menu, "tray").unwrap();

assert!(items.iter().any(|item| item == "すべて更新"));
assert!(items.iter().any(|item| item == "設定..."));
assert!(items.iter().any(|item| item == "終了"));
assert!(!items.iter().any(|item| item == "Refresh Usage"));
assert!(!items.iter().any(|item| item == "Settings"));

let providers = proof_menu_items(&menu, "tray/providers").unwrap();
assert_eq!(providers, vec!["Codex", "Claude"]);
}
Expand Down
19 changes: 4 additions & 15 deletions rust/src/locale.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,22 +43,11 @@ pub fn format_locale(lang: Language, key: LocaleKey, args: &[&str]) -> String {
format_template(&get_text(lang, key), args)
}

fn language_id(lang: Language) -> &'static LanguageIdentifier {
// Ceiling ships English only. The Language setting is retained but every value
// resolves to the English bundle (the non-English .ftl files were removed).
fn language_id(_lang: Language) -> &'static LanguageIdentifier {
static EN_US: LazyLock<LanguageIdentifier> = LazyLock::new(|| "en-US".parse().unwrap());
static ZH_CN: LazyLock<LanguageIdentifier> = LazyLock::new(|| "zh-CN".parse().unwrap());
static ZH_TW: LazyLock<LanguageIdentifier> = LazyLock::new(|| "zh-TW".parse().unwrap());
static JA_JP: LazyLock<LanguageIdentifier> = LazyLock::new(|| "ja-JP".parse().unwrap());
static KO_KR: LazyLock<LanguageIdentifier> = LazyLock::new(|| "ko-KR".parse().unwrap());
static ES_MX: LazyLock<LanguageIdentifier> = LazyLock::new(|| "es-MX".parse().unwrap());

match lang {
Language::English => &EN_US,
Language::Chinese => &ZH_CN,
Language::ChineseTraditional => &ZH_TW,
Language::Japanese => &JA_JP,
Language::Korean => &KO_KR,
Language::Spanish => &ES_MX,
}
&EN_US
}

/// Get the current UI language from settings
Expand Down
Loading
Loading