feat(recording): add safety limits and adaptive headers
Build & Deploy Pluriwave / Análisis de código (push) Successful in 23s
Build & Deploy Pluriwave / Build APK + AAB release (push) Successful in 1m37s

This commit is contained in:
2026-05-22 15:24:14 +02:00
parent 2320dbdc5f
commit 8190c4ab8d
34 changed files with 1445 additions and 459 deletions
+10 -7
View File
@@ -6,6 +6,7 @@
- [x] Permitir que el usuario cambie el idioma manualmente desde la aplicación, sin depender únicamente del idioma del sistema. - [x] Permitir que el usuario cambie el idioma manualmente desde la aplicación, sin depender únicamente del idioma del sistema.
- [x] Añadir traducción inicial español/inglés para el shell, navegación, timer de sueño y selector de idioma. - [x] Añadir traducción inicial español/inglés para el shell, navegación, timer de sueño y selector de idioma.
- [x] Añadir soporte inicial para un conjunto amplio de idiomas muy hablados: inglés, español, chino, hindi, árabe, portugués, francés, ruso, alemán, japonés, indonesio, bengalí e italiano. - [x] Añadir soporte inicial para un conjunto amplio de idiomas muy hablados: inglés, español, chino, hindi, árabe, portugués, francés, ruso, alemán, japonés, indonesio, bengalí e italiano.
- [x] Ejecutar escaneo UTF-8 sobre ARB/código tocado y corregir corrupciones visibles en los textos migrados.
- [ ] Validar no solo el guardado UTF-8 en código, sino también el render real en la aplicación para acentos, ñ, signos, alfabetos no latinos y direcciones RTL. - [ ] Validar no solo el guardado UTF-8 en código, sino también el render real en la aplicación para acentos, ñ, signos, alfabetos no latinos y direcciones RTL.
- [ ] Repasar absolutamente todos los literales de la aplicación en todas las pantallas, componentes, servicios con mensajes visibles y notificaciones. - [ ] Repasar absolutamente todos los literales de la aplicación en todas las pantallas, componentes, servicios con mensajes visibles y notificaciones.
- [ ] Soportar formatos locales de fecha, hora, números y duración usando helpers centralizados. - [ ] Soportar formatos locales de fecha, hora, números y duración usando helpers centralizados.
@@ -17,16 +18,18 @@
## UX y accesibilidad visual ## UX y accesibilidad visual
- [ ] Revisar los paneles informativos superiores de cada pantalla: recuperar márgenes internos elegantes para que el texto no quede pegado a los bordes. - [x] Revisar los paneles informativos superiores de cada pantalla: recuperar márgenes internos elegantes para que el texto no quede pegado a los bordes.
- [ ] Probar la aplicación con escalas de texto grandes/muy grandes del sistema y evitar que los paneles con mucho texto se descuajeringuen. - [x] Añadir comportamiento adaptativo en el header premium para escalas de texto grandes y pantallas estrechas.
- [ ] Diseñar una solución elegante para textos largos: reflow, límites razonables, scroll, wraps controlados y jerarquías que mantengan la estética AAA. - [ ] Probar la aplicación con escalas de texto grandes/muy grandes del sistema en dispositivo real o golden tests.
- [ ] Diseñar una solución elegante para textos largos en todos los paneles secundarios: reflow, límites razonables, scroll, wraps controlados y jerarquías que mantengan la estética AAA.
## Grabaciones ## Grabaciones
- [ ] Añadir en Ajustes un acceso elegante, con imagen/icono acorde al diseño, para abrir la carpeta de grabaciones con el gestor de ficheros del sistema mediante intent. - [x] Añadir en Ajustes un acceso elegante para abrir la carpeta de grabaciones con el gestor de ficheros del sistema mediante intent.
- [ ] Añadir configuración de tamaño máximo de fichero de grabación; valor por defecto: 500 MB. - [x] Añadir configuración de tamaño máximo de fichero de grabación; valor por defecto: 500 MB.
- [ ] Detener automáticamente la grabación si se para la reproducción. - [x] Detener automáticamente la grabación si se para o pausa la reproducción.
- [ ] Detener automáticamente la grabación si se cambia de emisora. - [x] Detener automáticamente la grabación si se cambia de emisora.
- [ ] Probar en Android real que el intent de carpeta funciona con rutas internas y rutas escogidas por el usuario.
## Búsqueda de emisoras ## Búsqueda de emisoras
+34
View File
@@ -7,6 +7,7 @@ import 'package:geocoding/geocoding.dart';
import 'package:geolocator/geolocator.dart'; import 'package:geolocator/geolocator.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:url_launcher/url_launcher.dart';
import '../modelos/emisora.dart'; import '../modelos/emisora.dart';
import '../modelos/preset_ecualizador.dart'; import '../modelos/preset_ecualizador.dart';
@@ -143,6 +144,7 @@ class EstadoRadio extends ChangeNotifier {
EstadoGrabacionRadio get estadoGrabacion => grabacion.estado; EstadoGrabacionRadio get estadoGrabacion => grabacion.estado;
bool get grabacionActiva => grabacion.estado.activa; bool get grabacionActiva => grabacion.estado.activa;
String? get directorioGrabacion => grabacion.directorioConfigurado; String? get directorioGrabacion => grabacion.directorioConfigurado;
int get maxBytesGrabacion => grabacion.maxBytes;
/// Lista principal (home): custom + populares, sin duplicados. /// Lista principal (home): custom + populares, sin duplicados.
List<Emisora> get emisorasInicio { List<Emisora> get emisorasInicio {
@@ -203,6 +205,12 @@ class EstadoRadio extends ChangeNotifier {
if (estado == EstadoReproduccion.error && timer.activo) { if (estado == EstadoReproduccion.error && timer.activo) {
unawaited(timer.cancelar()); unawaited(timer.cancelar());
} }
if ((estado == EstadoReproduccion.detenido ||
estado == EstadoReproduccion.pausado ||
estado == EstadoReproduccion.error) &&
grabacion.estado.activa) {
unawaited(grabacion.detener());
}
notifyListeners(); notifyListeners();
}); });
} }
@@ -456,6 +464,9 @@ class EstadoRadio extends ChangeNotifier {
Future<void> reproducir(Emisora emisora) async { Future<void> reproducir(Emisora emisora) async {
final revision = ++_revisionReproduccion; final revision = ++_revisionReproduccion;
if (grabacion.estado.activa) {
await grabacion.detener();
}
_emisoraSeleccionada = emisora; _emisoraSeleccionada = emisora;
notifyListeners(); notifyListeners();
try { try {
@@ -496,6 +507,26 @@ class EstadoRadio extends ChangeNotifier {
Future<void> detenerGrabacion() => grabacion.detener(); Future<void> detenerGrabacion() => grabacion.detener();
Future<void> detenerReproduccion() async {
if (grabacion.estado.activa) {
await grabacion.detener();
}
await audio.detener();
notifyListeners();
}
Future<void> cambiarMaxBytesGrabacion(int bytes) async {
await grabacion.guardarMaxBytes(bytes);
notifyListeners();
}
Future<bool> abrirDirectorioGrabacion() async {
final ruta = await directorioGrabacionEfectivo();
await Directory(ruta).create(recursive: true);
final uri = Uri.directory(ruta);
return launchUrl(uri, mode: LaunchMode.externalApplication);
}
Future<void> cambiarDirectorioGrabacion(String path) async { Future<void> cambiarDirectorioGrabacion(String path) async {
await grabacion.guardarDirectorio(path); await grabacion.guardarDirectorio(path);
notifyListeners(); notifyListeners();
@@ -510,6 +541,9 @@ class EstadoRadio extends ChangeNotifier {
grabacion.directorioEfectivo(); grabacion.directorioEfectivo();
Future<void> togglePlay() async { Future<void> togglePlay() async {
if (audio.estaSonando && grabacion.estado.activa) {
await grabacion.detener();
}
await audio.togglePlay(); await audio.togglePlay();
notifyListeners(); notifyListeners();
} }
+46 -20
View File
@@ -1,13 +1,13 @@
{ {
"@@locale": "ar", "@@locale": "ar",
"appTitle": "PluriWave", "appTitle": "PluriWave",
"navHome": "????????", "navHome": "Home",
"navSearch": "???", "navSearch": "Search",
"navFavorites": "???????", "navFavorites": "Favorites",
"navAlarms": "????????", "navAlarms": "Alarms",
"navSettings": "?????????", "navSettings": "Settings",
"actionOk": "?????", "actionOk": "OK",
"sleepTimer": "???? ?????", "sleepTimer": "Sleep timer",
"sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.",
"cancelTimer": "Cancel timer", "cancelTimer": "Cancel timer",
"optionOther": "Other", "optionOther": "Other",
@@ -24,20 +24,20 @@
"alarmName": {} "alarmName": {}
} }
}, },
"settingsTitle": "?????????", "settingsTitle": "Settings",
"settingsSubtitle": "???? ???? ?? ????? ?????? ????????? ???????? ???????.", "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.",
"languageSectionTitle": "?????", "languageSectionTitle": "Language",
"languageSectionDescription": "???? ??? ??? ???????.", "languageSectionDescription": "Choose how the app language is displayed.",
"languageSystemDefault": "??????", "languageSystemDefault": "System",
"languageSpanish": "?????????", "languageSpanish": "Spanish",
"languageEnglish": "??????????", "languageEnglish": "English",
"languageUpdated": "?? ????? ?????: {languageName}", "languageUpdated": "Language updated: {languageName}",
"@languageUpdated": { "@languageUpdated": {
"placeholders": { "placeholders": {
"languageName": {} "languageName": {}
} }
}, },
"languageUpdatedSystem": "?? ????? ?????: ??????", "languageUpdatedSystem": "Language updated: System",
"timerSectionTitle": "Sleep timer", "timerSectionTitle": "Sleep timer",
"timerSectionAdd": "Add", "timerSectionAdd": "Add",
"timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.",
@@ -89,7 +89,7 @@
"backupExportSubtitle": "Favorites, custom stations, and EQ presets", "backupExportSubtitle": "Favorites, custom stations, and EQ presets",
"backupImportTitle": "Import configuration", "backupImportTitle": "Import configuration",
"backupImportSubtitle": "Restore from a backup file", "backupImportSubtitle": "Restore from a backup file",
"backupShareSubject": "PluriWave ? backup", "backupShareSubject": "PluriWave backup",
"backupShareText": "PluriWave configuration exported on {date}", "backupShareText": "PluriWave configuration exported on {date}",
"backupExportError": "Export error: {error}", "backupExportError": "Export error: {error}",
"backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?",
@@ -102,7 +102,7 @@
"stationFilterSubtitle": "Only stations verified as active", "stationFilterSubtitle": "Only stations verified as active",
"backgroundAudioTitle": "Background audio", "backgroundAudioTitle": "Background audio",
"backgroundAudioSubtitle": "Continues when the screen turns off", "backgroundAudioSubtitle": "Continues when the screen turns off",
"dash": "?", "dash": "",
"@recordingsPathSaveError": { "@recordingsPathSaveError": {
"placeholders": { "placeholders": {
"error": {} "error": {}
@@ -148,6 +148,32 @@
"version": {} "version": {}
} }
}, },
"cancelAction": "?????", "cancelAction": "Cancel",
"equalizerTitle": "Equalizer" "equalizerTitle": "Equalizer",
"recordingsOpenFolder": "Open folder",
"recordingsOpenFolderError": "Could not open the folder: {error}",
"recordingsMaxSizeTitle": "Maximum recording size",
"recordingsMaxSizeSubtitle": "Current limit: {size} MB",
"recordingsMaxSizeDialogTitle": "Maximum size per recording",
"recordingsMaxSizeMbLabel": "Maximum megabytes",
"recordingsMaxSizeSaved": "Recording limit updated to {size} MB",
"@recordingsOpenFolderError": {
"placeholders": {
"error": {}
}
},
"@recordingsMaxSizeSubtitle": {
"placeholders": {
"size": {
"type": "int"
}
}
},
"@recordingsMaxSizeSaved": {
"placeholders": {
"size": {
"type": "int"
}
}
}
} }
+46 -20
View File
@@ -1,13 +1,13 @@
{ {
"@@locale": "bn", "@@locale": "bn",
"appTitle": "PluriWave", "appTitle": "PluriWave",
"navHome": "???", "navHome": "Home",
"navSearch": "????", "navSearch": "Search",
"navFavorites": "??????", "navFavorites": "Favorites",
"navAlarms": "?????????", "navAlarms": "Alarms",
"navSettings": "??????", "navSettings": "Settings",
"actionOk": "??? ???", "actionOk": "OK",
"sleepTimer": "????? ??????", "sleepTimer": "Sleep timer",
"sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.",
"cancelTimer": "Cancel timer", "cancelTimer": "Cancel timer",
"optionOther": "Other", "optionOther": "Other",
@@ -24,20 +24,20 @@
"alarmName": {} "alarmName": {}
} }
}, },
"settingsTitle": "??????", "settingsTitle": "Settings",
"settingsSubtitle": "????, ??????? ??? ?????? ???????? ??????? ???????????", "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.",
"languageSectionTitle": "????", "languageSectionTitle": "Language",
"languageSectionDescription": "??????? ???????? ???? ???? ????", "languageSectionDescription": "Choose how the app language is displayed.",
"languageSystemDefault": "???????", "languageSystemDefault": "System",
"languageSpanish": "?????????", "languageSpanish": "Spanish",
"languageEnglish": "??????", "languageEnglish": "English",
"languageUpdated": "???? ????? ??????: {languageName}", "languageUpdated": "Language updated: {languageName}",
"@languageUpdated": { "@languageUpdated": {
"placeholders": { "placeholders": {
"languageName": {} "languageName": {}
} }
}, },
"languageUpdatedSystem": "???? ????? ??????: ???????", "languageUpdatedSystem": "Language updated: System",
"timerSectionTitle": "Sleep timer", "timerSectionTitle": "Sleep timer",
"timerSectionAdd": "Add", "timerSectionAdd": "Add",
"timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.",
@@ -89,7 +89,7 @@
"backupExportSubtitle": "Favorites, custom stations, and EQ presets", "backupExportSubtitle": "Favorites, custom stations, and EQ presets",
"backupImportTitle": "Import configuration", "backupImportTitle": "Import configuration",
"backupImportSubtitle": "Restore from a backup file", "backupImportSubtitle": "Restore from a backup file",
"backupShareSubject": "PluriWave ? backup", "backupShareSubject": "PluriWave backup",
"backupShareText": "PluriWave configuration exported on {date}", "backupShareText": "PluriWave configuration exported on {date}",
"backupExportError": "Export error: {error}", "backupExportError": "Export error: {error}",
"backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?",
@@ -102,7 +102,7 @@
"stationFilterSubtitle": "Only stations verified as active", "stationFilterSubtitle": "Only stations verified as active",
"backgroundAudioTitle": "Background audio", "backgroundAudioTitle": "Background audio",
"backgroundAudioSubtitle": "Continues when the screen turns off", "backgroundAudioSubtitle": "Continues when the screen turns off",
"dash": "?", "dash": "",
"@recordingsPathSaveError": { "@recordingsPathSaveError": {
"placeholders": { "placeholders": {
"error": {} "error": {}
@@ -148,6 +148,32 @@
"version": {} "version": {}
} }
}, },
"cancelAction": "?????", "cancelAction": "Cancel",
"equalizerTitle": "Equalizer" "equalizerTitle": "Equalizer",
"recordingsOpenFolder": "Open folder",
"recordingsOpenFolderError": "Could not open the folder: {error}",
"recordingsMaxSizeTitle": "Maximum recording size",
"recordingsMaxSizeSubtitle": "Current limit: {size} MB",
"recordingsMaxSizeDialogTitle": "Maximum size per recording",
"recordingsMaxSizeMbLabel": "Maximum megabytes",
"recordingsMaxSizeSaved": "Recording limit updated to {size} MB",
"@recordingsOpenFolderError": {
"placeholders": {
"error": {}
}
},
"@recordingsMaxSizeSubtitle": {
"placeholders": {
"size": {
"type": "int"
}
}
},
"@recordingsMaxSizeSaved": {
"placeholders": {
"size": {
"type": "int"
}
}
}
} }
+31 -5
View File
@@ -25,9 +25,9 @@
} }
}, },
"settingsTitle": "Einstellungen", "settingsTitle": "Einstellungen",
"settingsSubtitle": "Feinsteuerung f?r Sound, Backups und eigene Sender.", "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.",
"languageSectionTitle": "Sprache", "languageSectionTitle": "Sprache",
"languageSectionDescription": "W?hle die Anzeigesprache der App.", "languageSectionDescription": "Choose how the app language is displayed.",
"languageSystemDefault": "System", "languageSystemDefault": "System",
"languageSpanish": "Spanisch", "languageSpanish": "Spanisch",
"languageEnglish": "Englisch", "languageEnglish": "Englisch",
@@ -89,7 +89,7 @@
"backupExportSubtitle": "Favorites, custom stations, and EQ presets", "backupExportSubtitle": "Favorites, custom stations, and EQ presets",
"backupImportTitle": "Import configuration", "backupImportTitle": "Import configuration",
"backupImportSubtitle": "Restore from a backup file", "backupImportSubtitle": "Restore from a backup file",
"backupShareSubject": "PluriWave ? backup", "backupShareSubject": "PluriWave backup",
"backupShareText": "PluriWave configuration exported on {date}", "backupShareText": "PluriWave configuration exported on {date}",
"backupExportError": "Export error: {error}", "backupExportError": "Export error: {error}",
"backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?",
@@ -102,7 +102,7 @@
"stationFilterSubtitle": "Only stations verified as active", "stationFilterSubtitle": "Only stations verified as active",
"backgroundAudioTitle": "Background audio", "backgroundAudioTitle": "Background audio",
"backgroundAudioSubtitle": "Continues when the screen turns off", "backgroundAudioSubtitle": "Continues when the screen turns off",
"dash": "?", "dash": "",
"@recordingsPathSaveError": { "@recordingsPathSaveError": {
"placeholders": { "placeholders": {
"error": {} "error": {}
@@ -149,5 +149,31 @@
} }
}, },
"cancelAction": "Abbrechen", "cancelAction": "Abbrechen",
"equalizerTitle": "Equalizer" "equalizerTitle": "Equalizer",
"recordingsOpenFolder": "Open folder",
"recordingsOpenFolderError": "Could not open the folder: {error}",
"recordingsMaxSizeTitle": "Maximum recording size",
"recordingsMaxSizeSubtitle": "Current limit: {size} MB",
"recordingsMaxSizeDialogTitle": "Maximum size per recording",
"recordingsMaxSizeMbLabel": "Maximum megabytes",
"recordingsMaxSizeSaved": "Recording limit updated to {size} MB",
"@recordingsOpenFolderError": {
"placeholders": {
"error": {}
}
},
"@recordingsMaxSizeSubtitle": {
"placeholders": {
"size": {
"type": "int"
}
}
},
"@recordingsMaxSizeSaved": {
"placeholders": {
"size": {
"type": "int"
}
}
}
} }
+31 -5
View File
@@ -49,8 +49,8 @@
"recordingsFolderDialogTitle": "Select recordings folder", "recordingsFolderDialogTitle": "Select recordings folder",
"recordingsPathUpdated": "Recording path updated", "recordingsPathUpdated": "Recording path updated",
"recordingsPathSaveError": "Could not save the path: {error}", "recordingsPathSaveError": "Could not save the path: {error}",
"recordingsDefaultFolderRestored": "The internal default folder will be used", "recordingsDefaultFolderRestored": "The default internal folder will be used",
"recordingsFolderTitle": "Recordings folder", "recordingsFolderTitle": "Recording folder",
"recordingsPathCalculating": "Calculating path...", "recordingsPathCalculating": "Calculating path...",
"recordingsChangePath": "Change path", "recordingsChangePath": "Change path",
"recordingsUseDefaultPath": "Use default path", "recordingsUseDefaultPath": "Use default path",
@@ -89,7 +89,7 @@
"backupExportSubtitle": "Favorites, custom stations, and EQ presets", "backupExportSubtitle": "Favorites, custom stations, and EQ presets",
"backupImportTitle": "Import configuration", "backupImportTitle": "Import configuration",
"backupImportSubtitle": "Restore from a backup file", "backupImportSubtitle": "Restore from a backup file",
"backupShareSubject": "PluriWave ? backup", "backupShareSubject": "PluriWave backup",
"backupShareText": "PluriWave configuration exported on {date}", "backupShareText": "PluriWave configuration exported on {date}",
"backupExportError": "Export error: {error}", "backupExportError": "Export error: {error}",
"backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?",
@@ -102,7 +102,7 @@
"stationFilterSubtitle": "Only stations verified as active", "stationFilterSubtitle": "Only stations verified as active",
"backgroundAudioTitle": "Background audio", "backgroundAudioTitle": "Background audio",
"backgroundAudioSubtitle": "Continues when the screen turns off", "backgroundAudioSubtitle": "Continues when the screen turns off",
"dash": "?", "dash": "",
"@recordingsPathSaveError": { "@recordingsPathSaveError": {
"placeholders": { "placeholders": {
"error": {} "error": {}
@@ -149,5 +149,31 @@
} }
}, },
"cancelAction": "Cancel", "cancelAction": "Cancel",
"equalizerTitle": "Equalizer" "equalizerTitle": "Equalizer",
"recordingsOpenFolder": "Open folder",
"recordingsOpenFolderError": "Could not open the folder: {error}",
"recordingsMaxSizeTitle": "Maximum recording size",
"recordingsMaxSizeSubtitle": "Current limit: {size} MB",
"recordingsMaxSizeDialogTitle": "Maximum size per recording",
"recordingsMaxSizeMbLabel": "Maximum megabytes",
"recordingsMaxSizeSaved": "Recording limit updated to {size} MB",
"@recordingsOpenFolderError": {
"placeholders": {
"error": {}
}
},
"@recordingsMaxSizeSubtitle": {
"placeholders": {
"size": {
"type": "int"
}
}
},
"@recordingsMaxSizeSaved": {
"placeholders": {
"size": {
"type": "int"
}
}
}
} }
+49 -23
View File
@@ -47,10 +47,10 @@
"settingsSafeStatus": "Seguro", "settingsSafeStatus": "Seguro",
"recordingsSectionTitle": "Grabaciones", "recordingsSectionTitle": "Grabaciones",
"recordingsFolderDialogTitle": "Selecciona la carpeta de grabaciones", "recordingsFolderDialogTitle": "Selecciona la carpeta de grabaciones",
"recordingsPathUpdated": "Ruta de grabaci?n actualizada", "recordingsPathUpdated": "Ruta de grabación actualizada",
"recordingsPathSaveError": "No se pudo guardar la ruta: {error}", "recordingsPathSaveError": "No se pudo guardar la ruta: {error}",
"recordingsDefaultFolderRestored": "Se usar? la carpeta interna por defecto", "recordingsDefaultFolderRestored": "Se usará la carpeta interna por defecto",
"recordingsFolderTitle": "Carpeta de grabaci?n", "recordingsFolderTitle": "Carpeta de grabación",
"recordingsPathCalculating": "Calculando ruta...", "recordingsPathCalculating": "Calculando ruta...",
"recordingsChangePath": "Cambiar ruta", "recordingsChangePath": "Cambiar ruta",
"recordingsUseDefaultPath": "Usar ruta por defecto", "recordingsUseDefaultPath": "Usar ruta por defecto",
@@ -59,50 +59,50 @@
"equalizerDisabled": "Desactivado", "equalizerDisabled": "Desactivado",
"equalizerEnable": "Activar ecualizador", "equalizerEnable": "Activar ecualizador",
"equalizerRealtimeSubtitle": "Los cambios se aplican en tiempo real a la emisora actual.", "equalizerRealtimeSubtitle": "Los cambios se aplican en tiempo real a la emisora actual.",
"equalizerPendingSubtitle": "Se guardan los cambios y se aplicar?n cuando Android habilite el efecto.", "equalizerPendingSubtitle": "Se guardan los cambios y se aplicarán cuando Android habilite el efecto.",
"equalizerPerStationTitle": "Usar EQ propio para esta favorita", "equalizerPerStationTitle": "Usar EQ propio para esta favorita",
"equalizerPerStationActive": "Activo para {stationName}", "equalizerPerStationActive": "Activo para {stationName}",
"equalizerPerStationMain": "Usando EQ principal para {stationName}", "equalizerPerStationMain": "Usando EQ principal para {stationName}",
"preferredStationTitle": "Emisora preferida", "preferredStationTitle": "Emisora preferida",
"preferredStationDescription": "Se preselecciona al crear alarmas y puede iniciarse como reproducci?n r?pida.", "preferredStationDescription": "Se preselecciona al crear alarmas y puede iniciarse como reproducción rápida.",
"preferredStationNoStationsTitle": "Todav?a no hay emisoras disponibles", "preferredStationNoStationsTitle": "Todavía no hay emisoras disponibles",
"preferredStationNoStationsSubtitle": "Guard? favoritas o carg? emisoras para elegir una preferida.", "preferredStationNoStationsSubtitle": "Guardá favoritas o cargá emisoras para elegir una preferida.",
"preferredStationAutomaticFallback": "Fallback autom?tico", "preferredStationAutomaticFallback": "Fallback automático",
"preferredStationDefaultFavorite": "Favorita por defecto", "preferredStationDefaultFavorite": "Favorita por defecto",
"preferredStationCurrent": "Preferida actual: {stationName}", "preferredStationCurrent": "Preferida actual: {stationName}",
"preferredStationAutoUsing": "Sin favoritas: usando autom?ticamente {stationName}", "preferredStationAutoUsing": "Sin favoritas: usando automáticamente {stationName}",
"preferredStationPlay": "Reproducir preferida", "preferredStationPlay": "Reproducir preferida",
"customStationsTitle": "Emisoras personalizadas", "customStationsTitle": "Emisoras personalizadas",
"customStationsAdd": "A?adir", "customStationsAdd": "Añadir",
"customStationsEmpty": "No hay emisoras personalizadas.", "customStationsEmpty": "No hay emisoras personalizadas.",
"playAction": "Reproducir", "playAction": "Reproducir",
"deleteAction": "Eliminar", "deleteAction": "Eliminar",
"addStationTitle": "A?adir emisora", "addStationTitle": "Añadir emisora",
"stationNameLabel": "Nombre *", "stationNameLabel": "Nombre *",
"requiredField": "Campo obligatorio", "requiredField": "Campo obligatorio",
"streamUrlLabel": "URL del stream *", "streamUrlLabel": "URL del stream *",
"invalidUrl": "URL no v?lida", "invalidUrl": "URL no válida",
"countryOptionalLabel": "Pa?s (opcional)", "countryOptionalLabel": "País (opcional)",
"saveStation": "Guardar emisora", "saveStation": "Guardar emisora",
"backupSectionTitle": "Copia de seguridad", "backupSectionTitle": "Copia de seguridad",
"backupExportTitle": "Exportar configuraci?n", "backupExportTitle": "Exportar configuración",
"backupExportSubtitle": "Favoritos, emisoras custom y presets de EQ", "backupExportSubtitle": "Favoritos, emisoras custom y presets de EQ",
"backupImportTitle": "Importar configuraci?n", "backupImportTitle": "Importar configuración",
"backupImportSubtitle": "Restaurar desde un fichero de copia de seguridad", "backupImportSubtitle": "Restaurar desde un fichero de copia de seguridad",
"backupShareSubject": "PluriWave ? copia de seguridad", "backupShareSubject": "PluriWave copia de seguridad",
"backupShareText": "Configuraci?n de PluriWave exportada el {date}", "backupShareText": "Configuración de PluriWave exportada el {date}",
"backupExportError": "Error al exportar: {error}", "backupExportError": "Error al exportar: {error}",
"backupImportConfirmMessage": "Esto a?adir? los favoritos, emisoras y presets del fichero. ?Continuar?", "backupImportConfirmMessage": "Esto añadirá los favoritos, emisoras y presets del fichero. ¿Continuar?",
"backupImportSuccess": "Configuraci?n importada correctamente", "backupImportSuccess": "Configuración importada correctamente",
"backupImportError": "Error al importar: {error}", "backupImportError": "Error al importar: {error}",
"appVersionLoading": "Cargando versi?n...", "appVersionLoading": "Cargando versión...",
"appVersionSubtitle": "{version} - Radio mundial", "appVersionSubtitle": "{version} - Radio mundial",
"savedFavoritesTitle": "Favoritos guardados", "savedFavoritesTitle": "Favoritos guardados",
"stationFilterTitle": "Filtro de emisoras", "stationFilterTitle": "Filtro de emisoras",
"stationFilterSubtitle": "Solo emisoras verificadas como activas", "stationFilterSubtitle": "Solo emisoras verificadas como activas",
"backgroundAudioTitle": "Audio en background", "backgroundAudioTitle": "Audio en background",
"backgroundAudioSubtitle": "Contin?a al apagar la pantalla", "backgroundAudioSubtitle": "Continúa al apagar la pantalla",
"dash": "?", "dash": "",
"@recordingsPathSaveError": { "@recordingsPathSaveError": {
"placeholders": { "placeholders": {
"error": {} "error": {}
@@ -149,5 +149,31 @@
} }
}, },
"cancelAction": "Cancelar", "cancelAction": "Cancelar",
"equalizerTitle": "Ecualizador" "equalizerTitle": "Ecualizador",
"recordingsOpenFolder": "Abrir carpeta",
"recordingsOpenFolderError": "No se pudo abrir la carpeta: {error}",
"recordingsMaxSizeTitle": "Tamaño máximo de grabación",
"recordingsMaxSizeSubtitle": "Límite actual: {size} MB",
"recordingsMaxSizeDialogTitle": "Tamaño máximo por grabación",
"recordingsMaxSizeMbLabel": "Megabytes máximos",
"recordingsMaxSizeSaved": "Límite de grabación actualizado a {size} MB",
"@recordingsOpenFolderError": {
"placeholders": {
"error": {}
}
},
"@recordingsMaxSizeSubtitle": {
"placeholders": {
"size": {
"type": "int"
}
}
},
"@recordingsMaxSizeSaved": {
"placeholders": {
"size": {
"type": "int"
}
}
}
} }
+36 -10
View File
@@ -5,7 +5,7 @@
"navSearch": "Recherche", "navSearch": "Recherche",
"navFavorites": "Favoris", "navFavorites": "Favoris",
"navAlarms": "Alarmes", "navAlarms": "Alarmes",
"navSettings": "R?glages", "navSettings": "Settings",
"actionOk": "OK", "actionOk": "OK",
"sleepTimer": "Minuteur de sommeil", "sleepTimer": "Minuteur de sommeil",
"sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.",
@@ -24,20 +24,20 @@
"alarmName": {} "alarmName": {}
} }
}, },
"settingsTitle": "R?glages", "settingsTitle": "Settings",
"settingsSubtitle": "Contr?le fin du son, sauvegardes et stations personnalis?es.", "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.",
"languageSectionTitle": "Langue", "languageSectionTitle": "Langue",
"languageSectionDescription": "Choisissez la langue d?affichage de l?application.", "languageSectionDescription": "Choose how the app language is displayed.",
"languageSystemDefault": "Syst?me", "languageSystemDefault": "System",
"languageSpanish": "Espagnol", "languageSpanish": "Espagnol",
"languageEnglish": "Anglais", "languageEnglish": "Anglais",
"languageUpdated": "Langue mise ? jour : {languageName}", "languageUpdated": "Language updated: {languageName}",
"@languageUpdated": { "@languageUpdated": {
"placeholders": { "placeholders": {
"languageName": {} "languageName": {}
} }
}, },
"languageUpdatedSystem": "Langue mise ? jour : Syst?me", "languageUpdatedSystem": "Language updated: System",
"timerSectionTitle": "Sleep timer", "timerSectionTitle": "Sleep timer",
"timerSectionAdd": "Add", "timerSectionAdd": "Add",
"timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.",
@@ -89,7 +89,7 @@
"backupExportSubtitle": "Favorites, custom stations, and EQ presets", "backupExportSubtitle": "Favorites, custom stations, and EQ presets",
"backupImportTitle": "Import configuration", "backupImportTitle": "Import configuration",
"backupImportSubtitle": "Restore from a backup file", "backupImportSubtitle": "Restore from a backup file",
"backupShareSubject": "PluriWave ? backup", "backupShareSubject": "PluriWave backup",
"backupShareText": "PluriWave configuration exported on {date}", "backupShareText": "PluriWave configuration exported on {date}",
"backupExportError": "Export error: {error}", "backupExportError": "Export error: {error}",
"backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?",
@@ -102,7 +102,7 @@
"stationFilterSubtitle": "Only stations verified as active", "stationFilterSubtitle": "Only stations verified as active",
"backgroundAudioTitle": "Background audio", "backgroundAudioTitle": "Background audio",
"backgroundAudioSubtitle": "Continues when the screen turns off", "backgroundAudioSubtitle": "Continues when the screen turns off",
"dash": "?", "dash": "",
"@recordingsPathSaveError": { "@recordingsPathSaveError": {
"placeholders": { "placeholders": {
"error": {} "error": {}
@@ -149,5 +149,31 @@
} }
}, },
"cancelAction": "Annuler", "cancelAction": "Annuler",
"equalizerTitle": "Equalizer" "equalizerTitle": "Equalizer",
"recordingsOpenFolder": "Open folder",
"recordingsOpenFolderError": "Could not open the folder: {error}",
"recordingsMaxSizeTitle": "Maximum recording size",
"recordingsMaxSizeSubtitle": "Current limit: {size} MB",
"recordingsMaxSizeDialogTitle": "Maximum size per recording",
"recordingsMaxSizeMbLabel": "Maximum megabytes",
"recordingsMaxSizeSaved": "Recording limit updated to {size} MB",
"@recordingsOpenFolderError": {
"placeholders": {
"error": {}
}
},
"@recordingsMaxSizeSubtitle": {
"placeholders": {
"size": {
"type": "int"
}
}
},
"@recordingsMaxSizeSaved": {
"placeholders": {
"size": {
"type": "int"
}
}
}
} }
+46 -20
View File
@@ -1,13 +1,13 @@
{ {
"@@locale": "hi", "@@locale": "hi",
"appTitle": "PluriWave", "appTitle": "PluriWave",
"navHome": "???", "navHome": "Home",
"navSearch": "???", "navSearch": "Search",
"navFavorites": "???????", "navFavorites": "Favorites",
"navAlarms": "??????", "navAlarms": "Alarms",
"navSettings": "????????", "navSettings": "Settings",
"actionOk": "???", "actionOk": "OK",
"sleepTimer": "????? ?????", "sleepTimer": "Sleep timer",
"sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.",
"cancelTimer": "Cancel timer", "cancelTimer": "Cancel timer",
"optionOther": "Other", "optionOther": "Other",
@@ -24,20 +24,20 @@
"alarmName": {} "alarmName": {}
} }
}, },
"settingsTitle": "????????", "settingsTitle": "Settings",
"settingsSubtitle": "?????, ????? ?? ????? ???????? ?? ??????? ?????????", "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.",
"languageSectionTitle": "????", "languageSectionTitle": "Language",
"languageSectionDescription": "?? ?? ???? ??????", "languageSectionDescription": "Choose how the app language is displayed.",
"languageSystemDefault": "??????", "languageSystemDefault": "System",
"languageSpanish": "??????", "languageSpanish": "Spanish",
"languageEnglish": "?????????", "languageEnglish": "English",
"languageUpdated": "???? ???? ??: {languageName}", "languageUpdated": "Language updated: {languageName}",
"@languageUpdated": { "@languageUpdated": {
"placeholders": { "placeholders": {
"languageName": {} "languageName": {}
} }
}, },
"languageUpdatedSystem": "???? ???? ??: ??????", "languageUpdatedSystem": "Language updated: System",
"timerSectionTitle": "Sleep timer", "timerSectionTitle": "Sleep timer",
"timerSectionAdd": "Add", "timerSectionAdd": "Add",
"timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.",
@@ -89,7 +89,7 @@
"backupExportSubtitle": "Favorites, custom stations, and EQ presets", "backupExportSubtitle": "Favorites, custom stations, and EQ presets",
"backupImportTitle": "Import configuration", "backupImportTitle": "Import configuration",
"backupImportSubtitle": "Restore from a backup file", "backupImportSubtitle": "Restore from a backup file",
"backupShareSubject": "PluriWave ? backup", "backupShareSubject": "PluriWave backup",
"backupShareText": "PluriWave configuration exported on {date}", "backupShareText": "PluriWave configuration exported on {date}",
"backupExportError": "Export error: {error}", "backupExportError": "Export error: {error}",
"backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?",
@@ -102,7 +102,7 @@
"stationFilterSubtitle": "Only stations verified as active", "stationFilterSubtitle": "Only stations verified as active",
"backgroundAudioTitle": "Background audio", "backgroundAudioTitle": "Background audio",
"backgroundAudioSubtitle": "Continues when the screen turns off", "backgroundAudioSubtitle": "Continues when the screen turns off",
"dash": "?", "dash": "",
"@recordingsPathSaveError": { "@recordingsPathSaveError": {
"placeholders": { "placeholders": {
"error": {} "error": {}
@@ -148,6 +148,32 @@
"version": {} "version": {}
} }
}, },
"cancelAction": "???? ????", "cancelAction": "Cancel",
"equalizerTitle": "Equalizer" "equalizerTitle": "Equalizer",
"recordingsOpenFolder": "Open folder",
"recordingsOpenFolderError": "Could not open the folder: {error}",
"recordingsMaxSizeTitle": "Maximum recording size",
"recordingsMaxSizeSubtitle": "Current limit: {size} MB",
"recordingsMaxSizeDialogTitle": "Maximum size per recording",
"recordingsMaxSizeMbLabel": "Maximum megabytes",
"recordingsMaxSizeSaved": "Recording limit updated to {size} MB",
"@recordingsOpenFolderError": {
"placeholders": {
"error": {}
}
},
"@recordingsMaxSizeSubtitle": {
"placeholders": {
"size": {
"type": "int"
}
}
},
"@recordingsMaxSizeSaved": {
"placeholders": {
"size": {
"type": "int"
}
}
}
} }
+29 -3
View File
@@ -89,7 +89,7 @@
"backupExportSubtitle": "Favorites, custom stations, and EQ presets", "backupExportSubtitle": "Favorites, custom stations, and EQ presets",
"backupImportTitle": "Import configuration", "backupImportTitle": "Import configuration",
"backupImportSubtitle": "Restore from a backup file", "backupImportSubtitle": "Restore from a backup file",
"backupShareSubject": "PluriWave ? backup", "backupShareSubject": "PluriWave backup",
"backupShareText": "PluriWave configuration exported on {date}", "backupShareText": "PluriWave configuration exported on {date}",
"backupExportError": "Export error: {error}", "backupExportError": "Export error: {error}",
"backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?",
@@ -102,7 +102,7 @@
"stationFilterSubtitle": "Only stations verified as active", "stationFilterSubtitle": "Only stations verified as active",
"backgroundAudioTitle": "Background audio", "backgroundAudioTitle": "Background audio",
"backgroundAudioSubtitle": "Continues when the screen turns off", "backgroundAudioSubtitle": "Continues when the screen turns off",
"dash": "?", "dash": "",
"@recordingsPathSaveError": { "@recordingsPathSaveError": {
"placeholders": { "placeholders": {
"error": {} "error": {}
@@ -149,5 +149,31 @@
} }
}, },
"cancelAction": "Batal", "cancelAction": "Batal",
"equalizerTitle": "Equalizer" "equalizerTitle": "Equalizer",
"recordingsOpenFolder": "Open folder",
"recordingsOpenFolderError": "Could not open the folder: {error}",
"recordingsMaxSizeTitle": "Maximum recording size",
"recordingsMaxSizeSubtitle": "Current limit: {size} MB",
"recordingsMaxSizeDialogTitle": "Maximum size per recording",
"recordingsMaxSizeMbLabel": "Maximum megabytes",
"recordingsMaxSizeSaved": "Recording limit updated to {size} MB",
"@recordingsOpenFolderError": {
"placeholders": {
"error": {}
}
},
"@recordingsMaxSizeSubtitle": {
"placeholders": {
"size": {
"type": "int"
}
}
},
"@recordingsMaxSizeSaved": {
"placeholders": {
"size": {
"type": "int"
}
}
}
} }
+30 -4
View File
@@ -27,7 +27,7 @@
"settingsTitle": "Impostazioni", "settingsTitle": "Impostazioni",
"settingsSubtitle": "Controllo fine del suono, backup e stazioni personalizzate.", "settingsSubtitle": "Controllo fine del suono, backup e stazioni personalizzate.",
"languageSectionTitle": "Lingua", "languageSectionTitle": "Lingua",
"languageSectionDescription": "Scegli la lingua di visualizzazione dell?app.", "languageSectionDescription": "Choose how the app language is displayed.",
"languageSystemDefault": "Sistema", "languageSystemDefault": "Sistema",
"languageSpanish": "Spagnolo", "languageSpanish": "Spagnolo",
"languageEnglish": "Inglese", "languageEnglish": "Inglese",
@@ -89,7 +89,7 @@
"backupExportSubtitle": "Favorites, custom stations, and EQ presets", "backupExportSubtitle": "Favorites, custom stations, and EQ presets",
"backupImportTitle": "Import configuration", "backupImportTitle": "Import configuration",
"backupImportSubtitle": "Restore from a backup file", "backupImportSubtitle": "Restore from a backup file",
"backupShareSubject": "PluriWave ? backup", "backupShareSubject": "PluriWave backup",
"backupShareText": "PluriWave configuration exported on {date}", "backupShareText": "PluriWave configuration exported on {date}",
"backupExportError": "Export error: {error}", "backupExportError": "Export error: {error}",
"backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?",
@@ -102,7 +102,7 @@
"stationFilterSubtitle": "Only stations verified as active", "stationFilterSubtitle": "Only stations verified as active",
"backgroundAudioTitle": "Background audio", "backgroundAudioTitle": "Background audio",
"backgroundAudioSubtitle": "Continues when the screen turns off", "backgroundAudioSubtitle": "Continues when the screen turns off",
"dash": "?", "dash": "",
"@recordingsPathSaveError": { "@recordingsPathSaveError": {
"placeholders": { "placeholders": {
"error": {} "error": {}
@@ -149,5 +149,31 @@
} }
}, },
"cancelAction": "Annulla", "cancelAction": "Annulla",
"equalizerTitle": "Equalizer" "equalizerTitle": "Equalizer",
"recordingsOpenFolder": "Open folder",
"recordingsOpenFolderError": "Could not open the folder: {error}",
"recordingsMaxSizeTitle": "Maximum recording size",
"recordingsMaxSizeSubtitle": "Current limit: {size} MB",
"recordingsMaxSizeDialogTitle": "Maximum size per recording",
"recordingsMaxSizeMbLabel": "Maximum megabytes",
"recordingsMaxSizeSaved": "Recording limit updated to {size} MB",
"@recordingsOpenFolderError": {
"placeholders": {
"error": {}
}
},
"@recordingsMaxSizeSubtitle": {
"placeholders": {
"size": {
"type": "int"
}
}
},
"@recordingsMaxSizeSaved": {
"placeholders": {
"size": {
"type": "int"
}
}
}
} }
+45 -19
View File
@@ -1,13 +1,13 @@
{ {
"@@locale": "ja", "@@locale": "ja",
"appTitle": "PluriWave", "appTitle": "PluriWave",
"navHome": "???", "navHome": "Home",
"navSearch": "??", "navSearch": "Search",
"navFavorites": "?????", "navFavorites": "Favorites",
"navAlarms": "????", "navAlarms": "Alarms",
"navSettings": "??", "navSettings": "Settings",
"actionOk": "OK", "actionOk": "OK",
"sleepTimer": "????????", "sleepTimer": "Sleep timer",
"sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.",
"cancelTimer": "Cancel timer", "cancelTimer": "Cancel timer",
"optionOther": "Other", "optionOther": "Other",
@@ -24,20 +24,20 @@
"alarmName": {} "alarmName": {}
} }
}, },
"settingsTitle": "??", "settingsTitle": "Settings",
"settingsSubtitle": "?????????????????????????", "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.",
"languageSectionTitle": "??", "languageSectionTitle": "Language",
"languageSectionDescription": "???????????????", "languageSectionDescription": "Choose how the app language is displayed.",
"languageSystemDefault": "????", "languageSystemDefault": "System",
"languageSpanish": "?????", "languageSpanish": "Spanish",
"languageEnglish": "??", "languageEnglish": "English",
"languageUpdated": "?????????: {languageName}", "languageUpdated": "Language updated: {languageName}",
"@languageUpdated": { "@languageUpdated": {
"placeholders": { "placeholders": {
"languageName": {} "languageName": {}
} }
}, },
"languageUpdatedSystem": "?????????: ????", "languageUpdatedSystem": "Language updated: System",
"timerSectionTitle": "Sleep timer", "timerSectionTitle": "Sleep timer",
"timerSectionAdd": "Add", "timerSectionAdd": "Add",
"timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.",
@@ -89,7 +89,7 @@
"backupExportSubtitle": "Favorites, custom stations, and EQ presets", "backupExportSubtitle": "Favorites, custom stations, and EQ presets",
"backupImportTitle": "Import configuration", "backupImportTitle": "Import configuration",
"backupImportSubtitle": "Restore from a backup file", "backupImportSubtitle": "Restore from a backup file",
"backupShareSubject": "PluriWave ? backup", "backupShareSubject": "PluriWave backup",
"backupShareText": "PluriWave configuration exported on {date}", "backupShareText": "PluriWave configuration exported on {date}",
"backupExportError": "Export error: {error}", "backupExportError": "Export error: {error}",
"backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?",
@@ -102,7 +102,7 @@
"stationFilterSubtitle": "Only stations verified as active", "stationFilterSubtitle": "Only stations verified as active",
"backgroundAudioTitle": "Background audio", "backgroundAudioTitle": "Background audio",
"backgroundAudioSubtitle": "Continues when the screen turns off", "backgroundAudioSubtitle": "Continues when the screen turns off",
"dash": "?", "dash": "",
"@recordingsPathSaveError": { "@recordingsPathSaveError": {
"placeholders": { "placeholders": {
"error": {} "error": {}
@@ -148,6 +148,32 @@
"version": {} "version": {}
} }
}, },
"cancelAction": "?????", "cancelAction": "Cancel",
"equalizerTitle": "Equalizer" "equalizerTitle": "Equalizer",
"recordingsOpenFolder": "Open folder",
"recordingsOpenFolderError": "Could not open the folder: {error}",
"recordingsMaxSizeTitle": "Maximum recording size",
"recordingsMaxSizeSubtitle": "Current limit: {size} MB",
"recordingsMaxSizeDialogTitle": "Maximum size per recording",
"recordingsMaxSizeMbLabel": "Maximum megabytes",
"recordingsMaxSizeSaved": "Recording limit updated to {size} MB",
"@recordingsOpenFolderError": {
"placeholders": {
"error": {}
}
},
"@recordingsMaxSizeSubtitle": {
"placeholders": {
"size": {
"type": "int"
}
}
},
"@recordingsMaxSizeSaved": {
"placeholders": {
"size": {
"type": "int"
}
}
}
} }
+35 -9
View File
@@ -1,11 +1,11 @@
{ {
"@@locale": "pt", "@@locale": "pt",
"appTitle": "PluriWave", "appTitle": "PluriWave",
"navHome": "In?cio", "navHome": "Home",
"navSearch": "Buscar", "navSearch": "Buscar",
"navFavorites": "Favoritos", "navFavorites": "Favoritos",
"navAlarms": "Alarmes", "navAlarms": "Alarmes",
"navSettings": "Defini??es", "navSettings": "Settings",
"actionOk": "OK", "actionOk": "OK",
"sleepTimer": "Timer de sono", "sleepTimer": "Timer de sono",
"sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.",
@@ -24,13 +24,13 @@
"alarmName": {} "alarmName": {}
} }
}, },
"settingsTitle": "Defini??es", "settingsTitle": "Settings",
"settingsSubtitle": "Controle fino de som, backups e esta??es personalizadas.", "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.",
"languageSectionTitle": "Idioma", "languageSectionTitle": "Idioma",
"languageSectionDescription": "Escolha como o idioma do app ? exibido.", "languageSectionDescription": "Choose how the app language is displayed.",
"languageSystemDefault": "Sistema", "languageSystemDefault": "Sistema",
"languageSpanish": "Espanhol", "languageSpanish": "Espanhol",
"languageEnglish": "Ingl?s", "languageEnglish": "English",
"languageUpdated": "Idioma atualizado: {languageName}", "languageUpdated": "Idioma atualizado: {languageName}",
"@languageUpdated": { "@languageUpdated": {
"placeholders": { "placeholders": {
@@ -89,7 +89,7 @@
"backupExportSubtitle": "Favorites, custom stations, and EQ presets", "backupExportSubtitle": "Favorites, custom stations, and EQ presets",
"backupImportTitle": "Import configuration", "backupImportTitle": "Import configuration",
"backupImportSubtitle": "Restore from a backup file", "backupImportSubtitle": "Restore from a backup file",
"backupShareSubject": "PluriWave ? backup", "backupShareSubject": "PluriWave backup",
"backupShareText": "PluriWave configuration exported on {date}", "backupShareText": "PluriWave configuration exported on {date}",
"backupExportError": "Export error: {error}", "backupExportError": "Export error: {error}",
"backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?",
@@ -102,7 +102,7 @@
"stationFilterSubtitle": "Only stations verified as active", "stationFilterSubtitle": "Only stations verified as active",
"backgroundAudioTitle": "Background audio", "backgroundAudioTitle": "Background audio",
"backgroundAudioSubtitle": "Continues when the screen turns off", "backgroundAudioSubtitle": "Continues when the screen turns off",
"dash": "?", "dash": "",
"@recordingsPathSaveError": { "@recordingsPathSaveError": {
"placeholders": { "placeholders": {
"error": {} "error": {}
@@ -149,5 +149,31 @@
} }
}, },
"cancelAction": "Cancelar", "cancelAction": "Cancelar",
"equalizerTitle": "Equalizer" "equalizerTitle": "Equalizer",
"recordingsOpenFolder": "Open folder",
"recordingsOpenFolderError": "Could not open the folder: {error}",
"recordingsMaxSizeTitle": "Maximum recording size",
"recordingsMaxSizeSubtitle": "Current limit: {size} MB",
"recordingsMaxSizeDialogTitle": "Maximum size per recording",
"recordingsMaxSizeMbLabel": "Maximum megabytes",
"recordingsMaxSizeSaved": "Recording limit updated to {size} MB",
"@recordingsOpenFolderError": {
"placeholders": {
"error": {}
}
},
"@recordingsMaxSizeSubtitle": {
"placeholders": {
"size": {
"type": "int"
}
}
},
"@recordingsMaxSizeSaved": {
"placeholders": {
"size": {
"type": "int"
}
}
}
} }
+45 -19
View File
@@ -1,13 +1,13 @@
{ {
"@@locale": "ru", "@@locale": "ru",
"appTitle": "PluriWave", "appTitle": "PluriWave",
"navHome": "???????", "navHome": "Home",
"navSearch": "?????", "navSearch": "Search",
"navFavorites": "?????????", "navFavorites": "Favorites",
"navAlarms": "??????????", "navAlarms": "Alarms",
"navSettings": "?????????", "navSettings": "Settings",
"actionOk": "OK", "actionOk": "OK",
"sleepTimer": "?????? ???", "sleepTimer": "Sleep timer",
"sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.",
"cancelTimer": "Cancel timer", "cancelTimer": "Cancel timer",
"optionOther": "Other", "optionOther": "Other",
@@ -24,20 +24,20 @@
"alarmName": {} "alarmName": {}
} }
}, },
"settingsTitle": "?????????", "settingsTitle": "Settings",
"settingsSubtitle": "?????? ????????? ?????, ????????? ????? ? ???????????????? ???????.", "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.",
"languageSectionTitle": "????", "languageSectionTitle": "Language",
"languageSectionDescription": "???????? ???? ?????????? ??????????.", "languageSectionDescription": "Choose how the app language is displayed.",
"languageSystemDefault": "???????", "languageSystemDefault": "System",
"languageSpanish": "?????????", "languageSpanish": "Spanish",
"languageEnglish": "??????????", "languageEnglish": "English",
"languageUpdated": "???? ????????: {languageName}", "languageUpdated": "Language updated: {languageName}",
"@languageUpdated": { "@languageUpdated": {
"placeholders": { "placeholders": {
"languageName": {} "languageName": {}
} }
}, },
"languageUpdatedSystem": "???? ????????: ???????", "languageUpdatedSystem": "Language updated: System",
"timerSectionTitle": "Sleep timer", "timerSectionTitle": "Sleep timer",
"timerSectionAdd": "Add", "timerSectionAdd": "Add",
"timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.",
@@ -89,7 +89,7 @@
"backupExportSubtitle": "Favorites, custom stations, and EQ presets", "backupExportSubtitle": "Favorites, custom stations, and EQ presets",
"backupImportTitle": "Import configuration", "backupImportTitle": "Import configuration",
"backupImportSubtitle": "Restore from a backup file", "backupImportSubtitle": "Restore from a backup file",
"backupShareSubject": "PluriWave ? backup", "backupShareSubject": "PluriWave backup",
"backupShareText": "PluriWave configuration exported on {date}", "backupShareText": "PluriWave configuration exported on {date}",
"backupExportError": "Export error: {error}", "backupExportError": "Export error: {error}",
"backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?",
@@ -102,7 +102,7 @@
"stationFilterSubtitle": "Only stations verified as active", "stationFilterSubtitle": "Only stations verified as active",
"backgroundAudioTitle": "Background audio", "backgroundAudioTitle": "Background audio",
"backgroundAudioSubtitle": "Continues when the screen turns off", "backgroundAudioSubtitle": "Continues when the screen turns off",
"dash": "?", "dash": "",
"@recordingsPathSaveError": { "@recordingsPathSaveError": {
"placeholders": { "placeholders": {
"error": {} "error": {}
@@ -148,6 +148,32 @@
"version": {} "version": {}
} }
}, },
"cancelAction": "??????", "cancelAction": "Cancel",
"equalizerTitle": "Equalizer" "equalizerTitle": "Equalizer",
"recordingsOpenFolder": "Open folder",
"recordingsOpenFolderError": "Could not open the folder: {error}",
"recordingsMaxSizeTitle": "Maximum recording size",
"recordingsMaxSizeSubtitle": "Current limit: {size} MB",
"recordingsMaxSizeDialogTitle": "Maximum size per recording",
"recordingsMaxSizeMbLabel": "Maximum megabytes",
"recordingsMaxSizeSaved": "Recording limit updated to {size} MB",
"@recordingsOpenFolderError": {
"placeholders": {
"error": {}
}
},
"@recordingsMaxSizeSubtitle": {
"placeholders": {
"size": {
"type": "int"
}
}
},
"@recordingsMaxSizeSaved": {
"placeholders": {
"size": {
"type": "int"
}
}
}
} }
+46 -20
View File
@@ -1,13 +1,13 @@
{ {
"@@locale": "zh", "@@locale": "zh",
"appTitle": "PluriWave", "appTitle": "PluriWave",
"navHome": "??", "navHome": "Home",
"navSearch": "??", "navSearch": "Search",
"navFavorites": "??", "navFavorites": "Favorites",
"navAlarms": "??", "navAlarms": "Alarms",
"navSettings": "??", "navSettings": "Settings",
"actionOk": "??", "actionOk": "OK",
"sleepTimer": "?????", "sleepTimer": "Sleep timer",
"sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.",
"cancelTimer": "Cancel timer", "cancelTimer": "Cancel timer",
"optionOther": "Other", "optionOther": "Other",
@@ -24,20 +24,20 @@
"alarmName": {} "alarmName": {}
} }
}, },
"settingsTitle": "??", "settingsTitle": "Settings",
"settingsSubtitle": "?????????????????", "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.",
"languageSectionTitle": "??", "languageSectionTitle": "Language",
"languageSectionDescription": "?????????", "languageSectionDescription": "Choose how the app language is displayed.",
"languageSystemDefault": "??", "languageSystemDefault": "System",
"languageSpanish": "????", "languageSpanish": "Spanish",
"languageEnglish": "??", "languageEnglish": "English",
"languageUpdated": "??????{languageName}", "languageUpdated": "Language updated: {languageName}",
"@languageUpdated": { "@languageUpdated": {
"placeholders": { "placeholders": {
"languageName": {} "languageName": {}
} }
}, },
"languageUpdatedSystem": "????????", "languageUpdatedSystem": "Language updated: System",
"timerSectionTitle": "Sleep timer", "timerSectionTitle": "Sleep timer",
"timerSectionAdd": "Add", "timerSectionAdd": "Add",
"timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.",
@@ -89,7 +89,7 @@
"backupExportSubtitle": "Favorites, custom stations, and EQ presets", "backupExportSubtitle": "Favorites, custom stations, and EQ presets",
"backupImportTitle": "Import configuration", "backupImportTitle": "Import configuration",
"backupImportSubtitle": "Restore from a backup file", "backupImportSubtitle": "Restore from a backup file",
"backupShareSubject": "PluriWave ? backup", "backupShareSubject": "PluriWave backup",
"backupShareText": "PluriWave configuration exported on {date}", "backupShareText": "PluriWave configuration exported on {date}",
"backupExportError": "Export error: {error}", "backupExportError": "Export error: {error}",
"backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?",
@@ -102,7 +102,7 @@
"stationFilterSubtitle": "Only stations verified as active", "stationFilterSubtitle": "Only stations verified as active",
"backgroundAudioTitle": "Background audio", "backgroundAudioTitle": "Background audio",
"backgroundAudioSubtitle": "Continues when the screen turns off", "backgroundAudioSubtitle": "Continues when the screen turns off",
"dash": "?", "dash": "",
"@recordingsPathSaveError": { "@recordingsPathSaveError": {
"placeholders": { "placeholders": {
"error": {} "error": {}
@@ -148,6 +148,32 @@
"version": {} "version": {}
} }
}, },
"cancelAction": "??", "cancelAction": "Cancel",
"equalizerTitle": "Equalizer" "equalizerTitle": "Equalizer",
"recordingsOpenFolder": "Open folder",
"recordingsOpenFolderError": "Could not open the folder: {error}",
"recordingsMaxSizeTitle": "Maximum recording size",
"recordingsMaxSizeSubtitle": "Current limit: {size} MB",
"recordingsMaxSizeDialogTitle": "Maximum size per recording",
"recordingsMaxSizeMbLabel": "Maximum megabytes",
"recordingsMaxSizeSaved": "Recording limit updated to {size} MB",
"@recordingsOpenFolderError": {
"placeholders": {
"error": {}
}
},
"@recordingsMaxSizeSubtitle": {
"placeholders": {
"size": {
"type": "int"
}
}
},
"@recordingsMaxSizeSaved": {
"placeholders": {
"size": {
"type": "int"
}
}
}
} }
+64 -22
View File
@@ -345,7 +345,7 @@ abstract class AppLocalizations {
/// No description provided for @recordingsPathUpdated. /// No description provided for @recordingsPathUpdated.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Ruta de grabaci?n actualizada'** /// **'Ruta de grabación actualizada'**
String get recordingsPathUpdated; String get recordingsPathUpdated;
/// No description provided for @recordingsPathSaveError. /// No description provided for @recordingsPathSaveError.
@@ -357,13 +357,13 @@ abstract class AppLocalizations {
/// No description provided for @recordingsDefaultFolderRestored. /// No description provided for @recordingsDefaultFolderRestored.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Se usar? la carpeta interna por defecto'** /// **'Se usará la carpeta interna por defecto'**
String get recordingsDefaultFolderRestored; String get recordingsDefaultFolderRestored;
/// No description provided for @recordingsFolderTitle. /// No description provided for @recordingsFolderTitle.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Carpeta de grabaci?n'** /// **'Carpeta de grabación'**
String get recordingsFolderTitle; String get recordingsFolderTitle;
/// No description provided for @recordingsPathCalculating. /// No description provided for @recordingsPathCalculating.
@@ -417,7 +417,7 @@ abstract class AppLocalizations {
/// No description provided for @equalizerPendingSubtitle. /// No description provided for @equalizerPendingSubtitle.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Se guardan los cambios y se aplicar?n cuando Android habilite el efecto.'** /// **'Se guardan los cambios y se aplicarán cuando Android habilite el efecto.'**
String get equalizerPendingSubtitle; String get equalizerPendingSubtitle;
/// No description provided for @equalizerPerStationTitle. /// No description provided for @equalizerPerStationTitle.
@@ -447,25 +447,25 @@ abstract class AppLocalizations {
/// No description provided for @preferredStationDescription. /// No description provided for @preferredStationDescription.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Se preselecciona al crear alarmas y puede iniciarse como reproducci?n r?pida.'** /// **'Se preselecciona al crear alarmas y puede iniciarse como reproducción rápida.'**
String get preferredStationDescription; String get preferredStationDescription;
/// No description provided for @preferredStationNoStationsTitle. /// No description provided for @preferredStationNoStationsTitle.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Todav?a no hay emisoras disponibles'** /// **'Todavía no hay emisoras disponibles'**
String get preferredStationNoStationsTitle; String get preferredStationNoStationsTitle;
/// No description provided for @preferredStationNoStationsSubtitle. /// No description provided for @preferredStationNoStationsSubtitle.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Guard? favoritas o carg? emisoras para elegir una preferida.'** /// **'Guardá favoritas o cargá emisoras para elegir una preferida.'**
String get preferredStationNoStationsSubtitle; String get preferredStationNoStationsSubtitle;
/// No description provided for @preferredStationAutomaticFallback. /// No description provided for @preferredStationAutomaticFallback.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Fallback autom?tico'** /// **'Fallback automático'**
String get preferredStationAutomaticFallback; String get preferredStationAutomaticFallback;
/// No description provided for @preferredStationDefaultFavorite. /// No description provided for @preferredStationDefaultFavorite.
@@ -483,7 +483,7 @@ abstract class AppLocalizations {
/// No description provided for @preferredStationAutoUsing. /// No description provided for @preferredStationAutoUsing.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Sin favoritas: usando autom?ticamente {stationName}'** /// **'Sin favoritas: usando automáticamente {stationName}'**
String preferredStationAutoUsing(Object stationName); String preferredStationAutoUsing(Object stationName);
/// No description provided for @preferredStationPlay. /// No description provided for @preferredStationPlay.
@@ -501,7 +501,7 @@ abstract class AppLocalizations {
/// No description provided for @customStationsAdd. /// No description provided for @customStationsAdd.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'A?adir'** /// **'Añadir'**
String get customStationsAdd; String get customStationsAdd;
/// No description provided for @customStationsEmpty. /// No description provided for @customStationsEmpty.
@@ -525,7 +525,7 @@ abstract class AppLocalizations {
/// No description provided for @addStationTitle. /// No description provided for @addStationTitle.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'A?adir emisora'** /// **'Añadir emisora'**
String get addStationTitle; String get addStationTitle;
/// No description provided for @stationNameLabel. /// No description provided for @stationNameLabel.
@@ -549,13 +549,13 @@ abstract class AppLocalizations {
/// No description provided for @invalidUrl. /// No description provided for @invalidUrl.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'URL no v?lida'** /// **'URL no válida'**
String get invalidUrl; String get invalidUrl;
/// No description provided for @countryOptionalLabel. /// No description provided for @countryOptionalLabel.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Pa?s (opcional)'** /// **'País (opcional)'**
String get countryOptionalLabel; String get countryOptionalLabel;
/// No description provided for @saveStation. /// No description provided for @saveStation.
@@ -573,7 +573,7 @@ abstract class AppLocalizations {
/// No description provided for @backupExportTitle. /// No description provided for @backupExportTitle.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Exportar configuraci?n'** /// **'Exportar configuración'**
String get backupExportTitle; String get backupExportTitle;
/// No description provided for @backupExportSubtitle. /// No description provided for @backupExportSubtitle.
@@ -585,7 +585,7 @@ abstract class AppLocalizations {
/// No description provided for @backupImportTitle. /// No description provided for @backupImportTitle.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Importar configuraci?n'** /// **'Importar configuración'**
String get backupImportTitle; String get backupImportTitle;
/// No description provided for @backupImportSubtitle. /// No description provided for @backupImportSubtitle.
@@ -597,13 +597,13 @@ abstract class AppLocalizations {
/// No description provided for @backupShareSubject. /// No description provided for @backupShareSubject.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'PluriWave ? copia de seguridad'** /// **'PluriWave copia de seguridad'**
String get backupShareSubject; String get backupShareSubject;
/// No description provided for @backupShareText. /// No description provided for @backupShareText.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Configuraci?n de PluriWave exportada el {date}'** /// **'Configuración de PluriWave exportada el {date}'**
String backupShareText(Object date); String backupShareText(Object date);
/// No description provided for @backupExportError. /// No description provided for @backupExportError.
@@ -615,13 +615,13 @@ abstract class AppLocalizations {
/// No description provided for @backupImportConfirmMessage. /// No description provided for @backupImportConfirmMessage.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Esto a?adir? los favoritos, emisoras y presets del fichero. ?Continuar?'** /// **'Esto añadirá los favoritos, emisoras y presets del fichero. ¿Continuar?'**
String get backupImportConfirmMessage; String get backupImportConfirmMessage;
/// No description provided for @backupImportSuccess. /// No description provided for @backupImportSuccess.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Configuraci?n importada correctamente'** /// **'Configuración importada correctamente'**
String get backupImportSuccess; String get backupImportSuccess;
/// No description provided for @backupImportError. /// No description provided for @backupImportError.
@@ -633,7 +633,7 @@ abstract class AppLocalizations {
/// No description provided for @appVersionLoading. /// No description provided for @appVersionLoading.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Cargando versi?n...'** /// **'Cargando versión...'**
String get appVersionLoading; String get appVersionLoading;
/// No description provided for @appVersionSubtitle. /// No description provided for @appVersionSubtitle.
@@ -669,13 +669,13 @@ abstract class AppLocalizations {
/// No description provided for @backgroundAudioSubtitle. /// No description provided for @backgroundAudioSubtitle.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'Contin?a al apagar la pantalla'** /// **'Continúa al apagar la pantalla'**
String get backgroundAudioSubtitle; String get backgroundAudioSubtitle;
/// No description provided for @dash. /// No description provided for @dash.
/// ///
/// In es, this message translates to: /// In es, this message translates to:
/// **'?'** /// **''**
String get dash; String get dash;
/// No description provided for @cancelAction. /// No description provided for @cancelAction.
@@ -689,6 +689,48 @@ abstract class AppLocalizations {
/// In es, this message translates to: /// In es, this message translates to:
/// **'Ecualizador'** /// **'Ecualizador'**
String get equalizerTitle; String get equalizerTitle;
/// No description provided for @recordingsOpenFolder.
///
/// In es, this message translates to:
/// **'Abrir carpeta'**
String get recordingsOpenFolder;
/// No description provided for @recordingsOpenFolderError.
///
/// In es, this message translates to:
/// **'No se pudo abrir la carpeta: {error}'**
String recordingsOpenFolderError(Object error);
/// No description provided for @recordingsMaxSizeTitle.
///
/// In es, this message translates to:
/// **'Tamaño máximo de grabación'**
String get recordingsMaxSizeTitle;
/// No description provided for @recordingsMaxSizeSubtitle.
///
/// In es, this message translates to:
/// **'Límite actual: {size} MB'**
String recordingsMaxSizeSubtitle(int size);
/// No description provided for @recordingsMaxSizeDialogTitle.
///
/// In es, this message translates to:
/// **'Tamaño máximo por grabación'**
String get recordingsMaxSizeDialogTitle;
/// No description provided for @recordingsMaxSizeMbLabel.
///
/// In es, this message translates to:
/// **'Megabytes máximos'**
String get recordingsMaxSizeMbLabel;
/// No description provided for @recordingsMaxSizeSaved.
///
/// In es, this message translates to:
/// **'Límite de grabación actualizado a {size} MB'**
String recordingsMaxSizeSaved(int size);
} }
class _AppLocalizationsDelegate class _AppLocalizationsDelegate
+47 -19
View File
@@ -12,25 +12,25 @@ class AppLocalizationsAr extends AppLocalizations {
String get appTitle => 'PluriWave'; String get appTitle => 'PluriWave';
@override @override
String get navHome => '????????'; String get navHome => 'Home';
@override @override
String get navSearch => '???'; String get navSearch => 'Search';
@override @override
String get navFavorites => '???????'; String get navFavorites => 'Favorites';
@override @override
String get navAlarms => '????????'; String get navAlarms => 'Alarms';
@override @override
String get navSettings => '?????????'; String get navSettings => 'Settings';
@override @override
String get actionOk => '?????'; String get actionOk => 'OK';
@override @override
String get sleepTimer => '???? ?????'; String get sleepTimer => 'Sleep timer';
@override @override
String get sleepTimerDescription => String get sleepTimerDescription =>
@@ -69,34 +69,35 @@ class AppLocalizationsAr extends AppLocalizations {
} }
@override @override
String get settingsTitle => '?????????'; String get settingsTitle => 'Settings';
@override @override
String get settingsSubtitle => String get settingsSubtitle =>
'???? ???? ?? ????? ?????? ????????? ???????? ???????.'; 'Fine-grained sound control, backups, and custom stations.';
@override @override
String get languageSectionTitle => '?????'; String get languageSectionTitle => 'Language';
@override @override
String get languageSectionDescription => '???? ??? ??? ???????.'; String get languageSectionDescription =>
'Choose how the app language is displayed.';
@override @override
String get languageSystemDefault => '??????'; String get languageSystemDefault => 'System';
@override @override
String get languageSpanish => '?????????'; String get languageSpanish => 'Spanish';
@override @override
String get languageEnglish => '??????????'; String get languageEnglish => 'English';
@override @override
String languageUpdated(Object languageName) { String languageUpdated(Object languageName) {
return '?? ????? ?????: $languageName'; return 'Language updated: $languageName';
} }
@override @override
String get languageUpdatedSystem => '?? ????? ?????: ??????'; String get languageUpdatedSystem => 'Language updated: System';
@override @override
String get timerSectionTitle => 'Sleep timer'; String get timerSectionTitle => 'Sleep timer';
@@ -270,7 +271,7 @@ class AppLocalizationsAr extends AppLocalizations {
String get backupImportSubtitle => 'Restore from a backup file'; String get backupImportSubtitle => 'Restore from a backup file';
@override @override
String get backupShareSubject => 'PluriWave ? backup'; String get backupShareSubject => 'PluriWave backup';
@override @override
String backupShareText(Object date) { String backupShareText(Object date) {
@@ -318,11 +319,38 @@ class AppLocalizationsAr extends AppLocalizations {
String get backgroundAudioSubtitle => 'Continues when the screen turns off'; String get backgroundAudioSubtitle => 'Continues when the screen turns off';
@override @override
String get dash => '?'; String get dash => '';
@override @override
String get cancelAction => '?????'; String get cancelAction => 'Cancel';
@override @override
String get equalizerTitle => 'Equalizer'; String get equalizerTitle => 'Equalizer';
@override
String get recordingsOpenFolder => 'Open folder';
@override
String recordingsOpenFolderError(Object error) {
return 'Could not open the folder: $error';
}
@override
String get recordingsMaxSizeTitle => 'Maximum recording size';
@override
String recordingsMaxSizeSubtitle(int size) {
return 'Current limit: $size MB';
}
@override
String get recordingsMaxSizeDialogTitle => 'Maximum size per recording';
@override
String get recordingsMaxSizeMbLabel => 'Maximum megabytes';
@override
String recordingsMaxSizeSaved(int size) {
return 'Recording limit updated to $size MB';
}
} }
+47 -19
View File
@@ -12,25 +12,25 @@ class AppLocalizationsBn extends AppLocalizations {
String get appTitle => 'PluriWave'; String get appTitle => 'PluriWave';
@override @override
String get navHome => '???'; String get navHome => 'Home';
@override @override
String get navSearch => '????'; String get navSearch => 'Search';
@override @override
String get navFavorites => '??????'; String get navFavorites => 'Favorites';
@override @override
String get navAlarms => '?????????'; String get navAlarms => 'Alarms';
@override @override
String get navSettings => '??????'; String get navSettings => 'Settings';
@override @override
String get actionOk => '??? ???'; String get actionOk => 'OK';
@override @override
String get sleepTimer => '????? ??????'; String get sleepTimer => 'Sleep timer';
@override @override
String get sleepTimerDescription => String get sleepTimerDescription =>
@@ -69,34 +69,35 @@ class AppLocalizationsBn extends AppLocalizations {
} }
@override @override
String get settingsTitle => '??????'; String get settingsTitle => 'Settings';
@override @override
String get settingsSubtitle => String get settingsSubtitle =>
'????, ??????? ??? ?????? ???????? ??????? ???????????'; 'Fine-grained sound control, backups, and custom stations.';
@override @override
String get languageSectionTitle => '????'; String get languageSectionTitle => 'Language';
@override @override
String get languageSectionDescription => '??????? ???????? ???? ???? ????'; String get languageSectionDescription =>
'Choose how the app language is displayed.';
@override @override
String get languageSystemDefault => '???????'; String get languageSystemDefault => 'System';
@override @override
String get languageSpanish => '?????????'; String get languageSpanish => 'Spanish';
@override @override
String get languageEnglish => '??????'; String get languageEnglish => 'English';
@override @override
String languageUpdated(Object languageName) { String languageUpdated(Object languageName) {
return '???? ????? ??????: $languageName'; return 'Language updated: $languageName';
} }
@override @override
String get languageUpdatedSystem => '???? ????? ??????: ???????'; String get languageUpdatedSystem => 'Language updated: System';
@override @override
String get timerSectionTitle => 'Sleep timer'; String get timerSectionTitle => 'Sleep timer';
@@ -270,7 +271,7 @@ class AppLocalizationsBn extends AppLocalizations {
String get backupImportSubtitle => 'Restore from a backup file'; String get backupImportSubtitle => 'Restore from a backup file';
@override @override
String get backupShareSubject => 'PluriWave ? backup'; String get backupShareSubject => 'PluriWave backup';
@override @override
String backupShareText(Object date) { String backupShareText(Object date) {
@@ -318,11 +319,38 @@ class AppLocalizationsBn extends AppLocalizations {
String get backgroundAudioSubtitle => 'Continues when the screen turns off'; String get backgroundAudioSubtitle => 'Continues when the screen turns off';
@override @override
String get dash => '?'; String get dash => '';
@override @override
String get cancelAction => '?????'; String get cancelAction => 'Cancel';
@override @override
String get equalizerTitle => 'Equalizer'; String get equalizerTitle => 'Equalizer';
@override
String get recordingsOpenFolder => 'Open folder';
@override
String recordingsOpenFolderError(Object error) {
return 'Could not open the folder: $error';
}
@override
String get recordingsMaxSizeTitle => 'Maximum recording size';
@override
String recordingsMaxSizeSubtitle(int size) {
return 'Current limit: $size MB';
}
@override
String get recordingsMaxSizeDialogTitle => 'Maximum size per recording';
@override
String get recordingsMaxSizeMbLabel => 'Maximum megabytes';
@override
String recordingsMaxSizeSaved(int size) {
return 'Recording limit updated to $size MB';
}
} }
+32 -4
View File
@@ -73,13 +73,14 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get settingsSubtitle => String get settingsSubtitle =>
'Feinsteuerung f?r Sound, Backups und eigene Sender.'; 'Fine-grained sound control, backups, and custom stations.';
@override @override
String get languageSectionTitle => 'Sprache'; String get languageSectionTitle => 'Sprache';
@override @override
String get languageSectionDescription => 'W?hle die Anzeigesprache der App.'; String get languageSectionDescription =>
'Choose how the app language is displayed.';
@override @override
String get languageSystemDefault => 'System'; String get languageSystemDefault => 'System';
@@ -270,7 +271,7 @@ class AppLocalizationsDe extends AppLocalizations {
String get backupImportSubtitle => 'Restore from a backup file'; String get backupImportSubtitle => 'Restore from a backup file';
@override @override
String get backupShareSubject => 'PluriWave ? backup'; String get backupShareSubject => 'PluriWave backup';
@override @override
String backupShareText(Object date) { String backupShareText(Object date) {
@@ -318,11 +319,38 @@ class AppLocalizationsDe extends AppLocalizations {
String get backgroundAudioSubtitle => 'Continues when the screen turns off'; String get backgroundAudioSubtitle => 'Continues when the screen turns off';
@override @override
String get dash => '?'; String get dash => '';
@override @override
String get cancelAction => 'Abbrechen'; String get cancelAction => 'Abbrechen';
@override @override
String get equalizerTitle => 'Equalizer'; String get equalizerTitle => 'Equalizer';
@override
String get recordingsOpenFolder => 'Open folder';
@override
String recordingsOpenFolderError(Object error) {
return 'Could not open the folder: $error';
}
@override
String get recordingsMaxSizeTitle => 'Maximum recording size';
@override
String recordingsMaxSizeSubtitle(int size) {
return 'Current limit: $size MB';
}
@override
String get recordingsMaxSizeDialogTitle => 'Maximum size per recording';
@override
String get recordingsMaxSizeMbLabel => 'Maximum megabytes';
@override
String recordingsMaxSizeSaved(int size) {
return 'Recording limit updated to $size MB';
}
} }
+31 -4
View File
@@ -137,10 +137,10 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get recordingsDefaultFolderRestored => String get recordingsDefaultFolderRestored =>
'The internal default folder will be used'; 'The default internal folder will be used';
@override @override
String get recordingsFolderTitle => 'Recordings folder'; String get recordingsFolderTitle => 'Recording folder';
@override @override
String get recordingsPathCalculating => 'Calculating path...'; String get recordingsPathCalculating => 'Calculating path...';
@@ -271,7 +271,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get backupImportSubtitle => 'Restore from a backup file'; String get backupImportSubtitle => 'Restore from a backup file';
@override @override
String get backupShareSubject => 'PluriWave ? backup'; String get backupShareSubject => 'PluriWave backup';
@override @override
String backupShareText(Object date) { String backupShareText(Object date) {
@@ -319,11 +319,38 @@ class AppLocalizationsEn extends AppLocalizations {
String get backgroundAudioSubtitle => 'Continues when the screen turns off'; String get backgroundAudioSubtitle => 'Continues when the screen turns off';
@override @override
String get dash => '?'; String get dash => '';
@override @override
String get cancelAction => 'Cancel'; String get cancelAction => 'Cancel';
@override @override
String get equalizerTitle => 'Equalizer'; String get equalizerTitle => 'Equalizer';
@override
String get recordingsOpenFolder => 'Open folder';
@override
String recordingsOpenFolderError(Object error) {
return 'Could not open the folder: $error';
}
@override
String get recordingsMaxSizeTitle => 'Maximum recording size';
@override
String recordingsMaxSizeSubtitle(int size) {
return 'Current limit: $size MB';
}
@override
String get recordingsMaxSizeDialogTitle => 'Maximum size per recording';
@override
String get recordingsMaxSizeMbLabel => 'Maximum megabytes';
@override
String recordingsMaxSizeSaved(int size) {
return 'Recording limit updated to $size MB';
}
} }
+49 -22
View File
@@ -129,7 +129,7 @@ class AppLocalizationsEs extends AppLocalizations {
'Selecciona la carpeta de grabaciones'; 'Selecciona la carpeta de grabaciones';
@override @override
String get recordingsPathUpdated => 'Ruta de grabaci?n actualizada'; String get recordingsPathUpdated => 'Ruta de grabación actualizada';
@override @override
String recordingsPathSaveError(Object error) { String recordingsPathSaveError(Object error) {
@@ -138,10 +138,10 @@ class AppLocalizationsEs extends AppLocalizations {
@override @override
String get recordingsDefaultFolderRestored => String get recordingsDefaultFolderRestored =>
'Se usar? la carpeta interna por defecto'; 'Se usará la carpeta interna por defecto';
@override @override
String get recordingsFolderTitle => 'Carpeta de grabaci?n'; String get recordingsFolderTitle => 'Carpeta de grabación';
@override @override
String get recordingsPathCalculating => 'Calculando ruta...'; String get recordingsPathCalculating => 'Calculando ruta...';
@@ -171,7 +171,7 @@ class AppLocalizationsEs extends AppLocalizations {
@override @override
String get equalizerPendingSubtitle => String get equalizerPendingSubtitle =>
'Se guardan los cambios y se aplicar?n cuando Android habilite el efecto.'; 'Se guardan los cambios y se aplicarán cuando Android habilite el efecto.';
@override @override
String get equalizerPerStationTitle => 'Usar EQ propio para esta favorita'; String get equalizerPerStationTitle => 'Usar EQ propio para esta favorita';
@@ -191,18 +191,18 @@ class AppLocalizationsEs extends AppLocalizations {
@override @override
String get preferredStationDescription => String get preferredStationDescription =>
'Se preselecciona al crear alarmas y puede iniciarse como reproducci?n r?pida.'; 'Se preselecciona al crear alarmas y puede iniciarse como reproducción rápida.';
@override @override
String get preferredStationNoStationsTitle => String get preferredStationNoStationsTitle =>
'Todav?a no hay emisoras disponibles'; 'Todavía no hay emisoras disponibles';
@override @override
String get preferredStationNoStationsSubtitle => String get preferredStationNoStationsSubtitle =>
'Guard? favoritas o carg? emisoras para elegir una preferida.'; 'Guardá favoritas o cargá emisoras para elegir una preferida.';
@override @override
String get preferredStationAutomaticFallback => 'Fallback autom?tico'; String get preferredStationAutomaticFallback => 'Fallback automático';
@override @override
String get preferredStationDefaultFavorite => 'Favorita por defecto'; String get preferredStationDefaultFavorite => 'Favorita por defecto';
@@ -214,7 +214,7 @@ class AppLocalizationsEs extends AppLocalizations {
@override @override
String preferredStationAutoUsing(Object stationName) { String preferredStationAutoUsing(Object stationName) {
return 'Sin favoritas: usando autom?ticamente $stationName'; return 'Sin favoritas: usando automáticamente $stationName';
} }
@override @override
@@ -224,7 +224,7 @@ class AppLocalizationsEs extends AppLocalizations {
String get customStationsTitle => 'Emisoras personalizadas'; String get customStationsTitle => 'Emisoras personalizadas';
@override @override
String get customStationsAdd => 'A?adir'; String get customStationsAdd => 'Añadir';
@override @override
String get customStationsEmpty => 'No hay emisoras personalizadas.'; String get customStationsEmpty => 'No hay emisoras personalizadas.';
@@ -236,7 +236,7 @@ class AppLocalizationsEs extends AppLocalizations {
String get deleteAction => 'Eliminar'; String get deleteAction => 'Eliminar';
@override @override
String get addStationTitle => 'A?adir emisora'; String get addStationTitle => 'Añadir emisora';
@override @override
String get stationNameLabel => 'Nombre *'; String get stationNameLabel => 'Nombre *';
@@ -248,10 +248,10 @@ class AppLocalizationsEs extends AppLocalizations {
String get streamUrlLabel => 'URL del stream *'; String get streamUrlLabel => 'URL del stream *';
@override @override
String get invalidUrl => 'URL no v?lida'; String get invalidUrl => 'URL no válida';
@override @override
String get countryOptionalLabel => 'Pa?s (opcional)'; String get countryOptionalLabel => 'País (opcional)';
@override @override
String get saveStation => 'Guardar emisora'; String get saveStation => 'Guardar emisora';
@@ -260,25 +260,25 @@ class AppLocalizationsEs extends AppLocalizations {
String get backupSectionTitle => 'Copia de seguridad'; String get backupSectionTitle => 'Copia de seguridad';
@override @override
String get backupExportTitle => 'Exportar configuraci?n'; String get backupExportTitle => 'Exportar configuración';
@override @override
String get backupExportSubtitle => String get backupExportSubtitle =>
'Favoritos, emisoras custom y presets de EQ'; 'Favoritos, emisoras custom y presets de EQ';
@override @override
String get backupImportTitle => 'Importar configuraci?n'; String get backupImportTitle => 'Importar configuración';
@override @override
String get backupImportSubtitle => String get backupImportSubtitle =>
'Restaurar desde un fichero de copia de seguridad'; 'Restaurar desde un fichero de copia de seguridad';
@override @override
String get backupShareSubject => 'PluriWave ? copia de seguridad'; String get backupShareSubject => 'PluriWave copia de seguridad';
@override @override
String backupShareText(Object date) { String backupShareText(Object date) {
return 'Configuraci?n de PluriWave exportada el $date'; return 'Configuración de PluriWave exportada el $date';
} }
@override @override
@@ -288,10 +288,10 @@ class AppLocalizationsEs extends AppLocalizations {
@override @override
String get backupImportConfirmMessage => String get backupImportConfirmMessage =>
'Esto a?adir? los favoritos, emisoras y presets del fichero. ?Continuar?'; 'Esto añadirá los favoritos, emisoras y presets del fichero. ¿Continuar?';
@override @override
String get backupImportSuccess => 'Configuraci?n importada correctamente'; String get backupImportSuccess => 'Configuración importada correctamente';
@override @override
String backupImportError(Object error) { String backupImportError(Object error) {
@@ -299,7 +299,7 @@ class AppLocalizationsEs extends AppLocalizations {
} }
@override @override
String get appVersionLoading => 'Cargando versi?n...'; String get appVersionLoading => 'Cargando versión...';
@override @override
String appVersionSubtitle(Object version) { String appVersionSubtitle(Object version) {
@@ -319,14 +319,41 @@ class AppLocalizationsEs extends AppLocalizations {
String get backgroundAudioTitle => 'Audio en background'; String get backgroundAudioTitle => 'Audio en background';
@override @override
String get backgroundAudioSubtitle => 'Contin?a al apagar la pantalla'; String get backgroundAudioSubtitle => 'Continúa al apagar la pantalla';
@override @override
String get dash => '?'; String get dash => '';
@override @override
String get cancelAction => 'Cancelar'; String get cancelAction => 'Cancelar';
@override @override
String get equalizerTitle => 'Ecualizador'; String get equalizerTitle => 'Ecualizador';
@override
String get recordingsOpenFolder => 'Abrir carpeta';
@override
String recordingsOpenFolderError(Object error) {
return 'No se pudo abrir la carpeta: $error';
}
@override
String get recordingsMaxSizeTitle => 'Tamaño máximo de grabación';
@override
String recordingsMaxSizeSubtitle(int size) {
return 'Límite actual: $size MB';
}
@override
String get recordingsMaxSizeDialogTitle => 'Tamaño máximo por grabación';
@override
String get recordingsMaxSizeMbLabel => 'Megabytes máximos';
@override
String recordingsMaxSizeSaved(int size) {
return 'Límite de grabación actualizado a $size MB';
}
} }
+36 -9
View File
@@ -24,7 +24,7 @@ class AppLocalizationsFr extends AppLocalizations {
String get navAlarms => 'Alarmes'; String get navAlarms => 'Alarmes';
@override @override
String get navSettings => 'R?glages'; String get navSettings => 'Settings';
@override @override
String get actionOk => 'OK'; String get actionOk => 'OK';
@@ -69,21 +69,21 @@ class AppLocalizationsFr extends AppLocalizations {
} }
@override @override
String get settingsTitle => 'R?glages'; String get settingsTitle => 'Settings';
@override @override
String get settingsSubtitle => String get settingsSubtitle =>
'Contr?le fin du son, sauvegardes et stations personnalis?es.'; 'Fine-grained sound control, backups, and custom stations.';
@override @override
String get languageSectionTitle => 'Langue'; String get languageSectionTitle => 'Langue';
@override @override
String get languageSectionDescription => String get languageSectionDescription =>
'Choisissez la langue d?affichage de l?application.'; 'Choose how the app language is displayed.';
@override @override
String get languageSystemDefault => 'Syst?me'; String get languageSystemDefault => 'System';
@override @override
String get languageSpanish => 'Espagnol'; String get languageSpanish => 'Espagnol';
@@ -93,11 +93,11 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String languageUpdated(Object languageName) { String languageUpdated(Object languageName) {
return 'Langue mise ? jour : $languageName'; return 'Language updated: $languageName';
} }
@override @override
String get languageUpdatedSystem => 'Langue mise ? jour : Syst?me'; String get languageUpdatedSystem => 'Language updated: System';
@override @override
String get timerSectionTitle => 'Sleep timer'; String get timerSectionTitle => 'Sleep timer';
@@ -271,7 +271,7 @@ class AppLocalizationsFr extends AppLocalizations {
String get backupImportSubtitle => 'Restore from a backup file'; String get backupImportSubtitle => 'Restore from a backup file';
@override @override
String get backupShareSubject => 'PluriWave ? backup'; String get backupShareSubject => 'PluriWave backup';
@override @override
String backupShareText(Object date) { String backupShareText(Object date) {
@@ -319,11 +319,38 @@ class AppLocalizationsFr extends AppLocalizations {
String get backgroundAudioSubtitle => 'Continues when the screen turns off'; String get backgroundAudioSubtitle => 'Continues when the screen turns off';
@override @override
String get dash => '?'; String get dash => '';
@override @override
String get cancelAction => 'Annuler'; String get cancelAction => 'Annuler';
@override @override
String get equalizerTitle => 'Equalizer'; String get equalizerTitle => 'Equalizer';
@override
String get recordingsOpenFolder => 'Open folder';
@override
String recordingsOpenFolderError(Object error) {
return 'Could not open the folder: $error';
}
@override
String get recordingsMaxSizeTitle => 'Maximum recording size';
@override
String recordingsMaxSizeSubtitle(int size) {
return 'Current limit: $size MB';
}
@override
String get recordingsMaxSizeDialogTitle => 'Maximum size per recording';
@override
String get recordingsMaxSizeMbLabel => 'Maximum megabytes';
@override
String recordingsMaxSizeSaved(int size) {
return 'Recording limit updated to $size MB';
}
} }
+47 -19
View File
@@ -12,25 +12,25 @@ class AppLocalizationsHi extends AppLocalizations {
String get appTitle => 'PluriWave'; String get appTitle => 'PluriWave';
@override @override
String get navHome => '???'; String get navHome => 'Home';
@override @override
String get navSearch => '???'; String get navSearch => 'Search';
@override @override
String get navFavorites => '???????'; String get navFavorites => 'Favorites';
@override @override
String get navAlarms => '??????'; String get navAlarms => 'Alarms';
@override @override
String get navSettings => '????????'; String get navSettings => 'Settings';
@override @override
String get actionOk => '???'; String get actionOk => 'OK';
@override @override
String get sleepTimer => '????? ?????'; String get sleepTimer => 'Sleep timer';
@override @override
String get sleepTimerDescription => String get sleepTimerDescription =>
@@ -69,34 +69,35 @@ class AppLocalizationsHi extends AppLocalizations {
} }
@override @override
String get settingsTitle => '????????'; String get settingsTitle => 'Settings';
@override @override
String get settingsSubtitle => String get settingsSubtitle =>
'?????, ????? ?? ????? ???????? ?? ??????? ?????????'; 'Fine-grained sound control, backups, and custom stations.';
@override @override
String get languageSectionTitle => '????'; String get languageSectionTitle => 'Language';
@override @override
String get languageSectionDescription => '?? ?? ???? ??????'; String get languageSectionDescription =>
'Choose how the app language is displayed.';
@override @override
String get languageSystemDefault => '??????'; String get languageSystemDefault => 'System';
@override @override
String get languageSpanish => '??????'; String get languageSpanish => 'Spanish';
@override @override
String get languageEnglish => '?????????'; String get languageEnglish => 'English';
@override @override
String languageUpdated(Object languageName) { String languageUpdated(Object languageName) {
return '???? ???? ??: $languageName'; return 'Language updated: $languageName';
} }
@override @override
String get languageUpdatedSystem => '???? ???? ??: ??????'; String get languageUpdatedSystem => 'Language updated: System';
@override @override
String get timerSectionTitle => 'Sleep timer'; String get timerSectionTitle => 'Sleep timer';
@@ -270,7 +271,7 @@ class AppLocalizationsHi extends AppLocalizations {
String get backupImportSubtitle => 'Restore from a backup file'; String get backupImportSubtitle => 'Restore from a backup file';
@override @override
String get backupShareSubject => 'PluriWave ? backup'; String get backupShareSubject => 'PluriWave backup';
@override @override
String backupShareText(Object date) { String backupShareText(Object date) {
@@ -318,11 +319,38 @@ class AppLocalizationsHi extends AppLocalizations {
String get backgroundAudioSubtitle => 'Continues when the screen turns off'; String get backgroundAudioSubtitle => 'Continues when the screen turns off';
@override @override
String get dash => '?'; String get dash => '';
@override @override
String get cancelAction => '???? ????'; String get cancelAction => 'Cancel';
@override @override
String get equalizerTitle => 'Equalizer'; String get equalizerTitle => 'Equalizer';
@override
String get recordingsOpenFolder => 'Open folder';
@override
String recordingsOpenFolderError(Object error) {
return 'Could not open the folder: $error';
}
@override
String get recordingsMaxSizeTitle => 'Maximum recording size';
@override
String recordingsMaxSizeSubtitle(int size) {
return 'Current limit: $size MB';
}
@override
String get recordingsMaxSizeDialogTitle => 'Maximum size per recording';
@override
String get recordingsMaxSizeMbLabel => 'Maximum megabytes';
@override
String recordingsMaxSizeSaved(int size) {
return 'Recording limit updated to $size MB';
}
} }
+29 -2
View File
@@ -270,7 +270,7 @@ class AppLocalizationsId extends AppLocalizations {
String get backupImportSubtitle => 'Restore from a backup file'; String get backupImportSubtitle => 'Restore from a backup file';
@override @override
String get backupShareSubject => 'PluriWave ? backup'; String get backupShareSubject => 'PluriWave backup';
@override @override
String backupShareText(Object date) { String backupShareText(Object date) {
@@ -318,11 +318,38 @@ class AppLocalizationsId extends AppLocalizations {
String get backgroundAudioSubtitle => 'Continues when the screen turns off'; String get backgroundAudioSubtitle => 'Continues when the screen turns off';
@override @override
String get dash => '?'; String get dash => '';
@override @override
String get cancelAction => 'Batal'; String get cancelAction => 'Batal';
@override @override
String get equalizerTitle => 'Equalizer'; String get equalizerTitle => 'Equalizer';
@override
String get recordingsOpenFolder => 'Open folder';
@override
String recordingsOpenFolderError(Object error) {
return 'Could not open the folder: $error';
}
@override
String get recordingsMaxSizeTitle => 'Maximum recording size';
@override
String recordingsMaxSizeSubtitle(int size) {
return 'Current limit: $size MB';
}
@override
String get recordingsMaxSizeDialogTitle => 'Maximum size per recording';
@override
String get recordingsMaxSizeMbLabel => 'Maximum megabytes';
@override
String recordingsMaxSizeSaved(int size) {
return 'Recording limit updated to $size MB';
}
} }
+30 -3
View File
@@ -80,7 +80,7 @@ class AppLocalizationsIt extends AppLocalizations {
@override @override
String get languageSectionDescription => String get languageSectionDescription =>
'Scegli la lingua di visualizzazione dell?app.'; 'Choose how the app language is displayed.';
@override @override
String get languageSystemDefault => 'Sistema'; String get languageSystemDefault => 'Sistema';
@@ -271,7 +271,7 @@ class AppLocalizationsIt extends AppLocalizations {
String get backupImportSubtitle => 'Restore from a backup file'; String get backupImportSubtitle => 'Restore from a backup file';
@override @override
String get backupShareSubject => 'PluriWave ? backup'; String get backupShareSubject => 'PluriWave backup';
@override @override
String backupShareText(Object date) { String backupShareText(Object date) {
@@ -319,11 +319,38 @@ class AppLocalizationsIt extends AppLocalizations {
String get backgroundAudioSubtitle => 'Continues when the screen turns off'; String get backgroundAudioSubtitle => 'Continues when the screen turns off';
@override @override
String get dash => '?'; String get dash => '';
@override @override
String get cancelAction => 'Annulla'; String get cancelAction => 'Annulla';
@override @override
String get equalizerTitle => 'Equalizer'; String get equalizerTitle => 'Equalizer';
@override
String get recordingsOpenFolder => 'Open folder';
@override
String recordingsOpenFolderError(Object error) {
return 'Could not open the folder: $error';
}
@override
String get recordingsMaxSizeTitle => 'Maximum recording size';
@override
String recordingsMaxSizeSubtitle(int size) {
return 'Current limit: $size MB';
}
@override
String get recordingsMaxSizeDialogTitle => 'Maximum size per recording';
@override
String get recordingsMaxSizeMbLabel => 'Maximum megabytes';
@override
String recordingsMaxSizeSaved(int size) {
return 'Recording limit updated to $size MB';
}
} }
+47 -18
View File
@@ -12,25 +12,25 @@ class AppLocalizationsJa extends AppLocalizations {
String get appTitle => 'PluriWave'; String get appTitle => 'PluriWave';
@override @override
String get navHome => '???'; String get navHome => 'Home';
@override @override
String get navSearch => '??'; String get navSearch => 'Search';
@override @override
String get navFavorites => '?????'; String get navFavorites => 'Favorites';
@override @override
String get navAlarms => '????'; String get navAlarms => 'Alarms';
@override @override
String get navSettings => '??'; String get navSettings => 'Settings';
@override @override
String get actionOk => 'OK'; String get actionOk => 'OK';
@override @override
String get sleepTimer => '????????'; String get sleepTimer => 'Sleep timer';
@override @override
String get sleepTimerDescription => String get sleepTimerDescription =>
@@ -69,33 +69,35 @@ class AppLocalizationsJa extends AppLocalizations {
} }
@override @override
String get settingsTitle => '??'; String get settingsTitle => 'Settings';
@override @override
String get settingsSubtitle => '?????????????????????????'; String get settingsSubtitle =>
'Fine-grained sound control, backups, and custom stations.';
@override @override
String get languageSectionTitle => '??'; String get languageSectionTitle => 'Language';
@override @override
String get languageSectionDescription => '???????????????'; String get languageSectionDescription =>
'Choose how the app language is displayed.';
@override @override
String get languageSystemDefault => '????'; String get languageSystemDefault => 'System';
@override @override
String get languageSpanish => '?????'; String get languageSpanish => 'Spanish';
@override @override
String get languageEnglish => '??'; String get languageEnglish => 'English';
@override @override
String languageUpdated(Object languageName) { String languageUpdated(Object languageName) {
return '?????????: $languageName'; return 'Language updated: $languageName';
} }
@override @override
String get languageUpdatedSystem => '?????????: ????'; String get languageUpdatedSystem => 'Language updated: System';
@override @override
String get timerSectionTitle => 'Sleep timer'; String get timerSectionTitle => 'Sleep timer';
@@ -269,7 +271,7 @@ class AppLocalizationsJa extends AppLocalizations {
String get backupImportSubtitle => 'Restore from a backup file'; String get backupImportSubtitle => 'Restore from a backup file';
@override @override
String get backupShareSubject => 'PluriWave ? backup'; String get backupShareSubject => 'PluriWave backup';
@override @override
String backupShareText(Object date) { String backupShareText(Object date) {
@@ -317,11 +319,38 @@ class AppLocalizationsJa extends AppLocalizations {
String get backgroundAudioSubtitle => 'Continues when the screen turns off'; String get backgroundAudioSubtitle => 'Continues when the screen turns off';
@override @override
String get dash => '?'; String get dash => '';
@override @override
String get cancelAction => '?????'; String get cancelAction => 'Cancel';
@override @override
String get equalizerTitle => 'Equalizer'; String get equalizerTitle => 'Equalizer';
@override
String get recordingsOpenFolder => 'Open folder';
@override
String recordingsOpenFolderError(Object error) {
return 'Could not open the folder: $error';
}
@override
String get recordingsMaxSizeTitle => 'Maximum recording size';
@override
String recordingsMaxSizeSubtitle(int size) {
return 'Current limit: $size MB';
}
@override
String get recordingsMaxSizeDialogTitle => 'Maximum size per recording';
@override
String get recordingsMaxSizeMbLabel => 'Maximum megabytes';
@override
String recordingsMaxSizeSaved(int size) {
return 'Recording limit updated to $size MB';
}
} }
+35 -8
View File
@@ -12,7 +12,7 @@ class AppLocalizationsPt extends AppLocalizations {
String get appTitle => 'PluriWave'; String get appTitle => 'PluriWave';
@override @override
String get navHome => 'In?cio'; String get navHome => 'Home';
@override @override
String get navSearch => 'Buscar'; String get navSearch => 'Buscar';
@@ -24,7 +24,7 @@ class AppLocalizationsPt extends AppLocalizations {
String get navAlarms => 'Alarmes'; String get navAlarms => 'Alarmes';
@override @override
String get navSettings => 'Defini??es'; String get navSettings => 'Settings';
@override @override
String get actionOk => 'OK'; String get actionOk => 'OK';
@@ -69,18 +69,18 @@ class AppLocalizationsPt extends AppLocalizations {
} }
@override @override
String get settingsTitle => 'Defini??es'; String get settingsTitle => 'Settings';
@override @override
String get settingsSubtitle => String get settingsSubtitle =>
'Controle fino de som, backups e esta??es personalizadas.'; 'Fine-grained sound control, backups, and custom stations.';
@override @override
String get languageSectionTitle => 'Idioma'; String get languageSectionTitle => 'Idioma';
@override @override
String get languageSectionDescription => String get languageSectionDescription =>
'Escolha como o idioma do app ? exibido.'; 'Choose how the app language is displayed.';
@override @override
String get languageSystemDefault => 'Sistema'; String get languageSystemDefault => 'Sistema';
@@ -89,7 +89,7 @@ class AppLocalizationsPt extends AppLocalizations {
String get languageSpanish => 'Espanhol'; String get languageSpanish => 'Espanhol';
@override @override
String get languageEnglish => 'Ingl?s'; String get languageEnglish => 'English';
@override @override
String languageUpdated(Object languageName) { String languageUpdated(Object languageName) {
@@ -271,7 +271,7 @@ class AppLocalizationsPt extends AppLocalizations {
String get backupImportSubtitle => 'Restore from a backup file'; String get backupImportSubtitle => 'Restore from a backup file';
@override @override
String get backupShareSubject => 'PluriWave ? backup'; String get backupShareSubject => 'PluriWave backup';
@override @override
String backupShareText(Object date) { String backupShareText(Object date) {
@@ -319,11 +319,38 @@ class AppLocalizationsPt extends AppLocalizations {
String get backgroundAudioSubtitle => 'Continues when the screen turns off'; String get backgroundAudioSubtitle => 'Continues when the screen turns off';
@override @override
String get dash => '?'; String get dash => '';
@override @override
String get cancelAction => 'Cancelar'; String get cancelAction => 'Cancelar';
@override @override
String get equalizerTitle => 'Equalizer'; String get equalizerTitle => 'Equalizer';
@override
String get recordingsOpenFolder => 'Open folder';
@override
String recordingsOpenFolderError(Object error) {
return 'Could not open the folder: $error';
}
@override
String get recordingsMaxSizeTitle => 'Maximum recording size';
@override
String recordingsMaxSizeSubtitle(int size) {
return 'Current limit: $size MB';
}
@override
String get recordingsMaxSizeDialogTitle => 'Maximum size per recording';
@override
String get recordingsMaxSizeMbLabel => 'Maximum megabytes';
@override
String recordingsMaxSizeSaved(int size) {
return 'Recording limit updated to $size MB';
}
} }
+45 -18
View File
@@ -12,25 +12,25 @@ class AppLocalizationsRu extends AppLocalizations {
String get appTitle => 'PluriWave'; String get appTitle => 'PluriWave';
@override @override
String get navHome => '???????'; String get navHome => 'Home';
@override @override
String get navSearch => '?????'; String get navSearch => 'Search';
@override @override
String get navFavorites => '?????????'; String get navFavorites => 'Favorites';
@override @override
String get navAlarms => '??????????'; String get navAlarms => 'Alarms';
@override @override
String get navSettings => '?????????'; String get navSettings => 'Settings';
@override @override
String get actionOk => 'OK'; String get actionOk => 'OK';
@override @override
String get sleepTimer => '?????? ???'; String get sleepTimer => 'Sleep timer';
@override @override
String get sleepTimerDescription => String get sleepTimerDescription =>
@@ -69,35 +69,35 @@ class AppLocalizationsRu extends AppLocalizations {
} }
@override @override
String get settingsTitle => '?????????'; String get settingsTitle => 'Settings';
@override @override
String get settingsSubtitle => String get settingsSubtitle =>
'?????? ????????? ?????, ????????? ????? ? ???????????????? ???????.'; 'Fine-grained sound control, backups, and custom stations.';
@override @override
String get languageSectionTitle => '????'; String get languageSectionTitle => 'Language';
@override @override
String get languageSectionDescription => String get languageSectionDescription =>
'???????? ???? ?????????? ??????????.'; 'Choose how the app language is displayed.';
@override @override
String get languageSystemDefault => '???????'; String get languageSystemDefault => 'System';
@override @override
String get languageSpanish => '?????????'; String get languageSpanish => 'Spanish';
@override @override
String get languageEnglish => '??????????'; String get languageEnglish => 'English';
@override @override
String languageUpdated(Object languageName) { String languageUpdated(Object languageName) {
return '???? ????????: $languageName'; return 'Language updated: $languageName';
} }
@override @override
String get languageUpdatedSystem => '???? ????????: ???????'; String get languageUpdatedSystem => 'Language updated: System';
@override @override
String get timerSectionTitle => 'Sleep timer'; String get timerSectionTitle => 'Sleep timer';
@@ -271,7 +271,7 @@ class AppLocalizationsRu extends AppLocalizations {
String get backupImportSubtitle => 'Restore from a backup file'; String get backupImportSubtitle => 'Restore from a backup file';
@override @override
String get backupShareSubject => 'PluriWave ? backup'; String get backupShareSubject => 'PluriWave backup';
@override @override
String backupShareText(Object date) { String backupShareText(Object date) {
@@ -319,11 +319,38 @@ class AppLocalizationsRu extends AppLocalizations {
String get backgroundAudioSubtitle => 'Continues when the screen turns off'; String get backgroundAudioSubtitle => 'Continues when the screen turns off';
@override @override
String get dash => '?'; String get dash => '';
@override @override
String get cancelAction => '??????'; String get cancelAction => 'Cancel';
@override @override
String get equalizerTitle => 'Equalizer'; String get equalizerTitle => 'Equalizer';
@override
String get recordingsOpenFolder => 'Open folder';
@override
String recordingsOpenFolderError(Object error) {
return 'Could not open the folder: $error';
}
@override
String get recordingsMaxSizeTitle => 'Maximum recording size';
@override
String recordingsMaxSizeSubtitle(int size) {
return 'Current limit: $size MB';
}
@override
String get recordingsMaxSizeDialogTitle => 'Maximum size per recording';
@override
String get recordingsMaxSizeMbLabel => 'Maximum megabytes';
@override
String recordingsMaxSizeSaved(int size) {
return 'Recording limit updated to $size MB';
}
} }
+48 -19
View File
@@ -12,25 +12,25 @@ class AppLocalizationsZh extends AppLocalizations {
String get appTitle => 'PluriWave'; String get appTitle => 'PluriWave';
@override @override
String get navHome => '??'; String get navHome => 'Home';
@override @override
String get navSearch => '??'; String get navSearch => 'Search';
@override @override
String get navFavorites => '??'; String get navFavorites => 'Favorites';
@override @override
String get navAlarms => '??'; String get navAlarms => 'Alarms';
@override @override
String get navSettings => '??'; String get navSettings => 'Settings';
@override @override
String get actionOk => '??'; String get actionOk => 'OK';
@override @override
String get sleepTimer => '?????'; String get sleepTimer => 'Sleep timer';
@override @override
String get sleepTimerDescription => String get sleepTimerDescription =>
@@ -69,33 +69,35 @@ class AppLocalizationsZh extends AppLocalizations {
} }
@override @override
String get settingsTitle => '??'; String get settingsTitle => 'Settings';
@override @override
String get settingsSubtitle => '?????????????????'; String get settingsSubtitle =>
'Fine-grained sound control, backups, and custom stations.';
@override @override
String get languageSectionTitle => '??'; String get languageSectionTitle => 'Language';
@override @override
String get languageSectionDescription => '?????????'; String get languageSectionDescription =>
'Choose how the app language is displayed.';
@override @override
String get languageSystemDefault => '??'; String get languageSystemDefault => 'System';
@override @override
String get languageSpanish => '????'; String get languageSpanish => 'Spanish';
@override @override
String get languageEnglish => '??'; String get languageEnglish => 'English';
@override @override
String languageUpdated(Object languageName) { String languageUpdated(Object languageName) {
return '??????$languageName'; return 'Language updated: $languageName';
} }
@override @override
String get languageUpdatedSystem => '????????'; String get languageUpdatedSystem => 'Language updated: System';
@override @override
String get timerSectionTitle => 'Sleep timer'; String get timerSectionTitle => 'Sleep timer';
@@ -269,7 +271,7 @@ class AppLocalizationsZh extends AppLocalizations {
String get backupImportSubtitle => 'Restore from a backup file'; String get backupImportSubtitle => 'Restore from a backup file';
@override @override
String get backupShareSubject => 'PluriWave ? backup'; String get backupShareSubject => 'PluriWave backup';
@override @override
String backupShareText(Object date) { String backupShareText(Object date) {
@@ -317,11 +319,38 @@ class AppLocalizationsZh extends AppLocalizations {
String get backgroundAudioSubtitle => 'Continues when the screen turns off'; String get backgroundAudioSubtitle => 'Continues when the screen turns off';
@override @override
String get dash => '?'; String get dash => '';
@override @override
String get cancelAction => '??'; String get cancelAction => 'Cancel';
@override @override
String get equalizerTitle => 'Equalizer'; String get equalizerTitle => 'Equalizer';
@override
String get recordingsOpenFolder => 'Open folder';
@override
String recordingsOpenFolderError(Object error) {
return 'Could not open the folder: $error';
}
@override
String get recordingsMaxSizeTitle => 'Maximum recording size';
@override
String recordingsMaxSizeSubtitle(int size) {
return 'Current limit: $size MB';
}
@override
String get recordingsMaxSizeDialogTitle => 'Maximum size per recording';
@override
String get recordingsMaxSizeMbLabel => 'Maximum megabytes';
@override
String recordingsMaxSizeSaved(int size) {
return 'Recording limit updated to $size MB';
}
} }
+112 -12
View File
@@ -87,10 +87,12 @@ class _SeccionGrabaciones extends StatelessWidget {
if (ruta == null) return; if (ruta == null) return;
try { try {
await estado.cambiarDirectorioGrabacion(ruta); await estado.cambiarDirectorioGrabacion(ruta);
if (!context.mounted) return;
messenger.showSnackBar( messenger.showSnackBar(
const SnackBar(content: Text('Ruta de grabación actualizada')), SnackBar(content: Text(l10n.recordingsPathUpdated)),
); );
} catch (e) { } catch (e) {
if (!context.mounted) return;
messenger.showSnackBar( messenger.showSnackBar(
SnackBar(content: Text(l10n.recordingsPathSaveError(e.toString()))), SnackBar(content: Text(l10n.recordingsPathSaveError(e.toString()))),
); );
@@ -100,15 +102,97 @@ class _SeccionGrabaciones extends StatelessWidget {
Future<void> _restaurarRuta(BuildContext context) async { Future<void> _restaurarRuta(BuildContext context) async {
final estado = context.read<EstadoRadio>(); final estado = context.read<EstadoRadio>();
final messenger = ScaffoldMessenger.of(context); final messenger = ScaffoldMessenger.of(context);
final l10n = AppLocalizations.of(context);
await estado.restaurarDirectorioGrabacion(); await estado.restaurarDirectorioGrabacion();
if (!context.mounted) return;
messenger.showSnackBar( messenger.showSnackBar(
const SnackBar(content: Text('Se usará la carpeta interna por defecto')), SnackBar(content: Text(l10n.recordingsDefaultFolderRestored)),
); );
} }
Future<void> _abrirCarpeta(BuildContext context) async {
final estado = context.read<EstadoRadio>();
final messenger = ScaffoldMessenger.of(context);
final l10n = AppLocalizations.of(context);
try {
final abierto = await estado.abrirDirectorioGrabacion();
if (!context.mounted) return;
if (!abierto) {
messenger.showSnackBar(
SnackBar(content: Text(l10n.recordingsOpenFolderError(l10n.dash))),
);
}
} catch (e) {
if (!context.mounted) return;
messenger.showSnackBar(
SnackBar(content: Text(l10n.recordingsOpenFolderError(e.toString()))),
);
}
}
Future<void> _editarTamanoMaximo(BuildContext context) async {
final estado = context.read<EstadoRadio>();
final l10n = AppLocalizations.of(context);
final actualMb = _bytesAMegabytes(estado.maxBytesGrabacion);
final controller = TextEditingController(text: actualMb.toString());
final nuevoMb = await showModalBottomSheet<int>(
context: context,
isScrollControlled: true,
showDragHandle: true,
builder: (ctx) {
final bottom = MediaQuery.viewInsetsOf(ctx).bottom;
return Padding(
padding: EdgeInsets.fromLTRB(20, 0, 20, bottom + 24),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
l10n.recordingsMaxSizeDialogTitle,
style: Theme.of(ctx).textTheme.titleLarge,
),
const SizedBox(height: 16),
TextField(
controller: controller,
autofocus: true,
keyboardType: TextInputType.number,
decoration: InputDecoration(
labelText: l10n.recordingsMaxSizeMbLabel,
border: const OutlineInputBorder(),
),
),
const SizedBox(height: 16),
FilledButton.icon(
onPressed: () {
final value = int.tryParse(controller.text.trim());
if (value == null || value <= 0) return;
Navigator.of(ctx).pop(value);
},
icon: const Icon(Icons.save_rounded),
label: Text(l10n.saveQuickAccessButton),
),
],
),
);
},
);
controller.dispose();
if (nuevoMb == null || !context.mounted) return;
await estado.cambiarMaxBytesGrabacion(nuevoMb * 1024 * 1024);
if (!context.mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(l10n.recordingsMaxSizeSaved(nuevoMb))),
);
}
int _bytesAMegabytes(int bytes) =>
(bytes / (1024 * 1024)).round().clamp(1, 1048576);
@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(
@@ -119,7 +203,7 @@ class _SeccionGrabaciones extends StatelessWidget {
const Icon(Icons.radio_button_checked), const Icon(Icons.radio_button_checked),
const SizedBox(width: 12), const SizedBox(width: 12),
Text( Text(
AppLocalizations.of(context).recordingsSectionTitle, l10n.recordingsSectionTitle,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
), ),
], ],
@@ -130,35 +214,51 @@ class _SeccionGrabaciones extends StatelessWidget {
(ctx, snap) => ListTile( (ctx, snap) => ListTile(
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
leading: const Icon(Icons.folder_outlined), leading: const Icon(Icons.folder_outlined),
title: const Text('Carpeta de grabación'), title: Text(l10n.recordingsFolderTitle),
subtitle: Text( subtitle: Text(
snap.data ?? AppLocalizations.of(context).recordingsPathCalculating, snap.data ?? l10n.recordingsPathCalculating,
maxLines: 2, maxLines: 2,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
), ),
onTap: () => _seleccionarRuta(context), onTap: () => _seleccionarRuta(context),
), ),
), ),
Row( Wrap(
spacing: 8,
runSpacing: 8,
children: [ children: [
Expanded( OutlinedButton.icon(
child: OutlinedButton.icon(
icon: const Icon(Icons.folder_open_rounded), icon: const Icon(Icons.folder_open_rounded),
label: Text(AppLocalizations.of(context).recordingsChangePath), label: Text(l10n.recordingsChangePath),
onPressed: () => _seleccionarRuta(context), onPressed: () => _seleccionarRuta(context),
), ),
FilledButton.tonalIcon(
icon: const Icon(Icons.folder_copy_rounded),
label: Text(l10n.recordingsOpenFolder),
onPressed: () => _abrirCarpeta(context),
), ),
const SizedBox(width: 8),
IconButton.filledTonal( IconButton.filledTonal(
tooltip: AppLocalizations.of(context).recordingsUseDefaultPath, tooltip: l10n.recordingsUseDefaultPath,
icon: const Icon(Icons.restore_rounded), icon: const Icon(Icons.restore_rounded),
onPressed: () => _restaurarRuta(context), onPressed: () => _restaurarRuta(context),
), ),
], ],
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
ListTile(
contentPadding: EdgeInsets.zero,
leading: const Icon(Icons.sd_storage_rounded),
title: Text(l10n.recordingsMaxSizeTitle),
subtitle: Text(
l10n.recordingsMaxSizeSubtitle(
_bytesAMegabytes(estado.maxBytesGrabacion),
),
),
onTap: () => _editarTamanoMaximo(context),
),
const SizedBox(height: 8),
Text( Text(
AppLocalizations.of(context).recordingsOriginalStreamHint, l10n.recordingsOriginalStreamHint,
style: Theme.of(context).textTheme.bodySmall, style: Theme.of(context).textTheme.bodySmall,
), ),
], ],
+1 -1
View File
@@ -628,7 +628,7 @@ class _Controles extends StatelessWidget {
), ),
color: Colors.white.withValues(alpha: 0.78), color: Colors.white.withValues(alpha: 0.78),
tooltip: 'Detener', tooltip: 'Detener',
onPressed: cargando ? null : () => estado.audio.detener(), onPressed: cargando ? null : estado.detenerReproduccion,
), ),
), ),
const SizedBox(width: 16), const SizedBox(width: 16),
+23 -1
View File
@@ -85,6 +85,8 @@ class ServicioGrabacionRadio {
_reloj = reloj ?? DateTime.now; _reloj = reloj ?? DateTime.now;
static const _claveDirectorio = 'grabacion_radio_directorio'; static const _claveDirectorio = 'grabacion_radio_directorio';
static const _claveMaxBytes = 'grabacion_radio_max_bytes_v1';
static const int maxBytesPorDefecto = 500 * 1024 * 1024;
final http.Client? _clienteExterno; final http.Client? _clienteExterno;
final Future<Directory> Function()? _resolverDirectorioBase; final Future<Directory> Function()? _resolverDirectorioBase;
@@ -97,17 +99,21 @@ class ServicioGrabacionRadio {
http.Client? _clienteActivo; http.Client? _clienteActivo;
Timer? _timerAutoStop; Timer? _timerAutoStop;
String? _directorioConfigurado; String? _directorioConfigurado;
int _maxBytes = maxBytesPorDefecto;
EstadoGrabacionRadio get estado => _estado; EstadoGrabacionRadio get estado => _estado;
Stream<EstadoGrabacionRadio> get estadoStream => _estadoController.stream; Stream<EstadoGrabacionRadio> get estadoStream => _estadoController.stream;
String? get directorioConfigurado => _directorioConfigurado; String? get directorioConfigurado => _directorioConfigurado;
int get maxBytes => _maxBytes;
Future<void> inicializar() async { Future<void> inicializar() async {
try { try {
final prefs = await SharedPreferences.getInstance(); final prefs = await SharedPreferences.getInstance();
_directorioConfigurado = prefs.getString(_claveDirectorio); _directorioConfigurado = prefs.getString(_claveDirectorio);
_maxBytes = prefs.getInt(_claveMaxBytes) ?? maxBytesPorDefecto;
} catch (_) { } catch (_) {
_directorioConfigurado = null; _directorioConfigurado = null;
_maxBytes = maxBytesPorDefecto;
} }
} }
@@ -145,6 +151,18 @@ class ServicioGrabacionRadio {
_emitir(_estado); _emitir(_estado);
} }
Future<void> guardarMaxBytes(int bytes) async {
if (bytes <= 0) {
throw ArgumentError('El tamaño máximo debe ser mayor que cero');
}
_maxBytes = bytes;
try {
final prefs = await SharedPreferences.getInstance();
await prefs.setInt(_claveMaxBytes, bytes);
} catch (_) {}
_emitir(_estado);
}
Future<void> iniciar( Future<void> iniciar(
Emisora emisora, { Emisora emisora, {
Duration? duracion, Duration? duracion,
@@ -199,7 +217,11 @@ class ServicioGrabacionRadio {
_subscripcionStream = response.stream.listen( _subscripcionStream = response.stream.listen(
(chunk) { (chunk) {
_sink?.add(chunk); _sink?.add(chunk);
_emitir(_estado.copyWith(bytes: _estado.bytes + chunk.length)); final nuevosBytes = _estado.bytes + chunk.length;
_emitir(_estado.copyWith(bytes: nuevosBytes));
if (nuevosBytes >= _maxBytes) {
unawaited(detener());
}
}, },
onDone: () => unawaited(_finalizar()), onDone: () => unawaited(_finalizar()),
onError: (Object error) => unawaited(_fallar(error)), onError: (Object error) => unawaited(_fallar(error)),
+118 -60
View File
@@ -26,11 +26,111 @@ class PluriScreenHeader extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final t = context.pluriTokens; final t = context.pluriTokens;
final theme = Theme.of(context); final theme = Theme.of(context);
final width = MediaQuery.sizeOf(context).width;
final scale = MediaQuery.textScalerOf(context).scale(1);
final compact = width < 380 || scale >= 1.25;
final iconSize = compact ? 50.0 : 56.0;
Widget glyphBadge() => Container(
width: iconSize,
height: iconSize,
decoration: BoxDecoration(
shape: BoxShape.circle,
gradient: LinearGradient(
colors: [
const Color(0xFF20E6FF).withValues(alpha: 0.95),
t.electricMagenta,
t.warmCoral,
],
),
boxShadow: [BoxShadow(color: t.glowColor, blurRadius: 28, spreadRadius: 2)],
),
child: Center(
child: PluriIcon(
glyph: glyph,
variant: PluriIconVariant.filled,
size: compact ? 25 : 28,
),
),
);
Widget textBlock() => Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
maxLines: compact ? 2 : 1,
overflow: TextOverflow.ellipsis,
style: theme.textTheme.headlineSmall?.copyWith(
fontWeight: FontWeight.w900,
letterSpacing: -0.7,
height: 1.05,
),
),
const SizedBox(height: 6),
Text(
subtitle,
maxLines: compact ? 4 : 3,
overflow: TextOverflow.ellipsis,
style: theme.textTheme.bodyMedium?.copyWith(
color: theme.colorScheme.onSurface.withValues(alpha: 0.78),
height: 1.28,
),
),
if (primaryActionLabel != null) ...[
const SizedBox(height: 12),
FilledButton.tonalIcon(
onPressed: onPrimaryAction,
icon: const Icon(Icons.auto_awesome_rounded, size: 18),
label: Text(primaryActionLabel!),
),
],
],
);
Widget foreground() {
if (compact) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
glyphBadge(),
const SizedBox(width: 14),
Expanded(child: textBlock()),
],
),
if (trailing != null) ...[
const SizedBox(height: 14),
Align(alignment: Alignment.centerLeft, child: trailing!),
],
],
);
}
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
glyphBadge(),
const SizedBox(width: 14),
Expanded(child: textBlock()),
if (trailing != null) ...[
const SizedBox(width: 12),
ConstrainedBox(constraints: const BoxConstraints(maxWidth: 220), child: trailing!),
],
],
);
}
return Padding( return Padding(
padding: EdgeInsets.fromLTRB(t.spacingMd, t.spacingSm, t.spacingMd, t.spacingSm), padding: EdgeInsets.fromLTRB(t.spacingMd, t.spacingSm, t.spacingMd, t.spacingSm),
child: PluriGlassSurface( child: PluriGlassSurface(
borderRadius: BorderRadius.circular(t.radiusLg + 8), borderRadius: BorderRadius.circular(t.radiusLg + 8),
padding: const EdgeInsets.all(18), padding: EdgeInsets.symmetric(
horizontal: compact ? 16 : 20,
vertical: compact ? 18 : 20,
),
child: Stack( child: Stack(
children: [ children: [
Positioned.fill( Positioned.fill(
@@ -84,63 +184,9 @@ class PluriScreenHeader extends StatelessWidget {
bottom: -54, bottom: -54,
child: _Orb(color: const Color(0xFF20E6FF).withValues(alpha: 0.22), size: 116), child: _Orb(color: const Color(0xFF20E6FF).withValues(alpha: 0.22), size: 116),
), ),
Row( Padding(
crossAxisAlignment: CrossAxisAlignment.start, padding: EdgeInsets.all(compact ? 2 : 4),
children: [ child: foreground(),
Container(
width: 56,
height: 56,
decoration: BoxDecoration(
shape: BoxShape.circle,
gradient: LinearGradient(
colors: [
const Color(0xFF20E6FF).withValues(alpha: 0.95),
t.electricMagenta,
t.warmCoral,
],
),
boxShadow: [
BoxShadow(color: t.glowColor, blurRadius: 28, spreadRadius: 2),
],
),
child: Center(
child: PluriIcon(glyph: glyph, variant: PluriIconVariant.filled, size: 28),
),
),
const SizedBox(width: 14),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: theme.textTheme.headlineSmall?.copyWith(
fontWeight: FontWeight.w900,
letterSpacing: -0.7,
height: 1.02,
),
),
const SizedBox(height: 6),
Text(
subtitle,
style: theme.textTheme.bodyMedium?.copyWith(
color: theme.colorScheme.onSurface.withValues(alpha: 0.76),
height: 1.25,
),
),
if (primaryActionLabel != null) ...[
const SizedBox(height: 12),
FilledButton.tonalIcon(
onPressed: onPrimaryAction,
icon: const Icon(Icons.auto_awesome_rounded, size: 18),
label: Text(primaryActionLabel!),
),
],
],
),
),
if (trailing != null) trailing!,
],
), ),
], ],
), ),
@@ -149,6 +195,7 @@ class PluriScreenHeader extends StatelessWidget {
} }
} }
class PluriStatusPill extends StatelessWidget { class PluriStatusPill extends StatelessWidget {
const PluriStatusPill({ const PluriStatusPill({
super.key, super.key,
@@ -165,7 +212,10 @@ class PluriStatusPill extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final t = context.pluriTokens; final t = context.pluriTokens;
final color = accent ?? t.electricMagenta; final color = accent ?? t.electricMagenta;
return Container( return Tooltip(
message: label,
child: Container(
constraints: const BoxConstraints(maxWidth: 220),
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(999), borderRadius: BorderRadius.circular(999),
@@ -177,9 +227,17 @@ class PluriStatusPill extends StatelessWidget {
children: [ children: [
Icon(icon, size: 16, color: color), Icon(icon, size: 16, color: color),
const SizedBox(width: 7), const SizedBox(width: 7),
Text(label, style: Theme.of(context).textTheme.labelMedium?.copyWith(fontWeight: FontWeight.w800)), Flexible(
child: Text(
label,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: Theme.of(context).textTheme.labelMedium?.copyWith(fontWeight: FontWeight.w800),
),
),
], ],
), ),
),
); );
} }
} }
@@ -6,6 +6,7 @@ import 'package:http/http.dart' as http;
import 'package:http/testing.dart'; import 'package:http/testing.dart';
import 'package:pluriwave/modelos/emisora.dart'; import 'package:pluriwave/modelos/emisora.dart';
import 'package:pluriwave/servicios/servicio_grabacion_radio.dart'; import 'package:pluriwave/servicios/servicio_grabacion_radio.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() { void main() {
group('ServicioGrabacionRadio', () { group('ServicioGrabacionRadio', () {
@@ -76,6 +77,35 @@ void main() {
await controller.close(); await controller.close();
await servicio.dispose(); await servicio.dispose();
}); });
test('se detiene automáticamente al alcanzar el tamaño máximo', () async {
SharedPreferences.setMockInitialValues({});
final dir = await Directory.systemTemp.createTemp('pluriwave-rec-max-');
final controller = StreamController<List<int>>();
final servicio = ServicioGrabacionRadio(
cliente: _StreamClient(controller.stream),
resolverDirectorioBase: () async => dir,
);
await servicio.inicializar();
await servicio.guardarMaxBytes(3);
await servicio.iniciar(
const Emisora(
uuid: 'r3',
nombre: 'Radio Corta',
url: 'https://stream.example/short',
codec: 'mp3',
),
);
controller.add([1, 2, 3]);
await Future<void>.delayed(Duration.zero);
await Future<void>.delayed(const Duration(milliseconds: 20));
expect(servicio.estado.tipo, EstadoGrabacionRadioTipo.inactiva);
await controller.close();
await servicio.dispose();
});
}); });
} }