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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions announcements.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@
"text": "此地址提供Gemini Pro成品号与Codex Pro兑换码,有需要可以支持一下,感谢。",
"badge": "推广",
"ctaLabel": "选购"
},
"ru": {
"text": "По этому адресу можно получить готовые аккаунты Gemini Pro и коды активации Codex Pro. Если нужно — можешь посмотреть и поддержать, спасибо.",
"badge": "Реклама",
"ctaLabel": "Открыть"
}
}
},
Expand Down
6 changes: 3 additions & 3 deletions src-tauri/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ fn apply_macos_activation_policy(app: &tauri::AppHandle) {
}
}

info!("[Window] 已应用 macOS Dock 图标策略: {}", policy_label);
info!("[Window] применена политика иконки в Dock на macOS: {}", policy_label);
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
Expand Down Expand Up @@ -94,7 +94,7 @@ pub fn run() {
}
}))
.setup(|app| {
info!("Cockpit Tools 启动...");
info!("Cockpit Tools запускается...");

// 存储全局 AppHandle
let _ = APP_HANDLE.set(app.handle().clone());
Expand All @@ -109,7 +109,7 @@ pub fn run() {
tauri_plugin_autostart::MacosLauncher::LaunchAgent,
None::<Vec<&'static str>>,
))?;
info!("[Updater] Tauri Updater + Process 插件已初始化");
info!("[Updater] плагины Tauri Updater и Process инициализированы");
}

// 启动时同步设置合并(移至后台线程,不阻塞窗口显示)
Expand Down
108 changes: 106 additions & 2 deletions src-tauri/src/modules/logger.rs
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ pub fn init_logger() {
std::mem::forget(app_guard);
std::mem::forget(codex_api_guard);

info!("日志系统已完成初始化");
info!("система логов инициализирована");

// 日志清理移至后台线程,不阻塞启动
std::thread::spawn(move || {
Expand Down Expand Up @@ -336,11 +336,115 @@ pub fn log_codex_api_error(message: &str) {
}

fn sanitize_message(message: &str) -> String {
let translated = translate_log_message(message);
EMAIL_REGEX
.replace_all(message, |caps: &Captures| mask_email(&caps[0]))
.replace_all(&translated, |caps: &Captures| mask_email(&caps[0]))
.to_string()
}

fn translate_log_message(message: &str) -> String {
let replacements = [
("开始刷新账号", "начало обновления аккаунта"),
("刷新完成", "обновление завершено"),
("手动刷新账号开始", "запущено ручное обновление аккаунта"),
("手动刷新账号完成", "ручное обновление аккаунта завершено"),
("手动批量刷新开始", "запущено ручное пакетное обновление"),
("手动批量刷新完成", "ручное пакетное обновление завершено"),
("手动批量обновление завершено", "ручное пакетное обновление завершено"),
("开始批量刷新", "запущено пакетное обновление"),
("批量刷新开始", "запущено пакетное обновление"),
("批量刷新结束", "пакетное обновление завершено"),
("批量刷新完成", "пакетное обновление завершено"),
("批量обновление завершено", "пакетное обновление завершено"),
("批量обновление", "пакетное обновление"),
("批量刷新", "пакетное обновление"),
("Token 保活成功", "token успешно продлён"),
("Codex 配额请求", "запрос квоты Codex"),
("Codex 配额响应元信息", "метаданные ответа по квоте Codex"),
("Codex 配额接口返回非成功状态", "интерфейс квоты Codex вернул неуспешный статус"),
("配额请求检测到失效 Token,准备强制刷新后重试", "запрос квоты обнаружил недействительный token, готовлю принудительное обновление и повтор"),
("用户信息拉取成功", "данные пользователя получены"),
("订阅信息拉取成功", "данные подписки получены"),
("API 配额拉取成功", "API-квота получена"),
("刷新失败", "обновление завершилось ошибкой"),
("未获取到有效配额快照,保留旧配额", "не удалось получить актуальный снимок квоты, оставляю старую квоту"),
("日志系统已完成初始化", "система логов инициализирована"),
("应用内未启用全局代理,已恢复启动时继承环境(未携带代理变量)", "встроенный глобальный прокси выключен, восстановлено унаследованное окружение запуска (без proxy-переменных)"),
("网页查询服务未启用,跳过启动", "веб-сервис отчётов выключен, запуск пропущен"),
("用户配置已保存", "пользовательская конфигурация сохранена"),
("服务状态已保存", "состояние сервиса сохранено"),
("WebSocket 服务已启动", "WebSocket-сервис запущен"),
("Cockpit Tools 启动...", "Cockpit Tools запускается..."),
("Tauri Updater + Process 插件已初始化", "плагины Tauri Updater и Process инициализированы"),
("后端 OAuth token 保活已启动", "фоновое продление OAuth token запущено"),
("已应用 macOS Dock 图标策略", "применена политика иконки в Dock на macOS"),
("创建骨架托盘", "создание базового трей-меню"),
("骨架托盘创建完成,等待后台加载完整菜单", "базовое трей-меню создано, жду фоновую загрузку полного меню"),
("macOS 原生菜单模式,跳过 Tauri 托盘菜单更新", "режим нативного меню macOS: обновление меню Tauri в трее пропущено"),
("本地接入服务已启动", "локальный сервис доступа запущен"),
("悬浮卡片窗口已创建", "окно плавающей карточки создано"),
("启动参数数量", "количество аргументов запуска"),
("开始处理外部导入参数", "начата обработка аргументов внешнего импорта"),
("检查参数", "проверка аргумента"),
("未发现 Deep Link 参数", "параметры deep link не найдены"),
("外部导入处理结果", "результат обработки внешнего импорта"),
("使用工作区公告文件 announcements.json", "используется файл объявлений рабочего проекта announcements.json"),
("读取待处理导入: empty", "отложенный импорт пуст"),
("启动触发自动更新检查流程", "при запуске запущена проверка обновлений"),
("读取更新设置", "прочитаны настройки обновления"),
("启动检查立即执行", "проверка при запуске выполняется сразу"),
("后台自动更新关闭,先执行无弹窗检查,仅在发现新版本时展示弹窗", "фоновое автообновление выключено: сначала тихая проверка, окно покажется только если найдётся новая версия"),
(":", ": "),
(";", "; "),
("更新检查完成:当前已是最新版本", "проверка обновлений завершена: уже установлена последняя версия"),
("更新检查完成: 当前已是最新版本", "проверка обновлений завершена: уже установлена последняя версия"),
("已更新 last_check_time,结束本次更新检查流程", "обновлено last_check_time, текущая проверка обновлений завершена"),
("开始列出账号", "начат вывод списка аккаунтов"),
("列出账号", "вывод списка аккаунтов"),
("所有账号配额", "квоты всех аккаунтов"),
("账号配额", "квоты аккаунтов"),
("并发模式", "параллельный режим"),
("最大并发", "максимальный параллелизм"),
("上游返回失败", "апстрим вернул ошибку"),
("创建系统托盘", "создание системного трея"),
("上游返回失败", "апстрим вернул ошибку"),
("启动时 get_current", "get_current при запуске"),
("启动始终执行更新检查", "проверка обновлений при запуске выполняется всегда"),
(" 成功", " успешно"),
(" 失败", " с ошибкой"),
("耗时", "затрачено"),
("OAuth 登录开始", "запущен OAuth-вход"),
("OAuth 登录完成", "OAuth-вход завершён"),
("OAuth 等待完成", "ожидание завершения OAuth-входа"),
("登录会话已创建", "сессия входа создана"),
("复用登录会话", "переиспользуется существующая сессия входа"),
("账号已保存", "аккаунт сохранён"),
("start 命令触发", "команда start запущена"),
("start 命令完成", "команда start завершена"),
("complete 命令触发", "команда complete запущена"),
("complete 命令完成", "команда complete завершена"),
("peek 命令命中会话", "команда peek нашла активную сессию"),
("开始创建登录会话", "начато создание сессии входа"),
("开始等待回调完成", "начато ожидание завершения callback"),
("未找到官方 machine token 缓存,将跳过机器标识注入", "официальный кэш machine token не найден, пропускаю внедрение машинного идентификатора"),
("未找到官方 machine id 缓存,将继续使用无机器标识链路", "официальный кэш machine id не найден, продолжаю без машинного идентификатора"),
("已生成官方 CLI device login 链接", "сгенерирована официальная CLI-ссылка device login"),
("等待 device token 中", "ожидание device token"),
("构造状态请求头", "собран заголовок статус-запроса"),
("登录完成并入库成功", "вход завершён, аккаунт успешно сохранён"),
("加载 Code Assist 信息", "загрузка информации Code Assist"),
("keys=", "ключи="),
("受管 Windsurf 实例未在运行,无需关闭", "управляемые экземпляры Windsurf не запущены, закрывать нечего"),
("未提供可关闭的 Windsurf 实例目录", "не переданы каталоги экземпляров Windsurf для закрытия"),
];

let mut translated = message.to_string();
for (from, to) in replacements {
translated = translated.replace(from, to);
}
translated
}

fn mask_email(email: &str) -> String {
let (local, domain) = match email.split_once('@') {
Some(parts) => parts,
Expand Down
4 changes: 2 additions & 2 deletions src-tauri/src/modules/tray.rs
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ struct CopilotUsage {
pub fn create_tray_skeleton<R: Runtime>(
app: &tauri::AppHandle<R>,
) -> Result<TrayIcon<R>, tauri::Error> {
info!("[Tray] 创建骨架托盘...");
info!("[Tray] создание базового трей-меню...");

#[cfg(not(target_os = "macos"))]
let lang = crate::modules::config::get_user_config().language;
Expand Down Expand Up @@ -268,7 +268,7 @@ pub fn create_tray_skeleton<R: Runtime>(
#[cfg(target_os = "macos")]
let _ = tray.set_show_menu_on_left_click(false);

info!("[Tray] 骨架托盘创建完成,等待后台加载完整菜单");
info!("[Tray] базовое трей-меню создано, жду фоновую загрузку полного меню");
Ok(tray)
}

Expand Down