From 0136b87311afb7253fc0afe1abce71b46b234eb2 Mon Sep 17 00:00:00 2001 From: Syngnat Date: Sat, 18 Jul 2026 16:43:39 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(proxy):=20=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E4=BB=A3=E7=90=86=E5=BD=B1=E5=93=8D=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除数据库和 Redis 连接对全局代理的隐式继承 保留连接自身代理与 HTTP 隧道配置并修正缓存释放链路 同步六种语言的代理作用域说明并增加回归测试 Fixes #347 --- frontend/src/i18n/globalProxyScope.test.ts | 41 +++++++++++++++ internal/app/app.go | 15 ++---- .../app/app_startup_connect_retry_test.go | 28 +++++----- internal/app/db_proxy.go | 9 ++++ internal/app/global_proxy.go | 30 ----------- .../app/global_proxy_database_scope_test.go | 52 +++++++++++++++++++ internal/app/methods_db.go | 2 +- internal/app/methods_db_conn_test.go | 6 +-- internal/app/methods_redis.go | 6 +-- internal/app/methods_redis_test.go | 9 +++- shared/i18n/de-DE.json | 4 +- shared/i18n/en-US.json | 4 +- shared/i18n/ja-JP.json | 4 +- shared/i18n/ru-RU.json | 4 +- shared/i18n/zh-CN.json | 4 +- shared/i18n/zh-TW.json | 4 +- 16 files changed, 147 insertions(+), 75 deletions(-) create mode 100644 frontend/src/i18n/globalProxyScope.test.ts create mode 100644 internal/app/global_proxy_database_scope_test.go diff --git a/frontend/src/i18n/globalProxyScope.test.ts b/frontend/src/i18n/globalProxyScope.test.ts new file mode 100644 index 00000000..f417d2d5 --- /dev/null +++ b/frontend/src/i18n/globalProxyScope.test.ts @@ -0,0 +1,41 @@ +import { describe, expect, it } from 'vitest'; + +import { catalogs } from './catalog'; + +const expectedDatabaseBoundaries = { + 'de-DE': { + description: 'Datenbankverbindungen verwenden nur ihre eigenen Proxy-Einstellungen', + scope: 'Datenbankverbindungen sind nicht betroffen', + }, + 'en-US': { + description: 'Database connections only use their own proxy settings', + scope: 'does not affect database connections', + }, + 'ja-JP': { + description: 'データベース接続では接続ごとのプロキシ設定のみを使用します', + scope: 'データベース接続には影響しません', + }, + 'ru-RU': { + description: 'Подключения к базе данных используют только собственные настройки прокси', + scope: 'не влияет на подключения к базе данных', + }, + 'zh-CN': { + description: '数据库连接仅使用连接自身的代理配置', + scope: '不影响数据库连接', + }, + 'zh-TW': { + description: '資料庫連線僅使用連線本身的代理設定', + scope: '不影響資料庫連線', + }, +} as const; + +describe('global proxy scope copy', () => { + it('makes the database proxy boundary explicit in every locale', () => { + for (const [language, expected] of Object.entries(expectedDatabaseBoundaries)) { + const catalog = catalogs[language as keyof typeof catalogs]; + + expect(catalog['app.proxy.description']).toContain(expected.description); + expect(catalog['app.proxy.scope_hint']).toContain(expected.scope); + } + }); +}); diff --git a/internal/app/app.go b/internal/app/app.go index a7c8f777..62d5cbc0 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -564,7 +564,7 @@ func (a *App) invalidateCachedDatabase(config connection.ConnectionConfig, reaso if resolvedConfig, err := a.resolveConnectionSecrets(config); err == nil { config = resolvedConfig } - effectiveConfig := applyGlobalProxyToConnection(config) + effectiveConfig := config key := getCacheKey(effectiveConfig) shortKey := shortCacheKey(key) @@ -876,7 +876,7 @@ func (a *App) resolveEffectiveConnectionConfig(config connection.ConnectionConfi if err != nil { return config, wrapConnectError(config, err) } - return applyGlobalProxyToConnection(resolvedConfig), nil + return resolvedConfig, nil } func (a *App) getDatabaseWithPing(config connection.ConnectionConfig, forcePing bool) (db.Database, error) { @@ -884,7 +884,7 @@ func (a *App) getDatabaseWithPing(config connection.ConnectionConfig, forcePing if err != nil { return nil, wrapConnectError(config, err) } - effectiveConfig := applyGlobalProxyToConnection(resolvedConfig) + effectiveConfig := resolvedConfig isFileDB := isFileDatabaseType(effectiveConfig.Type) key := getCacheKey(effectiveConfig) @@ -1164,7 +1164,7 @@ func (a *App) connectDatabaseWithStartupRetry(rawConfig connection.ConnectionCon var lastEffectiveConfig connection.ConnectionConfig for attempt := 1; attempt <= startupConnectRetryAttempts; attempt++ { - effectiveConfig := applyGlobalProxyToConnection(rawConfig) + effectiveConfig := rawConfig lastEffectiveConfig = effectiveConfig cacheKey := shortenCacheKey(getCacheKey(effectiveConfig)) @@ -1219,12 +1219,7 @@ func (a *App) startupPhaseLabel() string { age = 0 } if age <= startupConnectRetryWindow { - snapshot := currentGlobalProxyConfig() - state := "关闭" - if snapshot.Enabled { - state = fmt.Sprintf("启用(%s://%s:%d)", strings.ToLower(strings.TrimSpace(snapshot.Proxy.Type)), strings.TrimSpace(snapshot.Proxy.Host), snapshot.Proxy.Port) - } - return fmt.Sprintf("启动期(age=%s,全局代理=%s)", age, state) + return fmt.Sprintf("启动期(age=%s)", age) } return fmt.Sprintf("稳定期(age=%s)", age) } diff --git a/internal/app/app_startup_connect_retry_test.go b/internal/app/app_startup_connect_retry_test.go index cbe060be..cb4a4f8a 100644 --- a/internal/app/app_startup_connect_retry_test.go +++ b/internal/app/app_startup_connect_retry_test.go @@ -50,7 +50,7 @@ func (f *fakeStartupRetryDB) GetTriggers(dbName, tableName string) ([]connection return nil, nil } -func TestConnectDatabaseWithStartupRetry_RetriesTransientFailureAndReappliesGlobalProxy(t *testing.T) { +func TestConnectDatabaseWithStartupRetry_RetriesTransientFailureWithoutApplyingGlobalProxy(t *testing.T) { originalNewDatabaseFunc := newDatabaseFunc originalResolveDialConfigWithProxyFunc := resolveDialConfigWithProxyFunc snapshot := currentGlobalProxyConfig() @@ -101,11 +101,11 @@ func TestConnectDatabaseWithStartupRetry_RetriesTransientFailureAndReappliesGlob if seenConfigs[0].UseProxy { t.Fatalf("expected first attempt without proxy, got %+v", seenConfigs[0]) } - if !seenConfigs[1].UseProxy { - t.Fatalf("expected second attempt with proxy after startup retry, got %+v", seenConfigs[1]) + if seenConfigs[1].UseProxy { + t.Fatalf("expected global proxy change not to affect second database attempt, got %+v", seenConfigs[1]) } - if !effectiveConfig.UseProxy { - t.Fatalf("expected returned effective config to include proxy, got %+v", effectiveConfig) + if effectiveConfig.UseProxy { + t.Fatalf("expected returned effective config to exclude global proxy, got %+v", effectiveConfig) } } @@ -300,10 +300,10 @@ func TestGetDatabaseWithPing_CoolsDownRepeatedFailures(t *testing.T) { } a := &App{ - startedAt: time.Now().Add(-startupConnectRetryWindow - time.Second), - dbCache: make(map[string]cachedDatabase), + startedAt: time.Now().Add(-startupConnectRetryWindow - time.Second), + dbCache: make(map[string]cachedDatabase), connectFailures: make(map[string]cachedConnectFailure), - runningQueries: make(map[string]queryContext), + runningQueries: make(map[string]queryContext), } config := connection.ConnectionConfig{Type: "postgres", Host: "10.1.131.86", Port: 5432, User: "postgres"} @@ -349,10 +349,10 @@ func TestGetDatabaseWithPing_AllowsRetryAfterFailureCooldown(t *testing.T) { } a := &App{ - startedAt: time.Now().Add(-startupConnectRetryWindow - time.Second), - dbCache: make(map[string]cachedDatabase), + startedAt: time.Now().Add(-startupConnectRetryWindow - time.Second), + dbCache: make(map[string]cachedDatabase), connectFailures: make(map[string]cachedConnectFailure), - runningQueries: make(map[string]queryContext), + runningQueries: make(map[string]queryContext), } config := connection.ConnectionConfig{Type: "postgres", Host: "10.1.131.86", Port: 5432, User: "postgres"} @@ -409,10 +409,10 @@ func TestGetDatabaseWithPing_ClearsFailureCooldownAfterSuccess(t *testing.T) { } a := &App{ - startedAt: time.Now().Add(-startupConnectRetryWindow - time.Second), - dbCache: make(map[string]cachedDatabase), + startedAt: time.Now().Add(-startupConnectRetryWindow - time.Second), + dbCache: make(map[string]cachedDatabase), connectFailures: make(map[string]cachedConnectFailure), - runningQueries: make(map[string]queryContext), + runningQueries: make(map[string]queryContext), } config := connection.ConnectionConfig{Type: "postgres", Host: "10.1.131.86", Port: 5432, User: "postgres"} diff --git a/internal/app/db_proxy.go b/internal/app/db_proxy.go index 04edfbb9..4fbb246e 100644 --- a/internal/app/db_proxy.go +++ b/internal/app/db_proxy.go @@ -10,6 +10,15 @@ import ( proxytunnel "GoNavi-Wails/internal/proxy" ) +func isFileDatabaseType(driverType string) bool { + switch strings.ToLower(strings.TrimSpace(driverType)) { + case "sqlite", "duckdb": + return true + default: + return false + } +} + func resolveDialConfigWithProxy(raw connection.ConnectionConfig) (connection.ConnectionConfig, error) { config := raw if config.UseHTTPTunnel { diff --git a/internal/app/global_proxy.go b/internal/app/global_proxy.go index 936c5448..4e7db57a 100644 --- a/internal/app/global_proxy.go +++ b/internal/app/global_proxy.go @@ -160,36 +160,6 @@ func (a *App) GetGlobalProxyConfig() connection.QueryResult { } } -func applyGlobalProxyToConnection(config connection.ConnectionConfig) connection.ConnectionConfig { - effective := config - if effective.UseProxy || effective.UseHTTPTunnel { - return effective - } - if isFileDatabaseType(effective.Type) { - effective.Proxy = connection.ProxyConfig{} - return effective - } - - snapshot := currentGlobalProxyConfig() - if !snapshot.Enabled { - effective.Proxy = connection.ProxyConfig{} - return effective - } - - effective.UseProxy = true - effective.Proxy = snapshot.Proxy - return effective -} - -func isFileDatabaseType(driverType string) bool { - switch strings.ToLower(strings.TrimSpace(driverType)) { - case "sqlite", "duckdb": - return true - default: - return false - } -} - func newHTTPClientWithGlobalProxy(timeout time.Duration) *http.Client { client := &http.Client{ Timeout: timeout, diff --git a/internal/app/global_proxy_database_scope_test.go b/internal/app/global_proxy_database_scope_test.go new file mode 100644 index 00000000..33945585 --- /dev/null +++ b/internal/app/global_proxy_database_scope_test.go @@ -0,0 +1,52 @@ +package app + +import ( + "testing" + + "GoNavi-Wails/internal/connection" +) + +func TestResolveEffectiveConnectionConfigUsesOnlyConnectionProxy(t *testing.T) { + snapshot := currentGlobalProxyConfig() + if _, err := setGlobalProxyConfig(true, connection.ProxyConfig{ + Type: "socks5", + Host: "127.0.0.1", + Port: 1080, + }); err != nil { + t.Fatalf("enable global proxy failed: %v", err) + } + t.Cleanup(func() { + _, _ = setGlobalProxyConfig(snapshot.Enabled, snapshot.Proxy) + }) + + app := NewApp() + directConfig := connection.ConnectionConfig{ + Type: "mysql", + Host: "db.internal", + Port: 3306, + } + effectiveDirect, err := app.resolveEffectiveConnectionConfig(directConfig) + if err != nil { + t.Fatalf("resolve direct config failed: %v", err) + } + if effectiveDirect.UseProxy || effectiveDirect.Proxy != (connection.ProxyConfig{}) { + t.Fatalf("global proxy must not be injected into a direct database connection, got %+v", effectiveDirect) + } + + connectionProxy := connection.ProxyConfig{ + Type: "http", + Host: "db-proxy.internal", + Port: 8080, + User: "proxy-user", + } + proxiedConfig := directConfig + proxiedConfig.UseProxy = true + proxiedConfig.Proxy = connectionProxy + effectiveProxied, err := app.resolveEffectiveConnectionConfig(proxiedConfig) + if err != nil { + t.Fatalf("resolve proxied config failed: %v", err) + } + if !effectiveProxied.UseProxy || !proxyConfigEqual(effectiveProxied.Proxy, connectionProxy) { + t.Fatalf("connection-specific proxy must be preserved, got %+v", effectiveProxied) + } +} diff --git a/internal/app/methods_db.go b/internal/app/methods_db.go index cecb37d6..8b9b0775 100644 --- a/internal/app/methods_db.go +++ b/internal/app/methods_db.go @@ -99,7 +99,7 @@ func (a *App) DBReleaseConnection(config connection.ConnectionConfig) connection logger.Error(wrapped, "DBReleaseConnection 解析连接密文失败:%s", formatConnSummary(config)) return connection.QueryResult{Success: false, Message: wrapped.Error()} } - closed := a.releaseCachedDatabaseConnectionsForConfig(applyGlobalProxyToConnection(resolvedConfig)) + closed := a.releaseCachedDatabaseConnectionsForConfig(resolvedConfig) logger.Infof("DBReleaseConnection 已释放数据库连接:%s 数量=%d", formatConnSummary(resolvedConfig), closed) return connection.QueryResult{Success: true, Message: a.appText("db.backend.message.release_success", nil), Data: map[string]int{"closed": closed}} diff --git a/internal/app/methods_db_conn_test.go b/internal/app/methods_db_conn_test.go index 0e5cc636..da21ae2d 100644 --- a/internal/app/methods_db_conn_test.go +++ b/internal/app/methods_db_conn_test.go @@ -175,10 +175,10 @@ func TestFormatConnSummary_DefaultTimeout(t *testing.T) { } } -func TestDBReleaseConnectionClosesAllDatabaseCacheEntriesForSameInstance(t *testing.T) { +func TestDBReleaseConnectionClosesAllDatabaseCacheEntriesForSameInstanceDespiteGlobalProxy(t *testing.T) { proxySnapshot := currentGlobalProxyConfig() - if _, err := setGlobalProxyConfig(false, proxySnapshot.Proxy); err != nil { - t.Fatalf("disable global proxy failed: %v", err) + if _, err := setGlobalProxyConfig(true, connection.ProxyConfig{Type: "socks5", Host: "127.0.0.1", Port: 1080}); err != nil { + t.Fatalf("enable global proxy failed: %v", err) } t.Cleanup(func() { _, _ = setGlobalProxyConfig(proxySnapshot.Enabled, proxySnapshot.Proxy) diff --git a/internal/app/methods_redis.go b/internal/app/methods_redis.go index e8c0724b..5faf36c8 100644 --- a/internal/app/methods_redis.go +++ b/internal/app/methods_redis.go @@ -682,7 +682,7 @@ func (a *App) getRedisClient(config connection.ConnectionConfig) (redis.RedisCli return nil, wrapped } - effectiveConfig := applyGlobalProxyToConnection(resolvedConfig) + effectiveConfig := resolvedConfig connectConfig, proxyErr := resolveDialConfigWithProxyFunc(effectiveConfig) if proxyErr != nil { wrapped := wrapConnectError(effectiveConfig, proxyErr) @@ -735,7 +735,7 @@ func (a *App) openRedisClientIsolated(config connection.ConnectionConfig) (redis return nil, wrapped } - effectiveConfig := applyGlobalProxyToConnection(resolvedConfig) + effectiveConfig := resolvedConfig connectConfig, proxyErr := resolveDialConfigWithProxyFunc(effectiveConfig) if proxyErr != nil { wrapped := wrapConnectError(effectiveConfig, proxyErr) @@ -824,7 +824,7 @@ func (a *App) releaseRedisClientsForConfig(config connection.ConnectionConfig) ( if err != nil { return 0, wrapConnectError(config, err) } - targetKey := getConnectionReleaseMatchKey(applyGlobalProxyToConnection(resolvedConfig)) + targetKey := getConnectionReleaseMatchKey(resolvedConfig) closed := 0 redisCacheMu.Lock() diff --git a/internal/app/methods_redis_test.go b/internal/app/methods_redis_test.go index 51f4e3fa..36a2321e 100644 --- a/internal/app/methods_redis_test.go +++ b/internal/app/methods_redis_test.go @@ -385,15 +385,17 @@ func TestRedisTestConnectionUsesIsolatedClientAndClosesIt(t *testing.T) { CloseAllRedisClients() }() CloseAllRedisClients() - if _, err := setGlobalProxyConfig(false, proxySnapshot.Proxy); err != nil { - t.Fatalf("disable global proxy failed: %v", err) + if _, err := setGlobalProxyConfig(true, connection.ProxyConfig{Type: "socks5", Host: "127.0.0.1", Port: 1080}); err != nil { + t.Fatalf("enable global proxy failed: %v", err) } client := &capturingRedisClient{} + var dialConfig connection.ConnectionConfig newRedisClientFunc = func() redislib.RedisClient { return client } resolveDialConfigWithProxyFunc = func(raw connection.ConnectionConfig) (connection.ConnectionConfig, error) { + dialConfig = raw return raw, nil } @@ -413,6 +415,9 @@ func TestRedisTestConnectionUsesIsolatedClientAndClosesIt(t *testing.T) { if len(redisCache) != 0 { t.Fatalf("redis test connection must not write global redis cache, got %d entries", len(redisCache)) } + if dialConfig.UseProxy { + t.Fatalf("global proxy must not be applied to Redis connections, got %+v", dialConfig) + } } func TestRedisTestConnectionReturnsLocalizedCloseFailure(t *testing.T) { diff --git a/shared/i18n/de-DE.json b/shared/i18n/de-DE.json index 2bb3ad9b..c92a48bb 100644 --- a/shared/i18n/de-DE.json +++ b/shared/i18n/de-DE.json @@ -2594,7 +2594,7 @@ "app.proxy.clear_saved_password": "Gespeichertes Passwort löschen", "app.proxy.clear_saved_password_pending": "Das gespeicherte Proxy-Passwort wird gelöscht, nachdem Sie Konfiguration anwenden klicken.", "app.proxy.connection_title": "Proxy-Endpunkt", - "app.proxy.description": "Konfiguriert Updateprüfungen, Treiberverwaltung und den Netzwerkzugang für Verbindungen ohne separaten Proxy.", + "app.proxy.description": "Konfiguriert Anwendungsnetzwerkanfragen wie Updateprüfungen, Treiberverwaltung und GitHub-Asset-Downloads. Datenbankverbindungen verwenden nur ihre eigenen Proxy-Einstellungen.", "app.proxy.disabled_hint": "Sie können die Felder auch im deaktivierten Zustand ausfüllen. Beim Anwenden wird der Entwurf gespeichert und der globale Proxy bleibt deaktiviert.", "app.proxy.enable": "Globalen Proxy aktivieren", "app.proxy.enabled_edit_hint": "Änderungen werden erst nach Konfiguration anwenden wirksam, nicht während der Eingabe.", @@ -2611,7 +2611,7 @@ "app.proxy.preset.http_local": "HTTP 8080", "app.proxy.preset.socks5_local": "SOCKS5 1080", "app.proxy.reset": "Zurücksetzen", - "app.proxy.scope_hint": "* Gilt für Updateprüfungen, Netzwerkanfragen der Treiberverwaltung, GitHub-Asset-Downloads und Datenbankverbindungen ohne separat konfigurierten Proxy", + "app.proxy.scope_hint": "* Gilt für Updateprüfungen, Netzwerkanfragen der Treiberverwaltung und GitHub-Asset-Downloads; Datenbankverbindungen sind nicht betroffen", "app.proxy.section_title": "Globaler Proxy", "app.proxy.status.disabled": "Deaktiviert", "app.proxy.status.disabled_description": "Öffentliche Netzwerkanfragen wie Updateprüfungen und Treiberdownloads verbinden sich direkt oder nutzen den System-Proxy.", diff --git a/shared/i18n/en-US.json b/shared/i18n/en-US.json index bca3914f..6cee26ed 100644 --- a/shared/i18n/en-US.json +++ b/shared/i18n/en-US.json @@ -2594,7 +2594,7 @@ "app.proxy.clear_saved_password": "Clear saved password", "app.proxy.clear_saved_password_pending": "The saved proxy password will be cleared after you click Apply Configuration.", "app.proxy.connection_title": "Proxy Endpoint", - "app.proxy.description": "Configure update checks, driver management, and connection network access that has no separate proxy.", + "app.proxy.description": "Configure application network requests such as update checks, driver management, and GitHub asset downloads. Database connections only use their own proxy settings.", "app.proxy.disabled_hint": "You can fill the fields while disabled. Applying will save the draft and keep the global proxy disabled.", "app.proxy.enable": "Enable Global Proxy", "app.proxy.enabled_edit_hint": "Changes take effect only after Apply Configuration, not while you are typing.", @@ -2611,7 +2611,7 @@ "app.proxy.preset.http_local": "HTTP 8080", "app.proxy.preset.socks5_local": "SOCKS5 1080", "app.proxy.reset": "Reset", - "app.proxy.scope_hint": "* Applies to update checks, driver management network requests, GitHub asset downloads, and database connections without a separate proxy", + "app.proxy.scope_hint": "* Applies to update checks, driver management network requests, and GitHub asset downloads; does not affect database connections", "app.proxy.section_title": "Global Proxy", "app.proxy.status.disabled": "Disabled", "app.proxy.status.disabled_description": "Public network requests such as update checks and driver downloads will connect directly or use the system proxy.", diff --git a/shared/i18n/ja-JP.json b/shared/i18n/ja-JP.json index 6ff90694..d06e7039 100644 --- a/shared/i18n/ja-JP.json +++ b/shared/i18n/ja-JP.json @@ -2594,7 +2594,7 @@ "app.proxy.clear_saved_password": "保存済みパスワードをクリア", "app.proxy.clear_saved_password_pending": "保存済みのプロキシパスワードは「設定を適用」をクリックした後にクリアされます。", "app.proxy.connection_title": "プロキシエンドポイント", - "app.proxy.description": "更新確認、ドライバー管理、個別プロキシを指定していない接続のネットワーク出口を一元設定します。", + "app.proxy.description": "更新確認、ドライバー管理、GitHub アセットのダウンロードなど、アプリのネットワークリクエストを一元設定します。データベース接続では接続ごとのプロキシ設定のみを使用します。", "app.proxy.disabled_hint": "無効のままでも項目を入力できます。適用すると下書きを保存し、グローバルプロキシは無効のままにします。", "app.proxy.enable": "グローバルプロキシを有効化", "app.proxy.enabled_edit_hint": "変更は入力中ではなく「設定を適用」をクリックした後に有効になります。", @@ -2611,7 +2611,7 @@ "app.proxy.preset.http_local": "HTTP 8080", "app.proxy.preset.socks5_local": "SOCKS5 1080", "app.proxy.reset": "リセット", - "app.proxy.scope_hint": "* 更新確認、ドライバー管理のネットワークリクエスト、GitHub アセットのダウンロード、および個別プロキシ未設定のデータベース接続に適用されます", + "app.proxy.scope_hint": "* 更新確認、ドライバー管理のネットワークリクエスト、GitHub アセットのダウンロードに適用され、データベース接続には影響しません", "app.proxy.section_title": "グローバルプロキシ", "app.proxy.status.disabled": "無効", "app.proxy.status.disabled_description": "更新確認やドライバーダウンロードなどの公開ネットワークリクエストは直接接続またはシステムプロキシを使用します。", diff --git a/shared/i18n/ru-RU.json b/shared/i18n/ru-RU.json index 7707b537..9b821c50 100644 --- a/shared/i18n/ru-RU.json +++ b/shared/i18n/ru-RU.json @@ -2594,7 +2594,7 @@ "app.proxy.clear_saved_password": "Очистить сохраненный пароль", "app.proxy.clear_saved_password_pending": "Сохраненный пароль прокси будет очищен после нажатия «Применить конфигурацию».", "app.proxy.connection_title": "Адрес прокси", - "app.proxy.description": "Единая настройка проверки обновлений, управления драйверами и сетевого выхода для подключений без отдельного прокси.", + "app.proxy.description": "Единая настройка сетевых запросов приложения, включая проверку обновлений, управление драйверами и загрузку ресурсов GitHub. Подключения к базе данных используют только собственные настройки прокси.", "app.proxy.disabled_hint": "Поля можно заполнить и в отключенном состоянии. При применении черновик сохранится, а глобальный прокси останется отключенным.", "app.proxy.enable": "Включить глобальный прокси", "app.proxy.enabled_edit_hint": "Изменения вступают в силу только после нажатия «Применить конфигурацию», а не во время ввода.", @@ -2611,7 +2611,7 @@ "app.proxy.preset.http_local": "HTTP 8080", "app.proxy.preset.socks5_local": "SOCKS5 1080", "app.proxy.reset": "Сброс", - "app.proxy.scope_hint": "* Применяется к проверке обновлений, сетевым запросам управления драйверами, загрузкам GitHub assets и подключениям к базе данных без отдельного прокси", + "app.proxy.scope_hint": "* Применяется к проверке обновлений, сетевым запросам управления драйверами и загрузкам ресурсов GitHub; не влияет на подключения к базе данных", "app.proxy.section_title": "Глобальный прокси", "app.proxy.status.disabled": "Отключен", "app.proxy.status.disabled_description": "Публичные сетевые запросы, например проверка обновлений и загрузка драйверов, будут подключаться напрямую или через системный прокси.", diff --git a/shared/i18n/zh-CN.json b/shared/i18n/zh-CN.json index 634e0db3..17931b9f 100644 --- a/shared/i18n/zh-CN.json +++ b/shared/i18n/zh-CN.json @@ -2594,7 +2594,7 @@ "app.proxy.clear_saved_password": "清除已保存密码", "app.proxy.clear_saved_password_pending": "已标记清除已保存的代理密码,点击“应用配置”后生效", "app.proxy.connection_title": "代理地址", - "app.proxy.description": "统一配置更新检查、驱动管理与未单独指定代理的连接网络出口。", + "app.proxy.description": "统一配置更新检查、驱动管理与 GitHub 资源下载等应用网络请求;数据库连接仅使用连接自身的代理配置。", "app.proxy.disabled_hint": "关闭状态下也可以先填写配置;点击“应用配置”后会保存草稿并禁用全局代理。", "app.proxy.enable": "启用全局代理", "app.proxy.enabled_edit_hint": "配置会在点击“应用配置”后生效,不会在输入过程中反复写入。", @@ -2611,7 +2611,7 @@ "app.proxy.preset.http_local": "HTTP 8080", "app.proxy.preset.socks5_local": "SOCKS5 1080", "app.proxy.reset": "重置", - "app.proxy.scope_hint": "* 作用于更新检查、驱动管理网络请求、GitHub 资产下载,以及未单独配置代理的数据库连接", + "app.proxy.scope_hint": "* 作用于更新检查、驱动管理网络请求和 GitHub 资产下载;不影响数据库连接", "app.proxy.section_title": "全局代理", "app.proxy.status.disabled": "未启用", "app.proxy.status.disabled_description": "更新检查、驱动下载等公共网络请求将直接连接或使用系统代理。", diff --git a/shared/i18n/zh-TW.json b/shared/i18n/zh-TW.json index da4893d5..e7c25a1a 100644 --- a/shared/i18n/zh-TW.json +++ b/shared/i18n/zh-TW.json @@ -2594,7 +2594,7 @@ "app.proxy.clear_saved_password": "清除已儲存密碼", "app.proxy.clear_saved_password_pending": "已標記清除已儲存的代理密碼,點擊「套用設定」後生效", "app.proxy.connection_title": "代理地址", - "app.proxy.description": "统一設定更新檢查、驅動管理与未单独指定代理的連線网络出口。", + "app.proxy.description": "統一設定更新檢查、驅動管理與 GitHub 資源下載等應用網路請求;資料庫連線僅使用連線本身的代理設定。", "app.proxy.disabled_hint": "關閉狀態下也可以先填寫設定;點擊「套用設定」後會儲存草稿並停用全局代理。", "app.proxy.enable": "啟用全局代理", "app.proxy.enabled_edit_hint": "設定會在點擊「套用設定」後生效,不會在輸入過程中反覆寫入。", @@ -2611,7 +2611,7 @@ "app.proxy.preset.http_local": "HTTP 8080", "app.proxy.preset.socks5_local": "SOCKS5 1080", "app.proxy.reset": "重置", - "app.proxy.scope_hint": "* 作用于更新檢查、驅動管理网络请求、GitHub 資產下載,以及未单独設定代理的資料库連線", + "app.proxy.scope_hint": "* 作用於更新檢查、驅動管理網路請求與 GitHub 資產下載;不影響資料庫連線", "app.proxy.section_title": "全局代理", "app.proxy.status.disabled": "未啟用", "app.proxy.status.disabled_description": "更新檢查、驅動下載等公共網路請求將直接連線或使用系統代理。",