fix(i18n): normalize translations and fallbacks
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user