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
+11 -10
View File
@@ -33,17 +33,18 @@
## Búsqueda de emisoras
- [ ] Añadir filtro de calidad mínima de reproducción en kbps en el buscador de emisoras.
- [x] Añadir filtro de calidad mínima de reproducción en kbps en el buscador de emisoras.
## Favoritos
- [ ] Revisar el sistema de guardado de favoritos en instalaciones nuevas y migradas: inicializaci?n de SQLite, creaci?n de ruta/base de datos, migraciones de columnas y refresco de estado tras guardar. Reporte: en un m?vil no se est?n guardando favoritos.
- [ ] A?adir tests de regresi?n para favoritos en base de datos real/migrada, incluyendo esquemas antiguos y primera instalaci?n limpia.
- [ ] Revisar el sistema de guardado de favoritos en instalaciones nuevas y migradas: inicialización de SQLite, creación de ruta/base de datos, migraciones de columnas y refresco de estado tras guardar. Reporte: en un móvil no se están guardando favoritos.
- [ ] Añadir tests de regresión para favoritos en base de datos real/migrada, incluyendo esquemas antiguos y primera instalación limpia.
## Agrupaciones de favoritos
- [ ] Permitir crear listas de favoritos con nombre corto configurable por el usuario desde Ajustes.
- [ ] Mantener siempre un grupo interno por defecto traducible llamado "Sin asignar", no editable y no borrable.
- [ ] Gestionar desde la vista Favoritos qu? emisoras pertenecen a cada agrupaci?n/lista.
- [x] Dise?ar migraci?n SQLite base para asociar favoritos existentes al grupo "Sin asignar" sin perder datos.
- [ ] Completar UI en Ajustes para crear, editar y borrar listas de favoritos.
- [ ] Completar UI en Favoritos para mover emisoras entre listas.
- [x] Permitir crear listas de favoritos con nombre corto configurable por el usuario desde Ajustes.
- [x] Mantener siempre un grupo interno por defecto traducible llamado "Sin asignar", no editable y no borrable.
- [x] Gestionar desde la vista Favoritos qué emisoras pertenecen a cada agrupación/lista.
- [x] Diseñar migración SQLite base para asociar favoritos existentes al grupo "Sin asignar" sin perder datos.
- [x] Completar UI en Ajustes para crear, editar y borrar listas de favoritos.
- [x] Completar UI en Favoritos para mover emisoras entre listas.
+4
View File
@@ -176,6 +176,10 @@
}
}
},
"stationOrderTitle": "Station order",
"stationOrderByName": "By name",
"stationOrderByQuality": "By quality",
"stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.",
"favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list",
+4
View File
@@ -176,6 +176,10 @@
}
}
},
"stationOrderTitle": "Station order",
"stationOrderByName": "By name",
"stationOrderByQuality": "By quality",
"stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.",
"favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list",
+4
View File
@@ -176,6 +176,10 @@
}
}
},
"stationOrderTitle": "Station order",
"stationOrderByName": "By name",
"stationOrderByQuality": "By quality",
"stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.",
"favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list",
+4
View File
@@ -176,6 +176,10 @@
}
}
},
"stationOrderTitle": "Station order",
"stationOrderByName": "By name",
"stationOrderByQuality": "By quality",
"stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.",
"favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list",
+11 -7
View File
@@ -176,13 +176,17 @@
}
}
},
"stationOrderTitle": "Orden de emisoras",
"stationOrderByName": "Por nombre",
"stationOrderByQuality": "Por calidad",
"stationOrderScopeDescription": "Se aplica a favoritos, búsquedas, emisoras cercanas y listados rápidos.",
"favoriteGroupsTitle": "Listas de favoritos",
"favoriteGroupsDescription": "Cre? listas cortas para organizar tus emisoras guardadas.",
"favoriteGroupsAdd": "A?adir lista",
"favoriteGroupsDescription": "Creá listas cortas para organizar tus emisoras guardadas.",
"favoriteGroupsAdd": "Añadir lista",
"favoriteGroupsEdit": "Editar lista",
"favoriteGroupsDelete": "Eliminar lista",
"favoriteGroupsNameLabel": "Nombre de la lista",
"favoriteGroupsNameTooLong": "M?ximo 28 caracteres.",
"favoriteGroupsNameTooLong": "Máximo 28 caracteres.",
"favoriteGroupsUnassigned": "Sin asignar",
"favoriteGroupsProtectedHint": "Lista por defecto: no se puede editar ni borrar.",
"favoriteGroupsCreated": "Lista creada",
@@ -192,10 +196,10 @@
"favoriteGroupsAssignSubtitle": "Lista actual: {groupName}",
"favoriteGroupsAssigned": "{stationName} movida a {groupName}",
"favoritesTitle": "Favoritos",
"favoritesEmptyTitle": "Sin favoritos a?n",
"favoritesEmptySubtitle": "Toc? el coraz?n en cualquier emisora para guardarla en tu colecci?n.",
"favoritesHeaderSubtitle": "Organiz? tu colecci?n por listas y dej? cerca las radios importantes.",
"favoritesCollection": "Colecci?n",
"favoritesEmptyTitle": "Sin favoritos aún",
"favoritesEmptySubtitle": "Tocá el corazón en cualquier emisora para guardarla en tu colección.",
"favoritesHeaderSubtitle": "Organizá tu colección por listas y dejá cerca las radios importantes.",
"favoritesCollection": "Colección",
"favoritesSavedCount": "{count} guardadas",
"favoritesRemoveTooltip": "Eliminar de favoritos",
"favoritesRemovedMessage": "{stationName} eliminada de favoritos",
+4
View File
@@ -176,6 +176,10 @@
}
}
},
"stationOrderTitle": "Station order",
"stationOrderByName": "By name",
"stationOrderByQuality": "By quality",
"stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.",
"favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list",
+4
View File
@@ -176,6 +176,10 @@
}
}
},
"stationOrderTitle": "Station order",
"stationOrderByName": "By name",
"stationOrderByQuality": "By quality",
"stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.",
"favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list",
+4
View File
@@ -176,6 +176,10 @@
}
}
},
"stationOrderTitle": "Station order",
"stationOrderByName": "By name",
"stationOrderByQuality": "By quality",
"stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.",
"favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list",
+4
View File
@@ -176,6 +176,10 @@
}
}
},
"stationOrderTitle": "Station order",
"stationOrderByName": "By name",
"stationOrderByQuality": "By quality",
"stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.",
"favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list",
+4
View File
@@ -176,6 +176,10 @@
}
}
},
"stationOrderTitle": "Station order",
"stationOrderByName": "By name",
"stationOrderByQuality": "By quality",
"stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.",
"favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list",
+4
View File
@@ -176,6 +176,10 @@
}
}
},
"stationOrderTitle": "Station order",
"stationOrderByName": "By name",
"stationOrderByQuality": "By quality",
"stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.",
"favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list",
+4
View File
@@ -176,6 +176,10 @@
}
}
},
"stationOrderTitle": "Station order",
"stationOrderByName": "By name",
"stationOrderByQuality": "By quality",
"stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.",
"favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list",
+4
View File
@@ -176,6 +176,10 @@
}
}
},
"stationOrderTitle": "Station order",
"stationOrderByName": "By name",
"stationOrderByQuality": "By quality",
"stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.",
"favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list",
+31 -7
View File
@@ -732,6 +732,30 @@ abstract class AppLocalizations {
/// **'Límite de grabación actualizado a {size} MB'**
String recordingsMaxSizeSaved(int size);
/// No description provided for @stationOrderTitle.
///
/// In es, this message translates to:
/// **'Orden de emisoras'**
String get stationOrderTitle;
/// No description provided for @stationOrderByName.
///
/// In es, this message translates to:
/// **'Por nombre'**
String get stationOrderByName;
/// No description provided for @stationOrderByQuality.
///
/// In es, this message translates to:
/// **'Por calidad'**
String get stationOrderByQuality;
/// No description provided for @stationOrderScopeDescription.
///
/// In es, this message translates to:
/// **'Se aplica a favoritos, búsquedas, emisoras cercanas y listados rápidos.'**
String get stationOrderScopeDescription;
/// No description provided for @favoriteGroupsTitle.
///
/// In es, this message translates to:
@@ -741,13 +765,13 @@ abstract class AppLocalizations {
/// No description provided for @favoriteGroupsDescription.
///
/// In es, this message translates to:
/// **'Cre? listas cortas para organizar tus emisoras guardadas.'**
/// **'Creá listas cortas para organizar tus emisoras guardadas.'**
String get favoriteGroupsDescription;
/// No description provided for @favoriteGroupsAdd.
///
/// In es, this message translates to:
/// **'A?adir lista'**
/// **'Añadir lista'**
String get favoriteGroupsAdd;
/// No description provided for @favoriteGroupsEdit.
@@ -771,7 +795,7 @@ abstract class AppLocalizations {
/// No description provided for @favoriteGroupsNameTooLong.
///
/// In es, this message translates to:
/// **'M?ximo 28 caracteres.'**
/// **'Máximo 28 caracteres.'**
String get favoriteGroupsNameTooLong;
/// No description provided for @favoriteGroupsUnassigned.
@@ -831,25 +855,25 @@ abstract class AppLocalizations {
/// No description provided for @favoritesEmptyTitle.
///
/// In es, this message translates to:
/// **'Sin favoritos a?n'**
/// **'Sin favoritos aún'**
String get favoritesEmptyTitle;
/// No description provided for @favoritesEmptySubtitle.
///
/// In es, this message translates to:
/// **'Toc? el coraz?n en cualquier emisora para guardarla en tu colecci?n.'**
/// **'Tocá el corazón en cualquier emisora para guardarla en tu colección.'**
String get favoritesEmptySubtitle;
/// No description provided for @favoritesHeaderSubtitle.
///
/// In es, this message translates to:
/// **'Organiz? tu colecci?n por listas y dej? cerca las radios importantes.'**
/// **'Organizá tu colección por listas y dejá cerca las radios importantes.'**
String get favoritesHeaderSubtitle;
/// No description provided for @favoritesCollection.
///
/// In es, this message translates to:
/// **'Colecci?n'**
/// **'Colección'**
String get favoritesCollection;
/// No description provided for @favoritesSavedCount.
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsAr extends AppLocalizations {
return 'Recording limit updated to $size MB';
}
@override
String get stationOrderTitle => 'Station order';
@override
String get stationOrderByName => 'By name';
@override
String get stationOrderByQuality => 'By quality';
@override
String get stationOrderScopeDescription =>
'Applies to favorites, searches, nearby stations and quick lists.';
@override
String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsBn extends AppLocalizations {
return 'Recording limit updated to $size MB';
}
@override
String get stationOrderTitle => 'Station order';
@override
String get stationOrderByName => 'By name';
@override
String get stationOrderByQuality => 'By quality';
@override
String get stationOrderScopeDescription =>
'Applies to favorites, searches, nearby stations and quick lists.';
@override
String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsDe extends AppLocalizations {
return 'Recording limit updated to $size MB';
}
@override
String get stationOrderTitle => 'Station order';
@override
String get stationOrderByName => 'By name';
@override
String get stationOrderByQuality => 'By quality';
@override
String get stationOrderScopeDescription =>
'Applies to favorites, searches, nearby stations and quick lists.';
@override
String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsEn extends AppLocalizations {
return 'Recording limit updated to $size MB';
}
@override
String get stationOrderTitle => 'Station order';
@override
String get stationOrderByName => 'By name';
@override
String get stationOrderByQuality => 'By quality';
@override
String get stationOrderScopeDescription =>
'Applies to favorites, searches, nearby stations and quick lists.';
@override
String get favoriteGroupsTitle => 'Favorite lists';
+20 -7
View File
@@ -357,15 +357,28 @@ class AppLocalizationsEs extends AppLocalizations {
return 'Límite de grabación actualizado a $size MB';
}
@override
String get stationOrderTitle => 'Orden de emisoras';
@override
String get stationOrderByName => 'Por nombre';
@override
String get stationOrderByQuality => 'Por calidad';
@override
String get stationOrderScopeDescription =>
'Se aplica a favoritos, búsquedas, emisoras cercanas y listados rápidos.';
@override
String get favoriteGroupsTitle => 'Listas de favoritos';
@override
String get favoriteGroupsDescription =>
'Cre? listas cortas para organizar tus emisoras guardadas.';
'Creá listas cortas para organizar tus emisoras guardadas.';
@override
String get favoriteGroupsAdd => 'A?adir lista';
String get favoriteGroupsAdd => 'Añadir lista';
@override
String get favoriteGroupsEdit => 'Editar lista';
@@ -377,7 +390,7 @@ class AppLocalizationsEs extends AppLocalizations {
String get favoriteGroupsNameLabel => 'Nombre de la lista';
@override
String get favoriteGroupsNameTooLong => 'M?ximo 28 caracteres.';
String get favoriteGroupsNameTooLong => 'Máximo 28 caracteres.';
@override
String get favoriteGroupsUnassigned => 'Sin asignar';
@@ -413,18 +426,18 @@ class AppLocalizationsEs extends AppLocalizations {
String get favoritesTitle => 'Favoritos';
@override
String get favoritesEmptyTitle => 'Sin favoritos a?n';
String get favoritesEmptyTitle => 'Sin favoritos aún';
@override
String get favoritesEmptySubtitle =>
'Toc? el coraz?n en cualquier emisora para guardarla en tu colecci?n.';
'Tocá el corazón en cualquier emisora para guardarla en tu colección.';
@override
String get favoritesHeaderSubtitle =>
'Organiz? tu colecci?n por listas y dej? cerca las radios importantes.';
'Organizá tu colección por listas y dejá cerca las radios importantes.';
@override
String get favoritesCollection => 'Colecci?n';
String get favoritesCollection => 'Colección';
@override
String favoritesSavedCount(int count) {
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsFr extends AppLocalizations {
return 'Recording limit updated to $size MB';
}
@override
String get stationOrderTitle => 'Station order';
@override
String get stationOrderByName => 'By name';
@override
String get stationOrderByQuality => 'By quality';
@override
String get stationOrderScopeDescription =>
'Applies to favorites, searches, nearby stations and quick lists.';
@override
String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsHi extends AppLocalizations {
return 'Recording limit updated to $size MB';
}
@override
String get stationOrderTitle => 'Station order';
@override
String get stationOrderByName => 'By name';
@override
String get stationOrderByQuality => 'By quality';
@override
String get stationOrderScopeDescription =>
'Applies to favorites, searches, nearby stations and quick lists.';
@override
String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -353,6 +353,19 @@ class AppLocalizationsId extends AppLocalizations {
return 'Recording limit updated to $size MB';
}
@override
String get stationOrderTitle => 'Station order';
@override
String get stationOrderByName => 'By name';
@override
String get stationOrderByQuality => 'By quality';
@override
String get stationOrderScopeDescription =>
'Applies to favorites, searches, nearby stations and quick lists.';
@override
String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsIt extends AppLocalizations {
return 'Recording limit updated to $size MB';
}
@override
String get stationOrderTitle => 'Station order';
@override
String get stationOrderByName => 'By name';
@override
String get stationOrderByQuality => 'By quality';
@override
String get stationOrderScopeDescription =>
'Applies to favorites, searches, nearby stations and quick lists.';
@override
String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsJa extends AppLocalizations {
return 'Recording limit updated to $size MB';
}
@override
String get stationOrderTitle => 'Station order';
@override
String get stationOrderByName => 'By name';
@override
String get stationOrderByQuality => 'By quality';
@override
String get stationOrderScopeDescription =>
'Applies to favorites, searches, nearby stations and quick lists.';
@override
String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsPt extends AppLocalizations {
return 'Recording limit updated to $size MB';
}
@override
String get stationOrderTitle => 'Station order';
@override
String get stationOrderByName => 'By name';
@override
String get stationOrderByQuality => 'By quality';
@override
String get stationOrderScopeDescription =>
'Applies to favorites, searches, nearby stations and quick lists.';
@override
String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsRu extends AppLocalizations {
return 'Recording limit updated to $size MB';
}
@override
String get stationOrderTitle => 'Station order';
@override
String get stationOrderByName => 'By name';
@override
String get stationOrderByQuality => 'By quality';
@override
String get stationOrderScopeDescription =>
'Applies to favorites, searches, nearby stations and quick lists.';
@override
String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsZh extends AppLocalizations {
return 'Recording limit updated to $size MB';
}
@override
String get stationOrderTitle => 'Station order';
@override
String get stationOrderByName => 'By name';
@override
String get stationOrderByQuality => 'By quality';
@override
String get stationOrderScopeDescription =>
'Applies to favorites, searches, nearby stations and quick lists.';
@override
String get favoriteGroupsTitle => 'Favorite lists';
+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(),
),