add setting meta features

This commit is contained in:
djoeni 2022-06-16 14:32:16 +07:00
parent 41127e9312
commit 34f1e6f984
14 changed files with 454 additions and 74 deletions

View File

@ -136,6 +136,11 @@
android:configChanges="uiMode" android:configChanges="uiMode"
android:exported="false" android:exported="false"
android:label="@string/override" /> android:label="@string/override" />
<activity
android:name=".MetaFeatureSettingsActivity"
android:configChanges="uiMode"
android:exported="false"
android:label="@string/meta_features" />
<activity <activity
android:name=".AccessControlActivity" android:name=".AccessControlActivity"
android:configChanges="uiMode" android:configChanges="uiMode"

View File

@ -0,0 +1,49 @@
package com.github.kr328.clash
import com.github.kr328.clash.core.Clash
import com.github.kr328.clash.design.MetaFeatureSettingsDesign
import com.github.kr328.clash.util.withClash
import kotlinx.coroutines.isActive
import kotlinx.coroutines.selects.select
class MetaFeatureSettingsActivity : BaseActivity<MetaFeatureSettingsDesign>() {
override suspend fun main() {
val configuration = withClash { queryOverride(Clash.OverrideSlot.Persist) }
defer {
withClash {
patchOverride(Clash.OverrideSlot.Persist, configuration)
}
}
val design = MetaFeatureSettingsDesign(
this,
configuration
)
setContentDesign(design)
while (isActive) {
select<Unit> {
events.onReceive {
}
design.requests.onReceive {
when (it) {
MetaFeatureSettingsDesign.Request.ResetOverride -> {
if (design.requestResetConfirm()) {
defer {
withClash {
clearOverride(Clash.OverrideSlot.Persist)
}
}
finish()
}
}
}
}
}
}
}
}

View File

@ -24,6 +24,8 @@ class SettingsActivity : BaseActivity<SettingsDesign>() {
startActivity(NetworkSettingsActivity::class.intent) startActivity(NetworkSettingsActivity::class.intent)
SettingsDesign.Request.StartOverride -> SettingsDesign.Request.StartOverride ->
startActivity(OverrideSettingsActivity::class.intent) startActivity(OverrideSettingsActivity::class.intent)
SettingsDesign.Request.StartMetaFeature ->
startActivity(MetaFeatureSettingsActivity::class.intent)
} }
} }
} }

View File

@ -44,11 +44,32 @@ data class ConfigurationOverride(
@SerialName("hosts") @SerialName("hosts")
var hosts: Map<String, String>? = null, var hosts: Map<String, String>? = null,
@SerialName("force-cert-verify")
var forceCertVeriy: Boolean? = null,
@SerialName("unified-delay")
var unifiedDelay: Boolean? = null,
@SerialName("geodata-mode")
var geodataMode: Boolean? = null,
@SerialName("tcp-concurrent")
var tcpConcurrent: Boolean? = null,
@SerialName("enable-process")
var enableProcess: Boolean? = null,
@SerialName("dns") @SerialName("dns")
val dns: Dns = Dns(), val dns: Dns = Dns(),
@SerialName("clash-for-android") @SerialName("clash-for-android")
val app: App = App(), val app: App = App(),
@SerialName("sniffer")
val sniffer: Sniffer = Sniffer(),
@SerialName("geox-url")
val geoxurl: GeoXUrl = GeoXUrl(),
) : Parcelable { ) : Parcelable {
@Serializable @Serializable
data class Dns( data class Dns(
@ -119,6 +140,33 @@ data class ConfigurationOverride(
FakeIp, FakeIp,
} }
@Serializable
data class Sniffer(
@SerialName("enable")
var enable: Boolean? = null,
@SerialName("sniffing")
var sniffing: List<String>? = null,
@SerialName("force-domain")
var forceDomain: List<String>? = null,
@SerialName("skip-domain")
var skipDomain: List<String>? = null,
)
@Serializable
data class GeoXUrl(
@SerialName("geoip")
var geoip: String? = null,
@SerialName("mmdb")
var mmdb: String? = null,
@SerialName("geosite")
var geosite: String? = null,
)
override fun writeToParcel(parcel: Parcel, flags: Int) { override fun writeToParcel(parcel: Parcel, flags: Int) {
Parcelizer.encodeToParcel(serializer(), parcel, this) Parcelizer.encodeToParcel(serializer(), parcel, this)
} }

View File

@ -3,7 +3,6 @@ package com.github.kr328.clash.design
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
import android.view.View import android.view.View
import com.github.kr328.clash.common.compat.preferredLocale
import com.github.kr328.clash.design.databinding.DesignSettingsCommonBinding import com.github.kr328.clash.design.databinding.DesignSettingsCommonBinding
import com.github.kr328.clash.design.preference.category import com.github.kr328.clash.design.preference.category
import com.github.kr328.clash.design.preference.clickable import com.github.kr328.clash.design.preference.clickable
@ -45,60 +44,32 @@ class HelpDesign(
} }
} }
category(R.string.feedback)
if (BuildConfig.PREMIUM) {
clickable( clickable(
title = R.string.google_play, title = R.string.clash_meta_wiki,
summary = R.string.google_play_url summary = R.string.clash_meta_wiki_url
) { ) {
clicked { clicked {
openLink(Uri.parse(context.getString(R.string.google_play_url))) openLink(Uri.parse(context.getString(R.string.clash_meta_wiki_url)))
}
}
}
clickable(
title = R.string.github_issues,
summary = R.string.github_issues_url
) {
clicked {
openLink(Uri.parse(context.getString(R.string.github_issues_url)))
} }
} }
if (!BuildConfig.PREMIUM) {
category(R.string.sources) category(R.string.sources)
clickable( clickable(
title = R.string.clash_for_android, title = R.string.clash_meta_for_android,
summary = R.string.github_url summary = R.string.meta_github_url
) { ) {
clicked { clicked {
openLink(Uri.parse(context.getString(R.string.github_url))) openLink(Uri.parse(context.getString(R.string.meta_github_url)))
} }
} }
clickable( clickable(
title = R.string.clash_core, title = R.string.clash_meta_core,
summary = R.string.clash_core_url summary = R.string.clash_meta_core_url
) { ) {
clicked { clicked {
openLink(Uri.parse(context.getString(R.string.clash_core_url))) openLink(Uri.parse(context.getString(R.string.clash_meta_core_url)))
}
}
}
if (context.resources.configuration.preferredLocale.language == "zh") {
category(R.string.donate)
clickable(
title = R.string.donate,
summary = R.string.donate_url
) {
clicked {
openLink(Uri.parse(context.getString(R.string.donate_url)))
}
} }
} }
} }

View File

@ -0,0 +1,198 @@
package com.github.kr328.clash.design
import android.content.Context
import android.view.View
import com.github.kr328.clash.core.model.ConfigurationOverride
import com.github.kr328.clash.design.databinding.DesignSettingsMetaFeatureBinding
import com.github.kr328.clash.design.preference.*
import com.github.kr328.clash.design.util.*
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlin.coroutines.resume
class MetaFeatureSettingsDesign(
context: Context,
configuration: ConfigurationOverride
) : Design<MetaFeatureSettingsDesign.Request>(context) {
enum class Request {
ResetOverride
}
private val binding = DesignSettingsMetaFeatureBinding
.inflate(context.layoutInflater, context.root, false)
override val root: View
get() = binding.root
suspend fun requestResetConfirm(): Boolean {
return suspendCancellableCoroutine { ctx ->
val dialog = MaterialAlertDialogBuilder(context)
.setTitle(R.string.reset_override_settings)
.setMessage(R.string.reset_override_settings_message)
.setPositiveButton(R.string.ok) { _, _ -> ctx.resume(true) }
.setNegativeButton(R.string.cancel) { _, _ -> }
.show()
dialog.setOnDismissListener {
if (!ctx.isCompleted)
ctx.resume(false)
}
ctx.invokeOnCancellation {
dialog.dismiss()
}
}
}
init {
binding.self = this
binding.activityBarLayout.applyFrom(context)
binding.scrollRoot.bindAppBarElevation(binding.activityBarLayout)
val booleanValues: Array<Boolean?> = arrayOf(
null,
true,
false
)
val booleanValuesText: Array<Int> = arrayOf(
R.string.dont_modify,
R.string.enabled,
R.string.disabled
)
val screen = preferenceScreen(context) {
category(R.string.meta_features)
selectableList(
value = configuration::forceCertVeriy,
values = booleanValues,
valuesText = booleanValuesText,
title = R.string.force_cert_verify,
)
selectableList(
value = configuration::unifiedDelay,
values = booleanValues,
valuesText = booleanValuesText,
title = R.string.unified_delay,
)
selectableList(
value = configuration::geodataMode,
values = booleanValues,
valuesText = booleanValuesText,
title = R.string.geodata_mode,
)
selectableList(
value = configuration::tcpConcurrent,
values = booleanValues,
valuesText = booleanValuesText,
title = R.string.tcp_concurrent,
)
selectableList(
value = configuration::enableProcess,
values = booleanValues,
valuesText = booleanValuesText,
title = R.string.enable_process,
)
category(R.string.sniffer_setting)
val snifferDependencies: MutableList<Preference> = mutableListOf()
val sniffer = selectableList(
value = configuration.sniffer::enable,
values = arrayOf(
null,
true,
false
),
valuesText = arrayOf(
R.string.sniffer_config,
R.string.sniffer_override,
R.string.disable_sniffer,
),
title = R.string.strategy
) {
listener = OnChangedListener {
if (configuration.sniffer.enable == false) {
snifferDependencies.forEach {
it.enabled = false
}
} else {
snifferDependencies.forEach {
it.enabled = true
}
}
}
}
editableTextList(
value = configuration.sniffer::sniffing,
adapter = TextAdapter.String,
title = R.string.sniffing,
placeholder = R.string.dont_modify,
configure = snifferDependencies::add,
)
editableTextList(
value = configuration.sniffer::forceDomain,
adapter = TextAdapter.String,
title = R.string.force_domain,
placeholder = R.string.dont_modify,
configure = snifferDependencies::add,
)
editableTextList(
value = configuration.sniffer::skipDomain,
adapter = TextAdapter.String,
title = R.string.skip_domain,
placeholder = R.string.dont_modify,
configure = snifferDependencies::add,
)
sniffer.listener?.onChanged()
category(R.string.geox_url_setting)
val geoxurlDependencies: MutableList<Preference> = mutableListOf()
editableText(
value = configuration.geoxurl::geoip,
adapter = NullableTextAdapter.String,
title = R.string.geox_geoip,
placeholder = R.string.dont_modify,
empty = R.string.geoip_url,
configure = geoxurlDependencies::add,
)
editableText(
value = configuration.geoxurl::geoip,
adapter = NullableTextAdapter.String,
title = R.string.geox_mmdb,
placeholder = R.string.dont_modify,
empty = R.string.mmdb_url,
configure = geoxurlDependencies::add,
)
editableText(
value = configuration.geoxurl::geoip,
adapter = NullableTextAdapter.String,
title = R.string.geox_geosite,
placeholder = R.string.dont_modify,
empty = R.string.geosite_url,
configure = geoxurlDependencies::add,
)
}
binding.content.addView(screen.root)
}
fun requestClear() {
requests.trySend(Request.ResetOverride)
}
}

View File

@ -10,7 +10,7 @@ import com.github.kr328.clash.design.util.root
class SettingsDesign(context: Context) : Design<SettingsDesign.Request>(context) { class SettingsDesign(context: Context) : Design<SettingsDesign.Request>(context) {
enum class Request { enum class Request {
StartApp, StartNetwork, StartOverride, StartApp, StartNetwork, StartOverride, StartMetaFeature,
} }
private val binding = DesignSettingsBinding private val binding = DesignSettingsBinding

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M 6.52 4.88 C 6.59 4.88 6.67 4.87 6.74 4.91 C 6.84 4.98 6.92 5.07 7.01 5.15 C 8.32 6.43 9.63 7.7 10.94 8.98 C 11.03 9.06 11.11 9.16 11.22 9.22 C 11.31 9.26 11.4 9.24 11.49 9.23 C 11.73 9.19 11.97 9.18 12.22 9.18 C 12.45 9.18 12.69 9.19 12.92 9.23 C 13.01 9.24 13.12 9.27 13.19 9.19 C 14.63 7.78 16.08 6.38 17.52 4.97 C 17.64 4.83 17.83 4.86 17.99 4.88 C 18.39 4.94 18.8 4.97 19.2 5.02 C 19.27 5.03 19.36 5.04 19.39 5.12 C 19.42 5.27 19.4 5.42 19.41 5.57 L 19.41 14.7 C 19.41 14.85 19.42 15.01 19.4 15.16 C 19.39 15.22 19.39 15.28 19.35 15.32 C 19.26 15.36 19.16 15.38 19.07 15.4 C 18.67 15.5 18.26 15.57 17.85 15.68 C 17.65 15.74 17.44 15.72 17.23 15.72 C 17.12 15.72 17.02 15.73 16.91 15.71 C 16.85 15.7 16.8 15.65 16.8 15.58 C 16.78 15.43 16.79 15.28 16.79 15.12 L 16.79 10.63 C 16.79 10.48 16.8 10.33 16.78 10.18 C 16.75 10.01 16.59 9.89 16.43 9.91 C 16.34 9.91 16.27 9.97 16.21 10.03 C 15.51 10.72 14.81 11.39 14.11 12.07 C 14.03 12.14 13.94 12.23 13.83 12.22 C 13.68 12.21 13.54 12.15 13.4 12.11 C 12.82 11.96 12.22 11.94 11.63 11.99 C 11.34 12.03 11.05 12.07 10.77 12.16 C 10.68 12.19 10.59 12.22 10.5 12.21 C 10.41 12.2 10.33 12.14 10.26 12.07 C 9.57 11.39 8.87 10.72 8.18 10.05 C 8.11 9.99 8.04 9.92 7.95 9.9 C 7.83 9.88 7.72 9.94 7.64 10.02 C 7.57 10.1 7.57 10.22 7.57 10.32 L 7.57 15.42 C 7.57 15.49 7.57 15.55 7.54 15.61 C 7.5 15.68 7.42 15.68 7.35 15.69 L 6.81 15.69 C 6.61 15.69 6.41 15.63 6.22 15.59 C 5.86 15.51 5.51 15.42 5.15 15.34 C 5.07 15.32 4.97 15.3 4.95 15.2 C 4.93 15.03 4.94 14.85 4.94 14.67 L 4.94 5.57 C 4.94 5.43 4.93 5.28 4.94 5.14 C 4.94 5.09 4.96 5.03 5.01 5 C 5.06 4.98 5.12 4.97 5.17 4.96 C 5.62 4.93 6.07 4.87 6.52 4.82 Z M 11.9 16.06 C 12.1 16.04 12.31 16.05 12.51 16.06 C 12.67 16.06 12.76 16.26 12.69 16.4 C 12.6 16.59 12.51 16.77 12.41 16.95 C 12.34 17.08 12.15 17.1 12.07 16.99 C 11.99 16.88 11.94 16.75 11.87 16.63 C 11.82 16.53 11.76 16.43 11.73 16.32 C 11.71 16.2 11.79 16.08 11.9 16.06 Z M 5.09 16.45 C 5.13 16.45 5.17 16.44 5.21 16.44 L 8.58 16.44 C 8.68 16.44 8.8 16.46 8.86 16.56 C 8.92 16.67 8.91 16.84 8.8 16.91 C 8.73 16.96 8.64 16.96 8.55 16.97 L 5.21 16.97 C 5.15 16.97 5.08 16.97 5.03 16.95 C 4.93 16.91 4.87 16.8 4.88 16.69 C 4.89 16.57 4.98 16.46 5.09 16.45 Z M 15.7 16.45 C 15.85 16.43 16 16.45 16.16 16.44 L 19.17 16.44 C 19.23 16.44 19.3 16.44 19.36 16.47 C 19.45 16.51 19.5 16.62 19.5 16.72 C 19.5 16.84 19.41 16.95 19.3 16.96 C 19.16 16.98 19.01 16.97 18.87 16.97 L 16.1 16.97 C 15.96 16.97 15.82 16.98 15.68 16.96 C 15.57 16.94 15.49 16.84 15.5 16.72 C 15.49 16.58 15.6 16.46 15.72 16.45 Z M 8.53 17.74 C 8.6 17.72 8.69 17.71 8.76 17.75 C 8.91 17.82 8.94 18.07 8.81 18.18 C 8.73 18.24 8.64 18.26 8.55 18.3 C 8.22 18.41 7.89 18.55 7.56 18.66 C 7.18 18.79 6.8 18.94 6.42 19.08 C 6.14 19.18 5.86 19.28 5.59 19.38 C 5.48 19.42 5.36 19.48 5.25 19.5 C 5.18 19.52 5.1 19.5 5.04 19.45 C 4.95 19.37 4.93 19.22 4.98 19.11 C 5.02 19.03 5.11 19 5.19 18.97 C 5.43 18.88 5.66 18.79 5.91 18.71 C 6.51 18.5 7.1 18.26 7.71 18.06 C 7.99 17.96 8.26 17.84 8.55 17.75 Z M 15.67 17.72 C 15.76 17.7 15.84 17.73 15.92 17.76 C 16.18 17.86 16.44 17.96 16.7 18.05 C 17.32 18.26 17.93 18.51 18.55 18.72 C 18.75 18.79 18.96 18.87 19.16 18.95 C 19.24 18.98 19.32 19.01 19.38 19.08 C 19.47 19.21 19.42 19.42 19.27 19.48 C 19.18 19.52 19.08 19.48 18.99 19.45 C 18.62 19.3 18.25 19.17 17.87 19.04 C 17.51 18.91 17.14 18.76 16.78 18.64 C 16.45 18.53 16.12 18.39 15.79 18.28 C 15.7 18.25 15.61 18.22 15.54 18.16 C 15.41 18.03 15.48 17.76 15.66 17.73 Z" />
</vector>

View File

@ -49,6 +49,13 @@
app:icon="@drawable/ic_baseline_extension" app:icon="@drawable/ic_baseline_extension"
app:text="@string/override" /> app:text="@string/override" />
<com.github.kr328.clash.design.view.ActionLabel
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{() -> self.request(Request.StartMetaFeature)}"
app:icon="@drawable/ic_baseline_meta"
app:text="@string/meta_features" />
</LinearLayout> </LinearLayout>
</com.github.kr328.clash.design.view.ObservableScrollView> </com.github.kr328.clash.design.view.ObservableScrollView>

View File

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="self"
type="com.github.kr328.clash.design.MetaFeatureSettingsDesign" />
</data>
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="@{self.surface.insets.start}"
android:paddingEnd="@{self.surface.insets.end}">
<com.github.kr328.clash.design.view.ObservableScrollView
android:id="@+id/scroll_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none">
<FrameLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@{(float) self.surface.insets.top + @dimen/toolbar_height}"
android:paddingBottom="@{self.surface.insets.bottom}" />
</com.github.kr328.clash.design.view.ObservableScrollView>
<com.github.kr328.clash.design.view.ActivityBarLayout
android:id="@+id/activity_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@{self.surface.insets.top}">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingEnd="@dimen/item_tailing_margin">
<include
layout="@layout/common_activity_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_toStartOf="@id/clear_view" />
<ImageView
android:id="@+id/clear_view"
android:layout_width="@dimen/item_tailing_component_size"
android:layout_height="@dimen/item_tailing_component_size"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_gravity="end|center_vertical"
android:layout_marginStart="@dimen/item_tailing_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/reset"
android:focusable="true"
android:onClick="@{() -> self.requestClear()}"
android:padding="@dimen/toolbar_image_action_padding"
android:src="@drawable/ic_baseline_replay" />
</RelativeLayout>
</com.github.kr328.clash.design.view.ActivityBarLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</layout>

View File

@ -6,7 +6,7 @@
<string name="access_control_packages">訪問控制應用包列表</string> <string name="access_control_packages">訪問控制應用包列表</string>
<string name="append_system_dns">追加系統 DNS</string> <string name="append_system_dns">追加系統 DNS</string>
<string name="application_broken">應用損壞</string> <string name="application_broken">應用損壞</string>
<string name="application_name">Clash for Android</string> <string name="application_name">Clash Meta for Android</string>
<string name="auto_update">自動更新</string> <string name="auto_update">自動更新</string>
<string name="behavior">行為</string> <string name="behavior">行為</string>
<string name="bypass_private_network">繞過私有網絡</string> <string name="bypass_private_network">繞過私有網絡</string>
@ -43,7 +43,7 @@
<string name="import_from_url">從 URL 導入</string> <string name="import_from_url">從 URL 導入</string>
<string name="interface_">界面</string> <string name="interface_">界面</string>
<string name="invalid_url">無效的 URL</string> <string name="invalid_url">無效的 URL</string>
<string name="launch_name">Clash</string> <string name="launch_name">Clash Meta for Android</string>
<string name="logcat">Logcat</string> <string name="logcat">Logcat</string>
<string name="logs">日誌</string> <string name="logs">日誌</string>
<string name="mode">模式</string> <string name="mode">模式</string>
@ -79,12 +79,11 @@
<string name="update_time">更新時間</string> <string name="update_time">更新時間</string>
<string name="package_name">應用包名稱</string> <string name="package_name">應用包名稱</string>
<string name="install_time">安裝時間</string> <string name="install_time">安裝時間</string>
<string name="clash_for_android">Clash for Android</string>
<string name="feedback">反饋</string> <string name="feedback">反饋</string>
<string name="github_issues">Github Issues</string> <string name="github_issues">Github Issues</string>
<string name="tips_properties"><![CDATA[僅接受 <strong>Clash 配置文件</strong>(包含<strong>代理</strong>/<strong>規則</strong>)]]></string> <string name="tips_properties"><![CDATA[僅接受 <strong>Clash 配置文件</strong>(包含<strong>代理</strong>/<strong>規則</strong>)]]></string>
<string name="loading">載入中</string> <string name="loading">載入中</string>
<string name="tips_help"><![CDATA[Clash for Android 是一個<strong>免費軟件</strong>並且我們<strong>不</strong>為其提供任何服務, <strong>請務必不要反饋非應用自身引起的問題</strong>]]></string> <string name="tips_help"><![CDATA[Clash Meta for Android 是一個<strong>免費軟件</strong>並且我們<strong>不</strong>為其提供任何服務, <strong>請務必不要反饋非應用自身引起的問題</strong>]]></string>
<string name="donate">捐贈</string> <string name="donate">捐贈</string>
<string name="allow_all_apps">允許所有應用</string> <string name="allow_all_apps">允許所有應用</string>
<string name="allow_selected_apps">僅允許已選擇的應用</string> <string name="allow_selected_apps">僅允許已選擇的應用</string>
@ -209,8 +208,9 @@
<string name="mode_switch_tips">僅在本次會話中有效</string> <string name="mode_switch_tips">僅在本次會話中有效</string>
<string name="import_">導入</string> <string name="import_">導入</string>
<string name="sources">源代碼</string> <string name="sources">源代碼</string>
<string name="clash_core">Clash 核心</string> <string name="clash_meta_core">Clash 核心</string>
<string name="name_server_policy">Name Server 策略</string> <string name="name_server_policy">Name Server 策略</string>
<string name="block_loopback">阻止本地迴環</string> <string name="block_loopback">阻止本地迴環</string>
<string name="block_loopback_summary">阻止本地迴環連接</string> <string name="block_loopback_summary">阻止本地迴環連接</string>
<string name="clash_meta_for_android">Clash Meta for Android</string>
</resources> </resources>

View File

@ -6,7 +6,7 @@
<string name="access_control_packages">存取控制應用程式套件清單</string> <string name="access_control_packages">存取控制應用程式套件清單</string>
<string name="append_system_dns">附加作業系統 DNS</string> <string name="append_system_dns">附加作業系統 DNS</string>
<string name="application_broken">應用程式損毀</string> <string name="application_broken">應用程式損毀</string>
<string name="application_name">Clash for Android</string> <string name="application_name">Clash Meta for Android</string>
<string name="auto_update">自動更新</string> <string name="auto_update">自動更新</string>
<string name="behavior">行為</string> <string name="behavior">行為</string>
<string name="bypass_private_network">略過私有網路</string> <string name="bypass_private_network">略過私有網路</string>
@ -43,7 +43,7 @@
<string name="import_from_url">從 URL 匯入</string> <string name="import_from_url">從 URL 匯入</string>
<string name="interface_">介面</string> <string name="interface_">介面</string>
<string name="invalid_url">無效 URL</string> <string name="invalid_url">無效 URL</string>
<string name="launch_name">Clash</string> <string name="launch_name">Clash Meta for Android</string>
<string name="logcat">Logcat</string> <string name="logcat">Logcat</string>
<string name="logs">日誌</string> <string name="logs">日誌</string>
<string name="mode">模式</string> <string name="mode">模式</string>
@ -79,12 +79,11 @@
<string name="update_time">更新時間</string> <string name="update_time">更新時間</string>
<string name="package_name">套件名稱</string> <string name="package_name">套件名稱</string>
<string name="install_time">安裝時間</string> <string name="install_time">安裝時間</string>
<string name="clash_for_android">Clash for Android</string>
<string name="feedback">回饋</string> <string name="feedback">回饋</string>
<string name="github_issues">Github Issues</string> <string name="github_issues">Github Issues</string>
<string name="tips_properties"><![CDATA[僅接受 <strong>Clash 設定檔</strong> (包含<strong>Proxy</strong> /<strong>規則</strong>)]]></string> <string name="tips_properties"><![CDATA[僅接受 <strong>Clash 設定檔</strong> (包含<strong>Proxy</strong> /<strong>規則</strong>)]]></string>
<string name="loading">載入中</string> <string name="loading">載入中</string>
<string name="tips_help"><![CDATA[Clash for Android 是一個<strong>免費應用程式</strong>並且我們<strong>不</strong>為其提供任何服務, <strong>請務必不要回報非應用程式自身引起的問題</strong>]]></string> <string name="tips_help"><![CDATA[Clash Meta for Android 是一個<strong>免費應用程式</strong>並且我們<strong>不</strong>為其提供任何服務, <strong>請務必不要回報非應用程式自身引起的問題</strong>]]></string>
<string name="donate">捐助</string> <string name="donate">捐助</string>
<string name="allow_all_apps">允許所有應用</string> <string name="allow_all_apps">允許所有應用</string>
<string name="allow_selected_apps">僅允許已選擇的應用</string> <string name="allow_selected_apps">僅允許已選擇的應用</string>
@ -209,8 +208,9 @@
<string name="mode_switch_tips">僅在本次工作階段中有效</string> <string name="mode_switch_tips">僅在本次工作階段中有效</string>
<string name="import_">匯入</string> <string name="import_">匯入</string>
<string name="sources">原始碼</string> <string name="sources">原始碼</string>
<string name="clash_core">Clash 核心</string> <string name="clash_meta_core">Clash 核心</string>
<string name="name_server_policy">Name Server 政策</string> <string name="name_server_policy">Name Server 政策</string>
<string name="block_loopback">攔截本地回送</string> <string name="block_loopback">攔截本地回送</string>
<string name="block_loopback_summary">攔截本地回送連結</string> <string name="block_loopback_summary">攔截本地回送連結</string>
<string name="clash_meta_for_android">Clash Meta for Android</string>
</resources> </resources>

View File

@ -6,7 +6,7 @@
<string name="access_control_packages">访问控制应用包列表</string> <string name="access_control_packages">访问控制应用包列表</string>
<string name="append_system_dns">追加系统 DNS</string> <string name="append_system_dns">追加系统 DNS</string>
<string name="application_broken">应用损坏</string> <string name="application_broken">应用损坏</string>
<string name="application_name">Clash for Android</string> <string name="application_name">Clash Meta for Android</string>
<string name="auto_update">自动更新</string> <string name="auto_update">自动更新</string>
<string name="behavior">行为</string> <string name="behavior">行为</string>
<string name="bypass_private_network">绕过私有网络</string> <string name="bypass_private_network">绕过私有网络</string>
@ -43,7 +43,7 @@
<string name="import_from_url">从 URL 导入</string> <string name="import_from_url">从 URL 导入</string>
<string name="interface_">界面</string> <string name="interface_">界面</string>
<string name="invalid_url">无效的 URL</string> <string name="invalid_url">无效的 URL</string>
<string name="launch_name">Clash</string> <string name="launch_name">Clash Meta for Android</string>
<string name="logcat">Logcat</string> <string name="logcat">Logcat</string>
<string name="logs">日志</string> <string name="logs">日志</string>
<string name="mode">模式</string> <string name="mode">模式</string>
@ -79,12 +79,12 @@
<string name="update_time">更新时间</string> <string name="update_time">更新时间</string>
<string name="package_name">应用包名称</string> <string name="package_name">应用包名称</string>
<string name="install_time">安装时间</string> <string name="install_time">安装时间</string>
<string name="clash_for_android">Clash for Android</string> <string name="clash_meta_for_android">Clash Meta for Android</string>
<string name="feedback">反馈</string> <string name="feedback">反馈</string>
<string name="github_issues">Github Issues</string> <string name="github_issues">Github Issues</string>
<string name="tips_properties"><![CDATA[仅接受 <strong>Clash 配置文件</strong>(包含<strong>代理</strong>/<strong>规则</strong>)]]></string> <string name="tips_properties"><![CDATA[仅接受 <strong>Clash 配置文件</strong>(包含<strong>代理</strong>/<strong>规则</strong>)]]></string>
<string name="loading">载入中</string> <string name="loading">载入中</string>
<string name="tips_help"><![CDATA[Clash for Android 是一个<strong>免费软件</strong>并且我们<strong>不</strong>为其提供任何服务, <strong>请务必不要反馈非应用自身引起的问题</strong>]]></string> <string name="tips_help"><![CDATA[Clash Meta for Android 是一个<strong>免费软件</strong>并且我们<strong>不</strong>为其提供任何服务, <strong>请务必不要反馈非应用自身引起的问题</strong>]]></string>
<string name="donate">捐赠</string> <string name="donate">捐赠</string>
<string name="allow_all_apps">允许所有应用</string> <string name="allow_all_apps">允许所有应用</string>
<string name="allow_selected_apps">仅允许已选择的应用</string> <string name="allow_selected_apps">仅允许已选择的应用</string>
@ -209,7 +209,7 @@
<string name="mode_switch_tips">仅在本次会话中有效</string> <string name="mode_switch_tips">仅在本次会话中有效</string>
<string name="import_">导入</string> <string name="import_">导入</string>
<string name="sources">源代码</string> <string name="sources">源代码</string>
<string name="clash_core">Clash 核心</string> <string name="clash_meta_core">Clash Meta 核心</string>
<string name="name_server_policy">Name Server 策略</string> <string name="name_server_policy">Name Server 策略</string>
<string name="block_loopback">阻止本地回环</string> <string name="block_loopback">阻止本地回环</string>
<string name="block_loopback_summary">阻止本地回环连接</string> <string name="block_loopback_summary">阻止本地回环连接</string>

View File

@ -1,6 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="PluralsCandidate"> <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="PluralsCandidate">
<string name="launch_name">Clash</string> <string name="launch_name">Clash Meta for Android</string>
<string name="application_name">Clash for Android</string> <string name="application_name">Clash Meta for Android</string>
<string name="stopped">Stopped</string> <string name="stopped">Stopped</string>
<string name="tap_to_start">Tap to start</string> <string name="tap_to_start">Tap to start</string>
@ -49,7 +49,6 @@
<string name="application_broken_tips">App lacks the necessary runtime components, which is usually caused by downloading an incomplete apk.</string> <string name="application_broken_tips">App lacks the necessary runtime components, which is usually caused by downloading an incomplete apk.</string>
<string name="reinstall">Reinstall</string> <string name="reinstall">Reinstall</string>
<string name="github_releases">Github Releases</string> <string name="github_releases">Github Releases</string>
<string name="github_releases_url" translatable="false">https://github.com/kr328/clashforandroid/releases</string>
<string name="profile">Profile</string> <string name="profile">Profile</string>
<string name="name">Name</string> <string name="name">Name</string>
@ -196,7 +195,7 @@
<string name="import_from_clipboard">Import from Clipboard</string> <string name="import_from_clipboard">Import from Clipboard</string>
<string name="export_to_clipboard">Export to Clipboard</string> <string name="export_to_clipboard">Export to Clipboard</string>
<string name="clash_for_android">Clash for Android</string> <string name="clash_meta_for_android">Clash Meta for Android</string>
<string name="document">Document</string> <string name="document">Document</string>
<string name="feedback">Feedback</string> <string name="feedback">Feedback</string>
@ -205,15 +204,13 @@
<string name="clash_wiki">Clash Wiki</string> <string name="clash_wiki">Clash Wiki</string>
<string name="github_issues">Github Issues</string> <string name="github_issues">Github Issues</string>
<string name="google_play">Google Play</string> <string name="google_play">Google Play</string>
<string name="clash_core">Clash Core</string> <string name="clash_meta_core">Clash Meta Core</string>
<string name="clash_wiki_url" translatable="false">https://github.com/Dreamacro/clash/wiki</string> <string name="clash_wiki_url" translatable="false">https://github.com/Dreamacro/clash/wiki</string>
<string name="github_issues_url" translatable="false">https://github.com/Kr328/ClashForAndroid/issues</string> <string name="meta_github_url" translatable="false">https://github.com/MetaCubeX/ClashMetaForAndroid</string>
<string name="donate_url" translatable="false">https://donate.kr328.app</string> <string name="clash_meta_core_url" translatable="false">https://github.com/MetaCubeX/Clash.Meta</string>
<string name="github_url" translatable="false">https://github.com/Kr328/ClashForAndroid</string>
<string name="clash_core_url" translatable="false">https://github.com/Dreamacro/clash</string>
<string name="tips_properties"><![CDATA[Accept Only <strong>Clash Config</strong>(including <strong>Proxy</strong>/<strong>Rules</strong>)]]></string> <string name="tips_properties"><![CDATA[Accept Only <strong>Clash Config</strong>(including <strong>Proxy</strong>/<strong>Rules</strong>)]]></string>
<string name="tips_help"><![CDATA[Clash for Android is a <strong>freeware</strong> and we do <strong>NOT</strong> provide any service for it]]></string> <string name="tips_help"><![CDATA[Clash Meta for Android is a <strong>freeware</strong> and we do <strong>NOT</strong> provide any service for it]]></string>
<string name="google_play_url" translatable="false">https://play.google.com/store/apps/details?id=com.github.kr328.clash</string> <string name="google_play_url" translatable="false">https://play.google.com/store/apps/details?id=com.github.kr328.clash</string>
@ -278,4 +275,31 @@
<string name="version_updated_tips">The settings have been reseted and the old profiles needs to be saved again.</string> <string name="version_updated_tips">The settings have been reseted and the old profiles needs to be saved again.</string>
<string name="mode_switch_tips">Valid only for current session</string> <string name="mode_switch_tips">Valid only for current session</string>
<string name="clash_meta_wiki">Clash Meta Wiki</string>
<string name="clash_meta_wiki_url" translatable="false">https://docs.metacubex.one/</string>
<string name="meta_features">Meta Features</string>
<string name="force_cert_verify">Force Cert Verify</string>
<string name="unified_delay">Unified Delay</string>
<string name="geodata_mode">Geodata Mode</string>
<string name="tcp_concurrent">TCP Concurrent</string>
<string name="enable_process">Enable Process</string>
<string name="sniffer_setting">Sniffer Setting</string>
<string name="sniffer">Sniffer</string>
<string name="sniffing">Sniffer Mode</string>
<string name="force_domain">Force Domain</string>
<string name="skip_domain">Skip Domain</string>
<string name="disable_sniffer">Disable Sniffer</string>
<string name="sniffer_config">Load Sniffer From Config</string>
<string name="sniffer_override">Override Sniffer Config</string>
<string name="geox_url_setting">GeoX Url Setting</string>
<string name="geox_geoip">GeoIp Url</string>
<string name="geox_mmdb">MMDB Url</string>
<string name="geox_geosite">Geosite Url</string>
<string name="geoip_url" translatable="false">https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/geoip.dat</string>
<string name="mmdb_url" translatable="false">https://raw.githubusercontent.com/Loyalsoldier/geoip/release/Country.mmdb</string>
<string name="geosite_url" translatable="false">https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/geosite.dat</string>
</resources> </resources>