Просмотр исходного кода

fix: preserve locale mirror before platform sync

HapeLee 3 месяцев назад
Родитель
Сommit
2139f9f4f0

+ 6 - 1
app/src/main/java/io/legado/app/data/repository/AppLocaleRepository.kt

@@ -34,8 +34,13 @@ class AppLocaleRepository internal constructor(
 ) : AppLocaleGateway {
 
     private var mirroredLanguage = normalizeLanguage(readPersistedLanguage())
+    private val initialPlatformLocales = platform.getApplicationLocales()
     private val _language = MutableStateFlow(
-        languageForLocaleList(platform.getApplicationLocales())
+        if (initialPlatformLocales.isEmpty) {
+            mirroredLanguage
+        } else {
+            languageForLocaleList(initialPlatformLocales)
+        }
     )
     override val language = _language.asStateFlow()
     override val currentLanguage: String

+ 11 - 0
app/src/test/java/io/legado/app/data/repository/AppLocaleRepositoryTest.kt

@@ -11,6 +11,17 @@ import org.robolectric.annotation.Config
 @Config(sdk = [35])
 class AppLocaleRepositoryTest {
 
+    @Test
+    fun initialization_keepsPersistedLanguageWhenPlatformLocalesAreNotReady() {
+        val repository = AppLocaleRepository(
+            FakeAppLocalePlatform(),
+            { },
+            { "zh" },
+        )
+
+        assertEquals("zh", repository.currentLanguage)
+    }
+
     @Test
     fun setLanguage_updatesPlatformStateAndMirror() {
         val platform = FakeAppLocalePlatform()