fix(i18n): normalize translations and fallbacks
Build & Deploy PluriWave / Análisis de código (push) Successful in 38s
Build & Deploy PluriWave / Build APK + AAB release (push) Successful in 2m34s

This commit is contained in:
2026-06-03 21:20:08 +02:00
parent a5475ce118
commit 089b8b4227
46 changed files with 17720 additions and 4869 deletions
+40 -25
View File
@@ -11,7 +11,7 @@ import 'package:uuid/uuid.dart';
import '../estado/estado_idioma.dart';
import '../estado/estado_radio.dart';
import '../l10n/app_localizations_ext.dart';
import '../l10n/display_names.dart';
import '../l10n/gen/app_localizations.dart';
import '../modelos/emisora.dart';
import '../modelos/grupo_favoritos.dart';
@@ -291,7 +291,7 @@ class _SeccionTimerSueno extends StatelessWidget {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
'${l10n.saveQuickAccessButton}: ${_formatearDuracionTimer(duracion)}',
'${l10n.saveQuickAccessButton}: ${_formatearDuracionTimer(l10n, duracion)}',
),
),
);
@@ -336,7 +336,10 @@ class _SeccionTimerSueno extends StatelessWidget {
for (final segundos in presets)
InputChip(
label: Text(
_formatearDuracionTimer(Duration(seconds: segundos)),
_formatearDuracionTimer(
l10n,
Duration(seconds: segundos),
),
),
onDeleted:
presets.length <= 1
@@ -907,7 +910,7 @@ class _SeccionEmisoraPreferida extends StatelessWidget {
DropdownMenuItem<String>(
value: emisora.uuid,
child: Text(
emisora.nombre,
localizedStationName(l10n, emisora.nombre),
overflow: TextOverflow.ellipsis,
),
),
@@ -923,8 +926,12 @@ class _SeccionEmisoraPreferida extends StatelessWidget {
const SizedBox(height: 8),
Text(
favoritas.any((e) => e.uuid == preferida.uuid)
? l10n.preferredStationCurrent(preferida.nombre)
: l10n.preferredStationAutoUsing(preferida.nombre),
? l10n.preferredStationCurrent(
localizedStationName(l10n, preferida.nombre),
)
: l10n.preferredStationAutoUsing(
localizedStationName(l10n, preferida.nombre),
),
),
const SizedBox(height: 8),
Align(
@@ -1001,7 +1008,12 @@ class _SeccionEmisoras extends StatelessWidget {
ListTile(
contentPadding: EdgeInsets.zero,
leading: const Icon(Icons.radio),
title: Text(emisora.nombre),
title: Text(
localizedStationName(
AppLocalizations.of(context),
emisora.nombre,
),
),
subtitle: Text(
emisora.url,
maxLines: 1,
@@ -1179,11 +1191,7 @@ class _SeccionBackup extends StatelessWidget {
} catch (e) {
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
l10n.backupExportError(e.toString()),
),
),
SnackBar(content: Text(l10n.backupExportError(e.toString()))),
);
}
}
@@ -1229,20 +1237,14 @@ class _SeccionBackup extends StatelessWidget {
final messenger = ScaffoldMessenger.of(context);
await estado.importarConfig(json);
messenger.showSnackBar(
SnackBar(
content: Text(l10n.backupImportSuccess),
),
SnackBar(content: Text(l10n.backupImportSuccess)),
);
}
}
} catch (e) {
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
l10n.backupImportError(e.toString()),
),
),
SnackBar(content: Text(l10n.backupImportError(e.toString()))),
);
}
}
@@ -1324,7 +1326,8 @@ class _SeccionInfo extends StatelessWidget {
AppLocalizations.of(ctx).savedFavoritesTitle,
),
trailing: Text(
snap.data?.toString() ?? AppLocalizations.of(ctx).dash,
snap.data?.toString() ??
AppLocalizations.of(ctx).dash,
style: Theme.of(ctx).textTheme.bodyLarge,
),
),
@@ -1362,15 +1365,27 @@ class _SeccionInfo extends StatelessWidget {
}
}
String _formatearDuracionTimer(Duration duracion) {
String _formatearDuracionTimer(
AppLocalizations l10n,
Duration duracion,
) {
final horas = duracion.inHours;
final minutos = duracion.inMinutes.remainder(60);
final segundos = duracion.inSeconds.remainder(60);
if (horas > 0) {
return '${horas}h ${minutos.toString().padLeft(2, '0')}m ${segundos.toString().padLeft(2, '0')}s';
return l10n.durationHoursMinutesSeconds(
horas,
minutos.toString().padLeft(2, '0'),
segundos.toString().padLeft(2, '0'),
);
}
if (minutos > 0) {
return segundos == 0 ? '$minutos min' : '${minutos}m ${segundos}s';
return segundos == 0
? l10n.durationMinutesOnly(minutos)
: l10n.durationMinutesSeconds(
minutos,
segundos.toString().padLeft(2, '0'),
);
}
return '$segundos s';
return l10n.durationSecondsOnly(segundos);
}