diff --git a/Changelog.md b/Changelog.md index 64ac74ab7..0d7bba18f 100644 --- a/Changelog.md +++ b/Changelog.md @@ -6,6 +6,7 @@ - 修复系统托盘代理组行不显示延迟、超时项与未测过项无法区分的问题 - 修复不同订阅源的同名节点测速和延迟显示指向错误节点的问题 - 修复端口设置混淆保存值与运行值、输入无效时缺少提示的问题 +- 修复已有内核进程阻止启动时缺少多语言说明和处理建议的问题 - 修复从开始菜单再次打开应用后,窗口反复弹出并提示启动失败的问题 - 修复多个代理集合包含同名节点时,代理组中的节点变灰并显示 ambiguous、无法选择的问题 - 修复手动更新时重复下载后台已下载的安装包、启动时选「稍后」后每次启动都重新下载的问题 diff --git a/crates/clash-verge-i18n/locales/ar.yml b/crates/clash-verge-i18n/locales/ar.yml index 4fa132513..81dec23dc 100644 --- a/crates/clash-verge-i18n/locales/ar.yml +++ b/crates/clash-verge-i18n/locales/ar.yml @@ -37,6 +37,8 @@ notifications: service: adminInstallPrompt: يتطلب تثبيت خدمة Clash Verge صلاحيات المسؤول. adminUninstallPrompt: يتطلب إلغاء تثبيت خدمة Clash Verge صلاحيات المسؤول. +core: + alreadyRunning: 'تعذّر بدء النواة: توجد عملية نواة قيد التشغيل بالفعل. أغلق التطبيق المعني أو أنهِ العملية المتبقية، ثم أعد المحاولة. إذا استمرت المشكلة، فأعد تشغيل الكمبيوتر.' launchGuard: currentExeError: 'تعذر تحديد موقع التطبيق: {error}' homeDirError: 'تعذر تحديد المجلد الرئيسي للمستخدم الحالي. سيتم إنهاء التطبيق: {error}' diff --git a/crates/clash-verge-i18n/locales/de.yml b/crates/clash-verge-i18n/locales/de.yml index d31a24f07..058f3b3d3 100644 --- a/crates/clash-verge-i18n/locales/de.yml +++ b/crates/clash-verge-i18n/locales/de.yml @@ -37,6 +37,8 @@ notifications: service: adminInstallPrompt: Für die Installation des Clash-Verge-Dienstes sind Administratorrechte erforderlich. adminUninstallPrompt: Für die Deinstallation des Clash-Verge-Dienstes sind Administratorrechte erforderlich. +core: + alreadyRunning: 'Der Kern kann nicht gestartet werden: Ein Kernprozess läuft bereits. Beenden Sie die zugehörige App oder den verbliebenen Prozess und versuchen Sie es erneut. Wenn das Problem weiterhin besteht, starten Sie den Computer neu.' launchGuard: currentExeError: 'Der Speicherort der Anwendung konnte nicht ermittelt werden: {error}' homeDirError: 'Das Benutzerverzeichnis des aktuellen Benutzers konnte nicht ermittelt werden. Die Anwendung wird beendet: {error}' diff --git a/crates/clash-verge-i18n/locales/en.yml b/crates/clash-verge-i18n/locales/en.yml index 82aa2eb64..9db8ff3cd 100644 --- a/crates/clash-verge-i18n/locales/en.yml +++ b/crates/clash-verge-i18n/locales/en.yml @@ -37,6 +37,8 @@ notifications: service: adminInstallPrompt: Installing the Clash Verge service requires administrator privileges. adminUninstallPrompt: Uninstalling the Clash Verge service requires administrator privileges. +core: + alreadyRunning: 'Cannot start the core: a core process is already running. Close the related app or stop the leftover process, then retry. If the problem persists, restart your computer.' launchGuard: currentExeError: 'Unable to determine the application location: {error}' homeDirError: 'Unable to determine the current user''s home directory. The application will exit: {error}' diff --git a/crates/clash-verge-i18n/locales/es.yml b/crates/clash-verge-i18n/locales/es.yml index 4689a3b35..85ad7d95d 100644 --- a/crates/clash-verge-i18n/locales/es.yml +++ b/crates/clash-verge-i18n/locales/es.yml @@ -37,6 +37,8 @@ notifications: service: adminInstallPrompt: Instalar el servicio de Clash Verge requiere privilegios de administrador. adminUninstallPrompt: Desinstalar el servicio de Clash Verge requiere privilegios de administrador. +core: + alreadyRunning: 'No se puede iniciar el núcleo: ya hay un proceso del núcleo en ejecución. Cierre la aplicación correspondiente o finalice el proceso restante y vuelva a intentarlo. Si el problema persiste, reinicie el equipo.' launchGuard: currentExeError: 'No se pudo determinar la ubicación de la aplicación: {error}' homeDirError: 'No se pudo determinar la carpeta de inicio del usuario actual. La aplicación se cerrará: {error}' diff --git a/crates/clash-verge-i18n/locales/fa.yml b/crates/clash-verge-i18n/locales/fa.yml index 6925a3834..2a3453405 100644 --- a/crates/clash-verge-i18n/locales/fa.yml +++ b/crates/clash-verge-i18n/locales/fa.yml @@ -37,6 +37,8 @@ notifications: service: adminInstallPrompt: نصب سرویس Clash Verge به دسترسی مدیر نیاز دارد. adminUninstallPrompt: حذف سرویس Clash Verge به دسترسی مدیر نیاز دارد. +core: + alreadyRunning: 'هسته شروع نمی‌شود: یک فرایند هسته از قبل در حال اجراست. برنامه مرتبط را ببندید یا فرایند باقی‌مانده را متوقف کنید و دوباره تلاش کنید. اگر مشکل ادامه داشت، رایانه را راه‌اندازی مجدد کنید.' launchGuard: currentExeError: 'مکان برنامه مشخص نشد: {error}' homeDirError: 'پوشهٔ خانگی کاربر فعلی مشخص نشد. برنامه بسته خواهد شد: {error}' diff --git a/crates/clash-verge-i18n/locales/id.yml b/crates/clash-verge-i18n/locales/id.yml index ef9e39414..9c037b90d 100644 --- a/crates/clash-verge-i18n/locales/id.yml +++ b/crates/clash-verge-i18n/locales/id.yml @@ -37,6 +37,8 @@ notifications: service: adminInstallPrompt: Menginstal layanan Clash Verge memerlukan hak administrator. adminUninstallPrompt: Menghapus instalasi layanan Clash Verge memerlukan hak administrator. +core: + alreadyRunning: 'Tidak dapat memulai inti: proses inti sudah berjalan. Tutup aplikasi terkait atau hentikan proses yang tersisa, lalu coba lagi. Jika masalah berlanjut, mulai ulang komputer.' launchGuard: currentExeError: 'Lokasi aplikasi tidak dapat ditentukan: {error}' homeDirError: 'Direktori beranda pengguna saat ini tidak dapat ditentukan. Aplikasi akan ditutup: {error}' diff --git a/crates/clash-verge-i18n/locales/jp.yml b/crates/clash-verge-i18n/locales/jp.yml index 723cb3fb3..327383e8b 100644 --- a/crates/clash-verge-i18n/locales/jp.yml +++ b/crates/clash-verge-i18n/locales/jp.yml @@ -37,6 +37,8 @@ notifications: service: adminInstallPrompt: Clash Verge サービスのインストールには管理者権限が必要です。 adminUninstallPrompt: Clash Verge サービスのアンインストールには管理者権限が必要です。 +core: + alreadyRunning: コアを起動できません:コアプロセスが実行中です。関連アプリまたは残存プロセスを終了して再試行してください。解決しない場合は、コンピューターを再起動してください。 launchGuard: currentExeError: アプリケーションの場所を確認できませんでした:{error} homeDirError: 現在のユーザーのホームディレクトリを確認できないため、アプリケーションを終了します:{error} diff --git a/crates/clash-verge-i18n/locales/ko.yml b/crates/clash-verge-i18n/locales/ko.yml index ef15f6517..9fcaa6a79 100644 --- a/crates/clash-verge-i18n/locales/ko.yml +++ b/crates/clash-verge-i18n/locales/ko.yml @@ -37,6 +37,8 @@ notifications: service: adminInstallPrompt: Clash Verge 서비스 설치에는 관리자 권한이 필요합니다. adminUninstallPrompt: Clash Verge 서비스 제거에는 관리자 권한이 필요합니다. +core: + alreadyRunning: 코어를 시작할 수 없습니다. 이미 실행 중인 코어 프로세스가 있습니다. 관련 앱이나 남아 있는 프로세스를 종료한 뒤 다시 시도하세요. 문제가 계속되면 컴퓨터를 다시 시작하세요. launchGuard: currentExeError: '애플리케이션 위치를 확인할 수 없습니다: {error}' homeDirError: '현재 사용자의 홈 디렉터리를 확인할 수 없어 애플리케이션을 종료합니다: {error}' diff --git a/crates/clash-verge-i18n/locales/pt.yml b/crates/clash-verge-i18n/locales/pt.yml index 1f0a31682..2373529ee 100644 --- a/crates/clash-verge-i18n/locales/pt.yml +++ b/crates/clash-verge-i18n/locales/pt.yml @@ -37,6 +37,8 @@ notifications: service: adminInstallPrompt: A instalação do serviço do Clash Verge requer privilégios de administrador. adminUninstallPrompt: A desinstalação do serviço do Clash Verge requer privilégios de administrador. +core: + alreadyRunning: 'Não é possível iniciar o núcleo: já há um processo do núcleo em execução. Feche o aplicativo correspondente ou encerre o processo remanescente e tente novamente. Se o problema persistir, reinicie o computador.' launchGuard: currentExeError: 'Não foi possível determinar a localização do aplicativo: {error}' homeDirError: 'Não foi possível determinar o diretório pessoal do usuário atual. O aplicativo será encerrado: {error}' diff --git a/crates/clash-verge-i18n/locales/ru.yml b/crates/clash-verge-i18n/locales/ru.yml index 990920f72..630366a8f 100644 --- a/crates/clash-verge-i18n/locales/ru.yml +++ b/crates/clash-verge-i18n/locales/ru.yml @@ -37,6 +37,8 @@ notifications: service: adminInstallPrompt: Для установки службы Clash Verge требуются права администратора. adminUninstallPrompt: Для удаления службы Clash Verge требуются права администратора. +core: + alreadyRunning: 'Не удалось запустить ядро: процесс ядра уже работает. Закройте соответствующее приложение или завершите оставшийся процесс и повторите попытку. Если проблема сохраняется, перезагрузите компьютер.' launchGuard: currentExeError: 'Не удалось определить расположение приложения: {error}' homeDirError: 'Не удалось определить домашний каталог текущего пользователя. Приложение будет закрыто: {error}' diff --git a/crates/clash-verge-i18n/locales/tr.yml b/crates/clash-verge-i18n/locales/tr.yml index 7587ab2fe..3ced8c82d 100644 --- a/crates/clash-verge-i18n/locales/tr.yml +++ b/crates/clash-verge-i18n/locales/tr.yml @@ -37,6 +37,8 @@ notifications: service: adminInstallPrompt: Clash Verge hizmetini kurmak için yönetici ayrıcalıkları gerekir. adminUninstallPrompt: Clash Verge hizmetini kaldırmak için yönetici ayrıcalıkları gerekir. +core: + alreadyRunning: 'Çekirdek başlatılamıyor: bir çekirdek işlemi zaten çalışıyor. İlgili uygulamayı kapatın veya kalan işlemi sonlandırıp yeniden deneyin. Sorun devam ederse bilgisayarı yeniden başlatın.' launchGuard: currentExeError: 'Uygulamanın konumu belirlenemedi: {error}' homeDirError: 'Geçerli kullanıcının ana dizini belirlenemedi. Uygulama kapatılacak: {error}' diff --git a/crates/clash-verge-i18n/locales/tt.yml b/crates/clash-verge-i18n/locales/tt.yml index a9d8fcb3d..2f067cc07 100644 --- a/crates/clash-verge-i18n/locales/tt.yml +++ b/crates/clash-verge-i18n/locales/tt.yml @@ -37,6 +37,8 @@ notifications: service: adminInstallPrompt: Clash Verge хезмәтен урнаштыру өчен администратор хокуклары кирәк. adminUninstallPrompt: Clash Verge хезмәтен бетерү өчен администратор хокуклары кирәк. +core: + alreadyRunning: 'Төшне башлап булмый: төш процессы инде эшли. Тиешле кушымтаны ябыгыз яки калган процессны тәмамлагыз һәм яңадан сынап карагыз. Проблема хәл ителмәсә, санакны яңадан кабызыгыз.' launchGuard: currentExeError: 'Кушымтаның урнашу урынын билгеләп булмады: {error}' homeDirError: 'Хәзерге кулланучының өй каталогын билгеләп булмады. Кушымта ябылачак: {error}' diff --git a/crates/clash-verge-i18n/locales/zh.yml b/crates/clash-verge-i18n/locales/zh.yml index ca2afd3ce..dbb40569b 100644 --- a/crates/clash-verge-i18n/locales/zh.yml +++ b/crates/clash-verge-i18n/locales/zh.yml @@ -37,6 +37,8 @@ notifications: service: adminInstallPrompt: 安装 Clash Verge 服务需要管理员权限 adminUninstallPrompt: 卸载 Clash Verge 服务需要管理员权限 +core: + alreadyRunning: 无法启动内核:已有内核进程正在运行。请退出相关应用或清理残留进程后重试。若仍无法解决,请重启电脑。 launchGuard: currentExeError: 无法确定应用位置:{error} homeDirError: 无法确定当前用户主目录,应用将退出:{error} diff --git a/crates/clash-verge-i18n/locales/zhtw.yml b/crates/clash-verge-i18n/locales/zhtw.yml index bebc5c058..ccf2ab2ac 100644 --- a/crates/clash-verge-i18n/locales/zhtw.yml +++ b/crates/clash-verge-i18n/locales/zhtw.yml @@ -37,6 +37,8 @@ notifications: service: adminInstallPrompt: 安裝 Clash Verge 服務需要管理員權限 adminUninstallPrompt: 解除安裝 Clash Verge 服務需要管理員權限 +core: + alreadyRunning: 無法啟動核心:已有核心程序正在執行。請結束相關應用程式或清理殘留程序後重試。若仍無法解決,請重新啟動電腦。 launchGuard: currentExeError: 無法判斷應用程式位置:{error} homeDirError: 無法判斷目前使用者的個人目錄,應用程式將結束:{error} diff --git a/src-tauri/src/core/manager/lifecycle.rs b/src-tauri/src/core/manager/lifecycle.rs index e7366aec3..ad67b6b0a 100644 --- a/src-tauri/src/core/manager/lifecycle.rs +++ b/src-tauri/src/core/manager/lifecycle.rs @@ -400,7 +400,9 @@ impl CoreManager { } #[cfg(target_os = "windows")] if matches!(*mode, RunningMode::NotRunning) { - clash_verge_service_ipc::execution::check_sidecar_available().await?; + clash_verge_service_ipc::execution::check_sidecar_available() + .await + .map_err(super::state::explain_core_occupancy)?; } if !matches!(status, ServiceStatus::SidecarAllowed) { SERVICE_MANAGER.allow_sidecar_for_session()?; @@ -640,7 +642,11 @@ impl CoreManager { { run_service_start_with_sidecar_fallback( || self.start_core_by_service(), - clash_verge_service_ipc::execution::check_sidecar_available, + || async { + clash_verge_service_ipc::execution::check_sidecar_available() + .await + .map_err(super::state::explain_core_occupancy) + }, |error| self.start_sidecar_after_service_failure(error), |reason| { crate::core::runstate::RUN_STATE @@ -685,7 +691,10 @@ impl CoreManager { ServiceHealth::VersionMismatch => "registered service is unavailable or incompatible".to_owned(), _ => return Ok(()), }; - if let Err(error) = clash_verge_service_ipc::execution::check_sidecar_available().await { + if let Err(error) = clash_verge_service_ipc::execution::check_sidecar_available() + .await + .map_err(super::state::explain_core_occupancy) + { logging!( warn, Type::Core, diff --git a/src-tauri/src/core/manager/state.rs b/src-tauri/src/core/manager/state.rs index 6cd39a300..d30549b91 100644 --- a/src-tauri/src/core/manager/state.rs +++ b/src-tauri/src/core/manager/state.rs @@ -17,6 +17,15 @@ use std::path::Path; use tauri_plugin_mihomo::MihomoExt as _; use tauri_plugin_shell::ShellExt as _; +pub(super) fn explain_core_occupancy(error: anyhow::Error) -> anyhow::Error { + let detail = error.to_string(); + if detail.starts_with("process verge-mihomo") && detail.ends_with("; refusing a second core") { + error.context(clash_verge_i18n::t!("core.alreadyRunning").into_owned()) + } else { + error + } +} + #[cfg(target_os = "windows")] fn sidecar_config_without_tun(yaml: &str) -> Result { use serde_yaml_ng::{Mapping, Value}; @@ -154,7 +163,8 @@ impl CoreManager { self.wait_for_sidecar_exit().await?; let execution = clash_verge_service_ipc::execution::reserve_sidecar() .await - .inspect_err(service::record_residual_service)?; + .inspect_err(service::record_residual_service) + .map_err(explain_core_occupancy)?; self.core_stopped(); let sidecar_ipc = dirs::sidecar_ipc_path()?; @@ -511,6 +521,20 @@ mod readiness_tests { time::Duration, }; + #[test] + fn core_occupancy_explanation_preserves_the_original_error() { + for detail in [ + "process verge-mihomo remains after IPC failure; refusing a second core", + "process verge-mihomo-alpha.exe (PID 123) is still running; refusing a second core", + ] { + let error = super::explain_core_occupancy(anyhow::anyhow!(detail)); + assert_eq!(error.to_string(), clash_verge_i18n::t!("core.alreadyRunning")); + assert_eq!(error.root_cause().to_string(), detail); + } + let error = super::explain_core_occupancy(anyhow::anyhow!("could not inspect remaining cores")); + assert_eq!(error.to_string(), "could not inspect remaining cores"); + } + #[tokio::test] async fn sidecar_readiness_poll_is_bounded_and_accepts_a_real_api_response() -> anyhow::Result<()> { let attempts = Arc::new(AtomicUsize::new(0)); diff --git a/src/components/layout/notice-manager.test.ts b/src/components/layout/notice-manager.test.ts new file mode 100644 index 000000000..e55139545 --- /dev/null +++ b/src/components/layout/notice-manager.test.ts @@ -0,0 +1,67 @@ +import { createInstance } from 'i18next' +import { createElement } from 'react' +import { renderToStaticMarkup } from 'react-dom/server' +import { I18nextProvider } from 'react-i18next' +import { afterEach, expect, it, vi } from 'vitest' + +import settings from '@/locales/en/settings.json' +import { + getSnapshotNotices, + hideNotice, + showNotice, + syncSidecarFailure, +} from '@/services/notice-service' + +import { NoticeManager } from './notice-manager' + +vi.mock('react', async (importOriginal) => ({ + ...(await importOriginal()), + useSyncExternalStore: (_subscribe: unknown, snapshot: () => unknown) => + snapshot(), +})) +vi.mock('@/utils/open-external-url', () => ({ openExternalUrl: vi.fn() })) + +afterEach(() => { + getSnapshotNotices().forEach(({ id }) => hideNotice(id)) +}) + +it.each([ + [ + 'startup', + 'process verge-mihomo remains after IPC failure; refusing a second core', + ], + [ + 'restart', + 'process verge-mihomo-alpha remains after IPC failure; refusing a second core', + ], + [ + 'sidecar', + 'Service core rejected: permission denied; Sidecar fallback failed: process verge-mihomo.exe (PID 123) is still running; refusing a second core', + ], +])( + 'explains an occupied core during %s and preserves diagnostics', + async (operation, detail) => { + if (operation === 'startup') { + showNotice.error('settings.feedback.errors.clash.startFailed', detail) + } else if (operation === 'restart') { + showNotice.error({ code: 'CORE_RESTART_FAILED', detail }) + } else { + syncSidecarFailure({ revision: 1, detail }) + } + const i18n = createInstance() + await i18n.init({ + lng: 'en', + resources: { en: { translation: { settings } } }, + }) + const html = renderToStaticMarkup( + createElement(I18nextProvider, { i18n }, createElement(NoticeManager)), + ) + expect(html).toContain('a core process is already running') + expect(html).toContain('Close the related app or stop the leftover process') + expect(html).toContain(detail) + if (operation === 'sidecar') { + expect(html).toContain('service-core-permissions') + expect(html).toContain('PID 123') + } + }, +) diff --git a/src/components/layout/notice-manager.tsx b/src/components/layout/notice-manager.tsx index c70bd0838..8769a28ae 100644 --- a/src/components/layout/notice-manager.tsx +++ b/src/components/layout/notice-manager.tsx @@ -70,8 +70,8 @@ const resolveNoticeMessage = ( const detail = i18n.params?.message const existingCore = - notice.code === 'SERVICE_SIDECAR_FAILED' && typeof detail === 'string' - ? /process verge-mihomo(?:-alpha)?(?:\.exe)? \(PID (\d+)\) is still running; refusing a second core\s*$/.exec( + typeof detail === 'string' + ? /process verge-mihomo(?:-alpha|-al)?(?:\.exe)? (?:\(PID (\d+)\) is still running|remains after IPC failure); refusing a second core\s*$/.exec( detail, ) : null @@ -101,9 +101,8 @@ const resolveNoticeMessage = ( )} - {t('settings.feedback.errors.clashService.coreAlreadyRunning', { - pid: existingCore[1], - })} + {t('settings.feedback.errors.clashService.coreAlreadyRunning')} + {existingCore[1] && PID {existingCore[1]}} {t('shared.feedback.errors.details')} diff --git a/src/locales/ar/settings.json b/src/locales/ar/settings.json index a92d77c6d..379e17e96 100644 --- a/src/locales/ar/settings.json +++ b/src/locales/ar/settings.json @@ -667,7 +667,7 @@ "reinstallFailed": "تعذّر إعادة تثبيت الخدمة", "repairFailed": "تعذّر إصلاح الخدمة", "sidecarFailed": "تعذّر المتابعة باستخدام Sidecar", - "coreAlreadyRunning": "تعذّر بدء وضع Sidecar: لا تزال نواة أخرى قيد التشغيل (PID {{pid}}). أغلق نسخ Clash Verge الأخرى أو التطبيق الذي يستخدم هذه النواة، ثم أعد المحاولة." + "coreAlreadyRunning": "تعذّر بدء النواة: توجد عملية نواة قيد التشغيل بالفعل. أغلق التطبيق المعني أو أنهِ العملية المتبقية، ثم أعد المحاولة. إذا استمرت المشكلة، فأعد تشغيل الكمبيوتر." }, "sysproxy": { "privilegeRequired": "تعذّر ضبط وكيل النظام: رفض macOS التغيير لعدم كفاية الصلاحيات. ثبّت خدمة Clash Verge؛ وإن كنت مسؤولًا فيمكنك أيضًا إيقاف اشتراط كلمة سر المسؤول للإعدادات على مستوى النظام من الخيارات المتقدمة في إعدادات النظام ← الخصوصية والأمان.", diff --git a/src/locales/de/settings.json b/src/locales/de/settings.json index c072b63d9..1556a404e 100644 --- a/src/locales/de/settings.json +++ b/src/locales/de/settings.json @@ -667,7 +667,7 @@ "reinstallFailed": "Dienst konnte nicht neu installiert werden", "repairFailed": "Dienst konnte nicht repariert werden", "sidecarFailed": "Fortsetzung mit Sidecar fehlgeschlagen", - "coreAlreadyRunning": "Der Sidecar-Modus konnte nicht gestartet werden: Ein anderer Kern läuft noch (PID {{pid}}). Beenden Sie andere Clash-Verge-Instanzen oder die App, die diesen Kern verwendet, und versuchen Sie es erneut." + "coreAlreadyRunning": "Der Kern kann nicht gestartet werden: Ein Kernprozess läuft bereits. Beenden Sie die zugehörige App oder den verbliebenen Prozess und versuchen Sie es erneut. Wenn das Problem weiterhin besteht, starten Sie den Computer neu." }, "sysproxy": { "privilegeRequired": "Systemproxy kann nicht gesetzt werden: macOS hat die Änderung mangels Berechtigung abgelehnt. Installieren Sie den Clash-Verge-Dienst; als Administrator können Sie in den erweiterten Optionen unter Systemeinstellungen → Datenschutz & Sicherheit auch die Passwortpflicht für systemweite Einstellungen deaktivieren.", diff --git a/src/locales/en/settings.json b/src/locales/en/settings.json index 83fc780c8..277c0fc27 100644 --- a/src/locales/en/settings.json +++ b/src/locales/en/settings.json @@ -667,7 +667,7 @@ "reinstallFailed": "Failed to reinstall the service", "repairFailed": "Failed to repair the service", "sidecarFailed": "Failed to continue with Sidecar", - "coreAlreadyRunning": "Could not start normal mode (Sidecar): another core is still running (PID {{pid}}). Exit other Clash Verge instances or the app using this core, then retry." + "coreAlreadyRunning": "Cannot start the core: a core process is already running. Close the related app or stop the leftover process, then retry. If the problem persists, restart your computer." }, "sysproxy": { "privilegeRequired": "Cannot set the system proxy: macOS refused the change for lack of privileges. Install the Clash Verge service; an administrator can also turn off the administrator-password requirement for system-wide settings, in the advanced options of System Settings → Privacy & Security.", diff --git a/src/locales/es/settings.json b/src/locales/es/settings.json index 4d00690cd..5d7252513 100644 --- a/src/locales/es/settings.json +++ b/src/locales/es/settings.json @@ -667,7 +667,7 @@ "reinstallFailed": "No se pudo reinstalar el servicio", "repairFailed": "No se pudo reparar el servicio", "sidecarFailed": "No se pudo continuar con Sidecar", - "coreAlreadyRunning": "No se pudo iniciar el modo Sidecar: hay otro núcleo en ejecución (PID {{pid}}). Cierre las otras instancias de Clash Verge o la aplicación que usa ese núcleo y vuelva a intentarlo." + "coreAlreadyRunning": "No se puede iniciar el núcleo: ya hay un proceso del núcleo en ejecución. Cierre la aplicación correspondiente o finalice el proceso restante y vuelva a intentarlo. Si el problema persiste, reinicie el equipo." }, "sysproxy": { "privilegeRequired": "No se puede establecer el proxy del sistema: macOS rechazó el cambio por falta de permisos. Instale el servicio de Clash Verge; si es administrador, también puede desactivar la exigencia de contraseña de administrador para los ajustes de todo el sistema en las opciones avanzadas de Ajustes del Sistema → Privacidad y seguridad.", diff --git a/src/locales/fa/settings.json b/src/locales/fa/settings.json index 573c5c2c3..79dcc96f9 100644 --- a/src/locales/fa/settings.json +++ b/src/locales/fa/settings.json @@ -667,7 +667,7 @@ "reinstallFailed": "نصب مجدد سرویس ناموفق بود", "repairFailed": "تعمیر سرویس ناموفق بود", "sidecarFailed": "ادامه با Sidecar ناموفق بود", - "coreAlreadyRunning": "حالت Sidecar شروع نشد: هسته دیگری هنوز در حال اجراست (PID {{pid}}). نمونه‌های دیگر Clash Verge یا برنامه‌ای که از این هسته استفاده می‌کند را ببندید و دوباره تلاش کنید." + "coreAlreadyRunning": "هسته شروع نمی‌شود: یک فرایند هسته از قبل در حال اجراست. برنامه مرتبط را ببندید یا فرایند باقی‌مانده را متوقف کنید و دوباره تلاش کنید. اگر مشکل ادامه داشت، رایانه را راه‌اندازی مجدد کنید." }, "sysproxy": { "privilegeRequired": "تنظیم پراکسی سیستم ممکن نیست: macOS به دلیل نداشتن دسترسی، این تغییر را رد کرد. سرویس Clash Verge را نصب کنید؛ اگر مدیر هستید می‌توانید در گزینه‌های پیشرفتهٔ تنظیمات سیستم ← حریم خصوصی و امنیت، الزام رمز مدیر برای تنظیمات سراسری سیستم را نیز خاموش کنید.", diff --git a/src/locales/id/settings.json b/src/locales/id/settings.json index e7d425c08..341cf9676 100644 --- a/src/locales/id/settings.json +++ b/src/locales/id/settings.json @@ -667,7 +667,7 @@ "reinstallFailed": "Gagal memasang ulang layanan", "repairFailed": "Gagal memperbaiki layanan", "sidecarFailed": "Gagal melanjutkan dengan Sidecar", - "coreAlreadyRunning": "Tidak dapat memulai mode Sidecar: inti lain masih berjalan (PID {{pid}}). Tutup instans Clash Verge lain atau aplikasi yang menggunakan inti tersebut, lalu coba lagi." + "coreAlreadyRunning": "Tidak dapat memulai inti: proses inti sudah berjalan. Tutup aplikasi terkait atau hentikan proses yang tersisa, lalu coba lagi. Jika masalah berlanjut, mulai ulang komputer." }, "sysproxy": { "privilegeRequired": "Tidak dapat mengatur proxy sistem: macOS menolak perubahan ini karena hak akses tidak mencukupi. Pasang layanan Clash Verge; jika Anda administrator, Anda juga dapat mematikan keharusan kata sandi administrator untuk pengaturan seluruh sistem di opsi lanjutan Pengaturan Sistem → Privasi & Keamanan.", diff --git a/src/locales/jp/settings.json b/src/locales/jp/settings.json index 6a8530aa4..06af65f1c 100644 --- a/src/locales/jp/settings.json +++ b/src/locales/jp/settings.json @@ -667,7 +667,7 @@ "reinstallFailed": "サービスの再インストールに失敗しました", "repairFailed": "サービスの修復に失敗しました", "sidecarFailed": "Sidecar での続行に失敗しました", - "coreAlreadyRunning": "通常モード(Sidecar)を開始できません:別のコアが実行中です(PID {{pid}})。他の Clash Verge またはこのコアを使用しているアプリを終了してから、再試行してください。" + "coreAlreadyRunning": "コアを起動できません:コアプロセスが実行中です。関連アプリまたは残存プロセスを終了して再試行してください。解決しない場合は、コンピューターを再起動してください。" }, "sysproxy": { "privilegeRequired": "システムプロキシを設定できません: 権限が不足しているため macOS が変更を拒否しました。Clash Verge サービスをインストールしてください。管理者であれば、システム設定 → プライバシーとセキュリティの詳細オプションで、システム全体の設定に管理者パスワードを要求する設定をオフにすることもできます。", diff --git a/src/locales/ko/settings.json b/src/locales/ko/settings.json index 241f4f9fa..6bbcf08a0 100644 --- a/src/locales/ko/settings.json +++ b/src/locales/ko/settings.json @@ -667,7 +667,7 @@ "reinstallFailed": "서비스를 다시 설치하지 못했습니다", "repairFailed": "서비스를 복구하지 못했습니다", "sidecarFailed": "Sidecar로 계속하지 못했습니다", - "coreAlreadyRunning": "일반 모드(Sidecar)를 시작할 수 없습니다. 다른 코어가 실행 중입니다(PID {{pid}}). 다른 Clash Verge 인스턴스 또는 해당 코어를 사용하는 앱을 종료한 후 다시 시도하세요." + "coreAlreadyRunning": "코어를 시작할 수 없습니다. 이미 실행 중인 코어 프로세스가 있습니다. 관련 앱이나 남아 있는 프로세스를 종료한 뒤 다시 시도하세요. 문제가 계속되면 컴퓨터를 다시 시작하세요." }, "sysproxy": { "privilegeRequired": "시스템 프록시를 설정할 수 없습니다: 권한이 부족하여 macOS가 변경을 거부했습니다. Clash Verge 서비스를 설치하십시오. 관리자라면 시스템 설정 → 개인 정보 보호 및 보안의 고급 옵션에서, 시스템 전체 설정에 관리자 암호를 요구하는 설정을 끌 수도 있습니다.", diff --git a/src/locales/pt/settings.json b/src/locales/pt/settings.json index 8e2aac51e..1f95164bc 100644 --- a/src/locales/pt/settings.json +++ b/src/locales/pt/settings.json @@ -667,7 +667,7 @@ "reinstallFailed": "Falha ao reinstalar o serviço", "repairFailed": "Falha ao reparar o serviço", "sidecarFailed": "Falha ao continuar com o Sidecar", - "coreAlreadyRunning": "Não foi possível iniciar o modo normal (Sidecar): outro núcleo ainda está em execução (PID {{pid}}). Saia das outras instâncias do Clash Verge ou do aplicativo que usa este núcleo e tente novamente." + "coreAlreadyRunning": "Não é possível iniciar o núcleo: já há um processo do núcleo em execução. Feche o aplicativo correspondente ou encerre o processo remanescente e tente novamente. Se o problema persistir, reinicie o computador." }, "sysproxy": { "privilegeRequired": "Não é possível definir o proxy do sistema: o macOS recusou a alteração por falta de privilégios. Instale o serviço do Clash Verge; um administrador também pode desativar a exigência de senha de administrador para configurações do sistema, nas opções avançadas em Ajustes do Sistema → Privacidade e Segurança.", diff --git a/src/locales/ru/settings.json b/src/locales/ru/settings.json index e8541bdd8..550bd9615 100644 --- a/src/locales/ru/settings.json +++ b/src/locales/ru/settings.json @@ -667,7 +667,7 @@ "reinstallFailed": "Не удалось переустановить службу", "repairFailed": "Не удалось восстановить службу", "sidecarFailed": "Не удалось продолжить в режиме Sidecar", - "coreAlreadyRunning": "Не удалось запустить режим Sidecar: другое ядро ещё работает (PID {{pid}}). Закройте другие экземпляры Clash Verge или приложение, использующее это ядро, и повторите попытку." + "coreAlreadyRunning": "Не удалось запустить ядро: процесс ядра уже работает. Закройте соответствующее приложение или завершите оставшийся процесс и повторите попытку. Если проблема сохраняется, перезагрузите компьютер." }, "sysproxy": { "privilegeRequired": "Не удалось настроить системный прокси: macOS отклонил изменение из-за нехватки прав. Установите службу Clash Verge; администратор также может отключить требование пароля администратора для общесистемных настроек в дополнительных параметрах раздела «Системные настройки → Конфиденциальность и безопасность».", diff --git a/src/locales/tr/settings.json b/src/locales/tr/settings.json index 262f730c0..fad3447e0 100644 --- a/src/locales/tr/settings.json +++ b/src/locales/tr/settings.json @@ -667,7 +667,7 @@ "reinstallFailed": "Hizmet yeniden kurulamadı", "repairFailed": "Hizmet onarılamadı", "sidecarFailed": "Sidecar ile devam edilemedi", - "coreAlreadyRunning": "Sidecar modu başlatılamadı: başka bir çekirdek hâlâ çalışıyor (PID {{pid}}). Diğer Clash Verge örneklerini veya bu çekirdeği kullanan uygulamayı kapatıp yeniden deneyin." + "coreAlreadyRunning": "Çekirdek başlatılamıyor: bir çekirdek işlemi zaten çalışıyor. İlgili uygulamayı kapatın veya kalan işlemi sonlandırıp yeniden deneyin. Sorun devam ederse bilgisayarı yeniden başlatın." }, "sysproxy": { "privilegeRequired": "Sistem vekil sunucusu ayarlanamıyor: macOS yetki yetersizliği nedeniyle değişikliği reddetti. Clash Verge hizmetini kurun; yöneticiyseniz Sistem Ayarları → Gizlilik ve Güvenlik bölümündeki gelişmiş seçeneklerden, sistem genelindeki ayarlar için yönetici parolası zorunluluğunu da kapatabilirsiniz.", diff --git a/src/locales/tt/settings.json b/src/locales/tt/settings.json index 774b90f0b..68154eae4 100644 --- a/src/locales/tt/settings.json +++ b/src/locales/tt/settings.json @@ -667,7 +667,7 @@ "reinstallFailed": "Хезмәтне яңадан урнаштырып булмады", "repairFailed": "Хезмәтне төзәтеп булмады", "sidecarFailed": "Sidecar белән дәвам итеп булмады", - "coreAlreadyRunning": "Sidecar режимын башлап булмады: башка төш әле эшли (PID {{pid}}). Башка Clash Verge нөсхәләрен яки бу төшне кулланучы кушымтаны ябыгыз һәм яңадан сынап карагыз." + "coreAlreadyRunning": "Төшне башлап булмый: төш процессы инде эшли. Тиешле кушымтаны ябыгыз яки калган процессны тәмамлагыз һәм яңадан сынап карагыз. Проблема хәл ителмәсә, санакны яңадан кабызыгыз." }, "sysproxy": { "privilegeRequired": "Система проксиен көйләп булмый: хокуклар җитмәгәнгә күрә macOS бу үзгәрешне кире какты. Clash Verge хезмәтен урнаштырыгыз; әгәр сез администратор булсагыз, Система көйләнмәләре → Шәхсилек вә иминлек бүлегенең өстәмә параметрларында, система дәрәҗәсендәге көйләнмәләр өчен администратор паролен таләп итүне сүндерә аласыз.", diff --git a/src/locales/zh/settings.json b/src/locales/zh/settings.json index 38e37127d..936f2cb15 100644 --- a/src/locales/zh/settings.json +++ b/src/locales/zh/settings.json @@ -667,7 +667,7 @@ "reinstallFailed": "重新安装服务失败", "repairFailed": "修复服务失败", "sidecarFailed": "继续使用 Sidecar 失败", - "coreAlreadyRunning": "无法启动普通模式(Sidecar):已有内核进程正在运行(PID {{pid}})。请先退出其他 Clash Verge 实例或使用该内核的程序,然后重试。" + "coreAlreadyRunning": "无法启动内核:已有内核进程正在运行。请退出相关应用或清理残留进程后重试。若仍无法解决,请重启电脑。" }, "sysproxy": { "privilegeRequired": "无法设置系统代理:macOS 以权限不足为由拒绝了这次修改。请安装 Clash Verge 服务;管理员也可以在系统设置 → 隐私与安全性的高级选项中,关闭访问系统范围设置需要管理员密码的要求。", diff --git a/src/locales/zhtw/settings.json b/src/locales/zhtw/settings.json index 35e956b28..569ce3347 100644 --- a/src/locales/zhtw/settings.json +++ b/src/locales/zhtw/settings.json @@ -667,7 +667,7 @@ "reinstallFailed": "重新安裝服務失敗", "repairFailed": "修復服務失敗", "sidecarFailed": "繼續使用 Sidecar 失敗", - "coreAlreadyRunning": "無法啟動一般模式(Sidecar):已有核心程序正在執行(PID {{pid}})。請先結束其他 Clash Verge 執行個體或使用該核心的程式,然後重試。" + "coreAlreadyRunning": "無法啟動核心:已有核心程序正在執行。請結束相關應用程式或清理殘留程序後重試。若仍無法解決,請重新啟動電腦。" }, "sysproxy": { "privilegeRequired": "無法設定系統代理:macOS 以權限不足為由拒絕了這次修改。請安裝 Clash Verge 服務;管理者也可以在系統設定 → 隱私權與安全性的進階選項中,關閉存取系統層級設定需要管理者密碼的要求。",