fix(i18n): localize settings order copy
Build & Deploy Pluriwave / Análisis de código (push) Successful in 24s
Build & Deploy Pluriwave / Build APK + AAB release (push) Successful in 1m44s

This commit is contained in:
2026-05-22 16:58:09 +02:00
parent aaeee51233
commit 157d52996e
29 changed files with 306 additions and 59 deletions
+29 -28
View File
@@ -572,6 +572,7 @@ class _SeccionEcualizador extends StatelessWidget {
return Consumer<EstadoRadio>(
builder: (ctx, estado, _) {
final disponible = estado.ecualizadorDisponible;
final l10n = AppLocalizations.of(ctx);
final emisoraActual = estado.emisoraActual;
final mostrarModoPorEmisora =
emisoraActual != null && estado.emisoraActualEsFavorita;
@@ -586,13 +587,13 @@ class _SeccionEcualizador extends StatelessWidget {
const Icon(Icons.equalizer),
const SizedBox(width: 12),
Text(
AppLocalizations.of(ctx).equalizerTitle,
l10n.equalizerTitle,
style: Theme.of(ctx).textTheme.titleMedium,
),
const Spacer(),
Chip(
label: Text(
estado.ecualizadorActivo ? AppLocalizations.of(ctx).equalizerActive : AppLocalizations.of(ctx).equalizerDisabled,
estado.ecualizadorActivo ? l10n.equalizerActive : l10n.equalizerDisabled,
),
visualDensity: VisualDensity.compact,
),
@@ -601,11 +602,11 @@ class _SeccionEcualizador extends StatelessWidget {
const SizedBox(height: 8),
SwitchListTile.adaptive(
contentPadding: EdgeInsets.zero,
title: Text(AppLocalizations.of(ctx).equalizerEnable),
title: Text(l10n.equalizerEnable),
subtitle: Text(
disponible
? 'Los cambios se aplican en tiempo real a la emisora actual.'
: 'Se guardan los cambios y se aplicarán cuando Android habilite el efecto.',
? l10n.equalizerRealtimeSubtitle
: l10n.equalizerPendingSubtitle,
),
value: estado.ecualizadorActivo,
onChanged: estado.cambiarEcualizadorActivo,
@@ -614,11 +615,11 @@ class _SeccionEcualizador extends StatelessWidget {
const SizedBox(height: 8),
SwitchListTile.adaptive(
contentPadding: EdgeInsets.zero,
title: Text(AppLocalizations.of(ctx).equalizerPerStationTitle),
title: Text(l10n.equalizerPerStationTitle),
subtitle: Text(
usandoEqPropio
? AppLocalizations.of(ctx).equalizerPerStationActive(emisoraActual.nombre)
: AppLocalizations.of(ctx).equalizerPerStationMain(emisoraActual.nombre),
? l10n.equalizerPerStationActive(emisoraActual.nombre)
: l10n.equalizerPerStationMain(emisoraActual.nombre),
),
value: usandoEqPropio,
onChanged:
@@ -652,6 +653,7 @@ class _SeccionOrdenListas extends StatelessWidget {
@override
Widget build(BuildContext context) {
final estado = context.watch<EstadoRadio>();
final l10n = AppLocalizations.of(context);
return PluriGlassSurface(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -661,23 +663,23 @@ class _SeccionOrdenListas extends StatelessWidget {
const Icon(Icons.sort_rounded),
const SizedBox(width: 12),
Text(
'Orden de emisoras',
l10n.stationOrderTitle,
style: Theme.of(context).textTheme.titleMedium,
),
],
),
const SizedBox(height: 8),
SegmentedButton<OrdenEmisoras>(
segments: const [
segments: [
ButtonSegment(
value: OrdenEmisoras.nombre,
icon: Icon(Icons.sort_by_alpha_rounded),
label: Text('Por nombre'),
icon: const Icon(Icons.sort_by_alpha_rounded),
label: Text(l10n.stationOrderByName),
),
ButtonSegment(
value: OrdenEmisoras.calidad,
icon: Icon(Icons.hd_rounded),
label: Text('Por calidad'),
icon: const Icon(Icons.hd_rounded),
label: Text(l10n.stationOrderByQuality),
),
],
selected: {estado.ordenListas},
@@ -687,7 +689,7 @@ class _SeccionOrdenListas extends StatelessWidget {
),
const SizedBox(height: 8),
Text(
'Se aplica a favoritos, b?squedas, emisoras cercanas y listados r?pidos.',
l10n.stationOrderScopeDescription,
style: Theme.of(context).textTheme.bodySmall,
),
],
@@ -837,6 +839,7 @@ class _SeccionEmisoraPreferida extends StatelessWidget {
@override
Widget build(BuildContext context) {
final estado = context.watch<EstadoRadio>();
final l10n = AppLocalizations.of(context);
final favoritas = estado.listaFavoritos;
final preferida = estado.emisoraPreferida;
final opciones = _opciones(estado, preferida);
@@ -850,25 +853,23 @@ class _SeccionEmisoraPreferida extends StatelessWidget {
const Icon(Icons.radio_rounded),
const SizedBox(width: 12),
Text(
AppLocalizations.of(context).preferredStationTitle,
l10n.preferredStationTitle,
style: Theme.of(context).textTheme.titleMedium,
),
],
),
const SizedBox(height: 8),
Text(
'Se preselecciona al crear alarmas y puede iniciarse como reproducción rápida.',
l10n.preferredStationDescription,
style: Theme.of(context).textTheme.bodySmall,
),
const SizedBox(height: 12),
if (opciones.isEmpty)
const ListTile(
ListTile(
contentPadding: EdgeInsets.zero,
leading: Icon(Icons.info_outline_rounded),
title: Text('Todavía no hay emisoras disponibles'),
subtitle: Text(
'Guardá favoritas o cargá emisoras para elegir una preferida.',
),
leading: const Icon(Icons.info_outline_rounded),
title: Text(l10n.preferredStationNoStationsTitle),
subtitle: Text(l10n.preferredStationNoStationsSubtitle),
)
else
DropdownButtonFormField<String>(
@@ -876,8 +877,8 @@ class _SeccionEmisoraPreferida extends StatelessWidget {
decoration: InputDecoration(
labelText:
favoritas.isEmpty
? 'Fallback automático'
: 'Favorita por defecto',
? l10n.preferredStationAutomaticFallback
: l10n.preferredStationDefaultFavorite,
),
items: [
for (final emisora in opciones)
@@ -900,15 +901,15 @@ class _SeccionEmisoraPreferida extends StatelessWidget {
const SizedBox(height: 8),
Text(
favoritas.any((e) => e.uuid == preferida.uuid)
? 'Preferida actual: ${preferida.nombre}'
: 'Sin favoritas: usando automáticamente ${preferida.nombre}',
? l10n.preferredStationCurrent(preferida.nombre)
: l10n.preferredStationAutoUsing(preferida.nombre),
),
const SizedBox(height: 8),
Align(
alignment: Alignment.centerLeft,
child: FilledButton.tonalIcon(
icon: const Icon(Icons.play_arrow_rounded),
label: Text(AppLocalizations.of(context).preferredStationPlay),
label: Text(l10n.preferredStationPlay),
onPressed:
() => context.read<EstadoRadio>().reproducirEmisoraPreferida(),
),