diff --git a/app/src/main/java/com/github/kr328/clash/BaseActivity.kt b/app/src/main/java/com/github/kr328/clash/BaseActivity.kt index 6d7a43e..807c6af 100644 --- a/app/src/main/java/com/github/kr328/clash/BaseActivity.kt +++ b/app/src/main/java/com/github/kr328/clash/BaseActivity.kt @@ -20,6 +20,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel import kotlinx.coroutines.launch +import java.util.* abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { class EmptyBroadcastReceiver : BroadcastReceiver() { @@ -55,6 +56,7 @@ abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() var menu: Menu? = null lateinit var uiPreference: UiPreferences private set + lateinit var language: String open suspend fun onClashStarted() {} open suspend fun onClashStopped(reason: String?) {} @@ -81,17 +83,40 @@ abstract class BaseActivity : AppCompatActivity(), CoroutineScope by MainScope() super.setContentView(base) } + override fun attachBaseContext(newBase: Context?) { + val base = newBase ?: return super.attachBaseContext(newBase) + + uiPreference = UiPreferences(base) + + language = uiPreference.get(UiPreferences.LANGUAGE) + + val languageOverride = language.split("-") + if ( language.isEmpty() ) + return super.attachBaseContext(base) + + val configuration = base.resources.configuration + val localeOverride = if ( languageOverride.size == 2 ) + Locale(languageOverride[0], languageOverride[1]) + else + Locale(languageOverride[0]) + + configuration.setLocale(localeOverride) + + super.attachBaseContext(base.createConfigurationContext(configuration)) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - uiPreference = UiPreferences(this) - resetLightNavigationBar() } override fun onStart() { super.onStart() + if ( language != uiPreference.get(UiPreferences.LANGUAGE) ) + recreate() + Broadcasts.register(receiver) } diff --git a/app/src/main/java/com/github/kr328/clash/preference/UiPreferences.kt b/app/src/main/java/com/github/kr328/clash/preference/UiPreferences.kt index ea5618a..33762da 100644 --- a/app/src/main/java/com/github/kr328/clash/preference/UiPreferences.kt +++ b/app/src/main/java/com/github/kr328/clash/preference/UiPreferences.kt @@ -11,10 +11,15 @@ class UiPreferences(context: Context) { const val PROXY_SORT_NAME = "name" const val PROXY_SORT_DELAY = "delay" + const val LANGUAGE_DEFAULT = "" + const val LANGUAGE_EN = "en" + const val LANGUAGE_ZH_CN = "zh-CN" + val PROXY_GROUP_SORT = StringEntry("proxy_group_sort", PROXY_SORT_DEFAULT) val PROXY_PROXY_SORT = StringEntry("proxy_proxy_sort", PROXY_SORT_DEFAULT) val PROXY_LAST_SELECT_GROUP = StringEntry("proxy_last_select_group", "") val PROXY_MERGE_PREFIX = BooleanEntry("proxy_merge_prefix", true) + val LANGUAGE = StringEntry("language", "") } interface Entry { @@ -22,7 +27,7 @@ class UiPreferences(context: Context) { fun put(editor: SharedPreferences.Editor, value: T) } - class StringEntry(private val key: String, private val defaultValue: String? = null) : + class StringEntry(private val key: String, private val defaultValue: String) : Entry { override fun get(sharedPreferences: SharedPreferences): String { return sharedPreferences.getString(key, defaultValue)!! diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d9a6958..20cb227 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -20,10 +20,9 @@ android:gravity="center_vertical"> + android:layout_marginStart="25dp" />