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 ## 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 ## 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. - [ ] 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. - [ ] 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 ## Agrupaciones de favoritos
- [ ] Permitir crear listas de favoritos con nombre corto configurable por el usuario desde Ajustes. - [x] 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. - [x] 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] 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] 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. - [x] Completar UI en Ajustes para crear, editar y borrar listas de favoritos.
- [ ] Completar UI en Favoritos para mover emisoras entre listas. - [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", "favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.", "favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list", "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", "favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.", "favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list", "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", "favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.", "favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list", "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", "favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.", "favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list", "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", "favoriteGroupsTitle": "Listas de favoritos",
"favoriteGroupsDescription": "Cre? listas cortas para organizar tus emisoras guardadas.", "favoriteGroupsDescription": "Creá listas cortas para organizar tus emisoras guardadas.",
"favoriteGroupsAdd": "A?adir lista", "favoriteGroupsAdd": "Añadir lista",
"favoriteGroupsEdit": "Editar lista", "favoriteGroupsEdit": "Editar lista",
"favoriteGroupsDelete": "Eliminar lista", "favoriteGroupsDelete": "Eliminar lista",
"favoriteGroupsNameLabel": "Nombre de la lista", "favoriteGroupsNameLabel": "Nombre de la lista",
"favoriteGroupsNameTooLong": "M?ximo 28 caracteres.", "favoriteGroupsNameTooLong": "Máximo 28 caracteres.",
"favoriteGroupsUnassigned": "Sin asignar", "favoriteGroupsUnassigned": "Sin asignar",
"favoriteGroupsProtectedHint": "Lista por defecto: no se puede editar ni borrar.", "favoriteGroupsProtectedHint": "Lista por defecto: no se puede editar ni borrar.",
"favoriteGroupsCreated": "Lista creada", "favoriteGroupsCreated": "Lista creada",
@@ -192,10 +196,10 @@
"favoriteGroupsAssignSubtitle": "Lista actual: {groupName}", "favoriteGroupsAssignSubtitle": "Lista actual: {groupName}",
"favoriteGroupsAssigned": "{stationName} movida a {groupName}", "favoriteGroupsAssigned": "{stationName} movida a {groupName}",
"favoritesTitle": "Favoritos", "favoritesTitle": "Favoritos",
"favoritesEmptyTitle": "Sin favoritos a?n", "favoritesEmptyTitle": "Sin favoritos aún",
"favoritesEmptySubtitle": "Toc? el coraz?n en cualquier emisora para guardarla en tu colecci?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.", "favoritesHeaderSubtitle": "Organizá tu colección por listas y dejá cerca las radios importantes.",
"favoritesCollection": "Colecci?n", "favoritesCollection": "Colección",
"favoritesSavedCount": "{count} guardadas", "favoritesSavedCount": "{count} guardadas",
"favoritesRemoveTooltip": "Eliminar de favoritos", "favoritesRemoveTooltip": "Eliminar de favoritos",
"favoritesRemovedMessage": "{stationName} eliminada 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", "favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.", "favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list", "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", "favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.", "favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list", "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", "favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.", "favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list", "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", "favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.", "favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list", "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", "favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.", "favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list", "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", "favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.", "favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list", "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", "favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.", "favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list", "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", "favoriteGroupsTitle": "Favorite lists",
"favoriteGroupsDescription": "Create short lists to organize your saved stations.", "favoriteGroupsDescription": "Create short lists to organize your saved stations.",
"favoriteGroupsAdd": "Add list", "favoriteGroupsAdd": "Add list",
+31 -7
View File
@@ -732,6 +732,30 @@ abstract class AppLocalizations {
/// **'Límite de grabación actualizado a {size} MB'** /// **'Límite de grabación actualizado a {size} MB'**
String recordingsMaxSizeSaved(int size); 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. /// No description provided for @favoriteGroupsTitle.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
@@ -741,13 +765,13 @@ abstract class AppLocalizations {
/// No description provided for @favoriteGroupsDescription. /// No description provided for @favoriteGroupsDescription.
/// ///
/// In es, this message translates to: /// 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; String get favoriteGroupsDescription;
/// No description provided for @favoriteGroupsAdd. /// No description provided for @favoriteGroupsAdd.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'A?adir lista'** /// **'Añadir lista'**
String get favoriteGroupsAdd; String get favoriteGroupsAdd;
/// No description provided for @favoriteGroupsEdit. /// No description provided for @favoriteGroupsEdit.
@@ -771,7 +795,7 @@ abstract class AppLocalizations {
/// No description provided for @favoriteGroupsNameTooLong. /// No description provided for @favoriteGroupsNameTooLong.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'M?ximo 28 caracteres.'** /// **'Máximo 28 caracteres.'**
String get favoriteGroupsNameTooLong; String get favoriteGroupsNameTooLong;
/// No description provided for @favoriteGroupsUnassigned. /// No description provided for @favoriteGroupsUnassigned.
@@ -831,25 +855,25 @@ abstract class AppLocalizations {
/// No description provided for @favoritesEmptyTitle. /// No description provided for @favoritesEmptyTitle.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Sin favoritos a?n'** /// **'Sin favoritos aún'**
String get favoritesEmptyTitle; String get favoritesEmptyTitle;
/// No description provided for @favoritesEmptySubtitle. /// No description provided for @favoritesEmptySubtitle.
/// ///
/// In es, this message translates to: /// 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; String get favoritesEmptySubtitle;
/// No description provided for @favoritesHeaderSubtitle. /// No description provided for @favoritesHeaderSubtitle.
/// ///
/// In es, this message translates to: /// 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; String get favoritesHeaderSubtitle;
/// No description provided for @favoritesCollection. /// No description provided for @favoritesCollection.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Colecci?n'** /// **'Colección'**
String get favoritesCollection; String get favoritesCollection;
/// No description provided for @favoritesSavedCount. /// No description provided for @favoritesSavedCount.
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsAr extends AppLocalizations {
return 'Recording limit updated to $size MB'; 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 @override
String get favoriteGroupsTitle => 'Favorite lists'; String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsBn extends AppLocalizations {
return 'Recording limit updated to $size MB'; 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 @override
String get favoriteGroupsTitle => 'Favorite lists'; String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsDe extends AppLocalizations {
return 'Recording limit updated to $size MB'; 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 @override
String get favoriteGroupsTitle => 'Favorite lists'; String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsEn extends AppLocalizations {
return 'Recording limit updated to $size MB'; 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 @override
String get favoriteGroupsTitle => 'Favorite lists'; 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'; 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 @override
String get favoriteGroupsTitle => 'Listas de favoritos'; String get favoriteGroupsTitle => 'Listas de favoritos';
@override @override
String get favoriteGroupsDescription => String get favoriteGroupsDescription =>
'Cre? listas cortas para organizar tus emisoras guardadas.'; 'Creá listas cortas para organizar tus emisoras guardadas.';
@override @override
String get favoriteGroupsAdd => 'A?adir lista'; String get favoriteGroupsAdd => 'Añadir lista';
@override @override
String get favoriteGroupsEdit => 'Editar lista'; String get favoriteGroupsEdit => 'Editar lista';
@@ -377,7 +390,7 @@ class AppLocalizationsEs extends AppLocalizations {
String get favoriteGroupsNameLabel => 'Nombre de la lista'; String get favoriteGroupsNameLabel => 'Nombre de la lista';
@override @override
String get favoriteGroupsNameTooLong => 'M?ximo 28 caracteres.'; String get favoriteGroupsNameTooLong => 'Máximo 28 caracteres.';
@override @override
String get favoriteGroupsUnassigned => 'Sin asignar'; String get favoriteGroupsUnassigned => 'Sin asignar';
@@ -413,18 +426,18 @@ class AppLocalizationsEs extends AppLocalizations {
String get favoritesTitle => 'Favoritos'; String get favoritesTitle => 'Favoritos';
@override @override
String get favoritesEmptyTitle => 'Sin favoritos a?n'; String get favoritesEmptyTitle => 'Sin favoritos aún';
@override @override
String get favoritesEmptySubtitle => 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 @override
String get favoritesHeaderSubtitle => 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 @override
String get favoritesCollection => 'Colecci?n'; String get favoritesCollection => 'Colección';
@override @override
String favoritesSavedCount(int count) { String favoritesSavedCount(int count) {
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsFr extends AppLocalizations {
return 'Recording limit updated to $size MB'; 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 @override
String get favoriteGroupsTitle => 'Favorite lists'; String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsHi extends AppLocalizations {
return 'Recording limit updated to $size MB'; 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 @override
String get favoriteGroupsTitle => 'Favorite lists'; String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -353,6 +353,19 @@ class AppLocalizationsId extends AppLocalizations {
return 'Recording limit updated to $size MB'; 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 @override
String get favoriteGroupsTitle => 'Favorite lists'; String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsIt extends AppLocalizations {
return 'Recording limit updated to $size MB'; 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 @override
String get favoriteGroupsTitle => 'Favorite lists'; String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsJa extends AppLocalizations {
return 'Recording limit updated to $size MB'; 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 @override
String get favoriteGroupsTitle => 'Favorite lists'; String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsPt extends AppLocalizations {
return 'Recording limit updated to $size MB'; 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 @override
String get favoriteGroupsTitle => 'Favorite lists'; String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsRu extends AppLocalizations {
return 'Recording limit updated to $size MB'; 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 @override
String get favoriteGroupsTitle => 'Favorite lists'; String get favoriteGroupsTitle => 'Favorite lists';
+13
View File
@@ -354,6 +354,19 @@ class AppLocalizationsZh extends AppLocalizations {
return 'Recording limit updated to $size MB'; 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 @override
String get favoriteGroupsTitle => 'Favorite lists'; String get favoriteGroupsTitle => 'Favorite lists';
+29 -28
View File
@@ -572,6 +572,7 @@ class _SeccionEcualizador extends StatelessWidget {
return Consumer<EstadoRadio>( return Consumer<EstadoRadio>(
builder: (ctx, estado, _) { builder: (ctx, estado, _) {
final disponible = estado.ecualizadorDisponible; final disponible = estado.ecualizadorDisponible;
final l10n = AppLocalizations.of(ctx);
final emisoraActual = estado.emisoraActual; final emisoraActual = estado.emisoraActual;
final mostrarModoPorEmisora = final mostrarModoPorEmisora =
emisoraActual != null && estado.emisoraActualEsFavorita; emisoraActual != null && estado.emisoraActualEsFavorita;
@@ -586,13 +587,13 @@ class _SeccionEcualizador extends StatelessWidget {
const Icon(Icons.equalizer), const Icon(Icons.equalizer),
const SizedBox(width: 12), const SizedBox(width: 12),
Text( Text(
AppLocalizations.of(ctx).equalizerTitle, l10n.equalizerTitle,
style: Theme.of(ctx).textTheme.titleMedium, style: Theme.of(ctx).textTheme.titleMedium,
), ),
const Spacer(), const Spacer(),
Chip( Chip(
label: Text( label: Text(
estado.ecualizadorActivo ? AppLocalizations.of(ctx).equalizerActive : AppLocalizations.of(ctx).equalizerDisabled, estado.ecualizadorActivo ? l10n.equalizerActive : l10n.equalizerDisabled,
), ),
visualDensity: VisualDensity.compact, visualDensity: VisualDensity.compact,
), ),
@@ -601,11 +602,11 @@ class _SeccionEcualizador extends StatelessWidget {
const SizedBox(height: 8), const SizedBox(height: 8),
SwitchListTile.adaptive( SwitchListTile.adaptive(
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
title: Text(AppLocalizations.of(ctx).equalizerEnable), title: Text(l10n.equalizerEnable),
subtitle: Text( subtitle: Text(
disponible disponible
? 'Los cambios se aplican en tiempo real a la emisora actual.' ? l10n.equalizerRealtimeSubtitle
: 'Se guardan los cambios y se aplicarán cuando Android habilite el efecto.', : l10n.equalizerPendingSubtitle,
), ),
value: estado.ecualizadorActivo, value: estado.ecualizadorActivo,
onChanged: estado.cambiarEcualizadorActivo, onChanged: estado.cambiarEcualizadorActivo,
@@ -614,11 +615,11 @@ class _SeccionEcualizador extends StatelessWidget {
const SizedBox(height: 8), const SizedBox(height: 8),
SwitchListTile.adaptive( SwitchListTile.adaptive(
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
title: Text(AppLocalizations.of(ctx).equalizerPerStationTitle), title: Text(l10n.equalizerPerStationTitle),
subtitle: Text( subtitle: Text(
usandoEqPropio usandoEqPropio
? AppLocalizations.of(ctx).equalizerPerStationActive(emisoraActual.nombre) ? l10n.equalizerPerStationActive(emisoraActual.nombre)
: AppLocalizations.of(ctx).equalizerPerStationMain(emisoraActual.nombre), : l10n.equalizerPerStationMain(emisoraActual.nombre),
), ),
value: usandoEqPropio, value: usandoEqPropio,
onChanged: onChanged:
@@ -652,6 +653,7 @@ class _SeccionOrdenListas extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final estado = context.watch<EstadoRadio>(); final estado = context.watch<EstadoRadio>();
final l10n = AppLocalizations.of(context);
return PluriGlassSurface( return PluriGlassSurface(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@@ -661,23 +663,23 @@ class _SeccionOrdenListas extends StatelessWidget {
const Icon(Icons.sort_rounded), const Icon(Icons.sort_rounded),
const SizedBox(width: 12), const SizedBox(width: 12),
Text( Text(
'Orden de emisoras', l10n.stationOrderTitle,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
), ),
], ],
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
SegmentedButton<OrdenEmisoras>( SegmentedButton<OrdenEmisoras>(
segments: const [ segments: [
ButtonSegment( ButtonSegment(
value: OrdenEmisoras.nombre, value: OrdenEmisoras.nombre,
icon: Icon(Icons.sort_by_alpha_rounded), icon: const Icon(Icons.sort_by_alpha_rounded),
label: Text('Por nombre'), label: Text(l10n.stationOrderByName),
), ),
ButtonSegment( ButtonSegment(
value: OrdenEmisoras.calidad, value: OrdenEmisoras.calidad,
icon: Icon(Icons.hd_rounded), icon: const Icon(Icons.hd_rounded),
label: Text('Por calidad'), label: Text(l10n.stationOrderByQuality),
), ),
], ],
selected: {estado.ordenListas}, selected: {estado.ordenListas},
@@ -687,7 +689,7 @@ class _SeccionOrdenListas extends StatelessWidget {
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Text( Text(
'Se aplica a favoritos, b?squedas, emisoras cercanas y listados r?pidos.', l10n.stationOrderScopeDescription,
style: Theme.of(context).textTheme.bodySmall, style: Theme.of(context).textTheme.bodySmall,
), ),
], ],
@@ -837,6 +839,7 @@ class _SeccionEmisoraPreferida extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final estado = context.watch<EstadoRadio>(); final estado = context.watch<EstadoRadio>();
final l10n = AppLocalizations.of(context);
final favoritas = estado.listaFavoritos; final favoritas = estado.listaFavoritos;
final preferida = estado.emisoraPreferida; final preferida = estado.emisoraPreferida;
final opciones = _opciones(estado, preferida); final opciones = _opciones(estado, preferida);
@@ -850,25 +853,23 @@ class _SeccionEmisoraPreferida extends StatelessWidget {
const Icon(Icons.radio_rounded), const Icon(Icons.radio_rounded),
const SizedBox(width: 12), const SizedBox(width: 12),
Text( Text(
AppLocalizations.of(context).preferredStationTitle, l10n.preferredStationTitle,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
), ),
], ],
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Text( Text(
'Se preselecciona al crear alarmas y puede iniciarse como reproducción rápida.', l10n.preferredStationDescription,
style: Theme.of(context).textTheme.bodySmall, style: Theme.of(context).textTheme.bodySmall,
), ),
const SizedBox(height: 12), const SizedBox(height: 12),
if (opciones.isEmpty) if (opciones.isEmpty)
const ListTile( ListTile(
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
leading: Icon(Icons.info_outline_rounded), leading: const Icon(Icons.info_outline_rounded),
title: Text('Todavía no hay emisoras disponibles'), title: Text(l10n.preferredStationNoStationsTitle),
subtitle: Text( subtitle: Text(l10n.preferredStationNoStationsSubtitle),
'Guardá favoritas o cargá emisoras para elegir una preferida.',
),
) )
else else
DropdownButtonFormField<String>( DropdownButtonFormField<String>(
@@ -876,8 +877,8 @@ class _SeccionEmisoraPreferida extends StatelessWidget {
decoration: InputDecoration( decoration: InputDecoration(
labelText: labelText:
favoritas.isEmpty favoritas.isEmpty
? 'Fallback automático' ? l10n.preferredStationAutomaticFallback
: 'Favorita por defecto', : l10n.preferredStationDefaultFavorite,
), ),
items: [ items: [
for (final emisora in opciones) for (final emisora in opciones)
@@ -900,15 +901,15 @@ class _SeccionEmisoraPreferida extends StatelessWidget {
const SizedBox(height: 8), const SizedBox(height: 8),
Text( Text(
favoritas.any((e) => e.uuid == preferida.uuid) favoritas.any((e) => e.uuid == preferida.uuid)
? 'Preferida actual: ${preferida.nombre}' ? l10n.preferredStationCurrent(preferida.nombre)
: 'Sin favoritas: usando automáticamente ${preferida.nombre}', : l10n.preferredStationAutoUsing(preferida.nombre),
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Align( Align(
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: FilledButton.tonalIcon( child: FilledButton.tonalIcon(
icon: const Icon(Icons.play_arrow_rounded), icon: const Icon(Icons.play_arrow_rounded),
label: Text(AppLocalizations.of(context).preferredStationPlay), label: Text(l10n.preferredStationPlay),
onPressed: onPressed:
() => context.read<EstadoRadio>().reproducirEmisoraPreferida(), () => context.read<EstadoRadio>().reproducirEmisoraPreferida(),
), ),