diff --git a/app/src/main/java/io/nekohasekai/sagernet/Constants.kt b/app/src/main/java/io/nekohasekai/sagernet/Constants.kt index bc2e4b2..d44293e 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/Constants.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/Constants.kt @@ -33,7 +33,7 @@ object Key { const val RESOLVE_DESTINATION = "resolveDestination" const val BYPASS_LAN = "bypassLan" - const val BYPASS_LAN_IN_CORE_ONLY = "bypassLanInCoreOnly" + const val BYPASS_LAN_IN_CORE = "bypassLanInCore" const val MIXED_PORT = "mixedPort" const val ALLOW_ACCESS = "allowAccess" diff --git a/app/src/main/java/io/nekohasekai/sagernet/bg/ServiceNotification.kt b/app/src/main/java/io/nekohasekai/sagernet/bg/ServiceNotification.kt index eddb573..37b66dd 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/bg/ServiceNotification.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/bg/ServiceNotification.kt @@ -42,13 +42,11 @@ class ServiceNotification( if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) PendingIntent.FLAG_IMMUTABLE else 0 } - val trafficStatistics = DataStore.profileTrafficStatistics val showDirectSpeed = DataStore.showDirectSpeed private val callback: ISagerNetServiceCallback by lazy { object : ISagerNetServiceCallback.Stub() { override fun cbSpeedUpdate(stats: SpeedDisplayData) { - if (!trafficStatistics) return builder.apply { if (showDirectSpeed) { val speedDetail = (service as Context).getString( @@ -180,7 +178,7 @@ class ServiceNotification( } private fun updateCallback(screenOn: Boolean) { - if (!trafficStatistics) return + if (DataStore.speedInterval == 0) return if (screenOn) { service.data.binder.registerCallback(callback) callbackRegistered = true diff --git a/app/src/main/java/io/nekohasekai/sagernet/bg/VpnService.kt b/app/src/main/java/io/nekohasekai/sagernet/bg/VpnService.kt index 2d4c0d3..f1205ec 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/bg/VpnService.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/bg/VpnService.kt @@ -109,7 +109,7 @@ class VpnService : BaseVpnService(), builder.addDnsServer(PRIVATE_VLAN4_ROUTER) // route - if (DataStore.bypassLan && !DataStore.bypassLanInCoreOnly) { + if (DataStore.bypassLan) { resources.getStringArray(R.array.bypass_private_route).forEach { val subnet = Subnet.fromString(it)!! builder.addRoute(subnet.address.hostAddress!!, subnet.prefixSize) @@ -142,7 +142,7 @@ class VpnService : BaseVpnService(), var bypass = DataStore.bypass var workaroundSYSTEM = false /* DataStore.tunImplementation == TunImplementation.SYSTEM */ var needBypassRootUid = workaroundSYSTEM || data.proxy!!.config.trafficMap.values.any { - it.nekoBean?.needBypassRootUid() == true || it.hysteriaBean?.protocol == HysteriaBean.PROTOCOL_FAKETCP + it[0].nekoBean?.needBypassRootUid() == true || it[0].hysteriaBean?.protocol == HysteriaBean.PROTOCOL_FAKETCP } if (proxyApps || needBypassRootUid) { diff --git a/app/src/main/java/io/nekohasekai/sagernet/bg/proto/ProxyInstance.kt b/app/src/main/java/io/nekohasekai/sagernet/bg/proto/ProxyInstance.kt index 9c930fd..de70f12 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/bg/proto/ProxyInstance.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/bg/proto/ProxyInstance.kt @@ -1,10 +1,12 @@ package io.nekohasekai.sagernet.bg.proto +import io.nekohasekai.sagernet.BuildConfig import io.nekohasekai.sagernet.bg.BaseService import io.nekohasekai.sagernet.database.ProxyEntity import io.nekohasekai.sagernet.ktx.Logs import io.nekohasekai.sagernet.ktx.runOnIoDispatcher import kotlinx.coroutines.runBlocking +import moe.matsuri.nb4a.utils.JavaUtil class ProxyInstance(profile: ProxyEntity, val service: BaseService.Interface) : BoxInstance(profile) { @@ -15,6 +17,7 @@ class ProxyInstance(profile: ProxyEntity, val service: BaseService.Interface) : override fun buildConfig() { super.buildConfig() Logs.d(config.config) + if (BuildConfig.DEBUG) Logs.d(JavaUtil.gson.toJson(config.trafficMap)) } override suspend fun init() { diff --git a/app/src/main/java/io/nekohasekai/sagernet/bg/proto/TrafficLooper.kt b/app/src/main/java/io/nekohasekai/sagernet/bg/proto/TrafficLooper.kt index e9623da..be4109d 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/bg/proto/TrafficLooper.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/bg/proto/TrafficLooper.kt @@ -16,22 +16,25 @@ class TrafficLooper ) { private var job: Job? = null - private val items = mutableMapOf() + private val items = mutableMapOf() suspend fun stop() { job?.cancel() - // finally + // finally traffic post + if (!DataStore.profileTrafficStatistics) return val traffic = mutableMapOf() - data.proxy?.config?.trafficMap?.forEach { (tag, ent) -> - val item = items[tag] ?: return@forEach - ent.rx = item.rx - ent.tx = item.tx - ProfileManager.updateProfile(ent) // update DB - traffic[ent.id] = TrafficData( - id = ent.id, - rx = ent.rx, - tx = ent.tx, - ) + data.proxy?.config?.trafficMap?.forEach { (_, ents) -> + for (ent in ents) { + val item = items[ent.id] ?: return@forEach + ent.rx = item.rx + ent.tx = item.tx + ProfileManager.updateProfile(ent) // update DB + traffic[ent.id] = TrafficData( + id = ent.id, + rx = ent.rx, + tx = ent.tx, + ) + } } data.binder.broadcast { b -> for (t in traffic) { @@ -64,31 +67,35 @@ class TrafficLooper if (!proxy.isInitialized()) continue items.clear() itemBypass = TrafficUpdater.TrafficLooperData(tag = "bypass") - items["bypass"] = itemBypass -// proxy.config.trafficMap.forEach { (tag, ent) -> - proxy.config.outboundTags.forEach { tag -> - // TODO g-xx query traffic return 0? - val ent = proxy.config.trafficMap[tag] ?: return@forEach - val item = TrafficUpdater.TrafficLooperData( - tag = tag, - rx = ent.rx, - tx = ent.tx, - ) - if (tag == proxy.config.outboundTagMain) { - itemMain = item - itemMainBase = TrafficUpdater.TrafficLooperData( + items[-1] = itemBypass + // + val tags = hashSetOf("bypass") + proxy.config.trafficMap.forEach { (tag, ents) -> + for (ent in ents) { + val item = TrafficUpdater.TrafficLooperData( tag = tag, rx = ent.rx, tx = ent.tx, ) + if (ent.id == proxy.config.mainEntId) { + itemMain = item + itemMainBase = TrafficUpdater.TrafficLooperData( + tag = tag, + rx = ent.rx, + tx = ent.tx, + ) + Logs.d("traffic count $tag to main") + } + items[ent.id] = item + tags.add(tag) + Logs.d("traffic count $tag to ${ent.id}") } - items[tag] = item - Logs.d("traffic count $tag to ${ent.id}") } + // trafficUpdater = TrafficUpdater( - box = proxy.box, items = items + box = proxy.box, items = items.values.toList() ) - proxy.box.setV2rayStats(items.keys.joinToString("\n")) + proxy.box.setV2rayStats(tags.joinToString("\n")) } trafficUpdater.updateAll() @@ -106,16 +113,20 @@ class TrafficLooper // traffic val traffic = mutableMapOf() - proxy.config.trafficMap.forEach { (tag, ent) -> - val item = items[tag] ?: return@forEach - ent.rx = item.rx - ent.tx = item.tx + if (DataStore.profileTrafficStatistics) { + proxy.config.trafficMap.forEach { (tag, ents) -> + for (ent in ents) { + val item = items[ent.id] ?: return@forEach + ent.rx = item.rx + ent.tx = item.tx // ProfileManager.updateProfile(ent) // update DB - traffic[ent.id] = TrafficData( - id = ent.id, - rx = ent.rx, - tx = ent.tx, - ) // display + traffic[ent.id] = TrafficData( + id = ent.id, + rx = ent.rx, + tx = ent.tx, + ) // display + } + } } // broadcast diff --git a/app/src/main/java/io/nekohasekai/sagernet/bg/proto/TrafficUpdater.kt b/app/src/main/java/io/nekohasekai/sagernet/bg/proto/TrafficUpdater.kt index b91810f..bcaeae2 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/bg/proto/TrafficUpdater.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/bg/proto/TrafficUpdater.kt @@ -4,10 +4,11 @@ import io.nekohasekai.sagernet.ktx.onIoDispatcher class TrafficUpdater( private val box: libcore.BoxInstance, - val items: Map, // contain "bypass" + val items: List, // contain "bypass" ) { class TrafficLooperData( + // Don't associate proxyEntity var tag: String, var tx: Long = 0, var rx: Long = 0, @@ -52,12 +53,12 @@ class TrafficUpdater( suspend fun updateAll() { val updated = mutableMapOf() // diffs - items.forEach { (tag, item) -> - var diff = updated[tag] + items.forEach { item -> + var diff = updated[item.tag] // query a tag only once if (diff == null) { diff = updateOne(item) - updated[tag] = diff + updated[item.tag] = diff } else { item.rx += diff.rx item.tx += diff.tx diff --git a/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt b/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt index 1ea66f6..45fa8e6 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt @@ -93,7 +93,7 @@ object DataStore : OnPreferenceDataStoreChangeListener { var mtu by configurationStore.stringToInt(Key.MTU) { 9000 } var bypassLan by configurationStore.boolean(Key.BYPASS_LAN) - var bypassLanInCoreOnly by configurationStore.boolean(Key.BYPASS_LAN_IN_CORE_ONLY) + var bypassLanInCore by configurationStore.boolean(Key.BYPASS_LAN_IN_CORE) var allowAccess by configurationStore.boolean(Key.ALLOW_ACCESS) var speedInterval by configurationStore.stringToInt(Key.SPEED_INTERVAL) diff --git a/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt b/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt index 0dbf390..f43b43f 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt @@ -51,16 +51,15 @@ const val LOCAL_DNS_SERVER = "underlying://0.0.0.0" class ConfigBuildResult( var config: String, var externalIndex: List, - var outboundTags: List, - var outboundTagMain: String, - var trafficMap: Map, + var mainEntId: Long, + var trafficMap: Map>, val alerts: List>, ) { data class IndexEntity(var chain: LinkedHashMap) } fun mergeJSON(j: String, to: MutableMap) { - if (j.isNullOrBlank()) return + if (j.isBlank()) return val m = gson.fromJson(j, to.javaClass) m.forEach { (k, v) -> if (v is Map<*, *> && to[k] is Map<*, *>) { @@ -83,19 +82,14 @@ fun buildConfig( return ConfigBuildResult( bean.config, listOf(), - listOf(TAG_PROXY), // - TAG_PROXY, // - mapOf( - TAG_PROXY to proxy - ), + proxy.id, // + mapOf(TAG_PROXY to listOf(proxy)), // listOf() ) } } - val outboundTags = ArrayList() - var outboundTagMain = TAG_BYPASS - val trafficMap = HashMap() + val trafficMap = HashMap>() val globalOutbounds = ArrayList() fun ProxyEntity.resolveChain(): MutableList { @@ -141,7 +135,7 @@ fun buildConfig( val resolveDestination = DataStore.resolveDestination val alerts = mutableListOf>() - var optionsToMerge: String = "" + var optionsToMerge = "" return MyOptions().apply { if (!forTest && DataStore.enableClashAPI) experimental = ExperimentalOptions().apply { @@ -254,7 +248,7 @@ fun buildConfig( // chainTagOut: v2ray outbound tag for this chain var chainTagOut = "" - var chainTag = "c-$chainId" + val chainTag = "c-$chainId" var muxApplied = false fun genDomainStrategy(noAsIs: Boolean): String { @@ -307,8 +301,6 @@ fun buildConfig( } else { // index == 0 means last profile in chain / not chain chainTagOut = tagOut - outboundTags.add(tagOut) - if (chainId == 0L) outboundTagMain = tagOut } if (needGlobal) { @@ -318,8 +310,10 @@ fun buildConfig( globalOutbounds.add(proxyEntity.id) } - // include g-xx - trafficMap[tagOut] = proxyEntity + // include g-xx & chain ent + val mapList = mutableListOf(proxyEntity) + if (index == 0 && profileList.size > 1) mapList.add(proxy) // chain ent + trafficMap[tagOut] = mapList // Chain outbound if (proxyEntity.needExternal()) { @@ -474,10 +468,26 @@ fun buildConfig( makeSingBoxRule(rule.ip.split("\n"), true) } if (rule.port.isNotBlank()) { - port = rule.port.split("\n").map { it.toIntOrNull() ?: 0 } + port = mutableListOf() + port_range = mutableListOf() + rule.port.split(",").map { + if (it.contains(":")) { + port_range.add(it) + } else { + it.toIntOrNull()?.apply { port.add(this) } + } + } } if (rule.sourcePort.isNotBlank()) { - source_port = rule.sourcePort.split("\n").map { it.toIntOrNull() ?: 0 } + source_port = mutableListOf() + source_port_range = mutableListOf() + rule.sourcePort.split(",").map { + if (it.contains(":")) { + source_port_range.add(it) + } else { + it.toIntOrNull()?.apply { source_port.add(this) } + } + } } if (rule.network.isNotBlank()) { network = rule.network @@ -656,15 +666,15 @@ fun buildConfig( } if (!forTest) { - route.rules.add(Rule_DefaultOptions().apply { + route.rules.add(0, Rule_DefaultOptions().apply { inbound = listOf(TAG_DNS_IN) outbound = TAG_DNS_OUT }) - route.rules.add(Rule_DefaultOptions().apply { + route.rules.add(0, Rule_DefaultOptions().apply { port = listOf(53) outbound = TAG_DNS_OUT }) // TODO new mode use system dns? - if (DataStore.bypassLan && DataStore.bypassLanInCoreOnly) { + if (DataStore.bypassLanInCore) { route.rules.add(Rule_DefaultOptions().apply { outbound = TAG_BYPASS geoip = listOf("private") @@ -700,8 +710,7 @@ fun buildConfig( mergeJSON(optionsToMerge, this) }), externalIndexMap, - outboundTags, - outboundTagMain, + proxy.id, trafficMap, alerts ) diff --git a/app/src/main/java/io/nekohasekai/sagernet/ui/AssetsActivity.kt b/app/src/main/java/io/nekohasekai/sagernet/ui/AssetsActivity.kt index be36096..21f22c6 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/ui/AssetsActivity.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/ui/AssetsActivity.kt @@ -103,7 +103,7 @@ class AssetsActivity : ThemedActivity() { .substringAfterLast('/') .substringAfter(':') - if (!fileName.endsWith(".dat")) { + if (!fileName.endsWith(".db")) { alert(getString(R.string.route_not_asset, fileName)).show() return@registerForActivityResult } diff --git a/app/src/main/java/io/nekohasekai/sagernet/ui/RouteFragment.kt b/app/src/main/java/io/nekohasekai/sagernet/ui/RouteFragment.kt index 6fce4b0..312a122 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/ui/RouteFragment.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/ui/RouteFragment.kt @@ -264,7 +264,7 @@ class RouteFragment : ToolbarFragment(R.layout.layout_route), Toolbar.OnMenuItem inner class DocumentHolder(binding: LayoutEmptyRouteBinding) : RecyclerView.ViewHolder(binding.root) { fun bind() { itemView.setOnClickListener { - it.context.launchCustomTab("https://sing-box.sagernet.org/configuration/route/rule/") + it.context.launchCustomTab("https://matsuridayo.github.io/nb4a-route/") } } } diff --git a/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt b/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt index d075438..19b80b2 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt @@ -22,7 +22,6 @@ import io.nekohasekai.sagernet.database.preference.EditTextPreferenceModifiers import io.nekohasekai.sagernet.ktx.* import io.nekohasekai.sagernet.utils.Theme import io.nekohasekai.sagernet.widget.AppListPreference -import libcore.Libcore import moe.matsuri.nb4a.Protocols import moe.matsuri.nb4a.ui.ColorPickerPreference import moe.matsuri.nb4a.ui.LongClickSwitchPreference @@ -39,7 +38,7 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { listView.layoutManager = FixedLinearLayoutManager(listView) } - val reloadListener = Preference.OnPreferenceChangeListener { _, _ -> + private val reloadListener = Preference.OnPreferenceChangeListener { _, _ -> needReload() true } @@ -50,7 +49,7 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { addPreferencesFromResource(R.xml.global_preferences) DataStore.routePackages = DataStore.nekoPlugins - nekoPlugins = findPreference(Key.NEKO_PLUGIN_MANAGED)!! + nekoPlugins = findPreference(Key.NEKO_PLUGIN_MANAGED)!! nekoPlugins.setOnPreferenceClickListener { // borrow from route app settings startActivity(Intent( @@ -80,7 +79,6 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { true } val mixedPort = findPreference(Key.MIXED_PORT)!! - val speedInterval = findPreference(Key.SPEED_INTERVAL)!! val serviceMode = findPreference(Key.SERVICE_MODE)!! val allowAccess = findPreference(Key.ALLOW_ACCESS)!! val appendHttpProxy = findPreference(Key.APPEND_HTTP_PROXY)!! @@ -96,14 +94,7 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { tcpKeepAliveInterval.isVisible = false val bypassLan = findPreference(Key.BYPASS_LAN)!! - val bypassLanInCoreOnly = findPreference(Key.BYPASS_LAN_IN_CORE_ONLY)!! - - bypassLanInCoreOnly.isEnabled = bypassLan.isChecked - bypassLan.setOnPreferenceChangeListener { _, newValue -> - bypassLanInCoreOnly.isEnabled = newValue as Boolean - needReload() - true - } + val bypassLanInCore = findPreference(Key.BYPASS_LAN_IN_CORE)!! val remoteDns = findPreference(Key.REMOTE_DNS)!! val directDns = findPreference(Key.DIRECT_DNS)!! @@ -192,9 +183,10 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { val profileTrafficStatistics = findPreference(Key.PROFILE_TRAFFIC_STATISTICS)!! - speedInterval.isEnabled = profileTrafficStatistics.isChecked - profileTrafficStatistics.setOnPreferenceChangeListener { _, newValue -> - speedInterval.isEnabled = newValue as Boolean + val speedInterval = findPreference(Key.SPEED_INTERVAL)!! + profileTrafficStatistics.isEnabled = speedInterval.value.toString() != "0" + speedInterval.setOnPreferenceChangeListener { _, newValue -> + profileTrafficStatistics.isEnabled = newValue.toString() != "0" needReload() true } @@ -209,7 +201,6 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { val acquireWakeLock = findPreference(Key.ACQUIRE_WAKE_LOCK)!! val enableClashAPI = findPreference(Key.ENABLE_CLASH_API)!! - speedInterval.onPreferenceChangeListener = reloadListener mixedPort.onPreferenceChangeListener = reloadListener appendHttpProxy.onPreferenceChangeListener = reloadListener showDirectSpeed.onPreferenceChangeListener = reloadListener @@ -217,7 +208,8 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { trafficSniffing.onPreferenceChangeListener = reloadListener muxConcurrency.onPreferenceChangeListener = reloadListener tcpKeepAliveInterval.onPreferenceChangeListener = reloadListener - bypassLanInCoreOnly.onPreferenceChangeListener = reloadListener + bypassLan.onPreferenceChangeListener = reloadListener + bypassLanInCore.onPreferenceChangeListener = reloadListener mtu.onPreferenceChangeListener = reloadListener enableFakeDns.onPreferenceChangeListener = reloadListener diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 125f1e5..19271f8 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -220,7 +220,7 @@ استراتيجية حل المجال إعلانات كتلة جانبا LAN - ليس ملف أصل: استثناء .dat، لكن %s + ليس ملف أصل: استثناء .db، لكن %s أقصى سرعة تنزيل (بالميجابت في الثانية) أقصى سرعة تحميل (بالميجابت في الثانية) حمولة المصادقة diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 691562c..a432150 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -154,7 +154,7 @@ Versión local: %s Sin actualización Actualizado - No es un archivo de activos: excepto .dat, pero %s + No es un archivo de activos: excepto .db, pero %s Omitir LAN Bloquear anuncios Bloquear analítica diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index e255599..e5a7c65 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -152,7 +152,7 @@ نسخه محلی: %s بدون آپدیت به روز رسانی - نه یک فایل پشتیبان: به جز .dat، اما %s + نه یک فایل پشتیبان: به جز .db، اما %s دور زدن LAN مسدود کردن تبلیغات بلاک کردن انالیز ها diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index fa0a231..554d673 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -181,7 +181,7 @@ Mux dirancang untuk mengurangi latensi handshake TCP, bukan untuk meningkatkan throughput koneksi. Menggunakan Mux untuk menonton video, mengunduh, atau uji kecepatan biasanya kontra produktif Strategi Resolusi Domain Lewati LAN - Bukan file aset: kecuali .dat, tapi %s + Bukan file aset: kecuali .db, tapi %s Penyedia Aset Aturan Pengalihan Terbalik Aturan domain untuk %s diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 21bde2b..acd2bc1 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -237,7 +237,7 @@ Domeneløsningsstrategi Blokker annonser Omgå LAN - Ikke en ressursfil: unntatt .dat, men %s + Ikke en ressursfil: unntatt .db, men %s Oppdatert Ingen oppdatering Lokal versjon: %s diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 6994806..ac80ffe 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -296,7 +296,7 @@ Стратегия разрешения доменов Блокировать рекламу Обход LAN - Не файл ресурса: ожидался .dat, а не %s + Не файл ресурса: ожидался .db, а не %s Обновлено Обновлений нет Локальная версия: %s diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 03e7c12..0520d78 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -369,7 +369,7 @@ Alternatif ID Şaşırtmaca TCP aktif paket teslim koruma aralığı - Varlık dosyası değil: .dat beklendi ama %s + Varlık dosyası değil: .db beklendi ama %s Rota Varlıkları Sağlayıcısı Varlıklar Rota Varlıklarını Yönet diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 27e26a9..3151cd0 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -262,7 +262,7 @@ %d 行 优先 - 不是资源文件: 预期 .dat 为扩展名, 但 %s + 不是资源文件: 预期 .db 为扩展名, 但 %s 已为最新 已更新 本地版本: %s diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 11040e5..94c7170 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -234,7 +234,7 @@ 本地版本:%s 無更新 已更新 - 非資源檔案:預期副檔名為 .dat,但 %s + 非資源檔案:預期副檔名為 .db,但 %s 略過區域網路位址 封鎖廣告 網域解析策略 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9c56271..1e22758 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -157,7 +157,7 @@ Local version: %s No update Updated - Not an asset file: excepted .dat, but %s + Not an asset file: excepted .db, but %s Bypass LAN Block ADs Block analysis @@ -331,7 +331,6 @@ Append HTTP Proxy to VPN HTTP proxy will be used directly from (browser/ some supported apps), without going through the virtual NIC device (Android 10+) Bypass LAN in Core Only - If Lineage\'s "Allow hotspot clients to use VPNs" does not work, try this. Protocol Settings Trojan Provider Basic diff --git a/app/src/main/res/xml/global_preferences.xml b/app/src/main/res/xml/global_preferences.xml index 3027511..38d279a 100644 --- a/app/src/main/res/xml/global_preferences.xml +++ b/app/src/main/res/xml/global_preferences.xml @@ -89,8 +89,7 @@ app:key="bypassLan" app:title="@string/route_opt_bypass_lan" />