diff --git a/CHANGELOG.md b/CHANGELOG.md index 55aac5fe3..4f2914be3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +### Added +- **Windows tray popover, settings and Capacity Dock follow the shared language.** The surfaces #1608 left in English (the popover, General settings, and the Capacity Dock window) use the macOS menu bar catalogs, including Traditional Chinese. Settings → General → Language writes the same `language` key in `~/.config/codeburn/config.json` that the desktop app writes, and a change made in either app is picked up while the tray is running. (#1646) + ## 0.9.27 - 2026-10-11 ### Added diff --git a/tests/menubar-i18n.test.ts b/tests/menubar-i18n.test.ts new file mode 100644 index 000000000..cb3e82fd3 --- /dev/null +++ b/tests/menubar-i18n.test.ts @@ -0,0 +1,46 @@ +import { readFileSync } from 'node:fs' +import { describe, expect, it } from 'vitest' + +import { applyLanguage, formatTemplate, normalizeLocale, t } from '../windows/src/i18n/index' + +function parseStrings(file: string): Record { + const text = readFileSync(file, 'utf8') + const map: Record = {} + const re = /"((?:\\.|[^"\\])*)"\s*=\s*"((?:\\.|[^"\\])*)"\s*;/g + const unescape = (s: string) => s.replace(/\\n/g, '\n').replace(/\\"/g, '"').replace(/\\\\/g, '\\') + let match: RegExpExecArray | null + while ((match = re.exec(text))) map[unescape(match[1]!)] = unescape(match[2]!) + return map +} + +describe('menubar locale', () => { + it('maps Chinese OS tags the way the macOS app does', () => { + expect(normalizeLocale('zh-CN')).toBe('zh-Hans') + expect(normalizeLocale('zh_TW.UTF-8')).toBe('zh-Hant') + expect(normalizeLocale('zh-HK')).toBe('zh-Hant') + expect(normalizeLocale('fr-CA')).toBe('fr') + expect(normalizeLocale('de-DE')).toBeNull() + }) + + it('fills positional and sequential placeholders', () => { + expect(formatTemplate('%1$@ · %2$lld', ['今天', 2])).toBe('今天 · 2') + expect(formatTemplate('%lld sessions', [3])).toBe('3 sessions') + expect(formatTemplate('100%%', [])).toBe('100%') + }) + + it('renders the popover in simplified Chinese', () => { + applyLanguage('zh-Hans', 'en-US') + expect(t('Your AI Bill, Itemized')).toBe('你的 AI 账单,逐项明细') + expect(t('Open Full Report')).toBe('打开完整报告') + expect(t('Today')).toBe('今天') + expect(t('%lld sessions', 3)).toBe('3 个会话') + applyLanguage('en', 'en-US') + expect(t('Open Full Report')).toBe('Open Full Report') + }) + + it('keeps the generated mac catalog in step with Localizable.strings', () => { + const generated = JSON.parse(readFileSync('windows/src/i18n/mac-catalog.json', 'utf8')) as Record> + const zh = parseStrings('mac/Sources/CodeBurnMenubar/Resources/zh-Hans.lproj/Localizable.strings') + expect(generated['zh-Hans']).toEqual(zh) + }) +}) diff --git a/windows/src-tauri/locales/en.json b/windows/src-tauri/locales/en.json index b79704494..2f999bef3 100644 --- a/windows/src-tauri/locales/en.json +++ b/windows/src-tauri/locales/en.json @@ -30,6 +30,7 @@ "Today · no usage yet": "Today · no usage yet", "Top": "Top", "Week": "Week", + "Show today's cost in tray": "Show today's cost in tray", "Updating the CLI...": "Updating the CLI...", "CLI updated to %@.": "CLI updated to %@.", "The CLI is up to date.": "The CLI is up to date.", diff --git a/windows/src-tauri/locales/fr.json b/windows/src-tauri/locales/fr.json new file mode 100644 index 000000000..c78f08f86 --- /dev/null +++ b/windows/src-tauri/locales/fr.json @@ -0,0 +1,47 @@ +{ + "%@ · no usage yet": "%@ · pas encore d'utilisation", + "%1$lld of %2$lld devices": "%1$lld appareil(s) sur %2$lld", + "%lld calls": "%lld appels", + "1 call": "1 appel", + "6 Months": "6 mois", + "About CodeBurn": "À propos de CodeBurn", + "Bottom": "Bas", + "Capacity Dock Settings…": "Réglages du Capacity Dock…", + "Check for Updates": "Rechercher des mises à jour", + "CodeBurn %1$@ · %2$lld of %3$lld devices reporting": "CodeBurn %1$@ · %2$lld appareil(s) sur %3$lld actif(s)", + "Dock to Edge": "Ancrer au bord", + "Hide Capacity Dock": "Masquer le Capacity Dock", + "Language": "Langue", + "Left": "Gauche", + "Month": "Mois", + "Open CodeBurn": "Ouvrir CodeBurn", + "Open Full Report": "Ouvrir le rapport complet", + "Quit CodeBurn": "Quitter CodeBurn", + "Refresh": "Actualiser", + "Right": "Droite", + "Settings…": "Réglages…", + "Show Capacity Dock": "Afficher le Capacity Dock", + "Switch to Dark Theme": "Passer au thème sombre", + "Switch to Light Theme": "Passer au thème clair", + "Switch to System Theme": "Passer au thème du système", + "System": "Système", + "Today": "Aujourd'hui", + "Today · %1$@ · %2$@": "Aujourd'hui · %1$@ · %2$@", + "Today · no usage yet": "Aujourd'hui · aucun usage", + "Top": "Haut", + "Week": "Semaine", + "Show today's cost in tray": "Afficher le coût du jour dans la zone de notification", + "Updating the CLI...": "Mise à jour de la CLI...", + "CLI updated to %@.": "CLI mise à jour vers %@.", + "The CLI is up to date.": "La CLI est à jour.", + "No global CLI found.": "Aucune CLI globale trouvée.", + "Another CodeBurn update is already running.": "Une autre mise à jour de CodeBurn est déjà en cours.", + "CLI %@ is not on npm yet. Try again in a few minutes.": "La CLI %@ n'est pas encore sur npm. Réessayez dans quelques minutes.", + "CodeBurn is not allowed to change the CLI folder. Run this in a terminal:": "CodeBurn n'est pas autorisé à modifier le dossier de la CLI. Exécutez ceci dans un terminal :", + "CodeBurn could not tell how the CLI was installed. Run this in a terminal:": "CodeBurn n'a pas pu déterminer comment la CLI a été installée. Exécutez ceci dans un terminal :", + "The CLI update failed. Run this in a terminal:": "La mise à jour de la CLI a échoué. Exécutez ceci dans un terminal :", + "The CLI update did not run. Run this in a terminal:": "La mise à jour de la CLI ne s'est pas exécutée. Exécutez ceci dans un terminal :", + "Your package manager updates this CLI.": "Votre gestionnaire de paquets met à jour cette CLI.", + "Opening CodeBurn to update the desktop app.": "Ouverture de CodeBurn pour mettre à jour l'application de bureau.", + "Update CLI": "Mettre à jour la CLI" +} diff --git a/windows/src-tauri/locales/ja.json b/windows/src-tauri/locales/ja.json new file mode 100644 index 000000000..18c42e4ae --- /dev/null +++ b/windows/src-tauri/locales/ja.json @@ -0,0 +1,47 @@ +{ + "%@ · no usage yet": "%@ · まだ使用量がありません", + "%1$lld of %2$lld devices": "%1$lld/%2$lld台のデバイス", + "%lld calls": "%lld回の呼び出し", + "1 call": "1回の呼び出し", + "6 Months": "6か月間", + "About CodeBurn": "CodeBurnについて", + "Bottom": "下", + "Capacity Dock Settings…": "容量ドック設定…", + "Check for Updates": "更新を確認", + "CodeBurn %1$@ · %2$lld of %3$lld devices reporting": "CodeBurn %1$@ · %2$lld/%3$lld台のデバイスが報告中", + "Dock to Edge": "画面端にドッキング", + "Hide Capacity Dock": "容量ドックを隠す", + "Language": "言語", + "Left": "左", + "Month": "今月", + "Open CodeBurn": "CodeBurn を開く", + "Open Full Report": "完全なレポートを開く", + "Quit CodeBurn": "CodeBurnを終了", + "Refresh": "更新", + "Right": "右", + "Settings…": "設定…", + "Show Capacity Dock": "容量ドックを表示", + "Switch to Dark Theme": "ダークテーマに切り替える", + "Switch to Light Theme": "ライトテーマに切り替える", + "Switch to System Theme": "システムテーマに切り替える", + "System": "システムに従う", + "Today": "今日", + "Today · %1$@ · %2$@": "今日 · %1$@ · %2$@", + "Today · no usage yet": "今日 · 使用量なし", + "Top": "上", + "Week": "今週", + "Show today's cost in tray": "今日の費用をトレイに表示", + "Updating the CLI...": "CLI を更新しています...", + "CLI updated to %@.": "CLI を %@ に更新しました。", + "The CLI is up to date.": "CLI は最新です。", + "No global CLI found.": "グローバル CLI が見つかりません。", + "Another CodeBurn update is already running.": "別の CodeBurn 更新がすでに実行中です。", + "CLI %@ is not on npm yet. Try again in a few minutes.": "CLI %@ はまだ npm にありません。数分後にもう一度お試しください。", + "CodeBurn is not allowed to change the CLI folder. Run this in a terminal:": "CodeBurn には CLI フォルダーを変更する権限がありません。ターミナルでこれを実行してください:", + "CodeBurn could not tell how the CLI was installed. Run this in a terminal:": "CodeBurn は CLI のインストール方法を判別できませんでした。ターミナルでこれを実行してください:", + "The CLI update failed. Run this in a terminal:": "CLI の更新に失敗しました。ターミナルでこれを実行してください:", + "The CLI update did not run. Run this in a terminal:": "CLI の更新は実行されませんでした。ターミナルでこれを実行してください:", + "Your package manager updates this CLI.": "この CLI はパッケージマネージャーが更新します。", + "Opening CodeBurn to update the desktop app.": "デスクトップアプリを更新するため CodeBurn を開いています。", + "Update CLI": "CLI を更新" +} diff --git a/windows/src-tauri/locales/ko.json b/windows/src-tauri/locales/ko.json new file mode 100644 index 000000000..30aa50ec7 --- /dev/null +++ b/windows/src-tauri/locales/ko.json @@ -0,0 +1,47 @@ +{ + "%@ · no usage yet": "%@ · 아직 사용량 없음", + "%1$lld of %2$lld devices": "%1$lld/%2$lld대 기기", + "%lld calls": "%lld회 호출", + "1 call": "1회 호출", + "6 Months": "6개월", + "About CodeBurn": "CodeBurn 정보", + "Bottom": "아래쪽", + "Capacity Dock Settings…": "캐퍼시티 독 설정…", + "Check for Updates": "업데이트 확인", + "CodeBurn %1$@ · %2$lld of %3$lld devices reporting": "CodeBurn %1$@ · %2$lld/%3$lld대 기기 보고 중", + "Dock to Edge": "화면 가장자리에 고정", + "Hide Capacity Dock": "캐퍼시티 독 숨기기", + "Language": "언어", + "Left": "왼쪽", + "Month": "이번 달", + "Open CodeBurn": "CodeBurn 열기", + "Open Full Report": "전체 보고서 열기", + "Quit CodeBurn": "CodeBurn 종료", + "Refresh": "새로고침", + "Right": "오른쪽", + "Settings…": "설정…", + "Show Capacity Dock": "캐퍼시티 독 표시", + "Switch to Dark Theme": "어두운 테마로 전환", + "Switch to Light Theme": "밝은 테마로 전환", + "Switch to System Theme": "시스템 테마로 전환", + "System": "시스템 설정 따름", + "Today": "오늘", + "Today · %1$@ · %2$@": "오늘 · %1$@ · %2$@", + "Today · no usage yet": "오늘 · 아직 사용량 없음", + "Top": "위쪽", + "Week": "이번 주", + "Show today's cost in tray": "오늘 비용을 트레이에 표시", + "Updating the CLI...": "CLI 업데이트 중...", + "CLI updated to %@.": "CLI가 %@로 업데이트되었습니다.", + "The CLI is up to date.": "CLI가 최신 버전입니다.", + "No global CLI found.": "전역 CLI를 찾을 수 없습니다.", + "Another CodeBurn update is already running.": "다른 CodeBurn 업데이트가 이미 실행 중입니다.", + "CLI %@ is not on npm yet. Try again in a few minutes.": "CLI %@이(가) 아직 npm에 없습니다. 몇 분 후에 다시 시도하세요.", + "CodeBurn is not allowed to change the CLI folder. Run this in a terminal:": "CodeBurn이 CLI 폴더를 변경할 수 없습니다. 터미널에서 다음을 실행하세요:", + "CodeBurn could not tell how the CLI was installed. Run this in a terminal:": "CodeBurn이 CLI 설치 방법을 알 수 없습니다. 터미널에서 다음을 실행하세요:", + "The CLI update failed. Run this in a terminal:": "CLI 업데이트에 실패했습니다. 터미널에서 다음을 실행하세요:", + "The CLI update did not run. Run this in a terminal:": "CLI 업데이트가 실행되지 않았습니다. 터미널에서 다음을 실행하세요:", + "Your package manager updates this CLI.": "이 CLI는 패키지 관리자가 업데이트합니다.", + "Opening CodeBurn to update the desktop app.": "데스크톱 앱을 업데이트하기 위해 CodeBurn을 여는 중입니다.", + "Update CLI": "CLI 업데이트" +} diff --git a/windows/src-tauri/locales/zh-Hans.json b/windows/src-tauri/locales/zh-Hans.json index c9d443c9e..72c71c261 100644 --- a/windows/src-tauri/locales/zh-Hans.json +++ b/windows/src-tauri/locales/zh-Hans.json @@ -30,6 +30,7 @@ "Today · no usage yet": "今天 · 暂无用量", "Top": "顶部", "Week": "本周", + "Show today's cost in tray": "在托盘显示今日花费", "Updating the CLI...": "正在更新 CLI...", "CLI updated to %@.": "CLI 已更新到 %@。", "The CLI is up to date.": "CLI 已是最新版本。", diff --git a/windows/src-tauri/locales/zh-Hant.json b/windows/src-tauri/locales/zh-Hant.json new file mode 100644 index 000000000..24cb5b518 --- /dev/null +++ b/windows/src-tauri/locales/zh-Hant.json @@ -0,0 +1,47 @@ +{ + "%@ · no usage yet": "%@ · 暫無用量", + "%1$lld of %2$lld devices": "%1$lld/%2$lld 臺裝置", + "%lld calls": "%lld 次呼叫", + "1 call": "1 次呼叫", + "6 Months": "6 個月", + "About CodeBurn": "關於 CodeBurn", + "Bottom": "底部", + "Capacity Dock Settings…": "容量 Dock 設定…", + "Check for Updates": "檢查更新", + "CodeBurn %1$@ · %2$lld of %3$lld devices reporting": "CodeBurn %1$@ · %2$lld/%3$lld 臺裝置已上報", + "Dock to Edge": "停靠到邊緣", + "Hide Capacity Dock": "隱藏容量 Dock", + "Language": "語言", + "Left": "左側", + "Month": "本月", + "Open CodeBurn": "開啟 CodeBurn", + "Open Full Report": "開啟完整報告", + "Quit CodeBurn": "退出 CodeBurn", + "Refresh": "重新整理", + "Right": "右側", + "Settings…": "設定…", + "Show Capacity Dock": "顯示容量 Dock", + "Switch to Dark Theme": "切換到深色主題", + "Switch to Light Theme": "切換到淺色主題", + "Switch to System Theme": "切換到系統主題", + "System": "跟隨系統", + "Today": "今天", + "Today · %1$@ · %2$@": "今天 · %1$@ · %2$@", + "Today · no usage yet": "今天 · 暫無用量", + "Top": "頂部", + "Week": "本週", + "Show today's cost in tray": "在托盤顯示今日花費", + "Updating the CLI...": "正在更新 CLI...", + "CLI updated to %@.": "CLI 已更新到 %@。", + "The CLI is up to date.": "CLI 已是最新版本。", + "No global CLI found.": "未找到全域 CLI。", + "Another CodeBurn update is already running.": "另一個 CodeBurn 更新正在執行。", + "CLI %@ is not on npm yet. Try again in a few minutes.": "CLI %@ 尚未發佈到 npm。請幾分鐘後重試。", + "CodeBurn is not allowed to change the CLI folder. Run this in a terminal:": "CodeBurn 無權變更 CLI 所在資料夾。請在終端機中執行:", + "CodeBurn could not tell how the CLI was installed. Run this in a terminal:": "CodeBurn 無法判斷 CLI 的安裝方式。請在終端機中執行:", + "The CLI update failed. Run this in a terminal:": "CLI 更新失敗。請在終端機中執行:", + "The CLI update did not run. Run this in a terminal:": "CLI 更新未能執行。請在終端機中執行:", + "Your package manager updates this CLI.": "此 CLI 由你的套件管理器更新。", + "Opening CodeBurn to update the desktop app.": "正在開啟 CodeBurn 以更新桌面應用程式。", + "Update CLI": "更新 CLI" +} diff --git a/windows/src-tauri/src/i18n.rs b/windows/src-tauri/src/i18n.rs index 15259c186..40fc7bd22 100644 --- a/windows/src-tauri/src/i18n.rs +++ b/windows/src-tauri/src/i18n.rs @@ -5,9 +5,9 @@ //! not need the mac bundle beside it. //! //! `system` follows the Windows UI language list (`GetUserPreferredUILanguages`), not -//! `GetUserDefaultLocaleName`, which telemetry already uses for a country code. Only -//! Simplified Chinese is shipped: `zh-Hans`, `zh-CN` and `zh-SG` select zh-Hans, and -//! `zh-Hant` / `zh-TW` / `zh-HK` stay on English. +//! `GetUserDefaultLocaleName`, which telemetry already uses for a country code. +//! Shipped UI languages match the desktop app: en, fr, ja, ko, zh-Hans (`zh-CN`) and +//! zh-Hant (`zh-TW`, `zh-HK`). use std::collections::BTreeMap; use std::sync::OnceLock; @@ -15,18 +15,27 @@ use std::sync::OnceLock; use serde_json::Value; const EN_JSON: &str = include_str!("../locales/en.json"); +const FR_JSON: &str = include_str!("../locales/fr.json"); +const JA_JSON: &str = include_str!("../locales/ja.json"); +const KO_JSON: &str = include_str!("../locales/ko.json"); const ZH_HANS_JSON: &str = include_str!("../locales/zh-Hans.json"); +const ZH_HANT_JSON: &str = include_str!("../locales/zh-Hant.json"); struct Catalogs { - en: BTreeMap, - zh_hans: BTreeMap, + tables: BTreeMap<&'static str, BTreeMap>, } fn catalogs() -> &'static Catalogs { static CATALOGS: OnceLock = OnceLock::new(); - CATALOGS.get_or_init(|| Catalogs { - en: parse_catalog(EN_JSON, "en"), - zh_hans: parse_catalog(ZH_HANS_JSON, "zh-Hans"), + CATALOGS.get_or_init(|| { + let mut tables = BTreeMap::new(); + tables.insert("en", parse_catalog(EN_JSON, "en")); + tables.insert("fr", parse_catalog(FR_JSON, "fr")); + tables.insert("ja", parse_catalog(JA_JSON, "ja")); + tables.insert("ko", parse_catalog(KO_JSON, "ko")); + tables.insert("zh-Hans", parse_catalog(ZH_HANS_JSON, "zh-Hans")); + tables.insert("zh-Hant", parse_catalog(ZH_HANT_JSON, "zh-Hant")); + Catalogs { tables } }) } @@ -37,11 +46,11 @@ fn parse_catalog(raw: &str, name: &str) -> BTreeMap { fn catalog_for(locale: &str) -> &'static BTreeMap { let catalogs = catalogs(); - if locale == "zh-Hans" { - &catalogs.zh_hans - } else { - &catalogs.en - } + catalogs + .tables + .get(locale) + .or_else(|| catalogs.tables.get("en")) + .expect("en catalog") } /// The sentence for `key` in the resolved language. An unknown key comes back unchanged, @@ -70,7 +79,12 @@ pub fn format_message(key: &str, args: &[Value]) -> String { /// Shared config preference; only a missing language follows the system. pub fn normalize_preference(value: Option<&str>) -> &'static str { match value { - Some("zh-CN") => "zh-Hans", + Some("zh-CN") | Some("zh-Hans") => "zh-Hans", + Some("zh-TW") | Some("zh-HK") | Some("zh-Hant") => "zh-Hant", + Some("en") => "en", + Some("fr") => "fr", + Some("ja") => "ja", + Some("ko") => "ko", Some(_) => "en", None => "system", } @@ -84,9 +98,17 @@ pub fn resolve_language<'a>( ) -> &'static str { match preference { "en" => "en", + "fr" => "fr", + "ja" => "ja", + "ko" => "ko", "zh-Hans" => "zh-Hans", + "zh-Hant" => "zh-Hant", _ => match first_ui_language(ui_languages) { + Some(tag) if is_traditional_chinese(tag) => "zh-Hant", Some(tag) if is_simplified_chinese(tag) => "zh-Hans", + Some(tag) if is_language(tag, "fr") => "fr", + Some(tag) if is_language(tag, "ja") => "ja", + Some(tag) if is_language(tag, "ko") => "ko", _ => "en", }, } @@ -99,14 +121,64 @@ fn first_ui_language<'a>(ui_languages: impl IntoIterator) -> Opt .find(|tag| !tag.is_empty()) } -fn is_simplified_chinese(tag: &str) -> bool { +fn normalized_tag(tag: &str) -> String { let head = tag.split(['.', '@']).next().unwrap_or(tag); - let normalized = head.replace('_', "-").to_ascii_lowercase(); + head.replace('_', "-").to_ascii_lowercase() +} + +fn is_simplified_chinese(tag: &str) -> bool { + let normalized = normalized_tag(tag); language_is(&normalized, "zh-hans") || language_is(&normalized, "zh-cn") || language_is(&normalized, "zh-sg") } +fn is_traditional_chinese(tag: &str) -> bool { + let normalized = normalized_tag(tag); + language_is(&normalized, "zh-hant") + || language_is(&normalized, "zh-tw") + || language_is(&normalized, "zh-hk") + || language_is(&normalized, "zh-mo") +} + +fn is_language(tag: &str, want: &str) -> bool { + let normalized = normalized_tag(tag); + language_is(&normalized, want) +} + +/// The raw `language` value in config.json, or an empty string when it is absent. +/// A change here is what a desktop-app language switch looks like to the tray. +pub fn stored_language_key() -> String { + crate::config::read() + .get("language") + .and_then(Value::as_str) + .unwrap_or("") + .to_owned() +} + +#[derive(serde::Serialize)] +pub struct LanguageState { + /// The desktop app's config value: `system` when the key is absent. + pub choice: String, + /// The catalog this process should render. + pub locale: String, +} + +pub fn language_state() -> LanguageState { + let stored = stored_language_key(); + let choice = match stored.as_str() { + "" => "system", + "zh-Hans" | "zh-CN" => "zh-CN", + "zh-Hant" | "zh-TW" | "zh-HK" => "zh-TW", + "en" | "fr" | "ja" | "ko" => stored.as_str(), + _ => "system", + }; + LanguageState { + choice: choice.to_owned(), + locale: resolved_language(), + } +} + fn language_is(tag: &str, want: &str) -> bool { tag == want || tag.starts_with(&format!("{want}-")) } @@ -369,22 +441,22 @@ mod tests { #[test] fn catalogs_share_every_key_and_placeholder() { - let en = &catalogs().en; - let zh = &catalogs().zh_hans; - assert_eq!( - en.keys().cloned().collect::>(), - zh.keys().cloned().collect::>(), - "en and zh-Hans must list the same keys" - ); - for (key, english) in en { - let translated = zh - .get(key) - .unwrap_or_else(|| panic!("zh-Hans is missing {key}")); + let tables = &catalogs().tables; + let en = tables.get("en").expect("en"); + for (name, table) in tables { assert_eq!( - placeholder_tokens(english), - placeholder_tokens(translated), - "{key}" + en.keys().cloned().collect::>(), + table.keys().cloned().collect::>(), + "en and {name} must list the same keys" ); + for (key, english) in en { + let translated = table.get(key).unwrap_or_else(|| panic!("{name} is missing {key}")); + assert_eq!( + placeholder_tokens(english), + placeholder_tokens(translated), + "{name} {key}" + ); + } } } @@ -412,20 +484,24 @@ mod tests { assert_eq!(resolve_language("system", ["zh-Hans"]), "zh-Hans"); assert_eq!(resolve_language("system", ["zh-SG"]), "zh-Hans"); assert_eq!(resolve_language("system", ["zh_CN.UTF-8"]), "zh-Hans"); - assert_eq!(resolve_language("system", ["fr-FR"]), "en"); - assert_eq!(resolve_language("system", ["zh-TW"]), "en"); - assert_eq!(resolve_language("system", ["zh-HK"]), "en"); - assert_eq!(resolve_language("system", ["zh-Hant"]), "en"); + assert_eq!(resolve_language("system", ["zh-TW"]), "zh-Hant"); + assert_eq!(resolve_language("system", ["zh-HK"]), "zh-Hant"); + assert_eq!(resolve_language("system", ["zh-Hant"]), "zh-Hant"); + assert_eq!(resolve_language("zh-Hant", ["en-US"]), "zh-Hant"); + assert_eq!(resolve_language("system", ["fr-FR"]), "fr"); + assert_eq!(resolve_language("system", ["ja-JP"]), "ja"); assert_eq!(resolve_language("system", std::iter::empty()), "en"); } #[test] fn shared_config_language_maps_zh_cn_and_defaults_only_when_missing() { - assert_eq!(normalize_preference(Some("zh-Hans")), "en"); + assert_eq!(normalize_preference(Some("zh-Hans")), "zh-Hans"); assert_eq!(normalize_preference(Some("en")), "en"); + assert_eq!(normalize_preference(Some("fr")), "fr"); assert_eq!(normalize_preference(Some("garbage")), "en"); assert_eq!(normalize_preference(Some("zh-CN")), "zh-Hans"); - assert_eq!(normalize_preference(Some("zh-TW")), "en"); + assert_eq!(normalize_preference(Some("zh-TW")), "zh-Hant"); + assert_eq!(normalize_preference(Some("zh-HK")), "zh-Hant"); assert_eq!(normalize_preference(None), "system"); } diff --git a/windows/src-tauri/src/lib.rs b/windows/src-tauri/src/lib.rs index 1b45b2c80..55b06bb7b 100644 --- a/windows/src-tauri/src/lib.rs +++ b/windows/src-tauri/src/lib.rs @@ -171,6 +171,25 @@ pub fn run() { // made, and the decision is the desktop app's whenever that app is installed. // `track` is silent until this has run, so it comes before anything that reports. telemetry::init(app.package_info().version.to_string()); + // The desktop app writes `language` into config.json without telling this + // process. A one-second poll is what makes that change show up in the tray + // while it is already running. + { + let handle = app.handle().clone(); + tauri::async_runtime::spawn(async move { + let mut seen = crate::i18n::stored_language_key(); + loop { + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + let next = crate::i18n::stored_language_key(); + if next == seen { + continue; + } + seen = next; + crate::sync_localized_menu_items(); + let _ = handle.emit("codeburn://language-changed", ()); + } + }); + } telemetry::track("app_open", serde_json::Value::Null); update::settle_pending_update(&app.package_info().version.to_string()); tauri::async_runtime::spawn(async { @@ -286,6 +305,8 @@ pub fn run() { commands::settings_load, commands::settings_patch, commands::i18n_catalog, + commands::language_state, + commands::set_language_choice, commands::i18n_format, commands::terminals, commands::claude_config_dirs, @@ -1414,6 +1435,31 @@ mod commands { crate::i18n::format_message(&key, &args) } + #[tauri::command] + pub fn language_state() -> crate::i18n::LanguageState { + crate::i18n::language_state() + } + + /// Writes the same `language` key the desktop app writes. `system` clears it. + #[tauri::command] + pub fn set_language_choice(app: AppHandle, choice: String) -> Result<(), String> { + const ALLOWED: [&str; 7] = ["system", "en", "fr", "ja", "ko", "zh-CN", "zh-TW"]; + if !ALLOWED.contains(&choice.as_str()) { + return Err("unsupported language".into()); + } + crate::config::update(|map| { + if choice == "system" { + map.remove("language"); + } else { + map.insert("language".into(), serde_json::Value::String(choice.clone())); + } + }) + .map_err(|err| err.to_string())?; + crate::sync_localized_menu_items(); + let _ = app.emit("codeburn://language-changed", ()); + Ok(()) + } + /// The consoles the settings window offers, each marked with whether it is on this /// machine, so the "(not installed)" hint stays honest. #[tauri::command] diff --git a/windows/src/App.tsx b/windows/src/App.tsx index 84e1e85bb..8152cea06 100644 --- a/windows/src/App.tsx +++ b/windows/src/App.tsx @@ -12,7 +12,8 @@ import { DEFAULT_SETTINGS, MENUBAR_PERIODS, MENUBAR_SUFFIX, cacheThemeAndAccent, nextTheme, subscribeSettings, writeSettings, type AppSettings, type ThemeChoice, } from './lib/appSettings' -import { formatMessage, t, useI18nRevision } from './lib/i18n' +import { t } from './i18n' +import { formatMessage, t as menuT, useI18nRevision } from './lib/i18n' import { TRAY_BADGE_SUPPORTED } from './lib/platform' import { usageRefreshPlan } from './lib/refresh' import { EMPTY_QUOTA, refreshQuota, refreshQuotaIfDue, subscribeQuota, worstSeverity, type QuotaState } from './lib/quota' @@ -494,15 +495,15 @@ export function App() { let text: string if (!trayCurrent) { text = settings.menubarPeriod === 'today' - ? t('Today · no usage yet') - : await formatMessage('%@ · no usage yet', [t(periodLabel)]) + ? menuT('Today · no usage yet') + : await formatMessage('%@ · no usage yet', [menuT(periodLabel)]) } else { const calls = trayCurrent.calls === 1 - ? t('1 call') + ? menuT('1 call') : await formatMessage('%lld calls', [trayCurrent.calls]) text = settings.menubarPeriod === 'today' ? await formatMessage('Today · %1$@ · %2$@', [figure, calls]) - : `${t(periodLabel)} · ${figure} · ${calls}` + : `${menuT(periodLabel)} · ${figure} · ${calls}` if (trayShortfall) { text += ` · ${await formatMessage('%1$lld of %2$lld devices', [trayShortfall.reachable, trayShortfall.total])}` } @@ -620,9 +621,9 @@ export function App() { && (payload.current?.calls ?? 0) === 0 && (payload.current?.sessions ?? 0) === 0 && (payload.history?.daily?.length ?? 0) === 0 - const label = daySelectionLabel(days) ?? PERIOD_LABELS[period] + const label = daySelectionLabel(days) ?? t(PERIOD_LABELS[period]) - const footnote = [version ? `CodeBurn v${version}` : 'CodeBurn', lastUpdated ? `updated ${relativePast(lastUpdated)}` : null] + const footnote = [version ? t('CodeBurn v%@', version) : 'CodeBurn', lastUpdated ? t('updated %@', relativePast(lastUpdated)) : null] .filter(Boolean) .join(' · ') diff --git a/windows/src/Dock.tsx b/windows/src/Dock.tsx index 40ad3fb18..2642a1db9 100644 --- a/windows/src/Dock.tsx +++ b/windows/src/Dock.tsx @@ -74,6 +74,7 @@ import { } from './dockGeometry' import { track } from './lib/telemetry' import './dock.css' +import { t } from './i18n/index' const PROVIDER_NAMES: Record = { claude: 'Claude', @@ -284,15 +285,17 @@ function connectionAction(provider: Provider): 'Connect' | 'Reconnect' | null { /// The mac says "Add API Key" where the provider's only credential is a token. Here that is /// the same two providers whose settings pane offers a paste field. function actionTitle(provider: Provider, action: 'Connect' | 'Reconnect'): string { - return ACCEPTS_KEY.includes(provider.id) ? 'Add API Key' : action + return t(ACCEPTS_KEY.includes(provider.id) ? 'Add API Key' : action) } function checkedLabel(fetchedAt: number, now: number): string { const minutes = Math.floor(Math.max(0, now - fetchedAt) / 60_000) - if (minutes < 1) return 'Checked just now' - if (minutes < 60) return `Checked ${minutes}m ago` + if (minutes < 1) return t('just now') + if (minutes < 60) return t('%lldm ago', minutes) const hours = Math.floor(minutes / 60) - return `Checked ${hours}h ${minutes % 60}m ago` + const rest = minutes % 60 + if (rest === 0) return t('%lldh ago', hours) + return t('%1$lldh %2$lldm ago', hours, rest) } /// The mac's footer carries provider facts its own adapters return. The CLI's `quota` output @@ -302,12 +305,12 @@ function footerLines(provider: Provider, fetchedAt: number | null, now: number): const lines: string[] = [] if (fetchedAt !== null) lines.push(checkedLabel(fetchedAt, now)) const hidden = provider.windows.length - MAX_WINDOW_COLUMNS - if (hidden > 0) lines.push(`${hidden} more window${hidden === 1 ? '' : 's'} not shown`) + if (hidden > 0) lines.push(hidden === 1 ? t('1 more window not shown') : t('%lld more windows not shown', hidden)) return visibleFooterLines(lines, provider.error ?? null).slice(0, 2) } function instruction(provider: Provider, quota: QuotaState): string { - if (quota.cliOutdated) return 'CLI update needed for live quota. Run npm install -g codeburn.' + if (quota.cliOutdated) return t('CLI update needed for live quota. Run npm install -g codeburn.') if (quota.error) return quota.error const name = PROVIDER_NAMES[provider.baseId ?? provider.id] ?? provider.name return `Sign in with the ${name} app or CLI. The dock checks again on the quota refresh cadence.` @@ -427,23 +430,23 @@ function Detail({ {title} - {provider.plan ? {provider.plan} : null} + {provider.plan ? {t(provider.plan)} : null} - {connection === 'loading' ?

Refreshing…

: null} - {connection === 'stale' ?

Last known usage · refreshing

: null} + {connection === 'loading' ?

{t('Refreshing…')}

: null} + {connection === 'stale' ?

{t('Last known usage · refreshing')}

: null} {connection === 'transientFailure' ? ( -

Last known usage · retrying

+

{t('Last known usage · retrying')}

) : null} {connection === 'disconnected' ? (
-

Not connected

+

{t('Not connected')}

{instruction(provider, quota)}

) : null} {connection === 'terminalFailure' ? (
-

Reconnect required

+

{t('Reconnect required')}

{provider.error}

{instruction(provider, quota)}

@@ -452,7 +455,7 @@ function Detail({ {sessions ? (
- Sessions + {t('Sessions')} {runningLabel(sessions.length)}
{sessions.length > 0 ? ( @@ -468,12 +471,12 @@ function Detail({ {today ? (
- Today + {t('Today')}
{usd(today.cost)} - burned + {t('burned')} diff --git a/windows/src/Settings.tsx b/windows/src/Settings.tsx index 08d620706..457c2ea27 100644 --- a/windows/src/Settings.tsx +++ b/windows/src/Settings.tsx @@ -11,6 +11,7 @@ import { ProviderGlyph } from './providerIcons' import { GeneralPane } from './settings/GeneralPane' import { ProviderPane } from './settings/ProviderPane' import { AboutPane } from './settings/AboutPane' +import { t } from './i18n' /// The System Settings shell from mac/.../Views/SettingsView.swift: a fixed sidebar with a /// provider search, General and About, then one row per provider that has a live quota @@ -86,10 +87,10 @@ export function Settings() { }, [providers, search]) const paneTitle = pane === 'general' - ? 'General' + ? t('General') : pane === 'about' - ? 'About' - : providers.find(p => p.id === pane)?.name ?? 'Settings' + ? t('About') + : providers.find(p => p.id === pane)?.name ?? t('Settings') // The mac names the window after the visible pane; so does this one. useEffect(() => { @@ -108,13 +109,13 @@ export function Settings() { return (
-
diff --git a/windows/src/components/StarBanner.tsx b/windows/src/components/StarBanner.tsx index 3b28676dc..fbea2dfc5 100644 --- a/windows/src/components/StarBanner.tsx +++ b/windows/src/components/StarBanner.tsx @@ -2,6 +2,7 @@ import { useState } from 'react' import { openUrl } from '@tauri-apps/plugin-opener' import { readSetting, writeSetting } from '../lib/settings' import { StarIcon, XIcon } from './Icons' +import { t } from '../i18n/index' const GITHUB_URL = 'https://github.com/getagentseal/codeburn' @@ -18,11 +19,11 @@ export function StarBanner() {
-
diff --git a/windows/src/components/StatsInsight.tsx b/windows/src/components/StatsInsight.tsx index 67c79beca..6e23228e7 100644 --- a/windows/src/components/StatsInsight.tsx +++ b/windows/src/components/StatsInsight.tsx @@ -7,6 +7,7 @@ import { computeHistoryStats } from '../lib/history' import type { Period } from './PeriodTabs' import { ArrowDownRight, ArrowUpRight, ChevronRight, FlameIcon } from './Icons' import { formatCompactSessionCount, formatSessionCount, SESSION_COUNT_HELP } from '../lib/session-count-label' +import { t } from '../i18n' type Props = { payload: MenubarPayload @@ -31,7 +32,7 @@ function projectDisplayName(path: string): string { export function StatsInsight({ payload, currency, period }: Props) { const s = computeHistoryStats(payload.history.daily) - const suffix = PERIOD_SUFFIX[period] + const suffix = t(PERIOD_SUFFIX[period]) const projects = (payload.current.topProjects ?? []).slice(0, 3) const costliest = payload.current.topSessions?.[0] @@ -39,22 +40,22 @@ export function StatsInsight({ payload, currency, period }: Props) {
- - - - + + + +
- - - 0 ? plural(s.currentStreak, 'day') : '-'} /> - 0 ? plural(s.longestStreak, 'day') : '-'} /> + + + 0 ? (s.currentStreak === 1 ? t('1 day') : t('%lld days', s.currentStreak)) : '-'} /> + 0 ? (s.longestStreak === 1 ? t('1 day') : t('%lld days', s.longestStreak)) : '-'} />
{s.trackedDays > 0 && (
- Tracked spend (last {plural(s.trackedDays, 'day')}) + {t('Tracked spend (last %@)', s.trackedDays === 1 ? t('1 day') : t('%lld days', s.trackedDays))} {formatCurrency(s.trackedTotal, currency)} @@ -65,7 +66,7 @@ export function StatsInsight({ payload, currency, period }: Props) { {costliest && costliest.cost > 0 && (
- Costliest session + {t('Costliest session')} {formatCompactCurrency(costliest.cost, currency)} · {projectDisplayName(costliest.project)} diff --git a/windows/src/components/TelemetryNotice.tsx b/windows/src/components/TelemetryNotice.tsx index ead4850c1..7fe89862d 100644 --- a/windows/src/components/TelemetryNotice.tsx +++ b/windows/src/components/TelemetryNotice.tsx @@ -1,6 +1,7 @@ import { useEffect, useState } from 'react' import { openUrl } from '@tauri-apps/plugin-opener' +import { t } from '../i18n' import { TELEMETRY_DOCS_URL, completeTelemetryConsent, telemetryStatus, type TelemetryStatus, } from '../lib/telemetry' @@ -30,8 +31,8 @@ export function TelemetryNotice({ onDecided }: { onDecided?: (status: TelemetryS } return ( -
-

Help improve CodeBurn

+
+

{t('Help improve CodeBurn')}

Share anonymous usage statistics: which parts of the app get opened, how the Capacity Dock is used, and errors. The daily report includes the names of the models, tools, @@ -42,8 +43,8 @@ export function TelemetryNotice({ onDecided }: { onDecided?: (status: TelemetryS What data we collect

- - + +
) diff --git a/windows/src/components/ToolingSection.tsx b/windows/src/components/ToolingSection.tsx index bb99c8bb5..15d44a920 100644 --- a/windows/src/components/ToolingSection.tsx +++ b/windows/src/components/ToolingSection.tsx @@ -3,6 +3,7 @@ import type { CurrencyState } from '../lib/currency' import { formatCompactCurrency } from '../lib/currency' import { CollapsibleSection } from './CollapsibleSection' import { FixedBar } from './ActivitySection' +import { t } from '../i18n/index' /// Port of ToolingSection in mac/.../Views/ToolingSection.swift: what the agent reached for, /// in three lists. Skills and subagents are merged because from the reader's side they are @@ -34,11 +35,11 @@ export function ToolingSection({ payload, currency }: { payload: MenubarPayload; const maxCost = Math.max(...combined.map(d => d.cost), 0.01) return ( - +
{tools.length > 0 && (
-
Tools
+
{t('Tools')}
{tools.map(tool => ( ))} @@ -46,7 +47,7 @@ export function ToolingSection({ payload, currency }: { payload: MenubarPayload; )} {combined.length > 0 && (
-
Skills & Agents
+
{t('Skills & Agents')}
{combined.map(entry => (
@@ -61,7 +62,7 @@ export function ToolingSection({ payload, currency }: { payload: MenubarPayload; )} {mcpServers.length > 0 && (
-
MCP Servers
+
{t('MCP Servers')}
{mcpServers.map(server => ( ))} diff --git a/windows/src/components/TrendInsight.tsx b/windows/src/components/TrendInsight.tsx index df59bd5bc..7d75a5c3c 100644 --- a/windows/src/components/TrendInsight.tsx +++ b/windows/src/components/TrendInsight.tsx @@ -5,6 +5,7 @@ import { formatCompactCurrency, formatCurrency, formatTokens } from '../lib/curr import { todayKey, formatDateKey, addDays, startOfDay, prettyDate, shortDate } from '../lib/dates' import { ArrowUpRight, ArrowDownRight } from './Icons' import type { DaySelection, Period } from './PeriodTabs' +import { t } from '../i18n/index' /// How many days the chart covers, from the mac TrendInsight.trendDayCount. 19 is what /// fits the 332px content width of a 360px popover at a readable bar width; the longer @@ -87,20 +88,20 @@ export function TrendInsight({ days, currency, dayCount }: Props) { const barGap = dayCount > 45 ? 2 : 4 const fmtVal = (v: number) => useTokens ? `${formatTokens(v)} tok` : formatCompactCurrency(v, currency) - const heroText = useTokens ? `${formatTokens(totalTokens)} tokens` : formatCurrency(totalCost, currency) + const heroText = useTokens ? t('%@ tokens', formatTokens(totalTokens)) : formatCurrency(totalCost, currency) const hovered = hoveredIdx !== null ? bars[hoveredIdx] : null return (
-
Last {dayCount} days
+
{t('Last %lld days', dayCount)}
{heroText}
{delta !== null && (
{delta >= 0 ? : } - {delta >= 0 ? '+' : ''}{Math.round(delta)}% vs prior {dayCount}d + {t('%1$@%% vs prior %2$lldd', `${delta >= 0 ? '+' : ''}${Math.round(delta)}`, dayCount)}
)}
@@ -108,7 +109,7 @@ export function TrendInsight({ days, currency, dayCount }: Props) {
setHoveredIdx(null)} >
@@ -159,17 +160,17 @@ export function TrendInsight({ days, currency, dayCount }: Props) {
-
Avg/day
+
{t('Avg/day')}
{fmtVal(avgVal)}
-
Peak
+
{t('Peak')}
{peak ? `${fmtVal(metric(peak))} on ${shortDate(peak.date)}` : '-'}
-
Yesterday
+
{t('Yesterday')}
{yesterday ? fmtVal(metric(yesterday)) : '-'}
diff --git a/windows/src/i18n/extra.json b/windows/src/i18n/extra.json new file mode 100644 index 000000000..3a623fcd4 --- /dev/null +++ b/windows/src/i18n/extra.json @@ -0,0 +1,645 @@ +{ + "zh-Hans": { + "Open Full Report": "打开完整报告", + "Refresh": "刷新", + "More": "更多", + "Settings...": "设置...", + "Show today's cost in tray": "在托盘显示今日花费", + "Open CodeBurn": "打开 CodeBurn", + "Capacity Dock Settings...": "容量 Dock 设置...", + "Switch to Light Theme": "切换到浅色主题", + "Switch to Dark Theme": "切换到深色主题", + "Switch to System Theme": "切换到系统主题", + "%1$@ · no usage yet": "%1$@ · 暂无用量", + "%1$@ · %2$@ · %3$@": "%1$@ · %2$@ · %3$@", + " · %1$lld/%2$lld devices": " · %1$lld/%2$lld 台设备", + " · %1$lld of %2$lld devices reporting": " · %1$lld/%2$lld 台设备已上报", + "CodeBurn v%@": "CodeBurn v%@", + "updated %@": "%@更新", + "What the number beside the tray flame counts.": "火焰图标旁边那个数字统计的内容。", + "How far back that number reaches.": "这个数字往回统计多久。", + "Combined adds every paired device the CLI can reach.": "“合并”会加上命令行工具能连上的每台已配对设备。", + "Tints the popover, this window and the Capacity Dock.": "为弹出窗口、此窗口和容量 Dock 着色。", + "The currency is shared with the CLI through %@.": "货币与命令行工具共用,配置文件位于 %@。", + "Usage refresh cadence": "用量刷新频率", + "How often the tray figure re-reads your local session data. Auto refreshes every minute while the popover is open and every two minutes when it is closed. Manual only refreshes when you open the popover or press Refresh.": "托盘数字重新读取本机会话数据的频率。“自动”在弹出窗口打开时每分钟刷新一次,关闭时每两分钟刷新一次。“手动”只在你打开弹出窗口或按下“刷新”时更新。", + "Theme": "主题", + "Light": "浅色", + "Dark": "深色", + "Launch at login": "登录时启动", + "Start CodeBurn in the tray when you sign in.": "登录后在托盘启动 CodeBurn。", + "Show today's figure in the tray": "在托盘显示今日数字", + "A second tray icon carrying the number, next to the logo.": "在标志旁边再放一个显示数字的托盘图标。", + "Anonymous telemetry": "匿名使用统计", + "Which parts of the app get opened, how the Capacity Dock is used, and errors. The daily report includes the names of the models, tools, skills and MCP servers you use alongside the bucketed counts. Never your prompts, your code, or your project and file names.": "会记录打开了应用的哪些部分、容量 Dock 的使用方式,以及错误。每日报告包含你使用的模型、工具、技能和 MCP 服务器名称,以及分桶后的计数。绝不包含你的提示词、代码,或项目与文件名。", + "This is the CodeBurn desktop app's setting and it covers both apps. Change it there, under Privacy and data.": "这是 CodeBurn 桌面应用的设置,两个应用都遵循它。请到桌面应用的“隐私与数据”里修改。", + "Connected providers, and anything already in the dock, appear here, so a provider can always be removed even after its connection fails.": "已连接的服务商,以及已经在 Dock 里的项目,都会出现在这里,因此即使连接失败,也可以把它移除。", + "A slim quota rail docked to a screen edge.": "贴在屏幕边缘的一条细配额条。", + "The one the rail shows before you hover it.": "悬停之前,轨道上显示的那一个。", + "Keep expanded": "保持展开", + "Every ring stays out. Off, the rail rests on one ring and opens when you hover it.": "每个圆环都保持展开。关闭后,轨道只显示一个圆环,悬停时再展开。", + "Keep the Capacity Dock expanded": "保持容量 Dock 展开", + "Hover bubble": "悬停气泡", + "The details card can keep its own surface, so a Glass rail can carry a Graphite card.": "详情卡片可以有自己的外观,因此玻璃轨道也可以配石墨色卡片。", + "Claude profiles": "Claude 配置", + "One ring per Claude config directory, each with its own limit and sessions.": "每个 Claude 配置目录一个圆环,各自有限额和会话。", + "Connect a provider from its page in the sidebar to make it available here.": "在侧边栏打开某个服务商的页面并连接后,它就会出现在这里。", + "Custom...": "自定义...", + "Millions of tokens": "百万 Token", + "Custom daily budget": "自定义每日预算", + "Tokens (up/down)": "Token(上传/下载)", + "Glass": "玻璃", + "Separate rings": "分开显示", + "Match dock": "与 Dock 一致", + "Windows Terminal": "Windows 终端", + "Windows PowerShell": "Windows PowerShell", + "Command Prompt": "命令提示符", + "Where Full Report and Optimize open. If the chosen console is not installed, CodeBurn tries the others and then runs the command in the background.": "“完整报告”和“优化”在这里打开。如果所选控制台没有安装,CodeBurn 会尝试其他控制台,然后在后台运行命令。", + "Settings sections": "设置分区", + "No provider matches that.": "没有匹配的服务商。", + "Version": "版本", + "Version %@": "版本 %@", + "Checking...": "正在检查...", + "Checking…": "正在检查…", + "Or install it from a terminal": "或在终端中安装", + "Downloads the same release, checks it and runs the installer.": "下载同一版本,校验后运行安装程序。", + "Update the CLI": "更新命令行工具", + "Copyright 2026 Resham Joshi (iamtoruk) - AgentSeal. MIT License.": "版权所有 2026 Resham Joshi (iamtoruk) - AgentSeal。MIT 许可证。", + "Checking GitHub for a newer release...": "正在 GitHub 上查找新版本...", + "This copy came from the Microsoft Store, which keeps it up to date. There is nothing to check here.": "此副本来自 Microsoft Store,由商店负责更新。这里没有需要检查的内容。", + "Check failed. %@": "检查失败。%@", + "Version %@ is available.": "版本 %@ 可用。", + "CLI %@ is available (you have %@).": "命令行工具 %@ 可用(当前为 %@)。", + "You are on the latest version (%@).": "已是最新版本(%@)。", + "These builds are unsigned and do not update themselves, so CodeBurn will not install one for you. Download it from GitHub and Windows will vet it before it runs.": "这些构建没有签名,也不会自行更新,因此 CodeBurn 不会替你安装。请从 GitHub 下载,Windows 会在运行前进行检查。", + "Update the CLI first: the installed one is too old to install this app.": "请先更新命令行工具:当前安装的版本太旧,无法安装此应用。", + "Checked %@": "检查于 %@", + "Download from GitHub": "从 GitHub 下载", + "Copy %@ to the clipboard": "将 %@ 复制到剪贴板", + "Help improve CodeBurn": "帮助改进 CodeBurn", + "Decline": "拒绝", + "Accept": "接受", + "What data we collect": "我们收集哪些数据", + "Share anonymous usage statistics: which parts of the app get opened, how the Capacity Dock is used, and errors. The daily report includes the names of the models, tools, skills and MCP servers you use alongside the bucketed counts. Never your prompts, your code, or your project and file names.": "分享匿名使用统计:打开了应用的哪些部分、容量 Dock 的使用方式,以及错误。每日报告包含你使用的模型、工具、技能和 MCP 服务器名称,以及分桶后的计数。绝不包含你的提示词、代码,或项目与文件名。", + "Dismiss": "关闭", + "Copy": "复制", + "Copied": "已复制", + "Pick days": "选择日期", + "Previous month": "上个月", + "Next month": "下个月", + "Days": "日期", + "the last 7 days": "最近 7 天", + "the last 30 days": "最近 30 天", + "this month": "本月", + "the last 6 months": "最近 6 个月", + "all time": "全部时间", + "today": "今天", + "(7 days)": "(7 天)", + "(30 days)": "(30 天)", + "(month)": "(本月)", + "(6 months)": "(6 个月)", + "(all time)": "(全部时间)", + "Loading...": "正在加载...", + "Loading %@…": "正在加载 %@…", + "Loading": "正在加载", + "No session data yet": "还没有会话数据", + "CodeBurn reads local session logs written by your AI coding tools. None of the supported tools have recorded a session on this machine yet.": "CodeBurn 读取你的 AI 编程工具写在本机的会话日志。这台机器上还没有任何受支持的工具记录过会话。", + "Watched locations": "监视的位置", + "Run one of those tools for a session, then refresh.": "用其中某个工具进行一次会话,然后刷新。", + "Refresh now": "立即刷新", + "No %1$@ data for %2$@": "%2$@没有 %1$@ 的数据", + "Sets the app language. System follows Windows.": "设置应用语言。选择“跟随系统”时使用 Windows 的语言。", + "Sets the language for this app and the desktop app. System follows Windows.": "设置本应用和桌面应用的语言。选择“跟随系统”时使用 Windows 的语言。", + "Update failed.": "更新失败。", + "Check failed.": "检查失败。", + "Where Full Report and Optimize open. If the chosen console is not installed, CodeBurn falls back to the Command Prompt, which always is.": "“完整报告”和“优化”在这里打开。如果所选控制台没有安装,CodeBurn 会改用始终存在的命令提示符。", + "Switching this off gives this install a new anonymous id, so nothing recorded before can be tied to anything after.": "关闭后,此次安装会换一个新的匿名标识,此前记录的内容无法再与之后的内容关联。", + "Amount in %@": "金额(%@)", + "Install the CodeBurn CLI": "安装 CodeBurn 命令行工具", + "Update the CodeBurn CLI": "更新 CodeBurn 命令行工具", + "This app needs codeburn %@ or newer; version %@ was found.": "此应用需要 codeburn %@ 或更新版本;当前找到的是 %@。", + "The tray app reads everything through the codeburn command line tool, which is not installed on this machine yet.": "托盘应用通过 codeburn 命令行工具读取全部数据,而这台机器上还没有安装它。", + "Requires Node.js 22 or newer. After installing, click Check again; no restart needed.": "需要 Node.js 22 或更新版本。安装后点击“重新检查”,无需重启。", + "Check again": "重新检查", + "Details": "详细信息", + "Looked for: %@": "查找位置:%@", + "CLI v%@ available, run": "命令行工具 v%@ 可用,请运行", + "Copy the update command to the clipboard": "将更新命令复制到剪贴板", + "Enjoying CodeBurn?": "喜欢 CodeBurn 吗?", + "Daily spend": "每日花费", + "counted at $0": "按 $0 计", + "Unpriced": "未计价", + "Sessions %@": "会话 %@", + "Calls %@": "调用 %@", + "Tracked spend (last %@)": "已跟踪花费(最近 %@)", + "1 day": "1 天", + "Day (%@)": "日期(%@)", + "%1$lld days (%2$@ .. %3$@)": "%1$lld 天(%2$@ 至 %3$@)", + "Combined · %@": "合并 · %@", + "Today · %@": "今天 · %@", + "Daily budget of %@ exceeded": "已超过每日预算 %@", + "Saved %@ with local models": "本地模型节省了 %@", + "Synced from cursor.com %@": "已于 %@ 从 cursor.com 同步", + "%@ · local": "%@ · 本机", + "%1$lld of %2$lld devices": "%1$lld/%2$lld 台设备", + "call": "次调用", + "calls": "次调用", + "No tools detected yet": "尚未检测到工具", + "Run one of the supported tools once, then refresh.": "运行一次受支持的工具,然后刷新。", + "%1$@ today across %2$@": "今日 %1$@,来自 %2$@", + "%1$@ tool": "%1$@ 个工具", + "%1$@ tools": "%1$@ 个工具", + "%1$@ not detected on this machine": "这台机器上未检测到 %1$@", + "CodeBurn watches %@.": "CodeBurn 监视 %@。", + "this tool": "此工具", + "every detected tool": "每个已检测到的工具", + "%1$@ · %2$@ today": "%1$@ · 今日 %2$@", + "%@%% of today's spend · click to filter every view": "占今日花费的 %@%% · 点击以筛选所有视图", + "No spend yet today · click to filter every view": "今日尚无花费 · 点击以筛选所有视图", + "Show previous providers": "显示前面的服务商", + "Show next providers": "显示后面的服务商", + "Provider": "服务商", + "Insight": "洞察", + "%@ usage": "%@ 用量", + "Checked just now": "刚刚检查过", + "CLI update needed for live quota. Run npm install -g codeburn.": "实时配额需要更新命令行工具。请运行 npm install -g codeburn。", + "Default Claude": "默认 Claude", + "Default": "默认", + "Loading your plan...": "正在加载你的套餐...", + "Reading Claude Code credentials from this machine.": "正在读取这台机器上的 Claude Code 凭证。", + "No Claude subscription connected": "未连接 Claude 订阅", + "Click Connect to sign in with Claude in a terminal, then return here.": "点击“连接”,在终端中登录 Claude,然后回到这里。", + "Connect Claude": "连接 Claude", + "Showing the last reading.": "显示的是上次读取的结果。", + "Couldn't load Today": "无法加载今日数据", + "Tray badge: %@": "托盘角标:%@", + "Sign in to Claude Code (run `claude` and type /login), then click Retry.": "登录 Claude Code(运行 `claude` 并输入 /login),然后点击“重试”。", + "Run `codex login` and choose a ChatGPT plan, then click Retry.": "运行 `codex login` 并选择 ChatGPT 套餐,然后点击“重试”。", + "Run the Gemini CLI once to sign in, then click Retry.": "运行一次 Gemini 命令行工具以登录,然后点击“重试”。", + "Sign in with the Copilot CLI or an editor Copilot plugin, then click Retry.": "使用 Copilot 命令行工具或编辑器的 Copilot 插件登录,然后点击“重试”。", + "Start the Antigravity app, then click Retry.": "启动 Antigravity 应用,然后点击“重试”。", + "Sign in with the Kimi CLI, then click Retry.": "使用 Kimi 命令行工具登录,然后点击“重试”。", + "Sign in to the Cursor app, then click Retry.": "登录 Cursor 应用,然后点击“重试”。", + "Sign in with the Pi CLI, or set ZAI_API_KEY, then click Retry.": "使用 Pi 命令行工具登录,或设置 ZAI_API_KEY,然后点击“重试”。", + "Sign in with the Grok CLI, then click Retry.": "使用 Grok 命令行工具登录,然后点击“重试”。", + "Set CLINEPASS_API_KEY, then click Retry.": "设置 CLINEPASS_API_KEY,然后点击“重试”。", + "Run the Devin CLI once to sign in, then click Retry.": "运行一次 Devin 命令行工具以登录,然后点击“重试”。", + "Sign in with the provider app or CLI, then click Retry.": "使用该服务商的应用或命令行工具登录,然后点击“重试”。", + "Refreshing...": "正在刷新...", + "Connecting...": "正在连接...", + "Live quota is available to the popover and the Capacity Dock.": "弹出窗口和容量 Dock 可以使用实时配额。", + "The last refresh failed; the next one is already scheduled.": "上次刷新失败;下一次已经排定。", + "Waiting for the first quota reading.": "正在等待第一次配额读取。", + "Plan: %@": "套餐:%@", + "CodeBurn reads whatever credential %@ already wrote on this machine. It never copies one into a store of its own.": "CodeBurn 读取 %@ 已经写在这台机器上的凭证,不会把凭证复制到自己的存储里。", + "%@ quota comes from the codeburn CLI, which reads the credential the provider's own tools left on this machine.": "%@ 的配额来自 codeburn 命令行工具,它读取该服务商自己的工具留在这台机器上的凭证。", + "Claude quota is read from the Claude Code credentials already on this machine, then checked against Anthropic. Only the plan and the rate-limit windows come back; no conversation content is read.": "Claude 配额读取这台机器上已有的 Claude Code 凭证,再向 Anthropic 核对。返回的只有套餐和限流窗口,不会读取对话内容。", + "Codex quota follows the authoritative %USERPROFILE%\\.codex\\auth.json session directly. Only ChatGPT-mode auth (Plus, Pro, Team, Business, Edu, Enterprise) reports rate-limit windows; API-key users are billed per request and have a different reporting surface. Credit-metered workspaces report their monthly credit allowance instead.": "Codex 配额直接沿用权威的 %USERPROFILE%\\.codex\\auth.json 会话。只有 ChatGPT 模式认证(Plus、Pro、Team、Business、Edu、Enterprise)会报告限流窗口;使用 API 密钥的用户按请求计费,报告方式不同。按点数计量的工作区改为显示每月点数额度。", + "Gemini quota reads %USERPROFILE%\\.gemini\\oauth_creds.json read-only and asks Google Code Assist. Tokens stay in memory. If it shows as expired, run the Gemini CLI once to refresh your login, then click Retry.": "Gemini 配额以只读方式读取 %USERPROFILE%\\.gemini\\oauth_creds.json,并向 Google Code Assist 查询。令牌只留在内存中。若显示已过期,请运行一次 Gemini 命令行工具以刷新登录,然后点击“重试”。", + "Copilot quota reads a GitHub token that is already on this machine, read-only: the editor plugin files under %LOCALAPPDATA%\\github-copilot first, then the Copilot CLI files. Usage tracking works without any of this; only the live quota bars need a token.": "Copilot 配额以只读方式读取这台机器上已有的 GitHub 令牌:先看 %LOCALAPPDATA%\\github-copilot 下的编辑器插件文件,再看 Copilot 命令行工具的文件。用量统计不依赖这些;只有实时配额条需要令牌。", + "Antigravity quota talks to the local Antigravity language server on 127.0.0.1 only. Nothing leaves the machine and no credential files are read. If it shows as disconnected, start the Antigravity app, then click Retry.": "Antigravity 配额只与本机 127.0.0.1 上的 Antigravity 语言服务器通信。数据不会离开这台机器,也不会读取凭证文件。若显示已断开,请启动 Antigravity 应用,然后点击“重试”。", + "Kimi Code quota reads %USERPROFILE%\\.kimi-code\\credentials\\kimi-code.json directly. Access tokens are short-lived and only the Kimi CLI refreshes them, so if the connection shows as expired, run the Kimi CLI once and click Retry.": "Kimi Code 配额直接读取 %USERPROFILE%\\.kimi-code\\credentials\\kimi-code.json。访问令牌有效期很短,且只有 Kimi 命令行工具会刷新它们;若连接显示已过期,请运行一次 Kimi 命令行工具,然后点击“重试”。", + "Cursor quota opens the Cursor editor state database read-only for its access token, then asks cursor.com. Nothing is written back, so an expired token can only be refreshed by signing in to Cursor again.": "Cursor 配额以只读方式打开 Cursor 编辑器的状态数据库以取得访问令牌,再向 cursor.com 查询。不会写回任何内容,因此过期的令牌只能通过重新登录 Cursor 来刷新。", + "Z.ai quota uses a supplied API key if there is one, and otherwise the Z.ai login the Pi CLI keeps in %USERPROFILE%\\.pi\\agent\\auth.json.": "Z.ai 配额在有 API 密钥时使用该密钥,否则使用 Pi 命令行工具保存在 %USERPROFILE%\\.pi\\agent\\auth.json 中的 Z.ai 登录。", + "Grok Build quota reads %USERPROFILE%\\.grok\\auth.json, preferring the current OIDC scope over an older sign-in entry.": "Grok Build 配额读取 %USERPROFILE%\\.grok\\auth.json,优先使用当前的 OIDC 范围,而不是较早的登录记录。", + "ClinePass has no local login file, so the only credential is an API key.": "ClinePass 没有本地登录文件,因此唯一的凭证是 API 密钥。", + "Devin quota reads the plan status the Devin CLI caches in %USERPROFILE%\\.cache\\devin\\cli, read-only. Nothing is sent anywhere and no API key is used, so the numbers are as fresh as the CLI's last run.": "Devin 配额以只读方式读取 Devin 命令行工具缓存在 %USERPROFILE%\\.cache\\devin\\cli 中的套餐状态。不会向外发送任何内容,也不使用 API 密钥,因此数字的新旧取决于命令行工具上次运行的时间。", + "Choose a Claude config directory (one containing a projects folder).": "选择一个 Claude 配置目录(其中应包含 projects 文件夹)。", + "Aggregate usage across several Claude config directories, for instance work and personal accounts. Empty tracks just the default %@. The CLAUDE_CONFIG_DIRS environment variable, when set, overrides this list.": "汇总多个 Claude 配置目录的用量,例如工作和私人账号。留空则只跟踪默认的 %@。若设置了环境变量 CLAUDE_CONFIG_DIRS,则以它为准。", + "No extra directories. Tracking the default %@.": "没有额外目录。正在跟踪默认的 %@。", + "Remove %@": "移除 %@", + "Add Directory...": "添加目录...", + "API key": "API 密钥", + "On Windows the key is encrypted for this account with DPAPI, so the file is worthless on another machine or under another sign-in; on Linux it sits in a file only your user can read. It is passed to the codeburn CLI as an environment variable and is never written to a command line or a log.": "在 Windows 上,密钥用 DPAPI 按此账户加密,因此文件换一台机器或换一个登录就无法使用;在 Linux 上,它放在只有你的用户能读取的文件里。它会作为环境变量传给 codeburn 命令行工具,绝不会写进命令行或日志。", + "A key is stored": "已保存密钥", + "No key stored": "未保存密钥", + "Paste a key": "粘贴密钥", + "Replace the stored key": "替换已保存的密钥", + "Usage Sync": "用量同步", + "CodeBurn downloads your own usage export with the Cursor app's login, at most once an hour.": "CodeBurn 使用 Cursor 应用的登录下载你自己的用量导出,最多每小时一次。", + "Quota refresh cadence": "配额刷新频率", + "Refresh token rejected by OpenAI.": "OpenAI 拒绝了刷新令牌。", + "Refresh token rejected by Anthropic.": "Anthropic 拒绝了刷新令牌。", + "retried edit": "次重试编辑", + "%@ quota is read with the key saved on this machine.": "使用保存在这台机器上的密钥读取 %@ 配额。", + "Paste a %@ API key to read live quota.": "粘贴 %@ 的 API 密钥以读取实时配额。", + "%@ API key": "%@ API 密钥", + "none": "无", + "Free": "免费", + "%1$lldh %2$lldm ago": "%1$lld 小时 %2$lld 分钟前", + "1 more window not shown": "还有 1 个窗口未显示", + "%lld more windows not shown": "还有 %lld 个窗口未显示", + "%@ rejected the stored credential.": "%@ 拒绝了已保存的凭证。", + "Sign in to %@ again in your terminal, then click Reconnect.": "在终端中重新登录 %@,然后点击“重新连接”。", + "Nothing to optimize in this period. No retries and no calls that a cheaper model would have handled.": "此期间没有可优化的内容。没有重试,也没有更便宜的模型就能完成的调用。", + "Save and Connect": "保存并连接", + "Sign in with Cline (run `cline auth`), or set CLINEPASS_API_KEY, then click Retry.": "使用 Cline 登录(运行 `cline auth`),或设置 CLINEPASS_API_KEY,然后点击“重试”。", + "Sign in with the Command Code CLI, then click Retry.": "使用 Command Code 命令行工具登录,然后点击“重试”。", + "ClinePass quota uses CLINEPASS_API_KEY or CLINE_API_KEY if set, and otherwise the Cline sign-in in %USERPROFILE%\\.cline\\data\\settings\\providers.json, read-only. Only Cline refreshes that sign-in, so if it shows as expired, run cline once and click Retry.": "ClinePass 配额在设置了 CLINEPASS_API_KEY 或 CLINE_API_KEY 时使用该密钥,否则只读使用 Cline 登录保存在 %USERPROFILE%\\.cline\\data\\settings\\providers.json 中的凭证。只有 Cline 会刷新这次登录,因此若显示已过期,请运行一次 cline,然后点击“重试”。", + "Command Code quota reads the API key the Command Code CLI keeps in %USERPROFILE%\\.commandcode\\auth.json, read-only, and asks Command Code for the 5-hour and weekly windows and the credits left.": "Command Code 配额只读读取命令行工具保存在 %USERPROFILE%\\.commandcode\\auth.json 中的 API 密钥,并向 Command Code 查询 5 小时窗口、每周窗口和剩余点数。", + "CLI v%@ available": "命令行工具 v%@ 可用", + "Run it from a terminal": "在终端中运行", + "Restart to Update": "重启以更新", + "Downloading...": "正在下载...", + "This copy came from the Microsoft Store, which keeps it up to date.": "此副本来自 Microsoft Store,由商店负责更新。", + "There is nothing to check here.": "这里没有需要检查的内容。", + "CLI Update Available": "命令行工具有可用更新", + "CodeBurn could not check GitHub for updates.": "CodeBurn 无法在 GitHub 上检查更新。", + "Version %@ is downloaded. Click to restart into it.": "版本 %@ 已下载。点击以重启并安装。", + "A newer version is downloaded. Click to restart into it.": "新版本已下载。点击以重启并安装。", + "Version %@ is available. Click to download it.": "版本 %@ 可用。点击以下载。", + "A newer version is available. Click to download it.": "有新版本可用。点击以下载。", + "Version %@ is on GitHub. Click to open the release page.": "版本 %@ 已发布在 GitHub。点击以打开发布页面。", + "A newer version is on GitHub. Click to open the release page.": "有新版本已发布在 GitHub。点击以打开发布页面。", + "These builds do not update themselves. Download the installer there, or run %@ in a terminal.": "这些构建不会自行更新。请在该页面下载安装程序,或在终端中运行 %@。", + "CLI %@ is available. Click to update it.": "命令行工具 %@ 可用。点击以更新。", + "A newer CLI is available. Click to update it.": "有新版本命令行工具可用。点击以更新。", + "Check GitHub for a newer release": "在 GitHub 上检查是否有新版本" + }, + "zh-Hant": { + "Open Full Report": "打開完整報告", + "Refresh": "刷新", + "More": "更多", + "Settings...": "設置...", + "Show today's cost in tray": "在托盤顯示今日花費", + "Open CodeBurn": "打開 CodeBurn", + "Capacity Dock Settings...": "容量 Dock 設置...", + "Switch to Light Theme": "切換到淺色主題", + "Switch to Dark Theme": "切換到深色主題", + "Switch to System Theme": "切換到系統主題", + "%1$@ · no usage yet": "%1$@ · 暫無用量", + "%1$@ · %2$@ · %3$@": "%1$@ · %2$@ · %3$@", + " · %1$lld/%2$lld devices": " · %1$lld/%2$lld 臺設備", + " · %1$lld of %2$lld devices reporting": " · %1$lld/%2$lld 臺設備已上報", + "CodeBurn v%@": "CodeBurn v%@", + "updated %@": "%@更新", + "What the number beside the tray flame counts.": "火焰圖標旁邊那個數字統計的內容。", + "How far back that number reaches.": "這個數字往回統計多久。", + "Combined adds every paired device the CLI can reach.": "“合併”會加上命令行工具能連上的每臺已配對設備。", + "Tints the popover, this window and the Capacity Dock.": "為彈出窗口、此窗口和容量 Dock 著色。", + "The currency is shared with the CLI through %@.": "貨幣與命令行工具共用,配置文件位於 %@。", + "Usage refresh cadence": "用量刷新頻率", + "How often the tray figure re-reads your local session data. Auto refreshes every minute while the popover is open and every two minutes when it is closed. Manual only refreshes when you open the popover or press Refresh.": "托盤數字重新讀取本機會話數據的頻率。“自動”在彈出窗口打開時每分鐘刷新一次,關閉時每兩分鐘刷新一次。“手動”只在你打開彈出窗口或按下“刷新”時更新。", + "Theme": "主題", + "Light": "淺色", + "Dark": "深色", + "Launch at login": "登錄時啟動", + "Start CodeBurn in the tray when you sign in.": "登錄後在托盤啟動 CodeBurn。", + "Show today's figure in the tray": "在托盤顯示今日數字", + "A second tray icon carrying the number, next to the logo.": "在標誌旁邊再放一個顯示數字的托盤圖標。", + "Anonymous telemetry": "匿名使用統計", + "Which parts of the app get opened, how the Capacity Dock is used, and errors. The daily report includes the names of the models, tools, skills and MCP servers you use alongside the bucketed counts. Never your prompts, your code, or your project and file names.": "會記錄打開了應用的哪些部分、容量 Dock 的使用方式,以及錯誤。每日報告包含你使用的模型、工具、技能和 MCP 服務器名稱,以及分桶後的計數。絕不包含你的提示詞、代碼,或項目與文件名。", + "This is the CodeBurn desktop app's setting and it covers both apps. Change it there, under Privacy and data.": "這是 CodeBurn 桌面應用的設置,兩個應用都遵循它。請到桌面應用的“隱私與數據”裡修改。", + "Connected providers, and anything already in the dock, appear here, so a provider can always be removed even after its connection fails.": "已連接的服務商,以及已經在 Dock 裡的項目,都會出現在這裡,因此即使連接失敗,也可以把它移除。", + "A slim quota rail docked to a screen edge.": "貼在屏幕邊緣的一條細配額條。", + "The one the rail shows before you hover it.": "懸停之前,軌道上顯示的那一個。", + "Keep expanded": "保持展開", + "Every ring stays out. Off, the rail rests on one ring and opens when you hover it.": "每個圓環都保持展開。關閉後,軌道只顯示一個圓環,懸停時再展開。", + "Keep the Capacity Dock expanded": "保持容量 Dock 展開", + "Hover bubble": "懸停氣泡", + "The details card can keep its own surface, so a Glass rail can carry a Graphite card.": "詳情卡片可以有自己的外觀,因此玻璃軌道也可以配石墨色卡片。", + "Claude profiles": "Claude 配置", + "One ring per Claude config directory, each with its own limit and sessions.": "每個 Claude 配置目錄一個圓環,各自有限額和會話。", + "Connect a provider from its page in the sidebar to make it available here.": "在側邊欄打開某個服務商的頁面並連接後,它就會出現在這裡。", + "Custom...": "自定義...", + "Millions of tokens": "百萬 Token", + "Custom daily budget": "自定義每日預算", + "Tokens (up/down)": "Token(上傳/下載)", + "Glass": "玻璃", + "Separate rings": "分開顯示", + "Match dock": "與 Dock 一致", + "Windows Terminal": "Windows 終端", + "Windows PowerShell": "Windows PowerShell", + "Command Prompt": "命令提示符", + "Where Full Report and Optimize open. If the chosen console is not installed, CodeBurn tries the others and then runs the command in the background.": "“完整報告”和“優化”在這裡打開。如果所選控制台沒有安裝,CodeBurn 會嘗試其他控制台,然後在後臺運行命令。", + "Settings sections": "設置分區", + "No provider matches that.": "沒有匹配的服務商。", + "Version": "版本", + "Version %@": "版本 %@", + "Checking...": "正在檢查...", + "Checking…": "正在檢查…", + "Or install it from a terminal": "或在終端中安裝", + "Downloads the same release, checks it and runs the installer.": "下載同一版本,校驗後運行安裝程序。", + "Update the CLI": "更新命令行工具", + "Copyright 2026 Resham Joshi (iamtoruk) - AgentSeal. MIT License.": "版權所有 2026 Resham Joshi (iamtoruk) - AgentSeal。MIT 許可證。", + "Checking GitHub for a newer release...": "正在 GitHub 上查找新版本...", + "This copy came from the Microsoft Store, which keeps it up to date. There is nothing to check here.": "此副本來自 Microsoft Store,由商店負責更新。這裡沒有需要檢查的內容。", + "Check failed. %@": "檢查失敗。%@", + "Version %@ is available.": "版本 %@ 可用。", + "CLI %@ is available (you have %@).": "命令行工具 %@ 可用(當前為 %@)。", + "You are on the latest version (%@).": "已是最新版本(%@)。", + "These builds are unsigned and do not update themselves, so CodeBurn will not install one for you. Download it from GitHub and Windows will vet it before it runs.": "這些構建沒有簽名,也不會自行更新,因此 CodeBurn 不會替你安裝。請從 GitHub 下載,Windows 會在運行前進行檢查。", + "Update the CLI first: the installed one is too old to install this app.": "請先更新命令行工具:當前安裝的版本太舊,無法安裝此應用。", + "Checked %@": "檢查於 %@", + "Download from GitHub": "從 GitHub 下載", + "Copy %@ to the clipboard": "將 %@ 複製到剪貼板", + "Help improve CodeBurn": "幫助改進 CodeBurn", + "Decline": "拒絕", + "Accept": "接受", + "What data we collect": "我們收集哪些數據", + "Share anonymous usage statistics: which parts of the app get opened, how the Capacity Dock is used, and errors. The daily report includes the names of the models, tools, skills and MCP servers you use alongside the bucketed counts. Never your prompts, your code, or your project and file names.": "分享匿名使用統計:打開了應用的哪些部分、容量 Dock 的使用方式,以及錯誤。每日報告包含你使用的模型、工具、技能和 MCP 服務器名稱,以及分桶後的計數。絕不包含你的提示詞、代碼,或項目與文件名。", + "Dismiss": "關閉", + "Copy": "複製", + "Copied": "已複製", + "Pick days": "選擇日期", + "Previous month": "上個月", + "Next month": "下個月", + "Days": "日期", + "the last 7 days": "最近 7 天", + "the last 30 days": "最近 30 天", + "this month": "本月", + "the last 6 months": "最近 6 個月", + "all time": "全部時間", + "today": "今天", + "(7 days)": "(7 天)", + "(30 days)": "(30 天)", + "(month)": "(本月)", + "(6 months)": "(6 個月)", + "(all time)": "(全部時間)", + "Loading...": "正在加載...", + "Loading %@…": "正在加載 %@…", + "Loading": "正在加載", + "No session data yet": "還沒有會話數據", + "CodeBurn reads local session logs written by your AI coding tools. None of the supported tools have recorded a session on this machine yet.": "CodeBurn 讀取你的 AI 編程工具寫在本機的會話日誌。這臺機器上還沒有任何受支持的工具記錄過會話。", + "Watched locations": "監視的位置", + "Run one of those tools for a session, then refresh.": "用其中某個工具進行一次會話,然後刷新。", + "Refresh now": "立即刷新", + "No %1$@ data for %2$@": "%2$@沒有 %1$@ 的數據", + "Sets the app language. System follows Windows.": "設置應用語言。選擇“跟隨系統”時使用 Windows 的語言。", + "Sets the language for this app and the desktop app. System follows Windows.": "設置本應用和桌面應用的語言。選擇“跟隨系統”時使用 Windows 的語言。", + "Update failed.": "更新失敗。", + "Check failed.": "檢查失敗。", + "Where Full Report and Optimize open. If the chosen console is not installed, CodeBurn falls back to the Command Prompt, which always is.": "“完整報告”和“優化”在這裡打開。如果所選控制台沒有安裝,CodeBurn 會改用始終存在的命令提示符。", + "Switching this off gives this install a new anonymous id, so nothing recorded before can be tied to anything after.": "關閉後,此次安裝會換一個新的匿名標識,此前記錄的內容無法再與之後的內容關聯。", + "Amount in %@": "金額(%@)", + "Install the CodeBurn CLI": "安裝 CodeBurn 命令行工具", + "Update the CodeBurn CLI": "更新 CodeBurn 命令行工具", + "This app needs codeburn %@ or newer; version %@ was found.": "此應用需要 codeburn %@ 或更新版本;當前找到的是 %@。", + "The tray app reads everything through the codeburn command line tool, which is not installed on this machine yet.": "托盤應用通過 codeburn 命令行工具讀取全部數據,而這臺機器上還沒有安裝它。", + "Requires Node.js 22 or newer. After installing, click Check again; no restart needed.": "需要 Node.js 22 或更新版本。安裝後點擊“重新檢查”,無需重啟。", + "Check again": "重新檢查", + "Details": "詳細信息", + "Looked for: %@": "查找位置:%@", + "CLI v%@ available, run": "命令行工具 v%@ 可用,請運行", + "Copy the update command to the clipboard": "將更新命令複製到剪貼板", + "Enjoying CodeBurn?": "喜歡 CodeBurn 嗎?", + "Daily spend": "每日花費", + "counted at $0": "按 $0 計", + "Unpriced": "未計價", + "Sessions %@": "會話 %@", + "Calls %@": "調用 %@", + "Tracked spend (last %@)": "已跟蹤花費(最近 %@)", + "1 day": "1 天", + "Day (%@)": "日期(%@)", + "%1$lld days (%2$@ .. %3$@)": "%1$lld 天(%2$@ 至 %3$@)", + "Combined · %@": "合併 · %@", + "Today · %@": "今天 · %@", + "Daily budget of %@ exceeded": "已超過每日預算 %@", + "Saved %@ with local models": "本地模型節省了 %@", + "Synced from cursor.com %@": "已於 %@ 從 cursor.com 同步", + "%@ · local": "%@ · 本機", + "%1$lld of %2$lld devices": "%1$lld/%2$lld 臺設備", + "call": "次調用", + "calls": "次調用", + "No tools detected yet": "尚未檢測到工具", + "Run one of the supported tools once, then refresh.": "運行一次受支持的工具,然後刷新。", + "%1$@ today across %2$@": "今日 %1$@,來自 %2$@", + "%1$@ tool": "%1$@ 個工具", + "%1$@ tools": "%1$@ 個工具", + "%1$@ not detected on this machine": "這臺機器上未檢測到 %1$@", + "CodeBurn watches %@.": "CodeBurn 監視 %@。", + "this tool": "此工具", + "every detected tool": "每個已檢測到的工具", + "%1$@ · %2$@ today": "%1$@ · 今日 %2$@", + "%@%% of today's spend · click to filter every view": "佔今日花費的 %@%% · 點擊以篩選所有視圖", + "No spend yet today · click to filter every view": "今日尚無花費 · 點擊以篩選所有視圖", + "Show previous providers": "顯示前面的服務商", + "Show next providers": "顯示後面的服務商", + "Provider": "服務商", + "Insight": "洞察", + "%@ usage": "%@ 用量", + "Checked just now": "剛剛檢查過", + "CLI update needed for live quota. Run npm install -g codeburn.": "實時配額需要更新命令行工具。請運行 npm install -g codeburn。", + "Default Claude": "默認 Claude", + "Default": "默認", + "Loading your plan...": "正在加載你的套餐...", + "Reading Claude Code credentials from this machine.": "正在讀取這臺機器上的 Claude Code 憑證。", + "No Claude subscription connected": "未連接 Claude 訂閱", + "Click Connect to sign in with Claude in a terminal, then return here.": "點擊“連接”,在終端中登錄 Claude,然後回到這裡。", + "Connect Claude": "連接 Claude", + "Showing the last reading.": "顯示的是上次讀取的結果。", + "Couldn't load Today": "無法加載今日數據", + "Tray badge: %@": "托盤角標:%@", + "Sign in to Claude Code (run `claude` and type /login), then click Retry.": "登錄 Claude Code(運行 `claude` 並輸入 /login),然後點擊“重試”。", + "Run `codex login` and choose a ChatGPT plan, then click Retry.": "運行 `codex login` 並選擇 ChatGPT 套餐,然後點擊“重試”。", + "Run the Gemini CLI once to sign in, then click Retry.": "運行一次 Gemini 命令行工具以登錄,然後點擊“重試”。", + "Sign in with the Copilot CLI or an editor Copilot plugin, then click Retry.": "使用 Copilot 命令行工具或編輯器的 Copilot 插件登錄,然後點擊“重試”。", + "Start the Antigravity app, then click Retry.": "啟動 Antigravity 應用,然後點擊“重試”。", + "Sign in with the Kimi CLI, then click Retry.": "使用 Kimi 命令行工具登錄,然後點擊“重試”。", + "Sign in to the Cursor app, then click Retry.": "登錄 Cursor 應用,然後點擊“重試”。", + "Sign in with the Pi CLI, or set ZAI_API_KEY, then click Retry.": "使用 Pi 命令行工具登錄,或設置 ZAI_API_KEY,然後點擊“重試”。", + "Sign in with the Grok CLI, then click Retry.": "使用 Grok 命令行工具登錄,然後點擊“重試”。", + "Set CLINEPASS_API_KEY, then click Retry.": "設置 CLINEPASS_API_KEY,然後點擊“重試”。", + "Run the Devin CLI once to sign in, then click Retry.": "運行一次 Devin 命令行工具以登錄,然後點擊“重試”。", + "Sign in with the provider app or CLI, then click Retry.": "使用該服務商的應用或命令行工具登錄,然後點擊“重試”。", + "Refreshing...": "正在刷新...", + "Connecting...": "正在連接...", + "Live quota is available to the popover and the Capacity Dock.": "彈出窗口和容量 Dock 可以使用實時配額。", + "The last refresh failed; the next one is already scheduled.": "上次刷新失敗;下一次已經排定。", + "Waiting for the first quota reading.": "正在等待第一次配額讀取。", + "Plan: %@": "套餐:%@", + "CodeBurn reads whatever credential %@ already wrote on this machine. It never copies one into a store of its own.": "CodeBurn 讀取 %@ 已經寫在這臺機器上的憑證,不會把憑證複製到自己的存儲裡。", + "%@ quota comes from the codeburn CLI, which reads the credential the provider's own tools left on this machine.": "%@ 的配額來自 codeburn 命令行工具,它讀取該服務商自己的工具留在這臺機器上的憑證。", + "Claude quota is read from the Claude Code credentials already on this machine, then checked against Anthropic. Only the plan and the rate-limit windows come back; no conversation content is read.": "Claude 配額讀取這臺機器上已有的 Claude Code 憑證,再向 Anthropic 核對。返回的只有套餐和限流窗口,不會讀取對話內容。", + "Codex quota follows the authoritative %USERPROFILE%\\.codex\\auth.json session directly. Only ChatGPT-mode auth (Plus, Pro, Team, Business, Edu, Enterprise) reports rate-limit windows; API-key users are billed per request and have a different reporting surface. Credit-metered workspaces report their monthly credit allowance instead.": "Codex 配額直接沿用權威的 %USERPROFILE%\\.codex\\auth.json 會話。只有 ChatGPT 模式認證(Plus、Pro、Team、Business、Edu、Enterprise)會報告限流窗口;使用 API 密鑰的用戶按請求計費,報告方式不同。按點數計量的工作區改為顯示每月點數額度。", + "Gemini quota reads %USERPROFILE%\\.gemini\\oauth_creds.json read-only and asks Google Code Assist. Tokens stay in memory. If it shows as expired, run the Gemini CLI once to refresh your login, then click Retry.": "Gemini 配額以只讀方式讀取 %USERPROFILE%\\.gemini\\oauth_creds.json,並向 Google Code Assist 查詢。令牌只留在內存中。若顯示已過期,請運行一次 Gemini 命令行工具以刷新登錄,然後點擊“重試”。", + "Copilot quota reads a GitHub token that is already on this machine, read-only: the editor plugin files under %LOCALAPPDATA%\\github-copilot first, then the Copilot CLI files. Usage tracking works without any of this; only the live quota bars need a token.": "Copilot 配額以只讀方式讀取這臺機器上已有的 GitHub 令牌:先看 %LOCALAPPDATA%\\github-copilot 下的編輯器插件文件,再看 Copilot 命令行工具的文件。用量統計不依賴這些;只有實時配額條需要令牌。", + "Antigravity quota talks to the local Antigravity language server on 127.0.0.1 only. Nothing leaves the machine and no credential files are read. If it shows as disconnected, start the Antigravity app, then click Retry.": "Antigravity 配額只與本機 127.0.0.1 上的 Antigravity 語言服務器通信。數據不會離開這臺機器,也不會讀取憑證文件。若顯示已斷開,請啟動 Antigravity 應用,然後點擊“重試”。", + "Kimi Code quota reads %USERPROFILE%\\.kimi-code\\credentials\\kimi-code.json directly. Access tokens are short-lived and only the Kimi CLI refreshes them, so if the connection shows as expired, run the Kimi CLI once and click Retry.": "Kimi Code 配額直接讀取 %USERPROFILE%\\.kimi-code\\credentials\\kimi-code.json。訪問令牌有效期很短,且只有 Kimi 命令行工具會刷新它們;若連接顯示已過期,請運行一次 Kimi 命令行工具,然後點擊“重試”。", + "Cursor quota opens the Cursor editor state database read-only for its access token, then asks cursor.com. Nothing is written back, so an expired token can only be refreshed by signing in to Cursor again.": "Cursor 配額以只讀方式打開 Cursor 編輯器的狀態數據庫以取得訪問令牌,再向 cursor.com 查詢。不會寫回任何內容,因此過期的令牌只能通過重新登錄 Cursor 來刷新。", + "Z.ai quota uses a supplied API key if there is one, and otherwise the Z.ai login the Pi CLI keeps in %USERPROFILE%\\.pi\\agent\\auth.json.": "Z.ai 配額在有 API 密鑰時使用該密鑰,否則使用 Pi 命令行工具保存在 %USERPROFILE%\\.pi\\agent\\auth.json 中的 Z.ai 登錄。", + "Grok Build quota reads %USERPROFILE%\\.grok\\auth.json, preferring the current OIDC scope over an older sign-in entry.": "Grok Build 配額讀取 %USERPROFILE%\\.grok\\auth.json,優先使用當前的 OIDC 範圍,而不是較早的登錄記錄。", + "ClinePass has no local login file, so the only credential is an API key.": "ClinePass 沒有本地登錄文件,因此唯一的憑證是 API 密鑰。", + "Devin quota reads the plan status the Devin CLI caches in %USERPROFILE%\\.cache\\devin\\cli, read-only. Nothing is sent anywhere and no API key is used, so the numbers are as fresh as the CLI's last run.": "Devin 配額以只讀方式讀取 Devin 命令行工具緩存在 %USERPROFILE%\\.cache\\devin\\cli 中的套餐狀態。不會向外發送任何內容,也不使用 API 密鑰,因此數字的新舊取決於命令行工具上次運行的時間。", + "Choose a Claude config directory (one containing a projects folder).": "選擇一個 Claude 配置目錄(其中應包含 projects 文件夾)。", + "Aggregate usage across several Claude config directories, for instance work and personal accounts. Empty tracks just the default %@. The CLAUDE_CONFIG_DIRS environment variable, when set, overrides this list.": "彙總多個 Claude 配置目錄的用量,例如工作和私人賬號。留空則只跟蹤默認的 %@。若設置了環境變量 CLAUDE_CONFIG_DIRS,則以它為準。", + "No extra directories. Tracking the default %@.": "沒有額外目錄。正在跟蹤默認的 %@。", + "Remove %@": "移除 %@", + "Add Directory...": "添加目錄...", + "API key": "API 密鑰", + "On Windows the key is encrypted for this account with DPAPI, so the file is worthless on another machine or under another sign-in; on Linux it sits in a file only your user can read. It is passed to the codeburn CLI as an environment variable and is never written to a command line or a log.": "在 Windows 上,密鑰用 DPAPI 按此賬戶加密,因此文件換一臺機器或換一個登錄就無法使用;在 Linux 上,它放在只有你的用戶能讀取的文件裡。它會作為環境變量傳給 codeburn 命令行工具,絕不會寫進命令行或日誌。", + "A key is stored": "已保存密鑰", + "No key stored": "未保存密鑰", + "Paste a key": "粘貼密鑰", + "Replace the stored key": "替換已保存的密鑰", + "Usage Sync": "用量同步", + "CodeBurn downloads your own usage export with the Cursor app's login, at most once an hour.": "CodeBurn 使用 Cursor 應用的登錄下載你自己的用量導出,最多每小時一次。", + "Quota refresh cadence": "配額刷新頻率", + "Refresh token rejected by OpenAI.": "OpenAI 拒絕了刷新令牌。", + "Refresh token rejected by Anthropic.": "Anthropic 拒絕了刷新令牌。", + "retried edit": "次重試編輯", + "%@ quota is read with the key saved on this machine.": "使用保存在這臺機器上的密鑰讀取 %@ 配額。", + "Paste a %@ API key to read live quota.": "粘貼 %@ 的 API 密鑰以讀取實時配額。", + "%@ API key": "%@ API 密鑰", + "none": "無", + "Free": "免費", + "%1$lldh %2$lldm ago": "%1$lld 小時 %2$lld 分鐘前", + "1 more window not shown": "還有 1 個窗口未顯示", + "%lld more windows not shown": "還有 %lld 個窗口未顯示", + "%@ rejected the stored credential.": "%@ 拒絕了已保存的憑證。", + "Sign in to %@ again in your terminal, then click Reconnect.": "在終端中重新登錄 %@,然後點擊“重新連接”。", + "Nothing to optimize in this period. No retries and no calls that a cheaper model would have handled.": "此期間沒有可優化的內容。沒有重試,也沒有更便宜的模型就能完成的調用。", + "Save and Connect": "保存並連接", + "Sign in with Cline (run `cline auth`), or set CLINEPASS_API_KEY, then click Retry.": "使用 Cline 登錄(運行 `cline auth`),或設置 CLINEPASS_API_KEY,然後點擊“重試”。", + "Sign in with the Command Code CLI, then click Retry.": "使用 Command Code 命令行工具登錄,然後點擊“重試”。", + "ClinePass quota uses CLINEPASS_API_KEY or CLINE_API_KEY if set, and otherwise the Cline sign-in in %USERPROFILE%\\.cline\\data\\settings\\providers.json, read-only. Only Cline refreshes that sign-in, so if it shows as expired, run cline once and click Retry.": "ClinePass 配額在設置了 CLINEPASS_API_KEY 或 CLINE_API_KEY 時使用該密鑰,否則只讀使用 Cline 登錄保存在 %USERPROFILE%\\.cline\\data\\settings\\providers.json 中的憑證。只有 Cline 會刷新這次登錄,因此若顯示已過期,請運行一次 cline,然後點擊“重試”。", + "Command Code quota reads the API key the Command Code CLI keeps in %USERPROFILE%\\.commandcode\\auth.json, read-only, and asks Command Code for the 5-hour and weekly windows and the credits left.": "Command Code 配額只讀讀取命令行工具保存在 %USERPROFILE%\\.commandcode\\auth.json 中的 API 密鑰,並向 Command Code 查詢 5 小時窗口、每週窗口和剩餘點數。", + "CLI v%@ available": "命令列工具 v%@ 可用", + "Run it from a terminal": "在終端機中執行", + "Restart to Update": "重新啟動以更新", + "Downloading...": "正在下載...", + "This copy came from the Microsoft Store, which keeps it up to date.": "此副本來自 Microsoft Store,由商店負責更新。", + "There is nothing to check here.": "這裡沒有需要檢查的內容。", + "CLI Update Available": "命令列工具有可用更新", + "CodeBurn could not check GitHub for updates.": "CodeBurn 無法在 GitHub 上檢查更新。", + "Version %@ is downloaded. Click to restart into it.": "版本 %@ 已下載。點擊以重新啟動並安裝。", + "A newer version is downloaded. Click to restart into it.": "新版本已下載。點擊以重新啟動並安裝。", + "Version %@ is available. Click to download it.": "版本 %@ 可用。點擊以下載。", + "A newer version is available. Click to download it.": "有新版本可用。點擊以下載。", + "Version %@ is on GitHub. Click to open the release page.": "版本 %@ 已發佈在 GitHub。點擊以開啟發佈頁面。", + "A newer version is on GitHub. Click to open the release page.": "有新版本已發佈在 GitHub。點擊以開啟發佈頁面。", + "These builds do not update themselves. Download the installer there, or run %@ in a terminal.": "這些組建不會自行更新。請在該頁面下載安裝程式,或在終端機中執行 %@。", + "CLI %@ is available. Click to update it.": "命令列工具 %@ 可用。點擊以更新。", + "A newer CLI is available. Click to update it.": "有新版本命令列工具可用。點擊以更新。", + "Check GitHub for a newer release": "在 GitHub 上檢查是否有新版本" + }, + "fr": { + "Free": "Gratuit", + "%1$lldh %2$lldm ago": "il y a %1$lld h %2$lld min", + "1 more window not shown": "1 fenêtre de plus non affichée", + "%lld more windows not shown": "%lld fenêtres de plus non affichées", + "CLI update needed for live quota. Run npm install -g codeburn.": "Le quota en direct exige une CLI plus récente. Exécutez npm install -g codeburn.", + "%@ rejected the stored credential.": "%@ a rejeté l'identifiant enregistré.", + "Sign in to %@ again in your terminal, then click Reconnect.": "Reconnectez-vous à %@ dans le terminal, puis cliquez sur Reconnecter.", + "Nothing to optimize in this period. No retries and no calls that a cheaper model would have handled.": "Rien à optimiser sur cette période. Aucun nouvel essai, et aucun appel qu'un modèle moins cher aurait suffi à traiter.", + "Save and Connect": "Enregistrer et connecter", + "Sign in with Cline (run `cline auth`), or set CLINEPASS_API_KEY, then click Retry.": "Connectez-vous avec Cline (exécutez `cline auth`), ou définissez CLINEPASS_API_KEY, puis cliquez sur Réessayer.", + "Sign in with the Command Code CLI, then click Retry.": "Connectez-vous avec l'outil en ligne de commande Command Code, puis cliquez sur Réessayer.", + "CLI v%@ available": "CLI v%@ disponible", + "Run it from a terminal": "Exécutez-le dans un terminal", + "Restart to Update": "Redémarrer pour mettre à jour", + "Downloading...": "Téléchargement...", + "This copy came from the Microsoft Store, which keeps it up to date.": "Cette copie provient du Microsoft Store, qui la maintient à jour.", + "There is nothing to check here.": "Il n'y a rien à vérifier ici.", + "Download from GitHub": "Télécharger depuis GitHub", + "Checking...": "Vérification...", + "Copy": "Copier", + "Copied": "Copié", + "Copy %@ to the clipboard": "Copier %@ dans le presse-papiers", + "Copy the update command to the clipboard": "Copier la commande de mise à jour dans le presse-papiers", + "CLI %@ is available (you have %@).": "La CLI %@ est disponible (vous avez %@).", + "none": "aucune", + "Update failed.": "La mise à jour a échoué.", + "Check failed.": "La vérification a échoué.", + "Or install it from a terminal": "Ou installez-la depuis un terminal", + "Downloads the same release, checks it and runs the installer.": "Télécharge la même version, la vérifie et lance l’installateur.", + "CLI Update Available": "Mise à jour de la CLI disponible", + "CodeBurn could not check GitHub for updates.": "CodeBurn n'a pas pu chercher de mise à jour sur GitHub.", + "Version %@ is downloaded. Click to restart into it.": "La version %@ est téléchargée. Cliquez pour redémarrer dessus.", + "A newer version is downloaded. Click to restart into it.": "Une version plus récente est téléchargée. Cliquez pour redémarrer dessus.", + "Version %@ is available. Click to download it.": "La version %@ est disponible. Cliquez pour la télécharger.", + "A newer version is available. Click to download it.": "Une version plus récente est disponible. Cliquez pour la télécharger.", + "Version %@ is on GitHub. Click to open the release page.": "La version %@ est sur GitHub. Cliquez pour ouvrir la page de la version.", + "A newer version is on GitHub. Click to open the release page.": "Une version plus récente est sur GitHub. Cliquez pour ouvrir la page de la version.", + "These builds do not update themselves. Download the installer there, or run %@ in a terminal.": "Ces builds ne se mettent pas à jour tout seuls. Téléchargez l’installateur sur cette page, ou exécutez %@ dans un terminal.", + "CLI %@ is available. Click to update it.": "La CLI %@ est disponible. Cliquez pour la mettre à jour.", + "A newer CLI is available. Click to update it.": "Une CLI plus récente est disponible. Cliquez pour la mettre à jour.", + "Check GitHub for a newer release": "Chercher une version plus récente sur GitHub" + }, + "ja": { + "Free": "無料", + "%1$lldh %2$lldm ago": "%1$lld時間%2$lld分前", + "1 more window not shown": "ほか 1 件のウィンドウは非表示", + "%lld more windows not shown": "ほか %lld 件のウィンドウは非表示", + "CLI update needed for live quota. Run npm install -g codeburn.": "ライブクォータには新しい CLI が必要です。npm install -g codeburn を実行してください。", + "%@ rejected the stored credential.": "%@ が保存された認証情報を拒否しました。", + "Sign in to %@ again in your terminal, then click Reconnect.": "ターミナルで %@ に再ログインしてから「再接続」をクリックしてください。", + "Nothing to optimize in this period. No retries and no calls that a cheaper model would have handled.": "この期間に最適化できる項目はありません。再試行もなく、より安いモデルで済んだ呼び出しもありません。", + "Save and Connect": "保存して接続", + "Sign in with Cline (run `cline auth`), or set CLINEPASS_API_KEY, then click Retry.": "Cline でログインする(`cline auth` を実行)か、CLINEPASS_API_KEY を設定してから「再試行」をクリックしてください。", + "Sign in with the Command Code CLI, then click Retry.": "Command Code コマンドラインでログインしてから「再試行」をクリックしてください。", + "CLI v%@ available": "CLI v%@ が利用できます", + "Run it from a terminal": "ターミナルで実行", + "Restart to Update": "再起動して更新", + "Downloading...": "ダウンロード中...", + "This copy came from the Microsoft Store, which keeps it up to date.": "このコピーは Microsoft Store から入手したもので、ストアが最新の状態に保ちます。", + "There is nothing to check here.": "ここで確認するものはありません。", + "Download from GitHub": "GitHub からダウンロード", + "Checking...": "確認中...", + "Copy": "コピー", + "Copied": "コピーしました", + "Copy %@ to the clipboard": "%@ をクリップボードにコピー", + "Copy the update command to the clipboard": "更新コマンドをクリップボードにコピー", + "CLI %@ is available (you have %@).": "CLI %@ が利用できます(現在は %@)。", + "none": "なし", + "Update failed.": "更新に失敗しました。", + "Check failed.": "確認に失敗しました。", + "Or install it from a terminal": "またはターミナルからインストール", + "Downloads the same release, checks it and runs the installer.": "同じリリースをダウンロードし、検証してからインストーラーを実行します。", + "CLI Update Available": "CLI の更新があります", + "CodeBurn could not check GitHub for updates.": "CodeBurn は GitHub で更新を確認できませんでした。", + "Version %@ is downloaded. Click to restart into it.": "バージョン %@ をダウンロードしました。クリックして再起動し、適用します。", + "A newer version is downloaded. Click to restart into it.": "新しいバージョンをダウンロードしました。クリックして再起動し、適用します。", + "Version %@ is available. Click to download it.": "バージョン %@ が利用できます。クリックしてダウンロードします。", + "A newer version is available. Click to download it.": "新しいバージョンが利用できます。クリックしてダウンロードします。", + "Version %@ is on GitHub. Click to open the release page.": "バージョン %@ は GitHub にあります。クリックしてリリースページを開きます。", + "A newer version is on GitHub. Click to open the release page.": "新しいバージョンが GitHub にあります。クリックしてリリースページを開きます。", + "These builds do not update themselves. Download the installer there, or run %@ in a terminal.": "これらのビルドは自動更新しません。そのページでインストーラーをダウンロードするか、ターミナルで %@ を実行してください。", + "CLI %@ is available. Click to update it.": "CLI %@ が利用できます。クリックして更新します。", + "A newer CLI is available. Click to update it.": "新しい CLI が利用できます。クリックして更新します。", + "Check GitHub for a newer release": "GitHub で新しいリリースを確認" + }, + "ko": { + "Free": "무료", + "%1$lldh %2$lldm ago": "%1$lld시간 %2$lld분 전", + "1 more window not shown": "표시되지 않은 창 1개", + "%lld more windows not shown": "표시되지 않은 창 %lld개", + "CLI update needed for live quota. Run npm install -g codeburn.": "실시간 할당량에는 더 새 CLI가 필요합니다. npm install -g codeburn 를 실행하세요.", + "%@ rejected the stored credential.": "%@ 이(가) 저장된 자격 증명을 거부했습니다.", + "Sign in to %@ again in your terminal, then click Reconnect.": "터미널에서 %@ 에 다시 로그인한 다음 다시 연결을 클릭하세요.", + "Nothing to optimize in this period. No retries and no calls that a cheaper model would have handled.": "이 기간에 최적화할 항목이 없습니다. 재시도도 없고, 더 저렴한 모델로 처리했을 호출도 없습니다.", + "Save and Connect": "저장하고 연결", + "Sign in with Cline (run `cline auth`), or set CLINEPASS_API_KEY, then click Retry.": "Cline으로 로그인하거나(`cline auth` 실행) CLINEPASS_API_KEY를 설정한 다음 다시 시도를 클릭하세요.", + "Sign in with the Command Code CLI, then click Retry.": "Command Code 명령줄로 로그인한 다음 다시 시도를 클릭하세요.", + "CLI v%@ available": "CLI v%@ 사용 가능", + "Run it from a terminal": "터미널에서 실행", + "Restart to Update": "다시 시작하여 업데이트", + "Downloading...": "다운로드 중...", + "This copy came from the Microsoft Store, which keeps it up to date.": "이 사본은 Microsoft Store에서 제공되며, 스토어가 최신 상태로 유지합니다.", + "There is nothing to check here.": "여기서 확인할 항목이 없습니다.", + "Download from GitHub": "GitHub에서 다운로드", + "Checking...": "확인 중...", + "Copy": "복사", + "Copied": "복사됨", + "Copy %@ to the clipboard": "%@을(를) 클립보드에 복사", + "Copy the update command to the clipboard": "업데이트 명령을 클립보드에 복사", + "CLI %@ is available (you have %@).": "CLI %@ 사용 가능(현재 %@).", + "none": "없음", + "Update failed.": "업데이트에 실패했습니다.", + "Check failed.": "확인에 실패했습니다.", + "Or install it from a terminal": "또는 터미널에서 설치", + "Downloads the same release, checks it and runs the installer.": "같은 릴리스를 다운로드하고 검사한 뒤 설치 프로그램을 실행합니다.", + "CLI Update Available": "CLI 업데이트 사용 가능", + "CodeBurn could not check GitHub for updates.": "CodeBurn이 GitHub에서 업데이트를 확인하지 못했습니다.", + "Version %@ is downloaded. Click to restart into it.": "버전 %@을(를) 다운로드했습니다. 클릭하여 다시 시작하고 적용하세요.", + "A newer version is downloaded. Click to restart into it.": "새 버전을 다운로드했습니다. 클릭하여 다시 시작하고 적용하세요.", + "Version %@ is available. Click to download it.": "버전 %@ 사용 가능. 클릭하여 다운로드하세요.", + "A newer version is available. Click to download it.": "새 버전 사용 가능. 클릭하여 다운로드하세요.", + "Version %@ is on GitHub. Click to open the release page.": "버전 %@이(가) GitHub에 있습니다. 클릭하여 릴리스 페이지를 여세요.", + "A newer version is on GitHub. Click to open the release page.": "새 버전이 GitHub에 있습니다. 클릭하여 릴리스 페이지를 여세요.", + "These builds do not update themselves. Download the installer there, or run %@ in a terminal.": "이 빌드는 스스로 업데이트하지 않습니다. 해당 페이지에서 설치 프로그램을 다운로드하거나 터미널에서 %@을(를) 실행하세요.", + "CLI %@ is available. Click to update it.": "CLI %@ 사용 가능. 클릭하여 업데이트하세요.", + "A newer CLI is available. Click to update it.": "새 CLI 사용 가능. 클릭하여 업데이트하세요.", + "Check GitHub for a newer release": "GitHub에서 새 릴리스 확인" + } +} diff --git a/windows/src/i18n/index.ts b/windows/src/i18n/index.ts new file mode 100644 index 000000000..f5e8b7b96 --- /dev/null +++ b/windows/src/i18n/index.ts @@ -0,0 +1,123 @@ +// Menubar copy. Keys are the English sentence, the same contract as the macOS app +// (`mac/Sources/CodeBurnMenubar/Localization.swift`). `mac-catalog.json` is generated +// from that app's Localizable.strings; `extra.json` holds strings that exist only +// in this Windows port. A missing translation renders the English key. + +import { useSyncExternalStore } from 'react' +import macCatalog from './mac-catalog.json' +import extraCatalog from './extra.json' + +export const LOCALES = ['en', 'fr', 'ja', 'ko', 'zh-Hans', 'zh-Hant'] as const +export type Locale = (typeof LOCALES)[number] +export type LanguageChoice = 'system' | Locale + +type Table = Record +type Catalog = Record + +const mac = macCatalog as Catalog +const extra = extraCatalog as Catalog + +const listeners = new Set<() => void>() +let choice: LanguageChoice = 'system' +let locale: Locale = resolveChoice('system') + +export function isLocale(value: string): value is Locale { + return (LOCALES as readonly string[]).includes(value) +} + +export function isLanguageChoice(value: string): value is LanguageChoice { + return value === 'system' || isLocale(value) +} + +/** + * "zh_TW.UTF-8", "zh-HK", "zh-CN", "fr-CA" → a shipped locale, or null. + * Traditional-Chinese regions map to zh-Hant; every other zh variant maps to zh-Hans. + */ +export function normalizeLocale(value: string | undefined | null): Locale | null { + if (!value) return null + const v = value.trim().toLowerCase().replace(/-/g, '_') + const primary = v.split(/[.:]/)[0] ?? '' + if (!primary) return null + if (primary.startsWith('zh')) { + if (primary === 'zh_tw' || primary === 'zh_hk' || primary === 'zh_mo' || primary === 'zh_hant' || v.includes('hant')) { + return 'zh-Hant' + } + return 'zh-Hans' + } + if (primary.startsWith('ja')) return 'ja' + if (primary.startsWith('ko')) return 'ko' + if (primary.startsWith('fr')) return 'fr' + if (primary.startsWith('en')) return 'en' + return null +} + +export function resolveChoice(next: LanguageChoice, systemTag?: string | null): Locale { + if (next !== 'system') return next + const tag = systemTag ?? (typeof navigator !== 'undefined' ? navigator.language : undefined) + return normalizeLocale(tag) ?? 'en' +} + +export function currentLocale(): Locale { + return locale +} + +export function currentChoice(): LanguageChoice { + return choice +} + +/** Point later t() calls at this choice. Notifies subscribers when the locale changes. */ +export function applyLanguage(next: LanguageChoice, systemTag?: string | null): void { + choice = next + const resolved = resolveChoice(next, systemTag) + if (resolved === locale) return + locale = resolved + for (const listener of listeners) listener() +} + +export function subscribeLocale(listener: () => void): () => void { + listeners.add(listener) + return () => listeners.delete(listener) +} + +export function useLocale(): Locale { + return useSyncExternalStore(subscribeLocale, currentLocale, currentLocale) +} + +/** BCP-47 tag for Intl formatters. English stays en-US so existing English output is unchanged. */ +export function localeTag(): string { + if (locale === 'en') return 'en-US' + if (locale === 'zh-Hans') return 'zh-CN' + if (locale === 'zh-Hant') return 'zh-TW' + return locale +} + +function lookup(key: string): string { + // macOS Localizable.strings wins when it has the sentence. extra.json is only + // for copy that does not exist there, so a Simplified entry cannot mask zh-Hant. + return mac[locale]?.[key] ?? extra[locale]?.[key] ?? mac.en?.[key] ?? extra.en?.[key] ?? key +} + +/** + * Fill a catalog template. `%@` and `%lld` are sequential; `%1$@` / `%2$lld` are + * positional. `%%` is a literal percent. Already-formatted numbers and names go + * in as strings so this does not regroup them. + */ +export function formatTemplate(template: string, args: Array): string { + let seq = 0 + return template.replace(/%%|%(\d+)\$@|%(\d+)\$lld|%@|%lld/g, (match, atPos: string, lldPos: string) => { + if (match === '%%') return '%' + const index = atPos || lldPos ? Number(atPos || lldPos) - 1 : seq++ + const value = args[index] + return value === undefined ? match : String(value) + }) +} + +export function t(key: string, ...args: Array): string { + const template = lookup(key) + return args.length === 0 ? template : formatTemplate(template, args) +} + +/** Translate the `label` of each option at render time, so a language change is picked up. */ +export function labels(rows: readonly T[]): T[] { + return rows.map(row => ({ ...row, label: t(row.label) })) +} diff --git a/windows/src/i18n/mac-catalog.json b/windows/src/i18n/mac-catalog.json new file mode 100644 index 000000000..4110d1771 --- /dev/null +++ b/windows/src/i18n/mac-catalog.json @@ -0,0 +1 @@ +{"en":{"US Dollar":"US Dollar","British Pound":"British Pound","Euro":"Euro","Australian Dollar":"Australian Dollar","Canadian Dollar":"Canadian Dollar","New Zealand Dollar":"New Zealand Dollar","Japanese Yen":"Japanese Yen","Chinese Yuan":"Chinese Yuan","Swiss Franc":"Swiss Franc","Indian Rupee":"Indian Rupee","Brazilian Real":"Brazilian Real","Swedish Krona":"Swedish Krona","Singapore Dollar":"Singapore Dollar","Hong Kong Dollar":"Hong Kong Dollar","South Korean Won":"South Korean Won","Mexican Peso":"Mexican Peso","South African Rand":"South African Rand","Danish Krone":"Danish Krone","Romanian Leu":"Romanian Leu","All":"All","Plan":"Plan","Trend":"Trend","Forecast":"Forecast","Calendar":"Calendar","Pulse":"Pulse","Stats":"Stats","Optimize":"Optimize","Today":"Today","7D":"7D","30D":"30D","Month":"Month","6M":"6M","Life":"Life","Week":"Week","30 Days":"30 Days","6 Months":"6 Months","Lifetime":"Lifetime","Local":"Local","Combined":"Combined","Ember":"Ember","Blue":"Blue","Purple":"Purple","Pink":"Pink","Red":"Red","Orange":"Orange","Yellow":"Yellow","Green":"Green","Graphite":"Graphite","Older session logs may be unavailable.":"Older session logs may be unavailable.","Session identities are unavailable across devices.":"Session identities are unavailable across devices.","Session count unavailable":"Session count unavailable","At least 1 session":"At least 1 session","At least %lld sessions":"At least %lld sessions","1 session":"1 session","%lld sessions":"%lld sessions","Unavailable":"Unavailable","≥%lld sess":"≥%lld sess","%lld sess":"%lld sess","Connect":"Connect","Reconnect":"Reconnect","Add API Key":"Add API Key","now":"now","%1$lldd %2$lldh":"%1$lldd %2$lldh","%1$lldh %2$lldm":"%1$lldh %2$lldm","%lldm":"%lldm","Auto (2m, less on battery)":"Auto (2m, less on battery)","Manual":"Manual","1 minute":"1 minute","5 minutes":"5 minutes","15 minutes":"15 minutes","2 minutes":"2 minutes","Liquid Glass":"Liquid Glass","Circle":"Circle","Squircle":"Squircle","Installed app or CLI":"Installed app or CLI","OAuth":"OAuth","API or cloud credentials":"API or cloud credentials","Browser session":"Browser session","Localhost service":"Localhost service","No sign-in required":"No sign-in required","Enter an API key or token below, then press Save & Connect.":"Enter an API key or token below, then press Save & Connect.","Sign in to %@ in a supported browser, then click Retry.":"Sign in to %@ in a supported browser, then click Retry.","Sign in with the %@ app or CLI, then click Retry.":"Sign in with the %@ app or CLI, then click Retry.","Sign in with Cline, or enter a ClinePass API key below, then click Retry.":"Sign in with Cline, or enter a ClinePass API key below, then click Retry.","Complete %@ OAuth, then click Retry.":"Complete %@ OAuth, then click Retry.","Start the local %@ service, then click Retry.":"Start the local %@ service, then click Retry.","Enter the required API or cloud credentials below, then press Save & Connect.":"Enter the required API or cloud credentials below, then press Save & Connect.","No sign-in is required. Click Retry to refresh quota.":"No sign-in is required. Click Retry to refresh quota.","Add an API key or token in Provider Settings.":"Add an API key or token in Provider Settings.","Add the required API or cloud credentials in Provider Settings.":"Add the required API or cloud credentials in Provider Settings.","Reconnect %@":"Reconnect %@","Claude Code credentials need to be refreshed.":"Claude Code credentials need to be refreshed.","Open Claude Code in your terminal and type `/login`, then click Reconnect.":"Open Claude Code in your terminal and type `/login`, then click Reconnect.","Codex credentials need to be refreshed.":"Codex credentials need to be refreshed.","Run `codex login` in your terminal, then click Reconnect.":"Run `codex login` in your terminal, then click Reconnect.","Kimi Code credentials need to be refreshed.":"Kimi Code credentials need to be refreshed.","Run the Kimi CLI once to refresh your login, then click Reconnect.":"Run the Kimi CLI once to refresh your login, then click Reconnect.","Gemini credentials need to be refreshed.":"Gemini credentials need to be refreshed.","Run the Gemini CLI once to refresh your login, then click Reconnect.":"Run the Gemini CLI once to refresh your login, then click Reconnect.","Copilot credentials need to be refreshed.":"Copilot credentials need to be refreshed.","Sign in with the Copilot CLI, an editor plugin, or `gh auth login`, then click Reconnect.":"Sign in with the Copilot CLI, an editor plugin, or `gh auth login`, then click Reconnect.","The local Antigravity service is unavailable.":"The local Antigravity service is unavailable.","Start the Antigravity app, then click Reconnect.":"Start the Antigravity app, then click Reconnect.","%@ credentials need to be refreshed.":"%@ credentials need to be refreshed.","Sign in to %@ again, then retry.":"Sign in to %@ again, then retry.","No Copilot credentials found":"No Copilot credentials found","Sign in via an editor's Copilot plugin first. Then click Try Again.":"Sign in via an editor's Copilot plugin first. Then click Try Again.","Copilot quota tracking disconnected":"Copilot quota tracking disconnected","Your Copilot credentials are untouched. Click Connect to resume.":"Your Copilot credentials are untouched. Click Connect to resume.","Usage tracking still works. For live quota, sign in with the Copilot CLI or gh auth login, or paste a token below, then click Connect.":"Usage tracking still works. For live quota, sign in with the Copilot CLI or gh auth login, or paste a token below, then click Connect.","Quota tracking disconnected. Credentials are untouched. Click Connect to resume.":"Quota tracking disconnected. Credentials are untouched. Click Connect to resume.","Grok Bot is not installed. Install the Grok Bot app, then click Retry.":"Grok Bot is not installed. Install the Grok Bot app, then click Retry.","Sign in to the Cursor app with the account Grok Bot uses, then click Retry.":"Sign in to the Cursor app with the account Grok Bot uses, then click Retry.","Cursor rejected the current app session. Sign in again, then click Retry.":"Cursor rejected the current app session. Sign in again, then click Retry.","Could not read the Cursor app's local session data. Quit and reopen Cursor, then click Retry.":"Could not read the Cursor app's local session data. Quit and reopen Cursor, then click Retry.","This account has no included Grok Bot allowance.":"This account has no included Grok Bot allowance.","Grok Bot usage is drawn from a pooled enterprise allowance, which has no per-account reading.":"Grok Bot usage is drawn from a pooled enterprise allowance, which has no per-account reading.","Cursor rate-limited the quota request.":"Cursor rate-limited the quota request.","Grok Bot quota is temporarily unavailable.":"Grok Bot quota is temporarily unavailable.","Cursor returned an unrecognized Grok Bot quota response.":"Cursor returned an unrecognized Grok Bot quota response.","Network error fetching Grok Bot quota.":"Network error fetching Grok Bot quota.","Update Check Failed":"Update Check Failed","CLI Update Failed":"CLI Update Failed","Menubar Update Failed":"Menubar Update Failed","CodeBurn could not check for updates.":"CodeBurn could not check for updates.","CodeBurn could not update the CLI.":"CodeBurn could not update the CLI.","CodeBurn could not update the menubar app.":"CodeBurn could not update the menubar app.","Click to retry the update check.":"Click to retry the update check.","Click to retry the update.":"Click to retry the update.","Updating...":"Updating...","Update":"Update","Update the CLI and menubar to the latest release":"Update the CLI and menubar to the latest release","Desktop Update Failed":"Desktop Update Failed","CodeBurn could not update the desktop app.":"CodeBurn could not update the desktop app.","Updating CLI...":"Updating CLI...","Updating menubar...":"Updating menubar...","Opening CodeBurn to update...":"Opening CodeBurn to update...","Update the CLI, menubar and desktop app to the latest release":"Update the CLI, menubar and desktop app to the latest release","CodeBurn %@ available":"CodeBurn %@ available","App and CLI %@ updates are ready. Click to install.":"App and CLI %@ updates are ready. Click to install.","Click to install the update.":"Click to install the update.","CodeBurn CLI %@ available":"CodeBurn CLI %@ available","Could not find the package manager for %1$@. Run “%2$@” manually, then try again.":"Could not find the package manager for %1$@. Run “%2$@” manually, then try again.","the CLI":"the CLI","This codeburn CLI comes with the CodeBurn desktop app. Update the desktop app, then try again.":"This codeburn CLI comes with the CodeBurn desktop app. Update the desktop app, then try again.","npm does not have permission to update the global codeburn install. Run “%@” in Terminal, then try again.":"npm does not have permission to update the global codeburn install. Run “%@” in Terminal, then try again.","CLI update failed (exit %lld)":"CLI update failed (exit %lld)","Your codeburn CLI (%1$@) is too old to update the menubar. Run “%2$@” first, then try again.":"Your codeburn CLI (%1$@) is too old to update the menubar. Run “%2$@” first, then try again.","Update failed (exit %lld)":"Update failed (exit %lld)","GitHub returned HTTP %lld.":"GitHub returned HTTP %lld.","No mac-v release with a menubar zip and checksum was found.":"No mac-v release with a menubar zip and checksum was found.","Terminal (macOS default)":"Terminal (macOS default)","%@ credits":"%@ credits","CodeBurn %1$@ · %2$lld of %3$lld devices reporting":"CodeBurn %1$@ · %2$lld of %3$lld devices reporting","Settings…":"Settings…","Capacity Dock Settings…":"Capacity Dock Settings…","Refresh Now":"Refresh Now","Check for Updates":"Check for Updates","About CodeBurn":"About CodeBurn","Quit CodeBurn":"Quit CodeBurn","Today · no usage yet":"Today · no usage yet","1 call":"1 call","%lld calls":"%lld calls","Today · %1$@ · %2$@":"Today · %1$@ · %2$@","CodeBurn Settings":"CodeBurn Settings","Update Available":"Update Available","%1$@ is available (you have %2$@).":"%1$@ is available (you have %2$@).","%1$@ Your codeburn CLI is too old to install it. First run:\n\n%2$@\n\nthen:\n\ncodeburn menubar --force":"%1$@ Your codeburn CLI is too old to install it. First run:\n\n%2$@\n\nthen:\n\ncodeburn menubar --force","%@ Run:\n\ncodeburn menubar --force":"%@ Run:\n\ncodeburn menubar --force","Up to Date":"Up to Date","You're on the latest version (%@).":"You're on the latest version (%@).","OK":"OK","This total may be incomplete.":"This total may be incomplete.","Claude config":"Claude config","No %1$@ data for %2$@":"No %1$@ data for %2$@","Couldn't load %@":"Couldn't load %@","Retry":"Retry","Loading %@…":"Loading %@…","Your AI Bill, Itemized":"Your AI Bill, Itemized","%1$@ over limit (%2$lld%%)":"%1$@ over limit (%2$lld%%)","resets in %@":"resets in %@","Change accent color":"Change accent color","Copy update command to clipboard":"Copy update command to clipboard","Enjoying CodeBurn?":"Enjoying CodeBurn?","Star us on GitHub":"Star us on GitHub","Hide this banner":"Hide this banner","CSV (folder)":"CSV (folder)","JSON":"JSON","Export":"Export","Full Report":"Full Report","%@ call":"%@ call","%@ calls":"%@ calls","Daily budget of %@ exceeded":"Daily budget of %@ exceeded","Combined unavailable · showing local":"Combined unavailable · showing local","Combined · %@":"Combined · %@","Saved %@ with local models":"Saved %@ with local models","%1$lld of %2$lld devices":"%1$lld of %2$lld devices","%@ · local":"%@ · local","Clear":"Clear","Done":"Done","Pick dates":"Pick dates","1 day":"1 day","%lld days":"%lld days","Show previous providers":"Show previous providers","Show next providers":"Show next providers","Loading…":"Loading…","Sign in with `codex` (ChatGPT mode) to track quota.":"Sign in with `codex` (ChatGPT mode) to track quota.","Sign in to Claude Code to track quota.":"Sign in to Claude Code to track quota.","Sign in to track quota.":"Sign in to track quota.","%@ usage":"%@ usage","stale":"stale","retrying":"retrying","Activity":"Activity","Cost":"Cost","Turns":"Turns","1-shot":"1-shot","Models":"Models","Saved":"Saved","Calls":"Calls","Tokens":"Tokens","%@ in":"%@ in","%@ out":"%@ out","%1$@ in · %2$@ out · %3$@ cache read":"%1$@ in · %2$@ out · %3$@ cache read","%@%% cache hit":"%@%% cache hit","1 model unpriced, counted at $0 · %@ tokens":"1 model unpriced, counted at $0 · %@ tokens","%1$lld models unpriced, counted at $0 · %2$@ tokens":"%1$lld models unpriced, counted at $0 · %2$@ tokens","~ estimated cost (priced from estimated tokens)":"~ estimated cost (priced from estimated tokens)","Pull requests":"Pull requests","Tooling":"Tooling","Tools":"Tools","Skills & Agents":"Skills & Agents","MCP Servers":"MCP Servers","Tips for you":"Tips for you","%lld signals":"%lld signals","Open Full Optimize":"Open Full Optimize","Cache hit at %lld%% — most prompts reuse cache":"Cache hit at %lld%% — most prompts reuse cache","%lld%% one-shot — edits landing first try":"%lld%% one-shot — edits landing first try","Spend down %lld%% vs last 7 days":"Spend down %lld%% vs last 7 days","%lld-day usage streak":"%lld-day usage streak","Spend up %lld%% vs prior 7 days":"Spend up %lld%% vs prior 7 days","Cache hit only %lld%% — paying for cold prompts":"Cache hit only %lld%% — paying for cold prompts","%lld%% one-shot — lots of iteration":"%lld%% one-shot — lots of iteration","On pace for %1$@ this month (+%2$lld%% vs last)":"On pace for %1$@ this month (+%2$lld%% vs last)","What's working":"What's working","What to improve":"What to improve","Risks":"Risks","Last %lld days":"Last %lld days","%1$@%% vs prior %2$lldd":"%1$@%% vs prior %2$lldd","Avg/day":"Avg/day","Peak":"Peak","Yesterday":"Yesterday","Total":"Total","%@ tokens":"%@ tokens","%1$@ on %2$@":"%1$@ on %2$@","Daily activity":"Daily activity","%lld active days":"%lld active days","Peak day":"Peak day","Avg active":"Avg active","Streak":"Streak","%lldd":"%lldd","Mon":"Mon","Wed":"Wed","Fri":"Fri","Sun":"Sun","Daily detail":"Daily detail","Hover a day":"Hover a day","Future day":"Future day","No tracked usage":"No tracked usage","%@: future day":"%@: future day","%@: no tracked usage":"%@: no tracked usage","%1$@: %2$@, %3$lld calls, %4$@ tokens":"%1$@: %2$@, %3$lld calls, %4$@ tokens","Month-to-date":"Month-to-date","On pace for":"On pace for","Avg/day (this wk)":"Avg/day (this wk)","Last 7d":"Last 7d","no prior month":"no prior month","%1$@%% vs last month (%2$@)":"%1$@%% vs last month (%2$@)","Cache hit":"Cache hit","Cost / session":"Cost / session","Cost/edit":"Cost/edit","Save ~%1$@ / ~%2$@ tokens · 1 finding":"Save ~%1$@ / ~%2$@ tokens · 1 finding","Save ~%1$@ / ~%2$@ tokens · %3$lld findings":"Save ~%1$@ / ~%2$@ tokens · %3$lld findings","Favorite model":"Favorite model","Active days (month)":"Active days (month)","Most active day":"Most active day","Peak day spend":"Peak day spend","Sessions":"Sessions","Current streak":"Current streak","Longest streak":"Longest streak","Tracked spend (last %lld days)":"Tracked spend (last %lld days)","Costliest session":"Costliest session","Retry tax":"Retry tax","%1$lld retries across %2$lld retried edits":"%1$lld retries across %2$lld retried edits","%@ ret/edit":"%@ ret/edit","Hides session details":"Hides session details","Shows session details":"Shows session details","Expanded":"Expanded","Collapsed":"Collapsed"," %lld call":" %lld call"," %lld calls":" %lld calls","Potential savings":"Potential savings","%lld%% of spend":"%lld%% of spend","could be optimized":"could be optimized","Routing waste":"Routing waste","vs %1$@ @ %2$@/edit":"vs %1$@ @ %2$@/edit","Connect Claude subscription":"Connect Claude subscription","CodeBurn will read your Claude Code credentials once. macOS will ask permission. After that, the live quota bar shows next to the Claude tab and updates automatically.":"CodeBurn will read your Claude Code credentials once. macOS will ask permission. After that, the live quota bar shows next to the Claude tab and updates automatically.","Reading Claude credentials...":"Reading Claude credentials...","No Claude credentials found":"No Claude credentials found","Sign in with Claude Code first: open `claude` in your terminal and type `/login`. Then click Try Again.":"Sign in with Claude Code first: open `claude` in your terminal and type `/login`. Then click Try Again.","Anthropic temporarily unreachable. Retrying.":"Anthropic temporarily unreachable. Retrying.","Reconnect Claude":"Reconnect Claude","Your Claude session has expired. Open Claude Code in your terminal and type `/login`, then click Reconnect.":"Your Claude session has expired. Open Claude Code in your terminal and type `/login`, then click Reconnect.","Resets %@":"Resets %@","5-hour window":"5-hour window","7-day total":"7-day total","7-day Opus":"7-day Opus","7-day Sonnet":"7-day Sonnet","7-day %@":"7-day %@","Try Again":"Try Again","Couldn't load plan data":"Couldn't load plan data","Connect ChatGPT subscription":"Connect ChatGPT subscription","CodeBurn will read your Codex CLI credentials once. After that, the live quota bar shows next to the Codex tab and updates automatically.":"CodeBurn will read your Codex CLI credentials once. After that, the live quota bar shows next to the Codex tab and updates automatically.","Reading Codex CLI credentials...":"Reading Codex CLI credentials...","No Codex credentials found":"No Codex credentials found","Sign in with Codex first: run `codex login` in your terminal. Then click Try Again.":"Sign in with Codex first: run `codex login` in your terminal. Then click Try Again.","ChatGPT temporarily unreachable. Retrying.":"ChatGPT temporarily unreachable. Retrying.","Reconnect Codex":"Reconnect Codex","Your ChatGPT session has expired. Run `codex login` in your terminal, then click Reconnect.":"Your ChatGPT session has expired. Run `codex login` in your terminal, then click Reconnect.","%@ window":"%@ window","Credits":"Credits","Unlimited":"Unlimited","Limit resets":"Limit resets","No Kimi Code credentials found":"No Kimi Code credentials found","Sign in with the Kimi CLI first. Then click Try Again.":"Sign in with the Kimi CLI first. Then click Try Again.","Reading Kimi Code credentials...":"Reading Kimi Code credentials...","Kimi temporarily unreachable. Retrying.":"Kimi temporarily unreachable. Retrying.","Refresh Kimi Code login":"Refresh Kimi Code login","Kimi Code tokens are short-lived. Run the Kimi CLI once to refresh your login, then click Reconnect.":"Kimi Code tokens are short-lived. Run the Kimi CLI once to refresh your login, then click Reconnect.","Parallel sessions":"Parallel sessions","Login idle. Run the Kimi CLI to refresh.":"Login idle. Run the Kimi CLI to refresh.","as of %@":"as of %@","No Gemini credentials found":"No Gemini credentials found","Sign in with the Gemini CLI first. Then click Try Again.":"Sign in with the Gemini CLI first. Then click Try Again.","Reading Gemini credentials...":"Reading Gemini credentials...","Gemini temporarily unreachable. Retrying.":"Gemini temporarily unreachable. Retrying.","Refresh Gemini login":"Refresh Gemini login","Your Gemini login has expired. Run the Gemini CLI once to refresh it, then click Reconnect.":"Your Gemini login has expired. Run the Gemini CLI once to refresh it, then click Reconnect.","Login idle. Run the Gemini CLI to refresh.":"Login idle. Run the Gemini CLI to refresh.","Reading Copilot credentials...":"Reading Copilot credentials...","GitHub temporarily unreachable. Retrying.":"GitHub temporarily unreachable. Retrying.","Refresh Copilot login":"Refresh Copilot login","Your Copilot sign-in has expired. Sign in via an editor's Copilot plugin again, then click Reconnect.":"Your Copilot sign-in has expired. Sign in via an editor's Copilot plugin again, then click Reconnect.","Login idle. Sign in via an editor's Copilot plugin to refresh.":"Login idle. Sign in via an editor's Copilot plugin to refresh.","No local Antigravity server found":"No local Antigravity server found","Start the Antigravity app, then click Try Again.":"Start the Antigravity app, then click Try Again.","Probing the local Antigravity server...":"Probing the local Antigravity server...","Local Antigravity server unreachable. Retrying.":"Local Antigravity server unreachable. Retrying.","Reconnect Antigravity":"Reconnect Antigravity","Server disconnected. Start the Antigravity app to refresh.":"Server disconnected. Start the Antigravity app to refresh.","On pace":"On pace","On pace: %@ at reset":"On pace: %@ at reset","%@%% in deficit":"%@%% in deficit","%@%% in reserve":"%@%% in reserve","%1$@ · hits 100%% %2$@":"%1$@ · hits 100%% %2$@","%1$@ · %2$@ at reset":"%1$@ · %2$@ at reset","On pace: %1$@ at reset · hits 100%% %2$@":"On pace: %1$@ at reset · hits 100%% %2$@","Based on last cycle: %@":"Based on last cycle: %@","in %lldm":"in %lldm","in %lldh":"in %lldh","in %lldd":"in %lldd","Dock to Edge":"Dock to Edge","Left":"Left","Right":"Right","Top":"Top","Bottom":"Bottom","Hide Capacity Dock":"Hide Capacity Dock","Capacity Dock":"Capacity Dock","Unknown":"Unknown","Click to keep Capacity Dock expanded":"Click to keep Capacity Dock expanded","Click to switch between this provider's usage windows":"Click to switch between this provider's usage windows","Show %@ usage":"Show %@ usage","none running":"none running","Kimi Code":"Kimi Code","Gemini":"Gemini","Copilot":"Copilot","Antigravity":"Antigravity","1 running":"1 running","%lld running":"%lld running","%@ left":"%@ left","Open in %@":"Open in %@","Bring %@ to front":"Bring %@ to front","burned":"burned","today %1$@ of %2$@":"today %1$@ of %2$@","no budget set":"no budget set","Refreshing…":"Refreshing…","Last known usage · refreshing":"Last known usage · refreshing","Last known usage · retrying":"Last known usage · retrying","Not connected":"Not connected","Reconnect required":"Reconnect required","General":"General","Providers":"Providers","%lld on":"%lld on","About":"About","Settings":"Settings","Search providers":"Search providers","Enter an amount above, or the alert stays off.":"Enter an amount above, or the alert stays off.","Flame icon turns yellow when today's tokens pass the daily budget.":"Flame icon turns yellow when today's tokens pass the daily budget.","Flame icon turns yellow when today's cost pass the daily budget.":"Flame icon turns yellow when today's cost pass the daily budget.","Display":"Display","Currency":"Currency","Metric":"Metric","Cost ($)":"Cost ($)","Tokens (↑↓)":"Tokens (↑↓)","Total Tokens":"Total Tokens","Credits (Codex)":"Credits (Codex)","Icon Only":"Icon Only","Period":"Period","Scope":"Scope","Accent":"Accent","Usage Refresh":"Usage Refresh","Update every":"Update every","How often the menubar figure re-reads your local session data. Auto refreshes every 30 seconds while you're plugged in and backs off on battery; Manual only refreshes when you open the popover or click Refresh Now.":"How often the menubar figure re-reads your local session data. Auto refreshes every 30 seconds while you're plugged in and backs off on battery; Manual only refreshes when you open the popover or click Refresh Now.","Updates":"Updates","Notify me about updates":"Notify me about updates","Posts a notification when a new CodeBurn release is available. Click it to install.":"Posts a notification when a new CodeBurn release is available. Click it to install.","Terminal":"Terminal","Open commands in":"Open commands in","%@ (not installed)":"%@ (not installed)","Where Full Report and Optimize open. If the chosen app isn't installed CodeBurn falls back to Terminal; if that's missing too the command runs in the background. Only terminals that can script a command into a live window are listed.":"Where Full Report and Optimize open. If the chosen app isn't installed CodeBurn falls back to Terminal; if that's missing too the command runs in the background. Only terminals that can script a command into a live window are listed.","Alerts":"Alerts","Daily budget":"Daily budget","Off":"Off","Custom…":"Custom…","Amount":"Amount","M tokens":"M tokens","Show Capacity Dock":"Show Capacity Dock","Resting provider":"Resting provider","Size":"Size","Capacity Dock size":"Capacity Dock size","Appearance":"Appearance","Gauge shape":"Gauge shape","Dock providers":"Dock providers","Connect a provider from its sidebar page to make it available here.":"Connect a provider from its sidebar page to make it available here.","Needs attention":"Needs attention","Connected providers and anything already shown in the dock appear here, so a provider can always be removed even if its connection later fails.":"Connected providers and anything already shown in the dock appear here, so a provider can always be removed even if its connection later fails.","Connection":"Connection","Config Directories":"Config Directories","Aggregate usage across multiple Claude config directories (e.g. work and personal accounts). Leave empty to track just the default `~/.claude`. The `CLAUDE_CONFIG_DIRS` environment variable, if set, overrides this list.":"Aggregate usage across multiple Claude config directories (e.g. work and personal accounts). Leave empty to track just the default `~/.claude`. The `CLAUDE_CONFIG_DIRS` environment variable, if set, overrides this list.","Quota Refresh":"Quota Refresh","Anthropic rate-limits this endpoint per account. 2 minutes is plenty for the 5-hour and weekly windows; pick Manual if you only want updates on demand.":"Anthropic rate-limits this endpoint per account. 2 minutes is plenty for the 5-hour and weekly windows; pick Manual if you only want updates on demand.","Connected":"Connected","Backing off":"Backing off","Connecting…":"Connecting…","Ready":"Ready","Plan: %@":"Plan: %@","Live quota tracked from Anthropic.":"Live quota tracked from Anthropic.","Anthropic rate-limited; auto-retrying.":"Anthropic rate-limited; auto-retrying.","macOS may ask permission to read your credentials.":"macOS may ask permission to read your credentials.","Background refresh in progress.":"Background refresh in progress.","Tap Load Quota to fetch live usage from Anthropic.":"Tap Load Quota to fetch live usage from Anthropic.","Click Connect to read your Claude Code credentials and start tracking quota.":"Click Connect to read your Claude Code credentials and start tracking quota.","Disconnect":"Disconnect","Disconnect Claude?":"Disconnect Claude?","Cancel":"Cancel","CodeBurn will stop tracking quota and clear its connection state plus any legacy credential cache. Your Claude Code credential is untouched. Claude Code keeps working.":"CodeBurn will stop tracking quota and clear its connection state plus any legacy credential cache. Your Claude Code credential is untouched. Claude Code keeps working.","Load Quota":"Load Quota","No extra directories. Tracking the default `~/.claude`.":"No extra directories. Tracking the default `~/.claude`.","Remove":"Remove","Add Directory…":"Add Directory…","Add":"Add","Choose one or more Claude config directories (each containing a `projects` folder).":"Choose one or more Claude config directories (each containing a `projects` folder).","Codex live-quota tracking follows the authoritative `~/.codex/auth.json` session directly and does not create a second Keychain copy. A legacy CodeBurn Keychain item, when present, is read only as a migration fallback. Only ChatGPT-mode auth (Plus / Pro / Team / Business / Edu / Enterprise) is supported. API-key users are billed per request and have a different reporting surface. Credit-metered workspaces report no rate-limit windows, so their monthly credit allowance is shown instead.":"Codex live-quota tracking follows the authoritative `~/.codex/auth.json` session directly and does not create a second Keychain copy. A legacy CodeBurn Keychain item, when present, is read only as a migration fallback. Only ChatGPT-mode auth (Plus / Pro / Team / Business / Edu / Enterprise) is supported. API-key users are billed per request and have a different reporting surface. Credit-metered workspaces report no rate-limit windows, so their monthly credit allowance is shown instead.","How it works":"How it works","Couldn't load Codex quota":"Couldn't load Codex quota","Live quota tracked from chatgpt.com.":"Live quota tracked from chatgpt.com.","Codex is in API-key mode. Run `codex login` and choose a ChatGPT plan to enable quota tracking.":"Codex is in API-key mode. Run `codex login` and choose a ChatGPT plan to enable quota tracking.","Run `codex login` in your terminal to sign in again, then click Reconnect.":"Run `codex login` in your terminal to sign in again, then click Reconnect.","ChatGPT rate-limited; auto-retrying.":"ChatGPT rate-limited; auto-retrying.","Reading ~/.codex/auth.json.":"Reading ~/.codex/auth.json.","Tap Load Quota to fetch live usage from chatgpt.com.":"Tap Load Quota to fetch live usage from chatgpt.com.","Click Connect to read your Codex CLI credentials. If Connect fails, run `codex login` in your terminal first to create ~/.codex/auth.json.":"Click Connect to read your Codex CLI credentials. If Connect fails, run `codex login` in your terminal first to create ~/.codex/auth.json.","Disconnect Codex?":"Disconnect Codex?","CodeBurn will stop tracking quota and clear its connection state plus any legacy credential cache. Your ~/.codex/auth.json is untouched. Codex CLI keeps working.":"CodeBurn will stop tracking quota and clear its connection state plus any legacy credential cache. Your ~/.codex/auth.json is untouched. Codex CLI keeps working.","Kimi Code live-quota tracking reads `~/.kimi-code/credentials/kimi-code.json` directly. Nothing is copied or stored. Access tokens are short-lived (~15 minutes) and only the Kimi CLI refreshes them, so if the connection shows as expired, run the Kimi CLI once and click Reconnect.":"Kimi Code live-quota tracking reads `~/.kimi-code/credentials/kimi-code.json` directly. Nothing is copied or stored. Access tokens are short-lived (~15 minutes) and only the Kimi CLI refreshes them, so if the connection shows as expired, run the Kimi CLI once and click Reconnect.","Login refresh required":"Login refresh required","Couldn't load Kimi quota":"Couldn't load Kimi quota","Live quota tracked from api.kimi.com.":"Live quota tracked from api.kimi.com.","Kimi rate-limited; auto-retrying.":"Kimi rate-limited; auto-retrying.","Reading ~/.kimi-code credentials.":"Reading ~/.kimi-code credentials.","Tap Load Quota to fetch live usage from api.kimi.com.":"Tap Load Quota to fetch live usage from api.kimi.com.","Sign in with the Kimi CLI first, then click Connect.":"Sign in with the Kimi CLI first, then click Connect.","Disconnect Kimi Code?":"Disconnect Kimi Code?","CodeBurn will stop tracking Kimi Code quota. Your ~/.kimi-code credentials are untouched. The Kimi CLI keeps working.":"CodeBurn will stop tracking Kimi Code quota. Your ~/.kimi-code credentials are untouched. The Kimi CLI keeps working.","Gemini live-quota tracking reads `~/.gemini/oauth_creds.json` read-only. Nothing is copied or stored, and tokens stay in memory. If the connection shows as expired, run the Gemini CLI once to refresh your login, then click Reconnect.":"Gemini live-quota tracking reads `~/.gemini/oauth_creds.json` read-only. Nothing is copied or stored, and tokens stay in memory. If the connection shows as expired, run the Gemini CLI once to refresh your login, then click Reconnect.","Couldn't load Gemini quota":"Couldn't load Gemini quota","Live quota tracked from Google Code Assist.":"Live quota tracked from Google Code Assist.","Gemini rate-limited; auto-retrying.":"Gemini rate-limited; auto-retrying.","Reading ~/.gemini credentials.":"Reading ~/.gemini credentials.","Tap Load Quota to fetch live usage from Google Code Assist.":"Tap Load Quota to fetch live usage from Google Code Assist.","Sign in with the Gemini CLI first, then click Connect.":"Sign in with the Gemini CLI first, then click Connect.","Disconnect Gemini?":"Disconnect Gemini?","CodeBurn will stop tracking Gemini quota. Your ~/.gemini credentials are untouched. The Gemini CLI keeps working.":"CodeBurn will stop tracking Gemini quota. Your ~/.gemini credentials are untouched. The Gemini CLI keeps working.","Copilot live-quota tracking reads a GitHub token that is already on this Mac, read-only. Nothing is copied or stored. CodeBurn looks at the editor plugin files in `~/.config/github-copilot`, the Copilot CLI's `~/.copilot` files, the COPILOT_GITHUB_TOKEN, GH_TOKEN and GITHUB_TOKEN variables, `gh auth token`, and finally a token you paste below. Usage tracking works without any of this; only the live quota bars need a token. Every one of those carries the GitHub host it belongs to — the plugin files are keyed by host, the variables are read with GH_HOST, the `gh` login with the host in gh's own hosts.yml, and a pasted token with the host you type beside it — and a credential for a GitHub Enterprise Cloud host is queried on that tenant's own API (api..ghe.com), never sent to api.github.com.":"Copilot live-quota tracking reads a GitHub token that is already on this Mac, read-only. Nothing is copied or stored. CodeBurn looks at the editor plugin files in `~/.config/github-copilot`, the Copilot CLI's `~/.copilot` files, the COPILOT_GITHUB_TOKEN, GH_TOKEN and GITHUB_TOKEN variables, `gh auth token`, and finally a token you paste below. Usage tracking works without any of this; only the live quota bars need a token. Every one of those carries the GitHub host it belongs to — the plugin files are keyed by host, the variables are read with GH_HOST, the `gh` login with the host in gh's own hosts.yml, and a pasted token with the host you type beside it — and a credential for a GitHub Enterprise Cloud host is queried on that tenant's own API (api..ghe.com), never sent to api.github.com.","GitHub token":"GitHub token","GitHub host":"GitHub host","Save & Connect":"Save & Connect","Clear Token":"Clear Token","Paste a token":"Paste a token","Optional, and only needed when nothing else on this Mac is signed in. A fine-grained personal access token with the \"Plan: Read-only\" permission is enough. Leave the host at github.com unless the token was minted on a GitHub Enterprise Cloud tenant, in which case enter that tenant's host (.ghe.com) so the token is never sent to api.github.com. Both are saved in CodeBurn's own Keychain item and are used only to read your Copilot quota.":"Optional, and only needed when nothing else on this Mac is signed in. A fine-grained personal access token with the \"Plan: Read-only\" permission is enough. Leave the host at github.com unless the token was minted on a GitHub Enterprise Cloud tenant, in which case enter that tenant's host (.ghe.com) so the token is never sent to api.github.com. Both are saved in CodeBurn's own Keychain item and are used only to read your Copilot quota.","Couldn't load Copilot quota":"Couldn't load Copilot quota","Live quota tracked from %@.":"Live quota tracked from %@.","Plan: %1$@. Live quota tracked from %2$@.":"Plan: %1$@. Live quota tracked from %2$@.","Sign in again with the Copilot CLI, an editor's Copilot plugin, or gh auth login, then click Reconnect.":"Sign in again with the Copilot CLI, an editor's Copilot plugin, or gh auth login, then click Reconnect.","GitHub rate-limited; auto-retrying.":"GitHub rate-limited; auto-retrying.","Looking for a GitHub token on this Mac.":"Looking for a GitHub token on this Mac.","Tap Load Quota to fetch live usage from GitHub.":"Tap Load Quota to fetch live usage from GitHub.","Tap Load Quota to fetch live usage from %@.":"Tap Load Quota to fetch live usage from %@.","CodeBurn cannot read Copilot quota for %@. Use github.com or a GitHub Enterprise Cloud host (*.ghe.com).":"CodeBurn cannot read Copilot quota for %@. Use github.com or a GitHub Enterprise Cloud host (*.ghe.com).","Disconnect Copilot?":"Disconnect Copilot?","CodeBurn will stop tracking Copilot quota. Every credential it read stays untouched, and your Copilot clients keep working.":"CodeBurn will stop tracking Copilot quota. Every credential it read stays untouched, and your Copilot clients keep working.","Antigravity live-quota tracking talks to the Antigravity app's local language server on 127.0.0.1 only. Nothing leaves the machine and no credential files are read. If it shows as disconnected, start the Antigravity app, then click Reconnect.":"Antigravity live-quota tracking talks to the Antigravity app's local language server on 127.0.0.1 only. Nothing leaves the machine and no credential files are read. If it shows as disconnected, start the Antigravity app, then click Reconnect.","Couldn't load Antigravity quota":"Couldn't load Antigravity quota","Live quota tracked from the local Antigravity server.":"Live quota tracked from the local Antigravity server.","Local probe failed; auto-retrying.":"Local probe failed; auto-retrying.","Probing the local Antigravity language server.":"Probing the local Antigravity language server.","Tap Load Quota to probe the local Antigravity server.":"Tap Load Quota to probe the local Antigravity server.","Start the Antigravity app first, then click Connect.":"Start the Antigravity app first, then click Connect.","No local Antigravity server found. Start the Antigravity app, then click Reconnect.":"No local Antigravity server found. Start the Antigravity app, then click Reconnect.","Disconnect Antigravity?":"Disconnect Antigravity?","CodeBurn will stop tracking Antigravity quota. Nothing is read from or written to disk. The Antigravity app keeps working.":"CodeBurn will stop tracking Antigravity quota. Nothing is read from or written to disk. The Antigravity app keeps working.","Not yet supported":"Not yet supported","Automatic connection uses the provider's existing app, CLI, OAuth, browser session, or environment credentials first. CodeBurn does not copy those source credentials into its Keychain.":"Automatic connection uses the provider's existing app, CLI, OAuth, browser session, or environment credentials first. CodeBurn does not copy those source credentials into its Keychain.","Authentication methods are listed for reference. A native CodeBurn quota adapter is required before this provider can connect to Capacity Dock.":"Authentication methods are listed for reference. A native CodeBurn quota adapter is required before this provider can connect to Capacity Dock.","Authentication methods":"Authentication methods","Source":"Source","API key or token":"API key or token","Clear Override":"Clear Override","Loading saved provider credential":"Loading saved provider credential","Connection override":"Connection override","Overrides are optional and are saved only when you press Save & Connect. Secret values use one CodeBurn-owned Keychain item for this provider; background reads suppress authentication UI.":"Overrides are optional and are saved only when you press Save & Connect. Secret values use one CodeBurn-owned Keychain item for this provider; background reads suppress authentication UI.","Remove saved override":"Remove saved override","Saved data":"Saved data","This credential predates a live CodeBurn quota adapter and is not treated as a connection.":"This credential predates a live CodeBurn quota adapter and is not treated as a connection.","Quota adapter not available":"Quota adapter not available","Retrying":"Retrying","Cline login expired":"Cline login expired","%@ is catalogued, but CodeBurn cannot fetch its live quota yet.":"%@ is catalogued, but CodeBurn cannot fetch its live quota yet.","Live quota is available to Capacity Dock.":"Live quota is available to Capacity Dock.","Waiting for quota data.":"Waiting for quota data.","Automatic":"Automatic","CLI":"CLI","API":"API","Version %@":"Version %@","%@ is available. Choose Check for Updates in the CodeBurn menu to install it.":"%@ is available. Choose Check for Updates in the CodeBurn menu to install it.","GitHub":"GitHub","Website":"Website","Issues":"Issues","Links":"Links","© 2026 Resham Joshi (iamtoruk) · AgentSeal. MIT License.":"© 2026 Resham Joshi (iamtoruk) · AgentSeal. MIT License.","Second row":"Second row","Second row shows":"Second row shows","Adds a smaller second line under the menubar figure. Quota remaining tracks whichever connected provider is nearest its limit. The line hides itself while the chosen metric has no data.":"Adds a smaller second line under the menubar figure. Quota remaining tracks whichever connected provider is nearest its limit. The line hides itself while the chosen metric has no data.","Quota remaining":"Quota remaining","Today's cost":"Today's cost","Today's tokens":"Today's tokens","Active sessions":"Active sessions","%@ today":"%@ today","%@ tok today":"%@ tok today","%lld%% left":"%lld%% left","Monthly":"Monthly","Monthly usage limit":"Monthly usage limit","Monthly usage limit · limit reached":"Monthly usage limit · limit reached","Monthly usage limit · %1$@ / %2$@ credits":"Monthly usage limit · %1$@ / %2$@ credits","%@ · limit reached":"%@ · limit reached","Last known usage":"Last known usage","Notifications":"Notifications","Notify me when Codex banks a limit reset":"Notify me when Codex banks a limit reset","OpenAI sometimes grants Codex accounts a credit that resets a rate-limit window early. CodeBurn reads these from the quota response it already fetches and tells you once per grant. It never spends one.":"OpenAI sometimes grants Codex accounts a credit that resets a rate-limit window early. CodeBurn reads these from the quota response it already fetches and tells you once per grant. It never spends one.","Notify me when a quota resets early":"Notify me when a quota resets early","Posts a notification when a provider resets a usage limit before its scheduled time, so you know the capacity is back.":"Posts a notification when a provider resets a usage limit before its scheduled time, so you know the capacity is back.","cache read":"cache read","Cache read: %@ tokens":"Cache read: %@ tokens","Quota window %@":"Quota window %@","Language":"Language","System":"System","Follows System Settings > Language & Region unless you pick one here.":"Follows System Settings > Language & Region unless you pick one here.","5-hour":"5-hour","<1m":"<1m","%@ quota reset early":"%@ quota reset early","%@ quota cleared early":"%@ quota cleared early","You're back to %lld%%.":"You're back to %lld%%.","%1$@'s %2$@ reset %3$@ early. %4$@":"%1$@'s %2$@ reset %3$@ early. %4$@","%1$@ cleared your %2$@ %3$@ before its reset. %4$@":"%1$@ cleared your %2$@ %3$@ before its reset. %4$@","%lldh":"%lldh","%@ limit":"%@ limit","5-hour limit":"5-hour limit","weekly limit":"weekly limit","Opus weekly limit":"Opus weekly limit","Sonnet weekly limit":"Sonnet weekly limit","weekly":"weekly","Opus weekly":"Opus weekly","Sonnet weekly":"Sonnet weekly","5-hour usage":"5-hour usage","weekly usage":"weekly usage","Opus weekly usage":"Opus weekly usage","Sonnet weekly usage":"Sonnet weekly usage","%lld available":"%lld available","%lld usable now":"%lld usable now","next %1$@ lands %2$@":"next %1$@ lands %2$@","latest %1$@ granted %2$@":"latest %1$@ granted %2$@","next expires %@":"next expires %@","A %1$@ lands %2$@.":"A %1$@ lands %2$@.","A %1$@ was added to your account %2$@.":"A %1$@ was added to your account %2$@.","A %@ was added to your account.":"A %@ was added to your account.","You have %lld available to use.":"You have %lld available to use.","Codex banked a limit reset":"Codex banked a limit reset","limit reset":"limit reset","%@ reset":"%@ reset","daily":"daily","monthly":"monthly","hourly":"hourly","just now":"just now","%lldm ago":"%lldm ago","%lldh ago":"%lldh ago","%lldd ago":"%lldd ago","in under a minute":"in under a minute","Input tokens reused from this provider's prompt cache today — not fresh input (arrow.down), not cache writes, and already priced at the cache-read rate inside the burned figure.":"Input tokens reused from this provider's prompt cache today — not fresh input (arrow.down), not cache writes, and already priced at the cache-read rate inside the burned figure.","%1$@ · %2$@ at 80%%":"%1$@ · %2$@ at 80%%","%1$@ · %2$@ limit reached":"%1$@ · %2$@ limit reached","Quota crossings (%1$lld%% and %2$lld%%)":"Quota crossings (%1$lld%% and %2$lld%%)","Privacy":"Privacy","Anonymous usage statistics":"Anonymous usage statistics","Managed by the CodeBurn desktop app. Change it there under Settings → Privacy & data.":"Managed by the CodeBurn desktop app. Change it there under Settings → Privacy & data.","Optional usage statistics: the names of the models, tools and providers you use, with bucketed counts of how often each one came up, plus when the app is opened. A random install id, the app version and your country code travel with them. Never your prompts, your code, your project and file names, or exact amounts.":"Optional usage statistics: the names of the models, tools and providers you use, with bucketed counts of how often each one came up, plus when the app is opened. A random install id, the app version and your country code travel with them. Never your prompts, your code, your project and file names, or exact amounts.","Synced from cursor.com %@":"Synced from cursor.com %@","Not synced from cursor.com yet":"Not synced from cursor.com yet","Cursor login expired, open Cursor to sign in again":"Cursor login expired, open Cursor to sign in again","Couldn't reach cursor.com, will retry":"Couldn't reach cursor.com, will retry","Couldn't read the usage export from cursor.com, will retry":"Couldn't read the usage export from cursor.com, will retry","Sync Cursor usage from cursor.com":"Sync Cursor usage from cursor.com","Downloads your own usage export with the Cursor app's login, at most once an hour.":"Downloads your own usage export with the Cursor app's login, at most once an hour.","Turned off by CODEBURN_CURSOR_SYNC=0":"Turned off by CODEBURN_CURSOR_SYNC=0","Couldn't save the setting: config.json is invalid or locked":"Couldn't save the setting: config.json is invalid or locked"},"fr":{"US Dollar":"Dollar américain","British Pound":"Livre sterling","Euro":"Euro","Australian Dollar":"Dollar australien","Canadian Dollar":"Dollar canadien","New Zealand Dollar":"Dollar néo-zélandais","Japanese Yen":"Yen japonais","Chinese Yuan":"Yuan chinois","Swiss Franc":"Franc suisse","Indian Rupee":"Roupie indienne","Brazilian Real":"Real brésilien","Swedish Krona":"Couronne suédoise","Singapore Dollar":"Dollar singapourien","Hong Kong Dollar":"Dollar de Hong Kong","South Korean Won":"Won sud-coréen","Mexican Peso":"Peso mexicain","South African Rand":"Rand sud-africain","Danish Krone":"Couronne danoise","Romanian Leu":"Leu roumain","All":"Tout","Plan":"Forfait","Trend":"Tendance","Forecast":"Prévision","Calendar":"Calendrier","Pulse":"Pouls","Stats":"Stats","Optimize":"Optimiser","Today":"Aujourd'hui","7D":"7j","30D":"30j","Month":"Mois","6M":"6M","Life":"Total","Week":"Semaine","30 Days":"30 jours","6 Months":"6 mois","Lifetime":"Total","Local":"Local","Combined":"Combiné","Ember":"Braise","Blue":"Bleu","Purple":"Violet","Pink":"Rose","Red":"Rouge","Orange":"Orange","Yellow":"Jaune","Green":"Vert","Graphite":"Graphite","Older session logs may be unavailable.":"Les anciens journaux de session peuvent être indisponibles.","Session identities are unavailable across devices.":"Les identités de session ne sont pas disponibles entre appareils.","Session count unavailable":"Nombre de sessions indisponible","At least 1 session":"Au moins 1 session","At least %lld sessions":"Au moins %lld sessions","1 session":"1 session","%lld sessions":"%lld sessions","Unavailable":"Indisponible","≥%lld sess":"≥%lld sess.","%lld sess":"%lld sess.","Connect":"Connecter","Reconnect":"Reconnecter","Add API Key":"Ajouter une clé API","now":"maintenant","%1$lldd %2$lldh":"%1$lldj %2$lldh","%1$lldh %2$lldm":"%1$lldh %2$lldmin","%lldm":"%lldmin","Auto (2m, less on battery)":"Auto (2 min, moins sur batterie)","Manual":"Manuel","1 minute":"1 minute","5 minutes":"5 minutes","15 minutes":"15 minutes","2 minutes":"2 minutes","Liquid Glass":"Liquid Glass","Circle":"Cercle","Squircle":"Squircle","Installed app or CLI":"App ou CLI installée","OAuth":"OAuth","API or cloud credentials":"Identifiants API ou cloud","Browser session":"Session navigateur","Localhost service":"Service local","No sign-in required":"Aucune connexion requise","Enter an API key or token below, then press Save & Connect.":"Entrez une clé API ou un jeton ci-dessous, puis appuyez sur Enregistrer et connecter.","Sign in to %@ in a supported browser, then click Retry.":"Connectez-vous à %@ dans un navigateur pris en charge, puis cliquez sur Réessayer.","Sign in with the %@ app or CLI, then click Retry.":"Connectez-vous via l'app ou la CLI %@, puis cliquez sur Réessayer.","Sign in with Cline, or enter a ClinePass API key below, then click Retry.":"Connectez-vous avec Cline, ou entrez une clé API ClinePass ci-dessous, puis cliquez sur Réessayer.","Complete %@ OAuth, then click Retry.":"Terminez l'authentification OAuth %@, puis cliquez sur Réessayer.","Start the local %@ service, then click Retry.":"Démarrez le service local %@, puis cliquez sur Réessayer.","Enter the required API or cloud credentials below, then press Save & Connect.":"Entrez les identifiants API ou cloud requis ci-dessous, puis appuyez sur Enregistrer et connecter.","No sign-in is required. Click Retry to refresh quota.":"Aucune connexion requise. Cliquez sur Réessayer pour actualiser le quota.","Add an API key or token in Provider Settings.":"Ajoutez une clé API ou un jeton dans les réglages du fournisseur.","Add the required API or cloud credentials in Provider Settings.":"Ajoutez les identifiants API ou cloud requis dans les réglages du fournisseur.","Reconnect %@":"Reconnecter %@","Claude Code credentials need to be refreshed.":"Les identifiants Claude Code doivent être actualisés.","Open Claude Code in your terminal and type `/login`, then click Reconnect.":"Ouvrez Claude Code dans votre terminal et tapez `/login`, puis cliquez sur Reconnecter.","Codex credentials need to be refreshed.":"Les identifiants Codex doivent être actualisés.","Run `codex login` in your terminal, then click Reconnect.":"Exécutez `codex login` dans votre terminal, puis cliquez sur Reconnecter.","Kimi Code credentials need to be refreshed.":"Les identifiants Kimi Code doivent être actualisés.","Run the Kimi CLI once to refresh your login, then click Reconnect.":"Lancez la CLI Kimi une fois pour actualiser votre connexion, puis cliquez sur Reconnecter.","Gemini credentials need to be refreshed.":"Les identifiants Gemini doivent être actualisés.","Run the Gemini CLI once to refresh your login, then click Reconnect.":"Lancez la CLI Gemini une fois pour actualiser votre connexion, puis cliquez sur Reconnecter.","Copilot credentials need to be refreshed.":"Les identifiants Copilot doivent être actualisés.","Sign in with the Copilot CLI, an editor plugin, or `gh auth login`, then click Reconnect.":"Connectez-vous via la CLI Copilot, un plugin d'éditeur, ou `gh auth login`, puis cliquez sur Reconnecter.","The local Antigravity service is unavailable.":"Le service Antigravity local est indisponible.","Start the Antigravity app, then click Reconnect.":"Démarrez l'app Antigravity, puis cliquez sur Reconnecter.","%@ credentials need to be refreshed.":"Les identifiants %@ doivent être actualisés.","Sign in to %@ again, then retry.":"Reconnectez-vous à %@, puis réessayez.","No Copilot credentials found":"Aucun identifiant Copilot trouvé","Sign in via an editor's Copilot plugin first. Then click Try Again.":"Connectez-vous d'abord via le plugin Copilot d'un éditeur, puis cliquez sur Réessayer.","Copilot quota tracking disconnected":"Suivi du quota Copilot déconnecté","Your Copilot credentials are untouched. Click Connect to resume.":"Vos identifiants Copilot restent inchangés. Cliquez sur Connecter pour reprendre.","Usage tracking still works. For live quota, sign in with the Copilot CLI or gh auth login, or paste a token below, then click Connect.":"Le suivi d'usage fonctionne toujours. Pour le quota en direct, connectez-vous via la CLI Copilot ou gh auth login, ou collez un jeton ci-dessous, puis cliquez sur Connecter.","Quota tracking disconnected. Credentials are untouched. Click Connect to resume.":"Suivi du quota déconnecté. Les identifiants restent inchangés. Cliquez sur Connecter pour reprendre.","Grok Bot is not installed. Install the Grok Bot app, then click Retry.":"Grok Bot n'est pas installé. Installez l'app Grok Bot, puis cliquez sur Réessayer.","Sign in to the Cursor app with the account Grok Bot uses, then click Retry.":"Connectez-vous à l'app Cursor avec le compte utilisé par Grok Bot, puis cliquez sur Réessayer.","Cursor rejected the current app session. Sign in again, then click Retry.":"Cursor a rejeté la session en cours. Reconnectez-vous, puis cliquez sur Réessayer.","Could not read the Cursor app's local session data. Quit and reopen Cursor, then click Retry.":"Impossible de lire les données de session locale de Cursor. Quittez puis rouvrez Cursor, puis cliquez sur Réessayer.","This account has no included Grok Bot allowance.":"Ce compte n'inclut aucun forfait Grok Bot.","Grok Bot usage is drawn from a pooled enterprise allowance, which has no per-account reading.":"L'usage de Grok Bot provient d'un forfait entreprise partagé, sans relevé par compte.","Cursor rate-limited the quota request.":"Cursor a limité la requête de quota.","Grok Bot quota is temporarily unavailable.":"Le quota Grok Bot est temporairement indisponible.","Cursor returned an unrecognized Grok Bot quota response.":"Cursor a renvoyé une réponse de quota Grok Bot non reconnue.","Network error fetching Grok Bot quota.":"Erreur réseau lors de la récupération du quota Grok Bot.","Update Check Failed":"Échec de la vérification des mises à jour","CLI Update Failed":"Échec de la mise à jour de la CLI","Menubar Update Failed":"Échec de la mise à jour de l'app menu bar","CodeBurn could not check for updates.":"CodeBurn n'a pas pu vérifier les mises à jour.","CodeBurn could not update the CLI.":"CodeBurn n'a pas pu mettre à jour la CLI.","CodeBurn could not update the menubar app.":"CodeBurn n'a pas pu mettre à jour l'app menu bar.","Click to retry the update check.":"Cliquez pour relancer la vérification des mises à jour.","Click to retry the update.":"Cliquez pour relancer la mise à jour.","Updating...":"Mise à jour…","Update":"Mettre à jour","Update the CLI and menubar to the latest release":"Mettre la CLI et l'app menu bar à jour vers la dernière version","Desktop Update Failed":"Échec de la mise à jour de l’app de bureau","CodeBurn could not update the desktop app.":"CodeBurn n'a pas pu mettre à jour l’app de bureau.","Updating CLI...":"Mise à jour de la CLI…","Updating menubar...":"Mise à jour de l'app menu bar…","Opening CodeBurn to update...":"Ouverture de CodeBurn pour la mise à jour…","Update the CLI, menubar and desktop app to the latest release":"Mettre la CLI, l'app menu bar et l’app de bureau à jour vers la dernière version","CodeBurn %@ available":"CodeBurn %@ disponible","App and CLI %@ updates are ready. Click to install.":"Les mises à jour %@ de l'app et de la CLI sont prêtes. Cliquez pour installer.","Click to install the update.":"Cliquez pour installer la mise à jour.","CodeBurn CLI %@ available":"CodeBurn CLI %@ disponible","Could not find the package manager for %1$@. Run “%2$@” manually, then try again.":"Gestionnaire de paquets introuvable pour %1$@. Exécutez « %2$@ » manuellement, puis réessayez.","the CLI":"la CLI","This codeburn CLI comes with the CodeBurn desktop app. Update the desktop app, then try again.":"Cette CLI codeburn est fournie avec l’app de bureau CodeBurn. Mettez à jour l’app de bureau, puis réessayez.","npm does not have permission to update the global codeburn install. Run “%@” in Terminal, then try again.":"npm n’a pas l’autorisation de mettre à jour l’installation globale de codeburn. Exécutez « %@ » dans le Terminal, puis réessayez.","CLI update failed (exit %lld)":"Échec de la mise à jour de la CLI (code %lld)","Your codeburn CLI (%1$@) is too old to update the menubar. Run “%2$@” first, then try again.":"Votre CLI codeburn (%1$@) est trop ancienne pour mettre à jour l'app menu bar. Exécutez d'abord « %2$@ », puis réessayez.","Update failed (exit %lld)":"Échec de la mise à jour (code %lld)","GitHub returned HTTP %lld.":"GitHub a renvoyé le code HTTP %lld.","No mac-v release with a menubar zip and checksum was found.":"Aucune version mac-v avec zip menu bar et somme de contrôle n'a été trouvée.","Terminal (macOS default)":"Terminal (par défaut macOS)","%@ credits":"%@ crédits","CodeBurn %1$@ · %2$lld of %3$lld devices reporting":"CodeBurn %1$@ · %2$lld appareil(s) sur %3$lld actif(s)","Settings…":"Réglages…","Capacity Dock Settings…":"Réglages du Capacity Dock…","Refresh Now":"Actualiser maintenant","Check for Updates":"Rechercher des mises à jour","About CodeBurn":"À propos de CodeBurn","Quit CodeBurn":"Quitter CodeBurn","Today · no usage yet":"Aujourd'hui · aucun usage","1 call":"1 appel","%lld calls":"%lld appels","Today · %1$@ · %2$@":"Aujourd'hui · %1$@ · %2$@","CodeBurn Settings":"Réglages CodeBurn","Update Available":"Mise à jour disponible","%1$@ is available (you have %2$@).":"%1$@ est disponible (vous avez %2$@).","%1$@ Your codeburn CLI is too old to install it. First run:\n\n%2$@\n\nthen:\n\ncodeburn menubar --force":"%1$@ Votre CLI codeburn est trop ancienne pour l'installer. Exécutez d'abord :\n\n%2$@\n\npuis :\n\ncodeburn menubar --force","%@ Run:\n\ncodeburn menubar --force":"%@ Exécutez :\n\ncodeburn menubar --force","Up to Date":"À jour","You're on the latest version (%@).":"Vous êtes sur la dernière version (%@).","OK":"OK","This total may be incomplete.":"Ce total peut être incomplet.","Claude config":"Configuration Claude","No %1$@ data for %2$@":"Aucune donnée %1$@ pour %2$@","Couldn't load %@":"Impossible de charger %@","Retry":"Réessayer","Loading %@…":"Chargement de %@…","Your AI Bill, Itemized":"Votre facture IA, détaillée","%1$@ over limit (%2$lld%%)":"%1$@ au-delà de la limite (%2$lld%%)","resets in %@":"réinitialisation dans %@","Change accent color":"Changer la couleur d'accent","Copy update command to clipboard":"Copier la commande de mise à jour","Enjoying CodeBurn?":"Vous aimez CodeBurn ?","Star us on GitHub":"Mettez-nous une étoile sur GitHub","Hide this banner":"Masquer cette bannière","CSV (folder)":"CSV (dossier)","JSON":"JSON","Export":"Exporter","Full Report":"Rapport complet","%@ call":"%@ appel","%@ calls":"%@ appels","Daily budget of %@ exceeded":"Budget quotidien de %@ dépassé","Combined unavailable · showing local":"Combiné indisponible · affichage local","Combined · %@":"Combiné · %@","Saved %@ with local models":"%@ économisés avec des modèles locaux","%1$lld of %2$lld devices":"%1$lld appareil(s) sur %2$lld","%@ · local":"%@ · local","Clear":"Effacer","Done":"Terminé","Pick dates":"Choisir des dates","1 day":"1 jour","%lld days":"%lld jours","Show previous providers":"Fournisseurs précédents","Show next providers":"Fournisseurs suivants","Loading…":"Chargement…","Sign in with `codex` (ChatGPT mode) to track quota.":"Connectez-vous via `codex` (mode ChatGPT) pour suivre le quota.","Sign in to Claude Code to track quota.":"Connectez-vous à Claude Code pour suivre le quota.","Sign in to track quota.":"Connectez-vous pour suivre le quota.","%@ usage":"Usage %@","stale":"obsolète","retrying":"nouvel essai","Activity":"Activité","Cost":"Coût","Turns":"Tours","1-shot":"1er coup","Models":"Modèles","Saved":"Économisé","Calls":"Appels","Tokens":"Tokens","%@ in":"%@ entrée","%@ out":"%@ sortie","%1$@ in · %2$@ out · %3$@ cache read":"%1$@ entrée · %2$@ sortie · %3$@ lecture cache","%@%% cache hit":"%@%% de cache","1 model unpriced, counted at $0 · %@ tokens":"1 modèle non tarifé, compté à 0 $ · %@ tokens","%1$lld models unpriced, counted at $0 · %2$@ tokens":"%1$lld modèles non tarifés, comptés à 0 $ · %2$@ tokens","~ estimated cost (priced from estimated tokens)":"~ coût estimé (calculé à partir de jetons estimés)","Pull requests":"Pull requests","Tooling":"Outillage","Tools":"Outils","Skills & Agents":"Compétences et agents","MCP Servers":"Serveurs MCP","Tips for you":"Conseils pour vous","%lld signals":"%lld signaux","Open Full Optimize":"Ouvrir l'optimisation complète","Cache hit at %lld%% — most prompts reuse cache":"Cache touché à %lld%% — la plupart des prompts réutilisent le cache","%lld%% one-shot — edits landing first try":"%lld%% en un coup — les modifs passent du premier coup","Spend down %lld%% vs last 7 days":"Dépense en baisse de %lld%% sur 7 jours","%lld-day usage streak":"%lld jours d'usage consécutifs","Spend up %lld%% vs prior 7 days":"Dépense en hausse de %lld%% sur 7 jours","Cache hit only %lld%% — paying for cold prompts":"Cache touché à seulement %lld%% — vous payez des prompts froids","%lld%% one-shot — lots of iteration":"%lld%% en un coup — beaucoup d'itérations","On pace for %1$@ this month (+%2$lld%% vs last)":"En rythme pour %1$@ ce mois-ci (+%2$lld%% vs le précédent)","What's working":"Ce qui fonctionne","What to improve":"À améliorer","Risks":"Risques","Last %lld days":"%lld derniers jours","%1$@%% vs prior %2$lldd":"%1$@%% vs %2$lldj précédents","Avg/day":"Moy./jour","Peak":"Pic","Yesterday":"Hier","Total":"Total","%@ tokens":"%@ tokens","%1$@ on %2$@":"%1$@ le %2$@","Daily activity":"Activité quotidienne","%lld active days":"%lld jours actifs","Peak day":"Jour de pointe","Avg active":"Moy. active","Streak":"Série","%lldd":"%lldj","Mon":"Lun","Wed":"Mer","Fri":"Ven","Sun":"Dim","Daily detail":"Détail quotidien","Hover a day":"Survolez un jour","Future day":"Jour futur","No tracked usage":"Aucun usage suivi","%@: future day":"%@ : jour futur","%@: no tracked usage":"%@ : aucun usage suivi","%1$@: %2$@, %3$lld calls, %4$@ tokens":"%1$@ : %2$@, %3$lld appels, %4$@ tokens","Month-to-date":"Depuis le début du mois","On pace for":"En rythme pour","Avg/day (this wk)":"Moy./jour (cette sem.)","Last 7d":"7 derniers jours","no prior month":"pas de mois précédent","%1$@%% vs last month (%2$@)":"%1$@%% vs mois dernier (%2$@)","Cache hit":"Cache touché","Cost / session":"Coût / session","Cost/edit":"Coût/modif","Save ~%1$@ / ~%2$@ tokens · 1 finding":"Économie ~%1$@ / ~%2$@ tokens · 1 constat","Save ~%1$@ / ~%2$@ tokens · %3$lld findings":"Économie ~%1$@ / ~%2$@ tokens · %3$lld constats","Favorite model":"Modèle favori","Active days (month)":"Jours actifs (mois)","Most active day":"Jour le plus actif","Peak day spend":"Dépense du jour de pointe","Sessions":"Sessions","Current streak":"Série actuelle","Longest streak":"Plus longue série","Tracked spend (last %lld days)":"Dépense suivie (%lld derniers jours)","Costliest session":"Session la plus coûteuse","Retry tax":"Coût des réessais","%1$lld retries across %2$lld retried edits":"%1$lld réessais sur %2$lld modifs avec réessai","%@ ret/edit":"%@ réess./modif","Hides session details":"Masque les détails de session","Shows session details":"Affiche les détails de session","Expanded":"Développé","Collapsed":"Réduit"," %lld call":" %lld appel"," %lld calls":" %lld appels","Potential savings":"Économies potentielles","%lld%% of spend":"%lld%% de la dépense","could be optimized":"pourrait être optimisé","Routing waste":"Gaspillage de routage","vs %1$@ @ %2$@/edit":"vs %1$@ à %2$@/modif","Connect Claude subscription":"Connecter l'abonnement Claude","CodeBurn will read your Claude Code credentials once. macOS will ask permission. After that, the live quota bar shows next to the Claude tab and updates automatically.":"CodeBurn lira vos identifiants Claude Code une seule fois. macOS demandera une autorisation. Ensuite, la barre de quota en direct s'affiche à côté de l'onglet Claude et se met à jour automatiquement.","Reading Claude credentials...":"Lecture des identifiants Claude…","No Claude credentials found":"Aucun identifiant Claude trouvé","Sign in with Claude Code first: open `claude` in your terminal and type `/login`. Then click Try Again.":"Connectez-vous d'abord à Claude Code : ouvrez `claude` dans votre terminal et tapez `/login`. Puis cliquez sur Réessayer.","Anthropic temporarily unreachable. Retrying.":"Anthropic temporairement injoignable. Nouvel essai.","Reconnect Claude":"Reconnecter Claude","Your Claude session has expired. Open Claude Code in your terminal and type `/login`, then click Reconnect.":"Votre session Claude a expiré. Ouvrez Claude Code dans votre terminal et tapez `/login`, puis cliquez sur Reconnecter.","Resets %@":"Réinitialisation %@","5-hour window":"Fenêtre de 5 h","7-day total":"Total sur 7 j","7-day Opus":"Opus sur 7 j","7-day Sonnet":"Sonnet sur 7 j","7-day %@":"%@ sur 7 j","Try Again":"Réessayer","Couldn't load plan data":"Impossible de charger les données du forfait","Connect ChatGPT subscription":"Connecter l'abonnement ChatGPT","CodeBurn will read your Codex CLI credentials once. After that, the live quota bar shows next to the Codex tab and updates automatically.":"CodeBurn lira vos identifiants CLI Codex une seule fois. Ensuite, la barre de quota en direct s'affiche à côté de l'onglet Codex et se met à jour automatiquement.","Reading Codex CLI credentials...":"Lecture des identifiants CLI Codex…","No Codex credentials found":"Aucun identifiant Codex trouvé","Sign in with Codex first: run `codex login` in your terminal. Then click Try Again.":"Connectez-vous d'abord à Codex : exécutez `codex login` dans votre terminal. Puis cliquez sur Réessayer.","ChatGPT temporarily unreachable. Retrying.":"ChatGPT temporairement injoignable. Nouvel essai.","Reconnect Codex":"Reconnecter Codex","Your ChatGPT session has expired. Run `codex login` in your terminal, then click Reconnect.":"Votre session ChatGPT a expiré. Exécutez `codex login` dans votre terminal, puis cliquez sur Reconnecter.","%@ window":"Fenêtre %@","Credits":"Crédits","Unlimited":"Illimité","Limit resets":"Réinitialisation de la limite","No Kimi Code credentials found":"Aucun identifiant Kimi Code trouvé","Sign in with the Kimi CLI first. Then click Try Again.":"Connectez-vous d'abord via la CLI Kimi. Puis cliquez sur Réessayer.","Reading Kimi Code credentials...":"Lecture des identifiants Kimi Code…","Kimi temporarily unreachable. Retrying.":"Kimi temporairement injoignable. Nouvel essai.","Refresh Kimi Code login":"Actualiser la connexion Kimi Code","Kimi Code tokens are short-lived. Run the Kimi CLI once to refresh your login, then click Reconnect.":"Les jetons Kimi Code sont de courte durée. Lancez la CLI Kimi une fois pour actualiser votre connexion, puis cliquez sur Reconnecter.","Parallel sessions":"Sessions parallèles","Login idle. Run the Kimi CLI to refresh.":"Connexion inactive. Lancez la CLI Kimi pour l'actualiser.","as of %@":"au %@","No Gemini credentials found":"Aucun identifiant Gemini trouvé","Sign in with the Gemini CLI first. Then click Try Again.":"Connectez-vous d'abord via la CLI Gemini. Puis cliquez sur Réessayer.","Reading Gemini credentials...":"Lecture des identifiants Gemini…","Gemini temporarily unreachable. Retrying.":"Gemini temporairement injoignable. Nouvel essai.","Refresh Gemini login":"Actualiser la connexion Gemini","Your Gemini login has expired. Run the Gemini CLI once to refresh it, then click Reconnect.":"Votre connexion Gemini a expiré. Lancez la CLI Gemini une fois pour l'actualiser, puis cliquez sur Reconnecter.","Login idle. Run the Gemini CLI to refresh.":"Connexion inactive. Lancez la CLI Gemini pour l'actualiser.","Reading Copilot credentials...":"Lecture des identifiants Copilot…","GitHub temporarily unreachable. Retrying.":"GitHub temporairement injoignable. Nouvel essai.","Refresh Copilot login":"Actualiser la connexion Copilot","Your Copilot sign-in has expired. Sign in via an editor's Copilot plugin again, then click Reconnect.":"Votre connexion Copilot a expiré. Reconnectez-vous via le plugin Copilot d'un éditeur, puis cliquez sur Reconnecter.","Login idle. Sign in via an editor's Copilot plugin to refresh.":"Connexion inactive. Connectez-vous via le plugin Copilot d'un éditeur pour l'actualiser.","No local Antigravity server found":"Aucun serveur Antigravity local trouvé","Start the Antigravity app, then click Try Again.":"Démarrez l'app Antigravity, puis cliquez sur Réessayer.","Probing the local Antigravity server...":"Sondage du serveur Antigravity local…","Local Antigravity server unreachable. Retrying.":"Serveur Antigravity local injoignable. Nouvel essai.","Reconnect Antigravity":"Reconnecter Antigravity","Server disconnected. Start the Antigravity app to refresh.":"Serveur déconnecté. Démarrez l'app Antigravity pour actualiser.","On pace":"En rythme","On pace: %@ at reset":"En rythme : %@ à la réinitialisation","%@%% in deficit":"%@%% de déficit","%@%% in reserve":"%@%% en réserve","%1$@ · hits 100%% %2$@":"%1$@ · atteint 100%% %2$@","%1$@ · %2$@ at reset":"%1$@ · %2$@ à la réinitialisation","On pace: %1$@ at reset · hits 100%% %2$@":"En rythme : %1$@ à la réinitialisation · atteint 100%% %2$@","Based on last cycle: %@":"D'après le dernier cycle : %@","in %lldm":"dans %lldmin","in %lldh":"dans %lldh","in %lldd":"dans %lldj","Dock to Edge":"Ancrer au bord","Left":"Gauche","Right":"Droite","Top":"Haut","Bottom":"Bas","Hide Capacity Dock":"Masquer le Capacity Dock","Capacity Dock":"Capacity Dock","Unknown":"Inconnu","Click to keep Capacity Dock expanded":"Cliquez pour garder le Capacity Dock déployé","Click to switch between this provider's usage windows":"Cliquez pour changer de fenêtre d'usage de ce fournisseur","Show %@ usage":"Afficher l'usage %@","none running":"aucune en cours","Kimi Code":"Kimi Code","Gemini":"Gemini","Copilot":"Copilot","Antigravity":"Antigravity","1 running":"1 en cours","%lld running":"%lld en cours","%@ left":"%@ restant","Open in %@":"Ouvrir dans %@","Bring %@ to front":"Mettre %@ au premier plan","burned":"consommé","today %1$@ of %2$@":"aujourd'hui %1$@ sur %2$@","no budget set":"aucun budget défini","Refreshing…":"Actualisation…","Last known usage · refreshing":"Dernier usage connu · actualisation","Last known usage · retrying":"Dernier usage connu · nouvel essai","Not connected":"Non connecté","Reconnect required":"Reconnexion requise","General":"Général","Providers":"Fournisseurs","%lld on":"%lld actif(s)","About":"À propos","Settings":"Réglages","Search providers":"Rechercher un fournisseur","Enter an amount above, or the alert stays off.":"Saisissez un montant ci-dessus, sinon l'alerte reste désactivée.","Flame icon turns yellow when today's tokens pass the daily budget.":"L'icône flamme devient jaune quand les tokens du jour dépassent le budget quotidien.","Flame icon turns yellow when today's cost pass the daily budget.":"L'icône flamme devient jaune quand le coût du jour dépasse le budget quotidien.","Display":"Affichage","Currency":"Devise","Metric":"Métrique","Cost ($)":"Coût ($)","Tokens (↑↓)":"Tokens (↑↓)","Total Tokens":"Tokens totaux","Credits (Codex)":"Crédits (Codex)","Icon Only":"Icône seule","Period":"Période","Scope":"Portée","Accent":"Accent","Usage Refresh":"Actualisation de l'usage","Update every":"Actualiser toutes les","How often the menubar figure re-reads your local session data. Auto refreshes every 30 seconds while you're plugged in and backs off on battery; Manual only refreshes when you open the popover or click Refresh Now.":"Fréquence de relecture des données de session locales par le chiffre du menu bar. Auto actualise toutes les 30 s sur secteur et ralentit sur batterie ; Manuel n'actualise qu'à l'ouverture du popover ou via Actualiser maintenant.","Updates":"Mises à jour","Notify me about updates":"Me notifier des mises à jour","Posts a notification when a new CodeBurn release is available. Click it to install.":"Envoie une notification lorsqu'une nouvelle version de CodeBurn est disponible. Cliquez dessus pour l'installer.","Terminal":"Terminal","Open commands in":"Ouvrir les commandes dans","%@ (not installed)":"%@ (non installé)","Where Full Report and Optimize open. If the chosen app isn't installed CodeBurn falls back to Terminal; if that's missing too the command runs in the background. Only terminals that can script a command into a live window are listed.":"Là où s'ouvrent Rapport complet et Optimiser. Si l'app choisie n'est pas installée, CodeBurn utilise Terminal ; si celui-ci manque aussi, la commande s'exécute en arrière-plan. Seuls les terminaux capables d'exécuter une commande dans une fenêtre active sont listés.","Alerts":"Alertes","Daily budget":"Budget quotidien","Off":"Désactivé","Custom…":"Personnalisé…","Amount":"Montant","M tokens":"M tokens","Show Capacity Dock":"Afficher le Capacity Dock","Resting provider":"Fournisseur au repos","Size":"Taille","Capacity Dock size":"Taille du Capacity Dock","Appearance":"Apparence","Gauge shape":"Forme de la jauge","Dock providers":"Fournisseurs du dock","Connect a provider from its sidebar page to make it available here.":"Connectez un fournisseur depuis sa page latérale pour le rendre disponible ici.","Needs attention":"Nécessite attention","Connected providers and anything already shown in the dock appear here, so a provider can always be removed even if its connection later fails.":"Les fournisseurs connectés et tout ce qui est déjà affiché dans le dock apparaissent ici, afin qu'un fournisseur puisse toujours être retiré même si sa connexion échoue ensuite.","Connection":"Connexion","Config Directories":"Répertoires de configuration","Aggregate usage across multiple Claude config directories (e.g. work and personal accounts). Leave empty to track just the default `~/.claude`. The `CLAUDE_CONFIG_DIRS` environment variable, if set, overrides this list.":"Agrège l'usage de plusieurs répertoires de configuration Claude (ex. comptes pro et perso). Laissez vide pour ne suivre que le répertoire par défaut `~/.claude`. La variable d'environnement `CLAUDE_CONFIG_DIRS`, si définie, remplace cette liste.","Quota Refresh":"Actualisation du quota","Anthropic rate-limits this endpoint per account. 2 minutes is plenty for the 5-hour and weekly windows; pick Manual if you only want updates on demand.":"Anthropic limite le débit de ce point d'accès par compte. 2 minutes suffisent largement pour les fenêtres de 5 h et hebdomadaires ; choisissez Manuel pour n'actualiser qu'à la demande.","Connected":"Connecté","Backing off":"Ralenti","Connecting…":"Connexion…","Ready":"Prêt","Plan: %@":"Forfait : %@","Live quota tracked from Anthropic.":"Quota en direct suivi depuis Anthropic.","Anthropic rate-limited; auto-retrying.":"Anthropic limite le débit ; nouvel essai automatique.","macOS may ask permission to read your credentials.":"macOS peut demander une autorisation pour lire vos identifiants.","Background refresh in progress.":"Actualisation en arrière-plan en cours.","Tap Load Quota to fetch live usage from Anthropic.":"Appuyez sur Charger le quota pour récupérer l'usage en direct depuis Anthropic.","Click Connect to read your Claude Code credentials and start tracking quota.":"Cliquez sur Connecter pour lire vos identifiants Claude Code et suivre le quota.","Disconnect":"Déconnecter","Disconnect Claude?":"Déconnecter Claude ?","Cancel":"Annuler","CodeBurn will stop tracking quota and clear its connection state plus any legacy credential cache. Your Claude Code credential is untouched. Claude Code keeps working.":"CodeBurn arrêtera de suivre le quota et effacera son état de connexion ainsi que tout cache d'identifiants hérité. Votre identifiant Claude Code reste inchangé. Claude Code continue de fonctionner.","Load Quota":"Charger le quota","No extra directories. Tracking the default `~/.claude`.":"Aucun répertoire supplémentaire. Suivi du répertoire par défaut `~/.claude`.","Remove":"Retirer","Add Directory…":"Ajouter un répertoire…","Add":"Ajouter","Choose one or more Claude config directories (each containing a `projects` folder).":"Choisissez un ou plusieurs répertoires de configuration Claude (chacun contenant un dossier `projects`).","Codex live-quota tracking follows the authoritative `~/.codex/auth.json` session directly and does not create a second Keychain copy. A legacy CodeBurn Keychain item, when present, is read only as a migration fallback. Only ChatGPT-mode auth (Plus / Pro / Team / Business / Edu / Enterprise) is supported. API-key users are billed per request and have a different reporting surface. Credit-metered workspaces report no rate-limit windows, so their monthly credit allowance is shown instead.":"Le suivi du quota en direct de Codex utilise directement la session `~/.codex/auth.json` faisant autorité, sans créer de seconde copie dans le trousseau. Un ancien élément de trousseau CodeBurn, s'il existe, n'est lu qu'en secours de migration. Seule l'authentification en mode ChatGPT (Plus / Pro / Team / Business / Edu / Enterprise) est prise en charge. Les utilisateurs en clé API sont facturés à la requête et ont un rapport différent. Les espaces de travail facturés en crédits ne rapportent aucune fenêtre de limite de débit ; leur allocation mensuelle de crédits est affichée à la place.","How it works":"Fonctionnement","Couldn't load Codex quota":"Impossible de charger le quota Codex","Live quota tracked from chatgpt.com.":"Quota en direct suivi depuis chatgpt.com.","Codex is in API-key mode. Run `codex login` and choose a ChatGPT plan to enable quota tracking.":"Codex est en mode clé API. Exécutez `codex login` et choisissez un forfait ChatGPT pour activer le suivi du quota.","Run `codex login` in your terminal to sign in again, then click Reconnect.":"Exécutez `codex login` dans votre terminal pour vous reconnecter, puis cliquez sur Reconnecter.","ChatGPT rate-limited; auto-retrying.":"ChatGPT limite le débit ; nouvel essai automatique.","Reading ~/.codex/auth.json.":"Lecture de ~/.codex/auth.json.","Tap Load Quota to fetch live usage from chatgpt.com.":"Appuyez sur Charger le quota pour récupérer l'usage en direct depuis chatgpt.com.","Click Connect to read your Codex CLI credentials. If Connect fails, run `codex login` in your terminal first to create ~/.codex/auth.json.":"Cliquez sur Connecter pour lire vos identifiants CLI Codex. Si la connexion échoue, exécutez d'abord `codex login` dans votre terminal pour créer ~/.codex/auth.json.","Disconnect Codex?":"Déconnecter Codex ?","CodeBurn will stop tracking quota and clear its connection state plus any legacy credential cache. Your ~/.codex/auth.json is untouched. Codex CLI keeps working.":"CodeBurn arrêtera de suivre le quota et effacera son état de connexion ainsi que tout cache d'identifiants hérité. Votre fichier ~/.codex/auth.json reste inchangé. La CLI Codex continue de fonctionner.","Kimi Code live-quota tracking reads `~/.kimi-code/credentials/kimi-code.json` directly. Nothing is copied or stored. Access tokens are short-lived (~15 minutes) and only the Kimi CLI refreshes them, so if the connection shows as expired, run the Kimi CLI once and click Reconnect.":"Le suivi du quota en direct de Kimi Code lit directement `~/.kimi-code/credentials/kimi-code.json`. Rien n'est copié ni stocké. Les jetons d'accès sont de courte durée (~15 minutes) et seule la CLI Kimi les actualise ; si la connexion apparaît expirée, lancez la CLI Kimi une fois puis cliquez sur Reconnecter.","Login refresh required":"Actualisation de connexion requise","Couldn't load Kimi quota":"Impossible de charger le quota Kimi","Live quota tracked from api.kimi.com.":"Quota en direct suivi depuis api.kimi.com.","Kimi rate-limited; auto-retrying.":"Kimi limite le débit ; nouvel essai automatique.","Reading ~/.kimi-code credentials.":"Lecture des identifiants ~/.kimi-code.","Tap Load Quota to fetch live usage from api.kimi.com.":"Appuyez sur Charger le quota pour récupérer l'usage en direct depuis api.kimi.com.","Sign in with the Kimi CLI first, then click Connect.":"Connectez-vous d'abord via la CLI Kimi, puis cliquez sur Connecter.","Disconnect Kimi Code?":"Déconnecter Kimi Code ?","CodeBurn will stop tracking Kimi Code quota. Your ~/.kimi-code credentials are untouched. The Kimi CLI keeps working.":"CodeBurn arrêtera de suivre le quota Kimi Code. Vos identifiants ~/.kimi-code restent inchangés. La CLI Kimi continue de fonctionner.","Gemini live-quota tracking reads `~/.gemini/oauth_creds.json` read-only. Nothing is copied or stored, and tokens stay in memory. If the connection shows as expired, run the Gemini CLI once to refresh your login, then click Reconnect.":"Le suivi du quota en direct de Gemini lit `~/.gemini/oauth_creds.json` en lecture seule. Rien n'est copié ni stocké, et les jetons restent en mémoire. Si la connexion apparaît expirée, lancez la CLI Gemini une fois pour actualiser votre connexion, puis cliquez sur Reconnecter.","Couldn't load Gemini quota":"Impossible de charger le quota Gemini","Live quota tracked from Google Code Assist.":"Quota en direct suivi depuis Google Code Assist.","Gemini rate-limited; auto-retrying.":"Gemini limite le débit ; nouvel essai automatique.","Reading ~/.gemini credentials.":"Lecture des identifiants ~/.gemini.","Tap Load Quota to fetch live usage from Google Code Assist.":"Appuyez sur Charger le quota pour récupérer l'usage en direct depuis Google Code Assist.","Sign in with the Gemini CLI first, then click Connect.":"Connectez-vous d'abord via la CLI Gemini, puis cliquez sur Connecter.","Disconnect Gemini?":"Déconnecter Gemini ?","CodeBurn will stop tracking Gemini quota. Your ~/.gemini credentials are untouched. The Gemini CLI keeps working.":"CodeBurn arrêtera de suivre le quota Gemini. Vos identifiants ~/.gemini restent inchangés. La CLI Gemini continue de fonctionner.","Copilot live-quota tracking reads a GitHub token that is already on this Mac, read-only. Nothing is copied or stored. CodeBurn looks at the editor plugin files in `~/.config/github-copilot`, the Copilot CLI's `~/.copilot` files, the COPILOT_GITHUB_TOKEN, GH_TOKEN and GITHUB_TOKEN variables, `gh auth token`, and finally a token you paste below. Usage tracking works without any of this; only the live quota bars need a token. Every one of those carries the GitHub host it belongs to — the plugin files are keyed by host, the variables are read with GH_HOST, the `gh` login with the host in gh's own hosts.yml, and a pasted token with the host you type beside it — and a credential for a GitHub Enterprise Cloud host is queried on that tenant's own API (api..ghe.com), never sent to api.github.com.":"Le suivi du quota en direct de Copilot lit en lecture seule un jeton GitHub déjà présent sur ce Mac. Rien n'est copié ni stocké. CodeBurn regarde les fichiers de plugin d'éditeur dans `~/.config/github-copilot`, les fichiers `~/.copilot` de la CLI Copilot, les variables COPILOT_GITHUB_TOKEN, GH_TOKEN et GITHUB_TOKEN, `gh auth token`, et enfin un jeton que vous collez ci-dessous. Le suivi d'usage fonctionne sans tout cela ; seules les barres de quota en direct ont besoin d'un jeton. Chacune de ces sources porte l'hôte GitHub auquel elle appartient — les fichiers de plugin sont classés par hôte, les variables sont lues avec GH_HOST, la connexion `gh` avec l'hôte du hosts.yml de gh, et un jeton collé avec l'hôte que vous saisissez à côté — et un identifiant pour un hôte GitHub Enterprise Cloud est interrogé sur l'API propre à ce locataire (api..ghe.com), jamais envoyé à api.github.com.","GitHub token":"Jeton GitHub","GitHub host":"Hôte GitHub","Save & Connect":"Enregistrer et connecter","Clear Token":"Effacer le jeton","Paste a token":"Coller un jeton","Optional, and only needed when nothing else on this Mac is signed in. A fine-grained personal access token with the \"Plan: Read-only\" permission is enough. Leave the host at github.com unless the token was minted on a GitHub Enterprise Cloud tenant, in which case enter that tenant's host (.ghe.com) so the token is never sent to api.github.com. Both are saved in CodeBurn's own Keychain item and are used only to read your Copilot quota.":"Facultatif, requis uniquement si rien d'autre n'est connecté sur ce Mac. Un jeton d'accès personnel fin avec la permission \"Plan: Read-only\" suffit. Laissez l'hôte à github.com sauf si le jeton a été créé sur un locataire GitHub Enterprise Cloud ; dans ce cas, saisissez l'hôte de ce locataire (.ghe.com) pour que le jeton ne soit jamais envoyé à api.github.com. Les deux sont enregistrés dans l'élément de trousseau propre à CodeBurn et utilisés uniquement pour lire votre quota Copilot.","Couldn't load Copilot quota":"Impossible de charger le quota Copilot","Live quota tracked from %@.":"Quota en direct suivi depuis %@.","Plan: %1$@. Live quota tracked from %2$@.":"Forfait : %1$@. Quota en direct suivi depuis %2$@.","Sign in again with the Copilot CLI, an editor's Copilot plugin, or gh auth login, then click Reconnect.":"Reconnectez-vous via la CLI Copilot, le plugin Copilot d'un éditeur, ou gh auth login, puis cliquez sur Reconnecter.","GitHub rate-limited; auto-retrying.":"GitHub limite le débit ; nouvel essai automatique.","Looking for a GitHub token on this Mac.":"Recherche d'un jeton GitHub sur ce Mac.","Tap Load Quota to fetch live usage from GitHub.":"Appuyez sur Charger le quota pour récupérer l'usage en direct depuis GitHub.","Tap Load Quota to fetch live usage from %@.":"Appuyez sur Charger le quota pour récupérer l'usage en direct depuis %@.","CodeBurn cannot read Copilot quota for %@. Use github.com or a GitHub Enterprise Cloud host (*.ghe.com).":"CodeBurn ne peut pas lire le quota Copilot pour %@. Utilisez github.com ou un hôte GitHub Enterprise Cloud (*.ghe.com).","Disconnect Copilot?":"Déconnecter Copilot ?","CodeBurn will stop tracking Copilot quota. Every credential it read stays untouched, and your Copilot clients keep working.":"CodeBurn arrêtera de suivre le quota Copilot. Tous les identifiants lus restent inchangés, et vos clients Copilot continuent de fonctionner.","Antigravity live-quota tracking talks to the Antigravity app's local language server on 127.0.0.1 only. Nothing leaves the machine and no credential files are read. If it shows as disconnected, start the Antigravity app, then click Reconnect.":"Le suivi du quota en direct d'Antigravity communique uniquement avec le serveur de langage local de l'app Antigravity sur 127.0.0.1. Rien ne quitte la machine et aucun fichier d'identifiants n'est lu. Si la connexion apparaît coupée, démarrez l'app Antigravity, puis cliquez sur Reconnecter.","Couldn't load Antigravity quota":"Impossible de charger le quota Antigravity","Live quota tracked from the local Antigravity server.":"Quota en direct suivi depuis le serveur Antigravity local.","Local probe failed; auto-retrying.":"Échec du sondage local ; nouvel essai automatique.","Probing the local Antigravity language server.":"Sondage du serveur de langage Antigravity local.","Tap Load Quota to probe the local Antigravity server.":"Appuyez sur Charger le quota pour sonder le serveur Antigravity local.","Start the Antigravity app first, then click Connect.":"Démarrez d'abord l'app Antigravity, puis cliquez sur Connecter.","No local Antigravity server found. Start the Antigravity app, then click Reconnect.":"Aucun serveur Antigravity local trouvé. Démarrez l'app Antigravity, puis cliquez sur Reconnecter.","Disconnect Antigravity?":"Déconnecter Antigravity ?","CodeBurn will stop tracking Antigravity quota. Nothing is read from or written to disk. The Antigravity app keeps working.":"CodeBurn arrêtera de suivre le quota Antigravity. Rien n'est lu ni écrit sur le disque. L'app Antigravity continue de fonctionner.","Not yet supported":"Pas encore pris en charge","Automatic connection uses the provider's existing app, CLI, OAuth, browser session, or environment credentials first. CodeBurn does not copy those source credentials into its Keychain.":"La connexion automatique utilise d'abord l'app, la CLI, l'OAuth, la session navigateur ou les identifiants d'environnement existants du fournisseur. CodeBurn ne copie pas ces identifiants source dans son trousseau.","Authentication methods are listed for reference. A native CodeBurn quota adapter is required before this provider can connect to Capacity Dock.":"Les méthodes d'authentification sont listées à titre indicatif. Un adaptateur de quota CodeBurn natif est requis avant que ce fournisseur puisse se connecter au Capacity Dock.","Authentication methods":"Méthodes d'authentification","Source":"Source","API key or token":"Clé API ou jeton","Clear Override":"Effacer la substitution","Loading saved provider credential":"Chargement de l'identifiant fournisseur enregistré","Connection override":"Substitution de connexion","Overrides are optional and are saved only when you press Save & Connect. Secret values use one CodeBurn-owned Keychain item for this provider; background reads suppress authentication UI.":"Les substitutions sont facultatives et ne sont enregistrées qu'en appuyant sur Enregistrer et connecter. Les valeurs secrètes utilisent un élément de trousseau propre à CodeBurn pour ce fournisseur ; les lectures en arrière-plan n'affichent pas d'interface d'authentification.","Remove saved override":"Supprimer la substitution enregistrée","Saved data":"Données enregistrées","This credential predates a live CodeBurn quota adapter and is not treated as a connection.":"Cet identifiant précède un adaptateur de quota CodeBurn en direct et n'est pas considéré comme une connexion.","Quota adapter not available":"Adaptateur de quota indisponible","Retrying":"Nouvel essai","Cline login expired":"Connexion Cline expirée","%@ is catalogued, but CodeBurn cannot fetch its live quota yet.":"%@ est répertorié, mais CodeBurn ne peut pas encore récupérer son quota en direct.","Live quota is available to Capacity Dock.":"Le quota en direct est disponible pour le Capacity Dock.","Waiting for quota data.":"En attente des données de quota.","Automatic":"Automatique","CLI":"CLI","API":"API","Version %@":"Version %@","%@ is available. Choose Check for Updates in the CodeBurn menu to install it.":"%@ est disponible. Choisissez Rechercher des mises à jour dans le menu CodeBurn pour l'installer.","GitHub":"GitHub","Website":"Site web","Issues":"Problèmes","Links":"Liens","© 2026 Resham Joshi (iamtoruk) · AgentSeal. MIT License.":"© 2026 Resham Joshi (iamtoruk) · AgentSeal. Licence MIT.","Second row":"Seconde ligne","Second row shows":"La seconde ligne affiche","Adds a smaller second line under the menubar figure. Quota remaining tracks whichever connected provider is nearest its limit. The line hides itself while the chosen metric has no data.":"Ajoute une seconde ligne plus petite sous le chiffre du menu bar. Quota restant suit le fournisseur connecté le plus proche de sa limite. La ligne se masque quand la métrique choisie n'a pas de données.","Quota remaining":"Quota restant","Today's cost":"Coût du jour","Today's tokens":"Tokens du jour","Active sessions":"Sessions actives","%@ today":"%@ aujourd'hui","%@ tok today":"%@ tok aujourd'hui","%lld%% left":"%lld%% restant","Monthly":"Mensuel","Monthly usage limit":"Limite d'usage mensuelle","Monthly usage limit · limit reached":"Limite d'usage mensuelle · limite atteinte","Monthly usage limit · %1$@ / %2$@ credits":"Limite d'usage mensuelle · %1$@ / %2$@ crédits","%@ · limit reached":"%@ · limite atteinte","Last known usage":"Dernier usage connu","Notifications":"Notifications","Notify me when Codex banks a limit reset":"Me notifier quand Codex reçoit une réinitialisation de limite","OpenAI sometimes grants Codex accounts a credit that resets a rate-limit window early. CodeBurn reads these from the quota response it already fetches and tells you once per grant. It never spends one.":"OpenAI accorde parfois aux comptes Codex un crédit qui réinitialise une fenêtre de limite de débit en avance. CodeBurn lit ces crédits dans la réponse de quota qu'il récupère déjà et vous prévient une fois par octroi. Il n'en dépense jamais.","Notify me when a quota resets early":"Me notifier en cas de réinitialisation anticipée du quota","Posts a notification when a provider resets a usage limit before its scheduled time, so you know the capacity is back.":"Envoie une notification quand un fournisseur réinitialise une limite d'usage avant l'heure prévue, pour que vous sachiez que la capacité est revenue.","cache read":"lecture cache","Cache read: %@ tokens":"Lecture cache : %@ tokens","Quota window %@":"Fenêtre de quota %@","Language":"Langue","System":"Système","Follows System Settings > Language & Region unless you pick one here.":"Suit Réglages Système > Langue et région, sauf sélection ici.","5-hour":"5 h","<1m":"<1 min","%@ quota reset early":"Quota %@ réinitialisé en avance","%@ quota cleared early":"Quota %@ effacé en avance","You're back to %lld%%.":"Vous êtes revenu à %lld%%.","%1$@'s %2$@ reset %3$@ early. %4$@":"%2$@ de %1$@ s'est réinitialisé %3$@ en avance. %4$@","%1$@ cleared your %2$@ %3$@ before its reset. %4$@":"%1$@ a effacé votre %2$@ %3$@ avant sa réinitialisation. %4$@","%lldh":"%lldh","%@ limit":"Limite %@","5-hour limit":"Limite de 5 h","weekly limit":"limite hebdomadaire","Opus weekly limit":"Limite hebdomadaire Opus","Sonnet weekly limit":"Limite hebdomadaire Sonnet","weekly":"hebdomadaire","Opus weekly":"Opus hebdomadaire","Sonnet weekly":"Sonnet hebdomadaire","5-hour usage":"Usage sur 5 h","weekly usage":"usage hebdomadaire","Opus weekly usage":"Usage hebdomadaire Opus","Sonnet weekly usage":"Usage hebdomadaire Sonnet","%lld available":"%lld disponible(s)","%lld usable now":"%lld utilisable(s) maintenant","next %1$@ lands %2$@":"prochain %1$@ arrive %2$@","latest %1$@ granted %2$@":"dernier %1$@ accordé %2$@","next expires %@":"le prochain expire %@","A %1$@ lands %2$@.":"Un %1$@ arrive %2$@.","A %1$@ was added to your account %2$@.":"Un %1$@ a été ajouté à votre compte %2$@.","A %@ was added to your account.":"Un %@ a été ajouté à votre compte.","You have %lld available to use.":"Vous avez %lld disponible(s) à utiliser.","Codex banked a limit reset":"Codex a reçu une réinitialisation de limite","limit reset":"réinitialisation de limite","%@ reset":"réinitialisation %@","daily":"quotidienne","monthly":"mensuelle","hourly":"horaire","just now":"à l'instant","%lldm ago":"il y a %lldmin","%lldh ago":"il y a %lldh","%lldd ago":"il y a %lldj","in under a minute":"en moins d'une minute","Input tokens reused from this provider's prompt cache today — not fresh input (arrow.down), not cache writes, and already priced at the cache-read rate inside the burned figure.":"Tokens d'entrée réutilisés aujourd'hui depuis le cache de prompts de ce fournisseur — pas une entrée fraîche (arrow.down), pas une écriture de cache, et déjà tarifés au taux de lecture cache dans le chiffre consommé.","%1$@ · %2$@ at 80%%":"%1$@ · %2$@ à 80%%","%1$@ · %2$@ limit reached":"%1$@ · %2$@ limite atteinte","Quota crossings (%1$lld%% and %2$lld%%)":"Franchissements de quota (%1$lld%% et %2$lld%%)","Privacy":"Confidentialité","Anonymous usage statistics":"Statistiques d'usage anonymes","Managed by the CodeBurn desktop app. Change it there under Settings → Privacy & data.":"Géré par l'application de bureau CodeBurn. Modifiez-le dans Réglages → Confidentialité et données.","Optional usage statistics: the names of the models, tools and providers you use, with bucketed counts of how often each one came up, plus when the app is opened. A random install id, the app version and your country code travel with them. Never your prompts, your code, your project and file names, or exact amounts.":"Statistiques d'usage optionnelles : les noms des modèles, outils et fournisseurs que vous utilisez, avec des compteurs groupés indiquant leur fréquence d'apparition, ainsi que les ouvertures de l'application. Un identifiant d'installation aléatoire, la version de l'application et votre code pays les accompagnent. Jamais vos prompts, votre code, les noms de vos projets et fichiers, ni les montants exacts.","Synced from cursor.com %@":"Synchronisé depuis cursor.com %@","Not synced from cursor.com yet":"Pas encore synchronisé depuis cursor.com","Cursor login expired, open Cursor to sign in again":"La connexion à Cursor a expiré, ouvrez Cursor pour vous reconnecter","Couldn't reach cursor.com, will retry":"Impossible de joindre cursor.com, nouvel essai prévu","Couldn't read the usage export from cursor.com, will retry":"Impossible de lire l'export d'utilisation de cursor.com, nouvel essai prévu","Sync Cursor usage from cursor.com":"Synchroniser l'utilisation de Cursor depuis cursor.com","Downloads your own usage export with the Cursor app's login, at most once an hour.":"Télécharge votre propre export d'utilisation avec la connexion de l'app Cursor, au plus une fois par heure.","Turned off by CODEBURN_CURSOR_SYNC=0":"Désactivé par CODEBURN_CURSOR_SYNC=0","Couldn't save the setting: config.json is invalid or locked":"Impossible d'enregistrer le réglage : config.json est invalide ou verrouillé"},"ja":{"US Dollar":"米ドル","British Pound":"英ポンド","Euro":"ユーロ","Australian Dollar":"オーストラリアドル","Canadian Dollar":"カナダドル","New Zealand Dollar":"ニュージーランドドル","Japanese Yen":"日本円","Chinese Yuan":"中国元","Swiss Franc":"スイスフラン","Indian Rupee":"インドルピー","Brazilian Real":"ブラジルレアル","Swedish Krona":"スウェーデンクローナ","Singapore Dollar":"シンガポールドル","Hong Kong Dollar":"香港ドル","South Korean Won":"韓国ウォン","Mexican Peso":"メキシコペソ","South African Rand":"南アフリカランド","Danish Krone":"デンマーククローネ","Romanian Leu":"ルーマニアレウ","All":"すべて","Plan":"プラン","Trend":"トレンド","Forecast":"予測","Calendar":"カレンダー","Pulse":"パルス","Stats":"統計","Optimize":"最適化","Today":"今日","7D":"7日","30D":"30日","Month":"今月","6M":"6か月","Life":"累計","Week":"今週","30 Days":"30日間","6 Months":"6か月間","Lifetime":"累計","Local":"ローカル","Combined":"合算","Ember":"エンバー","Blue":"ブルー","Purple":"パープル","Pink":"ピンク","Red":"レッド","Orange":"オレンジ","Yellow":"イエロー","Green":"グリーン","Graphite":"グラファイト","Older session logs may be unavailable.":"古いセッションログは利用できない場合があります。","Session identities are unavailable across devices.":"セッションIDはデバイス間で共有されません。","Session count unavailable":"セッション数を取得できません","At least 1 session":"1 セッション以上","At least %lld sessions":"%lld セッション以上","1 session":"1 セッション","%lld sessions":"%lld セッション","Unavailable":"利用不可","≥%lld sess":"≥%lld セッション","%lld sess":"%lld セッション","Connect":"接続","Reconnect":"再接続","Add API Key":"APIキーを追加","now":"たった今","%1$lldd %2$lldh":"%1$lld日%2$lld時間","%1$lldh %2$lldm":"%1$lld時間%2$lld分","%lldm":"%lld分","Auto (2m, less on battery)":"自動(2分、バッテリー時は控えめ)","Manual":"手動","1 minute":"1分","5 minutes":"5分","15 minutes":"15分","2 minutes":"2分","Liquid Glass":"リキッドグラス","Circle":"円形","Squircle":"角丸四角形","Installed app or CLI":"インストール済みのアプリまたはCLI","OAuth":"OAuth","API or cloud credentials":"APIまたはクラウド認証情報","Browser session":"ブラウザセッション","Localhost service":"ローカルサービス","No sign-in required":"サインイン不要","Enter an API key or token below, then press Save & Connect.":"下にAPIキーまたはトークンを入力し、「保存して接続」を押してください。","Sign in to %@ in a supported browser, then click Retry.":"対応ブラウザで%@にサインインし、「再試行」をクリックしてください。","Sign in with the %@ app or CLI, then click Retry.":"%@のアプリまたはCLIでサインインし、「再試行」をクリックしてください。","Sign in with Cline, or enter a ClinePass API key below, then click Retry.":"Clineでサインインするか、下にClinePassのAPIキーを入力して、「再試行」をクリックしてください。","Complete %@ OAuth, then click Retry.":"%@のOAuth認証を完了し、「再試行」をクリックしてください。","Start the local %@ service, then click Retry.":"ローカルの%@サービスを起動し、「再試行」をクリックしてください。","Enter the required API or cloud credentials below, then press Save & Connect.":"下に必要なAPIまたはクラウド認証情報を入力し、「保存して接続」を押してください。","No sign-in is required. Click Retry to refresh quota.":"サインインは不要です。「再試行」をクリックしてクォータを更新してください。","Add an API key or token in Provider Settings.":"プロバイダー設定でAPIキーまたはトークンを追加してください。","Add the required API or cloud credentials in Provider Settings.":"プロバイダー設定で必要なAPIまたはクラウド認証情報を追加してください。","Reconnect %@":"%@に再接続","Claude Code credentials need to be refreshed.":"Claude Codeの認証情報を更新する必要があります。","Open Claude Code in your terminal and type `/login`, then click Reconnect.":"ターミナルでClaude Codeを開き `/login` と入力してから、「再接続」をクリックしてください。","Codex credentials need to be refreshed.":"Codexの認証情報を更新する必要があります。","Run `codex login` in your terminal, then click Reconnect.":"ターミナルで `codex login` を実行してから、「再接続」をクリックしてください。","Kimi Code credentials need to be refreshed.":"Kimi Codeの認証情報を更新する必要があります。","Run the Kimi CLI once to refresh your login, then click Reconnect.":"Kimi CLIを一度実行してログインを更新してから、「再接続」をクリックしてください。","Gemini credentials need to be refreshed.":"Geminiの認証情報を更新する必要があります。","Run the Gemini CLI once to refresh your login, then click Reconnect.":"Gemini CLIを一度実行してログインを更新してから、「再接続」をクリックしてください。","Copilot credentials need to be refreshed.":"Copilotの認証情報を更新する必要があります。","Sign in with the Copilot CLI, an editor plugin, or `gh auth login`, then click Reconnect.":"Copilot CLI、エディタプラグイン、または `gh auth login` でサインインしてから、「再接続」をクリックしてください。","The local Antigravity service is unavailable.":"ローカルのAntigravityサービスが利用できません。","Start the Antigravity app, then click Reconnect.":"Antigravityアプリを起動してから、「再接続」をクリックしてください。","%@ credentials need to be refreshed.":"%@の認証情報を更新する必要があります。","Sign in to %@ again, then retry.":"%@に再度サインインしてから、再試行してください。","No Copilot credentials found":"Copilotの認証情報が見つかりません","Sign in via an editor's Copilot plugin first. Then click Try Again.":"まずエディタのCopilotプラグインでサインインし、「再試行」をクリックしてください。","Copilot quota tracking disconnected":"Copilotのクォータ追跡が切断されました","Your Copilot credentials are untouched. Click Connect to resume.":"Copilotの認証情報はそのまま保持されています。「接続」をクリックして再開してください。","Usage tracking still works. For live quota, sign in with the Copilot CLI or gh auth login, or paste a token below, then click Connect.":"使用量の追跡は引き続き機能します。リアルタイムのクォータを取得するには、Copilot CLIまたはgh auth loginでサインインするか、下にトークンを貼り付けてから「接続」をクリックしてください。","Quota tracking disconnected. Credentials are untouched. Click Connect to resume.":"クォータ追跡が切断されました。認証情報はそのまま保持されています。「接続」をクリックして再開してください。","Grok Bot is not installed. Install the Grok Bot app, then click Retry.":"Grok Botがインストールされていません。Grok Botアプリをインストールしてから、「再試行」をクリックしてください。","Sign in to the Cursor app with the account Grok Bot uses, then click Retry.":"Grok Botが使用するアカウントでCursorアプリにサインインしてから、「再試行」をクリックしてください。","Cursor rejected the current app session. Sign in again, then click Retry.":"Cursorが現在のアプリセッションを拒否しました。再度サインインしてから、「再試行」をクリックしてください。","Could not read the Cursor app's local session data. Quit and reopen Cursor, then click Retry.":"Cursorアプリのローカルセッションデータを読み取れませんでした。Cursorを終了して再度開いてから、「再試行」をクリックしてください。","This account has no included Grok Bot allowance.":"このアカウントにはGrok Botの利用枠が含まれていません。","Grok Bot usage is drawn from a pooled enterprise allowance, which has no per-account reading.":"Grok Botの使用量は企業共有の割り当てから消費されるため、アカウント単位の数値は取得できません。","Cursor rate-limited the quota request.":"Cursorがクォータリクエストをレート制限しました。","Grok Bot quota is temporarily unavailable.":"Grok Botのクォータは一時的に利用できません。","Cursor returned an unrecognized Grok Bot quota response.":"CursorがGrok Botのクォータについて認識できない応答を返しました。","Network error fetching Grok Bot quota.":"Grok Botのクォータ取得中にネットワークエラーが発生しました。","Update Check Failed":"更新の確認に失敗","CLI Update Failed":"CLIの更新に失敗","Menubar Update Failed":"メニューバーアプリの更新に失敗","CodeBurn could not check for updates.":"CodeBurnは更新を確認できませんでした。","CodeBurn could not update the CLI.":"CodeBurnはCLIを更新できませんでした。","CodeBurn could not update the menubar app.":"CodeBurnはメニューバーアプリを更新できませんでした。","Click to retry the update check.":"クリックして更新確認を再試行します。","Click to retry the update.":"クリックして更新を再試行します。","Updating...":"更新中…","Update":"更新","Update the CLI and menubar to the latest release":"CLIとメニューバーアプリを最新版に更新","Desktop Update Failed":"デスクトップアプリの更新に失敗","CodeBurn could not update the desktop app.":"CodeBurnはデスクトップアプリを更新できませんでした。","Updating CLI...":"CLIを更新中…","Updating menubar...":"メニューバーアプリを更新中…","Opening CodeBurn to update...":"更新のためCodeBurnを開いています…","Update the CLI, menubar and desktop app to the latest release":"CLI、メニューバーアプリ、デスクトップアプリを最新版に更新","CodeBurn %@ available":"CodeBurn %@ が利用可能","App and CLI %@ updates are ready. Click to install.":"アプリとCLIの%@アップデートの準備ができました。クリックしてインストールしてください。","Click to install the update.":"クリックして更新をインストールします。","CodeBurn CLI %@ available":"CodeBurn CLI %@ が利用可能","Could not find the package manager for %1$@. Run “%2$@” manually, then try again.":"%1$@用のパッケージマネージャーが見つかりませんでした。「%2$@」を手動で実行してから、もう一度お試しください。","the CLI":"CLI","This codeburn CLI comes with the CodeBurn desktop app. Update the desktop app, then try again.":"このcodeburn CLIはCodeBurnデスクトップアプリに同梱されています。デスクトップアプリを更新してから、もう一度お試しください。","npm does not have permission to update the global codeburn install. Run “%@” in Terminal, then try again.":"npmにはグローバルのcodeburnを更新する権限がありません。ターミナルで「%@」を実行してから、もう一度お試しください。","CLI update failed (exit %lld)":"CLIの更新に失敗しました(終了コード %lld)","Your codeburn CLI (%1$@) is too old to update the menubar. Run “%2$@” first, then try again.":"codeburn CLI(%1$@)が古すぎるためメニューバーアプリを更新できません。まず「%2$@」を実行してから、もう一度お試しください。","Update failed (exit %lld)":"更新に失敗しました(終了コード %lld)","GitHub returned HTTP %lld.":"GitHubがHTTP %lldを返しました。","No mac-v release with a menubar zip and checksum was found.":"メニューバー用のzipとチェックサムを含むmac-vリリースが見つかりませんでした。","Terminal (macOS default)":"ターミナル(macOS標準)","%@ credits":"%@ クレジット","CodeBurn %1$@ · %2$lld of %3$lld devices reporting":"CodeBurn %1$@ · %2$lld/%3$lld台のデバイスが報告中","Settings…":"設定…","Capacity Dock Settings…":"容量ドック設定…","Refresh Now":"今すぐ更新","Check for Updates":"更新を確認","About CodeBurn":"CodeBurnについて","Quit CodeBurn":"CodeBurnを終了","Today · no usage yet":"今日 · 使用量なし","1 call":"1回の呼び出し","%lld calls":"%lld回の呼び出し","Today · %1$@ · %2$@":"今日 · %1$@ · %2$@","CodeBurn Settings":"CodeBurn設定","Update Available":"更新があります","%1$@ is available (you have %2$@).":"%1$@ が利用可能です(現在は%2$@)。","%1$@ Your codeburn CLI is too old to install it. First run:\n\n%2$@\n\nthen:\n\ncodeburn menubar --force":"%1$@ codeburn CLIが古すぎてインストールできません。まず次を実行してください:\n\n%2$@\n\n次に:\n\ncodeburn menubar --force","%@ Run:\n\ncodeburn menubar --force":"%@ 次を実行してください:\n\ncodeburn menubar --force","Up to Date":"最新の状態です","You're on the latest version (%@).":"最新バージョン(%@)を使用中です。","OK":"OK","This total may be incomplete.":"この合計は不完全な場合があります。","Claude config":"Claude設定","No %1$@ data for %2$@":"%2$@の%1$@データはありません","Couldn't load %@":"%@を読み込めませんでした","Retry":"再試行","Loading %@…":"%@を読み込み中…","Your AI Bill, Itemized":"AI利用料の内訳","%1$@ over limit (%2$lld%%)":"%1$@が上限超過(%2$lld%%)","resets in %@":"%@後にリセット","Change accent color":"アクセントカラーを変更","Copy update command to clipboard":"更新コマンドをクリップボードにコピー","Enjoying CodeBurn?":"CodeBurnを楽しんでいますか?","Star us on GitHub":"GitHubでスターをつける","Hide this banner":"このバナーを非表示","CSV (folder)":"CSV(フォルダ)","JSON":"JSON","Export":"書き出す","Full Report":"完全なレポート","%@ call":"%@回の呼び出し","%@ calls":"%@回の呼び出し","Daily budget of %@ exceeded":"1日の予算%@を超過","Combined unavailable · showing local":"合算不可 · ローカルを表示中","Combined · %@":"合算 · %@","Saved %@ with local models":"ローカルモデルで%@節約","%1$lld of %2$lld devices":"%1$lld/%2$lld台のデバイス","%@ · local":"%@ · ローカル","Clear":"クリア","Done":"完了","Pick dates":"日付を選択","1 day":"1日","%lld days":"%lld日","Show previous providers":"前のプロバイダーを表示","Show next providers":"次のプロバイダーを表示","Loading…":"読み込み中…","Sign in with `codex` (ChatGPT mode) to track quota.":"`codex`(ChatGPTモード)でサインインするとクォータを追跡できます。","Sign in to Claude Code to track quota.":"Claude Codeにサインインするとクォータを追跡できます。","Sign in to track quota.":"サインインするとクォータを追跡できます。","%@ usage":"%@の使用量","stale":"古い","retrying":"再試行中","Activity":"アクティビティ","Cost":"コスト","Turns":"ターン数","1-shot":"一発成功","Models":"モデル","Saved":"節約額","Calls":"呼び出し","Tokens":"トークン","%@ in":"入力 %@","%@ out":"出力 %@","%1$@ in · %2$@ out · %3$@ cache read":"入力 %1$@ · 出力 %2$@ · キャッシュ読取 %3$@","%@%% cache hit":"キャッシュヒット率 %@%%","1 model unpriced, counted at $0 · %@ tokens":"価格未設定のモデル1件、$0として計上 · %@トークン","%1$lld models unpriced, counted at $0 · %2$@ tokens":"価格未設定のモデル%1$lld件、$0として計上 · %2$@トークン","~ estimated cost (priced from estimated tokens)":"~ 推定コスト(推定トークン数から算出)","Pull requests":"プルリクエスト","Tooling":"ツール","Tools":"ツール","Skills & Agents":"スキルとエージェント","MCP Servers":"MCPサーバー","Tips for you":"あなたへのヒント","%lld signals":"%lld件のシグナル","Open Full Optimize":"完全な最適化レポートを開く","Cache hit at %lld%% — most prompts reuse cache":"キャッシュヒット率%lld%% — 大半のプロンプトがキャッシュを再利用","%lld%% one-shot — edits landing first try":"一発成功率%lld%% — 編集が最初の試行で成功","Spend down %lld%% vs last 7 days":"支出が過去7日間より%lld%%減少","%lld-day usage streak":"%lld日連続で使用中","Spend up %lld%% vs prior 7 days":"支出が過去7日間より%lld%%増加","Cache hit only %lld%% — paying for cold prompts":"キャッシュヒット率はわずか%lld%% — コールドプロンプトに料金を支払い中","%lld%% one-shot — lots of iteration":"一発成功率%lld%% — 修正の繰り返しが多い","On pace for %1$@ this month (+%2$lld%% vs last)":"このペースだと今月は%1$@(前月比+%2$lld%%)","What's working":"うまくいっていること","What to improve":"改善できること","Risks":"リスク","Last %lld days":"過去%lld日間","%1$@%% vs prior %2$lldd":"%1$@%%(前%2$lld日比)","Avg/day":"1日平均","Peak":"ピーク","Yesterday":"昨日","Total":"合計","%@ tokens":"%@トークン","%1$@ on %2$@":"%1$@(%2$@)","Daily activity":"日次アクティビティ","%lld active days":"%lld稼働日","Peak day":"ピーク日","Avg active":"稼働日平均","Streak":"連続日数","%lldd":"%lld日","Mon":"月","Wed":"水","Fri":"金","Sun":"日","Daily detail":"日次の詳細","Hover a day":"日にカーソルを合わせる","Future day":"未来の日付","No tracked usage":"追跡された使用量なし","%@: future day":"%@:未来の日付","%@: no tracked usage":"%@:追跡された使用量なし","%1$@: %2$@, %3$lld calls, %4$@ tokens":"%1$@:%2$@、%3$lld回の呼び出し、%4$@トークン","Month-to-date":"月初来","On pace for":"このペースだと","Avg/day (this wk)":"1日平均(今週)","Last 7d":"過去7日間","no prior month":"前月データなし","%1$@%% vs last month (%2$@)":"%1$@%%(前月比、%2$@)","Cache hit":"キャッシュヒット","Cost / session":"セッションあたりコスト","Cost/edit":"編集あたりコスト","Save ~%1$@ / ~%2$@ tokens · 1 finding":"約%1$@ / 約%2$@トークンを節約可能 · 1件の指摘","Save ~%1$@ / ~%2$@ tokens · %3$lld findings":"約%1$@ / 約%2$@トークンを節約可能 · %3$lld件の指摘","Favorite model":"よく使うモデル","Active days (month)":"稼働日数(今月)","Most active day":"最も活発だった日","Peak day spend":"ピーク日の支出","Sessions":"セッション","Current streak":"現在の連続記録","Longest streak":"最長連続記録","Tracked spend (last %lld days)":"追跡された支出(過去%lld日間)","Costliest session":"最も費用のかかったセッション","Retry tax":"リトライコスト","%1$lld retries across %2$lld retried edits":"リトライした%2$lld件の編集で%1$lld回のリトライ","%@ ret/edit":"%@回/編集","Hides session details":"セッションの詳細を非表示","Shows session details":"セッションの詳細を表示","Expanded":"展開済み","Collapsed":"折りたたみ済み"," %lld call":" %lld回の呼び出し"," %lld calls":" %lld回の呼び出し","Potential savings":"節約できる可能性","%lld%% of spend":"支出の%lld%%","could be optimized":"最適化の余地あり","Routing waste":"ルーティングの無駄","vs %1$@ @ %2$@/edit":"%1$@との比較(%2$@/編集)","Connect Claude subscription":"Claudeサブスクリプションを接続","CodeBurn will read your Claude Code credentials once. macOS will ask permission. After that, the live quota bar shows next to the Claude tab and updates automatically.":"CodeBurnはClaude Codeの認証情報を一度だけ読み取ります。macOSが許可を求めます。その後、リアルタイムのクォータバーがClaudeタブの横に表示され、自動的に更新されます。","Reading Claude credentials...":"Claudeの認証情報を読み取り中…","No Claude credentials found":"Claudeの認証情報が見つかりません","Sign in with Claude Code first: open `claude` in your terminal and type `/login`. Then click Try Again.":"まずClaude Codeでサインインしてください。ターミナルで`claude`を開き`/login`と入力し、「再試行」をクリックしてください。","Anthropic temporarily unreachable. Retrying.":"Anthropicに一時的に接続できません。再試行しています。","Reconnect Claude":"Claudeに再接続","Your Claude session has expired. Open Claude Code in your terminal and type `/login`, then click Reconnect.":"Claudeのセッションが期限切れです。ターミナルでClaude Codeを開き`/login`と入力してから、「再接続」をクリックしてください。","Resets %@":"リセット:%@","5-hour window":"5時間ウィンドウ","7-day total":"7日間合計","7-day Opus":"7日間Opus","7-day Sonnet":"7日間Sonnet","7-day %@":"7日間%@","Try Again":"再試行","Couldn't load plan data":"プランデータを読み込めませんでした","Connect ChatGPT subscription":"ChatGPTサブスクリプションを接続","CodeBurn will read your Codex CLI credentials once. After that, the live quota bar shows next to the Codex tab and updates automatically.":"CodeBurnはCodex CLIの認証情報を一度だけ読み取ります。その後、リアルタイムのクォータバーがCodexタブの横に表示され、自動的に更新されます。","Reading Codex CLI credentials...":"Codex CLIの認証情報を読み取り中…","No Codex credentials found":"Codexの認証情報が見つかりません","Sign in with Codex first: run `codex login` in your terminal. Then click Try Again.":"まずCodexでサインインしてください。ターミナルで`codex login`を実行し、「再試行」をクリックしてください。","ChatGPT temporarily unreachable. Retrying.":"ChatGPTに一時的に接続できません。再試行しています。","Reconnect Codex":"Codexに再接続","Your ChatGPT session has expired. Run `codex login` in your terminal, then click Reconnect.":"ChatGPTのセッションが期限切れです。ターミナルで`codex login`を実行してから、「再接続」をクリックしてください。","%@ window":"%@ウィンドウ","Credits":"クレジット","Unlimited":"無制限","Limit resets":"上限のリセット","No Kimi Code credentials found":"Kimi Codeの認証情報が見つかりません","Sign in with the Kimi CLI first. Then click Try Again.":"まずKimi CLIでサインインしてから、「再試行」をクリックしてください。","Reading Kimi Code credentials...":"Kimi Codeの認証情報を読み取り中…","Kimi temporarily unreachable. Retrying.":"Kimiに一時的に接続できません。再試行しています。","Refresh Kimi Code login":"Kimi Codeのログインを更新","Kimi Code tokens are short-lived. Run the Kimi CLI once to refresh your login, then click Reconnect.":"Kimi Codeのトークンは有効期限が短いです。Kimi CLIを一度実行してログインを更新してから、「再接続」をクリックしてください。","Parallel sessions":"並列セッション","Login idle. Run the Kimi CLI to refresh.":"ログインが休止中です。Kimi CLIを実行して更新してください。","as of %@":"%@時点","No Gemini credentials found":"Geminiの認証情報が見つかりません","Sign in with the Gemini CLI first. Then click Try Again.":"まずGemini CLIでサインインしてから、「再試行」をクリックしてください。","Reading Gemini credentials...":"Geminiの認証情報を読み取り中…","Gemini temporarily unreachable. Retrying.":"Geminiに一時的に接続できません。再試行しています。","Refresh Gemini login":"Geminiのログインを更新","Your Gemini login has expired. Run the Gemini CLI once to refresh it, then click Reconnect.":"Geminiのログインが期限切れです。Gemini CLIを一度実行して更新してから、「再接続」をクリックしてください。","Login idle. Run the Gemini CLI to refresh.":"ログインが休止中です。Gemini CLIを実行して更新してください。","Reading Copilot credentials...":"Copilotの認証情報を読み取り中…","GitHub temporarily unreachable. Retrying.":"GitHubに一時的に接続できません。再試行しています。","Refresh Copilot login":"Copilotのログインを更新","Your Copilot sign-in has expired. Sign in via an editor's Copilot plugin again, then click Reconnect.":"Copilotのサインインが期限切れです。エディタのCopilotプラグインで再度サインインしてから、「再接続」をクリックしてください。","Login idle. Sign in via an editor's Copilot plugin to refresh.":"ログインが休止中です。エディタのCopilotプラグインでサインインして更新してください。","No local Antigravity server found":"ローカルのAntigravityサーバーが見つかりません","Start the Antigravity app, then click Try Again.":"Antigravityアプリを起動してから、「再試行」をクリックしてください。","Probing the local Antigravity server...":"ローカルのAntigravityサーバーを確認中…","Local Antigravity server unreachable. Retrying.":"ローカルのAntigravityサーバーに接続できません。再試行しています。","Reconnect Antigravity":"Antigravityに再接続","Server disconnected. Start the Antigravity app to refresh.":"サーバーが切断されました。Antigravityアプリを起動して更新してください。","On pace":"順調なペース","On pace: %@ at reset":"順調なペース:リセット時点で%@","%@%% in deficit":"%@%%超過","%@%% in reserve":"%@%%の余裕","%1$@ · hits 100%% %2$@":"%1$@ · %2$@に100%%到達","%1$@ · %2$@ at reset":"%1$@ · リセット時点で%2$@","On pace: %1$@ at reset · hits 100%% %2$@":"順調なペース:リセット時点で%1$@ · %2$@に100%%到達","Based on last cycle: %@":"前回のサイクルに基づく:%@","in %lldm":"%lld分後","in %lldh":"%lld時間後","in %lldd":"%lld日後","Dock to Edge":"画面端にドッキング","Left":"左","Right":"右","Top":"上","Bottom":"下","Hide Capacity Dock":"容量ドックを隠す","Capacity Dock":"容量ドック","Unknown":"不明","Click to keep Capacity Dock expanded":"クリックすると容量ドックを展開したままにします","Click to switch between this provider's usage windows":"クリックしてこのプロバイダーの使用量ウィンドウを切り替え","Show %@ usage":"%@の使用量を表示","none running":"実行中なし","Kimi Code":"Kimi Code","Gemini":"Gemini","Copilot":"Copilot","Antigravity":"Antigravity","1 running":"1件実行中","%lld running":"%lld件実行中","%@ left":"残り%@","Open in %@":"%@で開く","Bring %@ to front":"%@を前面に表示","burned":"消費済み","today %1$@ of %2$@":"今日 %1$@ / %2$@","no budget set":"予算未設定","Refreshing…":"更新中…","Last known usage · refreshing":"最後に確認した使用量 · 更新中","Last known usage · retrying":"最後に確認した使用量 · 再試行中","Not connected":"未接続","Reconnect required":"再接続が必要","General":"一般","Providers":"プロバイダー","%lld on":"%lld件が有効","About":"情報","Settings":"設定","Search providers":"プロバイダーを検索","Enter an amount above, or the alert stays off.":"上に金額を入力してください。入力しない場合、アラートはオフのままです。","Flame icon turns yellow when today's tokens pass the daily budget.":"今日のトークン数が1日の予算を超えると、炎のアイコンが黄色になります。","Flame icon turns yellow when today's cost pass the daily budget.":"今日のコストが1日の予算を超えると、炎のアイコンが黄色になります。","Display":"表示","Currency":"通貨","Metric":"指標","Cost ($)":"コスト($)","Tokens (↑↓)":"トークン(↑↓)","Total Tokens":"トークン合計","Credits (Codex)":"クレジット(Codex)","Icon Only":"アイコンのみ","Period":"期間","Scope":"範囲","Accent":"アクセントカラー","Usage Refresh":"使用量の更新","Update every":"更新間隔","How often the menubar figure re-reads your local session data. Auto refreshes every 30 seconds while you're plugged in and backs off on battery; Manual only refreshes when you open the popover or click Refresh Now.":"メニューバーの数値がローカルのセッションデータを再読み込みする頻度です。「自動」は電源接続時に30秒ごとに更新し、バッテリー使用時は間隔を延ばします。「手動」はポップオーバーを開くか「今すぐ更新」をクリックしたときのみ更新します。","Updates":"更新","Notify me about updates":"更新があれば通知する","Posts a notification when a new CodeBurn release is available. Click it to install.":"新しいCodeBurnのリリースが利用可能になると通知します。通知をクリックするとインストールできます。","Terminal":"ターミナル","Open commands in":"コマンドを開くアプリ","%@ (not installed)":"%@(未インストール)","Where Full Report and Optimize open. If the chosen app isn't installed CodeBurn falls back to Terminal; if that's missing too the command runs in the background. Only terminals that can script a command into a live window are listed.":"「完全なレポート」と「最適化」が開くアプリです。選択したアプリがインストールされていない場合、CodeBurnはターミナルにフォールバックします。ターミナルもない場合はコマンドがバックグラウンドで実行されます。アクティブなウィンドウにコマンドをスクリプトで送れるターミナルのみが表示されます。","Alerts":"アラート","Daily budget":"1日の予算","Off":"オフ","Custom…":"カスタム…","Amount":"金額","M tokens":"百万トークン","Show Capacity Dock":"容量ドックを表示","Resting provider":"デフォルトのプロバイダー","Size":"サイズ","Capacity Dock size":"容量ドックのサイズ","Appearance":"外観","Gauge shape":"ゲージの形状","Dock providers":"ドックのプロバイダー","Connect a provider from its sidebar page to make it available here.":"サイドバーのプロバイダーページから接続すると、ここに表示されるようになります。","Needs attention":"要対応","Connected providers and anything already shown in the dock appear here, so a provider can always be removed even if its connection later fails.":"接続済みのプロバイダーと、すでにドックに表示されている項目がここに表示されます。接続が後で失敗しても、プロバイダーは常に削除できます。","Connection":"接続","Config Directories":"設定ディレクトリ","Aggregate usage across multiple Claude config directories (e.g. work and personal accounts). Leave empty to track just the default `~/.claude`. The `CLAUDE_CONFIG_DIRS` environment variable, if set, overrides this list.":"複数のClaude設定ディレクトリ(仕事用と個人用のアカウントなど)の使用量を集計します。空のままにするとデフォルトの`~/.claude`のみを追跡します。`CLAUDE_CONFIG_DIRS`環境変数が設定されている場合、このリストより優先されます。","Quota Refresh":"クォータの更新","Anthropic rate-limits this endpoint per account. 2 minutes is plenty for the 5-hour and weekly windows; pick Manual if you only want updates on demand.":"Anthropicはこのエンドポイントをアカウントごとにレート制限しています。5時間および週間ウィンドウには2分で十分です。必要なときだけ更新したい場合は「手動」を選択してください。","Connected":"接続済み","Backing off":"待機中","Connecting…":"接続中…","Ready":"準備完了","Plan: %@":"プラン:%@","Live quota tracked from Anthropic.":"Anthropicからリアルタイムのクォータを追跡しています。","Anthropic rate-limited; auto-retrying.":"Anthropicがレート制限中です。自動的に再試行しています。","macOS may ask permission to read your credentials.":"macOSが認証情報の読み取り許可を求める場合があります。","Background refresh in progress.":"バックグラウンドで更新中です。","Tap Load Quota to fetch live usage from Anthropic.":"「クォータを読み込む」をクリックしてAnthropicからリアルタイムの使用量を取得してください。","Click Connect to read your Claude Code credentials and start tracking quota.":"「接続」をクリックしてClaude Codeの認証情報を読み取り、クォータの追跡を開始してください。","Disconnect":"切断","Disconnect Claude?":"Claudeを切断しますか?","Cancel":"キャンセル","CodeBurn will stop tracking quota and clear its connection state plus any legacy credential cache. Your Claude Code credential is untouched. Claude Code keeps working.":"CodeBurnはクォータの追跡を停止し、接続状態と旧バージョンの認証情報キャッシュをすべて消去します。Claude Codeの認証情報自体は変更されず、Claude Codeは引き続き使用できます。","Load Quota":"クォータを読み込む","No extra directories. Tracking the default `~/.claude`.":"追加のディレクトリはありません。デフォルトの`~/.claude`を追跡しています。","Remove":"削除","Add Directory…":"ディレクトリを追加…","Add":"追加","Choose one or more Claude config directories (each containing a `projects` folder).":"1つ以上のClaude設定ディレクトリ(それぞれ`projects`フォルダを含む)を選択してください。","Codex live-quota tracking follows the authoritative `~/.codex/auth.json` session directly and does not create a second Keychain copy. A legacy CodeBurn Keychain item, when present, is read only as a migration fallback. Only ChatGPT-mode auth (Plus / Pro / Team / Business / Edu / Enterprise) is supported. API-key users are billed per request and have a different reporting surface. Credit-metered workspaces report no rate-limit windows, so their monthly credit allowance is shown instead.":"Codexのリアルタイムクォータ追跡は、正規の`~/.codex/auth.json`セッションを直接参照し、キーチェーンに別のコピーを作成しません。旧バージョンのCodeBurnキーチェーン項目が存在する場合は、移行時のフォールバックとしてのみ読み取られます。対応するのはChatGPTモードの認証(Plus / Pro / Team / Business / Edu / Enterprise)のみです。APIキーを使うユーザーはリクエスト単位で課金され、レポート方法が異なります。クレジット制のワークスペースではレート制限ウィンドウが報告されないため、代わりに月間クレジット枠が表示されます。","How it works":"仕組み","Couldn't load Codex quota":"Codexのクォータを読み込めませんでした","Live quota tracked from chatgpt.com.":"chatgpt.comからリアルタイムのクォータを追跡しています。","Codex is in API-key mode. Run `codex login` and choose a ChatGPT plan to enable quota tracking.":"Codexは現在APIキーモードです。`codex login`を実行してChatGPTプランを選択すると、クォータの追跡が有効になります。","Run `codex login` in your terminal to sign in again, then click Reconnect.":"ターミナルで`codex login`を実行して再度サインインし、「再接続」をクリックしてください。","ChatGPT rate-limited; auto-retrying.":"ChatGPTがレート制限中です。自動的に再試行しています。","Reading ~/.codex/auth.json.":"~/.codex/auth.jsonを読み取り中です。","Tap Load Quota to fetch live usage from chatgpt.com.":"「クォータを読み込む」をクリックしてchatgpt.comからリアルタイムの使用量を取得してください。","Click Connect to read your Codex CLI credentials. If Connect fails, run `codex login` in your terminal first to create ~/.codex/auth.json.":"「接続」をクリックしてCodex CLIの認証情報を読み取ってください。接続に失敗する場合は、まずターミナルで`codex login`を実行して~/.codex/auth.jsonを作成してください。","Disconnect Codex?":"Codexを切断しますか?","CodeBurn will stop tracking quota and clear its connection state plus any legacy credential cache. Your ~/.codex/auth.json is untouched. Codex CLI keeps working.":"CodeBurnはクォータの追跡を停止し、接続状態と旧バージョンの認証情報キャッシュをすべて消去します。~/.codex/auth.json自体は変更されず、Codex CLIは引き続き使用できます。","Kimi Code live-quota tracking reads `~/.kimi-code/credentials/kimi-code.json` directly. Nothing is copied or stored. Access tokens are short-lived (~15 minutes) and only the Kimi CLI refreshes them, so if the connection shows as expired, run the Kimi CLI once and click Reconnect.":"Kimi Codeのリアルタイムクォータ追跡は`~/.kimi-code/credentials/kimi-code.json`を直接読み取ります。コピーや保存は行いません。アクセストークンは有効期限が短く(約15分)、Kimi CLIのみが更新できます。接続が期限切れと表示された場合は、Kimi CLIを一度実行してから「再接続」をクリックしてください。","Login refresh required":"ログインの更新が必要","Couldn't load Kimi quota":"Kimiのクォータを読み込めませんでした","Live quota tracked from api.kimi.com.":"api.kimi.comからリアルタイムのクォータを追跡しています。","Kimi rate-limited; auto-retrying.":"Kimiがレート制限中です。自動的に再試行しています。","Reading ~/.kimi-code credentials.":"~/.kimi-codeの認証情報を読み取り中です。","Tap Load Quota to fetch live usage from api.kimi.com.":"「クォータを読み込む」をクリックしてapi.kimi.comからリアルタイムの使用量を取得してください。","Sign in with the Kimi CLI first, then click Connect.":"まずKimi CLIでサインインしてから、「接続」をクリックしてください。","Disconnect Kimi Code?":"Kimi Codeを切断しますか?","CodeBurn will stop tracking Kimi Code quota. Your ~/.kimi-code credentials are untouched. The Kimi CLI keeps working.":"CodeBurnはKimi Codeのクォータ追跡を停止します。~/.kimi-codeの認証情報自体は変更されず、Kimi CLIは引き続き使用できます。","Gemini live-quota tracking reads `~/.gemini/oauth_creds.json` read-only. Nothing is copied or stored, and tokens stay in memory. If the connection shows as expired, run the Gemini CLI once to refresh your login, then click Reconnect.":"Geminiのリアルタイムクォータ追跡は`~/.gemini/oauth_creds.json`を読み取り専用で参照します。コピーや保存は行わず、トークンはメモリ内にのみ保持されます。接続が期限切れと表示された場合は、Gemini CLIを一度実行してログインを更新してから、「再接続」をクリックしてください。","Couldn't load Gemini quota":"Geminiのクォータを読み込めませんでした","Live quota tracked from Google Code Assist.":"Google Code Assistからリアルタイムのクォータを追跡しています。","Gemini rate-limited; auto-retrying.":"Geminiがレート制限中です。自動的に再試行しています。","Reading ~/.gemini credentials.":"~/.geminiの認証情報を読み取り中です。","Tap Load Quota to fetch live usage from Google Code Assist.":"「クォータを読み込む」をクリックしてGoogle Code Assistからリアルタイムの使用量を取得してください。","Sign in with the Gemini CLI first, then click Connect.":"まずGemini CLIでサインインしてから、「接続」をクリックしてください。","Disconnect Gemini?":"Geminiを切断しますか?","CodeBurn will stop tracking Gemini quota. Your ~/.gemini credentials are untouched. The Gemini CLI keeps working.":"CodeBurnはGeminiのクォータ追跡を停止します。~/.geminiの認証情報自体は変更されず、Gemini CLIは引き続き使用できます。","Copilot live-quota tracking reads a GitHub token that is already on this Mac, read-only. Nothing is copied or stored. CodeBurn looks at the editor plugin files in `~/.config/github-copilot`, the Copilot CLI's `~/.copilot` files, the COPILOT_GITHUB_TOKEN, GH_TOKEN and GITHUB_TOKEN variables, `gh auth token`, and finally a token you paste below. Usage tracking works without any of this; only the live quota bars need a token. Every one of those carries the GitHub host it belongs to — the plugin files are keyed by host, the variables are read with GH_HOST, the `gh` login with the host in gh's own hosts.yml, and a pasted token with the host you type beside it — and a credential for a GitHub Enterprise Cloud host is queried on that tenant's own API (api..ghe.com), never sent to api.github.com.":"Copilotのリアルタイムクォータ追跡は、このMac上に既にあるGitHubトークンを読み取り専用で参照します。コピーや保存は行いません。CodeBurnは`~/.config/github-copilot`内のエディタプラグインファイル、Copilot CLIの`~/.copilot`ファイル、COPILOT_GITHUB_TOKEN・GH_TOKEN・GITHUB_TOKEN環境変数、`gh auth token`、そして最後に下で貼り付けたトークンの順に確認します。使用量の追跡にはこれらは不要で、リアルタイムのクォータバーにのみトークンが必要です。これらにはそれぞれ対応するGitHubホストが紐づいています。プラグインファイルはホストごとに分類され、環境変数はGH_HOSTで読み取られ、`gh`のログインはghのhosts.yml内のホストを使用し、貼り付けたトークンは横に入力したホストを使用します。GitHub Enterprise Cloudホスト用の認証情報は、そのテナント自身のAPI(api..ghe.com)にのみ問い合わせ、api.github.comには送信されません。","GitHub token":"GitHubトークン","GitHub host":"GitHubホスト","Save & Connect":"保存して接続","Clear Token":"トークンを消去","Paste a token":"トークンを貼り付け","Optional, and only needed when nothing else on this Mac is signed in. A fine-grained personal access token with the \"Plan: Read-only\" permission is enough. Leave the host at github.com unless the token was minted on a GitHub Enterprise Cloud tenant, in which case enter that tenant's host (.ghe.com) so the token is never sent to api.github.com. Both are saved in CodeBurn's own Keychain item and are used only to read your Copilot quota.":"任意項目で、このMac上に他にサインイン済みのものがない場合にのみ必要です。「Plan: Read-only」権限を持つ細粒度パーソナルアクセストークンで十分です。ホストはgithub.comのままにしてください。ただしトークンがGitHub Enterprise Cloudテナントで発行された場合は、そのテナントのホスト(.ghe.com)を入力し、トークンがapi.github.comに送信されないようにしてください。どちらもCodeBurn専用のキーチェーン項目に保存され、Copilotのクォータの読み取りにのみ使用されます。","Couldn't load Copilot quota":"Copilotのクォータを読み込めませんでした","Live quota tracked from %@.":"%@からリアルタイムのクォータを追跡しています。","Plan: %1$@. Live quota tracked from %2$@.":"プラン:%1$@。%2$@からリアルタイムのクォータを追跡しています。","Sign in again with the Copilot CLI, an editor's Copilot plugin, or gh auth login, then click Reconnect.":"Copilot CLI、エディタのCopilotプラグイン、またはgh auth loginで再度サインインしてから、「再接続」をクリックしてください。","GitHub rate-limited; auto-retrying.":"GitHubがレート制限中です。自動的に再試行しています。","Looking for a GitHub token on this Mac.":"このMac上のGitHubトークンを探しています。","Tap Load Quota to fetch live usage from GitHub.":"「クォータを読み込む」をクリックしてGitHubからリアルタイムの使用量を取得してください。","Tap Load Quota to fetch live usage from %@.":"「クォータを読み込む」をクリックして%@からリアルタイムの使用量を取得してください。","CodeBurn cannot read Copilot quota for %@. Use github.com or a GitHub Enterprise Cloud host (*.ghe.com).":"CodeBurnは%@のCopilotクォータを読み取れません。github.comまたはGitHub Enterprise Cloudホスト(*.ghe.com)を使用してください。","Disconnect Copilot?":"Copilotを切断しますか?","CodeBurn will stop tracking Copilot quota. Every credential it read stays untouched, and your Copilot clients keep working.":"CodeBurnはCopilotのクォータ追跡を停止します。読み取った認証情報はすべて変更されず、Copilotクライアントは引き続き使用できます。","Antigravity live-quota tracking talks to the Antigravity app's local language server on 127.0.0.1 only. Nothing leaves the machine and no credential files are read. If it shows as disconnected, start the Antigravity app, then click Reconnect.":"Antigravityのリアルタイムクォータ追跡は、Antigravityアプリのローカル言語サーバー(127.0.0.1)のみと通信します。データが外部に送信されることはなく、認証情報ファイルも読み取りません。切断中と表示された場合は、Antigravityアプリを起動してから、「再接続」をクリックしてください。","Couldn't load Antigravity quota":"Antigravityのクォータを読み込めませんでした","Live quota tracked from the local Antigravity server.":"ローカルのAntigravityサーバーからリアルタイムのクォータを追跡しています。","Local probe failed; auto-retrying.":"ローカルの確認に失敗しました。自動的に再試行しています。","Probing the local Antigravity language server.":"ローカルのAntigravity言語サーバーを確認中です。","Tap Load Quota to probe the local Antigravity server.":"「クォータを読み込む」をクリックしてローカルのAntigravityサーバーを確認してください。","Start the Antigravity app first, then click Connect.":"まずAntigravityアプリを起動してから、「接続」をクリックしてください。","No local Antigravity server found. Start the Antigravity app, then click Reconnect.":"ローカルのAntigravityサーバーが見つかりません。Antigravityアプリを起動してから、「再接続」をクリックしてください。","Disconnect Antigravity?":"Antigravityを切断しますか?","CodeBurn will stop tracking Antigravity quota. Nothing is read from or written to disk. The Antigravity app keeps working.":"CodeBurnはAntigravityのクォータ追跡を停止します。ディスクへの読み書きは一切行いません。Antigravityアプリは引き続き使用できます。","Not yet supported":"未対応","Automatic connection uses the provider's existing app, CLI, OAuth, browser session, or environment credentials first. CodeBurn does not copy those source credentials into its Keychain.":"自動接続では、まずプロバイダーの既存のアプリ、CLI、OAuth、ブラウザセッション、または環境変数の認証情報を使用します。CodeBurnはこれらの元の認証情報を自身のキーチェーンにコピーしません。","Authentication methods are listed for reference. A native CodeBurn quota adapter is required before this provider can connect to Capacity Dock.":"認証方式は参考として掲載されています。このプロバイダーが容量ドックに接続するには、専用のCodeBurnクォータアダプターが必要です。","Authentication methods":"認証方式","Source":"取得元","API key or token":"APIキーまたはトークン","Clear Override":"上書き設定を消去","Loading saved provider credential":"保存済みのプロバイダー認証情報を読み込み中","Connection override":"接続の上書き設定","Overrides are optional and are saved only when you press Save & Connect. Secret values use one CodeBurn-owned Keychain item for this provider; background reads suppress authentication UI.":"上書き設定は任意で、「保存して接続」を押したときのみ保存されます。機密情報はこのプロバイダー専用の、CodeBurnが所有する1つのキーチェーン項目に保存されます。バックグラウンドでの読み取り時には認証用UIは表示されません。","Remove saved override":"保存済みの上書き設定を削除","Saved data":"保存済みデータ","This credential predates a live CodeBurn quota adapter and is not treated as a connection.":"この認証情報はCodeBurnのリアルタイムクォータアダプターより前のものであり、接続としては扱われません。","Quota adapter not available":"クォータアダプター未対応","Retrying":"再試行中","Cline login expired":"Clineのログインの有効期限切れ","%@ is catalogued, but CodeBurn cannot fetch its live quota yet.":"%@は登録されていますが、CodeBurnはまだそのリアルタイムクォータを取得できません。","Live quota is available to Capacity Dock.":"リアルタイムのクォータを容量ドックで利用できます。","Waiting for quota data.":"クォータデータを待機中です。","Automatic":"自動","CLI":"CLI","API":"API","Version %@":"バージョン %@","%@ is available. Choose Check for Updates in the CodeBurn menu to install it.":"%@が利用可能です。CodeBurnメニューの「更新を確認」からインストールしてください。","GitHub":"GitHub","Website":"ウェブサイト","Issues":"問題を報告","Links":"リンク","© 2026 Resham Joshi (iamtoruk) · AgentSeal. MIT License.":"© 2026 Resham Joshi (iamtoruk) · AgentSeal. MITライセンス。","Second row":"2行目","Second row shows":"2行目に表示","Adds a smaller second line under the menubar figure. Quota remaining tracks whichever connected provider is nearest its limit. The line hides itself while the chosen metric has no data.":"メニューバーの数値の下に小さな2行目を追加します。「残りクォータ」は上限に最も近い接続済みプロバイダーを追跡します。選択した指標にデータがない場合、この行は自動的に非表示になります。","Quota remaining":"残りクォータ","Today's cost":"今日のコスト","Today's tokens":"今日のトークン","Active sessions":"アクティブなセッション","%@ today":"今日 %@","%@ tok today":"今日 %@ tok","%lld%% left":"残り%lld%%","Monthly":"月間","Monthly usage limit":"月間利用上限","Monthly usage limit · limit reached":"月間利用上限 · 上限到達","Monthly usage limit · %1$@ / %2$@ credits":"月間利用上限 · %1$@ / %2$@クレジット","%@ · limit reached":"%@ · 上限到達","Last known usage":"最後に確認した使用量","Notifications":"通知","Notify me when Codex banks a limit reset":"Codexが限度リセットを獲得したら通知する","OpenAI sometimes grants Codex accounts a credit that resets a rate-limit window early. CodeBurn reads these from the quota response it already fetches and tells you once per grant. It never spends one.":"OpenAIは、レート制限ウィンドウを早期にリセットするクレジットをCodexアカウントに付与することがあります。CodeBurnはすでに取得しているクォータの応答からこれを読み取り、付与ごとに一度だけ通知します。CodeBurn自身がこのクレジットを消費することはありません。","Notify me when a quota resets early":"クォータが早期にリセットされたら通知する","Posts a notification when a provider resets a usage limit before its scheduled time, so you know the capacity is back.":"プロバイダーが予定より早く利用上限をリセットしたときに通知し、利用枠が戻ったことを知らせます。","cache read":"キャッシュ読取","Cache read: %@ tokens":"キャッシュ読取:%@トークン","Quota window %@":"クォータウィンドウ %@","Language":"言語","System":"システムに従う","Follows System Settings > Language & Region unless you pick one here.":"ここで選択しない限り、「システム設定 > 言語と地域」の設定に従います。","5-hour":"5時間","<1m":"<1分","%@ quota reset early":"%@のクォータが早期にリセットされました","%@ quota cleared early":"%@のクォータが早期にクリアされました","You're back to %lld%%.":"%lld%%に戻りました。","%1$@'s %2$@ reset %3$@ early. %4$@":"%1$@の%2$@が%3$@早くリセットされました。%4$@","%1$@ cleared your %2$@ %3$@ before its reset. %4$@":"%1$@がリセットの%3$@前にあなたの%2$@をクリアしました。%4$@","%lldh":"%lld時間","%@ limit":"%@の上限","5-hour limit":"5時間の上限","weekly limit":"週間の上限","Opus weekly limit":"Opusの週間上限","Sonnet weekly limit":"Sonnetの週間上限","weekly":"週間","Opus weekly":"Opus週間","Sonnet weekly":"Sonnet週間","5-hour usage":"5時間の使用量","weekly usage":"週間の使用量","Opus weekly usage":"Opus週間使用量","Sonnet weekly usage":"Sonnet週間使用量","%lld available":"%lld件利用可能","%lld usable now":"%lld件が今すぐ使用可能","next %1$@ lands %2$@":"次の%1$@は%2$@に付与","latest %1$@ granted %2$@":"最新の%1$@は%2$@に付与済み","next expires %@":"次は%@に失効","A %1$@ lands %2$@.":"%1$@が%2$@に付与されます。","A %1$@ was added to your account %2$@.":"%1$@が%2$@にアカウントへ追加されました。","A %@ was added to your account.":"%@がアカウントに追加されました。","You have %lld available to use.":"%lld件利用可能です。","Codex banked a limit reset":"Codexが限度リセットを獲得しました","limit reset":"限度リセット","%@ reset":"%@リセット","daily":"日次","monthly":"月次","hourly":"時間ごと","just now":"たった今","%lldm ago":"%lld分前","%lldh ago":"%lld時間前","%lldd ago":"%lld日前","in under a minute":"1分以内","Input tokens reused from this provider's prompt cache today — not fresh input (arrow.down), not cache writes, and already priced at the cache-read rate inside the burned figure.":"今日このプロバイダーのプロンプトキャッシュから再利用された入力トークンです。新規入力(arrow.down)でもキャッシュ書き込みでもなく、消費額の数値の中ですでにキャッシュ読取レートで計上済みです。","%1$@ · %2$@ at 80%%":"%1$@ · %2$@が80%%到達","%1$@ · %2$@ limit reached":"%1$@ · %2$@が上限到達","Quota crossings (%1$lld%% and %2$lld%%)":"クォータ通知しきい値(%1$lld%%と%2$lld%%)","Privacy":"プライバシー","Anonymous usage statistics":"匿名の利用統計","Managed by the CodeBurn desktop app. Change it there under Settings → Privacy & data.":"CodeBurn デスクトップアプリで管理されています。設定 → プライバシーとデータで変更できます。","Optional usage statistics: the names of the models, tools and providers you use, with bucketed counts of how often each one came up, plus when the app is opened. A random install id, the app version and your country code travel with them. Never your prompts, your code, your project and file names, or exact amounts.":"任意の利用統計です:使用したモデル、ツール、プロバイダーの名前と、それぞれの出現回数を区分けした集計、およびアプリを開いた回数。これらにはランダムなインストールID、アプリのバージョン、国コードが付随します。プロンプト、コード、プロジェクト名やファイル名、正確な金額は一切含まれません。","Synced from cursor.com %@":"cursor.comから同期しました(%@)","Not synced from cursor.com yet":"cursor.comからはまだ同期していません","Cursor login expired, open Cursor to sign in again":"Cursorのサインインの有効期限が切れました。Cursorを開いてもう一度サインインしてください","Couldn't reach cursor.com, will retry":"cursor.comに接続できませんでした。再試行します","Couldn't read the usage export from cursor.com, will retry":"cursor.comの使用量エクスポートを読み取れませんでした。再試行します","Sync Cursor usage from cursor.com":"Cursorの使用量をcursor.comから同期","Downloads your own usage export with the Cursor app's login, at most once an hour.":"Cursorアプリのサインインで自分の使用量エクスポートをダウンロードします(1時間に最大1回)。","Turned off by CODEBURN_CURSOR_SYNC=0":"CODEBURN_CURSOR_SYNC=0によりオフになっています","Couldn't save the setting: config.json is invalid or locked":"設定を保存できませんでした。config.jsonが無効か、ロックされています"},"ko":{"US Dollar":"미국 달러","British Pound":"영국 파운드","Euro":"유로","Australian Dollar":"호주 달러","Canadian Dollar":"캐나다 달러","New Zealand Dollar":"뉴질랜드 달러","Japanese Yen":"일본 엔","Chinese Yuan":"중국 위안","Swiss Franc":"스위스 프랑","Indian Rupee":"인도 루피","Brazilian Real":"브라질 헤알","Swedish Krona":"스웨덴 크로나","Singapore Dollar":"싱가포르 달러","Hong Kong Dollar":"홍콩 달러","South Korean Won":"대한민국 원","Mexican Peso":"멕시코 페소","South African Rand":"남아공 랜드","Danish Krone":"덴마크 크로네","Romanian Leu":"루마니아 레우","All":"전체","Plan":"요금제","Trend":"추세","Forecast":"예측","Calendar":"캘린더","Pulse":"효율","Stats":"통계","Optimize":"최적화","Today":"오늘","7D":"7일","30D":"30일","Month":"이번 달","6M":"6개월","Life":"전체 기간","Week":"이번 주","30 Days":"30일","6 Months":"6개월","Lifetime":"전체 기간","Local":"로컬","Combined":"통합","Ember":"엠버","Blue":"파랑","Purple":"보라","Pink":"분홍","Red":"빨강","Orange":"주황","Yellow":"노랑","Green":"초록","Graphite":"그래파이트","Older session logs may be unavailable.":"이전 세션 로그는 확인되지 않을 수 있습니다.","Session identities are unavailable across devices.":"세션 식별 정보는 기기 간에 공유되지 않습니다.","Session count unavailable":"세션 수 확인 불가","At least 1 session":"최소 1개 세션","At least %lld sessions":"최소 %lld개 세션","1 session":"1개 세션","%lld sessions":"%lld개 세션","Unavailable":"확인 불가","≥%lld sess":"≥%lld개 세션","%lld sess":"%lld개 세션","Connect":"연결","Reconnect":"재연결","Add API Key":"API 키 추가","now":"지금","%1$lldd %2$lldh":"%1$lld일 %2$lld시간","%1$lldh %2$lldm":"%1$lld시간 %2$lld분","%lldm":"%lld분","Auto (2m, less on battery)":"자동 (2분, 배터리 사용 시 느려짐)","Manual":"수동","1 minute":"1분","5 minutes":"5분","15 minutes":"15분","2 minutes":"2분","Liquid Glass":"리퀴드 글래스","Circle":"원형","Squircle":"스퀴클","Installed app or CLI":"설치된 앱 또는 CLI","OAuth":"OAuth","API or cloud credentials":"API 또는 클라우드 자격 증명","Browser session":"브라우저 세션","Localhost service":"로컬 서비스","No sign-in required":"로그인 불필요","Enter an API key or token below, then press Save & Connect.":"아래에 API 키 또는 토큰을 입력한 다음 “저장 및 연결”을 누르세요.","Sign in to %@ in a supported browser, then click Retry.":"지원되는 브라우저에서 %@에 로그인한 다음 “재시도”를 클릭하세요.","Sign in with the %@ app or CLI, then click Retry.":"%@ 앱 또는 CLI로 로그인한 다음 “재시도”를 클릭하세요.","Sign in with Cline, or enter a ClinePass API key below, then click Retry.":"Cline으로 로그인하거나 아래에 ClinePass API 키를 입력한 다음 “재시도”를 클릭하세요.","Complete %@ OAuth, then click Retry.":"%@ OAuth 인증을 완료한 다음 “재시도”를 클릭하세요.","Start the local %@ service, then click Retry.":"로컬 %@ 서비스를 실행한 다음 “재시도”를 클릭하세요.","Enter the required API or cloud credentials below, then press Save & Connect.":"아래에 필요한 API 또는 클라우드 자격 증명을 입력한 다음 “저장 및 연결”을 누르세요.","No sign-in is required. Click Retry to refresh quota.":"로그인이 필요하지 않습니다. “재시도”를 클릭해 할당량을 새로고침하세요.","Add an API key or token in Provider Settings.":"제공업체 설정에서 API 키 또는 토큰을 추가하세요.","Add the required API or cloud credentials in Provider Settings.":"제공업체 설정에서 필요한 API 또는 클라우드 자격 증명을 추가하세요.","Reconnect %@":"%@ 재연결","Claude Code credentials need to be refreshed.":"Claude Code 자격 증명을 갱신해야 합니다.","Open Claude Code in your terminal and type `/login`, then click Reconnect.":"터미널에서 Claude Code를 열고 `/login`을 입력한 다음 “재연결”을 클릭하세요.","Codex credentials need to be refreshed.":"Codex 자격 증명을 갱신해야 합니다.","Run `codex login` in your terminal, then click Reconnect.":"터미널에서 `codex login`을 실행한 다음 “재연결”을 클릭하세요.","Kimi Code credentials need to be refreshed.":"Kimi Code 자격 증명을 갱신해야 합니다.","Run the Kimi CLI once to refresh your login, then click Reconnect.":"Kimi CLI를 한 번 실행해 로그인을 갱신한 다음 “재연결”을 클릭하세요.","Gemini credentials need to be refreshed.":"Gemini 자격 증명을 갱신해야 합니다.","Run the Gemini CLI once to refresh your login, then click Reconnect.":"Gemini CLI를 한 번 실행해 로그인을 갱신한 다음 “재연결”을 클릭하세요.","Copilot credentials need to be refreshed.":"Copilot 자격 증명을 갱신해야 합니다.","Sign in with the Copilot CLI, an editor plugin, or `gh auth login`, then click Reconnect.":"Copilot CLI, 에디터 플러그인 또는 `gh auth login`으로 로그인한 다음 “재연결”을 클릭하세요.","The local Antigravity service is unavailable.":"로컬 Antigravity 서비스를 사용할 수 없습니다.","Start the Antigravity app, then click Reconnect.":"Antigravity 앱을 실행한 다음 “재연결”을 클릭하세요.","%@ credentials need to be refreshed.":"%@ 자격 증명을 갱신해야 합니다.","Sign in to %@ again, then retry.":"%@에 다시 로그인한 다음 재시도하세요.","No Copilot credentials found":"Copilot 자격 증명을 찾을 수 없음","Sign in via an editor's Copilot plugin first. Then click Try Again.":"먼저 에디터의 Copilot 플러그인으로 로그인한 다음 “다시 시도”를 클릭하세요.","Copilot quota tracking disconnected":"Copilot 할당량 추적 연결 끊김","Your Copilot credentials are untouched. Click Connect to resume.":"Copilot 자격 증명은 그대로 유지됩니다. “연결”을 클릭해 다시 시작하세요.","Usage tracking still works. For live quota, sign in with the Copilot CLI or gh auth login, or paste a token below, then click Connect.":"사용량 추적은 계속 작동합니다. 실시간 할당량을 보려면 Copilot CLI나 gh auth login으로 로그인하거나 아래에 토큰을 붙여넣은 다음 “연결”을 클릭하세요.","Quota tracking disconnected. Credentials are untouched. Click Connect to resume.":"할당량 추적 연결이 끊겼습니다. 자격 증명은 그대로 유지됩니다. “연결”을 클릭해 다시 시작하세요.","Grok Bot is not installed. Install the Grok Bot app, then click Retry.":"Grok Bot이 설치되어 있지 않습니다. Grok Bot 앱을 설치한 다음 “재시도”를 클릭하세요.","Sign in to the Cursor app with the account Grok Bot uses, then click Retry.":"Grok Bot이 사용하는 계정으로 Cursor 앱에 로그인한 다음 “재시도”를 클릭하세요.","Cursor rejected the current app session. Sign in again, then click Retry.":"Cursor가 현재 앱 세션을 거부했습니다. 다시 로그인한 다음 “재시도”를 클릭하세요.","Could not read the Cursor app's local session data. Quit and reopen Cursor, then click Retry.":"Cursor 앱의 로컬 세션 데이터를 읽을 수 없습니다. Cursor를 종료 후 다시 연 다음 “재시도”를 클릭하세요.","This account has no included Grok Bot allowance.":"이 계정에는 포함된 Grok Bot 사용 한도가 없습니다.","Grok Bot usage is drawn from a pooled enterprise allowance, which has no per-account reading.":"Grok Bot 사용량은 공동 기업 한도에서 차감되며, 계정별 수치는 확인할 수 없습니다.","Cursor rate-limited the quota request.":"Cursor가 할당량 요청을 제한했습니다.","Grok Bot quota is temporarily unavailable.":"Grok Bot 할당량을 일시적으로 확인할 수 없습니다.","Cursor returned an unrecognized Grok Bot quota response.":"Cursor가 인식할 수 없는 Grok Bot 할당량 응답을 반환했습니다.","Network error fetching Grok Bot quota.":"Grok Bot 할당량을 가져오는 중 네트워크 오류가 발생했습니다.","Update Check Failed":"업데이트 확인 실패","CLI Update Failed":"CLI 업데이트 실패","Menubar Update Failed":"메뉴바 앱 업데이트 실패","CodeBurn could not check for updates.":"CodeBurn이 업데이트를 확인하지 못했습니다.","CodeBurn could not update the CLI.":"CodeBurn이 CLI를 업데이트하지 못했습니다.","CodeBurn could not update the menubar app.":"CodeBurn이 메뉴바 앱을 업데이트하지 못했습니다.","Click to retry the update check.":"클릭하면 업데이트 확인을 재시도합니다.","Click to retry the update.":"클릭하면 업데이트를 재시도합니다.","Updating...":"업데이트 중...","Update":"업데이트","Update the CLI and menubar to the latest release":"CLI와 메뉴바 앱을 최신 버전으로 업데이트","Desktop Update Failed":"데스크톱 앱 업데이트 실패","CodeBurn could not update the desktop app.":"CodeBurn이 데스크톱 앱을 업데이트하지 못했습니다.","Updating CLI...":"CLI 업데이트 중...","Updating menubar...":"메뉴바 앱 업데이트 중...","Opening CodeBurn to update...":"업데이트를 위해 CodeBurn 여는 중...","Update the CLI, menubar and desktop app to the latest release":"CLI, 메뉴바 앱, 데스크톱 앱을 최신 버전으로 업데이트","CodeBurn %@ available":"CodeBurn %@ 사용 가능","App and CLI %@ updates are ready. Click to install.":"앱과 CLI %@ 업데이트가 준비되었습니다. 클릭하면 설치합니다.","Click to install the update.":"클릭하면 업데이트를 설치합니다.","CodeBurn CLI %@ available":"CodeBurn CLI %@ 사용 가능","Could not find the package manager for %1$@. Run “%2$@” manually, then try again.":"%1$@에 맞는 패키지 관리자를 찾을 수 없습니다. “%2$@”를 직접 실행한 다음 다시 시도하세요.","the CLI":"CLI","This codeburn CLI comes with the CodeBurn desktop app. Update the desktop app, then try again.":"이 codeburn CLI는 CodeBurn 데스크톱 앱에 포함되어 있습니다. 데스크톱 앱을 업데이트한 다음 다시 시도하세요.","npm does not have permission to update the global codeburn install. Run “%@” in Terminal, then try again.":"npm에 전역 codeburn 설치를 업데이트할 권한이 없습니다. 터미널에서 “%@”를 실행한 다음 다시 시도하세요.","CLI update failed (exit %lld)":"CLI 업데이트 실패 (종료 코드 %lld)","Your codeburn CLI (%1$@) is too old to update the menubar. Run “%2$@” first, then try again.":"codeburn CLI(%1$@) 버전이 너무 오래되어 메뉴바를 업데이트할 수 없습니다. 먼저 “%2$@”를 실행한 다음 다시 시도하세요.","Update failed (exit %lld)":"업데이트 실패 (종료 코드 %lld)","GitHub returned HTTP %lld.":"GitHub가 HTTP %lld를 반환했습니다.","No mac-v release with a menubar zip and checksum was found.":"메뉴바 zip과 체크섬이 포함된 mac-v 릴리스를 찾을 수 없습니다.","Terminal (macOS default)":"터미널 (macOS 기본)","%@ credits":"%@ 크레딧","CodeBurn %1$@ · %2$lld of %3$lld devices reporting":"CodeBurn %1$@ · %3$lld대 중 %2$lld대 기기 보고 중","Settings…":"설정…","Capacity Dock Settings…":"캐퍼시티 독 설정…","Refresh Now":"지금 새로고침","Check for Updates":"업데이트 확인","About CodeBurn":"CodeBurn 정보","Quit CodeBurn":"CodeBurn 종료","Today · no usage yet":"오늘 · 아직 사용량 없음","1 call":"1회 호출","%lld calls":"%lld회 호출","Today · %1$@ · %2$@":"오늘 · %1$@ · %2$@","CodeBurn Settings":"CodeBurn 설정","Update Available":"업데이트 가능","%1$@ is available (you have %2$@).":"%1$@ 버전이 나왔습니다 (현재 %2$@).","%1$@ Your codeburn CLI is too old to install it. First run:\n\n%2$@\n\nthen:\n\ncodeburn menubar --force":"%1$@ codeburn CLI 버전이 너무 오래되어 설치할 수 없습니다. 먼저 다음을 실행하세요:\n\n%2$@\n\n그다음:\n\ncodeburn menubar --force","%@ Run:\n\ncodeburn menubar --force":"%@ 다음을 실행하세요:\n\ncodeburn menubar --force","Up to Date":"최신 버전","You're on the latest version (%@).":"최신 버전(%@)을 사용하고 있습니다.","OK":"확인","This total may be incomplete.":"이 합계는 정확하지 않을 수 있습니다.","Claude config":"Claude 설정","No %1$@ data for %2$@":"%2$@의 %1$@ 데이터 없음","Couldn't load %@":"%@을(를) 불러올 수 없음","Retry":"재시도","Loading %@…":"%@ 불러오는 중…","Your AI Bill, Itemized":"AI 사용 내역, 항목별로","%1$@ over limit (%2$lld%%)":"%1$@ 한도 초과 (%2$lld%%)","resets in %@":"%@ 후 초기화","Change accent color":"강조 색상 변경","Copy update command to clipboard":"업데이트 명령어를 클립보드에 복사","Enjoying CodeBurn?":"CodeBurn이 마음에 드시나요?","Star us on GitHub":"GitHub에서 스타를 눌러주세요","Hide this banner":"이 배너 숨기기","CSV (folder)":"CSV (폴더)","JSON":"JSON","Export":"내보내기","Full Report":"전체 리포트","%@ call":"%@회 호출","%@ calls":"%@회 호출","Daily budget of %@ exceeded":"일일 예산 %@ 초과","Combined unavailable · showing local":"통합 데이터 없음 · 로컬 데이터 표시","Combined · %@":"통합 · %@","Saved %@ with local models":"로컬 모델로 %@ 절약","%1$lld of %2$lld devices":"%2$lld대 중 %1$lld대 기기","%@ · local":"%@ · 로컬","Clear":"지우기","Done":"완료","Pick dates":"날짜 선택","1 day":"1일","%lld days":"%lld일","Show previous providers":"이전 제공업체 보기","Show next providers":"다음 제공업체 보기","Loading…":"불러오는 중…","Sign in with `codex` (ChatGPT mode) to track quota.":"할당량을 추적하려면 `codex`(ChatGPT 모드)로 로그인하세요.","Sign in to Claude Code to track quota.":"할당량을 추적하려면 Claude Code에 로그인하세요.","Sign in to track quota.":"할당량을 추적하려면 로그인하세요.","%@ usage":"%@ 사용량","stale":"오래됨","retrying":"재시도 중","Activity":"활동","Cost":"비용","Turns":"턴 수","1-shot":"단번 성공","Models":"모델","Saved":"절약","Calls":"호출","Tokens":"토큰","%@ in":"입력 %@","%@ out":"출력 %@","%1$@ in · %2$@ out · %3$@ cache read":"입력 %1$@ · 출력 %2$@ · 캐시 읽기 %3$@","%@%% cache hit":"캐시 적중률 %@%%","1 model unpriced, counted at $0 · %@ tokens":"모델 1개 가격 미정, $0으로 계산 · %@ 토큰","%1$lld models unpriced, counted at $0 · %2$@ tokens":"모델 %1$lld개 가격 미정, $0으로 계산 · %2$@ 토큰","~ estimated cost (priced from estimated tokens)":"~ 추정 비용(추정 토큰 수로 산출)","Pull requests":"풀 리퀘스트","Tooling":"도구","Tools":"도구","Skills & Agents":"스킬 & 에이전트","MCP Servers":"MCP 서버","Tips for you":"맞춤 팁","%lld signals":"신호 %lld개","Open Full Optimize":"전체 최적화 열기","Cache hit at %lld%% — most prompts reuse cache":"캐시 적중률 %lld%% — 대부분의 프롬프트가 캐시를 재사용함","%lld%% one-shot — edits landing first try":"단번 성공률 %lld%% — 편집이 대부분 한 번에 성공함","Spend down %lld%% vs last 7 days":"지난 7일 대비 지출 %lld%% 감소","%lld-day usage streak":"%lld일 연속 사용","Spend up %lld%% vs prior 7 days":"이전 7일 대비 지출 %lld%% 증가","Cache hit only %lld%% — paying for cold prompts":"캐시 적중률 %lld%%에 불과 — 콜드 프롬프트 비용 발생 중","%lld%% one-shot — lots of iteration":"단번 성공률 %lld%% — 반복 수정이 많음","On pace for %1$@ this month (+%2$lld%% vs last)":"이번 달 예상 %1$@ (지난달 대비 +%2$lld%%)","What's working":"잘되고 있는 점","What to improve":"개선할 점","Risks":"위험 요소","Last %lld days":"최근 %lld일","%1$@%% vs prior %2$lldd":"%1$@%% (이전 %2$lld일 대비)","Avg/day":"일평균","Peak":"최고치","Yesterday":"어제","Total":"합계","%@ tokens":"%@ 토큰","%1$@ on %2$@":"%1$@ (%2$@)","Daily activity":"일별 활동","%lld active days":"활동일 %lld일","Peak day":"최고치 일자","Avg active":"활동일 평균","Streak":"연속 기록","%lldd":"%lld일","Mon":"월","Wed":"수","Fri":"금","Sun":"일","Daily detail":"일별 상세","Hover a day":"날짜 위에 마우스를 올려보세요","Future day":"미래 날짜","No tracked usage":"추적된 사용량 없음","%@: future day":"%@: 미래 날짜","%@: no tracked usage":"%@: 추적된 사용량 없음","%1$@: %2$@, %3$lld calls, %4$@ tokens":"%1$@: %2$@, %3$lld회 호출, %4$@ 토큰","Month-to-date":"이번 달 누계","On pace for":"예상치","Avg/day (this wk)":"일평균 (이번 주)","Last 7d":"최근 7일","no prior month":"이전 달 데이터 없음","%1$@%% vs last month (%2$@)":"%1$@%% (지난달 %2$@ 대비)","Cache hit":"캐시 적중","Cost / session":"세션당 비용","Cost/edit":"편집당 비용","Save ~%1$@ / ~%2$@ tokens · 1 finding":"약 %1$@ / 약 %2$@ 토큰 절약 가능 · 발견 사항 1건","Save ~%1$@ / ~%2$@ tokens · %3$lld findings":"약 %1$@ / 약 %2$@ 토큰 절약 가능 · 발견 사항 %3$lld건","Favorite model":"가장 많이 쓴 모델","Active days (month)":"활동일 (이번 달)","Most active day":"가장 활발한 날","Peak day spend":"최고치 일자 지출","Sessions":"세션","Current streak":"현재 연속 기록","Longest streak":"최장 연속 기록","Tracked spend (last %lld days)":"추적된 지출 (최근 %lld일)","Costliest session":"가장 비용이 큰 세션","Retry tax":"재시도 비용","%1$lld retries across %2$lld retried edits":"재시도한 편집 %2$lld건에서 재시도 %1$lld회","%@ ret/edit":"편집당 재시도 %@회","Hides session details":"세션 상세 정보 숨기기","Shows session details":"세션 상세 정보 표시","Expanded":"펼침","Collapsed":"접힘"," %lld call":" %lld회 호출"," %lld calls":" %lld회 호출","Potential savings":"절약 가능 금액","%lld%% of spend":"지출의 %lld%%","could be optimized":"최적화 가능","Routing waste":"라우팅 낭비","vs %1$@ @ %2$@/edit":"%1$@ 대비 (편집당 %2$@)","Connect Claude subscription":"Claude 구독 연결","CodeBurn will read your Claude Code credentials once. macOS will ask permission. After that, the live quota bar shows next to the Claude tab and updates automatically.":"CodeBurn이 Claude Code 자격 증명을 한 번 읽습니다. macOS가 권한을 요청합니다. 이후 Claude 탭 옆에 실시간 할당량 막대가 표시되고 자동으로 업데이트됩니다.","Reading Claude credentials...":"Claude 자격 증명 읽는 중...","No Claude credentials found":"Claude 자격 증명을 찾을 수 없음","Sign in with Claude Code first: open `claude` in your terminal and type `/login`. Then click Try Again.":"먼저 Claude Code로 로그인하세요: 터미널에서 `claude`를 열고 `/login`을 입력한 다음 “다시 시도”를 클릭하세요.","Anthropic temporarily unreachable. Retrying.":"Anthropic에 일시적으로 연결할 수 없습니다. 재시도 중입니다.","Reconnect Claude":"Claude 재연결","Your Claude session has expired. Open Claude Code in your terminal and type `/login`, then click Reconnect.":"Claude 세션이 만료되었습니다. 터미널에서 Claude Code를 열고 `/login`을 입력한 다음 “재연결”을 클릭하세요.","Resets %@":"초기화: %@","5-hour window":"5시간 창","7-day total":"7일 합계","7-day Opus":"7일 Opus","7-day Sonnet":"7일 Sonnet","7-day %@":"7일 %@","Try Again":"다시 시도","Couldn't load plan data":"요금제 데이터를 불러올 수 없음","Connect ChatGPT subscription":"ChatGPT 구독 연결","CodeBurn will read your Codex CLI credentials once. After that, the live quota bar shows next to the Codex tab and updates automatically.":"CodeBurn이 Codex CLI 자격 증명을 한 번 읽습니다. 이후 Codex 탭 옆에 실시간 할당량 막대가 표시되고 자동으로 업데이트됩니다.","Reading Codex CLI credentials...":"Codex CLI 자격 증명 읽는 중...","No Codex credentials found":"Codex 자격 증명을 찾을 수 없음","Sign in with Codex first: run `codex login` in your terminal. Then click Try Again.":"먼저 Codex로 로그인하세요: 터미널에서 `codex login`을 실행한 다음 “다시 시도”를 클릭하세요.","ChatGPT temporarily unreachable. Retrying.":"ChatGPT에 일시적으로 연결할 수 없습니다. 재시도 중입니다.","Reconnect Codex":"Codex 재연결","Your ChatGPT session has expired. Run `codex login` in your terminal, then click Reconnect.":"ChatGPT 세션이 만료되었습니다. 터미널에서 `codex login`을 실행한 다음 “재연결”을 클릭하세요.","%@ window":"%@ 창","Credits":"크레딧","Unlimited":"무제한","Limit resets":"한도 초기화","No Kimi Code credentials found":"Kimi Code 자격 증명을 찾을 수 없음","Sign in with the Kimi CLI first. Then click Try Again.":"먼저 Kimi CLI로 로그인한 다음 “다시 시도”를 클릭하세요.","Reading Kimi Code credentials...":"Kimi Code 자격 증명 읽는 중...","Kimi temporarily unreachable. Retrying.":"Kimi에 일시적으로 연결할 수 없습니다. 재시도 중입니다.","Refresh Kimi Code login":"Kimi Code 로그인 갱신","Kimi Code tokens are short-lived. Run the Kimi CLI once to refresh your login, then click Reconnect.":"Kimi Code 토큰은 수명이 짧습니다. Kimi CLI를 한 번 실행해 로그인을 갱신한 다음 “재연결”을 클릭하세요.","Parallel sessions":"동시 세션","Login idle. Run the Kimi CLI to refresh.":"로그인이 대기 중입니다. Kimi CLI를 실행해 갱신하세요.","as of %@":"%@ 기준","No Gemini credentials found":"Gemini 자격 증명을 찾을 수 없음","Sign in with the Gemini CLI first. Then click Try Again.":"먼저 Gemini CLI로 로그인한 다음 “다시 시도”를 클릭하세요.","Reading Gemini credentials...":"Gemini 자격 증명 읽는 중...","Gemini temporarily unreachable. Retrying.":"Gemini에 일시적으로 연결할 수 없습니다. 재시도 중입니다.","Refresh Gemini login":"Gemini 로그인 갱신","Your Gemini login has expired. Run the Gemini CLI once to refresh it, then click Reconnect.":"Gemini 로그인이 만료되었습니다. Gemini CLI를 한 번 실행해 갱신한 다음 “재연결”을 클릭하세요.","Login idle. Run the Gemini CLI to refresh.":"로그인이 대기 중입니다. Gemini CLI를 실행해 갱신하세요.","Reading Copilot credentials...":"Copilot 자격 증명 읽는 중...","GitHub temporarily unreachable. Retrying.":"GitHub에 일시적으로 연결할 수 없습니다. 재시도 중입니다.","Refresh Copilot login":"Copilot 로그인 갱신","Your Copilot sign-in has expired. Sign in via an editor's Copilot plugin again, then click Reconnect.":"Copilot 로그인이 만료되었습니다. 에디터의 Copilot 플러그인으로 다시 로그인한 다음 “재연결”을 클릭하세요.","Login idle. Sign in via an editor's Copilot plugin to refresh.":"로그인이 대기 중입니다. 에디터의 Copilot 플러그인으로 로그인해 갱신하세요.","No local Antigravity server found":"로컬 Antigravity 서버를 찾을 수 없음","Start the Antigravity app, then click Try Again.":"Antigravity 앱을 실행한 다음 “다시 시도”를 클릭하세요.","Probing the local Antigravity server...":"로컬 Antigravity 서버 확인 중...","Local Antigravity server unreachable. Retrying.":"로컬 Antigravity 서버에 연결할 수 없습니다. 재시도 중입니다.","Reconnect Antigravity":"Antigravity 재연결","Server disconnected. Start the Antigravity app to refresh.":"서버 연결이 끊겼습니다. Antigravity 앱을 실행해 갱신하세요.","On pace":"예상 순항","On pace: %@ at reset":"예상 순항: 초기화 시점 %@","%@%% in deficit":"%@%% 초과","%@%% in reserve":"%@%% 여유","%1$@ · hits 100%% %2$@":"%1$@ · %2$@에 100%% 도달","%1$@ · %2$@ at reset":"%1$@ · 초기화 시점 %2$@","On pace: %1$@ at reset · hits 100%% %2$@":"예상 순항: 초기화 시점 %1$@ · %2$@에 100%% 도달","Based on last cycle: %@":"지난 주기 기준: %@","in %lldm":"%lld분 후","in %lldh":"%lld시간 후","in %lldd":"%lld일 후","Dock to Edge":"화면 가장자리에 고정","Left":"왼쪽","Right":"오른쪽","Top":"위쪽","Bottom":"아래쪽","Hide Capacity Dock":"캐퍼시티 독 숨기기","Capacity Dock":"캐퍼시티 독","Unknown":"알 수 없음","Click to keep Capacity Dock expanded":"클릭하면 캐퍼시티 독을 펼친 상태로 유지합니다","Click to switch between this provider's usage windows":"클릭하면 이 제공업체의 사용량 기간을 전환합니다","Show %@ usage":"%@ 사용량 표시","none running":"실행 중 없음","Kimi Code":"Kimi Code","Gemini":"Gemini","Copilot":"Copilot","Antigravity":"Antigravity","1 running":"1개 실행 중","%lld running":"%lld개 실행 중","%@ left":"%@ 남음","Open in %@":"%@에서 열기","Bring %@ to front":"%@ 앞으로 가져오기","burned":"소진됨","today %1$@ of %2$@":"오늘 %2$@ 중 %1$@","no budget set":"설정된 예산 없음","Refreshing…":"새로고침 중…","Last known usage · refreshing":"마지막 확인된 사용량 · 새로고침 중","Last known usage · retrying":"마지막 확인된 사용량 · 재시도 중","Not connected":"연결되지 않음","Reconnect required":"재연결 필요","General":"일반","Providers":"제공업체","%lld on":"%lld개 켜짐","About":"정보","Settings":"설정","Search providers":"제공업체 검색","Enter an amount above, or the alert stays off.":"위에 금액을 입력하지 않으면 알림이 꺼진 상태로 유지됩니다.","Flame icon turns yellow when today's tokens pass the daily budget.":"오늘 사용한 토큰이 일일 예산을 초과하면 불꽃 아이콘이 노란색으로 바뀝니다.","Flame icon turns yellow when today's cost pass the daily budget.":"오늘 사용한 비용이 일일 예산을 초과하면 불꽃 아이콘이 노란색으로 바뀝니다.","Display":"표시","Currency":"통화","Metric":"지표","Cost ($)":"비용 ($)","Tokens (↑↓)":"토큰 (↑↓)","Total Tokens":"총 토큰","Credits (Codex)":"크레딧 (Codex)","Icon Only":"아이콘만","Period":"기간","Scope":"범위","Accent":"강조 색상","Usage Refresh":"사용량 새로고침","Update every":"업데이트 주기","How often the menubar figure re-reads your local session data. Auto refreshes every 30 seconds while you're plugged in and backs off on battery; Manual only refreshes when you open the popover or click Refresh Now.":"메뉴바 숫자가 로컬 세션 데이터를 다시 읽는 주기입니다. “자동”은 전원에 연결된 동안 30초마다 새로고침하며 배터리 사용 시 느려지고, “수동”은 팝오버를 열거나 “지금 새로고침”을 클릭할 때만 새로고침합니다.","Updates":"업데이트","Notify me about updates":"업데이트 알림 받기","Posts a notification when a new CodeBurn release is available. Click it to install.":"새 CodeBurn 버전이 나오면 알림을 보냅니다. 알림을 클릭하면 설치됩니다.","Terminal":"터미널","Open commands in":"명령어를 여는 방법","%@ (not installed)":"%@ (설치되지 않음)","Where Full Report and Optimize open. If the chosen app isn't installed CodeBurn falls back to Terminal; if that's missing too the command runs in the background. Only terminals that can script a command into a live window are listed.":"“전체 리포트”와 “최적화”가 열리는 위치입니다. 선택한 앱이 설치되어 있지 않으면 CodeBurn은 터미널로 대체하며, 터미널마저 없으면 명령어가 백그라운드에서 실행됩니다. 실행 중인 창에 명령어를 전달할 수 있는 터미널만 목록에 표시됩니다.","Alerts":"알림","Daily budget":"일일 예산","Off":"끄기","Custom…":"사용자 지정…","Amount":"금액","M tokens":"백만 토큰","Show Capacity Dock":"캐퍼시티 독 표시","Resting provider":"기본 제공업체","Size":"크기","Capacity Dock size":"캐퍼시티 독 크기","Appearance":"모양","Gauge shape":"게이지 모양","Dock providers":"독에 표시할 제공업체","Connect a provider from its sidebar page to make it available here.":"사이드바 페이지에서 제공업체를 연결하면 여기에 표시됩니다.","Needs attention":"확인 필요","Connected providers and anything already shown in the dock appear here, so a provider can always be removed even if its connection later fails.":"연결된 제공업체와 이미 독에 표시 중인 항목이 여기에 나타나므로, 이후 연결이 실패하더라도 언제든 제거할 수 있습니다.","Connection":"연결","Config Directories":"설정 디렉터리","Aggregate usage across multiple Claude config directories (e.g. work and personal accounts). Leave empty to track just the default `~/.claude`. The `CLAUDE_CONFIG_DIRS` environment variable, if set, overrides this list.":"여러 Claude 설정 디렉터리(예: 업무용과 개인용 계정)의 사용량을 합산합니다. 비워두면 기본값인 `~/.claude`만 추적합니다. `CLAUDE_CONFIG_DIRS` 환경 변수가 설정되어 있으면 이 목록보다 우선합니다.","Quota Refresh":"할당량 새로고침","Anthropic rate-limits this endpoint per account. 2 minutes is plenty for the 5-hour and weekly windows; pick Manual if you only want updates on demand.":"Anthropic은 계정별로 이 엔드포인트를 제한합니다. 5시간 및 주간 창에는 2분이면 충분하며, 필요할 때만 업데이트하려면 “수동”을 선택하세요.","Connected":"연결됨","Backing off":"대기 중","Connecting…":"연결 중…","Ready":"준비됨","Plan: %@":"요금제: %@","Live quota tracked from Anthropic.":"Anthropic에서 실시간 할당량을 추적 중입니다.","Anthropic rate-limited; auto-retrying.":"Anthropic이 요청을 제한했습니다. 자동으로 재시도합니다.","macOS may ask permission to read your credentials.":"macOS가 자격 증명 읽기 권한을 요청할 수 있습니다.","Background refresh in progress.":"백그라운드 새로고침 진행 중입니다.","Tap Load Quota to fetch live usage from Anthropic.":"“할당량 불러오기”를 눌러 Anthropic에서 실시간 사용량을 가져오세요.","Click Connect to read your Claude Code credentials and start tracking quota.":"“연결”을 클릭해 Claude Code 자격 증명을 읽고 할당량 추적을 시작하세요.","Disconnect":"연결 해제","Disconnect Claude?":"Claude 연결을 해제할까요?","Cancel":"취소","CodeBurn will stop tracking quota and clear its connection state plus any legacy credential cache. Your Claude Code credential is untouched. Claude Code keeps working.":"CodeBurn이 할당량 추적을 중단하고 연결 상태와 이전 자격 증명 캐시를 모두 지웁니다. Claude Code 자격 증명은 그대로 유지되며 Claude Code는 계속 작동합니다.","Load Quota":"할당량 불러오기","No extra directories. Tracking the default `~/.claude`.":"추가 디렉터리가 없습니다. 기본값인 `~/.claude`를 추적 중입니다.","Remove":"제거","Add Directory…":"디렉터리 추가…","Add":"추가","Choose one or more Claude config directories (each containing a `projects` folder).":"`projects` 폴더가 포함된 Claude 설정 디렉터리를 하나 이상 선택하세요.","Codex live-quota tracking follows the authoritative `~/.codex/auth.json` session directly and does not create a second Keychain copy. A legacy CodeBurn Keychain item, when present, is read only as a migration fallback. Only ChatGPT-mode auth (Plus / Pro / Team / Business / Edu / Enterprise) is supported. API-key users are billed per request and have a different reporting surface. Credit-metered workspaces report no rate-limit windows, so their monthly credit allowance is shown instead.":"Codex 실시간 할당량 추적은 기준이 되는 `~/.codex/auth.json` 세션을 직접 사용하며, 별도의 키체인 사본을 만들지 않습니다. 이전 버전의 CodeBurn 키체인 항목이 있다면 마이그레이션 폴백 용도로만 읽습니다. ChatGPT 모드 인증(Plus / Pro / Team / Business / Edu / Enterprise)만 지원됩니다. API 키 사용자는 요청 단위로 과금되며 리포트 방식이 다릅니다. 크레딧 기반 워크스페이스는 사용량 제한 창을 보고하지 않으므로 대신 월간 크레딧 한도가 표시됩니다.","How it works":"작동 방식","Couldn't load Codex quota":"Codex 할당량을 불러올 수 없음","Live quota tracked from chatgpt.com.":"chatgpt.com에서 실시간 할당량을 추적 중입니다.","Codex is in API-key mode. Run `codex login` and choose a ChatGPT plan to enable quota tracking.":"Codex가 API 키 모드입니다. `codex login`을 실행하고 ChatGPT 요금제를 선택하면 할당량 추적을 사용할 수 있습니다.","Run `codex login` in your terminal to sign in again, then click Reconnect.":"터미널에서 `codex login`을 실행해 다시 로그인한 다음 “재연결”을 클릭하세요.","ChatGPT rate-limited; auto-retrying.":"ChatGPT가 요청을 제한했습니다. 자동으로 재시도합니다.","Reading ~/.codex/auth.json.":"~/.codex/auth.json을 읽는 중입니다.","Tap Load Quota to fetch live usage from chatgpt.com.":"“할당량 불러오기”를 눌러 chatgpt.com에서 실시간 사용량을 가져오세요.","Click Connect to read your Codex CLI credentials. If Connect fails, run `codex login` in your terminal first to create ~/.codex/auth.json.":"“연결”을 클릭해 Codex CLI 자격 증명을 읽으세요. 연결이 실패하면 먼저 터미널에서 `codex login`을 실행해 ~/.codex/auth.json을 생성하세요.","Disconnect Codex?":"Codex 연결을 해제할까요?","CodeBurn will stop tracking quota and clear its connection state plus any legacy credential cache. Your ~/.codex/auth.json is untouched. Codex CLI keeps working.":"CodeBurn이 할당량 추적을 중단하고 연결 상태와 이전 자격 증명 캐시를 모두 지웁니다. ~/.codex/auth.json은 그대로 유지되며 Codex CLI는 계속 작동합니다.","Kimi Code live-quota tracking reads `~/.kimi-code/credentials/kimi-code.json` directly. Nothing is copied or stored. Access tokens are short-lived (~15 minutes) and only the Kimi CLI refreshes them, so if the connection shows as expired, run the Kimi CLI once and click Reconnect.":"Kimi Code 실시간 할당량 추적은 `~/.kimi-code/credentials/kimi-code.json`을 직접 읽으며, 아무것도 복사하거나 저장하지 않습니다. 액세스 토큰은 수명이 짧고(약 15분) Kimi CLI만 갱신할 수 있으므로, 연결이 만료된 것으로 표시되면 Kimi CLI를 한 번 실행한 다음 “재연결”을 클릭하세요.","Login refresh required":"로그인 갱신 필요","Couldn't load Kimi quota":"Kimi 할당량을 불러올 수 없음","Live quota tracked from api.kimi.com.":"api.kimi.com에서 실시간 할당량을 추적 중입니다.","Kimi rate-limited; auto-retrying.":"Kimi가 요청을 제한했습니다. 자동으로 재시도합니다.","Reading ~/.kimi-code credentials.":"~/.kimi-code 자격 증명을 읽는 중입니다.","Tap Load Quota to fetch live usage from api.kimi.com.":"“할당량 불러오기”를 눌러 api.kimi.com에서 실시간 사용량을 가져오세요.","Sign in with the Kimi CLI first, then click Connect.":"먼저 Kimi CLI로 로그인한 다음 “연결”을 클릭하세요.","Disconnect Kimi Code?":"Kimi Code 연결을 해제할까요?","CodeBurn will stop tracking Kimi Code quota. Your ~/.kimi-code credentials are untouched. The Kimi CLI keeps working.":"CodeBurn이 Kimi Code 할당량 추적을 중단합니다. ~/.kimi-code 자격 증명은 그대로 유지되며 Kimi CLI는 계속 작동합니다.","Gemini live-quota tracking reads `~/.gemini/oauth_creds.json` read-only. Nothing is copied or stored, and tokens stay in memory. If the connection shows as expired, run the Gemini CLI once to refresh your login, then click Reconnect.":"Gemini 실시간 할당량 추적은 `~/.gemini/oauth_creds.json`을 읽기 전용으로 읽으며, 아무것도 복사하거나 저장하지 않고 토큰은 메모리에만 유지됩니다. 연결이 만료된 것으로 표시되면 Gemini CLI를 한 번 실행해 로그인을 갱신한 다음 “재연결”을 클릭하세요.","Couldn't load Gemini quota":"Gemini 할당량을 불러올 수 없음","Live quota tracked from Google Code Assist.":"Google Code Assist에서 실시간 할당량을 추적 중입니다.","Gemini rate-limited; auto-retrying.":"Gemini가 요청을 제한했습니다. 자동으로 재시도합니다.","Reading ~/.gemini credentials.":"~/.gemini 자격 증명을 읽는 중입니다.","Tap Load Quota to fetch live usage from Google Code Assist.":"“할당량 불러오기”를 눌러 Google Code Assist에서 실시간 사용량을 가져오세요.","Sign in with the Gemini CLI first, then click Connect.":"먼저 Gemini CLI로 로그인한 다음 “연결”을 클릭하세요.","Disconnect Gemini?":"Gemini 연결을 해제할까요?","CodeBurn will stop tracking Gemini quota. Your ~/.gemini credentials are untouched. The Gemini CLI keeps working.":"CodeBurn이 Gemini 할당량 추적을 중단합니다. ~/.gemini 자격 증명은 그대로 유지되며 Gemini CLI는 계속 작동합니다.","Copilot live-quota tracking reads a GitHub token that is already on this Mac, read-only. Nothing is copied or stored. CodeBurn looks at the editor plugin files in `~/.config/github-copilot`, the Copilot CLI's `~/.copilot` files, the COPILOT_GITHUB_TOKEN, GH_TOKEN and GITHUB_TOKEN variables, `gh auth token`, and finally a token you paste below. Usage tracking works without any of this; only the live quota bars need a token. Every one of those carries the GitHub host it belongs to — the plugin files are keyed by host, the variables are read with GH_HOST, the `gh` login with the host in gh's own hosts.yml, and a pasted token with the host you type beside it — and a credential for a GitHub Enterprise Cloud host is queried on that tenant's own API (api..ghe.com), never sent to api.github.com.":"Copilot 실시간 할당량 추적은 이 Mac에 이미 있는 GitHub 토큰을 읽기 전용으로 읽으며, 아무것도 복사하거나 저장하지 않습니다. CodeBurn은 `~/.config/github-copilot`의 에디터 플러그인 파일, Copilot CLI의 `~/.copilot` 파일, COPILOT_GITHUB_TOKEN·GH_TOKEN·GITHUB_TOKEN 변수, `gh auth token`, 마지막으로 아래에 붙여넣는 토큰 순으로 확인합니다. 이 중 어느 것이 없어도 사용량 추적은 작동하며, 토큰은 실시간 할당량 막대에만 필요합니다. 이들 각각은 소속된 GitHub 호스트 정보를 함께 가집니다 — 플러그인 파일은 호스트별로 구분되고, 환경 변수는 GH_HOST와 함께 읽히며, `gh` 로그인은 gh 자체 hosts.yml의 호스트를 따르고, 붙여넣은 토큰은 옆에 입력한 호스트를 따릅니다 — 그리고 GitHub Enterprise Cloud 호스트의 자격 증명은 해당 테넌트 고유의 API(api..ghe.com)로만 조회되며 api.github.com으로는 절대 전송되지 않습니다.","GitHub token":"GitHub 토큰","GitHub host":"GitHub 호스트","Save & Connect":"저장 및 연결","Clear Token":"토큰 지우기","Paste a token":"토큰 붙여넣기","Optional, and only needed when nothing else on this Mac is signed in. A fine-grained personal access token with the \"Plan: Read-only\" permission is enough. Leave the host at github.com unless the token was minted on a GitHub Enterprise Cloud tenant, in which case enter that tenant's host (.ghe.com) so the token is never sent to api.github.com. Both are saved in CodeBurn's own Keychain item and are used only to read your Copilot quota.":"선택 사항이며, 이 Mac에 로그인된 다른 항목이 전혀 없을 때만 필요합니다. \"Plan: Read-only\" 권한을 가진 세분화된 개인 액세스 토큰이면 충분합니다. 호스트는 github.com으로 두되, 토큰이 GitHub Enterprise Cloud 테넌트에서 발급된 경우에는 해당 테넌트의 호스트(.ghe.com)를 입력해 토큰이 api.github.com으로 전송되지 않도록 하세요. 두 값 모두 CodeBurn 고유의 키체인 항목에 저장되며 Copilot 할당량을 읽는 데만 사용됩니다.","Couldn't load Copilot quota":"Copilot 할당량을 불러올 수 없음","Live quota tracked from %@.":"%@에서 실시간 할당량을 추적 중입니다.","Plan: %1$@. Live quota tracked from %2$@.":"요금제: %1$@. %2$@에서 실시간 할당량을 추적 중입니다.","Sign in again with the Copilot CLI, an editor's Copilot plugin, or gh auth login, then click Reconnect.":"Copilot CLI, 에디터의 Copilot 플러그인, 또는 gh auth login으로 다시 로그인한 다음 “재연결”을 클릭하세요.","GitHub rate-limited; auto-retrying.":"GitHub가 요청을 제한했습니다. 자동으로 재시도합니다.","Looking for a GitHub token on this Mac.":"이 Mac에서 GitHub 토큰을 찾는 중입니다.","Tap Load Quota to fetch live usage from GitHub.":"“할당량 불러오기”를 눌러 GitHub에서 실시간 사용량을 가져오세요.","Tap Load Quota to fetch live usage from %@.":"“할당량 불러오기”를 눌러 %@에서 실시간 사용량을 가져오세요.","CodeBurn cannot read Copilot quota for %@. Use github.com or a GitHub Enterprise Cloud host (*.ghe.com).":"CodeBurn이 %@의 Copilot 할당량을 읽을 수 없습니다. github.com 또는 GitHub Enterprise Cloud 호스트(*.ghe.com)를 사용하세요.","Disconnect Copilot?":"Copilot 연결을 해제할까요?","CodeBurn will stop tracking Copilot quota. Every credential it read stays untouched, and your Copilot clients keep working.":"CodeBurn이 Copilot 할당량 추적을 중단합니다. 읽었던 모든 자격 증명은 그대로 유지되며 Copilot 클라이언트는 계속 작동합니다.","Antigravity live-quota tracking talks to the Antigravity app's local language server on 127.0.0.1 only. Nothing leaves the machine and no credential files are read. If it shows as disconnected, start the Antigravity app, then click Reconnect.":"Antigravity 실시간 할당량 추적은 오직 127.0.0.1에서 Antigravity 앱의 로컬 언어 서버와만 통신합니다. 어떤 데이터도 이 기기를 벗어나지 않으며 자격 증명 파일도 읽지 않습니다. 연결 해제로 표시되면 Antigravity 앱을 실행한 다음 “재연결”을 클릭하세요.","Couldn't load Antigravity quota":"Antigravity 할당량을 불러올 수 없음","Live quota tracked from the local Antigravity server.":"로컬 Antigravity 서버에서 실시간 할당량을 추적 중입니다.","Local probe failed; auto-retrying.":"로컬 확인 실패. 자동으로 재시도합니다.","Probing the local Antigravity language server.":"로컬 Antigravity 언어 서버를 확인하는 중입니다.","Tap Load Quota to probe the local Antigravity server.":"“할당량 불러오기”를 눌러 로컬 Antigravity 서버를 확인하세요.","Start the Antigravity app first, then click Connect.":"먼저 Antigravity 앱을 실행한 다음 “연결”을 클릭하세요.","No local Antigravity server found. Start the Antigravity app, then click Reconnect.":"로컬 Antigravity 서버를 찾을 수 없습니다. Antigravity 앱을 실행한 다음 “재연결”을 클릭하세요.","Disconnect Antigravity?":"Antigravity 연결을 해제할까요?","CodeBurn will stop tracking Antigravity quota. Nothing is read from or written to disk. The Antigravity app keeps working.":"CodeBurn이 Antigravity 할당량 추적을 중단합니다. 디스크에서 읽거나 쓰는 내용이 전혀 없으며 Antigravity 앱은 계속 작동합니다.","Not yet supported":"아직 지원되지 않음","Automatic connection uses the provider's existing app, CLI, OAuth, browser session, or environment credentials first. CodeBurn does not copy those source credentials into its Keychain.":"자동 연결은 제공업체의 기존 앱, CLI, OAuth, 브라우저 세션 또는 환경 자격 증명을 먼저 사용합니다. CodeBurn은 이러한 원본 자격 증명을 자체 키체인으로 복사하지 않습니다.","Authentication methods are listed for reference. A native CodeBurn quota adapter is required before this provider can connect to Capacity Dock.":"인증 방식은 참고용으로 나열되어 있습니다. 이 제공업체가 캐퍼시티 독에 연결되려면 네이티브 CodeBurn 할당량 어댑터가 필요합니다.","Authentication methods":"인증 방식","Source":"출처","API key or token":"API 키 또는 토큰","Clear Override":"재정의 지우기","Loading saved provider credential":"저장된 제공업체 자격 증명 불러오는 중","Connection override":"연결 재정의","Overrides are optional and are saved only when you press Save & Connect. Secret values use one CodeBurn-owned Keychain item for this provider; background reads suppress authentication UI.":"재정의는 선택 사항이며 “저장 및 연결”을 눌러야만 저장됩니다. 비밀 값은 이 제공업체를 위한 CodeBurn 전용 키체인 항목 하나에 저장되며, 백그라운드 읽기 시에는 인증 UI가 표시되지 않습니다.","Remove saved override":"저장된 재정의 제거","Saved data":"저장된 데이터","This credential predates a live CodeBurn quota adapter and is not treated as a connection.":"이 자격 증명은 실시간 CodeBurn 할당량 어댑터보다 이전의 것이라 연결로 처리되지 않습니다.","Quota adapter not available":"할당량 어댑터 사용 불가","Retrying":"재시도 중","Cline login expired":"Cline 로그인 만료됨","%@ is catalogued, but CodeBurn cannot fetch its live quota yet.":"%@은(는) 등록되어 있지만 CodeBurn이 아직 실시간 할당량을 가져올 수 없습니다.","Live quota is available to Capacity Dock.":"캐퍼시티 독에서 실시간 할당량을 사용할 수 있습니다.","Waiting for quota data.":"할당량 데이터를 기다리는 중입니다.","Automatic":"자동","CLI":"CLI","API":"API","Version %@":"버전 %@","%@ is available. Choose Check for Updates in the CodeBurn menu to install it.":"%@ 버전이 나왔습니다. CodeBurn 메뉴에서 “업데이트 확인”을 선택해 설치하세요.","GitHub":"GitHub","Website":"웹사이트","Issues":"이슈","Links":"링크","© 2026 Resham Joshi (iamtoruk) · AgentSeal. MIT License.":"© 2026 Resham Joshi (iamtoruk) · AgentSeal. MIT 라이선스.","Second row":"두 번째 줄","Second row shows":"두 번째 줄에 표시","Adds a smaller second line under the menubar figure. Quota remaining tracks whichever connected provider is nearest its limit. The line hides itself while the chosen metric has no data.":"메뉴바 숫자 아래에 작은 두 번째 줄을 추가합니다. “남은 할당량”은 연결된 제공업체 중 한도에 가장 가까운 항목을 추적합니다. 선택한 지표에 데이터가 없으면 이 줄은 자동으로 숨겨집니다.","Quota remaining":"남은 할당량","Today's cost":"오늘 비용","Today's tokens":"오늘 토큰","Active sessions":"활성 세션","%@ today":"오늘 %@","%@ tok today":"오늘 %@ tok","%lld%% left":"%lld%% 남음","Monthly":"월간","Monthly usage limit":"월간 사용 한도","Monthly usage limit · limit reached":"월간 사용 한도 · 한도 도달","Monthly usage limit · %1$@ / %2$@ credits":"월간 사용 한도 · %1$@ / %2$@ 크레딧","%@ · limit reached":"%@ · 한도 도달","Last known usage":"마지막 확인된 사용량","Notifications":"알림","Notify me when Codex banks a limit reset":"Codex가 한도 초기화를 적립하면 알림","OpenAI sometimes grants Codex accounts a credit that resets a rate-limit window early. CodeBurn reads these from the quota response it already fetches and tells you once per grant. It never spends one.":"OpenAI는 가끔 Codex 계정에 사용량 제한 창을 조기에 초기화하는 크레딧을 지급합니다. CodeBurn은 이미 가져오는 할당량 응답에서 이를 확인해 지급될 때마다 한 번씩 알려줍니다. CodeBurn은 이 크레딧을 절대 사용하지 않습니다.","Notify me when a quota resets early":"할당량이 조기 초기화되면 알림","Posts a notification when a provider resets a usage limit before its scheduled time, so you know the capacity is back.":"제공업체가 예정보다 일찍 사용 한도를 초기화하면 알림을 보내 사용량이 다시 확보되었음을 알려줍니다.","cache read":"캐시 읽기","Cache read: %@ tokens":"캐시 읽기: %@ 토큰","Quota window %@":"할당량 기간 %@","Language":"언어","System":"시스템 설정 따름","Follows System Settings > Language & Region unless you pick one here.":"여기서 선택하지 않으면 “시스템 설정 > 언어 및 지역”을 따릅니다.","5-hour":"5시간","<1m":"<1분","%@ quota reset early":"%@ 할당량 조기 초기화됨","%@ quota cleared early":"%@ 할당량 조기 소진 처리됨","You're back to %lld%%.":"%lld%%로 복구되었습니다.","%1$@'s %2$@ reset %3$@ early. %4$@":"%1$@의 %2$@이(가) %3$@ 앞당겨 초기화되었습니다. %4$@","%1$@ cleared your %2$@ %3$@ before its reset. %4$@":"%1$@이(가) 예정된 초기화보다 %3$@ 앞서 %2$@을(를) 비웠습니다. %4$@","%lldh":"%lld시간","%@ limit":"%@ 한도","5-hour limit":"5시간 한도","weekly limit":"주간 한도","Opus weekly limit":"Opus 주간 한도","Sonnet weekly limit":"Sonnet 주간 한도","weekly":"주간","Opus weekly":"Opus 주간","Sonnet weekly":"Sonnet 주간","5-hour usage":"5시간 사용량","weekly usage":"주간 사용량","Opus weekly usage":"Opus 주간 사용량","Sonnet weekly usage":"Sonnet 주간 사용량","%lld available":"%lld개 사용 가능","%lld usable now":"%lld개 지금 사용 가능","next %1$@ lands %2$@":"다음 %1$@은(는) %2$@에 지급","latest %1$@ granted %2$@":"최근 %1$@은(는) %2$@에 지급됨","next expires %@":"다음 항목은 %@에 만료","A %1$@ lands %2$@.":"%1$@이(가) %2$@에 지급됩니다.","A %1$@ was added to your account %2$@.":"%1$@이(가) %2$@에 계정에 추가되었습니다.","A %@ was added to your account.":"%@이(가) 계정에 추가되었습니다.","You have %lld available to use.":"사용 가능한 항목이 %lld개 있습니다.","Codex banked a limit reset":"Codex가 한도 초기화를 적립함","limit reset":"한도 초기화","%@ reset":"%@ 초기화","daily":"매일","monthly":"매월","hourly":"매시간","just now":"방금","%lldm ago":"%lld분 전","%lldh ago":"%lld시간 전","%lldd ago":"%lld일 전","in under a minute":"1분 이내","Input tokens reused from this provider's prompt cache today — not fresh input (arrow.down), not cache writes, and already priced at the cache-read rate inside the burned figure.":"오늘 이 제공업체의 프롬프트 캐시에서 재사용된 입력 토큰입니다 — 새 입력(arrow.down)도 캐시 쓰기도 아니며, 소진 금액에 이미 캐시 읽기 요율로 계산되어 있습니다.","%1$@ · %2$@ at 80%%":"%1$@ · %2$@ 80%% 도달","%1$@ · %2$@ limit reached":"%1$@ · %2$@ 한도 도달","Quota crossings (%1$lld%% and %2$lld%%)":"할당량 임계값 알림 (%1$lld%% 및 %2$lld%%)","Privacy":"개인정보","Anonymous usage statistics":"익명 사용 통계","Managed by the CodeBurn desktop app. Change it there under Settings → Privacy & data.":"CodeBurn 데스크톱 앱에서 관리됩니다. 설정 → 개인정보 및 데이터에서 변경하세요.","Optional usage statistics: the names of the models, tools and providers you use, with bucketed counts of how often each one came up, plus when the app is opened. A random install id, the app version and your country code travel with them. Never your prompts, your code, your project and file names, or exact amounts.":"선택적 사용 통계입니다: 사용한 모델, 도구, 제공업체의 이름과 각 항목이 나타난 횟수를 구간별로 집계한 값, 그리고 앱을 연 횟수. 여기에는 무작위 설치 ID, 앱 버전, 국가 코드가 함께 전송됩니다. 프롬프트, 코드, 프로젝트 및 파일 이름, 정확한 금액은 절대 포함되지 않습니다.","Synced from cursor.com %@":"cursor.com에서 동기화됨 (%@)","Not synced from cursor.com yet":"아직 cursor.com에서 동기화되지 않음","Cursor login expired, open Cursor to sign in again":"Cursor 로그인이 만료되었습니다. Cursor를 열어 다시 로그인하세요","Couldn't reach cursor.com, will retry":"cursor.com에 연결할 수 없습니다. 다시 시도합니다","Couldn't read the usage export from cursor.com, will retry":"cursor.com의 사용량 내보내기를 읽을 수 없습니다. 다시 시도합니다","Sync Cursor usage from cursor.com":"cursor.com에서 Cursor 사용량 동기화","Downloads your own usage export with the Cursor app's login, at most once an hour.":"Cursor 앱의 로그인으로 내 사용량 내보내기를 다운로드합니다(최대 1시간에 1회).","Turned off by CODEBURN_CURSOR_SYNC=0":"CODEBURN_CURSOR_SYNC=0으로 꺼져 있음","Couldn't save the setting: config.json is invalid or locked":"설정을 저장할 수 없습니다. config.json이 잘못되었거나 잠겨 있습니다"},"zh-Hans":{"US Dollar":"美元","British Pound":"英镑","Euro":"欧元","Australian Dollar":"澳元","Canadian Dollar":"加元","New Zealand Dollar":"新西兰元","Japanese Yen":"日元","Chinese Yuan":"人民币","Swiss Franc":"瑞士法郎","Indian Rupee":"印度卢比","Brazilian Real":"巴西雷亚尔","Swedish Krona":"瑞典克朗","Singapore Dollar":"新加坡元","Hong Kong Dollar":"港元","South Korean Won":"韩元","Mexican Peso":"墨西哥比索","South African Rand":"南非兰特","Danish Krone":"丹麦克朗","Romanian Leu":"罗马尼亚列伊","All":"全部","Plan":"套餐","Trend":"趋势","Forecast":"预测","Calendar":"日历","Pulse":"效率","Stats":"统计","Optimize":"优化","Today":"今天","7D":"7天","30D":"30天","Month":"本月","6M":"6个月","Life":"累计","Week":"本周","30 Days":"30 天","6 Months":"6 个月","Lifetime":"累计","Local":"本机","Combined":"合并","Ember":"余烬","Blue":"蓝色","Purple":"紫色","Pink":"粉色","Red":"红色","Orange":"橙色","Yellow":"黄色","Green":"绿色","Graphite":"石墨色","Older session logs may be unavailable.":"较早的会话日志可能不可用。","Session identities are unavailable across devices.":"跨设备无法识别会话身份。","Session count unavailable":"会话数不可用","At least 1 session":"至少 1 个会话","At least %lld sessions":"至少 %lld 个会话","1 session":"1 个会话","%lld sessions":"%lld 个会话","Unavailable":"不可用","≥%lld sess":"≥%lld 会话","%lld sess":"%lld 会话","Connect":"连接","Reconnect":"重新连接","Add API Key":"添加 API 密钥","now":"现在","%1$lldd %2$lldh":"%1$lld 天 %2$lld 小时","%1$lldh %2$lldm":"%1$lld 小时 %2$lld 分","%lldm":"%lld 分","Auto (2m, less on battery)":"自动(2 分钟,使用电池时更慢)","Manual":"手动","1 minute":"1 分钟","5 minutes":"5 分钟","15 minutes":"15 分钟","2 minutes":"2 分钟","Liquid Glass":"液态玻璃","Circle":"圆形","Squircle":"圆角方形","Installed app or CLI":"已安装的应用或命令行工具","OAuth":"OAuth","API or cloud credentials":"API 或云凭证","Browser session":"浏览器会话","Localhost service":"本地服务","No sign-in required":"无需登录","Enter an API key or token below, then press Save & Connect.":"在下方输入 API 密钥或令牌,然后点按“存储并连接”。","Sign in to %@ in a supported browser, then click Retry.":"在受支持的浏览器中登录 %@,然后点按“重试”。","Sign in with the %@ app or CLI, then click Retry.":"通过 %@ 应用或命令行工具登录,然后点按“重试”。","Sign in with Cline, or enter a ClinePass API key below, then click Retry.":"通过 Cline 登录,或在下方输入 ClinePass API 密钥,然后点按“重试”。","Complete %@ OAuth, then click Retry.":"完成 %@ 的 OAuth 授权,然后点按“重试”。","Start the local %@ service, then click Retry.":"启动本地 %@ 服务,然后点按“重试”。","Enter the required API or cloud credentials below, then press Save & Connect.":"在下方填入所需的 API 或云凭证,然后点按“存储并连接”。","No sign-in is required. Click Retry to refresh quota.":"无需登录。点按“重试”即可刷新配额。","Add an API key or token in Provider Settings.":"请在服务商设置中添加 API 密钥或令牌。","Add the required API or cloud credentials in Provider Settings.":"请在服务商设置中填入所需的 API 或云凭证。","Reconnect %@":"重新连接 %@","Claude Code credentials need to be refreshed.":"Claude Code 凭证需要刷新。","Open Claude Code in your terminal and type `/login`, then click Reconnect.":"在终端中打开 Claude Code 并输入 `/login`,然后点按“重新连接”。","Codex credentials need to be refreshed.":"Codex 凭证需要刷新。","Run `codex login` in your terminal, then click Reconnect.":"在终端中运行 `codex login`,然后点按“重新连接”。","Kimi Code credentials need to be refreshed.":"Kimi Code 凭证需要刷新。","Run the Kimi CLI once to refresh your login, then click Reconnect.":"运行一次 Kimi 命令行工具以刷新登录,然后点按“重新连接”。","Gemini credentials need to be refreshed.":"Gemini 凭证需要刷新。","Run the Gemini CLI once to refresh your login, then click Reconnect.":"运行一次 Gemini 命令行工具以刷新登录,然后点按“重新连接”。","Copilot credentials need to be refreshed.":"Copilot 凭证需要刷新。","Sign in with the Copilot CLI, an editor plugin, or `gh auth login`, then click Reconnect.":"通过 Copilot 命令行工具、编辑器插件或 `gh auth login` 登录,然后点按“重新连接”。","The local Antigravity service is unavailable.":"本地 Antigravity 服务不可用。","Start the Antigravity app, then click Reconnect.":"启动 Antigravity 应用,然后点按“重新连接”。","%@ credentials need to be refreshed.":"%@ 凭证需要刷新。","Sign in to %@ again, then retry.":"请重新登录 %@,然后重试。","No Copilot credentials found":"未找到 Copilot 凭证","Sign in via an editor's Copilot plugin first. Then click Try Again.":"请先通过编辑器的 Copilot 插件登录,然后点按“再试一次”。","Copilot quota tracking disconnected":"已断开 Copilot 配额跟踪","Your Copilot credentials are untouched. Click Connect to resume.":"你的 Copilot 凭证不会受到影响。点按“连接”即可恢复。","Usage tracking still works. For live quota, sign in with the Copilot CLI or gh auth login, or paste a token below, then click Connect.":"用量跟踪仍然有效。如需实时配额,请通过 Copilot 命令行工具或 gh auth login 登录,或在下方粘贴令牌,然后点按“连接”。","Quota tracking disconnected. Credentials are untouched. Click Connect to resume.":"已断开配额跟踪。凭证不会受到影响。点按“连接”即可恢复。","Grok Bot is not installed. Install the Grok Bot app, then click Retry.":"尚未安装 Grok Bot。请先安装 Grok Bot 应用,然后点按“重试”。","Sign in to the Cursor app with the account Grok Bot uses, then click Retry.":"请使用 Grok Bot 所用的账户登录 Cursor 应用,然后点按“重试”。","Cursor rejected the current app session. Sign in again, then click Retry.":"Cursor 拒绝了当前的应用会话。请重新登录,然后点按“重试”。","Could not read the Cursor app's local session data. Quit and reopen Cursor, then click Retry.":"无法读取 Cursor 应用的本地会话数据。请退出并重新打开 Cursor,然后点按“重试”。","This account has no included Grok Bot allowance.":"此账户不含 Grok Bot 用量额度。","Grok Bot usage is drawn from a pooled enterprise allowance, which has no per-account reading.":"Grok Bot 用量来自企业共享额度,无法读取单个账户的数值。","Cursor rate-limited the quota request.":"Cursor 限制了配额请求的频率。","Grok Bot quota is temporarily unavailable.":"暂时无法获取 Grok Bot 配额。","Cursor returned an unrecognized Grok Bot quota response.":"Cursor 返回了无法识别的 Grok Bot 配额响应。","Network error fetching Grok Bot quota.":"获取 Grok Bot 配额时发生网络错误。","Update Check Failed":"检查更新失败","CLI Update Failed":"命令行工具更新失败","Menubar Update Failed":"菜单栏应用更新失败","CodeBurn could not check for updates.":"CodeBurn 无法检查更新。","CodeBurn could not update the CLI.":"CodeBurn 无法更新命令行工具。","CodeBurn could not update the menubar app.":"CodeBurn 无法更新菜单栏应用。","Click to retry the update check.":"点按以重新检查更新。","Click to retry the update.":"点按以重新尝试更新。","Updating...":"正在更新…","Update":"更新","Update the CLI and menubar to the latest release":"将命令行工具和菜单栏应用更新到最新版本","Desktop Update Failed":"桌面应用更新失败","CodeBurn could not update the desktop app.":"CodeBurn 无法更新桌面应用。","Updating CLI...":"正在更新命令行工具…","Updating menubar...":"正在更新菜单栏应用…","Opening CodeBurn to update...":"正在打开 CodeBurn 以进行更新…","Update the CLI, menubar and desktop app to the latest release":"将命令行工具、菜单栏应用和桌面应用更新到最新版本","CodeBurn %@ available":"CodeBurn %@ 可用","App and CLI %@ updates are ready. Click to install.":"应用与命令行工具 %@ 更新已就绪。点按以安装。","Click to install the update.":"点按以安装更新。","CodeBurn CLI %@ available":"CodeBurn 命令行工具 %@ 可用","Could not find the package manager for %1$@. Run “%2$@” manually, then try again.":"找不到 %1$@ 对应的包管理器。请手动运行“%2$@”,然后重试。","the CLI":"命令行工具","This codeburn CLI comes with the CodeBurn desktop app. Update the desktop app, then try again.":"此 codeburn 命令行工具随 CodeBurn 桌面应用提供。请更新桌面应用,然后重试。","npm does not have permission to update the global codeburn install. Run “%@” in Terminal, then try again.":"npm 没有更新全局 codeburn 安装的权限。请在终端中运行“%@”,然后重试。","CLI update failed (exit %lld)":"命令行工具更新失败(退出码 %lld)","Your codeburn CLI (%1$@) is too old to update the menubar. Run “%2$@” first, then try again.":"你的 codeburn 命令行工具(%1$@)版本过旧,无法更新菜单栏应用。请先运行“%2$@”,然后重试。","Update failed (exit %lld)":"更新失败(退出码 %lld)","GitHub returned HTTP %lld.":"GitHub 返回 HTTP %lld。","No mac-v release with a menubar zip and checksum was found.":"未找到包含菜单栏 zip 与校验和的 mac-v 版本。","Terminal (macOS default)":"终端(macOS 默认)","%@ credits":"%@ 点数","CodeBurn %1$@ · %2$lld of %3$lld devices reporting":"CodeBurn %1$@ · %2$lld/%3$lld 台设备已上报","Settings…":"设置…","Capacity Dock Settings…":"容量 Dock 设置…","Refresh Now":"立即刷新","Check for Updates":"检查更新","About CodeBurn":"关于 CodeBurn","Quit CodeBurn":"退出 CodeBurn","Today · no usage yet":"今天 · 暂无用量","1 call":"1 次调用","%lld calls":"%lld 次调用","Today · %1$@ · %2$@":"今天 · %1$@ · %2$@","CodeBurn Settings":"CodeBurn 设置","Update Available":"有可用更新","%1$@ is available (you have %2$@).":"%1$@ 已发布(你当前为 %2$@)。","%1$@ Your codeburn CLI is too old to install it. First run:\n\n%2$@\n\nthen:\n\ncodeburn menubar --force":"%1$@ 你的 codeburn 命令行工具版本过旧,无法安装。请先运行:\n\n%2$@\n\n然后:\n\ncodeburn menubar --force","%@ Run:\n\ncodeburn menubar --force":"%@ 运行:\n\ncodeburn menubar --force","Up to Date":"已是最新版本","You're on the latest version (%@).":"你已使用最新版本(%@)。","OK":"好","This total may be incomplete.":"此总计可能不完整。","Claude config":"Claude 配置","No %1$@ data for %2$@":"%1$@ 在%2$@没有数据","Couldn't load %@":"无法载入%@","Retry":"重试","Loading %@…":"正在载入%@…","Your AI Bill, Itemized":"你的 AI 账单,逐项明细","%1$@ over limit (%2$lld%%)":"%1$@ 已超限(%2$lld%%)","resets in %@":"%@后重置","Change accent color":"更改主题色","Copy update command to clipboard":"将更新命令复制到剪贴板","Enjoying CodeBurn?":"喜欢 CodeBurn 吗?","Star us on GitHub":"在 GitHub 上点个 Star","Hide this banner":"隐藏此横幅","CSV (folder)":"CSV(文件夹)","JSON":"JSON","Export":"导出","Full Report":"完整报告","%@ call":"%@ 次调用","%@ calls":"%@ 次调用","Daily budget of %@ exceeded":"已超出每日预算 %@","Combined unavailable · showing local":"合并数据不可用 · 显示本机数据","Combined · %@":"合并 · %@","Saved %@ with local models":"使用本地模型节省了 %@","%1$lld of %2$lld devices":"%1$lld/%2$lld 台设备","%@ · local":"%@ · 本机","Clear":"清除","Done":"完成","Pick dates":"选择日期","1 day":"1 天","%lld days":"%lld 天","Show previous providers":"显示上一组服务商","Show next providers":"显示下一组服务商","Loading…":"正在载入…","Sign in with `codex` (ChatGPT mode) to track quota.":"使用 `codex`(ChatGPT 模式)登录以跟踪配额。","Sign in to Claude Code to track quota.":"登录 Claude Code 以跟踪配额。","Sign in to track quota.":"登录以跟踪配额。","%@ usage":"%@ 用量","stale":"已过期","retrying":"正在重试","Activity":"活动","Cost":"花费","Turns":"轮次","1-shot":"一次通过","Models":"模型","Saved":"已节省","Calls":"调用","Tokens":"Token","%@ in":"输入 %@","%@ out":"输出 %@","%1$@ in · %2$@ out · %3$@ cache read":"输入 %1$@ · 输出 %2$@ · 缓存读取 %3$@","%@%% cache hit":"缓存命中 %@%%","1 model unpriced, counted at $0 · %@ tokens":"1 个模型无定价,按 $0 计入 · %@ Token","%1$lld models unpriced, counted at $0 · %2$@ tokens":"%1$lld 个模型无定价,按 $0 计入 · %2$@ Token","~ estimated cost (priced from estimated tokens)":"~ 估算成本(按估算的 Token 数计价)","Pull requests":"拉取请求","Tooling":"工具链","Tools":"工具","Skills & Agents":"技能与子代理","MCP Servers":"MCP 服务器","Tips for you":"为你的建议","%lld signals":"%lld 条信号","Open Full Optimize":"打开完整优化报告","Cache hit at %lld%% — most prompts reuse cache":"缓存命中率 %lld%% — 多数提示复用了缓存","%lld%% one-shot — edits landing first try":"一次通过率 %lld%% — 编辑大多一次成功","Spend down %lld%% vs last 7 days":"支出较前 7 天下降 %lld%%","%lld-day usage streak":"已连续使用 %lld 天","Spend up %lld%% vs prior 7 days":"支出较前 7 天上升 %lld%%","Cache hit only %lld%% — paying for cold prompts":"缓存命中率仅 %lld%% — 正在为冷提示付费","%lld%% one-shot — lots of iteration":"一次通过率 %lld%% — 反复修改较多","On pace for %1$@ this month (+%2$lld%% vs last)":"按当前速度本月将达 %1$@(较上月 +%2$lld%%)","What's working":"做得好的","What to improve":"可以改进的","Risks":"风险","Last %lld days":"最近 %lld 天","%1$@%% vs prior %2$lldd":"%1$@%% 较前 %2$lld 天","Avg/day":"日均","Peak":"峰值","Yesterday":"昨天","Total":"总计","%@ tokens":"%@ Token","%1$@ on %2$@":"%1$@(%2$@)","Daily activity":"每日活动","%lld active days":"%lld 个活跃日","Peak day":"峰值日","Avg active":"活跃日均值","Streak":"连续天数","%lldd":"%lld 天","Mon":"一","Wed":"三","Fri":"五","Sun":"日","Daily detail":"每日明细","Hover a day":"悬停查看某天","Future day":"未来日期","No tracked usage":"无跟踪到的用量","%@: future day":"%@:未来日期","%@: no tracked usage":"%@:无跟踪到的用量","%1$@: %2$@, %3$lld calls, %4$@ tokens":"%1$@:%2$@,%3$lld 次调用,%4$@ Token","Month-to-date":"本月至今","On pace for":"预计本月","Avg/day (this wk)":"日均(本周)","Last 7d":"最近 7 天","no prior month":"无上月数据","%1$@%% vs last month (%2$@)":"%1$@%% 较上月(%2$@)","Cache hit":"缓存命中","Cost / session":"每会话花费","Cost/edit":"每次编辑花费","Save ~%1$@ / ~%2$@ tokens · 1 finding":"可省约 %1$@ / 约 %2$@ Token · 1 项建议","Save ~%1$@ / ~%2$@ tokens · %3$lld findings":"可省约 %1$@ / 约 %2$@ Token · %3$lld 项建议","Favorite model":"最常用模型","Active days (month)":"活跃天数(本月)","Most active day":"最活跃的一天","Peak day spend":"峰值日支出","Sessions":"会话","Current streak":"当前连续","Longest streak":"最长连续","Tracked spend (last %lld days)":"已跟踪支出(最近 %lld 天)","Costliest session":"花费最高的会话","Retry tax":"重试成本","%1$lld retries across %2$lld retried edits":"%2$lld 次需要重试的编辑中共 %1$lld 次重试","%@ ret/edit":"%@ 次重试/编辑","Hides session details":"隐藏会话详情","Shows session details":"显示会话详情","Expanded":"已展开","Collapsed":"已折叠"," %lld call":" %lld 次调用"," %lld calls":" %lld 次调用","Potential savings":"潜在节省","%lld%% of spend":"占支出 %lld%%","could be optimized":"可以优化","Routing waste":"路由浪费","vs %1$@ @ %2$@/edit":"对比 %1$@(%2$@/次编辑)","Connect Claude subscription":"连接 Claude 订阅","CodeBurn will read your Claude Code credentials once. macOS will ask permission. After that, the live quota bar shows next to the Claude tab and updates automatically.":"CodeBurn 只会读取一次你的 Claude Code 凭证,macOS 会请求授权。之后实时配额条会显示在 Claude 标签旁并自动更新。","Reading Claude credentials...":"正在读取 Claude 凭证…","No Claude credentials found":"未找到 Claude 凭证","Sign in with Claude Code first: open `claude` in your terminal and type `/login`. Then click Try Again.":"请先登录 Claude Code:在终端中打开 `claude` 并输入 `/login`,然后点按“再试一次”。","Anthropic temporarily unreachable. Retrying.":"暂时无法连接 Anthropic,正在重试。","Reconnect Claude":"重新连接 Claude","Your Claude session has expired. Open Claude Code in your terminal and type `/login`, then click Reconnect.":"你的 Claude 会话已过期。在终端中打开 Claude Code 并输入 `/login`,然后点按“重新连接”。","Resets %@":"重置:%@","5-hour window":"5 小时窗口","7-day total":"7 天总计","7-day Opus":"7 天 Opus","7-day Sonnet":"7 天 Sonnet","7-day %@":"7 天 %@","Try Again":"再试一次","Couldn't load plan data":"无法载入套餐数据","Connect ChatGPT subscription":"连接 ChatGPT 订阅","CodeBurn will read your Codex CLI credentials once. After that, the live quota bar shows next to the Codex tab and updates automatically.":"CodeBurn 只会读取一次你的 Codex 命令行工具凭证。之后实时配额条会显示在 Codex 标签旁并自动更新。","Reading Codex CLI credentials...":"正在读取 Codex 命令行工具凭证…","No Codex credentials found":"未找到 Codex 凭证","Sign in with Codex first: run `codex login` in your terminal. Then click Try Again.":"请先登录 Codex:在终端中运行 `codex login`,然后点按“再试一次”。","ChatGPT temporarily unreachable. Retrying.":"暂时无法连接 ChatGPT,正在重试。","Reconnect Codex":"重新连接 Codex","Your ChatGPT session has expired. Run `codex login` in your terminal, then click Reconnect.":"你的 ChatGPT 会话已过期。在终端中运行 `codex login`,然后点按“重新连接”。","%@ window":"%@ 窗口","Credits":"点数","Unlimited":"无限制","Limit resets":"限额重置","No Kimi Code credentials found":"未找到 Kimi Code 凭证","Sign in with the Kimi CLI first. Then click Try Again.":"请先通过 Kimi 命令行工具登录,然后点按“再试一次”。","Reading Kimi Code credentials...":"正在读取 Kimi Code 凭证…","Kimi temporarily unreachable. Retrying.":"暂时无法连接 Kimi,正在重试。","Refresh Kimi Code login":"刷新 Kimi Code 登录","Kimi Code tokens are short-lived. Run the Kimi CLI once to refresh your login, then click Reconnect.":"Kimi Code 的令牌有效期很短。运行一次 Kimi 命令行工具以刷新登录,然后点按“重新连接”。","Parallel sessions":"并行会话","Login idle. Run the Kimi CLI to refresh.":"登录已闲置。运行 Kimi 命令行工具以刷新。","as of %@":"截至 %@","No Gemini credentials found":"未找到 Gemini 凭证","Sign in with the Gemini CLI first. Then click Try Again.":"请先通过 Gemini 命令行工具登录,然后点按“再试一次”。","Reading Gemini credentials...":"正在读取 Gemini 凭证…","Gemini temporarily unreachable. Retrying.":"暂时无法连接 Gemini,正在重试。","Refresh Gemini login":"刷新 Gemini 登录","Your Gemini login has expired. Run the Gemini CLI once to refresh it, then click Reconnect.":"你的 Gemini 登录已过期。运行一次 Gemini 命令行工具以刷新,然后点按“重新连接”。","Login idle. Run the Gemini CLI to refresh.":"登录已闲置。运行 Gemini 命令行工具以刷新。","Reading Copilot credentials...":"正在读取 Copilot 凭证…","GitHub temporarily unreachable. Retrying.":"暂时无法连接 GitHub,正在重试。","Refresh Copilot login":"刷新 Copilot 登录","Your Copilot sign-in has expired. Sign in via an editor's Copilot plugin again, then click Reconnect.":"你的 Copilot 登录已过期。请重新通过编辑器的 Copilot 插件登录,然后点按“重新连接”。","Login idle. Sign in via an editor's Copilot plugin to refresh.":"登录已闲置。通过编辑器的 Copilot 插件登录以刷新。","No local Antigravity server found":"未找到本地 Antigravity 服务","Start the Antigravity app, then click Try Again.":"启动 Antigravity 应用,然后点按“再试一次”。","Probing the local Antigravity server...":"正在探测本地 Antigravity 服务…","Local Antigravity server unreachable. Retrying.":"无法连接本地 Antigravity 服务,正在重试。","Reconnect Antigravity":"重新连接 Antigravity","Server disconnected. Start the Antigravity app to refresh.":"服务已断开。启动 Antigravity 应用以刷新。","On pace":"符合节奏","On pace: %@ at reset":"符合节奏:重置时 %@","%@%% in deficit":"超出 %@%%","%@%% in reserve":"结余 %@%%","%1$@ · hits 100%% %2$@":"%1$@ · %2$@达到 100%%","%1$@ · %2$@ at reset":"%1$@ · 重置时 %2$@","On pace: %1$@ at reset · hits 100%% %2$@":"符合节奏:重置时 %1$@ · %2$@达到 100%%","Based on last cycle: %@":"按上一周期估算:%@","in %lldm":"%lld 分钟后","in %lldh":"%lld 小时后","in %lldd":"%lld 天后","Dock to Edge":"停靠到边缘","Left":"左侧","Right":"右侧","Top":"顶部","Bottom":"底部","Hide Capacity Dock":"隐藏容量 Dock","Capacity Dock":"容量 Dock","Unknown":"未知","Click to keep Capacity Dock expanded":"点按以保持容量 Dock 展开","Click to switch between this provider's usage windows":"点按以在该服务商的用量周期之间切换","Show %@ usage":"显示 %@ 用量","none running":"无运行中","1 running":"1 个运行中","Kimi Code":"Kimi Code","Gemini":"Gemini","Copilot":"Copilot","Antigravity":"Antigravity","%lld running":"%lld 个运行中","%@ left":"剩余 %@","Open in %@":"在 %@ 中打开","Bring %@ to front":"将 %@ 切换到前台","burned":"已消耗","today %1$@ of %2$@":"今天 %1$@ / %2$@","no budget set":"未设置预算","Refreshing…":"正在刷新…","Last known usage · refreshing":"最近已知用量 · 正在刷新","Last known usage · retrying":"最近已知用量 · 正在重试","Not connected":"未连接","Reconnect required":"需要重新连接","General":"通用","Providers":"服务商","%lld on":"%lld 个已开启","About":"关于","Settings":"设置","Search providers":"搜索服务商","Enter an amount above, or the alert stays off.":"请在上方输入金额,否则提醒不会生效。","Flame icon turns yellow when today's tokens pass the daily budget.":"当今天的 Token 超过每日预算时,火焰图标会变为黄色。","Flame icon turns yellow when today's cost pass the daily budget.":"当今天的花费超过每日预算时,火焰图标会变为黄色。","Display":"显示","Currency":"货币","Metric":"指标","Cost ($)":"花费($)","Tokens (↑↓)":"Token(↑↓)","Total Tokens":"Token 总计","Credits (Codex)":"点数(Codex)","Icon Only":"仅图标","Period":"时间范围","Scope":"范围","Accent":"主题色","Usage Refresh":"用量刷新","Update every":"更新间隔","How often the menubar figure re-reads your local session data. Auto refreshes every 30 seconds while you're plugged in and backs off on battery; Manual only refreshes when you open the popover or click Refresh Now.":"菜单栏数字重新读取本机会话数据的频率。“自动”在接通电源时每 30 秒刷新一次,使用电池时会放慢;“手动”仅在你打开弹窗或点按“立即刷新”时刷新。","Updates":"更新","Notify me about updates":"有更新时通知我","Posts a notification when a new CodeBurn release is available. Click it to install.":"当有新的 CodeBurn 版本发布时发送通知。点按通知即可安装。","Terminal":"终端","Open commands in":"命令打开方式","%@ (not installed)":"%@(未安装)","Where Full Report and Optimize open. If the chosen app isn't installed CodeBurn falls back to Terminal; if that's missing too the command runs in the background. Only terminals that can script a command into a live window are listed.":"“完整报告”和“优化”的打开位置。如果所选应用未安装,CodeBurn 会回退到“终端”;若“终端”也不存在,命令将在后台运行。此处仅列出能够将命令写入活动窗口的终端。","Alerts":"提醒","Daily budget":"每日预算","Off":"关闭","Custom…":"自定义…","Amount":"金额","M tokens":"百万 Token","Show Capacity Dock":"显示容量 Dock","Resting provider":"默认服务商","Size":"大小","Capacity Dock size":"容量 Dock 大小","Appearance":"外观","Gauge shape":"仪表形状","Dock providers":"Dock 中的服务商","Connect a provider from its sidebar page to make it available here.":"请在边栏的服务商页面中连接服务商,它才会出现在这里。","Needs attention":"需要处理","Connected providers and anything already shown in the dock appear here, so a provider can always be removed even if its connection later fails.":"已连接的服务商以及已显示在 Dock 中的项目都会列在这里,因此即使某个服务商之后连接失败,也始终可以将其移除。","Connection":"连接","Config Directories":"配置目录","Aggregate usage across multiple Claude config directories (e.g. work and personal accounts). Leave empty to track just the default `~/.claude`. The `CLAUDE_CONFIG_DIRS` environment variable, if set, overrides this list.":"汇总多个 Claude 配置目录(例如工作与个人账户)的用量。留空则仅跟踪默认的 `~/.claude`。如果设置了 `CLAUDE_CONFIG_DIRS` 环境变量,它会覆盖此列表。","Quota Refresh":"配额刷新","Anthropic rate-limits this endpoint per account. 2 minutes is plenty for the 5-hour and weekly windows; pick Manual if you only want updates on demand.":"Anthropic 会按账户对该接口限流。对于 5 小时和每周窗口,2 分钟已经足够;如果只想按需更新,请选择“手动”。","Connected":"已连接","Backing off":"正在退避","Connecting…":"正在连接…","Ready":"就绪","Plan: %@":"套餐:%@","Live quota tracked from Anthropic.":"实时配额来自 Anthropic。","Anthropic rate-limited; auto-retrying.":"Anthropic 已限流,正在自动重试。","macOS may ask permission to read your credentials.":"macOS 可能会请求读取你的凭证的权限。","Background refresh in progress.":"正在后台刷新。","Tap Load Quota to fetch live usage from Anthropic.":"点按“载入配额”以从 Anthropic 获取实时用量。","Click Connect to read your Claude Code credentials and start tracking quota.":"点按“连接”以读取你的 Claude Code 凭证并开始跟踪配额。","Disconnect":"断开连接","Disconnect Claude?":"要断开 Claude 连接吗?","Cancel":"取消","CodeBurn will stop tracking quota and clear its connection state plus any legacy credential cache. Your Claude Code credential is untouched. Claude Code keeps working.":"CodeBurn 将停止跟踪配额,并清除其连接状态以及任何旧版凭证缓存。你的 Claude Code 凭证不会受到影响,Claude Code 仍可正常使用。","Load Quota":"载入配额","No extra directories. Tracking the default `~/.claude`.":"没有额外目录,正在跟踪默认的 `~/.claude`。","Remove":"移除","Add Directory…":"添加目录…","Add":"添加","Choose one or more Claude config directories (each containing a `projects` folder).":"选择一个或多个 Claude 配置目录(每个目录都应包含 `projects` 文件夹)。","Codex live-quota tracking follows the authoritative `~/.codex/auth.json` session directly and does not create a second Keychain copy. A legacy CodeBurn Keychain item, when present, is read only as a migration fallback. Only ChatGPT-mode auth (Plus / Pro / Team / Business / Edu / Enterprise) is supported. API-key users are billed per request and have a different reporting surface. Credit-metered workspaces report no rate-limit windows, so their monthly credit allowance is shown instead.":"Codex 实时配额跟踪直接沿用权威的 `~/.codex/auth.json` 会话,不会创建第二份钥匙串副本。若存在旧版 CodeBurn 钥匙串项目,仅作为迁移回退读取。仅支持 ChatGPT 模式认证(Plus / Pro / Team / Business / Edu / Enterprise)。使用 API 密钥的用户按请求计费,报告方式不同。按点数计量的工作区不报告限流窗口,因此会改为显示其每月点数额度。","How it works":"工作原理","Couldn't load Codex quota":"无法载入 Codex 配额","Live quota tracked from chatgpt.com.":"实时配额来自 chatgpt.com。","Codex is in API-key mode. Run `codex login` and choose a ChatGPT plan to enable quota tracking.":"Codex 处于 API 密钥模式。运行 `codex login` 并选择 ChatGPT 套餐以启用配额跟踪。","Run `codex login` in your terminal to sign in again, then click Reconnect.":"在终端中运行 `codex login` 重新登录,然后点按“重新连接”。","ChatGPT rate-limited; auto-retrying.":"ChatGPT 已限流,正在自动重试。","Reading ~/.codex/auth.json.":"正在读取 ~/.codex/auth.json。","Tap Load Quota to fetch live usage from chatgpt.com.":"点按“载入配额”以从 chatgpt.com 获取实时用量。","Click Connect to read your Codex CLI credentials. If Connect fails, run `codex login` in your terminal first to create ~/.codex/auth.json.":"点按“连接”以读取你的 Codex 命令行工具凭证。如果连接失败,请先在终端中运行 `codex login` 以创建 ~/.codex/auth.json。","Disconnect Codex?":"要断开 Codex 连接吗?","CodeBurn will stop tracking quota and clear its connection state plus any legacy credential cache. Your ~/.codex/auth.json is untouched. Codex CLI keeps working.":"CodeBurn 将停止跟踪配额,并清除其连接状态以及任何旧版凭证缓存。你的 ~/.codex/auth.json 不会受到影响,Codex 命令行工具仍可正常使用。","Kimi Code live-quota tracking reads `~/.kimi-code/credentials/kimi-code.json` directly. Nothing is copied or stored. Access tokens are short-lived (~15 minutes) and only the Kimi CLI refreshes them, so if the connection shows as expired, run the Kimi CLI once and click Reconnect.":"Kimi Code 实时配额跟踪直接读取 `~/.kimi-code/credentials/kimi-code.json`,不会复制或存储任何内容。访问令牌有效期很短(约 15 分钟),且只有 Kimi 命令行工具会刷新它们;因此若连接显示为已过期,请运行一次 Kimi 命令行工具,然后点按“重新连接”。","Login refresh required":"需要刷新登录","Couldn't load Kimi quota":"无法载入 Kimi 配额","Live quota tracked from api.kimi.com.":"实时配额来自 api.kimi.com。","Kimi rate-limited; auto-retrying.":"Kimi 已限流,正在自动重试。","Reading ~/.kimi-code credentials.":"正在读取 ~/.kimi-code 凭证。","Tap Load Quota to fetch live usage from api.kimi.com.":"点按“载入配额”以从 api.kimi.com 获取实时用量。","Sign in with the Kimi CLI first, then click Connect.":"请先通过 Kimi 命令行工具登录,然后点按“连接”。","Disconnect Kimi Code?":"要断开 Kimi Code 连接吗?","CodeBurn will stop tracking Kimi Code quota. Your ~/.kimi-code credentials are untouched. The Kimi CLI keeps working.":"CodeBurn 将停止跟踪 Kimi Code 配额。你的 ~/.kimi-code 凭证不会受到影响,Kimi 命令行工具仍可正常使用。","Gemini live-quota tracking reads `~/.gemini/oauth_creds.json` read-only. Nothing is copied or stored, and tokens stay in memory. If the connection shows as expired, run the Gemini CLI once to refresh your login, then click Reconnect.":"Gemini 实时配额跟踪以只读方式读取 `~/.gemini/oauth_creds.json`,不会复制或存储任何内容,令牌仅保留在内存中。若连接显示为已过期,请运行一次 Gemini 命令行工具以刷新登录,然后点按“重新连接”。","Couldn't load Gemini quota":"无法载入 Gemini 配额","Live quota tracked from Google Code Assist.":"实时配额来自 Google Code Assist。","Gemini rate-limited; auto-retrying.":"Gemini 已限流,正在自动重试。","Reading ~/.gemini credentials.":"正在读取 ~/.gemini 凭证。","Tap Load Quota to fetch live usage from Google Code Assist.":"点按“载入配额”以从 Google Code Assist 获取实时用量。","Sign in with the Gemini CLI first, then click Connect.":"请先通过 Gemini 命令行工具登录,然后点按“连接”。","Disconnect Gemini?":"要断开 Gemini 连接吗?","CodeBurn will stop tracking Gemini quota. Your ~/.gemini credentials are untouched. The Gemini CLI keeps working.":"CodeBurn 将停止跟踪 Gemini 配额。你的 ~/.gemini 凭证不会受到影响,Gemini 命令行工具仍可正常使用。","Copilot live-quota tracking reads a GitHub token that is already on this Mac, read-only. Nothing is copied or stored. CodeBurn looks at the editor plugin files in `~/.config/github-copilot`, the Copilot CLI's `~/.copilot` files, the COPILOT_GITHUB_TOKEN, GH_TOKEN and GITHUB_TOKEN variables, `gh auth token`, and finally a token you paste below. Usage tracking works without any of this; only the live quota bars need a token. Every one of those carries the GitHub host it belongs to — the plugin files are keyed by host, the variables are read with GH_HOST, the `gh` login with the host in gh's own hosts.yml, and a pasted token with the host you type beside it — and a credential for a GitHub Enterprise Cloud host is queried on that tenant's own API (api..ghe.com), never sent to api.github.com.":"Copilot 实时配额跟踪以只读方式读取这台 Mac 上已有的 GitHub 令牌,不会复制或存储任何内容。CodeBurn 会依次查看 `~/.config/github-copilot` 中的编辑器插件文件、Copilot 命令行工具的 `~/.copilot` 文件、COPILOT_GITHUB_TOKEN、GH_TOKEN 和 GITHUB_TOKEN 环境变量、`gh auth token`,最后是你在下方粘贴的令牌。用量跟踪无需这些内容,只有实时配额条才需要令牌。上述每一种来源都会带上它所属的 GitHub 主机——插件文件按主机分类,环境变量通过 GH_HOST 读取,`gh` 登录取自 gh 自己 hosts.yml 中的主机,粘贴的令牌则取自你在旁边填写的主机——而为 GitHub Enterprise Cloud 主机找到的凭证,只会向该租户自己的 API(api..ghe.com)查询,绝不会发送到 api.github.com。","GitHub token":"GitHub 令牌","GitHub host":"GitHub 主机","Save & Connect":"存储并连接","Clear Token":"清除令牌","Paste a token":"粘贴令牌","Optional, and only needed when nothing else on this Mac is signed in. A fine-grained personal access token with the \"Plan: Read-only\" permission is enough. Leave the host at github.com unless the token was minted on a GitHub Enterprise Cloud tenant, in which case enter that tenant's host (.ghe.com) so the token is never sent to api.github.com. Both are saved in CodeBurn's own Keychain item and are used only to read your Copilot quota.":"可选,仅当这台 Mac 上没有其他已登录来源时才需要。一个具有 \"Plan: Read-only\" 权限的细粒度个人访问令牌即可。主机请保持为 github.com,除非该令牌是在 GitHub Enterprise Cloud 租户上签发的;若是,请填入该租户的主机(.ghe.com),这样令牌就绝不会发送到 api.github.com。两者都保存在 CodeBurn 自己的钥匙串项目中,且仅用于读取你的 Copilot 配额。","Couldn't load Copilot quota":"无法载入 Copilot 配额","Live quota tracked from %@.":"实时配额来自 %@。","Plan: %1$@. Live quota tracked from %2$@.":"套餐:%1$@。实时配额来自 %2$@。","Sign in again with the Copilot CLI, an editor's Copilot plugin, or gh auth login, then click Reconnect.":"请通过 Copilot 命令行工具、编辑器的 Copilot 插件或 gh auth login 重新登录,然后点按“重新连接”。","GitHub rate-limited; auto-retrying.":"GitHub 已限流,正在自动重试。","Looking for a GitHub token on this Mac.":"正在这台 Mac 上查找 GitHub 令牌。","Tap Load Quota to fetch live usage from GitHub.":"点按“载入配额”以从 GitHub 获取实时用量。","Tap Load Quota to fetch live usage from %@.":"点按“载入配额”以从 %@ 获取实时用量。","CodeBurn cannot read Copilot quota for %@. Use github.com or a GitHub Enterprise Cloud host (*.ghe.com).":"CodeBurn 无法读取 %@ 的 Copilot 配额。请使用 github.com 或 GitHub Enterprise Cloud 主机(*.ghe.com)。","Disconnect Copilot?":"要断开 Copilot 连接吗?","CodeBurn will stop tracking Copilot quota. Every credential it read stays untouched, and your Copilot clients keep working.":"CodeBurn 将停止跟踪 Copilot 配额。它读取过的所有凭证都不会受到影响,你的 Copilot 客户端仍可正常使用。","Antigravity live-quota tracking talks to the Antigravity app's local language server on 127.0.0.1 only. Nothing leaves the machine and no credential files are read. If it shows as disconnected, start the Antigravity app, then click Reconnect.":"Antigravity 实时配额跟踪仅通过 127.0.0.1 与 Antigravity 应用的本地语言服务通信。没有任何数据离开这台机器,也不会读取凭证文件。若显示为已断开,请启动 Antigravity 应用,然后点按“重新连接”。","Couldn't load Antigravity quota":"无法载入 Antigravity 配额","Live quota tracked from the local Antigravity server.":"实时配额来自本地 Antigravity 服务。","Local probe failed; auto-retrying.":"本地探测失败,正在自动重试。","Probing the local Antigravity language server.":"正在探测本地 Antigravity 语言服务。","Tap Load Quota to probe the local Antigravity server.":"点按“载入配额”以探测本地 Antigravity 服务。","Start the Antigravity app first, then click Connect.":"请先启动 Antigravity 应用,然后点按“连接”。","No local Antigravity server found. Start the Antigravity app, then click Reconnect.":"未找到本地 Antigravity 服务。启动 Antigravity 应用,然后点按“重新连接”。","Disconnect Antigravity?":"要断开 Antigravity 连接吗?","CodeBurn will stop tracking Antigravity quota. Nothing is read from or written to disk. The Antigravity app keeps working.":"CodeBurn 将停止跟踪 Antigravity 配额。不会从磁盘读取或写入任何内容,Antigravity 应用仍可正常使用。","Not yet supported":"暂不支持","Automatic connection uses the provider's existing app, CLI, OAuth, browser session, or environment credentials first. CodeBurn does not copy those source credentials into its Keychain.":"自动连接会优先使用服务商已有的应用、命令行工具、OAuth、浏览器会话或环境凭证。CodeBurn 不会把这些来源凭证复制到自己的钥匙串中。","Authentication methods are listed for reference. A native CodeBurn quota adapter is required before this provider can connect to Capacity Dock.":"此处列出的认证方式仅供参考。该服务商需要原生的 CodeBurn 配额适配器,才能连接到容量 Dock。","Authentication methods":"认证方式","Source":"来源","API key or token":"API 密钥或令牌","Clear Override":"清除覆盖设置","Loading saved provider credential":"正在载入已存储的服务商凭证","Connection override":"连接覆盖设置","Overrides are optional and are saved only when you press Save & Connect. Secret values use one CodeBurn-owned Keychain item for this provider; background reads suppress authentication UI.":"覆盖设置是可选的,仅在你点按“存储并连接”时才会保存。机密值会为该服务商使用一个由 CodeBurn 拥有的钥匙串项目;后台读取不会弹出认证界面。","Remove saved override":"移除已存储的覆盖设置","Saved data":"已存储的数据","This credential predates a live CodeBurn quota adapter and is not treated as a connection.":"此凭证早于 CodeBurn 的实时配额适配器,不会被视为一个连接。","Quota adapter not available":"配额适配器不可用","Retrying":"正在重试","Cline login expired":"Cline 登录已过期","%@ is catalogued, but CodeBurn cannot fetch its live quota yet.":"%@ 已收录,但 CodeBurn 还无法获取其实时配额。","Live quota is available to Capacity Dock.":"实时配额已可供容量 Dock 使用。","Waiting for quota data.":"正在等待配额数据。","Automatic":"自动","CLI":"命令行工具","API":"API","Version %@":"版本 %@","%@ is available. Choose Check for Updates in the CodeBurn menu to install it.":"%@ 已发布。在 CodeBurn 菜单中选择“检查更新”即可安装。","GitHub":"GitHub","Website":"网站","Issues":"问题反馈","Links":"链接","© 2026 Resham Joshi (iamtoruk) · AgentSeal. MIT License.":"© 2026 Resham Joshi (iamtoruk) · AgentSeal. MIT 许可证。","Second row":"第二行","Second row shows":"第二行显示","Adds a smaller second line under the menubar figure. Quota remaining tracks whichever connected provider is nearest its limit. The line hides itself while the chosen metric has no data.":"在菜单栏数字下方添加一行较小的文字。“剩余配额”会跟踪最接近限额的已连接服务商。当所选指标暂无数据时,该行会自动隐藏。","Quota remaining":"剩余配额","Today's cost":"今日花费","Today's tokens":"今日 Token","Active sessions":"活跃会话","%@ today":"今日 %@","%@ tok today":"今日 %@ tok","%lld%% left":"剩余 %lld%%","Monthly":"每月","Monthly usage limit":"每月用量上限","Monthly usage limit · limit reached":"每月用量上限 · 已达上限","Monthly usage limit · %1$@ / %2$@ credits":"每月用量上限 · %1$@ / %2$@ 点数","%@ · limit reached":"%@ · 已达上限","Last known usage":"最近已知用量","Notifications":"通知","Notify me when Codex banks a limit reset":"Codex 获得限额重置额度时通知我","OpenAI sometimes grants Codex accounts a credit that resets a rate-limit window early. CodeBurn reads these from the quota response it already fetches and tells you once per grant. It never spends one.":"OpenAI 有时会向 Codex 账户发放一份额度,用于提前重置某个限流窗口。CodeBurn 会从它已经获取的配额响应中读取这些额度,并为每次发放提醒你一次。CodeBurn 绝不会使用这些额度。","Notify me when a quota resets early":"配额提前重置时通知我","Posts a notification when a provider resets a usage limit before its scheduled time, so you know the capacity is back.":"当某个服务商在预定时间之前重置用量限额时发送通知,让你知道额度已经恢复。","cache read":"缓存读取","Cache read: %@ tokens":"缓存读取:%@ Token","Quota window %@":"配额窗口 %@","Language":"语言","System":"跟随系统","Follows System Settings > Language & Region unless you pick one here.":"除非在此处选择,否则将跟随“系统设置 > 语言与地区”。","5-hour":"5 小时","<1m":"<1 分","%@ quota reset early":"%@ 配额已提前重置","%@ quota cleared early":"%@ 配额已提前清零","You're back to %lld%%.":"你已恢复到 %lld%%。","%1$@'s %2$@ reset %3$@ early. %4$@":"%1$@ 的%2$@提前 %3$@重置。%4$@","%1$@ cleared your %2$@ %3$@ before its reset. %4$@":"%1$@ 清空了你的%2$@,比其重置提前 %3$@。%4$@","%lldh":"%lld 小时","%@ limit":"%@ 限额","5-hour limit":"5 小时限额","weekly limit":"每周限额","Opus weekly limit":"Opus 每周限额","Sonnet weekly limit":"Sonnet 每周限额","weekly":"每周","Opus weekly":"Opus 每周","Sonnet weekly":"Sonnet 每周","5-hour usage":"5 小时用量","weekly usage":"每周用量","Opus weekly usage":"Opus 每周用量","Sonnet weekly usage":"Sonnet 每周用量","%lld available":"%lld 个可用","%lld usable now":"%lld 个现在可用","next %1$@ lands %2$@":"下一次%1$@将于 %2$@到账","latest %1$@ granted %2$@":"最近一次%1$@于 %2$@发放","next expires %@":"下一个将于 %@过期","A %1$@ lands %2$@.":"一次%1$@将于 %2$@到账。","A %1$@ was added to your account %2$@.":"%1$@已于 %2$@添加到你的账户。","A %@ was added to your account.":"%@已添加到你的账户。","You have %lld available to use.":"你有 %lld 个可以使用。","Codex banked a limit reset":"Codex 存入了一次限额重置","limit reset":"限额重置","%@ reset":"%@重置","daily":"每日","monthly":"每月","hourly":"每小时","just now":"刚刚","%lldm ago":"%lld 分钟前","%lldh ago":"%lld 小时前","%lldd ago":"%lld 天前","in under a minute":"不到一分钟后","Input tokens reused from this provider's prompt cache today — not fresh input (arrow.down), not cache writes, and already priced at the cache-read rate inside the burned figure.":"今天从该服务商提示缓存中复用的输入 Token。不是新的输入(arrow.down),也不是缓存写入,并且已按缓存读取费率计入已消耗金额。","%1$@ · %2$@ at 80%%":"%1$@ · %2$@ 已达 80%%","%1$@ · %2$@ limit reached":"%1$@ · %2$@ 已达上限","Quota crossings (%1$lld%% and %2$lld%%)":"配额跨越(%1$lld%% 与 %2$lld%%)","Privacy":"隐私","Anonymous usage statistics":"匿名使用统计","Managed by the CodeBurn desktop app. Change it there under Settings → Privacy & data.":"由 CodeBurn 桌面应用管理。请在设置 → 隐私与数据中更改。","Optional usage statistics: the names of the models, tools and providers you use, with bucketed counts of how often each one came up, plus when the app is opened. A random install id, the app version and your country code travel with them. Never your prompts, your code, your project and file names, or exact amounts.":"可选的使用统计信息:您使用的模型、工具和服务商的名称,以及每项出现频率的分段计数,还有应用的打开次数。随附的还有随机安装 ID、应用版本和国家/地区代码。绝不包含您的提示词、代码、项目与文件名称或确切金额。","Synced from cursor.com %@":"已从 cursor.com 同步(%@)","Not synced from cursor.com yet":"尚未从 cursor.com 同步","Cursor login expired, open Cursor to sign in again":"Cursor 登录已过期,请打开 Cursor 重新登录","Couldn't reach cursor.com, will retry":"无法连接到 cursor.com,将重试","Couldn't read the usage export from cursor.com, will retry":"无法读取 cursor.com 的用量导出,将重试","Sync Cursor usage from cursor.com":"从 cursor.com 同步 Cursor 用量","Downloads your own usage export with the Cursor app's login, at most once an hour.":"使用 Cursor 应用的登录下载你自己的用量导出,每小时最多一次。","Turned off by CODEBURN_CURSOR_SYNC=0":"已被 CODEBURN_CURSOR_SYNC=0 关闭","Couldn't save the setting: config.json is invalid or locked":"无法保存设置:config.json 无效或已被锁定"},"zh-Hant":{"US Dollar":"美元","British Pound":"英鎊","Euro":"歐元","Australian Dollar":"澳元","Canadian Dollar":"加元","New Zealand Dollar":"紐西蘭元","Japanese Yen":"日元","Chinese Yuan":"人民幣","Swiss Franc":"瑞士法郎","Indian Rupee":"印度盧比","Brazilian Real":"巴西雷亞爾","Swedish Krona":"瑞典克朗","Singapore Dollar":"新加坡元","Hong Kong Dollar":"港元","South Korean Won":"韓元","Mexican Peso":"墨西哥比索","South African Rand":"南非蘭特","Danish Krone":"丹麥克朗","Romanian Leu":"羅馬尼亞列伊","All":"全部","Plan":"方案","Trend":"趨勢","Forecast":"預測","Calendar":"日曆","Pulse":"效率","Stats":"統計","Optimize":"優化","Today":"今天","7D":"7天","30D":"30天","Month":"本月","6M":"6個月","Life":"累計","Week":"本週","30 Days":"30 天","6 Months":"6 個月","Lifetime":"累計","Local":"本機","Combined":"合併","Ember":"餘燼","Blue":"藍色","Purple":"紫色","Pink":"粉色","Red":"紅色","Orange":"橙色","Yellow":"黃色","Green":"綠色","Graphite":"石墨色","Older session logs may be unavailable.":"較早的會話日誌可能不可用。","Session identities are unavailable across devices.":"跨裝置無法識別會話身份。","Session count unavailable":"會話數不可用","At least 1 session":"至少 1 個會話","At least %lld sessions":"至少 %lld 個會話","1 session":"1 個會話","%lld sessions":"%lld 個會話","Unavailable":"不可用","≥%lld sess":"≥%lld 會話","%lld sess":"%lld 會話","Connect":"連線","Reconnect":"重新連線","Add API Key":"新增 API 金鑰","now":"現在","%1$lldd %2$lldh":"%1$lld 天 %2$lld 小時","%1$lldh %2$lldm":"%1$lld 小時 %2$lld 分","%lldm":"%lld 分","Auto (2m, less on battery)":"自動(2 分鐘,使用電池時更慢)","Manual":"手動","1 minute":"1 分鐘","5 minutes":"5 分鐘","15 minutes":"15 分鐘","2 minutes":"2 分鐘","Liquid Glass":"液態玻璃","Circle":"圓形","Squircle":"圓角方形","Installed app or CLI":"已安裝的應用或命令列工具","OAuth":"OAuth","API or cloud credentials":"API 或雲憑證","Browser session":"瀏覽器會話","Localhost service":"本地服務","No sign-in required":"無需登入","Enter an API key or token below, then press Save & Connect.":"在下方輸入 API 金鑰或權杖,然後點按“儲存並連線”。","Sign in to %@ in a supported browser, then click Retry.":"在受支援的瀏覽器中登入 %@,然後點按“重試”。","Sign in with the %@ app or CLI, then click Retry.":"透過 %@ 應用或命令列工具登入,然後點按“重試”。","Sign in with Cline, or enter a ClinePass API key below, then click Retry.":"透過 Cline 登入,或在下方輸入 ClinePass API 金鑰,然後點按“重試”。","Complete %@ OAuth, then click Retry.":"完成 %@ 的 OAuth 授權,然後點按“重試”。","Start the local %@ service, then click Retry.":"啟動本地 %@ 服務,然後點按“重試”。","Enter the required API or cloud credentials below, then press Save & Connect.":"在下方填入所需的 API 或雲憑證,然後點按“儲存並連線”。","No sign-in is required. Click Retry to refresh quota.":"無需登入。點按“重試”即可重新整理配額。","Add an API key or token in Provider Settings.":"請在服務商設定中新增 API 金鑰或權杖。","Add the required API or cloud credentials in Provider Settings.":"請在服務商設定中填入所需的 API 或雲憑證。","Reconnect %@":"重新連線 %@","Claude Code credentials need to be refreshed.":"Claude Code 憑證需要重新整理。","Open Claude Code in your terminal and type `/login`, then click Reconnect.":"在終端中開啟 Claude Code 並輸入 `/login`,然後點按“重新連線”。","Codex credentials need to be refreshed.":"Codex 憑證需要重新整理。","Run `codex login` in your terminal, then click Reconnect.":"在終端中執行 `codex login`,然後點按“重新連線”。","Kimi Code credentials need to be refreshed.":"Kimi Code 憑證需要重新整理。","Run the Kimi CLI once to refresh your login, then click Reconnect.":"執行一次 Kimi 命令列工具以重新整理登入,然後點按“重新連線”。","Gemini credentials need to be refreshed.":"Gemini 憑證需要重新整理。","Run the Gemini CLI once to refresh your login, then click Reconnect.":"執行一次 Gemini 命令列工具以重新整理登入,然後點按“重新連線”。","Copilot credentials need to be refreshed.":"Copilot 憑證需要重新整理。","Sign in with the Copilot CLI, an editor plugin, or `gh auth login`, then click Reconnect.":"透過 Copilot 命令列工具、編輯器外掛或 `gh auth login` 登入,然後點按“重新連線”。","The local Antigravity service is unavailable.":"本地 Antigravity 服務不可用。","Start the Antigravity app, then click Reconnect.":"啟動 Antigravity 應用,然後點按“重新連線”。","%@ credentials need to be refreshed.":"%@ 憑證需要重新整理。","Sign in to %@ again, then retry.":"請重新登入 %@,然後重試。","No Copilot credentials found":"未找到 Copilot 憑證","Sign in via an editor's Copilot plugin first. Then click Try Again.":"請先透過編輯器的 Copilot 外掛登入,然後點按“再試一次”。","Copilot quota tracking disconnected":"已斷開 Copilot 配額追蹤","Your Copilot credentials are untouched. Click Connect to resume.":"你的 Copilot 憑證不會受到影響。點按“連線”即可恢復。","Usage tracking still works. For live quota, sign in with the Copilot CLI or gh auth login, or paste a token below, then click Connect.":"用量追蹤仍然有效。如需實時配額,請透過 Copilot 命令列工具或 gh auth login 登入,或在下方貼上權杖,然後點按“連線”。","Quota tracking disconnected. Credentials are untouched. Click Connect to resume.":"已斷開配額追蹤。憑證不會受到影響。點按“連線”即可恢復。","Grok Bot is not installed. Install the Grok Bot app, then click Retry.":"尚未安裝 Grok Bot。請先安裝 Grok Bot 應用,然後點按“重試”。","Sign in to the Cursor app with the account Grok Bot uses, then click Retry.":"請使用 Grok Bot 所用的帳戶登入 Cursor 應用,然後點按“重試”。","Cursor rejected the current app session. Sign in again, then click Retry.":"Cursor 拒絕了當前的應用會話。請重新登入,然後點按“重試”。","Could not read the Cursor app's local session data. Quit and reopen Cursor, then click Retry.":"無法讀取 Cursor 應用的本地會話資料。請退出並重新開啟 Cursor,然後點按“重試”。","This account has no included Grok Bot allowance.":"此帳戶不含 Grok Bot 用量額度。","Grok Bot usage is drawn from a pooled enterprise allowance, which has no per-account reading.":"Grok Bot 用量來自企業共享額度,無法讀取單個帳戶的數值。","Cursor rate-limited the quota request.":"Cursor 限制了配額請求的頻率。","Grok Bot quota is temporarily unavailable.":"暫時無法獲取 Grok Bot 配額。","Cursor returned an unrecognized Grok Bot quota response.":"Cursor 返回了無法識別的 Grok Bot 配額響應。","Network error fetching Grok Bot quota.":"獲取 Grok Bot 配額時發生網路錯誤。","Update Check Failed":"檢查更新失敗","CLI Update Failed":"命令列工具更新失敗","Menubar Update Failed":"選單欄應用更新失敗","CodeBurn could not check for updates.":"CodeBurn 無法檢查更新。","CodeBurn could not update the CLI.":"CodeBurn 無法更新命令列工具。","CodeBurn could not update the menubar app.":"CodeBurn 無法更新選單欄應用。","Click to retry the update check.":"點按以重新檢查更新。","Click to retry the update.":"點按以重新嘗試更新。","Updating...":"正在更新…","Update":"更新","Update the CLI and menubar to the latest release":"將命令列工具和選單欄應用更新到最新版本","Desktop Update Failed":"桌面應用程式更新失敗","CodeBurn could not update the desktop app.":"CodeBurn 無法更新桌面應用程式。","Updating CLI...":"正在更新命令列工具…","Updating menubar...":"正在更新選單欄應用…","Opening CodeBurn to update...":"正在開啟 CodeBurn 以進行更新…","Update the CLI, menubar and desktop app to the latest release":"將命令列工具、選單欄應用和桌面應用程式更新到最新版本","CodeBurn %@ available":"CodeBurn %@ 可用","App and CLI %@ updates are ready. Click to install.":"應用與命令列工具 %@ 更新已就緒。點按以安裝。","Click to install the update.":"點按以安裝更新。","CodeBurn CLI %@ available":"CodeBurn 命令列工具 %@ 可用","Could not find the package manager for %1$@. Run “%2$@” manually, then try again.":"找不到 %1$@ 對應的套件管理器。請手動執行“%2$@”,然後重試。","the CLI":"命令列工具","This codeburn CLI comes with the CodeBurn desktop app. Update the desktop app, then try again.":"此 codeburn 命令列工具隨 CodeBurn 桌面應用程式提供。請更新桌面應用程式,然後重試。","npm does not have permission to update the global codeburn install. Run “%@” in Terminal, then try again.":"npm 沒有更新全域 codeburn 安裝的權限。請在終端機中執行“%@”,然後重試。","CLI update failed (exit %lld)":"命令列工具更新失敗(退出碼 %lld)","Your codeburn CLI (%1$@) is too old to update the menubar. Run “%2$@” first, then try again.":"你的 codeburn 命令列工具(%1$@)版本過舊,無法更新選單欄應用。請先執行“%2$@”,然後重試。","Update failed (exit %lld)":"更新失敗(退出碼 %lld)","GitHub returned HTTP %lld.":"GitHub 返回 HTTP %lld。","No mac-v release with a menubar zip and checksum was found.":"未找到包含選單欄 zip 與校驗和的 mac-v 版本。","Terminal (macOS default)":"終端(macOS 預設)","%@ credits":"%@ 點數","CodeBurn %1$@ · %2$lld of %3$lld devices reporting":"CodeBurn %1$@ · %2$lld/%3$lld 臺裝置已上報","Settings…":"設定…","Capacity Dock Settings…":"容量 Dock 設定…","Refresh Now":"立即重新整理","Check for Updates":"檢查更新","About CodeBurn":"關於 CodeBurn","Quit CodeBurn":"退出 CodeBurn","Today · no usage yet":"今天 · 暫無用量","1 call":"1 次呼叫","%lld calls":"%lld 次呼叫","Today · %1$@ · %2$@":"今天 · %1$@ · %2$@","CodeBurn Settings":"CodeBurn 設定","Update Available":"有可用更新","%1$@ is available (you have %2$@).":"%1$@ 已釋出(你當前為 %2$@)。","%1$@ Your codeburn CLI is too old to install it. First run:\n\n%2$@\n\nthen:\n\ncodeburn menubar --force":"%1$@ 你的 codeburn 命令列工具版本過舊,無法安裝。請先執行:\n\n%2$@\n\n然後:\n\ncodeburn menubar --force","%@ Run:\n\ncodeburn menubar --force":"%@ 執行:\n\ncodeburn menubar --force","Up to Date":"已是最新版本","You're on the latest version (%@).":"你已使用最新版本(%@)。","OK":"好","This total may be incomplete.":"此總計可能不完整。","Claude config":"Claude 配置","No %1$@ data for %2$@":"%1$@ 在%2$@沒有資料","Couldn't load %@":"無法載入%@","Retry":"重試","Loading %@…":"正在載入%@…","Your AI Bill, Itemized":"你的 AI 帳單,逐項明細","%1$@ over limit (%2$lld%%)":"%1$@ 已超限(%2$lld%%)","resets in %@":"%@後重置","Change accent color":"更改主題色","Copy update command to clipboard":"將更新命令複製到剪貼簿","Enjoying CodeBurn?":"喜歡 CodeBurn 嗎?","Star us on GitHub":"在 GitHub 上點個 Star","Hide this banner":"隱藏此橫幅","CSV (folder)":"CSV(資料夾)","JSON":"JSON","Export":"匯出","Full Report":"完整報告","%@ call":"%@ 次呼叫","%@ calls":"%@ 次呼叫","Daily budget of %@ exceeded":"已超出每日預算 %@","Combined unavailable · showing local":"合併資料不可用 · 顯示本機資料","Combined · %@":"合併 · %@","Saved %@ with local models":"使用本地模型節省了 %@","%1$lld of %2$lld devices":"%1$lld/%2$lld 臺裝置","%@ · local":"%@ · 本機","Clear":"清除","Done":"完成","Pick dates":"選擇日期","1 day":"1 天","%lld days":"%lld 天","Show previous providers":"顯示上一組服務商","Show next providers":"顯示下一組服務商","Loading…":"正在載入…","Sign in with `codex` (ChatGPT mode) to track quota.":"使用 `codex`(ChatGPT 模式)登入以追蹤配額。","Sign in to Claude Code to track quota.":"登入 Claude Code 以追蹤配額。","Sign in to track quota.":"登入以追蹤配額。","%@ usage":"%@ 用量","stale":"已過期","retrying":"正在重試","Activity":"活動","Cost":"花費","Turns":"輪次","1-shot":"一次透過","Models":"模型","Saved":"已節省","Calls":"呼叫","Tokens":"Token","%@ in":"輸入 %@","%@ out":"輸出 %@","%1$@ in · %2$@ out · %3$@ cache read":"輸入 %1$@ · 輸出 %2$@ · 快取讀取 %3$@","%@%% cache hit":"快取命中 %@%%","1 model unpriced, counted at $0 · %@ tokens":"1 個模型無定價,按 $0 計入 · %@ Token","%1$lld models unpriced, counted at $0 · %2$@ tokens":"%1$lld 個模型無定價,按 $0 計入 · %2$@ Token","~ estimated cost (priced from estimated tokens)":"~ 估算成本(依估算的 Token 數計價)","Pull requests":"拉取請求","Tooling":"工具鏈","Tools":"工具","Skills & Agents":"技能與子代理","MCP Servers":"MCP 伺服器","Tips for you":"為你的建議","%lld signals":"%lld 條訊號","Open Full Optimize":"開啟完整優化報告","Cache hit at %lld%% — most prompts reuse cache":"快取命中率 %lld%% — 多數提示複用了快取","%lld%% one-shot — edits landing first try":"一次透過率 %lld%% — 編輯大多一次成功","Spend down %lld%% vs last 7 days":"支出較前 7 天下降 %lld%%","%lld-day usage streak":"已連續使用 %lld 天","Spend up %lld%% vs prior 7 days":"支出較前 7 天上升 %lld%%","Cache hit only %lld%% — paying for cold prompts":"快取命中率僅 %lld%% — 正在為冷提示付費","%lld%% one-shot — lots of iteration":"一次透過率 %lld%% — 反覆修改較多","On pace for %1$@ this month (+%2$lld%% vs last)":"按當前速度本月將達 %1$@(較上月 +%2$lld%%)","What's working":"做得好的","What to improve":"可以改進的","Risks":"風險","Last %lld days":"最近 %lld 天","%1$@%% vs prior %2$lldd":"%1$@%% 較前 %2$lld 天","Avg/day":"日均","Peak":"峰值","Yesterday":"昨天","Total":"總計","%@ tokens":"%@ Token","%1$@ on %2$@":"%1$@(%2$@)","Daily activity":"每日活動","%lld active days":"%lld 個活躍日","Peak day":"峰值日","Avg active":"活躍日均值","Streak":"連續天數","%lldd":"%lld 天","Mon":"一","Wed":"三","Fri":"五","Sun":"日","Daily detail":"每日明細","Hover a day":"懸停檢視某天","Future day":"未來日期","No tracked usage":"無追蹤到的用量","%@: future day":"%@:未來日期","%@: no tracked usage":"%@:無追蹤到的用量","%1$@: %2$@, %3$lld calls, %4$@ tokens":"%1$@:%2$@,%3$lld 次呼叫,%4$@ Token","Month-to-date":"本月至今","On pace for":"預計本月","Avg/day (this wk)":"日均(本週)","Last 7d":"最近 7 天","no prior month":"無上月資料","%1$@%% vs last month (%2$@)":"%1$@%% 較上月(%2$@)","Cache hit":"快取命中","Cost / session":"每會話花費","Cost/edit":"每次編輯花費","Save ~%1$@ / ~%2$@ tokens · 1 finding":"可省約 %1$@ / 約 %2$@ Token · 1 項建議","Save ~%1$@ / ~%2$@ tokens · %3$lld findings":"可省約 %1$@ / 約 %2$@ Token · %3$lld 項建議","Favorite model":"最常用模型","Active days (month)":"活躍天數(本月)","Most active day":"最活躍的一天","Peak day spend":"峰值日支出","Sessions":"會話","Current streak":"當前連續","Longest streak":"最長連續","Tracked spend (last %lld days)":"已追蹤支出(最近 %lld 天)","Costliest session":"花費最高的會話","Retry tax":"重試成本","%1$lld retries across %2$lld retried edits":"%2$lld 次需要重試的編輯中共 %1$lld 次重試","%@ ret/edit":"%@ 次重試/編輯","Hides session details":"隱藏會話詳情","Shows session details":"顯示會話詳情","Expanded":"已展開","Collapsed":"已摺疊"," %lld call":" %lld 次呼叫"," %lld calls":" %lld 次呼叫","Potential savings":"潛在節省","%lld%% of spend":"佔支出 %lld%%","could be optimized":"可以優化","Routing waste":"路由浪費","vs %1$@ @ %2$@/edit":"對比 %1$@(%2$@/次編輯)","Connect Claude subscription":"連線 Claude 訂閱","CodeBurn will read your Claude Code credentials once. macOS will ask permission. After that, the live quota bar shows next to the Claude tab and updates automatically.":"CodeBurn 只會讀取一次你的 Claude Code 憑證,macOS 會請求授權。之後實時配額條會顯示在 Claude 標籤旁並自動更新。","Reading Claude credentials...":"正在讀取 Claude 憑證…","No Claude credentials found":"未找到 Claude 憑證","Sign in with Claude Code first: open `claude` in your terminal and type `/login`. Then click Try Again.":"請先登入 Claude Code:在終端中開啟 `claude` 並輸入 `/login`,然後點按“再試一次”。","Anthropic temporarily unreachable. Retrying.":"暫時無法連線 Anthropic,正在重試。","Reconnect Claude":"重新連線 Claude","Your Claude session has expired. Open Claude Code in your terminal and type `/login`, then click Reconnect.":"你的 Claude 會話已過期。在終端中開啟 Claude Code 並輸入 `/login`,然後點按“重新連線”。","Resets %@":"重置:%@","5-hour window":"5 小時視窗","7-day total":"7 天總計","7-day Opus":"7 天 Opus","7-day Sonnet":"7 天 Sonnet","7-day %@":"7 天 %@","Try Again":"再試一次","Couldn't load plan data":"無法載入方案資料","Connect ChatGPT subscription":"連線 ChatGPT 訂閱","CodeBurn will read your Codex CLI credentials once. After that, the live quota bar shows next to the Codex tab and updates automatically.":"CodeBurn 只會讀取一次你的 Codex 命令列工具憑證。之後實時配額條會顯示在 Codex 標籤旁並自動更新。","Reading Codex CLI credentials...":"正在讀取 Codex 命令列工具憑證…","No Codex credentials found":"未找到 Codex 憑證","Sign in with Codex first: run `codex login` in your terminal. Then click Try Again.":"請先登入 Codex:在終端中執行 `codex login`,然後點按“再試一次”。","ChatGPT temporarily unreachable. Retrying.":"暫時無法連線 ChatGPT,正在重試。","Reconnect Codex":"重新連線 Codex","Your ChatGPT session has expired. Run `codex login` in your terminal, then click Reconnect.":"你的 ChatGPT 會話已過期。在終端中執行 `codex login`,然後點按“重新連線”。","%@ window":"%@ 視窗","Credits":"點數","Unlimited":"無限制","Limit resets":"限額重置","No Kimi Code credentials found":"未找到 Kimi Code 憑證","Sign in with the Kimi CLI first. Then click Try Again.":"請先透過 Kimi 命令列工具登入,然後點按“再試一次”。","Reading Kimi Code credentials...":"正在讀取 Kimi Code 憑證…","Kimi temporarily unreachable. Retrying.":"暫時無法連線 Kimi,正在重試。","Refresh Kimi Code login":"重新整理 Kimi Code 登入","Kimi Code tokens are short-lived. Run the Kimi CLI once to refresh your login, then click Reconnect.":"Kimi Code 的權杖有效期很短。執行一次 Kimi 命令列工具以重新整理登入,然後點按“重新連線”。","Parallel sessions":"並行會話","Login idle. Run the Kimi CLI to refresh.":"登入已閒置。執行 Kimi 命令列工具以重新整理。","as of %@":"截至 %@","No Gemini credentials found":"未找到 Gemini 憑證","Sign in with the Gemini CLI first. Then click Try Again.":"請先透過 Gemini 命令列工具登入,然後點按“再試一次”。","Reading Gemini credentials...":"正在讀取 Gemini 憑證…","Gemini temporarily unreachable. Retrying.":"暫時無法連線 Gemini,正在重試。","Refresh Gemini login":"重新整理 Gemini 登入","Your Gemini login has expired. Run the Gemini CLI once to refresh it, then click Reconnect.":"你的 Gemini 登入已過期。執行一次 Gemini 命令列工具以重新整理,然後點按“重新連線”。","Login idle. Run the Gemini CLI to refresh.":"登入已閒置。執行 Gemini 命令列工具以重新整理。","Reading Copilot credentials...":"正在讀取 Copilot 憑證…","GitHub temporarily unreachable. Retrying.":"暫時無法連線 GitHub,正在重試。","Refresh Copilot login":"重新整理 Copilot 登入","Your Copilot sign-in has expired. Sign in via an editor's Copilot plugin again, then click Reconnect.":"你的 Copilot 登入已過期。請重新透過編輯器的 Copilot 外掛登入,然後點按“重新連線”。","Login idle. Sign in via an editor's Copilot plugin to refresh.":"登入已閒置。透過編輯器的 Copilot 外掛登入以重新整理。","No local Antigravity server found":"未找到本地 Antigravity 服務","Start the Antigravity app, then click Try Again.":"啟動 Antigravity 應用,然後點按“再試一次”。","Probing the local Antigravity server...":"正在探測本地 Antigravity 服務…","Local Antigravity server unreachable. Retrying.":"無法連線本地 Antigravity 服務,正在重試。","Reconnect Antigravity":"重新連線 Antigravity","Server disconnected. Start the Antigravity app to refresh.":"服務已斷開。啟動 Antigravity 應用以重新整理。","On pace":"符合節奏","On pace: %@ at reset":"符合節奏:重置時 %@","%@%% in deficit":"超出 %@%%","%@%% in reserve":"結餘 %@%%","%1$@ · hits 100%% %2$@":"%1$@ · %2$@達到 100%%","%1$@ · %2$@ at reset":"%1$@ · 重置時 %2$@","On pace: %1$@ at reset · hits 100%% %2$@":"符合節奏:重置時 %1$@ · %2$@達到 100%%","Based on last cycle: %@":"按上一週期估算:%@","in %lldm":"%lld 分鐘後","in %lldh":"%lld 小時後","in %lldd":"%lld 天後","Dock to Edge":"停靠到邊緣","Left":"左側","Right":"右側","Top":"頂部","Bottom":"底部","Hide Capacity Dock":"隱藏容量 Dock","Capacity Dock":"容量 Dock","Unknown":"未知","Click to keep Capacity Dock expanded":"點按以保持容量 Dock 展開","Click to switch between this provider's usage windows":"點按以在該服務商的用量週期之間切換","Show %@ usage":"顯示 %@ 用量","none running":"無執行中","Kimi Code":"Kimi Code","Gemini":"Gemini","Copilot":"Copilot","Antigravity":"Antigravity","1 running":"1 個執行中","%lld running":"%lld 個執行中","%@ left":"剩餘 %@","Open in %@":"在 %@ 中開啟","Bring %@ to front":"將 %@ 移到最前","burned":"已消耗","today %1$@ of %2$@":"今天 %1$@ / %2$@","no budget set":"未設定預算","Refreshing…":"正在重新整理…","Last known usage · refreshing":"最近已知用量 · 正在重新整理","Last known usage · retrying":"最近已知用量 · 正在重試","Not connected":"未連線","Reconnect required":"需要重新連線","General":"通用","Providers":"服務商","%lld on":"%lld 個已開啟","About":"關於","Settings":"設定","Search providers":"搜尋服務商","Enter an amount above, or the alert stays off.":"請在上方輸入金額,否則提醒不會生效。","Flame icon turns yellow when today's tokens pass the daily budget.":"當今天的 Token 超過每日預算時,火焰圖示會變為黃色。","Flame icon turns yellow when today's cost pass the daily budget.":"當今天的花費超過每日預算時,火焰圖示會變為黃色。","Display":"顯示","Currency":"貨幣","Metric":"指標","Cost ($)":"花費($)","Tokens (↑↓)":"Token(↑↓)","Total Tokens":"Token 總計","Credits (Codex)":"點數(Codex)","Icon Only":"僅圖示","Period":"時間範圍","Scope":"範圍","Accent":"主題色","Usage Refresh":"用量重新整理","Update every":"更新間隔","How often the menubar figure re-reads your local session data. Auto refreshes every 30 seconds while you're plugged in and backs off on battery; Manual only refreshes when you open the popover or click Refresh Now.":"選單欄數字重新讀取本機會話資料的頻率。“自動”在接通電源時每 30 秒重新整理一次,使用電池時會放慢;“手動”僅在你開啟彈窗或點按“立即重新整理”時重新整理。","Updates":"更新","Notify me about updates":"有更新時通知我","Posts a notification when a new CodeBurn release is available. Click it to install.":"當有新的 CodeBurn 版本釋出時傳送通知。點按通知即可安裝。","Terminal":"終端","Open commands in":"命令開啟方式","%@ (not installed)":"%@(未安裝)","Where Full Report and Optimize open. If the chosen app isn't installed CodeBurn falls back to Terminal; if that's missing too the command runs in the background. Only terminals that can script a command into a live window are listed.":"“完整報告”和“優化”的開啟位置。如果所選應用未安裝,CodeBurn 會回退到“終端”;若“終端”也不存在,命令將在背景執行。此處僅列出能夠將命令寫入活動視窗的終端。","Alerts":"提醒","Daily budget":"每日預算","Off":"關閉","Custom…":"自定義…","Amount":"金額","M tokens":"百萬 Token","Show Capacity Dock":"顯示容量 Dock","Resting provider":"預設服務商","Size":"大小","Capacity Dock size":"容量 Dock 大小","Appearance":"外觀","Gauge shape":"儀表形狀","Dock providers":"Dock 中的服務商","Connect a provider from its sidebar page to make it available here.":"請在邊欄的服務商頁面中連線服務商,它才會出現在這裡。","Needs attention":"需要處理","Connected providers and anything already shown in the dock appear here, so a provider can always be removed even if its connection later fails.":"已連線的服務商以及已顯示在 Dock 中的專案都會列在這裡,因此即使某個服務商之後連線失敗,也始終可以將其移除。","Connection":"連線","Config Directories":"配置目錄","Aggregate usage across multiple Claude config directories (e.g. work and personal accounts). Leave empty to track just the default `~/.claude`. The `CLAUDE_CONFIG_DIRS` environment variable, if set, overrides this list.":"彙總多個 Claude 配置目錄(例如工作與個人帳戶)的用量。留空則僅追蹤預設的 `~/.claude`。如果設定了 `CLAUDE_CONFIG_DIRS` 環境變數,它會覆蓋此列表。","Quota Refresh":"配額重新整理","Anthropic rate-limits this endpoint per account. 2 minutes is plenty for the 5-hour and weekly windows; pick Manual if you only want updates on demand.":"Anthropic 會按帳戶對該介面限流。對於 5 小時和每週視窗,2 分鐘已經足夠;如果只想按需更新,請選擇“手動”。","Connected":"已連線","Backing off":"正在退避","Connecting…":"正在連線…","Ready":"就緒","Plan: %@":"方案:%@","Live quota tracked from Anthropic.":"實時配額來自 Anthropic。","Anthropic rate-limited; auto-retrying.":"Anthropic 已限流,正在自動重試。","macOS may ask permission to read your credentials.":"macOS 可能會請求讀取你的憑證的許可權。","Background refresh in progress.":"正在背景重新整理。","Tap Load Quota to fetch live usage from Anthropic.":"點按“載入配額”以從 Anthropic 獲取實時用量。","Click Connect to read your Claude Code credentials and start tracking quota.":"點按“連線”以讀取你的 Claude Code 憑證並開始追蹤配額。","Disconnect":"斷開連線","Disconnect Claude?":"要斷開 Claude 連線嗎?","Cancel":"取消","CodeBurn will stop tracking quota and clear its connection state plus any legacy credential cache. Your Claude Code credential is untouched. Claude Code keeps working.":"CodeBurn 將停止追蹤配額,並清除其連線狀態以及任何舊版憑證快取。你的 Claude Code 憑證不會受到影響,Claude Code 仍可正常使用。","Load Quota":"載入配額","No extra directories. Tracking the default `~/.claude`.":"沒有額外目錄,正在追蹤預設的 `~/.claude`。","Remove":"移除","Add Directory…":"新增目錄…","Add":"新增","Choose one or more Claude config directories (each containing a `projects` folder).":"選擇一個或多個 Claude 配置目錄(每個目錄都應包含 `projects` 資料夾)。","Codex live-quota tracking follows the authoritative `~/.codex/auth.json` session directly and does not create a second Keychain copy. A legacy CodeBurn Keychain item, when present, is read only as a migration fallback. Only ChatGPT-mode auth (Plus / Pro / Team / Business / Edu / Enterprise) is supported. API-key users are billed per request and have a different reporting surface. Credit-metered workspaces report no rate-limit windows, so their monthly credit allowance is shown instead.":"Codex 實時配額追蹤直接沿用權威的 `~/.codex/auth.json` 會話,不會建立第二份鑰匙串副本。若存在舊版 CodeBurn 鑰匙串專案,僅作為遷移回退讀取。僅支援 ChatGPT 模式認證(Plus / Pro / Team / Business / Edu / Enterprise)。使用 API 金鑰的使用者按請求計費,報告方式不同。按點數計量的工作區不報告限流視窗,因此會改為顯示其每月點數額度。","How it works":"工作原理","Couldn't load Codex quota":"無法載入 Codex 配額","Live quota tracked from chatgpt.com.":"實時配額來自 chatgpt.com。","Codex is in API-key mode. Run `codex login` and choose a ChatGPT plan to enable quota tracking.":"Codex 處於 API 金鑰模式。執行 `codex login` 並選擇 ChatGPT 方案以啟用配額追蹤。","Run `codex login` in your terminal to sign in again, then click Reconnect.":"在終端中執行 `codex login` 重新登入,然後點按“重新連線”。","ChatGPT rate-limited; auto-retrying.":"ChatGPT 已限流,正在自動重試。","Reading ~/.codex/auth.json.":"正在讀取 ~/.codex/auth.json。","Tap Load Quota to fetch live usage from chatgpt.com.":"點按“載入配額”以從 chatgpt.com 獲取實時用量。","Click Connect to read your Codex CLI credentials. If Connect fails, run `codex login` in your terminal first to create ~/.codex/auth.json.":"點按“連線”以讀取你的 Codex 命令列工具憑證。如果連線失敗,請先在終端中執行 `codex login` 以建立 ~/.codex/auth.json。","Disconnect Codex?":"要斷開 Codex 連線嗎?","CodeBurn will stop tracking quota and clear its connection state plus any legacy credential cache. Your ~/.codex/auth.json is untouched. Codex CLI keeps working.":"CodeBurn 將停止追蹤配額,並清除其連線狀態以及任何舊版憑證快取。你的 ~/.codex/auth.json 不會受到影響,Codex 命令列工具仍可正常使用。","Kimi Code live-quota tracking reads `~/.kimi-code/credentials/kimi-code.json` directly. Nothing is copied or stored. Access tokens are short-lived (~15 minutes) and only the Kimi CLI refreshes them, so if the connection shows as expired, run the Kimi CLI once and click Reconnect.":"Kimi Code 實時配額追蹤直接讀取 `~/.kimi-code/credentials/kimi-code.json`,不會複製或儲存任何內容。存取權杖有效期很短(約 15 分鐘),且只有 Kimi 命令列工具會重新整理它們;因此若連線顯示為已過期,請執行一次 Kimi 命令列工具,然後點按“重新連線”。","Login refresh required":"需要重新整理登入","Couldn't load Kimi quota":"無法載入 Kimi 配額","Live quota tracked from api.kimi.com.":"實時配額來自 api.kimi.com。","Kimi rate-limited; auto-retrying.":"Kimi 已限流,正在自動重試。","Reading ~/.kimi-code credentials.":"正在讀取 ~/.kimi-code 憑證。","Tap Load Quota to fetch live usage from api.kimi.com.":"點按“載入配額”以從 api.kimi.com 獲取實時用量。","Sign in with the Kimi CLI first, then click Connect.":"請先透過 Kimi 命令列工具登入,然後點按“連線”。","Disconnect Kimi Code?":"要斷開 Kimi Code 連線嗎?","CodeBurn will stop tracking Kimi Code quota. Your ~/.kimi-code credentials are untouched. The Kimi CLI keeps working.":"CodeBurn 將停止追蹤 Kimi Code 配額。你的 ~/.kimi-code 憑證不會受到影響,Kimi 命令列工具仍可正常使用。","Gemini live-quota tracking reads `~/.gemini/oauth_creds.json` read-only. Nothing is copied or stored, and tokens stay in memory. If the connection shows as expired, run the Gemini CLI once to refresh your login, then click Reconnect.":"Gemini 實時配額追蹤以只讀方式讀取 `~/.gemini/oauth_creds.json`,不會複製或儲存任何內容,權杖僅保留在記憶體中。若連線顯示為已過期,請執行一次 Gemini 命令列工具以重新整理登入,然後點按“重新連線”。","Couldn't load Gemini quota":"無法載入 Gemini 配額","Live quota tracked from Google Code Assist.":"實時配額來自 Google Code Assist。","Gemini rate-limited; auto-retrying.":"Gemini 已限流,正在自動重試。","Reading ~/.gemini credentials.":"正在讀取 ~/.gemini 憑證。","Tap Load Quota to fetch live usage from Google Code Assist.":"點按“載入配額”以從 Google Code Assist 獲取實時用量。","Sign in with the Gemini CLI first, then click Connect.":"請先透過 Gemini 命令列工具登入,然後點按“連線”。","Disconnect Gemini?":"要斷開 Gemini 連線嗎?","CodeBurn will stop tracking Gemini quota. Your ~/.gemini credentials are untouched. The Gemini CLI keeps working.":"CodeBurn 將停止追蹤 Gemini 配額。你的 ~/.gemini 憑證不會受到影響,Gemini 命令列工具仍可正常使用。","Copilot live-quota tracking reads a GitHub token that is already on this Mac, read-only. Nothing is copied or stored. CodeBurn looks at the editor plugin files in `~/.config/github-copilot`, the Copilot CLI's `~/.copilot` files, the COPILOT_GITHUB_TOKEN, GH_TOKEN and GITHUB_TOKEN variables, `gh auth token`, and finally a token you paste below. Usage tracking works without any of this; only the live quota bars need a token. Every one of those carries the GitHub host it belongs to — the plugin files are keyed by host, the variables are read with GH_HOST, the `gh` login with the host in gh's own hosts.yml, and a pasted token with the host you type beside it — and a credential for a GitHub Enterprise Cloud host is queried on that tenant's own API (api..ghe.com), never sent to api.github.com.":"Copilot 實時配額追蹤以只讀方式讀取這臺 Mac 上已有的 GitHub 權杖,不會複製或儲存任何內容。CodeBurn 會依次檢視 `~/.config/github-copilot` 中的編輯器外掛檔案、Copilot 命令列工具的 `~/.copilot` 檔案、COPILOT_GITHUB_TOKEN、GH_TOKEN 和 GITHUB_TOKEN 環境變數、`gh auth token`,最後是你在下方貼上的權杖。用量追蹤無需這些內容,只有實時配額條才需要權杖。上述每一種來源都會帶上它所屬的 GitHub 主機——外掛檔案按主機分類,環境變數透過 GH_HOST 讀取,`gh` 登入取自 gh 自己 hosts.yml 中的主機,貼上的權杖則取自你在旁邊填寫的主機——而為 GitHub Enterprise Cloud 主機找到的憑證,只會向該租戶自己的 API(api..ghe.com)查詢,絕不會傳送到 api.github.com。","GitHub token":"GitHub 權杖","GitHub host":"GitHub 主機","Save & Connect":"儲存並連線","Clear Token":"清除權杖","Paste a token":"貼上權杖","Optional, and only needed when nothing else on this Mac is signed in. A fine-grained personal access token with the \"Plan: Read-only\" permission is enough. Leave the host at github.com unless the token was minted on a GitHub Enterprise Cloud tenant, in which case enter that tenant's host (.ghe.com) so the token is never sent to api.github.com. Both are saved in CodeBurn's own Keychain item and are used only to read your Copilot quota.":"可選,僅當這臺 Mac 上沒有其他已登入來源時才需要。一個具有 \"Plan: Read-only\" 許可權的細粒度個人存取權杖即可。主機請保持為 github.com,除非該權杖是在 GitHub Enterprise Cloud 租戶上簽發的;若是,請填入該租戶的主機(.ghe.com),這樣權杖就絕不會傳送到 api.github.com。兩者都儲存在 CodeBurn 自己的鑰匙串專案中,且僅用於讀取你的 Copilot 配額。","Couldn't load Copilot quota":"無法載入 Copilot 配額","Live quota tracked from %@.":"實時配額來自 %@。","Plan: %1$@. Live quota tracked from %2$@.":"方案:%1$@。實時配額來自 %2$@。","Sign in again with the Copilot CLI, an editor's Copilot plugin, or gh auth login, then click Reconnect.":"請透過 Copilot 命令列工具、編輯器的 Copilot 外掛或 gh auth login 重新登入,然後點按“重新連線”。","GitHub rate-limited; auto-retrying.":"GitHub 已限流,正在自動重試。","Looking for a GitHub token on this Mac.":"正在這臺 Mac 上查詢 GitHub 權杖。","Tap Load Quota to fetch live usage from GitHub.":"點按“載入配額”以從 GitHub 獲取實時用量。","Tap Load Quota to fetch live usage from %@.":"點按“載入配額”以從 %@ 獲取實時用量。","CodeBurn cannot read Copilot quota for %@. Use github.com or a GitHub Enterprise Cloud host (*.ghe.com).":"CodeBurn 無法讀取 %@ 的 Copilot 配額。請使用 github.com 或 GitHub Enterprise Cloud 主機(*.ghe.com)。","Disconnect Copilot?":"要斷開 Copilot 連線嗎?","CodeBurn will stop tracking Copilot quota. Every credential it read stays untouched, and your Copilot clients keep working.":"CodeBurn 將停止追蹤 Copilot 配額。它讀取過的所有憑證都不會受到影響,你的 Copilot 客戶端仍可正常使用。","Antigravity live-quota tracking talks to the Antigravity app's local language server on 127.0.0.1 only. Nothing leaves the machine and no credential files are read. If it shows as disconnected, start the Antigravity app, then click Reconnect.":"Antigravity 實時配額追蹤僅透過 127.0.0.1 與 Antigravity 應用的本地語言服務通訊。沒有任何資料離開這臺機器,也不會讀取憑證檔案。若顯示為已斷開,請啟動 Antigravity 應用,然後點按“重新連線”。","Couldn't load Antigravity quota":"無法載入 Antigravity 配額","Live quota tracked from the local Antigravity server.":"實時配額來自本地 Antigravity 服務。","Local probe failed; auto-retrying.":"本地探測失敗,正在自動重試。","Probing the local Antigravity language server.":"正在探測本地 Antigravity 語言服務。","Tap Load Quota to probe the local Antigravity server.":"點按“載入配額”以探測本地 Antigravity 服務。","Start the Antigravity app first, then click Connect.":"請先啟動 Antigravity 應用,然後點按“連線”。","No local Antigravity server found. Start the Antigravity app, then click Reconnect.":"未找到本地 Antigravity 服務。啟動 Antigravity 應用,然後點按“重新連線”。","Disconnect Antigravity?":"要斷開 Antigravity 連線嗎?","CodeBurn will stop tracking Antigravity quota. Nothing is read from or written to disk. The Antigravity app keeps working.":"CodeBurn 將停止追蹤 Antigravity 配額。不會從磁碟讀取或寫入任何內容,Antigravity 應用仍可正常使用。","Not yet supported":"暫不支援","Automatic connection uses the provider's existing app, CLI, OAuth, browser session, or environment credentials first. CodeBurn does not copy those source credentials into its Keychain.":"自動連線會優先使用服務商已有的應用、命令列工具、OAuth、瀏覽器會話或環境憑證。CodeBurn 不會把這些來源憑證複製到自己的鑰匙串中。","Authentication methods are listed for reference. A native CodeBurn quota adapter is required before this provider can connect to Capacity Dock.":"此處列出的認證方式僅供參考。該服務商需要原生的 CodeBurn 配額介面卡,才能連線到容量 Dock。","Authentication methods":"認證方式","Source":"來源","API key or token":"API 金鑰或權杖","Clear Override":"清除覆蓋設定","Loading saved provider credential":"正在載入已儲存的服務商憑證","Connection override":"連線覆蓋設定","Overrides are optional and are saved only when you press Save & Connect. Secret values use one CodeBurn-owned Keychain item for this provider; background reads suppress authentication UI.":"覆蓋設定是可選的,僅在你點按“儲存並連線”時才會儲存。機密值會為該服務商使用一個由 CodeBurn 擁有的鑰匙串專案;背景讀取不會彈出認證介面。","Remove saved override":"移除已儲存的覆蓋設定","Saved data":"已儲存的資料","This credential predates a live CodeBurn quota adapter and is not treated as a connection.":"此憑證早於 CodeBurn 的實時配額介面卡,不會被視為一個連線。","Quota adapter not available":"配額介面卡不可用","Retrying":"正在重試","Cline login expired":"Cline 登入已過期","%@ is catalogued, but CodeBurn cannot fetch its live quota yet.":"%@ 已收錄,但 CodeBurn 還無法獲取其實時配額。","Live quota is available to Capacity Dock.":"實時配額已可供容量 Dock 使用。","Waiting for quota data.":"正在等待配額資料。","Automatic":"自動","CLI":"命令列工具","API":"API","Version %@":"版本 %@","%@ is available. Choose Check for Updates in the CodeBurn menu to install it.":"%@ 已釋出。在 CodeBurn 選單中選擇“檢查更新”即可安裝。","GitHub":"GitHub","Website":"網站","Issues":"問題反饋","Links":"連結","© 2026 Resham Joshi (iamtoruk) · AgentSeal. MIT License.":"© 2026 Resham Joshi (iamtoruk) · AgentSeal. MIT 許可證。","Second row":"第二行","Second row shows":"第二行顯示","Adds a smaller second line under the menubar figure. Quota remaining tracks whichever connected provider is nearest its limit. The line hides itself while the chosen metric has no data.":"在選單欄數字下方新增一行較小的文字。“剩餘配額”會追蹤最接近限額的已連線服務商。當所選指標暫無資料時,該行會自動隱藏。","Quota remaining":"剩餘配額","Today's cost":"今日花費","Today's tokens":"今日 Token","Active sessions":"活躍會話","%@ today":"今日 %@","%@ tok today":"今日 %@ tok","%lld%% left":"剩餘 %lld%%","Monthly":"每月","Monthly usage limit":"每月用量上限","Monthly usage limit · limit reached":"每月用量上限 · 已達上限","Monthly usage limit · %1$@ / %2$@ credits":"每月用量上限 · %1$@ / %2$@ 點數","%@ · limit reached":"%@ · 已達上限","Last known usage":"最近已知用量","Notifications":"通知","Notify me when Codex banks a limit reset":"Codex 獲得限額重置額度時通知我","OpenAI sometimes grants Codex accounts a credit that resets a rate-limit window early. CodeBurn reads these from the quota response it already fetches and tells you once per grant. It never spends one.":"OpenAI 有時會向 Codex 帳戶發放一份額度,用於提前重置某個限流視窗。CodeBurn 會從它已經獲取的配額響應中讀取這些額度,並為每次發放提醒你一次。CodeBurn 絕不會使用這些額度。","Notify me when a quota resets early":"配額提前重置時通知我","Posts a notification when a provider resets a usage limit before its scheduled time, so you know the capacity is back.":"當某個服務商在預定時間之前重置用量限額時傳送通知,讓你知道額度已經恢復。","cache read":"快取讀取","Cache read: %@ tokens":"快取讀取:%@ Token","Quota window %@":"配額視窗 %@","Language":"語言","System":"跟隨系統","Follows System Settings > Language & Region unless you pick one here.":"除非在此處選擇,否則將跟隨“系統設定 > 語言與地區”。","5-hour":"5 小時","<1m":"<1 分","%@ quota reset early":"%@ 配額已提前重置","%@ quota cleared early":"%@ 配額已提前清零","You're back to %lld%%.":"你已恢復到 %lld%%。","%1$@'s %2$@ reset %3$@ early. %4$@":"%1$@ 的%2$@提前 %3$@重置。%4$@","%1$@ cleared your %2$@ %3$@ before its reset. %4$@":"%1$@ 清空了你的%2$@,比其重置提前 %3$@。%4$@","%lldh":"%lld 小時","%@ limit":"%@ 限額","5-hour limit":"5 小時限額","weekly limit":"每週限額","Opus weekly limit":"Opus 每週限額","Sonnet weekly limit":"Sonnet 每週限額","weekly":"每週","Opus weekly":"Opus 每週","Sonnet weekly":"Sonnet 每週","5-hour usage":"5 小時用量","weekly usage":"每週用量","Opus weekly usage":"Opus 每週用量","Sonnet weekly usage":"Sonnet 每週用量","%lld available":"%lld 個可用","%lld usable now":"%lld 個現在可用","next %1$@ lands %2$@":"下一次%1$@將於 %2$@到帳","latest %1$@ granted %2$@":"最近一次%1$@於 %2$@發放","next expires %@":"下一個將於 %@過期","A %1$@ lands %2$@.":"一次%1$@將於 %2$@到帳。","A %1$@ was added to your account %2$@.":"%1$@已於 %2$@新增到你的帳戶。","A %@ was added to your account.":"%@已新增到你的帳戶。","You have %lld available to use.":"你有 %lld 個可以使用。","Codex banked a limit reset":"Codex 存入了一次限額重置","limit reset":"限額重置","%@ reset":"%@重置","daily":"每日","monthly":"每月","hourly":"每小時","just now":"剛剛","%lldm ago":"%lld 分鐘前","%lldh ago":"%lld 小時前","%lldd ago":"%lld 天前","in under a minute":"不到一分鐘後","Input tokens reused from this provider's prompt cache today — not fresh input (arrow.down), not cache writes, and already priced at the cache-read rate inside the burned figure.":"今天從該服務商提示快取中複用的輸入 Token。不是新的輸入(arrow.down),也不是快取寫入,並且已按快取讀取費率計入已消耗金額。","%1$@ · %2$@ at 80%%":"%1$@ · %2$@ 已達 80%%","%1$@ · %2$@ limit reached":"%1$@ · %2$@ 已達上限","Quota crossings (%1$lld%% and %2$lld%%)":"配額跨越(%1$lld%% 與 %2$lld%%)","Privacy":"隱私","Anonymous usage statistics":"匿名使用統計","Managed by the CodeBurn desktop app. Change it there under Settings → Privacy & data.":"由 CodeBurn 桌面應用程式管理。請在設定 → 隱私與資料中更改。","Optional usage statistics: the names of the models, tools and providers you use, with bucketed counts of how often each one came up, plus when the app is opened. A random install id, the app version and your country code travel with them. Never your prompts, your code, your project and file names, or exact amounts.":"選填的使用統計資訊:您使用的模型、工具和服務商的名稱,以及每項出現頻率的分段計數,還有應用程式的開啟次數。隨附的還有隨機安裝 ID、應用程式版本和國家/地區代碼。絕不包含您的提示詞、程式碼、專案與檔案名稱或確切金額。","Synced from cursor.com %@":"已從 cursor.com 同步(%@)","Not synced from cursor.com yet":"尚未從 cursor.com 同步","Cursor login expired, open Cursor to sign in again":"Cursor 登入已過期,請開啟 Cursor 重新登入","Couldn't reach cursor.com, will retry":"無法連線到 cursor.com,將會重試","Couldn't read the usage export from cursor.com, will retry":"無法讀取 cursor.com 的用量匯出,將會重試","Sync Cursor usage from cursor.com":"從 cursor.com 同步 Cursor 用量","Downloads your own usage export with the Cursor app's login, at most once an hour.":"使用 Cursor 應用的登入下載你自己的用量匯出,每小時最多一次。","Turned off by CODEBURN_CURSOR_SYNC=0":"已被 CODEBURN_CURSOR_SYNC=0 關閉","Couldn't save the setting: config.json is invalid or locked":"無法儲存設定:config.json 無效或已被鎖定"}} \ No newline at end of file diff --git a/windows/src/lib/appSettings.ts b/windows/src/lib/appSettings.ts index 011b7bba4..07892ce5a 100644 --- a/windows/src/lib/appSettings.ts +++ b/windows/src/lib/appSettings.ts @@ -145,7 +145,7 @@ export function parseSettings(raw: Record): AppSettings { trayBadge: typeof raw.trayBadge === 'boolean' ? raw.trayBadge : DEFAULT_SETTINGS.trayBadge, usageRefreshSeconds: oneOfNumber(raw.usageRefreshSeconds, USAGE_CADENCES.map(c => c.id), DEFAULT_SETTINGS.usageRefreshSeconds), quotaCadenceSeconds: oneOfNumber(raw.quotaCadenceSeconds, QUOTA_CADENCES.map(c => c.id), DEFAULT_SETTINGS.quotaCadenceSeconds), - terminal: oneOf(raw.terminal, TERMINALS.map(t => t.id), DEFAULT_SETTINGS.terminal), + terminal: oneOf(raw.terminal, TERMINALS.map(term => term.id), DEFAULT_SETTINGS.terminal), } } diff --git a/windows/src/lib/dates.ts b/windows/src/lib/dates.ts index 273afbdc4..d2f48bc52 100644 --- a/windows/src/lib/dates.ts +++ b/windows/src/lib/dates.ts @@ -2,11 +2,7 @@ /// by local date, so "today" here must be the same local day or the trend chart and the /// hero disagree around midnight. -const DAY_NAMES = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] -const MONTH_NAMES = [ - 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', - 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', -] +import { localeTag, t } from '../i18n' export const MS_PER_DAY = 86_400_000 @@ -38,13 +34,11 @@ export function startOfDay(d: Date): Date { } export function prettyDate(ymd: string): string { - const dt = parseDateKey(ymd) - return `${DAY_NAMES[dt.getDay()]} ${MONTH_NAMES[dt.getMonth()]} ${dt.getDate()}` + return parseDateKey(ymd).toLocaleDateString(localeTag(), { weekday: 'short', month: 'short', day: 'numeric' }) } export function monthDay(ymd: string): string { - const dt = parseDateKey(ymd) - return `${MONTH_NAMES[dt.getMonth()]} ${dt.getDate()}` + return parseDateKey(ymd).toLocaleDateString(localeTag(), { month: 'short', day: 'numeric' }) } export function shortDate(ymd: string): string { @@ -73,17 +67,17 @@ export function previousMonthRange(d: Date): { first: string; last: string } { /// "in 42m", "in 3h", "in 2d", or "now". export function relativeFuture(target: Date, now = new Date()): string { const secs = (target.getTime() - now.getTime()) / 1000 - if (secs <= 0) return 'now' - if (secs < 3600) return `in ${Math.ceil(secs / 60)}m` - if (secs < 86_400) return `in ${Math.ceil(secs / 3600)}h` - return `in ${Math.ceil(secs / 86_400)}d` + if (secs <= 0) return t('now') + if (secs < 3600) return t('in %lldm', Math.ceil(secs / 60)) + if (secs < 86_400) return t('in %lldh', Math.ceil(secs / 3600)) + return t('in %lldd', Math.ceil(secs / 86_400)) } /// "just now", "2 min ago", "1 h ago". export function relativePast(target: Date, now = new Date()): string { const secs = Math.max(0, (now.getTime() - target.getTime()) / 1000) - if (secs < 45) return 'just now' - if (secs < 3600) return `${Math.round(secs / 60)} min ago` - if (secs < 86_400) return `${Math.round(secs / 3600)} h ago` - return `${Math.round(secs / 86_400)} d ago` + if (secs < 45) return t('just now') + if (secs < 3600) return t('%lldm ago', Math.round(secs / 60)) + if (secs < 86_400) return t('%lldh ago', Math.round(secs / 3600)) + return t('%lldd ago', Math.round(secs / 86_400)) } diff --git a/windows/src/lib/glance.ts b/windows/src/lib/glance.ts index 81a9e016d..f1bc74ca1 100644 --- a/windows/src/lib/glance.ts +++ b/windows/src/lib/glance.ts @@ -8,6 +8,7 @@ import { invoke } from '@tauri-apps/api/core' import { listen } from '@tauri-apps/api/event' +import { t } from '../i18n' import { USD, formatCurrency } from './currency' export type LiveSession = { @@ -108,8 +109,9 @@ export function sessionsForSource(glance: Glance, sourceId: string): LiveSession } export function runningLabel(count: number): string { - if (count === 0) return 'none running' - return count === 1 ? '1 running' : `${count} running` + if (count === 0) return t('none running') + if (count === 1) return t('1 running') + return t('%lld running', count) } /// The mac's asCompactTokens with its lowercased thousands: 182k beside the uppercase M and B. diff --git a/windows/src/lib/i18n.ts b/windows/src/lib/i18n.ts index be5d92b7a..a1d809a69 100644 --- a/windows/src/lib/i18n.ts +++ b/windows/src/lib/i18n.ts @@ -40,6 +40,9 @@ export function subscribeI18n(listener: () => void): () => void { void listen('codeburn://settings-changed', () => { void reload() }).then(fn => { unlisten = fn }) + void listen('codeburn://language-changed', () => { + void reload() + }) } return () => { listeners = listeners.filter(item => item !== listener) diff --git a/windows/src/lib/session-count-label.ts b/windows/src/lib/session-count-label.ts index 2de8f6c3c..e045ca321 100644 --- a/windows/src/lib/session-count-label.ts +++ b/windows/src/lib/session-count-label.ts @@ -1,5 +1,7 @@ /// Display copy for period session counts. Keep in lockstep with -/// `src/session-count-label.ts`. +/// `src/session-count-label.ts`. The English sentences are catalog keys. +import { t } from '../i18n' + export type SessionCountBasis = 'identity' | 'partial' export const SESSION_COUNT_HELP = 'Older session logs may be unavailable.' @@ -15,11 +17,11 @@ export function formatSessionCount( basis: SessionCountBasis | undefined, ): string { if (!sessionCountIsExact(basis)) { - if (sessions <= 0) return 'Session count unavailable' - return sessions === 1 ? 'At least 1 session' : `At least ${sessions.toLocaleString('en-US')} sessions` + if (sessions <= 0) return t('Session count unavailable') + return sessions === 1 ? t('At least 1 session') : t('At least %lld sessions', sessions) } - if (sessions === 1) return '1 session' - return `${sessions.toLocaleString('en-US')} sessions` + if (sessions === 1) return t('1 session') + return t('%lld sessions', sessions) } export function formatCompactSessionCount( @@ -27,10 +29,10 @@ export function formatCompactSessionCount( basis: SessionCountBasis | undefined, ): string { if (!sessionCountIsExact(basis)) { - if (sessions <= 0) return 'Unavailable' - return `≥${sessions.toLocaleString('en-US')} sess` + if (sessions <= 0) return t('Unavailable') + return t('≥%lld sess', sessions) } - return `${sessions.toLocaleString('en-US')} sess` + return t('%lld sess', sessions) } export function formatSessionAveragePlaceholder(): string { @@ -38,5 +40,5 @@ export function formatSessionAveragePlaceholder(): string { } export function formatCombinedSessionCount(): string { - return COMBINED_SESSION_COUNT_LABEL + return t(COMBINED_SESSION_COUNT_LABEL) } diff --git a/windows/src/lib/update.ts b/windows/src/lib/update.ts index fc26ed977..fd2233d99 100644 --- a/windows/src/lib/update.ts +++ b/windows/src/lib/update.ts @@ -14,7 +14,8 @@ import { invoke } from '@tauri-apps/api/core' import { listen } from '@tauri-apps/api/event' import { openUrl } from '@tauri-apps/plugin-opener' -import { t } from './i18n' +import { t } from '../i18n' +import { t as menuT } from './i18n' import { EMPTY_CLI_UPDATE, applyEngineLine, desktopHandedOff, updateOffered, type CliUpdateState, } from './cliUpdate' @@ -218,15 +219,15 @@ export function subscribeUpdate(listener: Listener): () => void { /// install the app no longer performs. export function badgeLabel(state: UpdateState): string { const status = state.status - if (state.cliUpdate.running) return t('Updating the CLI...') - if (status?.failureStage === 'check') return 'Update Check Failed' + if (state.cliUpdate.running) return menuT('Updating the CLI...') + if (status?.failureStage === 'check') return t('Update Check Failed') if (status?.updateAvailable && status.installRoute === 'oneClick') { - if (status.readyToInstall) return 'Restart to Update' - return state.downloading ? 'Downloading...' : 'Update Available' + if (status.readyToInstall) return t('Restart to Update') + return state.downloading ? t('Downloading...') : t('Update Available') } - if (status?.updateAvailable) return 'Download from GitHub' - if (status?.cliUpdateAvailable) return 'CLI Update Available' - return 'Update' + if (status?.updateAvailable) return t('Download from GitHub') + if (status?.cliUpdateAvailable) return t('CLI Update Available') + return t('Update') } /// UpdateChecker.updateHelpText: the whole story in the tooltip, since the pill has room for @@ -235,29 +236,36 @@ export function helpText(state: UpdateState): string { const status = state.status if (status?.failureStage === 'check' && status.error) { return [ - 'CodeBurn could not check GitHub for updates.', + t('CodeBurn could not check GitHub for updates.'), status.error, - 'Click to retry the update check.', + t('Click to retry the update check.'), ].join('\n\n') } if (status?.updateAvailable && status.installRoute === 'oneClick') { - const version = status.latestVersion ? `Version ${status.latestVersion}` : 'A newer version' - return status.readyToInstall - ? `${version} is downloaded. Click to restart into it.` - : `${version} is available. Click to download it.` + if (status.readyToInstall) { + return status.latestVersion + ? t('Version %@ is downloaded. Click to restart into it.', status.latestVersion) + : t('A newer version is downloaded. Click to restart into it.') + } + return status.latestVersion + ? t('Version %@ is available. Click to download it.', status.latestVersion) + : t('A newer version is available. Click to download it.') } if (status?.updateAvailable) { - const version = status.latestVersion ? `Version ${status.latestVersion}` : 'A newer version' + const lead = status.latestVersion + ? t('Version %@ is on GitHub. Click to open the release page.', status.latestVersion) + : t('A newer version is on GitHub. Click to open the release page.') return [ - `${version} is on GitHub. Click to open the release page.`, - `These builds do not update themselves. Download the installer there, or run ${status.appUpdateCommand} in a terminal.`, + lead, + t('These builds do not update themselves. Download the installer there, or run %@ in a terminal.', status.appUpdateCommand), ].join('\n\n') } if (status?.cliUpdateAvailable) { - const version = status.latestCliVersion ?? 'A newer CLI' - return `CLI ${version} is available. Click to update it.` + return status.latestCliVersion + ? t('CLI %@ is available. Click to update it.', status.latestCliVersion) + : t('A newer CLI is available. Click to update it.') } - return 'Check GitHub for a newer release' + return t('Check GitHub for a newer release') } /// What a click on the badge does: a one-click update updates the CLI and downloads, then restarts; a manual one diff --git a/windows/src/main.tsx b/windows/src/main.tsx index 58d5edc24..bedfaf5b3 100644 --- a/windows/src/main.tsx +++ b/windows/src/main.tsx @@ -4,10 +4,20 @@ import { getCurrentWindow } from '@tauri-apps/api/window' import { App } from './App' import { Dock } from './Dock' import { Settings } from './Settings' +import { invoke } from '@tauri-apps/api/core' +import { listen } from '@tauri-apps/api/event' +import { applyLanguage, useLocale, type Locale } from './i18n' import { applyAccent, savedAccent } from './lib/accent' import { applyTheme, readSetting } from './lib/settings' import './styles.css' +void invoke<{ locale: Locale }>('language_state') + .then(state => applyLanguage(state.locale)) + .catch(() => {}) +void listen('codeburn://language-changed', () => { + void invoke<{ locale: Locale }>('language_state').then(state => applyLanguage(state.locale)).catch(() => {}) +}) + // Every window loads the one bundle, so the label decides which surface mounts. const label = getCurrentWindow().label @@ -24,6 +34,9 @@ function surface() { return } -ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - {surface()} -) +function Root() { + const locale = useLocale() + return {surface()} +} + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render() diff --git a/windows/src/settings/AboutPane.tsx b/windows/src/settings/AboutPane.tsx index 75b9c2891..d01c00545 100644 --- a/windows/src/settings/AboutPane.tsx +++ b/windows/src/settings/AboutPane.tsx @@ -6,11 +6,12 @@ import { Group, Note, Pane, Row } from './controls' import { ArrowUpRight, FLAME_PATH } from '../components/Icons' import { describeCliUpdate } from '../lib/cliUpdate' import { relativePast } from '../lib/dates' -import { t, useI18nRevision } from '../lib/i18n' +import { t as menuT, useI18nRevision } from '../lib/i18n' import { EMPTY_UPDATE, badgeAction, checkUpdates, runUpdateAction, subscribeUpdate, updateCli, type UpdateState, } from '../lib/update' import { track } from '../lib/telemetry' +import { t } from '../i18n' /// The mac's AboutSettingsTab: a brand hero, the version with a Check for Updates button, /// the three links, and the licence line. A signed build installs what the check finds in one @@ -48,7 +49,7 @@ export function AboutPane({ anchor }: Props) { const cliUpdate = status?.cliUpdateAvailable ?? false const oneClick = status?.installRoute === 'oneClick' const action = badgeAction(update) - const cliNote = describeCliUpdate(update.cliUpdate, t, status?.cliUpdateCommand ?? '') + const cliNote = describeCliUpdate(update.cliUpdate, menuT, status?.cliUpdateCommand ?? '') const busy = update.downloading || update.cliUpdate.running return ( @@ -67,13 +68,13 @@ export function AboutPane({ anchor }: Props) {
CodeBurn
-
{version ? `Version ${version}` : 'Version'}
-
Your AI Bill, Itemized
+
{version ? t('Version %@', version) : t('Version')}
+
{t('Your AI Bill, Itemized')}
- + @@ -84,10 +85,10 @@ export function AboutPane({ anchor }: Props) { disabled={busy} onClick={() => { track('update_click', { action }); runUpdateAction(action, status) }} > - {!oneClick ? 'Download from GitHub' - : status?.readyToInstall ? 'Restart to Update' - : update.cliUpdate.running ? t('Updating the CLI...') - : update.downloading ? 'Downloading...' : 'Update'} + {!oneClick ? t('Download from GitHub') + : status?.readyToInstall ? t('Restart to Update') + : update.cliUpdate.running ? menuT('Updating the CLI...') + : update.downloading ? t('Downloading...') : t('Update')} )} )} /> {appUpdate && !oneClick && status && ( )} {cliUpdate && status && !(appUpdate && oneClick) && ( { track('update_click', { action: 'cli' }); void updateCli() }} > - {t('Update CLI')} + {menuT('Update CLI')} )} /> )} {cliNote?.command && ( - + )} {cliNote && {cliNote.text}} {resultNote(update)} {LINKS.map(link => ( ))} @@ -174,10 +175,10 @@ function CommandRow({ label, hint, command }: { label: string; hint?: string; co
)} @@ -189,30 +190,33 @@ function CommandRow({ label, hint, command }: { label: string; hint?: string; co /// modal: up to date, an update is available, or the check failed and why. function resultNote(update: UpdateState): string { const status = update.status - if (!status) return update.checking ? 'Checking GitHub for a newer release...' : '' + if (!status) return update.checking ? t('Checking GitHub for a newer release...') : '' if (status.storeManaged) { - const store = 'This copy came from the Microsoft Store, which keeps it up to date.' + const store = t('This copy came from the Microsoft Store, which keeps it up to date.') return status.cliUpdateAvailable && status.latestCliVersion - ? `${store} CLI ${status.latestCliVersion} is available (you have ${status.installedCliVersion ?? 'none'}).` - : `${store} There is nothing to check here.` + ? `${store} ${t('CLI %@ is available (you have %@).', status.latestCliVersion, status.installedCliVersion ?? t('none'))}` + : `${store} ${t('There is nothing to check here.')}` + } + if (status.error) { + const lead = status.failureStage === 'install' ? t('Update failed.') : t('Check failed.') + return `${lead} ${status.error}` } - if (status.error) return `${status.failureStage === 'install' ? 'Update failed.' : 'Check failed.'} ${status.error}` const parts: string[] = [] if (status.updateAvailable && status.latestVersion) { - parts.push(`Version ${status.latestVersion} is available.`) + parts.push(t('Version %@ is available.', status.latestVersion)) } if (status.cliUpdateAvailable && status.latestCliVersion) { - parts.push(`CLI ${status.latestCliVersion} is available (you have ${status.installedCliVersion ?? 'none'}).`) + parts.push(t('CLI %@ is available (you have %@).', status.latestCliVersion, status.installedCliVersion ?? t('none'))) } if (parts.length === 0) { - return `You are on the latest version (${status.currentVersion}).` + return t('You are on the latest version (%@).', status.currentVersion) } if (status.updateAvailable && status.installRoute !== 'oneClick') { parts.push( - 'These builds are unsigned and do not update themselves, so CodeBurn will not install one for you. Download it from GitHub and Windows will vet it before it runs.', + t('These builds are unsigned and do not update themselves, so CodeBurn will not install one for you. Download it from GitHub and Windows will vet it before it runs.'), ) if (status.cliTooOld) { - parts.push('Update the CLI first: the installed one is too old to install this app.') + parts.push(t('Update the CLI first: the installed one is too old to install this app.')) } } return parts.join(' ') @@ -223,5 +227,5 @@ function resultNote(update: UpdateState): string { function lastChecked(update: UpdateState): string { const at = update.status?.checkedAt if (!at) return '' - return `Checked ${relativePast(new Date(at * 1000))}` + return t('Checked %@', relativePast(new Date(at * 1000))) } diff --git a/windows/src/settings/GeneralPane.tsx b/windows/src/settings/GeneralPane.tsx index 1b5f1594f..7c639f868 100644 --- a/windows/src/settings/GeneralPane.tsx +++ b/windows/src/settings/GeneralPane.tsx @@ -1,5 +1,6 @@ import { useEffect, useState } from 'react' import { invoke } from '@tauri-apps/api/core' +import { listen } from '@tauri-apps/api/event' import { openUrl } from '@tauri-apps/plugin-opener' import type { CurrencyState } from '../lib/currency' @@ -23,6 +24,11 @@ import { TELEMETRY_DOCS_URL, setTelemetryEnabled, telemetryStatus, type TelemetryStatus, } from '../lib/telemetry' import { Field, Group, Note, Pane, Row, Select, Slider, Switch } from './controls' +import { labels, t } from '../i18n' + +type ConfigLanguage = 'system' | 'en' | 'fr' | 'ja' | 'ko' | 'zh-CN' | 'zh-TW' + +type LanguageState = { choice: ConfigLanguage; locale: string } /// The mac's GeneralSettingsTab. Display first, because it is what the reader came for; the /// Windows-only rows (login item, tray badge) sit under System at the end, where the mac @@ -40,9 +46,25 @@ export function GeneralPane({ quota, anchor }: Props) { const [currencyError, setCurrencyError] = useState(null) const [loginItem, setLoginItem] = useState(null) const [loginError, setLoginError] = useState(null) + const [language, setLanguage] = useState('system') useEffect(() => subscribeSettings(setSettings), []) + useEffect(() => { + let live = true + const read = () => { + void invoke('language_state').then(state => { + if (live) setLanguage(state.choice) + }).catch(() => {}) + } + read() + const unlisten = listen('codeburn://language-changed', read) + return () => { + live = false + unlisten.then(fn => fn()) + } + }, []) + useEffect(() => { invoke('launch_at_login').then(setLoginItem).catch(() => setLoginItem(false)) invoke('currency').then(setCurrency).catch(() => {}) @@ -89,70 +111,93 @@ export function GeneralPane({ quota, anchor }: Props) { return ( { + setLanguage(choice) + void invoke('set_language_choice', { choice }) + }} + /> + } + /> + ({ id: code as string, label: `${code} - ${CURRENCY_NAMES[code] ?? code}` }))} + options={CURRENCY_CODES.map(code => ({ id: code as string, label: `${code} - ${t(CURRENCY_NAMES[code] ?? code)}` }))} onChange={applyCurrency} /> } /> {currencyError && {currencyError}} writeSettings({ metric })} /> } /> writeSettings({ menubarPeriod })} /> } /> writeSettings({ menubarScope })} /> } /> +
{ACCENT_PRESETS.map(preset => ( )} @@ -339,15 +381,15 @@ function CapacityDockSection({ quota }: { quota: QuotaState }) { return ( apply({ enabled: !prefs.enabled })} /> @@ -355,11 +397,11 @@ function CapacityDockSection({ quota }: { quota: QuotaState }) { /> {restable.length > 0 && ( ({ id, label: nameOf(id) }))} onChange={preferred => apply({ preferred })} @@ -368,22 +410,22 @@ function CapacityDockSection({ quota }: { quota: QuotaState }) { /> )} apply({ keepExpanded: !prefs.keepExpanded })} /> } /> apply({ theme })} /> } /> apply({ detailTheme })} /> } /> apply({ gaugeShape })} /> } @@ -431,20 +473,20 @@ function CapacityDockSection({ quota }: { quota: QuotaState }) { {/* Only meaningful with more than one Claude config directory. */} {quota.claudeProfiles.length > 1 && ( apply({ claudeProfiles })} /> } /> )} {manageable.length === 0 ? ( - Connect a provider from its page in the sidebar to make it available here. + {t('Connect a provider from its page in the sidebar to make it available here.')} ) : ( manageable.map(id => { const on = prefs.providers.length > 0 ? prefs.providers.includes(id) : isConnected(id) @@ -455,7 +497,7 @@ function CapacityDockSection({ quota }: { quota: QuotaState }) { {nameOf(id)} - {!isConnected(id) && Needs attention} + {!isConnected(id) && {t('Needs attention')}} } control={ @@ -489,24 +531,23 @@ function TerminalSection({ settings }: { settings: AppSettings }) { if (installed === null || Object.keys(installed).length === 0) return null return ( - + ({ id: term.id, - label: installed[term.id] === false ? `${term.label} (not installed)` : term.label, + label: installed[term.id] === false ? t('%@ (not installed)', t(term.label)) : t(term.label), }))} onChange={terminal => writeSettings({ terminal })} /> } /> - Where Full Report and Optimize open. If the chosen console is not installed, CodeBurn - falls back to the Command Prompt, which always is. + {t('Where Full Report and Optimize open. If the chosen console is not installed, CodeBurn falls back to the Command Prompt, which always is.')} ) @@ -576,26 +617,28 @@ function AlertsSection({ settings, currency }: { settings: AppSettings; currency } const label = (value: number) => { - if (value === 0) return 'Off' + if (value === 0) return t('Off') return isTokens ? `${trim(value / 1e6)}M` : `${currency.symbol}${trim(value)}` } const armed = stored !== null && stored > 0 const help = custom && !armed - ? 'Enter an amount above, or the alert stays off.' - : `The tray flame turns yellow when today's ${isTokens ? 'tokens pass' : 'cost passes'} the daily budget.` + ? t('Enter an amount above, or the alert stays off.') + : t(isTokens + ? "Flame icon turns yellow when today's tokens pass the daily budget." + : "Flame icon turns yellow when today's cost pass the daily budget.") return ( - + ({ id: value, label: label(value) })), - { id: CUSTOM, label: 'Custom...' }, + { id: CUSTOM, label: t('Custom...') }, ]} onChange={choose} /> @@ -603,11 +646,11 @@ function AlertsSection({ settings, currency }: { settings: AppSettings; currency /> {custom && ( - +
@@ -102,7 +103,7 @@ export function ProviderPane({ id, name, quota }: Props) { disabled={quota.loading} onClick={() => { void refreshQuota() }} > - {quota.loading ? 'Checking...' : 'Retry'} + {quota.loading ? t('Checking...') : t('Retry')}
@@ -121,8 +122,8 @@ export function ProviderPane({ id, name, quota }: Props) { - - {HOW_IT_WORKS[id] ?? `${name} quota comes from the codeburn CLI, which reads the credential the provider's own tools left on this machine.`} + + {HOW_IT_WORKS[id] ? t(HOW_IT_WORKS[id]) : t("%@ quota comes from the codeburn CLI, which reads the credential the provider's own tools left on this machine.", name)} ) @@ -149,7 +150,7 @@ function ClaudeConfigDirs() { const add = async () => { const picked = await invoke('pick_directory', { - title: 'Choose a Claude config directory (one containing a projects folder).', + title: t('Choose a Claude config directory (one containing a projects folder).'), }).catch(() => null) if (!picked || dirs.includes(picked)) return void apply([...dirs, picked]) @@ -157,11 +158,11 @@ function ClaudeConfigDirs() { return ( {dirs.length === 0 ? ( - No extra directories. Tracking the default {homePath('.claude')}. + {t('No extra directories. Tracking the default %@.', homePath('.claude'))} ) : ( dirs.map((dir, index) => ( apply(dirs.filter((_, i) => i !== index))} > @@ -182,7 +183,7 @@ function ClaudeConfigDirs() { )) )} {error && {error}} - Add Directory...} /> + {t('Add Directory...')}} /> ) } @@ -209,11 +210,11 @@ function CursorSync() { if (enabled === null) return null return ( - + { void toggle() }} ariaLabel="Sync Cursor usage from cursor.com" />} + control={ { void toggle() }} ariaLabel={t('Sync Cursor usage from cursor.com')} />} /> {error && {error}} @@ -252,27 +253,27 @@ function ProviderKey({ id, name }: { id: string; name: string }) { return ( save('')}> - Clear + {t('Clear')} } /> save(draft)} > - Save and Connect + {t('Save and Connect')} } @@ -301,14 +302,14 @@ function QuotaCadence() { if (!settings) return null return ( - + writeSettings({ quotaCadenceSeconds })} /> }