diff --git a/lib/l10n/app_localizations_ext.dart b/lib/l10n/app_localizations_ext.dart index 8a372ad..5566652 100644 --- a/lib/l10n/app_localizations_ext.dart +++ b/lib/l10n/app_localizations_ext.dart @@ -783,13 +783,13 @@ extension PluriAppLocalizationsExt on AppLocalizations { String get activeAlarmsWithoutNextTitle => _pick({'es':'Alarmas activas sin próxima ejecución','en':'Active alarms without a next occurrence','fr':'Alarmes actives sans prochaine exécution','de':'Aktive Alarme ohne nächste Ausführung','it':'Sveglie attive senza prossima esecuzione','pt':'Alarmes ativos sem próxima execução','ru':'Активные будильники без следующего запуска','ja':'次回実行のない有効なアラーム','zh':'没有下次执行的活动闹钟','ar':'منبهات نشطة بلا تشغيل تالٍ','hi':'अगली घंटी बिना सक्रिय अलार्म','bn':'পরবর্তী সময় ছাড়া সক্রিয় অ্যালার্ম','id':'Alarm aktif tanpa jadwal berikutnya'}); String get activeAlarmsNoneTitle => _pick({'es':'Sin alarmas activas','en':'No active alarms','fr':'Aucune alarme active','de':'Keine aktiven Alarme','it':'Nessuna sveglia attiva','pt':'Sem alarmes ativos','ru':'Нет активных будильников','ja':'有効なアラームはありません','zh':'没有活动闹钟','ar':'لا توجد منبهات نشطة','hi':'कोई सक्रिय अलार्म नहीं','bn':'কোনও সক্রিয় অ্যালার্ম নেই','id':'Tidak ada alarm aktif'}); String get nextAlarmTitle => _pick({'es':'Próxima alarma','en':'Next alarm','fr':'Prochaine alarme','de':'Nächster Alarm','it':'Prossima sveglia','pt':'Próximo alarme','ru':'Следующий будильник','ja':'次のアラーム','zh':'下一个闹钟','ar':'المنبه التالي','hi':'अगला अलार्म','bn':'পরবর্তী অ্যালার্ম','id':'Alarm berikutnya'}); - String activeAlarmsWithoutNextSubtitle(int count) => _pick({'es':'Hay $count alarma(s) activas, pero ahora mismo no tienen una fecha futura válida. Revisá fecha, días y vacaciones.','en':'There are $count active alarm(s), but they do not currently have a valid future date. Check date, days, and vacations.','fr':'Il y a $count alarme(s) active(s), mais aucune date future valide pour le moment. Vérifiez la date, les jours et les vacances.','de':'Es gibt $count aktive(n) Alarm(e), aber aktuell kein gültiges zukünftiges Datum. Prüfe Datum, Tage und Urlaub.','it':'Ci sono $count sveglia/e attive, ma al momento senza una data futura valida. Controlla data, giorni e vacanze.','pt':'Há $count alarme(s) ativo(s), mas sem uma data futura válida no momento. Revise data, dias e férias.','ru':'Есть $count активных будильников, но сейчас у них нет корректной будущей даты. Проверьте дату, дни и отпуск.','ja':'有効なアラームが $count 件ありますが、現在有効な将来日時がありません。日付、曜日、休暇を確認してください。','zh':'有 $count 个活动闹钟,但当前没有有效的未来日期。请检查日期、星期和假期。','ar':'يوجد $count منبه نشط، لكنها لا تملك حاليًا تاريخًا مستقبليًا صالحًا. راجع التاريخ والأيام والإجازات.','hi':'$count सक्रिय अलार्म हैं, लेकिन अभी इनके पास मान्य भविष्य की तारीख नहीं है। तारीख, दिन और छुट्टियाँ जाँचें।','bn':'$countটি সক্রিয় অ্যালার্ম আছে, কিন্তু এখন কোনও বৈধ ভবিষ্যৎ তারিখ নেই। তারিখ, দিন ও ছুটি দেখুন।','id':'Ada $count alarm aktif, tetapi saat ini tidak memiliki tanggal mendatang yang valid. Periksa tanggal, hari, dan liburan.'}); + String activeAlarmsWithoutNextSubtitle(int count) => _pick({'es':'Hay $count alarma(s) activas, pero ahora mismo no tienen una fecha futura válida. Revisá fecha, días y vacaciones.','en':'There are $count active alarm(s), but they do not currently have a valid future date. Check date, days, and vacations.','fr':'Il y a $count alarme(s) active(s), mais aucune date future valide pour le moment. Vérifiez la date, les jours et les vacances.','de':'Es gibt $count aktive(n) Alarm(e), aber aktuell kein gültiges zukünftiges Datum. Prüfe Datum, Tage und Urlaub.','it':'Ci sono $count sveglia/e attive, ma al momento senza una data futura valida. Controlla data, giorni e vacanze.','pt':'Há $count alarme(s) ativo(s), mas sem uma data futura válida no momento. Revise data, dias e férias.','ru':'Есть $count активных будильников, но сейчас у них нет корректной будущей даты. Проверьте дату, дни и отпуск.','ja':'有効なアラームが $count 件ありますが、現在有効な将来日時がありません。日付、曜日、休暇を確認してください。','zh':'有 $count 个活动闹钟,但当前没有有效的未来日期。请检查日期、星期和假期。','ar':'يوجد $count منبه نشط، لكنها لا تملك حاليًا تاريخًا مستقبليًا صالحًا. راجع التاريخ والأيام والإجازات.','hi':'$count सक्रिय अलार्म हैं, लेकिन अभी इनके पास मान्य भविष्य की तारीख नहीं है। तारीख, दिन और छुट्टियाँ जाँचें।','bn':'$count টি সক্রিয় অ্যালার্ম আছে, কিন্তু এখন কোনও বৈধ ভবিষ্যৎ তারিখ নেই। তারিখ, দিন ও ছুটি দেখুন।','id':'Ada $count alarm aktif, tetapi saat ini tidak memiliki tanggal mendatang yang valid. Periksa tanggal, hari, dan liburan.'}); String get createAlarmHint => _pick({'es':'Creá una alarma y PluriWave calculará la siguiente ejecución automáticamente.','en':'Create an alarm and PluriWave will calculate the next occurrence automatically.','fr':'Créez une alarme et PluriWave calculera automatiquement la prochaine exécution.','de':'Erstelle einen Alarm und PluriWave berechnet die nächste Ausführung automatisch.','it':'Crea una sveglia e PluriWave calcolerà automaticamente la prossima esecuzione.','pt':'Crie um alarme e o PluriWave calculará automaticamente a próxima execução.','ru':'Создайте будильник, и PluriWave автоматически рассчитает следующий запуск.','ja':'アラームを作成すると、PluriWave が次回実行を自動計算します。','zh':'创建闹钟后,PluriWave 会自动计算下次执行时间。','ar':'أنشئ منبهًا وسيحسب PluriWave التشغيل التالي تلقائيًا.','hi':'अलार्म बनाएँ और PluriWave अगली घंटी अपने-आप गणना करेगा।','bn':'একটি অ্যালার্ম তৈরি করুন, PluriWave স্বয়ংক্রিয়ভাবে পরবর্তী সময় হিসাব করবে।','id':'Buat alarm dan PluriWave akan menghitung jadwal berikutnya secara otomatis.'}); String alarmNextSummary(String name, String date) => '$name · $date'; String get alarmVacationPlay => _pick({'es':'Suena en vacaciones','en':'Plays during vacations','fr':'Sonne pendant les vacances','de':'Klingelt im Urlaub','it':'Suona durante le vacanze','pt':'Toca durante as férias','ru':'Срабатывает во время отпуска','ja':'休暇中も鳴らす','zh':'假期中响铃','ar':'يعمل أثناء الإجازات','hi':'छुट्टियों में बजेगा','bn':'ছুটির সময় বাজবে','id':'Berbunyi saat liburan'}); String get alarmVacationPause => _pick({'es':'Pausa en vacaciones','en':'Pause during vacations','fr':'Pause pendant les vacances','de':'Im Urlaub pausieren','it':'Pausa durante le vacanze','pt':'Pausar durante as férias','ru':'Пауза во время отпуска','ja':'休暇中は一時停止','zh':'假期中暂停','ar':'إيقاف أثناء الإجازات','hi':'छुट्टियों में विराम','bn':'ছুটির সময় বিরতি','id':'Jeda saat liburan'}); - String fadeInSeconds(int seconds) => _pick({'es':'Fade-in ${seconds}s','en':'Fade-in ${seconds}s','fr':'Fondu entrant ${seconds}s','de':'Fade-in ${seconds}s','it':'Fade-in ${seconds}s','pt':'Fade-in ${seconds}s','ru':'Плавное начало ${seconds} с','ja':'フェードイン ${seconds}秒','zh':'淡入 ${seconds} 秒','ar':'تدرّج صوتي ${seconds} ث','hi':'फ़ेड-इन ${seconds} सेकंड','bn':'ফেড-ইন ${seconds} সেকেন্ড','id':'Fade-in ${seconds} dtk'}); + String fadeInSeconds(int seconds) => _pick({'es':'Fade-in $seconds s','en':'Fade-in $seconds s','fr':'Fondu entrant $seconds s','de':'Fade-in $seconds s','it':'Fade-in $seconds s','pt':'Fade-in $seconds s','ru':'Плавное начало $seconds с','ja':'フェードイン $seconds 秒','zh':'淡入 $seconds 秒','ar':'تدرّج صوتي $seconds ث','hi':'फ़ेड-इन $seconds सेकंड','bn':'ফেড-ইন $seconds সেকেন্ড','id':'Fade-in $seconds dtk'}); String alarmNextExecution(String date) => _pick({'es':'Siguiente ejecución: $date','en':'Next occurrence: $date','fr':'Prochaine exécution : $date','de':'Nächste Ausführung: $date','it':'Prossima esecuzione: $date','pt':'Próxima execução: $date','ru':'Следующий запуск: $date','ja':'次回実行: $date','zh':'下次执行:$date','ar':'التشغيل التالي: $date','hi':'अगली घंटी: $date','bn':'পরবর্তী সময়: $date','id':'Jadwal berikutnya: $date'}); String get alarmNoNextExecution => _pick({'es':'No tiene próxima ejecución activa.','en':'No active next occurrence.','fr':'Aucune prochaine exécution active.','de':'Keine aktive nächste Ausführung.','it':'Nessuna prossima esecuzione attiva.','pt':'Não há próxima execução ativa.','ru':'Нет активного следующего запуска.','ja':'有効な次回実行はありません。','zh':'没有活动的下次执行。','ar':'لا يوجد تشغيل تالٍ نشط.','hi':'कोई सक्रिय अगली घंटी नहीं है।','bn':'কোনও সক্রিয় পরবর্তী সময় নেই।','id':'Tidak ada jadwal berikutnya yang aktif.'}); String alarmSkippedExecution(String date) => _pick({'es':'Una ejecución fue omitida: $date.','en':'One occurrence was skipped: $date.','fr':'Une exécution a été ignorée : $date.','de':'Eine Ausführung wurde übersprungen: $date.','it':'Un’esecuzione è stata saltata: $date.','pt':'Uma execução foi ignorada: $date.','ru':'Один запуск был пропущен: $date.','ja':'1回の実行をスキップしました: $date。','zh':'已跳过一次执行:$date。','ar':'تم تخطي تشغيل واحد: $date.','hi':'एक घंटी छोड़ी गई: $date।','bn':'একটি সময় বাদ দেওয়া হয়েছে: $date।','id':'Satu jadwal dilewati: $date.'}); @@ -814,7 +814,7 @@ extension PluriAppLocalizationsExt on AppLocalizations { String get soundAndVolumeTitle => _pick({'es':'Sonido y volumen','en':'Sound and volume','fr':'Son et volume','de':'Ton und Lautstärke','it':'Suono e volume','pt':'Som e volume','ru':'Звук и громкость','ja':'サウンドと音量','zh':'声音和音量','ar':'الصوت ومستوى الصوت','hi':'ध्वनि और वॉल्यूम','bn':'শব্দ ও ভলিউম','id':'Suara dan volume'}); String get alarmFadeInTitle => _pick({'es':'Fade-in de alarma','en':'Alarm fade-in','fr':'Fondu entrant de l’alarme','de':'Alarm-Fade-in','it':'Fade-in della sveglia','pt':'Fade-in do alarme','ru':'Плавное начало будильника','ja':'アラームのフェードイン','zh':'闹钟淡入','ar':'تدرّج صوت المنبه','hi':'अलार्म फ़ेड-इन','bn':'অ্যালার্ম ফেড-ইন','id':'Fade-in alarm'}); String get alarmFadeInOff => _pick({'es':'0 s (sin transición)','en':'0 s (no transition)','fr':'0 s (sans transition)','de':'0 s (ohne Übergang)','it':'0 s (senza transizione)','pt':'0 s (sem transição)','ru':'0 с (без перехода)','ja':'0秒(遷移なし)','zh':'0 秒(无过渡)','ar':'0 ث (بلا انتقال)','hi':'0 सेकंड (कोई बदलाव नहीं)','bn':'0 সেকেন্ড (কোনও ট্রানজিশন নেই)','id':'0 dtk (tanpa transisi)'}); - String alarmFadeInProgress(int seconds) => _pick({'es':'$seconds s (de 5% al volumen elegido)','en':'$seconds s (from 5% to the chosen volume)','fr':'$seconds s (de 5 % au volume choisi)','de':'$seconds s (von 5 % zur gewählten Lautstärke)','it':'$seconds s (dal 5% al volume scelto)','pt':'$seconds s (de 5% até o volume escolhido)','ru':'$seconds с (от 5% до выбранной громкости)','ja':'$seconds秒(5%から選択した音量へ)','zh':'$seconds 秒(从 5% 到所选音量)','ar':'$seconds ث (من 5% إلى المستوى المختار)','hi':'$seconds सेकंड (5% से चुने हुए वॉल्यूम तक)','bn':'$seconds সেকেন্ড (5% থেকে নির্বাচিত ভলিউমে)','id':'$seconds dtk (dari 5% ke volume pilihan)'}); + String alarmFadeInProgress(int seconds) => _pick({'es':'$seconds s (de 5% al volumen elegido)','en':'$seconds s (from 5% to the chosen volume)','fr':'$seconds s (de 5 % au volume choisi)','de':'$seconds s (von 5 % zur gewählten Lautstärke)','it':'$seconds s (dal 5% al volume scelto)','pt':'$seconds s (de 5% até o volume escolhido)','ru':'$seconds с (от 5% до выбранной громкости)','ja':'$seconds 秒(5%から選択した音量へ)','zh':'$seconds 秒(从 5% 到所选音量)','ar':'$seconds ث (من 5% إلى المستوى المختار)','hi':'$seconds सेकंड (5% से चुने हुए वॉल्यूम तक)','bn':'$seconds সেকেন্ড (5% থেকে নির্বাচিত ভলিউমে)','id':'$seconds dtk (dari 5% ke volume pilihan)'}); String get soundInternalSafe => _pick({'es':'Sonido seguro interno','en':'Internal safe sound','fr':'Son interne sécurisé','de':'Interner Sicherheitston','it':'Suono interno sicuro','pt':'Som interno seguro','ru':'Внутренний безопасный звук','ja':'内部セーフサウンド','zh':'内部安全声音','ar':'صوت داخلي آمن','hi':'आंतरिक सुरक्षित ध्वनि','bn':'অভ্যন্তরীণ নিরাপদ শব্দ','id':'Suara internal aman'}); String get soundWarmSunrise => _pick({'es':'Amanecer cálido','en':'Warm sunrise','fr':'Aube chaleureuse','de':'Warmer Sonnenaufgang','it':'Alba calda','pt':'Amanhecer quente','ru':'Тёплый рассвет','ja':'暖かな日の出','zh':'温暖日出','ar':'شروق دافئ','hi':'गर्म सूर्योदय','bn':'উষ্ণ সূর্যোদয়','id':'Fajar hangat'}); String get soundSoftBell => _pick({'es':'Campana suave','en':'Soft bell','fr':'Cloche douce','de':'Sanfte Glocke','it':'Campana leggera','pt':'Sino suave','ru':'Мягкий колокол','ja':'やさしいベル','zh':'柔和铃声','ar':'جرس هادئ','hi':'मृदु घंटी','bn':'নরম ঘণ্টা','id':'Lonceng lembut'}); diff --git a/lib/modelos/alarma_musical.dart b/lib/modelos/alarma_musical.dart index c705c51..2eb6bb9 100644 --- a/lib/modelos/alarma_musical.dart +++ b/lib/modelos/alarma_musical.dart @@ -159,8 +159,8 @@ class AlarmaMusical { sonarEnVacaciones: json['sonarEnVacaciones'] as bool? ?? true, snoozeMinutos: json['snoozeMinutos'] as int? ?? 5, volumen: (json['volumen'] as num?)?.toDouble() ?? 0.85, - fadeInSegundos: ((json['fadeInSegundos'] as int? ?? 0).clamp(0, 60)) - as int, + fadeInSegundos: + (json['fadeInSegundos'] as int? ?? 0).clamp(0, 60).toInt(), sonidoInterno: _enumFromName( SonidoInternoAlarma.values, json['sonidoInterno'] as String?, diff --git a/lib/pantallas/pantalla_ajustes.dart b/lib/pantallas/pantalla_ajustes.dart index f51b93e..b46fdfc 100644 --- a/lib/pantallas/pantalla_ajustes.dart +++ b/lib/pantallas/pantalla_ajustes.dart @@ -1161,6 +1161,7 @@ class _SeccionBackup extends StatelessWidget { const _SeccionBackup(); Future _exportar(BuildContext context) async { + final l10n = AppLocalizations.of(context); try { final estado = context.read(); final config = await estado.exportarConfig(); @@ -1172,17 +1173,15 @@ class _SeccionBackup extends StatelessWidget { await Share.shareXFiles( [XFile(file.path)], - subject: AppLocalizations.of(context).backupShareSubject, - text: AppLocalizations.of( - context, - ).backupShareText(DateTime.now().toLocal()), + subject: l10n.backupShareSubject, + text: l10n.backupShareText(DateTime.now().toLocal()), ); } catch (e) { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - AppLocalizations.of(context).backupExportError(e.toString()), + l10n.backupExportError(e.toString()), ), ), ); @@ -1191,6 +1190,7 @@ class _SeccionBackup extends StatelessWidget { } Future _importar(BuildContext context) async { + final l10n = AppLocalizations.of(context); try { final result = await FilePicker.platform.pickFiles( type: FileType.custom, @@ -1230,7 +1230,7 @@ class _SeccionBackup extends StatelessWidget { await estado.importarConfig(json); messenger.showSnackBar( SnackBar( - content: Text(AppLocalizations.of(context).backupImportSuccess), + content: Text(l10n.backupImportSuccess), ), ); } @@ -1240,7 +1240,7 @@ class _SeccionBackup extends StatelessWidget { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - AppLocalizations.of(context).backupImportError(e.toString()), + l10n.backupImportError(e.toString()), ), ), ); diff --git a/lib/pantallas/pantalla_alarmas.dart b/lib/pantallas/pantalla_alarmas.dart index 436a7f3..d3e82cc 100644 --- a/lib/pantallas/pantalla_alarmas.dart +++ b/lib/pantallas/pantalla_alarmas.dart @@ -367,7 +367,7 @@ class _EditorAlarmaSheetState extends State<_EditorAlarmaSheet> { _tipo = alarma?.tipoProgramacion ?? TipoProgramacionAlarma.unica; _diasSemana = {...alarma?.diasSemana ?? const []}; _volumen = alarma?.volumen ?? 0.85; - _fadeInSegundos = ((alarma?.fadeInSegundos ?? 0).clamp(0, 60)) as int; + _fadeInSegundos = (alarma?.fadeInSegundos ?? 0).clamp(0, 60).toInt(); _sonarEnVacaciones = alarma?.sonarEnVacaciones ?? true; _sonidoInterno = alarma?.sonidoInterno ?? SonidoInternoAlarma.amanecer; _emisora = alarma?.emisora ?? context.read().emisoraPreferida; @@ -681,7 +681,7 @@ class _EditorAlarmaSheetState extends State<_EditorAlarmaSheet> { sonarEnVacaciones: _sonarEnVacaciones, snoozeMinutos: existente?.snoozeMinutos ?? 5, volumen: _volumen, - fadeInSegundos: _fadeInSegundos.clamp(0, 60), + fadeInSegundos: _fadeInSegundos.clamp(0, 60).toInt(), sonidoInterno: _sonidoInterno, activa: true, ); diff --git a/lib/pantallas/pantalla_buscar.dart b/lib/pantallas/pantalla_buscar.dart index c2024a0..4132bb5 100644 --- a/lib/pantallas/pantalla_buscar.dart +++ b/lib/pantallas/pantalla_buscar.dart @@ -3,7 +3,6 @@ import 'package:flutter_animate/flutter_animate.dart'; import 'package:provider/provider.dart'; import '../estado/estado_radio.dart'; -import '../l10n/app_localizations_ext.dart'; import '../l10n/gen/app_localizations.dart'; import '../widgets/pluri_glass_surface.dart'; import '../widgets/pluri_icon.dart'; diff --git a/lib/pantallas/pantalla_reproductor.dart b/lib/pantallas/pantalla_reproductor.dart index 5619765..80fa1fc 100644 --- a/lib/pantallas/pantalla_reproductor.dart +++ b/lib/pantallas/pantalla_reproductor.dart @@ -553,7 +553,7 @@ class _GrabacionWidget extends StatelessWidget { actions: [ TextButton( onPressed: () => Navigator.pop(ctx), - child: Text(AppLocalizations.of(ctx).cancelAction), + child: Text(AppLocalizations.of(context).cancelAction), ), FilledButton( onPressed: () { @@ -803,7 +803,7 @@ class _TimerWidget extends StatelessWidget { visualDensity: VisualDensity.compact, padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), ), - child: Text(AppLocalizations.of(ctx).cancelAction), + child: Text(AppLocalizations.of(context).cancelAction), ), ], );