fix: 简繁体转换

This commit is contained in:
HapeLee committed 2026-06-11 15:42:31 +08:00
1 parent a94dc88a57
commit dbe5863aa4
4 files changed
+24 -69

No files matched your search

@@ -1543,7 +1543,7 @@ private fun MenuBottomBar(
pageButtons.chunked(itemsPerRow).forEach { rowButtons -> pageButtons.chunked(itemsPerRow).forEach { rowButtons ->
Row( Row(
horizontalArrangement = when { horizontalArrangement = when {
rowButtons.size > 3 -> Arrangement.SpaceBetween rowButtons.size > 1 -> Arrangement.SpaceBetween
else -> Arrangement.spacedBy(32.dp, Alignment.CenterHorizontally) else -> Arrangement.spacedBy(32.dp, Alignment.CenterHorizontally)
}, },
modifier = Modifier modifier = Modifier
@@ -1,35 +1,24 @@
package io.legado.app.ui.book.read.sheet package io.legado.app.ui.book.read.sheet
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringArrayResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import io.legado.app.R import io.legado.app.R
import io.legado.app.data.entities.ReplaceRule
import io.legado.app.data.repository.ReadSettingsRepository
import io.legado.app.model.ReadBook import io.legado.app.model.ReadBook
import io.legado.app.ui.theme.LegadoTheme
import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
import kotlinx.coroutines.launch
import org.koin.compose.koinInject
@Composable @Composable
fun EffectiveReplacesSheet( fun EffectiveReplacesSheet(
@@ -41,19 +30,8 @@ fun EffectiveReplacesSheet(
val effectiveRules = remember { val effectiveRules = remember {
ReadBook.curTextChapter?.effectiveReplaceRules ?: emptyList() ReadBook.curTextChapter?.effectiveReplaceRules ?: emptyList()
} }
val scope = rememberCoroutineScope()
val readSettingsRepository: ReadSettingsRepository = koinInject()
val preferences by readSettingsRepository.preferences.collectAsStateWithLifecycle(
initialValue = io.legado.app.data.repository.ReadPreferences()
)
val showChineseConvert = preferences.chineseConverterType > 0
val chineseConvert = remember { ReplaceRule(0, "繁简转换") }
val items = remember(effectiveRules, showChineseConvert) {
if (showChineseConvert) effectiveRules + chineseConvert else effectiveRules
}
var isEdited by remember { mutableStateOf(false) } var isEdited by remember { mutableStateOf(false) }
var showChineseConvertDialog by remember { mutableStateOf(false) }
AppModalBottomSheet( AppModalBottomSheet(
show = show, show = show,
@@ -66,60 +44,19 @@ fun EffectiveReplacesSheet(
LazyColumn( LazyColumn(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
) { ) {
items(items, key = { it.id }) { rule -> items(effectiveRules, key = { it.id }) { rule ->
Text( Text(
text = rule.name, text = rule.name,
style = MaterialTheme.typography.bodyLarge, style = MaterialTheme.typography.bodyLarge,
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.clickable { .clickable {
if (rule == chineseConvert) {
showChineseConvertDialog = true
} else {
onOpenReplaceEditor(rule.id, rule.pattern) onOpenReplaceEditor(rule.id, rule.pattern)
} }
}
.padding(vertical = 12.dp), .padding(vertical = 12.dp),
) )
HorizontalDivider() HorizontalDivider()
} }
} }
} }
if (showChineseConvertDialog) {
val modes = stringArrayResource(R.array.chinese_mode)
AlertDialog(
onDismissRequest = { showChineseConvertDialog = false },
containerColor = LegadoTheme.colorScheme.surfaceContainer,
title = { Text(stringResource(R.string.chinese_converter)) },
text = {
Column {
modes.forEachIndexed { index, mode ->
Text(
text = mode,
style = MaterialTheme.typography.bodyLarge,
modifier = Modifier
.fillMaxWidth()
.clickable {
if (preferences.chineseConverterType != index) {
scope.launch {
readSettingsRepository.setChineseConverterType(index)
}
isEdited = true
}
showChineseConvertDialog = false
}
.padding(vertical = 12.dp),
)
}
}
},
confirmButton = {},
dismissButton = {
TextButton(onClick = { showChineseConvertDialog = false }) {
Text(stringResource(R.string.cancel))
}
},
)
}
} }
@@ -30,24 +30,24 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringArrayResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.legado.app.R import io.legado.app.R
import io.legado.app.help.config.ReadBookConfig
import io.legado.app.ui.book.read.ConfigUpdate import io.legado.app.ui.book.read.ConfigUpdate
import io.legado.app.ui.book.read.ReadBookIntent import io.legado.app.ui.book.read.ReadBookIntent
import io.legado.app.help.config.ReadBookConfig import io.legado.app.ui.config.readConfig.ReadConfig
import io.legado.app.ui.widget.components.dialog.ColorPickerSheet import io.legado.app.ui.widget.components.dialog.ColorPickerSheet
import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
import io.legado.app.ui.widget.components.settingItem.TinyClickableSettingItem import io.legado.app.ui.widget.components.settingItem.TinyClickableSettingItem
import io.legado.app.ui.widget.components.settingItem.TinyColorSettingItem import io.legado.app.ui.widget.components.settingItem.TinyColorSettingItem
import io.legado.app.ui.widget.components.settingItem.TinyDropdownSettingItem import io.legado.app.ui.widget.components.settingItem.TinyDropdownSettingItem
import io.legado.app.ui.widget.components.settingItem.TinySliderSettingItem import io.legado.app.ui.widget.components.settingItem.TinySliderSettingItem
import io.legado.app.ui.widget.components.settingItem.TinySwitchSettingItem import io.legado.app.ui.widget.components.settingItem.TinySwitchSettingItem
import io.legado.app.ui.widget.components.tabRow.CardTabRow import io.legado.app.ui.widget.components.tabRow.CardTabRow
import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
// Color picker IDs // Color picker IDs
@@ -304,6 +304,19 @@ internal fun TextEffectsPage(
imageVector = Icons.Default.TextFields, imageVector = Icons.Default.TextFields,
onClick = onOpenFontSelect, onClick = onOpenFontSelect,
) )
val chineseConvertEntries = stringArrayResource(R.array.chinese_mode)
val chineseConvertValues = remember { arrayOf("0", "1", "2") }
TinyDropdownSettingItem(
title = stringResource(R.string.chinese_converter),
selectedValue = ReadConfig.chineseConverterType.toString(),
displayEntries = chineseConvertEntries,
entryValues = chineseConvertValues,
onValueChange = {
onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.ChineseConverterType(it.toInt())))
},
)
Spacer(Modifier.height(8.dp)) Spacer(Modifier.height(8.dp))
// Colors // Colors
@@ -246,4 +246,9 @@ object ReadConfig {
PreferKey.ttsEngine, PreferKey.ttsEngine,
null null
) )
var chineseConverterType by prefDelegate(
PreferKey.chineseConverterType,
0
)
} }