feat: capsule view with DVD-case store art across all stores (#1117)

This commit is contained in:
Kurt Himebauch authored and GitHub committed 2026-10-19 08:45:58 -04:00
1 parent 60f40913a2
commit 4555fa266d
35 files changed
+76 -18

No files matched your search

@@ -119,7 +119,7 @@ object SessionPrefs {
}
val STORES_SORTS = listOf("lastPlayed", "recentlyInstalled", "titleAsc", "titleDesc", "sizeDesc", "sizeAsc", "releaseDateDesc")
val STORES_VIEWS = listOf("cards", "list")
val STORES_VIEWS = listOf("cards", "capsules", "list")
const val STORES_OPEN_LIBRARY = "library"
const val STORES_OPEN_STORE = "store"
@@ -90,6 +90,7 @@ import androidx.compose.material.icons.automirrored.filled.Login
import androidx.compose.material.icons.filled.GridView
import androidx.compose.material.icons.filled.Sort
import androidx.compose.material.icons.filled.ViewList
import androidx.compose.material.icons.filled.ViewModule
import com.droiddeck.launcher.stores.sortCatalogItems
import com.droiddeck.launcher.stores.retainCatalogOrder
import androidx.compose.foundation.layout.widthIn
@@ -803,6 +804,8 @@ private fun Storefront(
val headerItems = 1 + (if (sizeSortPending) 1 else 0) +
(if (StoresState.status[store] != null) 1 else 0) + (if (StoresState.problems[store] != null) 1 else 0)
val listMode = s.storesView == "list" && tab == "library"
val capsules = s.storesView == "capsules" && tab == "library"
val tileWidth = if (capsules) CapsuleWidth else CardWidth
val card: @Composable (CatalogItem) -> Unit = { item ->
val first = if (showGrid) item.key == visible.firstOrNull()?.key else !firstPlaced
firstPlaced = true
@@ -834,12 +837,12 @@ private fun Storefront(
}
}
if (listMode) GameListRow(item, store, installedKeys, onOpen, first, navigation)
else GameCard(item, store, s, a, installedKeys, onOpen, first, navigation)
else GameCard(item, store, s, a, installedKeys, onOpen, first, navigation, capsule = capsules)
}
LazyVerticalGrid(
columns = if (listMode) GridCells.Fixed(1) else GridCells.Adaptive(CardWidth), state = grid, modifier = Modifier.fillMaxSize().focusGroup().onSizeChanged {
columns = if (listMode) GridCells.Fixed(1) else GridCells.Adaptive(tileWidth), state = grid, modifier = Modifier.fillMaxSize().focusGroup().onSizeChanged {
val gap = with(density) { 10.dp.roundToPx() }
val minimum = with(density) { (if (listMode) CardWidth * 2 else CardWidth).roundToPx() }
val minimum = with(density) { (if (listMode) CardWidth * 2 else tileWidth).roundToPx() }
columns = ((it.width + gap) / (minimum + gap)).toInt().coerceAtLeast(1)
},
horizontalArrangement = Arrangement.spacedBy(10.dp), verticalArrangement = Arrangement.spacedBy(10.dp),
@@ -1094,12 +1097,13 @@ private fun SortButton(s: FrontEndState, a: FrontEndActions) {
@Composable
private fun ViewButton(s: FrontEndState, a: FrontEndActions) {
val list = s.storesView == "list"
val views = SessionPrefs.STORES_VIEWS
val next = views[(views.indexOf(s.storesView) + 1) % views.size]
HeaderIconButton(
if (list) stringResource(R.string.stores_view_cards) else stringResource(R.string.stores_view_list),
if (list) Icons.Filled.GridView else Icons.Filled.ViewList,
stringResource(when (next) { "capsules" -> R.string.stores_view_capsules; "list" -> R.string.stores_view_list; else -> R.string.stores_view_cards }),
when (next) { "capsules" -> Icons.Filled.ViewModule; "list" -> Icons.Filled.ViewList; else -> Icons.Filled.GridView },
"view",
) { a.onStoresView(if (list) "cards" else "list") }
) { a.onStoresView(next) }
}
@Composable
@@ -1226,9 +1230,13 @@ private fun LazyGridScope.storeGrid(games: List<CatalogItem>, empty: String, car
}
private val CardWidth = 112.dp
private val CapsuleWidth = 92.dp
@Composable
private fun GameCard(item: CatalogItem, store: Store, s: FrontEndState, a: FrontEndActions, installedKeys: Set<String>, onOpen: (String) -> Unit, first: Boolean = false, navigation: Modifier = Modifier) {
private fun GameCard(
item: CatalogItem, store: Store, s: FrontEndState, a: FrontEndActions, installedKeys: Set<String>, onOpen: (String) -> Unit,
first: Boolean = false, navigation: Modifier = Modifier, capsule: Boolean = false,
) {
val ctx = LocalContext.current
val colors = MaterialTheme.colorScheme
val pal = LocalPalette.current
@@ -1241,7 +1249,8 @@ private fun GameCard(item: CatalogItem, store: Store, s: FrontEndState, a: Front
val placed = remember { arrayOfNulls<androidx.compose.ui.layout.LayoutCoordinates>(1) }
val corner = with(androidx.compose.ui.platform.LocalDensity.current) { 10.dp.toPx() }
val open = {
placed[0]?.takeIf { it.isAttached }?.let { StoresMotion.markCard(CardMark(item.key, it.boundsInRoot(), corner, item.imageUrl ?: item.tallImageUrl)) }
val art = if (capsule) item.tallImageUrl ?: item.imageUrl else item.imageUrl ?: item.tallImageUrl
placed[0]?.takeIf { it.isAttached }?.let { StoresMotion.markCard(CardMark(item.key, it.boundsInRoot(), corner, art)) }
onOpen(item.key)
}
val screen = with(androidx.compose.ui.platform.LocalDensity.current) { androidx.compose.ui.platform.LocalConfiguration.current.screenHeightDp.dp.toPx() }
@@ -1259,7 +1268,7 @@ private fun GameCard(item: CatalogItem, store: Store, s: FrontEndState, a: Front
.clip(RoundedCornerShape(10.dp)).glideBorder(hot, RoundedCornerShape(10.dp), pal.signal, pal.line)
.hoverable(src).clickable(interactionSource = src, indication = LocalIndication.current, onClick = open).controllerConfirm(onClick = open),
) {
CardFace(item, download, hot) { CardMarker(item, installed, download) }
CardFace(item, download, hot, capsule) { CardMarker(item, installed, download, compact = capsule) }
}
}
@@ -1281,13 +1290,28 @@ private val CardStrip = 26.dp
@OptIn(androidx.compose.foundation.ExperimentalFoundationApi::class)
@Composable
private fun CardFace(item: CatalogItem, download: com.droiddeck.launcher.stores.download.DownloadEntry?, hot: Boolean, marker: @Composable () -> Unit) {
val url = item.imageUrl ?: item.tallImageUrl
private fun CardFace(
item: CatalogItem, download: com.droiddeck.launcher.stores.download.DownloadEntry?, hot: Boolean, capsule: Boolean = false,
marker: @Composable () -> Unit,
) {
val url = if (capsule) item.tallImageUrl ?: item.imageUrl else item.imageUrl ?: item.tallImageUrl
val blurs = android.os.Build.VERSION.SDK_INT >= 31
var landscape by remember(url) { mutableStateOf(false) }
BoxWithConstraints(Modifier.fillMaxWidth()) {
val total = maxWidth * 9f / 16f + CardStrip
val total = if (capsule) maxWidth * 7f / 5f + CardStrip else maxWidth * 9f / 16f + CardStrip
Box(Modifier.fillMaxWidth().height(total).background(Color(0xFF101318)).then(if (url == null) Modifier.background(artBrush(hueOf(item.title))) else Modifier)) {
if (url != null) AsyncImage(model = url, contentDescription = null, contentScale = ContentScale.Crop, modifier = Modifier.matchParentSize())
if (url != null && capsule && landscape) {
// Stores without portrait covers (itch) would lose most of the art to a portrait crop.
AsyncImage(model = url, contentDescription = null, contentScale = ContentScale.Crop, modifier = Modifier.matchParentSize().blur(24.dp))
Spacer(Modifier.matchParentSize().background(Color.Black.copy(alpha = if (blurs) 0.35f else 0.7f)))
AsyncImage(model = url, contentDescription = null, contentScale = ContentScale.Fit, modifier = Modifier.matchParentSize().padding(bottom = CardStrip))
} else if (url != null) AsyncImage(
model = url, contentDescription = null, contentScale = ContentScale.Crop, modifier = Modifier.matchParentSize(),
onSuccess = { r ->
val art = r.result.drawable
if (capsule && art.intrinsicWidth > 0 && art.intrinsicHeight > 0) landscape = art.intrinsicWidth > art.intrinsicHeight * 0.95f
},
)
Box(Modifier.align(Alignment.BottomCenter).fillMaxWidth().height(CardStrip).clipToBounds()) {
if (url != null) AsyncImage(
model = url, contentDescription = null, contentScale = ContentScale.Crop,
@@ -1315,7 +1339,7 @@ private fun CardFace(item: CatalogItem, download: com.droiddeck.launcher.stores.
}
@Composable
private fun CardMarker(item: CatalogItem, installed: Boolean, download: com.droiddeck.launcher.stores.download.DownloadEntry?) {
private fun CardMarker(item: CatalogItem, installed: Boolean, download: com.droiddeck.launcher.stores.download.DownloadEntry?, compact: Boolean = false) {
val colors = MaterialTheme.colorScheme
val pal = LocalPalette.current
val small = 10.sp
@@ -1323,12 +1347,13 @@ private fun CardMarker(item: CatalogItem, installed: Boolean, download: com.droi
installed -> Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(3.dp)) {
val ctx = LocalContext.current
val game = StoresState.installedGame(item.store, item.id)
if (game != null) androidx.compose.runtime.LaunchedEffect(item.key) { com.droiddeck.launcher.stores.StoreSizes.requestDisk(ctx, item.key, game) }
com.droiddeck.launcher.stores.StoreSizes.onDisk[item.key]?.let { Text(formatBytes(it), fontSize = 11.sp, fontWeight = FontWeight.Bold, color = Color.White, maxLines = 1) }
if (game != null && !compact) androidx.compose.runtime.LaunchedEffect(item.key) { com.droiddeck.launcher.stores.StoreSizes.requestDisk(ctx, item.key, game) }
if (!compact) com.droiddeck.launcher.stores.StoreSizes.onDisk[item.key]?.let { Text(formatBytes(it), fontSize = 11.sp, fontWeight = FontWeight.Bold, color = Color.White, maxLines = 1) }
Icon(Icons.Filled.Check, stringResource(R.string.stores_installed_chip), tint = pal.good, modifier = Modifier.size(11.dp))
}
download != null -> Text("${download.percent}%", fontSize = small, fontWeight = FontWeight.Bold, color = pal.signal, maxLines = 1)
item.owned && StoresState.isUnfinished(item) -> Text(stringResource(R.string.stores_resume), fontSize = small, fontWeight = FontWeight.Bold, color = pal.signal, maxLines = 1)
item.owned && compact -> Unit
item.owned -> com.droiddeck.launcher.stores.StoreSizes.size(item).takeIf { it > 0 }?.let { Text(formatBytes(it), fontSize = 11.sp, fontWeight = FontWeight.Bold, color = Color.White, maxLines = 1) }
item.isFree -> Text(stringResource(R.string.stores_free), fontSize = small, fontWeight = FontWeight.Bold, color = pal.good, maxLines = 1)
item.isDiscounted -> Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(4.dp)) {
+1
View File
@@ -2067,6 +2067,7 @@
<string name="stores_sort_release_date">تاريخ الإصدار</string>
<string name="stores_view_list">عرض القائمة</string>
<string name="stores_view_cards">عرض البطاقات</string>
<string name="stores_view_capsules">عرض الأغلفة</string>
<string name="stores_show_mature">إظهار المحتوى للبالغين</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
@@ -2024,6 +2024,7 @@
<string name="stores_sort_release_date">Fecha de lanzamiento</string>
<string name="stores_view_list">Vista de lista</string>
<string name="stores_view_cards">Vista de tarjetas</string>
<string name="stores_view_capsules">Vista de portadas</string>
<string name="stores_show_mature">Mostrar contenido para adultos</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1983,6 +1983,7 @@
<string name="stores_sort_release_date">Дата на издаване</string>
<string name="stores_view_list">Изглед на списък</string>
<string name="stores_view_cards">Изглед с карти</string>
<string name="stores_view_capsules">Изглед с обложки</string>
<string name="stores_show_mature">Показвай съдържание за възрастни</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -2025,6 +2025,7 @@
<string name="stores_sort_release_date">Datum vydání</string>
<string name="stores_view_list">Zobrazení seznamu</string>
<string name="stores_view_cards">Zobrazení karet</string>
<string name="stores_view_capsules">Zobrazení obalů</string>
<string name="stores_show_mature">Zobrazovat obsah pro dospělé</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1983,6 +1983,7 @@
<string name="stores_sort_release_date">Udgivelsesdato</string>
<string name="stores_view_list">Listevisning</string>
<string name="stores_view_cards">Kortvisning</string>
<string name="stores_view_capsules">Omslagsvisning</string>
<string name="stores_show_mature">Vis indhold for voksne</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1972,6 +1972,7 @@
<string name="stores_sort_release_date">Erscheinungsdatum</string>
<string name="stores_view_list">Listenansicht</string>
<string name="stores_view_cards">Kartenansicht</string>
<string name="stores_view_capsules">Coveransicht</string>
<string name="stores_show_mature">Inhalte für Erwachsene anzeigen</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1983,6 +1983,7 @@
<string name="stores_sort_release_date">Ημερομηνία κυκλοφορίας</string>
<string name="stores_view_list">Προβολή λίστας</string>
<string name="stores_view_cards">Προβολή καρτών</string>
<string name="stores_view_capsules">Προβολή εξωφύλλων</string>
<string name="stores_show_mature">Εμφάνιση περιεχομένου για ενήλικες</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -2001,6 +2001,7 @@
<string name="stores_sort_release_date">Fecha de lanzamiento</string>
<string name="stores_view_list">Vista de lista</string>
<string name="stores_view_cards">Vista de tarjetas</string>
<string name="stores_view_capsules">Vista de portadas</string>
<string name="stores_show_mature">Mostrar contenido para adultos</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1983,6 +1983,7 @@
<string name="stores_sort_release_date">Julkaisupäivä</string>
<string name="stores_view_list">Luettelonäkymä</string>
<string name="stores_view_cards">Korttinäkymä</string>
<string name="stores_view_capsules">Kansinäkymä</string>
<string name="stores_show_mature">Näytä aikuisille tarkoitettu sisältö</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -2001,6 +2001,7 @@
<string name="stores_sort_release_date">Date de sortie</string>
<string name="stores_view_list">Vue liste</string>
<string name="stores_view_cards">Vue cartes</string>
<string name="stores_view_capsules">Vue jaquettes</string>
<string name="stores_show_mature">Afficher le contenu pour adultes</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1983,6 +1983,7 @@
<string name="stores_sort_release_date">रिलीज़ तिथि</string>
<string name="stores_view_list">सूची दृश्य</string>
<string name="stores_view_cards">कार्ड दृश्य</string>
<string name="stores_view_capsules">कवर व्यू</string>
<string name="stores_show_mature">वयस्क कंटेंट दिखाएं</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1983,6 +1983,7 @@
<string name="stores_sort_release_date">Megjelenés dátuma</string>
<string name="stores_view_list">Listanézet</string>
<string name="stores_view_cards">Kártyanézet</string>
<string name="stores_view_capsules">Borítónézet</string>
<string name="stores_show_mature">Felnőtt tartalom megjelenítése</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1962,6 +1962,7 @@
<string name="stores_sort_release_date">Tanggal rilis</string>
<string name="stores_view_list">Tampilan daftar</string>
<string name="stores_view_cards">Tampilan kartu</string>
<string name="stores_view_capsules">Tampilan sampul</string>
<string name="stores_show_mature">Tampilkan konten dewasa</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1993,6 +1993,7 @@
<string name="stores_sort_release_date">Data di uscita</string>
<string name="stores_view_list">Visualizzazione elenco</string>
<string name="stores_view_cards">Visualizzazione schede</string>
<string name="stores_view_capsules">Vista copertine</string>
<string name="stores_show_mature">Mostra contenuti per adulti</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1962,6 +1962,7 @@
<string name="stores_sort_release_date">リリース日</string>
<string name="stores_view_list">リスト表示</string>
<string name="stores_view_cards">カード表示</string>
<string name="stores_view_capsules">パッケージ表示</string>
<string name="stores_show_mature">成人向けコンテンツを表示</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1962,6 +1962,7 @@
<string name="stores_sort_release_date">출시일</string>
<string name="stores_view_list">목록 보기</string>
<string name="stores_view_cards">카드 보기</string>
<string name="stores_view_capsules">표지 보기</string>
<string name="stores_show_mature">성인용 콘텐츠 표시</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1962,6 +1962,7 @@
<string name="stores_sort_release_date">Tarikh keluaran</string>
<string name="stores_view_list">Paparan senarai</string>
<string name="stores_view_cards">Paparan kad</string>
<string name="stores_view_capsules">Paparan kulit</string>
<string name="stores_show_mature">Papar kandungan matang</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1983,6 +1983,7 @@
<string name="stores_sort_release_date">Utgivelsesdato</string>
<string name="stores_view_list">Listevisning</string>
<string name="stores_view_cards">Kortvisning</string>
<string name="stores_view_capsules">Omslagsvisning</string>
<string name="stores_show_mature">Vis innhold for voksne</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1983,6 +1983,7 @@
<string name="stores_sort_release_date">Releasedatum</string>
<string name="stores_view_list">Lijstweergave</string>
<string name="stores_view_cards">Kaartweergave</string>
<string name="stores_view_capsules">Hoesweergave</string>
<string name="stores_show_mature">Inhoud voor volwassenen tonen</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -2025,6 +2025,7 @@
<string name="stores_sort_release_date">Data wydania</string>
<string name="stores_view_list">Widok listy</string>
<string name="stores_view_cards">Widok kart</string>
<string name="stores_view_capsules">Widok okładek</string>
<string name="stores_show_mature">Pokaż treści dla dorosłych</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
@@ -1993,6 +1993,7 @@
<string name="stores_sort_release_date">Data de lançamento</string>
<string name="stores_view_list">Vista de lista</string>
<string name="stores_view_cards">Vista de cartões</string>
<string name="stores_view_capsules">Vista de capas</string>
<string name="stores_show_mature">Mostrar conteúdo para adultos</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1993,6 +1993,7 @@
<string name="stores_sort_release_date">Data de lançamento</string>
<string name="stores_view_list">Vista de lista</string>
<string name="stores_view_cards">Vista de cartões</string>
<string name="stores_view_capsules">Visualização de capas</string>
<string name="stores_show_mature">Mostrar conteúdo adulto</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -2004,6 +2004,7 @@
<string name="stores_sort_release_date">Data lansării</string>
<string name="stores_view_list">Vizualizare listă</string>
<string name="stores_view_cards">Vizualizare carduri</string>
<string name="stores_view_capsules">Vizualizare coperți</string>
<string name="stores_show_mature">Arată conținutul pentru adulți</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -2022,6 +2022,7 @@
<string name="stores_sort_release_date">Дата выхода</string>
<string name="stores_view_list">Вид списком</string>
<string name="stores_view_cards">Вид карточками</string>
<string name="stores_view_capsules">Вид обложек</string>
<string name="stores_show_mature">Показывать контент для взрослых</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1983,6 +1983,7 @@
<string name="stores_sort_release_date">Utgivningsdatum</string>
<string name="stores_view_list">Listvy</string>
<string name="stores_view_cards">Kortvy</string>
<string name="stores_view_capsules">Omslagsvy</string>
<string name="stores_show_mature">Visa innehåll för vuxna</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1962,6 +1962,7 @@
<string name="stores_sort_release_date">วันวางจำหน่าย</string>
<string name="stores_view_list">มุมมองรายการ</string>
<string name="stores_view_cards">มุมมองการ์ด</string>
<string name="stores_view_capsules">มุมมองปก</string>
<string name="stores_show_mature">แสดงเนื้อหาสำหรับผู้ใหญ่</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1972,6 +1972,7 @@
<string name="stores_sort_release_date">Çıkış tarihi</string>
<string name="stores_view_list">Liste görünümü</string>
<string name="stores_view_cards">Kart görünümü</string>
<string name="stores_view_capsules">Kapak görünümü</string>
<string name="stores_show_mature">Yetişkin içeriği göster</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -2025,6 +2025,7 @@
<string name="stores_sort_release_date">Дата виходу</string>
<string name="stores_view_list">Вигляд списком</string>
<string name="stores_view_cards">Вигляд картками</string>
<string name="stores_view_capsules">Вигляд обкладинок</string>
<string name="stores_show_mature">Показувати контент для дорослих</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -1962,6 +1962,7 @@
<string name="stores_sort_release_date">Ngày phát hành</string>
<string name="stores_view_list">Chế độ danh sách</string>
<string name="stores_view_cards">Chế độ thẻ</string>
<string name="stores_view_capsules">Chế độ xem bìa</string>
<string name="stores_show_mature">Hiện nội dung người lớn</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
@@ -2038,6 +2038,7 @@
<string name="stores_sort_release_date">发行日期</string>
<string name="stores_view_list">列表视图</string>
<string name="stores_view_cards">卡片视图</string>
<string name="stores_view_capsules">封面视图</string>
<string name="stores_show_mature">显示成人内容</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
@@ -1962,6 +1962,7 @@
<string name="stores_sort_release_date">發行日期</string>
<string name="stores_view_list">列表檢視</string>
<string name="stores_view_cards">卡片檢視</string>
<string name="stores_view_capsules">封面檢視</string>
<string name="stores_show_mature">顯示成人內容</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
@@ -1962,6 +1962,7 @@
<string name="stores_sort_release_date">發行日期</string>
<string name="stores_view_list">列表檢視</string>
<string name="stores_view_cards">卡片檢視</string>
<string name="stores_view_capsules">封面檢視</string>
<string name="stores_show_mature">顯示成人內容</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>
+1
View File
@@ -2026,6 +2026,7 @@
<string name="stores_sort_release_date">Release date</string>
<string name="stores_view_list">List view</string>
<string name="stores_view_cards">Card view</string>
<string name="stores_view_capsules">Capsule view</string>
<string name="stores_show_mature">Show mature content</string>
<string name="epic_card_title">Epic</string>
<string name="epic_card_eos">EOS</string>