@@ -4,6 +4,7 @@ import android.os.Bundle
44import android.text.InputType
55import android.widget.EditText
66import androidx.appcompat.app.AppCompatDelegate
7+ import androidx.core.os.LocaleListCompat
78import com.google.android.material.dialog.MaterialAlertDialogBuilder
89import top.uwu.mikubox.R
910import top.uwu.mikubox.core.AppSettings
@@ -44,6 +45,7 @@ class SettingsActivity : EdgeToEdgeActivity() {
4445 binding.toolbar.setNavigationOnClickListener { finish() }
4546
4647 binding.rowTheme.setOnClickListener { pickTheme() }
48+ binding.rowLanguage.setOnClickListener { pickLanguage() }
4749 binding.rowMtu.setOnClickListener { editMtu() }
4850 binding.rowDns.setOnClickListener {
4951 startActivity(Intent (this , DnsActivity ::class .java))
@@ -113,6 +115,7 @@ class SettingsActivity : EdgeToEdgeActivity() {
113115
114116 private fun render () {
115117 binding.tvThemeValue.text = getString(themeLabel(AppSettings .nightMode(this )))
118+ binding.tvLanguageValue.text = getString(languageLabel(AppSettings .language(this )))
116119 binding.tvMtuValue.text = MihomoVpnSettings .mtu(this ).toString()
117120 binding.tvAppsValue.setText(appModeLabel(MihomoVpnSettings .appMode(this )))
118121 binding.tvModeValue.setText(modeLabel(MihomoCoreSettings .mode(this )))
@@ -246,6 +249,31 @@ class SettingsActivity : EdgeToEdgeActivity() {
246249 .show()
247250 }
248251
252+ private fun languageLabel (language : String ): Int = when (language) {
253+ AppSettings .LANGUAGE_ENGLISH -> R .string.language_english
254+ AppSettings .LANGUAGE_TRADITIONAL_CHINESE -> R .string.language_traditional_chinese
255+ AppSettings .LANGUAGE_SIMPLIFIED_CHINESE -> R .string.language_simplified_chinese
256+ AppSettings .LANGUAGE_FRENCH -> R .string.language_french
257+ AppSettings .LANGUAGE_INDONESIAN -> R .string.language_indonesian
258+ AppSettings .LANGUAGE_RUSSIAN -> R .string.language_russian
259+ else -> R .string.language_system
260+ }
261+
262+ private fun pickLanguage () {
263+ val languages = AppSettings .supportedLanguages
264+ val labels = languages.map { getString(languageLabel(it)) }.toTypedArray()
265+ MaterialAlertDialogBuilder (this )
266+ .setTitle(R .string.settings_language)
267+ .setSingleChoiceItems(labels, languages.indexOf(AppSettings .language(this ))) { dialog, which ->
268+ val language = languages[which]
269+ AppSettings .setLanguage(this , language)
270+ AppCompatDelegate .setApplicationLocales(LocaleListCompat .forLanguageTags(language))
271+ dialog.dismiss()
272+ }
273+ .setNegativeButton(android.R .string.cancel, null )
274+ .show()
275+ }
276+
249277 private fun writeBackup (uri : Uri ) {
250278 val ok = runCatching {
251279 contentResolver.openOutputStream(uri)?.use {
0 commit comments