Skip to content

Commit f66cead

Browse files
committed
fix: apply app language to window dialogs
1 parent 831ae82 commit f66cead

5 files changed

Lines changed: 47 additions & 9 deletions

File tree

app/src/main/kotlin/app/App.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import features.proxy.server.usecase.ProxyServerImportFileUseCase
2626
import features.proxy.server.usecase.ProxyServiceUseCase
2727
import features.resources.ResourceFileUseCase
2828
import features.settings.locale.ProvideAppLanguage
29+
import features.settings.locale.RecreateActivityOnAppLanguageChange
2930
import features.settings.usecase.SwitchRunModeUseCase
3031
import features.settings.usecase.TproxyBootScriptUseCase
3132
import features.subscription.runtime.AndroidSubscriptionFetcher
@@ -151,6 +152,7 @@ fun App(
151152
{ transform -> stateStore.update(transform) }
152153
}
153154
val keyColor = keyColorFor(chromeState.seedIndex)
155+
RecreateActivityOnAppLanguageChange(languageMode = chromeState.languageMode)
154156
ProxyStatusSynchronizer(
155157
stateStore = stateStore,
156158
proxyEngine = proxyEngine,

app/src/main/kotlin/app/MainActivity.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package app
55

66
import android.Manifest
7+
import android.content.Context
78
import android.content.Intent
89
import android.content.pm.PackageManager
910
import android.os.Build
@@ -19,10 +20,12 @@ import androidx.compose.foundation.layout.systemBars
1920
import androidx.compose.foundation.layout.union
2021
import com.journeyapps.barcodescanner.ScanContract
2122
import data.AndroidAppStateStore
23+
import data.AppSettingsPreferences
2224
import engine.vpn.AndroidVpnPermissionRequester
2325
import features.logs.AndroidLogFileCreator
2426
import features.proxy.server.qr.AndroidQrCodeScanRequester
2527
import features.resources.runtime.AndroidResourceFilePicker
28+
import features.settings.locale.localizedAppContext
2629
import features.subscription.SubscriptionInstallConfigUseCase
2730
import features.subscription.isSubscriptionInstallConfigUri
2831
import features.subscription.runtime.AndroidSubscriptionFetcher
@@ -100,6 +103,11 @@ class MainActivity : ComponentActivity() {
100103
logFileCreator.complete(uri)
101104
}
102105

106+
override fun attachBaseContext(newBase: Context) {
107+
val languageMode = AppSettingsPreferences(newBase).load().languageMode
108+
super.attachBaseContext(newBase.localizedAppContext(languageMode))
109+
}
110+
103111
override fun onCreate(savedInstanceState: Bundle?) {
104112
super.onCreate(savedInstanceState)
105113
vpnPermissionRequester.registerLauncher { intent ->

app/src/main/kotlin/features/logs/CoreLogRepository.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
package features.logs
55

6-
import java.time.LocalDateTime
6+
import java.util.Calendar
77
import kotlinx.coroutines.flow.MutableStateFlow
88
import kotlinx.coroutines.flow.StateFlow
99
import kotlinx.coroutines.flow.asStateFlow
@@ -85,19 +85,19 @@ private fun String.normalizedLogLevel(): String {
8585
}
8686

8787
fun currentLogTime(): String {
88-
val dateTime = LocalDateTime.now()
88+
val calendar = Calendar.getInstance()
8989
return buildString {
90-
append(dateTime.year)
90+
append(calendar.get(Calendar.YEAR))
9191
append('-')
92-
append(dateTime.monthValue.twoDigits())
92+
append((calendar.get(Calendar.MONTH) + 1).twoDigits())
9393
append('-')
94-
append(dateTime.dayOfMonth.twoDigits())
94+
append(calendar.get(Calendar.DAY_OF_MONTH).twoDigits())
9595
append(' ')
96-
append(dateTime.hour.twoDigits())
96+
append(calendar.get(Calendar.HOUR_OF_DAY).twoDigits())
9797
append(':')
98-
append(dateTime.minute.twoDigits())
98+
append(calendar.get(Calendar.MINUTE).twoDigits())
9999
append(':')
100-
append(dateTime.second.twoDigits())
100+
append(calendar.get(Calendar.SECOND).twoDigits())
101101
}
102102
}
103103

app/src/main/kotlin/features/settings/locale/AppLocale.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,19 @@
33

44
package features.settings.locale
55

6+
import android.app.Activity
67
import android.content.Context
8+
import android.content.ContextWrapper
79
import android.content.res.Configuration
810
import android.os.LocaleList
911
import androidx.compose.runtime.Composable
1012
import androidx.compose.runtime.CompositionLocalProvider
13+
import androidx.compose.runtime.LaunchedEffect
1114
import androidx.compose.runtime.SideEffect
15+
import androidx.compose.runtime.getValue
16+
import androidx.compose.runtime.mutableIntStateOf
1217
import androidx.compose.runtime.remember
18+
import androidx.compose.runtime.setValue
1319
import androidx.compose.ui.platform.LocalConfiguration
1420
import androidx.compose.ui.platform.LocalContext
1521
import app.modes.LanguageModeEnglish
@@ -49,6 +55,20 @@ fun ProvideAppLanguage(
4955
)
5056
}
5157

58+
@Composable
59+
fun RecreateActivityOnAppLanguageChange(languageMode: Int) {
60+
val activity = LocalContext.current.findActivity()
61+
var previousLanguageMode by remember { mutableIntStateOf(languageMode) }
62+
63+
LaunchedEffect(activity, languageMode) {
64+
if (previousLanguageMode == languageMode) {
65+
return@LaunchedEffect
66+
}
67+
previousLanguageMode = languageMode
68+
activity?.recreate()
69+
}
70+
}
71+
5272
private fun String?.toAppLocale(systemLocale: Locale): Locale {
5373
return this?.let(Locale::forLanguageTag) ?: systemLocale
5474
}
@@ -68,3 +88,11 @@ private fun Context.localizedConfiguration(locale: Locale): Configuration {
6888
setLayoutDirection(locale)
6989
}
7090
}
91+
92+
private tailrec fun Context.findActivity(): Activity? {
93+
return when (this) {
94+
is Activity -> this
95+
is ContextWrapper -> baseContext.findActivity()
96+
else -> null
97+
}
98+
}

buildSrc/src/main/kotlin/BuildConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import org.gradle.api.tasks.TaskAction
1111
object ProjectConfig {
1212
const val JVM_VERSION = 25
1313
const val PROJECT_NAME = "AsteriskNG"
14-
const val VERSION_NAME = "1.1.1"
14+
const val VERSION_NAME = "1.2.0-dev"
1515
const val PACKAGE_NAME = "org.asterisk.zcc.ang"
1616
const val XRAY_CORE_VERSION = "v26.5.9"
1717
const val ANDROID_LIB_XRAY_LITE_VERSION = "v26.5.19"

0 commit comments

Comments
 (0)