diff --git a/V2rayNG/app/build.gradle b/V2rayNG/app/build.gradle index 66f515d87..00cc729b8 100644 --- a/V2rayNG/app/build.gradle +++ b/V2rayNG/app/build.gradle @@ -17,8 +17,8 @@ android { minSdkVersion 21 targetSdkVersion Integer.parseInt("$targetSdkVer") multiDexEnabled true - versionCode 519 - versionName "1.8.7" + versionCode 523 + versionName "1.8.9" } buildTypes { diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AppConfig.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AppConfig.kt index fbefd94b0..8a3be9e05 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AppConfig.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AppConfig.kt @@ -40,6 +40,9 @@ object AppConfig { const val PREF_BYPASS_APPS = "pref_bypass_apps" const val PREF_CONFIRM_REMOVE = "pref_confirm_remove" const val PREF_START_SCAN_IMMEDIATE = "pref_start_scan_immediate" + const val PREF_MUX_ENABLED = "pref_mux_enabled" + const val PREF_MUX_XUDP_CONCURRENCY = "pref_mux_xudp_concurency" + const val PREF_MUX_XUDP_QUIC = "pref_mux_xudp_quic" const val HTTP_PROTOCOL: String = "http://" const val HTTPS_PROTOCOL: String = "https://" diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt index cc46410a6..a97ee0120 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt @@ -292,7 +292,10 @@ data class V2rayConfig( } } - data class MuxBean(var enabled: Boolean, var concurrency: Int = 8) + data class MuxBean(var enabled: Boolean, + var concurrency: Int = 8, + var xudpConcurrency: Int = 8, + var xudpProxyUDP443: String = "",) fun getServerAddress(): String? { if (protocol.equals(EConfigType.VMESS.name, true) diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/BaseActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/BaseActivity.kt index 65a211f40..d079eb2f7 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/BaseActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/BaseActivity.kt @@ -2,13 +2,25 @@ package com.v2ray.ang.ui import android.content.Context import android.os.Build +import android.os.Bundle import android.view.MenuItem import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.WindowCompat import com.v2ray.ang.util.MyContextWrapper import com.v2ray.ang.util.Utils abstract class BaseActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + if (!Utils.getDarkModeStatus(this)) { + WindowCompat.getInsetsController(window, window.decorView).apply { + isAppearanceLightStatusBars = true + } + } + } + override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { android.R.id.home -> { onBackPressed() diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt index 08d764909..06bc3e900 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt @@ -25,13 +25,12 @@ class LogcatActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = ActivityLogcatBinding.inflate(layoutInflater) - val view = binding.root - setContentView(view) + binding = ActivityLogcatBinding.inflate(layoutInflater) + val view = binding.root + setContentView(view) title = getString(R.string.title_logcat) - supportActionBar?.setDisplayHomeAsUpEnabled(true) logcat(false) } diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt index adb6c50b4..4151a3e1d 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt @@ -25,7 +25,6 @@ import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.appcompat.app.AlertDialog -import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.tencent.mmkv.MMKV import com.v2ray.ang.AppConfig.ANG_PACKAGE @@ -66,11 +65,6 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList setContentView(view) title = getString(R.string.title_server) setSupportActionBar(binding.toolbar) - if (!Utils.getDarkModeStatus(this)) { - WindowCompat.getInsetsController(window, window.decorView).apply { - isAppearanceLightStatusBars = true - } - } binding.fab.setOnClickListener { if (mainViewModel.isRunning.value == true) { diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt index eabed93df..d6b217e4e 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt @@ -41,8 +41,6 @@ class PerAppProxyActivity : BaseActivity() { val view = binding.root setContentView(view) - supportActionBar?.setDisplayHomeAsUpEnabled(true) - val dividerItemDecoration = DividerItemDecoration(this, LinearLayoutManager.VERTICAL) binding.recyclerView.addItemDecoration(dividerItemDecoration) diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsActivity.kt index 030e80ff1..194c397eb 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsActivity.kt @@ -21,7 +21,6 @@ class RoutingSettingsActivity : BaseActivity() { setContentView(view) title = getString(R.string.title_pref_routing_custom) - supportActionBar?.setDisplayHomeAsUpEnabled(true) val fragments = ArrayList() fragments.add(RoutingSettingsFragment().newInstance(AppConfig.PREF_V2RAY_ROUTING_AGENT)) diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt index 33b7f685e..086c39f28 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt @@ -31,16 +31,6 @@ class ScannerActivity : BaseActivity(){ if (settingsStorage?.decodeBool(AppConfig.PREF_START_SCAN_IMMEDIATE) == true) { launchScan() } - - supportActionBar?.setDisplayHomeAsUpEnabled(true) - } - - public override fun onResume() { - super.onResume() - } - - public override fun onPause() { - super.onPause() } private fun launchScan(){ diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt index 6ab4f3e1d..ddfa49859 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt @@ -175,7 +175,6 @@ class ServerActivity : BaseActivity() { } else { clearServer() } - supportActionBar?.setDisplayHomeAsUpEnabled(true) } /** @@ -305,7 +304,11 @@ class ServerActivity : BaseActivity() { } val config = MmkvManager.decodeServerConfig(editGuid) ?: ServerConfig.create(createConfigType) if (config.configType != EConfigType.SOCKS && TextUtils.isEmpty(et_id.text.toString())) { - toast(R.string.server_lab_id) + if (config.configType == EConfigType.TROJAN || config.configType == EConfigType.SHADOWSOCKS) { + toast(R.string.server_lab_id3) + }else{ + toast(R.string.server_lab_id) + } return false } sp_stream_security?.let { diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerCustomConfigActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerCustomConfigActivity.kt index fabdccae9..4cef6eda8 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerCustomConfigActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerCustomConfigActivity.kt @@ -49,7 +49,6 @@ class ServerCustomConfigActivity : BaseActivity() { } else { clearServer() } - supportActionBar?.setDisplayHomeAsUpEnabled(true) } /** diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt index c6da160ca..e2420ce3f 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt @@ -31,8 +31,6 @@ class SettingsActivity : BaseActivity() { title = getString(R.string.title_settings) - supportActionBar?.setDisplayHomeAsUpEnabled(true) - settingsViewModel.startListenPreferenceChange() } @@ -42,6 +40,11 @@ class SettingsActivity : BaseActivity() { private val fakeDns by lazy { findPreference(AppConfig.PREF_FAKE_DNS_ENABLED) } private val localDnsPort by lazy { findPreference(AppConfig.PREF_LOCAL_DNS_PORT) } private val vpnDns by lazy { findPreference(AppConfig.PREF_VPN_DNS) } + + private val mux by lazy { findPreference(AppConfig.PREF_MUX_ENABLED) } + private val muxXudpConcurrency by lazy { findPreference(AppConfig.PREF_MUX_XUDP_CONCURRENCY) } + private val muxXudpQuic by lazy { findPreference(AppConfig.PREF_MUX_XUDP_QUIC) } + // val autoRestart by lazy { findPreference(PREF_AUTO_RESTART) as CheckBoxPreference } private val remoteDns by lazy { findPreference(AppConfig.PREF_REMOTE_DNS) } @@ -154,6 +157,14 @@ class SettingsActivity : BaseActivity() { } mode?.dialogLayoutResource = R.layout.preference_with_help_link //loglevel.summary = "LogLevel" + mux?.setOnPreferenceChangeListener { _, newValue -> + updateMux(newValue as Boolean) + true + } + muxXudpConcurrency?.setOnPreferenceChangeListener { _, newValue -> + updateMuxConcurrency(newValue as String) + true + } } override fun onStart() { @@ -162,21 +173,14 @@ class SettingsActivity : BaseActivity() { PreferenceManager.getDefaultSharedPreferences(requireActivity()) updateMode(defaultSharedPreferences.getString(AppConfig.PREF_MODE, "VPN")) var remoteDnsString = defaultSharedPreferences.getString(AppConfig.PREF_REMOTE_DNS, "") - domesticDns?.summary = - defaultSharedPreferences.getString(AppConfig.PREF_DOMESTIC_DNS, "") - localDnsPort?.summary = defaultSharedPreferences.getString( - AppConfig.PREF_LOCAL_DNS_PORT, - AppConfig.PORT_LOCAL_DNS - ) - socksPort?.summary = - defaultSharedPreferences.getString(AppConfig.PREF_SOCKS_PORT, AppConfig.PORT_SOCKS) - httpPort?.summary = - defaultSharedPreferences.getString(AppConfig.PREF_HTTP_PORT, AppConfig.PORT_HTTP) - autoUpdateInterval?.summary = defaultSharedPreferences.getString( - AppConfig.SUBSCRIPTION_AUTO_UPDATE_INTERVAL, - AppConfig.DEFAULT_UPDATE_INTERVAL - ) + domesticDns?.summary = defaultSharedPreferences.getString(AppConfig.PREF_DOMESTIC_DNS, "") + localDnsPort?.summary = defaultSharedPreferences.getString(AppConfig.PREF_LOCAL_DNS_PORT, AppConfig.PORT_LOCAL_DNS) + socksPort?.summary = defaultSharedPreferences.getString(AppConfig.PREF_SOCKS_PORT, AppConfig.PORT_SOCKS) + httpPort?.summary = defaultSharedPreferences.getString(AppConfig.PREF_HTTP_PORT, AppConfig.PORT_HTTP) + updateMux(defaultSharedPreferences.getBoolean(AppConfig.PREF_MUX_ENABLED, false)) + muxXudpConcurrency?.summary = defaultSharedPreferences.getString(AppConfig.PREF_MUX_XUDP_CONCURRENCY, "8") + autoUpdateInterval?.summary = defaultSharedPreferences.getString(AppConfig.SUBSCRIPTION_AUTO_UPDATE_INTERVAL,AppConfig.DEFAULT_UPDATE_INTERVAL) if (TextUtils.isEmpty(remoteDnsString)) { remoteDnsString = AppConfig.DNS_AGENT @@ -252,6 +256,24 @@ class SettingsActivity : BaseActivity() { private fun cancelUpdateTask() { val rw = RemoteWorkManager.getInstance(AngApplication.application) rw.cancelUniqueWork(AppConfig.UPDATE_TASK_NAME) + + private fun updateMux(enabled: Boolean) { + val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity()) + muxXudpConcurrency?.isEnabled = enabled + muxXudpQuic?.isEnabled = enabled + if (enabled) { + updateMuxConcurrency(defaultSharedPreferences.getString(AppConfig.PREF_MUX_XUDP_CONCURRENCY, "8")) + } + } + + private fun updateMuxConcurrency(value: String?) { + if (value == null) { + muxXudpQuic?.isEnabled = true + } else { + val concurrency = value.toIntOrNull() ?: 8 + muxXudpConcurrency?.summary = concurrency.toString() + muxXudpQuic?.isEnabled = concurrency >= 0 + } } } diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt index 699f8de1a..180b12004 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt @@ -44,7 +44,6 @@ class SubEditActivity : BaseActivity() { } else { clearServer() } - supportActionBar?.setDisplayHomeAsUpEnabled(true) } /** diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingActivity.kt index 853a3878c..469af3be1 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingActivity.kt @@ -27,8 +27,6 @@ class SubSettingActivity : BaseActivity() { binding.recyclerView.setHasFixedSize(true) binding.recyclerView.layoutManager = LinearLayoutManager(this) binding.recyclerView.adapter = adapter - - supportActionBar?.setDisplayHomeAsUpEnabled(true) } override fun onResume() { diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt index 7c1e3c18c..edc4e10ef 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt @@ -49,7 +49,6 @@ class UserAssetActivity : BaseActivity() { val view = binding.root setContentView(view) title = getString(R.string.title_user_asset_setting) - supportActionBar?.setDisplayHomeAsUpEnabled(true) binding.recyclerView.setHasFixedSize(true) binding.recyclerView.layoutManager = LinearLayoutManager(this) diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/V2rayConfigUtil.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/V2rayConfigUtil.kt index a16027b0b..b8cf2f541 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/V2rayConfigUtil.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/V2rayConfigUtil.kt @@ -64,7 +64,7 @@ object V2rayConfigUtil { inbounds(v2rayConfig) - httpRequestObject(outbound) + updateOutboundWithGlobalSettings(outbound) v2rayConfig.outbounds[0] = outbound @@ -399,8 +399,17 @@ object V2rayConfigUtil { return true } - private fun httpRequestObject(outbound: V2rayConfig.OutboundBean): Boolean { + private fun updateOutboundWithGlobalSettings(outbound: V2rayConfig.OutboundBean): Boolean { try { + if (settingsStorage?.decodeBool(AppConfig.PREF_MUX_ENABLED) == true) { + outbound.mux?.enabled = true + outbound.mux?.concurrency = 8 + outbound.mux?.xudpConcurrency = settingsStorage?.decodeInt(AppConfig.PREF_MUX_XUDP_CONCURRENCY) ?: 8 + outbound.mux?.xudpProxyUDP443 = settingsStorage?.decodeString(AppConfig.PREF_MUX_XUDP_QUIC) ?: "reject" + } else { + outbound.mux?.enabled = false + } + if (outbound.streamSettings?.network == DEFAULT_NETWORK && outbound.streamSettings?.tcpSettings?.header?.type == HTTP) { val path = outbound.streamSettings?.tcpSettings?.header?.request?.path diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/SettingsViewModel.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/SettingsViewModel.kt index d2c7e9138..0d34c0bb3 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/SettingsViewModel.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/SettingsViewModel.kt @@ -39,7 +39,8 @@ class SettingsViewModel(application: Application) : AndroidViewModel(application AppConfig.PREF_ROUTING_MODE, AppConfig.PREF_V2RAY_ROUTING_AGENT, AppConfig.PREF_V2RAY_ROUTING_BLOCKED, - AppConfig.PREF_V2RAY_ROUTING_DIRECT, -> { + AppConfig.PREF_V2RAY_ROUTING_DIRECT, + AppConfig.PREF_MUX_XUDP_QUIC, -> { settingsStorage?.encode(key, sharedPreferences.getString(key, "")) } AppConfig.PREF_SPEED_ENABLED, @@ -51,12 +52,16 @@ class SettingsViewModel(application: Application) : AndroidViewModel(application AppConfig.PREF_PER_APP_PROXY, AppConfig.PREF_BYPASS_APPS, AppConfig.PREF_CONFIRM_REMOVE, - AppConfig.PREF_START_SCAN_IMMEDIATE, -> { + AppConfig.PREF_START_SCAN_IMMEDIATE, + AppConfig.PREF_MUX_ENABLED, -> { settingsStorage?.encode(key, sharedPreferences.getBoolean(key, false)) } AppConfig.PREF_SNIFFING_ENABLED -> { settingsStorage?.encode(key, sharedPreferences.getBoolean(key, true)) } + AppConfig.PREF_MUX_XUDP_CONCURRENCY -> { + settingsStorage?.encode(key, sharedPreferences.getString(key, "8")?.toIntOrNull() ?: 8) + } AppConfig.PREF_PER_APP_PROXY_SET -> { settingsStorage?.encode(key, sharedPreferences.getStringSet(key, setOf())) } diff --git a/V2rayNG/app/src/main/res/values-ar/strings.xml b/V2rayNG/app/src/main/res/values-ar/strings.xml index 427e5b4d9..e4473a131 100644 --- a/V2rayNG/app/src/main/res/values-ar/strings.xml +++ b/V2rayNG/app/src/main/res/values-ar/strings.xml @@ -97,7 +97,14 @@ وكيل لكل تطبيق عام: التطبيق المحدد هو الوكيل، الاتصال غير المحدد مباشر؛ \nوضع التجاوز: التطبيق المحدد متصل مباشرة، الوكيل غير المحدد. \nالخيار لتحديد التطبيق الوكيل تلقائيا في القائمة تمكين Mux - التمكين قد يسرع الشبكة والتبديل بين الشبكات قد يكون فلاش + حركة مرور TCP مع 8 اتصالات افتراضية، قم بتخصيص كيفية التعامل مع UDP وQUIC أدناهn\أسرع، لكنه قد يسبب اتصالاً غير مستقر + اتصالات XUDP (النطاق من -1 إلى 1024) + التعامل مع QUIC في نفق مكس + + يرفض + مسموح + يتخطى + تمكين عرض السرعة عرض السرعة الحالية في الإشعار.\nسيتغير رمز الإشعار استنادًا إلى الاستخدام. تمكين Sniffing @@ -147,19 +154,19 @@ نسخ مسح إعادة تشغيل الخدمة - حذف كل التكوين - حذف التكوين المكرر - حذف التكوين غير الصالح (اختبر أولا) + حذف الكل (قبل أول خطوة) + حذف المكررات (2) + حذف العناوين العاطلة (بعد الاختبار؛ 4) تصدير التكوينات غير المخصصة إلى الحافظة إعدادات مجموعة الاشتراك ملاحظات URL اختياري تمكين التحديث - تحديث الاشتراك + تحديث الاشتراك (1) Tcping كل التكوين - تأخير الحقيقي لكل التكوين + اختبر كل العناوين (3) ملفات الأصول الجغرافية - الترتيب بناءً على نتائج الاختبار + ترتيب العناوين حسب نتائج الاختبار (5) تصفية ملف التكوين جميع مجموعات الاشتراك حذف %d من التكوينات المكررة @@ -192,9 +199,9 @@ تصدير إلى الحافظة - URL الوكيل أو IP - URL المباشر أو IP - URL المحظور أو IP + مسار وكيل أو IP + مسار مباشر أو IP + مسار محظور أو IP وكيل عالمي diff --git a/V2rayNG/app/src/main/res/values-fa/strings.xml b/V2rayNG/app/src/main/res/values-fa/strings.xml index a0be571f8..5b1331a8e 100644 --- a/V2rayNG/app/src/main/res/values-fa/strings.xml +++ b/V2rayNG/app/src/main/res/values-fa/strings.xml @@ -98,7 +98,14 @@ عمومی: برنامه بررسی شده پروکسی است، اتصال مستقیم بدون بررسی است. \nحالت bypass: برنامه بررسی شده مستقیما متصل است، پراکسی بررسی نشده است. \nگزینه‌ای برای انتخاب خودکار پروکسی برنامه در منو است فعال کردن Mux - فعال کردن شاید سرعت بخشیدن به شبکه و تغییر شبکه شاید فلش، بهبود کند + سریعتر است، اما ممکن است باعث اتصال ناپایدار شود\nمخزن ترافیک TCP با 8 اتصال پیش‌فرض، نحوه مدیریت UDP و QUIC را در زیر سفارشی کنید + اتصالات XUDP (محدوده -1 تا 1024) + مدیریت QUIC در تونل mux + + رد کردن + مجاز + جست و خیز کردن + فعال کردن نمایش سرعت نمایش سرعت فعلی در قسمت آگاه‌سازی. \nآیکون آگاه‌سازی بر اساس استفاده تغییر می‌کند. diff --git a/V2rayNG/app/src/main/res/values-ru/strings.xml b/V2rayNG/app/src/main/res/values-ru/strings.xml index 7592c6533..efc771cf5 100644 --- a/V2rayNG/app/src/main/res/values-ru/strings.xml +++ b/V2rayNG/app/src/main/res/values-ru/strings.xml @@ -103,7 +103,14 @@ Основной: выделенное приложение соединяется через прокси, не выделенное — напрямую; \n\nРежим обхода: выделенное приложение соединяется напрямую, не выделенное — через прокси.\n\nЕсть возможность автоматического выбора проксируемых приложений в меню. Использовать мультиплексирование - Включение может ускорить работу и переключение сети + Быстрее, но это может привести к нестабильному соединению\nМультиплексор TCP-трафика с 8 соединениями по умолчанию, ниже можно настроить обработку UDP и QUIC. + XUDP-соединения (диапазон от -1 до 1024) + Обработка QUIC в мультиплексорном туннеле + + отклонять + допустимый + пропускать + Отображение скорости Показывать текущую скорость в уведомлении.\nЗначок будет меняться в зависимости от использования. diff --git a/V2rayNG/app/src/main/res/values-vi/strings.xml b/V2rayNG/app/src/main/res/values-vi/strings.xml index 651848995..d2399c785 100644 --- a/V2rayNG/app/src/main/res/values-vi/strings.xml +++ b/V2rayNG/app/src/main/res/values-vi/strings.xml @@ -97,7 +97,15 @@ - Chung: Ứng dụng đã chọn sẽ kết nối Proxy, chưa lựa chọn sẽ kết nối trực tiếp. \n- Bỏ qua kết nối: Ứng dụng được chọn sẽ trực tiếp kết nối, không lựa chọn sẽ kết nối qua Proxy. \n- Lựa chọn để tự động chọn ứng dụng Proxy trong Menu. Cho phép Mux - Bật lên có thể làm tăng tốc độ mạng và chuyển mạng nhanh hơn. + Nhanh hơn nhưng có thể khiến kết nối không ổn định\nMux lưu lượng TCP với 8 kết nối mặc định, tùy chỉnh cách xử lý UDP và QUIC bên dưới + Kết nối XUDP (phạm vi -1 đến 1024) + Xử lý QUIC trong đường hầm mux + + từ chối + cho phép + nhảy + + Cho phép hiển thị tốc độ mạng Hiển thị tốc độ mạng hiện tại trên thanh thông báo.\nBiểu tượng trên thanh trạng thái có thể thay đổi tùy vào mức sử dụng. diff --git a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml index c86b8a7c2..346ea0b6a 100644 --- a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml @@ -96,8 +96,15 @@ 分应用代理 常规:勾选的App被代理,未勾选的直连;\n绕行模式:勾选的App直连,未勾选的被代理.\n不明白者在菜单中选择自动选中需代理应用 - 启用Mux多路复用 - 开启可能会加速,关闭可能会减少断流 + 启用 Mux 多路复用 + 减低延时 但可能会断流\nTCP 默认复用 8 个子链接,UDP 及 QUIC 流量处理方式下方可选 + XUDP 复用子链接数(可填 -1 至 1024) + QUIC 流量处理方式 + + 不代理 + 多路复用 + 原生 + 启用速度显示 在通知中显示当前速度\n小图标显示流量的路由情况 diff --git a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml index 07296e201..d2ff9e90c 100644 --- a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml @@ -96,8 +96,15 @@ Proxy 個別應用程式 常規:勾選的 App 啟用 Proxy,未勾選的直接連線;\n繞行模式:勾選的 App 直接連線,未勾選的啟用 Proxy。\n可在選單中選擇自動選中需 Proxy 應用 - 啟用 Mux - 啟用或許會加快網路速度,切換或許會閃爍 + 啟用 Mux 多路復用 + 減低延時 但可能會斷流\nTCP 默認復用 8 個子鏈接,UDP 及 QUIC 流量處理方式下方可選 + XUDP 復用子鏈接數(可填 -1 至 1024) + QUIC 流量處理方式 + + 不代理 + 多路復用 + 原生 + 啟用速度顯示 在通知中顯示當前速度\n小圖示顯示流量的轉送狀況 diff --git a/V2rayNG/app/src/main/res/values/arrays.xml b/V2rayNG/app/src/main/res/values/arrays.xml index 48fe13f55..7a64ed029 100644 --- a/V2rayNG/app/src/main/res/values/arrays.xml +++ b/V2rayNG/app/src/main/res/values/arrays.xml @@ -179,4 +179,10 @@ fa ar + + + reject + allow + skip + diff --git a/V2rayNG/app/src/main/res/values/strings.xml b/V2rayNG/app/src/main/res/values/strings.xml index 8a4d6ae7c..6214b2675 100644 --- a/V2rayNG/app/src/main/res/values/strings.xml +++ b/V2rayNG/app/src/main/res/values/strings.xml @@ -103,7 +103,14 @@ General: Checked App is proxy, unchecked direct connection; \nbypass mode: checked app directly connected, unchecked proxy. \nThe option to automatically select the proxy application in the menu Enable Mux - Enable maybe speed up network and switch network maybe flash + Faster, but it may cause unstable connectivity\nTCP traffic mux with default 8 connections,customize how to handle UDP and QUIC below + XUDP connections(range -1 to 1024) + Handling of QUIC in mux tunnel + + reject + allow + skip + Enable speed display Display current speed in the notification.\nNotification icon would change based on diff --git a/V2rayNG/app/src/main/res/xml/pref_settings.xml b/V2rayNG/app/src/main/res/xml/pref_settings.xml index 73d9ce519..a14314d59 100644 --- a/V2rayNG/app/src/main/res/xml/pref_settings.xml +++ b/V2rayNG/app/src/main/res/xml/pref_settings.xml @@ -1,9 +1,5 @@ - + + + + + + - - - - + + + + + + + + + + + +