Update localization strings to use string formatting

This commit is contained in:
tapframe 2026-04-26 00:58:06 +05:30
parent 0fbdcf18c0
commit 7ef0083a71
7 changed files with 113 additions and 81 deletions

View file

@ -182,8 +182,8 @@
<string name="compose_player_style">Στυλ</string> <string name="compose_player_style">Στυλ</string>
<string name="compose_player_subs">Υπότιτλοι</string> <string name="compose_player_subs">Υπότιτλοι</string>
<string name="compose_player_subtitles">Υπότιτλοι</string> <string name="compose_player_subtitles">Υπότιτλοι</string>
<string name="compose_player_brightness_level">Φωτεινότητα %1$d%%</string> <string name="compose_player_brightness_level">Φωτεινότητα %1$s</string>
<string name="compose_player_volume_level">Ένταση ήχου %1$d%%</string> <string name="compose_player_volume_level">Ένταση ήχου %1$s</string>
<string name="compose_player_muted">Σε σίγαση</string> <string name="compose_player_muted">Σε σίγαση</string>
<string name="compose_player_downloaded">Κατέβηκε</string> <string name="compose_player_downloaded">Κατέβηκε</string>
<string name="compose_player_airs_prefix">Προβάλλεται</string> <string name="compose_player_airs_prefix">Προβάλλεται</string>

View file

@ -300,8 +300,8 @@
<string name="compose_player_style">Estilo</string> <string name="compose_player_style">Estilo</string>
<string name="compose_player_subs">Subs</string> <string name="compose_player_subs">Subs</string>
<string name="compose_player_subtitles">Subtítulos</string> <string name="compose_player_subtitles">Subtítulos</string>
<string name="compose_player_brightness_level">Brillo %1$d%%</string> <string name="compose_player_brightness_level">Brillo %1$s</string>
<string name="compose_player_volume_level">Volumen %1$d%%</string> <string name="compose_player_volume_level">Volumen %1$s</string>
<string name="compose_player_muted">Silenciado</string> <string name="compose_player_muted">Silenciado</string>
<string name="compose_player_downloaded">Descargado</string> <string name="compose_player_downloaded">Descargado</string>
<string name="compose_player_airs_prefix">Se emite</string> <string name="compose_player_airs_prefix">Se emite</string>

View file

@ -182,8 +182,8 @@
<string name="compose_player_style">Stile</string> <string name="compose_player_style">Stile</string>
<string name="compose_player_subs">Sub</string> <string name="compose_player_subs">Sub</string>
<string name="compose_player_subtitles">Sottotitoli</string> <string name="compose_player_subtitles">Sottotitoli</string>
<string name="compose_player_brightness_level">Luminosità %1$d%%</string> <string name="compose_player_brightness_level">Luminosità %1$s</string>
<string name="compose_player_volume_level">Volume %1$d%%</string> <string name="compose_player_volume_level">Volume %1$s</string>
<string name="compose_player_muted">Muto</string> <string name="compose_player_muted">Muto</string>
<string name="compose_player_downloaded">Scaricato</string> <string name="compose_player_downloaded">Scaricato</string>
<string name="compose_player_airs_prefix">In onda</string> <string name="compose_player_airs_prefix">In onda</string>

View file

@ -182,8 +182,8 @@
<string name="compose_player_style">Stil</string> <string name="compose_player_style">Stil</string>
<string name="compose_player_subs">Altyazı</string> <string name="compose_player_subs">Altyazı</string>
<string name="compose_player_subtitles">Altyazılar</string> <string name="compose_player_subtitles">Altyazılar</string>
<string name="compose_player_brightness_level">Parlaklık %1$d%%</string> <string name="compose_player_brightness_level">Parlaklık %1$s</string>
<string name="compose_player_volume_level">Ses %1$d%%</string> <string name="compose_player_volume_level">Ses %1$s</string>
<string name="compose_player_muted">Sessizde</string> <string name="compose_player_muted">Sessizde</string>
<string name="compose_player_downloaded">İndirildi</string> <string name="compose_player_downloaded">İndirildi</string>
<string name="compose_player_airs_prefix">Yayınlanma</string> <string name="compose_player_airs_prefix">Yayınlanma</string>
@ -1041,4 +1041,3 @@
<string name="unit_bytes_mb">MB</string> <string name="unit_bytes_mb">MB</string>
<string name="unit_bytes_gb">GB</string> <string name="unit_bytes_gb">GB</string>
</resources> </resources>

View file

@ -300,8 +300,8 @@
<string name="compose_player_style">Style</string> <string name="compose_player_style">Style</string>
<string name="compose_player_subs">Subs</string> <string name="compose_player_subs">Subs</string>
<string name="compose_player_subtitles">Subtitles</string> <string name="compose_player_subtitles">Subtitles</string>
<string name="compose_player_brightness_level">Brightness %1$d%%</string> <string name="compose_player_brightness_level">Brightness %1$s</string>
<string name="compose_player_volume_level">Volume %1$d%%</string> <string name="compose_player_volume_level">Volume %1$s</string>
<string name="compose_player_muted">Muted</string> <string name="compose_player_muted">Muted</string>
<string name="compose_player_downloaded">Downloaded</string> <string name="compose_player_downloaded">Downloaded</string>
<string name="compose_player_airs_prefix">Airs</string> <string name="compose_player_airs_prefix">Airs</string>

View file

@ -12,6 +12,7 @@ import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsets
@ -288,7 +289,7 @@ internal fun PauseMetadataOverlay(
horizontalSafePadding: Dp, horizontalSafePadding: Dp,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
Column( BoxWithConstraints(
modifier = modifier modifier = modifier
.background( .background(
Brush.horizontalGradient( Brush.horizontalGradient(
@ -298,12 +299,38 @@ internal fun PauseMetadataOverlay(
Color.Transparent, Color.Transparent,
), ),
), ),
) ),
) {
val compactHeight = maxHeight < 420.dp
val veryCompactHeight = maxHeight < 340.dp
val topPadding = if (compactHeight) 24.dp else 40.dp
val bottomPadding = when {
veryCompactHeight -> 24.dp
compactHeight -> 40.dp
else -> 120.dp
}
val logoHeight = when {
veryCompactHeight -> 48.dp
compactHeight -> 64.dp
else -> 96.dp
}
val titleFontScale = if (compactHeight) 1.35f else 1.8f
val descriptionStyle = if (compactHeight) {
MaterialTheme.nuvioTypeScale.bodyMd.copy(lineHeight = 20.sp)
} else {
MaterialTheme.nuvioTypeScale.bodyLg.copy(lineHeight = 24.sp)
}
val descriptionMaxLines = if (compactHeight) 2 else 3
val descriptionWidthFraction = if (compactHeight) 0.82f else 0.62f
Column(
modifier = Modifier
.fillMaxSize()
.padding( .padding(
start = horizontalSafePadding + metrics.horizontalPadding, start = horizontalSafePadding + metrics.horizontalPadding,
end = horizontalSafePadding + metrics.horizontalPadding, end = horizontalSafePadding + metrics.horizontalPadding,
top = 40.dp, top = topPadding,
bottom = 120.dp, bottom = bottomPadding,
), ),
verticalArrangement = Arrangement.Bottom, verticalArrangement = Arrangement.Bottom,
) { ) {
@ -312,7 +339,7 @@ internal fun PauseMetadataOverlay(
style = MaterialTheme.nuvioTypeScale.bodyLg, style = MaterialTheme.nuvioTypeScale.bodyLg,
color = Color(0xFFB8B8B8), color = Color(0xFFB8B8B8),
) )
androidx.compose.foundation.layout.Spacer(modifier = Modifier.height(12.dp)) androidx.compose.foundation.layout.Spacer(modifier = Modifier.height(if (compactHeight) 8.dp else 12.dp))
if (!logo.isNullOrBlank()) { if (!logo.isNullOrBlank()) {
AsyncImage( AsyncImage(
@ -320,17 +347,17 @@ internal fun PauseMetadataOverlay(
contentDescription = title, contentDescription = title,
contentScale = ContentScale.Fit, contentScale = ContentScale.Fit,
alignment = Alignment.BottomStart, alignment = Alignment.BottomStart,
modifier = Modifier.height(96.dp), modifier = Modifier.height(logoHeight),
) )
} else { } else {
Text( Text(
text = title, text = title,
style = MaterialTheme.nuvioTypeScale.displayMd.copy( style = MaterialTheme.nuvioTypeScale.displayMd.copy(
fontSize = max(metrics.titleSize.value * 1.8f, 32f).sp, fontSize = max(metrics.titleSize.value * titleFontScale, 32f).sp,
fontWeight = FontWeight.ExtraBold, fontWeight = FontWeight.ExtraBold,
), ),
color = Color.White, color = Color.White,
maxLines = 2, maxLines = if (compactHeight) 1 else 2,
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
) )
} }
@ -345,7 +372,7 @@ internal fun PauseMetadataOverlay(
text = episodeInfo, text = episodeInfo,
style = MaterialTheme.nuvioTypeScale.bodyLg, style = MaterialTheme.nuvioTypeScale.bodyLg,
color = Color(0xFFCCCCCC), color = Color(0xFFCCCCCC),
modifier = Modifier.padding(top = 8.dp), modifier = Modifier.padding(top = if (compactHeight) 6.dp else 8.dp),
) )
if (!episodeTitle.isNullOrBlank()) { if (!episodeTitle.isNullOrBlank()) {
@ -353,28 +380,29 @@ internal fun PauseMetadataOverlay(
text = episodeTitle, text = episodeTitle,
style = MaterialTheme.nuvioTypeScale.titleLg, style = MaterialTheme.nuvioTypeScale.titleLg,
color = Color.White, color = Color.White,
maxLines = 2, maxLines = if (compactHeight) 1 else 2,
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
modifier = Modifier.padding(top = 12.dp), modifier = Modifier.padding(top = if (compactHeight) 8.dp else 12.dp),
) )
} }
if (!pauseDescription.isNullOrBlank()) { if (!pauseDescription.isNullOrBlank()) {
Text( Text(
text = pauseDescription, text = pauseDescription,
style = MaterialTheme.nuvioTypeScale.bodyLg.copy(lineHeight = 24.sp), style = descriptionStyle,
color = Color(0xFFD6D6D6), color = Color(0xFFD6D6D6),
softWrap = true, softWrap = true,
textAlign = TextAlign.Start, textAlign = TextAlign.Start,
maxLines = 3, maxLines = descriptionMaxLines,
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
modifier = Modifier modifier = Modifier
.padding(top = 16.dp) .padding(top = if (compactHeight) 10.dp else 16.dp)
.fillMaxWidth(0.62f), .fillMaxWidth(descriptionWidthFraction),
) )
} }
} }
} }
}
@Composable @Composable
internal fun ErrorModal( internal fun ErrorModal(

View file

@ -1,6 +1,7 @@
package com.nuvio.app.features.player package com.nuvio.app.features.player
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut import androidx.compose.animation.fadeOut
import androidx.compose.foundation.background import androidx.compose.foundation.background
@ -586,7 +587,7 @@ fun PlayerScreen(
showGestureFeedback( showGestureFeedback(
GestureFeedbackState( GestureFeedbackState(
messageRes = Res.string.compose_player_brightness_level, messageRes = Res.string.compose_player_brightness_level,
messageArgs = listOf(percentage), messageArgs = listOf("$percentage%"),
icon = GestureFeedbackIcon.Brightness, icon = GestureFeedbackIcon.Brightness,
), ),
) )
@ -601,7 +602,7 @@ fun PlayerScreen(
} else { } else {
Res.string.compose_player_volume_level Res.string.compose_player_volume_level
}, },
messageArgs = if (level.isMuted) emptyList() else listOf(percentage), messageArgs = if (level.isMuted) emptyList() else listOf("$percentage%"),
icon = if (level.isMuted) GestureFeedbackIcon.VolumeMuted else GestureFeedbackIcon.Volume, icon = if (level.isMuted) GestureFeedbackIcon.VolumeMuted else GestureFeedbackIcon.Volume,
isDanger = level.isMuted, isDanger = level.isMuted,
), ),
@ -1539,7 +1540,11 @@ fun PlayerScreen(
}, },
) )
if (pausedOverlayVisible && !controlsVisible && !playerControlsLocked) { AnimatedVisibility(
visible = pausedOverlayVisible && !controlsVisible && !playerControlsLocked,
enter = fadeIn(animationSpec = tween(durationMillis = 220)),
exit = fadeOut(animationSpec = tween(durationMillis = 180)),
) {
PauseMetadataOverlay( PauseMetadataOverlay(
title = title, title = title,
logo = logo, logo = logo,