feat(settings): add setting for Reality scan candidates (#6471)

* feat(settings): allow customizing Reality scan candidate list

Persist a realityScanCandidates panel setting (defaulting to the previous
hardcoded list), expose it in General Settings with i18n, and have the
Find Targets scanner use it when the search box is empty.

Fixes #5847

* style(frontend): oxfmt realityScanCandidates in setting.ts

* Fix locale JSON syntax

This change removes the malformed duplicate key and missing comma in the Android per-app proxy translations across the bundled locale files. The JSON now parses correctly while preserving the translated labels for each language.

* docs(i18n): update Happ translations

Localize the remaining Happ subscription settings strings across the translation files and refine the English copy. This aligns the labels and descriptions with the current Happ behavior for notifications, TUN options, HWID enforcement, routing presets, and per-app proxy settings.

* refactor(reality): drop test-only scaffolding from the candidate setting

TestDefaultRealityScanCandidatesCSV compared the CSV against its own
initializer and a defaultValueMap lookup, and
TestRealityScanCandidateTokensFallsBackWithoutDB drove a no-database
state no production caller reaches (the only caller is the
scanRealityTargets handler, served after InitDB). The
s != nil && GetDB() != nil guard existed only for that second test.
None of them could fail except in lockstep with the code they restate.

* docs(api): describe the setting-driven scanRealityTargets fallback

An empty targets value now probes the realityScanCandidates setting,
but the endpoint summary, parameter description and handler comment
still promised the built-in seed list, so API consumers were told the
wrong target set. Regenerated openapi.json and synced the docs copy,
which also lacked the new AllSetting field in the settings reference.

---------

Co-authored-by: mrchatam <287639636+mrchatam@users.noreply.github.com>
Co-authored-by: Sanaei <ho3ein.sanaei@gmail.com>
This commit is contained in:
mrchatam
2026-09-13 16:18:28 +03:30
committed by GitHub
parent bf7ce2daaa
commit 768bbd2a29
29 changed files with 857 additions and 735 deletions
+72 -70
View File
@@ -1253,6 +1253,8 @@
"noisesSett": "Configuración de Sonidos",
"trustedProxyCidrs": "CIDR de proxy de confianza",
"trustedProxyCidrsDesc": "IP/CIDR separados por coma que pueden establecer las cabeceras de host, proto e IP del cliente reenviadas.",
"realityScanCandidates": "Candidatos de escaneo Reality",
"realityScanCandidatesDesc": "Lista de destinos host:port (o CIDR) separados por comas usada por defecto cuando Buscar objetivos se ejecuta con la búsqueda vacía. Personalízala con destinos que uses a menudo.",
"ldap": {
"enable": "Habilitar sincronización LDAP",
"host": "Host LDAP",
@@ -1496,56 +1498,56 @@
"subExpiredTemplateDesc": "Plantilla para el nodo ficticio cuando la suscripción ha expirado.",
"subTrafficDepletedTemplate": "Plantilla de tráfico agotado",
"subTrafficDepletedTemplateDesc": "Plantilla para el nodo ficticio cuando el límite de tráfico se ha agotado.",
"subHappAutoDetect": "Happ Header Auto-Detection",
"subHappAutoDetectDesc": "Automatically inject Happ routing and headers when client User-Agent indicates Happ.",
"subHappProviderId": "Provider ID",
"subHappProviderIdDesc": "Unique provider identifier for Happ client management, remote configuration binding, and migration.",
"subHappNewUrl": "New Subscription URL",
"subHappNewUrlDesc": "Target URL for automatic client migration. When set, Happ clients will migrate to this subscription link.",
"subHappFallbackUrl": "Fallback Subscription URL",
"subHappFallbackUrlDesc": "Backup subscription address used by Happ if the primary subscription URL becomes unreachable.",
"subHappSubInfoText": "Banner Announcement Text",
"subHappSubInfoTextDesc": "Custom announcement banner displayed at the top of the Happ client (max 200 characters).",
"subHappSubInfoColor": "Banner Accent Color",
"subHappSubInfoColorDesc": "Color theme style for the announcement banner.",
"subHappSubInfoButtonText": "Banner Button Text",
"subHappSubInfoButtonTextDesc": "Button label displayed inside the announcement banner (max 25 characters).",
"subHappSubInfoButtonLink": "Banner Button Link",
"subHappSubInfoButtonLinkDesc": "Target URL opened when the user clicks the banner action button.",
"subHappSubExpire": "Expired Subscription Banner",
"subHappSubExpireDesc": "Show an expired subscription banner in Happ when the user's traffic or validity has ended.",
"subHappSubExpireButtonLink": "Renewal Link",
"subHappSubExpireButtonLinkDesc": "Target URL opened when the user clicks the renewal button on an expired subscription.",
"subHappNotificationExpire": "Expiration Notifications",
"subHappNotificationExpireDesc": "Instruct Happ to alert the user in advance before their subscription expires.",
"subHappNoLimit": "Bypass Rule Limit",
"subHappNoLimitDesc": "Allow routing rule count to exceed default mobile platform limits without truncation.",
"subHappAlwaysHwid": "Enforce Hardware ID (HWID)",
"subHappAlwaysHwidDesc": "Bind subscription sessions to client device hardware identifier for enhanced security.",
"subHappTunMode": "TUN Mode",
"subHappTunModeDesc": "TUN virtual network interface routing mode: default, system, or strict.",
"subHappTunType": "TUN Engine",
"subHappTunTypeDesc": "Underlying network stack implementation for TUN: system, gVisor, or mixed.",
"subHappExcludeRoutes": "Exclude CIDR Routes",
"subHappExcludeRoutesDesc": "Comma-separated IP CIDRs (e.g. 192.168.0.0/16, 10.0.0.0/8) to bypass the VPN tunnel.",
"subHappExcludeApns": "Exclude Apple APNs",
"subHappExcludeApnsDesc": "Bypass Apple Push Notification services to maintain reliable background notifications on iOS.",
"subHappColorProfile": "Client Color Theme",
"subHappColorProfileDesc": "Client color theme profile: default, violet, turquoise, cyberpunk, or custom JSON theme.",
"subHappPingType": "Latency Ping Method",
"subHappPingTypeDesc": "Measurement protocol used by Happ for node latency testing: icmp, tcp, or http.",
"subHappAutoConnect": "Auto-Connect on Launch",
"subHappAutoConnectDesc": "Instruct Happ to automatically connect to VPN when the application starts.",
"subHappAutoConnectType": "Auto-Connect Target",
"subHappAutoConnectTypeDesc": "Connection target strategy for auto-connect: fastest node or last used node.",
"subHappPerAppMode": "Android Per-App Proxy Mode",
"subHappPerAppModeDesc": "Control Android application routing: off, include (proxy only listed apps), or exclude (bypass listed apps).",
"subHappPerAppList": "Android Package Names",
"subHappPerAppListDesc": "Comma-separated package names of Android applications to include or exclude (e.g. com.telegram.messenger).",
"subHappPresetIran": "Iran Bypass",
"subHappPresetChina": "China Direct",
"subHappAutoDetect": "Detección automática de cabeceras de Happ",
"subHappAutoDetectDesc": "Inyectar automáticamente el enrutamiento y las cabeceras de Happ cuando el User-Agent del cliente indica Happ.",
"subHappProviderId": "ID del proveedor (Provider ID)",
"subHappProviderIdDesc": "Identificador único del proveedor para la gestión de clientes de Happ, la vinculación de la configuración remota y la migración.",
"subHappNewUrl": "Nueva URL de suscripción",
"subHappNewUrlDesc": "URL de destino para la migración automática de clientes. Si se establece, los clientes de Happ migrarán a este enlace de suscripción.",
"subHappFallbackUrl": "URL de suscripción de respaldo",
"subHappFallbackUrlDesc": "Dirección de suscripción de respaldo que usa Happ si la URL de suscripción principal deja de estar accesible.",
"subHappSubInfoText": "Texto del banner de anuncio",
"subHappSubInfoTextDesc": "Banner de anuncio personalizado que se muestra en la parte superior del cliente Happ (máx. 200 caracteres).",
"subHappSubInfoColor": "Color de énfasis del banner",
"subHappSubInfoColorDesc": "Estilo de color del banner de anuncio.",
"subHappSubInfoButtonText": "Texto del botón del banner",
"subHappSubInfoButtonTextDesc": "Etiqueta del botón que se muestra dentro del banner de anuncio (máx. 25 caracteres).",
"subHappSubInfoButtonLink": "Enlace del botón del banner",
"subHappSubInfoButtonLinkDesc": "URL de destino que se abre cuando el usuario hace clic en el botón de acción del banner.",
"subHappSubExpire": "Banner de suscripción caducada",
"subHappSubExpireDesc": "Mostrar un banner de suscripción caducada en Happ cuando se agote el tráfico o termine la validez del usuario.",
"subHappSubExpireButtonLink": "Enlace de renovación",
"subHappSubExpireButtonLinkDesc": "URL de destino que se abre cuando el usuario hace clic en el botón de renovación de una suscripción caducada.",
"subHappNotificationExpire": "Notificaciones de caducidad",
"subHappNotificationExpireDesc": "Indicar a Happ que avise al usuario 3 días antes de que caduque su suscripción.",
"subHappNoLimit": "Modo sin límite",
"subHappNoLimitDesc": "Aumentar el límite de RAM de xray-core en Happ para mejorar la estabilidad y el rendimiento (beta).",
"subHappAlwaysHwid": "Forzar ID de hardware (HWID)",
"subHappAlwaysHwidDesc": "Impedir que los usuarios desactiven el envío del HWID en la configuración de Happ.",
"subHappTunMode": "Modo TUN",
"subHappTunModeDesc": "Pila de red que usa TUN en escritorio: sistema (pila del SO) o gVisor (pila de espacio de usuario).",
"subHappTunType": "Motor TUN",
"subHappTunTypeDesc": "Núcleo usado para la conexión TUN en escritorio: sing-box, tun2proxy, predeterminado (Happ TUN) o Xray.",
"subHappExcludeRoutes": "Excluir rutas CIDR",
"subHappExcludeRoutesDesc": "CIDR de IP separados por comas (p. ej. 192.168.0.0/16, 10.0.0.0/8) que no pasan por el túnel VPN.",
"subHappExcludeApns": "Excluir APNs de Apple",
"subHappExcludeApnsDesc": "Omitir los servicios de notificaciones push de Apple para mantener fiables las notificaciones en segundo plano en iOS.",
"subHappColorProfile": "Tema de color del cliente",
"subHappColorProfileDesc": "Tema de color personalizado para iOS como cadena JSON, o resetcolors para restaurar los colores predeterminados.",
"subHappPingType": "Método de ping de latencia",
"subHappPingTypeDesc": "Cómo mide Happ la latencia de los nodos: vía proxy (GET o HEAD), TCP o ICMP.",
"subHappAutoConnect": "Conexión automática al iniciar",
"subHappAutoConnectDesc": "Indicar a Happ que se conecte automáticamente a la VPN al iniciarse la aplicación.",
"subHappAutoConnectType": "Destino de la conexión automática",
"subHappAutoConnectTypeDesc": "Servidor elegido para la conexión automática: menor latencia, último utilizado o un nodo aleatorio.",
"subHappPerAppMode": "Modo de proxy por aplicación en Android",
"subHappPerAppModeDesc": "Controlar el enrutamiento de aplicaciones Android: desactivado, activado (proxy solo para las apps de la lista) u omitir (excluir las apps de la lista).",
"subHappPerAppList": "Nombres de paquete de Android",
"subHappPerAppListDesc": "Nombres de paquete de aplicaciones Android separados por comas que se incluirán o excluirán (p. ej. org.telegram.messenger).",
"subHappPresetIran": "Irán: omitir proxy",
"subHappPresetChina": "China: conexión directa",
"subHappPresetAdblock": "AdBlock",
"subHappPresetGlobal": "Full Proxy",
"subHappPresetGlobal": "Todo por proxy",
"subHappPresetOff": "Desactivar enrutamiento (happ://routing/off)",
"subHappColorBlue": "Azul (estándar / predeterminado)",
"subHappColorGreen": "Verde (éxito)",
@@ -1565,29 +1567,29 @@
"subHappAutoConnectLastUsed": "Último nodo utilizado",
"subHappAutoConnectRandom": "Nodo aleatorio",
"subHappPerAppOff": "Desactivado",
"subHappPerAppOn": "Activado (solo apps de la lista)",
"subHappPerAppOn": "Activado (proxy solo para apps de la lista)",
"subHappPerAppBypass": "Omitir (excluir apps de la lista)",
"subHappPresetApplied": "Happ preset applied to routing rules",
"subHappPresets": "Routing Presets",
"subHappPresetsDesc": "Pre-configured routing rule presets tailored for Happ clients.",
"subHappVisualBuilder": "Visual Rule Generator",
"subHappVisualBuilderDesc": "Create custom routing deeplink from domain and IP lists.",
"subHappBuildDeeplink": "Generate Deeplink",
"subHappModalTitle": "Happ Visual Routing Rule Generator",
"subHappDirectDomains": "Direct Domains (Bypass)",
"subHappProxyDomains": "Proxy Domains (Tunnel)",
"subHappBlockDomains": "Blocked Domains (Ad/Malware)",
"subHappDirectIPs": "Direct IPs / CIDRs",
"subHappProxyIPs": "Proxy IPs / CIDRs",
"subHappBlockIPs": "Blocked IPs / CIDRs",
"subHappDeeplinkGenerated": "Deeplink generated and applied to routing rules",
"subHappPresetApplied": "Preajuste de Happ aplicado a las reglas de enrutamiento",
"subHappPresets": "Preajustes de enrutamiento",
"subHappPresetsDesc": "Preajustes de reglas de enrutamiento preconfigurados para clientes Happ.",
"subHappVisualBuilder": "Generador visual de reglas",
"subHappVisualBuilderDesc": "Crear un deeplink de enrutamiento personalizado a partir de listas de dominios e IPs.",
"subHappBuildDeeplink": "Generar deeplink",
"subHappModalTitle": "Generador visual de reglas de enrutamiento de Happ",
"subHappDirectDomains": "Dominios directos (sin proxy)",
"subHappProxyDomains": "Dominios por proxy (túnel)",
"subHappBlockDomains": "Dominios bloqueados (publicidad/malware)",
"subHappDirectIPs": "IPs / CIDR directos",
"subHappProxyIPs": "IPs / CIDR por proxy",
"subHappBlockIPs": "IPs / CIDR bloqueados",
"subHappDeeplinkGenerated": "Deeplink generado y aplicado a las reglas de enrutamiento",
"subHappGroupLinks": "Enlaces de suscripción",
"subHappGroupRouting": "Routing & Rules",
"subHappGroupBanners": "Banners & Announcements",
"subHappGroupNetwork": "Network & TUN Engine",
"subHappGroupThemes": "Appearance & Theme",
"subHappGroupFailover": "Migration & App Management",
"subHappGroupAndroid": "Android Per-App Proxy",
"subHappGroupRouting": "Enrutamiento y reglas",
"subHappGroupBanners": "Banners y anuncios",
"subHappGroupNetwork": "Red y motor TUN",
"subHappGroupThemes": "Apariencia y tema",
"subHappGroupFailover": "Migración y gestión de la app",
"subHappGroupAndroid": "Proxy por aplicación en Android",
"discordSettings": "Bot de Discord",
"discordBotEnable": "Habilitar notificaciones de Discord",
"discordBotEnableDesc": "Enviar alertas del sistema y eventos a un canal de Discord a través del bot",