i18n(alarm): localize all native notification, channel and chooser texts
Build & Deploy PluriWave / Análisis de código (push) Successful in 40s
Build & Deploy PluriWave / Build APK + AAB release (push) Successful in 2m33s

Centralize every native-side user-facing string in a single
AlarmNotificationStrings store written by Flutter via a new
setNotificationStrings MethodChannel whenever the app locale changes,
and read at notification/channel build time (with English fallbacks)
even when the engine is dead. This replaces the hardcoded Spanish text
in the ringing notification ("Alarma PluriWave", "Posponer", "Detener"),
the pre-notice notification ("Posponer", "Omitir esta vez"), both
notification channels (names + descriptions) and the file-action
choosers ("Abrir carpeta", "Abrir grabación").

The per-alarm preNoticeTemplate/snoozeCountdown template+label args are
dropped from scheduleAlarm and the persisted spec and folded into the
shared store, so a locale change now also relocalizes already-scheduled
alarms. Channels are re-created on each use so their name/description
refresh after a language switch.

Adds alarmRingingNotificationTitle, alarmFire/PreNoticeChannelName,
alarmFire/PreNoticeChannelDescription and openFolder/openRecording
chooser keys across all 13 locales (reusing snoozeAction, stopAlarmAction,
skipNextAction, snoozeAgainAction). Rewrites the template test around
setNotificationStrings. Kotlin is static-reviewed only; no Android build
environment available here.
This commit is contained in:
Javier Bautista Fernández
2026-06-30 15:41:29 +02:00
parent 481944815f
commit ffd09a2179
34 changed files with 639 additions and 144 deletions
+7
View File
@@ -638,6 +638,13 @@
}
},
"snoozeAgainAction": "غفوة مرة أخرى",
"alarmRingingNotificationTitle": "منبّه PluriWave",
"alarmFireChannelName": "المنبّهات الرنّانة",
"alarmFireChannelDescription": "صوت وشاشة عاجلة عندما يجب أن يرنّ منبّه موسيقي",
"alarmPreNoticeChannelName": "تنبيهات المنبّهات",
"alarmPreNoticeChannelDescription": "إشعارات صامتة قبل المنبّه",
"openFolderChooserTitle": "فتح المجلد",
"openRecordingChooserTitle": "فتح التسجيل",
"@preNoticeCountdown": {
"placeholders": {
"minutes": {
+7
View File
@@ -638,6 +638,13 @@
}
},
"snoozeAgainAction": "আবার স্নুজ করুন",
"alarmRingingNotificationTitle": "PluriWave অ্যালার্ম",
"alarmFireChannelName": "বাজতে থাকা অ্যালার্ম",
"alarmFireChannelDescription": "কোনো মিউজিক অ্যালার্ম বাজার সময় জরুরি শব্দ ও স্ক্রিন",
"alarmPreNoticeChannelName": "অ্যালার্ম রিমাইন্ডার",
"alarmPreNoticeChannelDescription": "অ্যালার্মের আগে নীরব বিজ্ঞপ্তি",
"openFolderChooserTitle": "ফোল্ডার খুলুন",
"openRecordingChooserTitle": "রেকর্ডিং খুলুন",
"@preNoticeCountdown": {
"placeholders": {
"minutes": {
+7
View File
@@ -638,6 +638,13 @@
}
},
"snoozeAgainAction": "Erneut schlummern",
"alarmRingingNotificationTitle": "PluriWave-Wecker",
"alarmFireChannelName": "Klingelnde Wecker",
"alarmFireChannelDescription": "Dringender Ton und Bildschirm, wenn ein Musikwecker klingeln soll",
"alarmPreNoticeChannelName": "Wecker-Vorankündigungen",
"alarmPreNoticeChannelDescription": "Lautlose Benachrichtigungen vor dem Wecker",
"openFolderChooserTitle": "Ordner öffnen",
"openRecordingChooserTitle": "Aufnahme öffnen",
"@preNoticeCountdown": {
"placeholders": {
"minutes": {
+7
View File
@@ -638,6 +638,13 @@
}
},
"snoozeAgainAction": "Snooze again",
"alarmRingingNotificationTitle": "PluriWave alarm",
"alarmFireChannelName": "Ringing alarms",
"alarmFireChannelDescription": "Urgent sound and screen when a music alarm must ring",
"alarmPreNoticeChannelName": "Alarm reminders",
"alarmPreNoticeChannelDescription": "Silent notifications before the alarm",
"openFolderChooserTitle": "Open folder",
"openRecordingChooserTitle": "Open recording",
"@preNoticeCountdown": {
"placeholders": {
"minutes": {
+7
View File
@@ -601,6 +601,13 @@
}
},
"snoozeAgainAction": "Posponer otra vez",
"alarmRingingNotificationTitle": "Alarma PluriWave",
"alarmFireChannelName": "Alarmas sonando",
"alarmFireChannelDescription": "Sonido y pantalla urgente cuando una alarma musical debe sonar",
"alarmPreNoticeChannelName": "Preavisos de alarmas",
"alarmPreNoticeChannelDescription": "Notificaciones silenciosas antes de la alarma",
"openFolderChooserTitle": "Abrir carpeta",
"openRecordingChooserTitle": "Abrir grabación",
"@preNoticeCountdown": {
"placeholders": {
"minutes": {
+7
View File
@@ -638,6 +638,13 @@
}
},
"snoozeAgainAction": "Reporter encore",
"alarmRingingNotificationTitle": "Alarme PluriWave",
"alarmFireChannelName": "Alarmes en cours",
"alarmFireChannelDescription": "Son et écran urgents lorsqu'une alarme musicale doit sonner",
"alarmPreNoticeChannelName": "Rappels d'alarme",
"alarmPreNoticeChannelDescription": "Notifications silencieuses avant l'alarme",
"openFolderChooserTitle": "Ouvrir le dossier",
"openRecordingChooserTitle": "Ouvrir l'enregistrement",
"@preNoticeCountdown": {
"placeholders": {
"minutes": {
+7
View File
@@ -638,6 +638,13 @@
}
},
"snoozeAgainAction": "फिर से स्नूज़ करें",
"alarmRingingNotificationTitle": "PluriWave अलार्म",
"alarmFireChannelName": "बजते अलार्म",
"alarmFireChannelDescription": "जब कोई संगीत अलार्म बजना हो तो तत्काल ध्वनि और स्क्रीन",
"alarmPreNoticeChannelName": "अलार्म रिमाइंडर",
"alarmPreNoticeChannelDescription": "अलार्म से पहले मूक सूचनाएँ",
"openFolderChooserTitle": "फ़ोल्डर खोलें",
"openRecordingChooserTitle": "रिकॉर्डिंग खोलें",
"@preNoticeCountdown": {
"placeholders": {
"minutes": {
+7
View File
@@ -638,6 +638,13 @@
}
},
"snoozeAgainAction": "Tunda lagi",
"alarmRingingNotificationTitle": "Alarm PluriWave",
"alarmFireChannelName": "Alarm berbunyi",
"alarmFireChannelDescription": "Suara dan layar mendesak saat alarm musik harus berbunyi",
"alarmPreNoticeChannelName": "Pengingat alarm",
"alarmPreNoticeChannelDescription": "Notifikasi senyap sebelum alarm",
"openFolderChooserTitle": "Buka folder",
"openRecordingChooserTitle": "Buka rekaman",
"@preNoticeCountdown": {
"placeholders": {
"minutes": {
+7
View File
@@ -638,6 +638,13 @@
}
},
"snoozeAgainAction": "Posponi di nuovo",
"alarmRingingNotificationTitle": "Sveglia PluriWave",
"alarmFireChannelName": "Sveglie in corso",
"alarmFireChannelDescription": "Suono e schermo urgenti quando una sveglia musicale deve suonare",
"alarmPreNoticeChannelName": "Promemoria sveglia",
"alarmPreNoticeChannelDescription": "Notifiche silenziose prima della sveglia",
"openFolderChooserTitle": "Apri cartella",
"openRecordingChooserTitle": "Apri registrazione",
"@preNoticeCountdown": {
"placeholders": {
"minutes": {
+7
View File
@@ -638,6 +638,13 @@
}
},
"snoozeAgainAction": "もう一度スヌーズ",
"alarmRingingNotificationTitle": "PluriWave アラーム",
"alarmFireChannelName": "鳴っているアラーム",
"alarmFireChannelDescription": "音楽アラームが鳴るときの緊急の音と画面",
"alarmPreNoticeChannelName": "アラームの事前通知",
"alarmPreNoticeChannelDescription": "アラーム前のサイレント通知",
"openFolderChooserTitle": "フォルダを開く",
"openRecordingChooserTitle": "録音を開く",
"@preNoticeCountdown": {
"placeholders": {
"minutes": {
+7
View File
@@ -638,6 +638,13 @@
}
},
"snoozeAgainAction": "Adiar novamente",
"alarmRingingNotificationTitle": "Alarme PluriWave",
"alarmFireChannelName": "Alarmes tocando",
"alarmFireChannelDescription": "Som e tela urgentes quando um alarme musical deve tocar",
"alarmPreNoticeChannelName": "Avisos de alarme",
"alarmPreNoticeChannelDescription": "Notificações silenciosas antes do alarme",
"openFolderChooserTitle": "Abrir pasta",
"openRecordingChooserTitle": "Abrir gravação",
"@preNoticeCountdown": {
"placeholders": {
"minutes": {
+7
View File
@@ -638,6 +638,13 @@
}
},
"snoozeAgainAction": "Отложить снова",
"alarmRingingNotificationTitle": "Будильник PluriWave",
"alarmFireChannelName": "Звонящие будильники",
"alarmFireChannelDescription": "Срочный звук и экран, когда должен сработать музыкальный будильник",
"alarmPreNoticeChannelName": "Напоминания о будильнике",
"alarmPreNoticeChannelDescription": "Беззвучные уведомления перед будильником",
"openFolderChooserTitle": "Открыть папку",
"openRecordingChooserTitle": "Открыть запись",
"@preNoticeCountdown": {
"placeholders": {
"minutes": {
+7
View File
@@ -638,6 +638,13 @@
}
},
"snoozeAgainAction": "再次小睡",
"alarmRingingNotificationTitle": "PluriWave 闹钟",
"alarmFireChannelName": "响铃的闹钟",
"alarmFireChannelDescription": "音乐闹钟需要响起时的紧急声音和屏幕",
"alarmPreNoticeChannelName": "闹钟预告",
"alarmPreNoticeChannelDescription": "闹钟前的静音通知",
"openFolderChooserTitle": "打开文件夹",
"openRecordingChooserTitle": "打开录音",
"@preNoticeCountdown": {
"placeholders": {
"minutes": {
+42
View File
@@ -2324,6 +2324,48 @@ abstract class AppLocalizations {
/// **'Posponer otra vez'**
String get snoozeAgainAction;
/// No description provided for @alarmRingingNotificationTitle.
///
/// In es, this message translates to:
/// **'Alarma PluriWave'**
String get alarmRingingNotificationTitle;
/// No description provided for @alarmFireChannelName.
///
/// In es, this message translates to:
/// **'Alarmas sonando'**
String get alarmFireChannelName;
/// No description provided for @alarmFireChannelDescription.
///
/// In es, this message translates to:
/// **'Sonido y pantalla urgente cuando una alarma musical debe sonar'**
String get alarmFireChannelDescription;
/// No description provided for @alarmPreNoticeChannelName.
///
/// In es, this message translates to:
/// **'Preavisos de alarmas'**
String get alarmPreNoticeChannelName;
/// No description provided for @alarmPreNoticeChannelDescription.
///
/// In es, this message translates to:
/// **'Notificaciones silenciosas antes de la alarma'**
String get alarmPreNoticeChannelDescription;
/// No description provided for @openFolderChooserTitle.
///
/// In es, this message translates to:
/// **'Abrir carpeta'**
String get openFolderChooserTitle;
/// No description provided for @openRecordingChooserTitle.
///
/// In es, this message translates to:
/// **'Abrir grabación'**
String get openRecordingChooserTitle;
/// No description provided for @eqDeviceEditTitle.
///
/// In es, this message translates to:
+22
View File
@@ -1261,6 +1261,28 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get snoozeAgainAction => 'غفوة مرة أخرى';
@override
String get alarmRingingNotificationTitle => 'منبّه PluriWave';
@override
String get alarmFireChannelName => 'المنبّهات الرنّانة';
@override
String get alarmFireChannelDescription =>
'صوت وشاشة عاجلة عندما يجب أن يرنّ منبّه موسيقي';
@override
String get alarmPreNoticeChannelName => 'تنبيهات المنبّهات';
@override
String get alarmPreNoticeChannelDescription => 'إشعارات صامتة قبل المنبّه';
@override
String get openFolderChooserTitle => 'فتح المجلد';
@override
String get openRecordingChooserTitle => 'فتح التسجيل';
@override
String get eqDeviceEditTitle => 'تعديل الجهاز';
+23
View File
@@ -1268,6 +1268,29 @@ class AppLocalizationsBn extends AppLocalizations {
@override
String get snoozeAgainAction => 'আবার স্নুজ করুন';
@override
String get alarmRingingNotificationTitle => 'PluriWave অ্যালার্ম';
@override
String get alarmFireChannelName => 'বাজতে থাকা অ্যালার্ম';
@override
String get alarmFireChannelDescription =>
'কোনো মিউজিক অ্যালার্ম বাজার সময় জরুরি শব্দ ও স্ক্রিন';
@override
String get alarmPreNoticeChannelName => 'অ্যালার্ম রিমাইন্ডার';
@override
String get alarmPreNoticeChannelDescription =>
'অ্যালার্মের আগে নীরব বিজ্ঞপ্তি';
@override
String get openFolderChooserTitle => 'ফোল্ডার খুলুন';
@override
String get openRecordingChooserTitle => 'রেকর্ডিং খুলুন';
@override
String get eqDeviceEditTitle => 'ডিভাইস সম্পাদনা করুন';
+23
View File
@@ -1278,6 +1278,29 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get snoozeAgainAction => 'Erneut schlummern';
@override
String get alarmRingingNotificationTitle => 'PluriWave-Wecker';
@override
String get alarmFireChannelName => 'Klingelnde Wecker';
@override
String get alarmFireChannelDescription =>
'Dringender Ton und Bildschirm, wenn ein Musikwecker klingeln soll';
@override
String get alarmPreNoticeChannelName => 'Wecker-Vorankündigungen';
@override
String get alarmPreNoticeChannelDescription =>
'Lautlose Benachrichtigungen vor dem Wecker';
@override
String get openFolderChooserTitle => 'Ordner öffnen';
@override
String get openRecordingChooserTitle => 'Aufnahme öffnen';
@override
String get eqDeviceEditTitle => 'Gerät bearbeiten';
+23
View File
@@ -1264,6 +1264,29 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get snoozeAgainAction => 'Snooze again';
@override
String get alarmRingingNotificationTitle => 'PluriWave alarm';
@override
String get alarmFireChannelName => 'Ringing alarms';
@override
String get alarmFireChannelDescription =>
'Urgent sound and screen when a music alarm must ring';
@override
String get alarmPreNoticeChannelName => 'Alarm reminders';
@override
String get alarmPreNoticeChannelDescription =>
'Silent notifications before the alarm';
@override
String get openFolderChooserTitle => 'Open folder';
@override
String get openRecordingChooserTitle => 'Open recording';
@override
String get eqDeviceEditTitle => 'Edit device';
+23
View File
@@ -1273,6 +1273,29 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get snoozeAgainAction => 'Posponer otra vez';
@override
String get alarmRingingNotificationTitle => 'Alarma PluriWave';
@override
String get alarmFireChannelName => 'Alarmas sonando';
@override
String get alarmFireChannelDescription =>
'Sonido y pantalla urgente cuando una alarma musical debe sonar';
@override
String get alarmPreNoticeChannelName => 'Preavisos de alarmas';
@override
String get alarmPreNoticeChannelDescription =>
'Notificaciones silenciosas antes de la alarma';
@override
String get openFolderChooserTitle => 'Abrir carpeta';
@override
String get openRecordingChooserTitle => 'Abrir grabación';
@override
String get eqDeviceEditTitle => 'Editar dispositivo';
+23
View File
@@ -1283,6 +1283,29 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get snoozeAgainAction => 'Reporter encore';
@override
String get alarmRingingNotificationTitle => 'Alarme PluriWave';
@override
String get alarmFireChannelName => 'Alarmes en cours';
@override
String get alarmFireChannelDescription =>
'Son et écran urgents lorsqu\'une alarme musicale doit sonner';
@override
String get alarmPreNoticeChannelName => 'Rappels d\'alarme';
@override
String get alarmPreNoticeChannelDescription =>
'Notifications silencieuses avant l\'alarme';
@override
String get openFolderChooserTitle => 'Ouvrir le dossier';
@override
String get openRecordingChooserTitle => 'Ouvrir l\'enregistrement';
@override
String get eqDeviceEditTitle => 'Modifier l\'appareil';
+22
View File
@@ -1267,6 +1267,28 @@ class AppLocalizationsHi extends AppLocalizations {
@override
String get snoozeAgainAction => 'फिर से स्नूज़ करें';
@override
String get alarmRingingNotificationTitle => 'PluriWave अलार्म';
@override
String get alarmFireChannelName => 'बजते अलार्म';
@override
String get alarmFireChannelDescription =>
'जब कोई संगीत अलार्म बजना हो तो तत्काल ध्वनि और स्क्रीन';
@override
String get alarmPreNoticeChannelName => 'अलार्म रिमाइंडर';
@override
String get alarmPreNoticeChannelDescription => 'अलार्म से पहले मूक सूचनाएँ';
@override
String get openFolderChooserTitle => 'फ़ोल्डर खोलें';
@override
String get openRecordingChooserTitle => 'रिकॉर्डिंग खोलें';
@override
String get eqDeviceEditTitle => 'डिवाइस संपादित करें';
+23
View File
@@ -1272,6 +1272,29 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get snoozeAgainAction => 'Tunda lagi';
@override
String get alarmRingingNotificationTitle => 'Alarm PluriWave';
@override
String get alarmFireChannelName => 'Alarm berbunyi';
@override
String get alarmFireChannelDescription =>
'Suara dan layar mendesak saat alarm musik harus berbunyi';
@override
String get alarmPreNoticeChannelName => 'Pengingat alarm';
@override
String get alarmPreNoticeChannelDescription =>
'Notifikasi senyap sebelum alarm';
@override
String get openFolderChooserTitle => 'Buka folder';
@override
String get openRecordingChooserTitle => 'Buka rekaman';
@override
String get eqDeviceEditTitle => 'Edit perangkat';
+23
View File
@@ -1278,6 +1278,29 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get snoozeAgainAction => 'Posponi di nuovo';
@override
String get alarmRingingNotificationTitle => 'Sveglia PluriWave';
@override
String get alarmFireChannelName => 'Sveglie in corso';
@override
String get alarmFireChannelDescription =>
'Suono e schermo urgenti quando una sveglia musicale deve suonare';
@override
String get alarmPreNoticeChannelName => 'Promemoria sveglia';
@override
String get alarmPreNoticeChannelDescription =>
'Notifiche silenziose prima della sveglia';
@override
String get openFolderChooserTitle => 'Apri cartella';
@override
String get openRecordingChooserTitle => 'Apri registrazione';
@override
String get eqDeviceEditTitle => 'Modifica dispositivo';
+21
View File
@@ -1228,6 +1228,27 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get snoozeAgainAction => 'もう一度スヌーズ';
@override
String get alarmRingingNotificationTitle => 'PluriWave アラーム';
@override
String get alarmFireChannelName => '鳴っているアラーム';
@override
String get alarmFireChannelDescription => '音楽アラームが鳴るときの緊急の音と画面';
@override
String get alarmPreNoticeChannelName => 'アラームの事前通知';
@override
String get alarmPreNoticeChannelDescription => 'アラーム前のサイレント通知';
@override
String get openFolderChooserTitle => 'フォルダを開く';
@override
String get openRecordingChooserTitle => '録音を開く';
@override
String get eqDeviceEditTitle => 'デバイスを編集';
+23
View File
@@ -1270,6 +1270,29 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get snoozeAgainAction => 'Adiar novamente';
@override
String get alarmRingingNotificationTitle => 'Alarme PluriWave';
@override
String get alarmFireChannelName => 'Alarmes tocando';
@override
String get alarmFireChannelDescription =>
'Som e tela urgentes quando um alarme musical deve tocar';
@override
String get alarmPreNoticeChannelName => 'Avisos de alarme';
@override
String get alarmPreNoticeChannelDescription =>
'Notificações silenciosas antes do alarme';
@override
String get openFolderChooserTitle => 'Abrir pasta';
@override
String get openRecordingChooserTitle => 'Abrir gravação';
@override
String get eqDeviceEditTitle => 'Editar dispositivo';
+23
View File
@@ -1274,6 +1274,29 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get snoozeAgainAction => 'Отложить снова';
@override
String get alarmRingingNotificationTitle => 'Будильник PluriWave';
@override
String get alarmFireChannelName => 'Звонящие будильники';
@override
String get alarmFireChannelDescription =>
'Срочный звук и экран, когда должен сработать музыкальный будильник';
@override
String get alarmPreNoticeChannelName => 'Напоминания о будильнике';
@override
String get alarmPreNoticeChannelDescription =>
'Беззвучные уведомления перед будильником';
@override
String get openFolderChooserTitle => 'Открыть папку';
@override
String get openRecordingChooserTitle => 'Открыть запись';
@override
String get eqDeviceEditTitle => 'Изменить устройство';
+21
View File
@@ -1221,6 +1221,27 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get snoozeAgainAction => '再次小睡';
@override
String get alarmRingingNotificationTitle => 'PluriWave 闹钟';
@override
String get alarmFireChannelName => '响铃的闹钟';
@override
String get alarmFireChannelDescription => '音乐闹钟需要响起时的紧急声音和屏幕';
@override
String get alarmPreNoticeChannelName => '闹钟预告';
@override
String get alarmPreNoticeChannelDescription => '闹钟前的静音通知';
@override
String get openFolderChooserTitle => '打开文件夹';
@override
String get openRecordingChooserTitle => '打开录音';
@override
String get eqDeviceEditTitle => '编辑设备';
+30 -22
View File
@@ -172,29 +172,41 @@ class ServicioAlarmasAndroid implements PuertoAlarmasAndroid {
@override
void configurarLocalizaciones(AppLocalizations l10n) {
_l10n = l10n;
// Push every localized notification/channel/chooser string to the native
// side so it can build localized notifications even when the Flutter engine
// is dead (alarm fired from a killed app). Fire-and-forget; runs once per
// locale change (callers guard against per-rebuild churn).
unawaited(_enviarTextosNotificacion(l10n));
}
/// Builds a pre-notice template string with a literal `{minutes}` placeholder
/// for Kotlin to replace at broadcast-receiver fire time.
///
/// Strategy: call [preNoticeCountdown] with a unique sentinel integer and
/// replace the sentinel's string representation with `{minutes}`.
static String _preNoticeTemplate(AppLocalizations l10n) {
const sentinel = 42424242;
return l10n.preNoticeCountdown(sentinel).replaceFirst(
sentinel.toString(),
'{minutes}',
);
Future<void> _enviarTextosNotificacion(AppLocalizations l10n) async {
try {
await _channel.invokeMethod<void>('setNotificationStrings', {
'ringTitle': l10n.alarmRingingNotificationTitle,
'snoozeLabel': l10n.snoozeAction,
'stopLabel': l10n.stopAlarmAction,
'skipLabel': l10n.skipNextAction,
'snoozeAgainLabel': l10n.snoozeAgainAction,
'fireChannelName': l10n.alarmFireChannelName,
'fireChannelDescription': l10n.alarmFireChannelDescription,
'preNoticeChannelName': l10n.alarmPreNoticeChannelName,
'preNoticeChannelDescription': l10n.alarmPreNoticeChannelDescription,
'preNoticeTemplate': _plantillaMinutos(l10n.preNoticeCountdown),
'snoozeCountdownTemplate': _plantillaMinutos(l10n.snoozeCountdown),
'openFolderTitle': l10n.openFolderChooserTitle,
'openRecordingTitle': l10n.openRecordingChooserTitle,
});
} catch (e) {
debugPrint('[PluriWave][alarmas] setNotificationStrings ERROR $e');
}
}
/// Same sentinel strategy as [_preNoticeTemplate], but for the snooze
/// countdown notification re-posted every minute while an alarm is snoozed.
static String _snoozeCountdownTemplate(AppLocalizations l10n) {
/// Turns a localized `{int} -> String` message into a template with a literal
/// `{minutes}` placeholder for Kotlin to fill at fire time: it calls the
/// message with a unique sentinel and swaps the sentinel back for `{minutes}`.
static String _plantillaMinutos(String Function(int) traducir) {
const sentinel = 42424242;
return l10n.snoozeCountdown(sentinel).replaceFirst(
sentinel.toString(),
'{minutes}',
);
return traducir(sentinel).replaceFirst(sentinel.toString(), '{minutes}');
}
@override
@@ -216,10 +228,6 @@ class ServicioAlarmasAndroid implements PuertoAlarmasAndroid {
final programada = await _channel.invokeMethod<bool>('scheduleAlarm', {
'id': alarma.id,
'title': localizedAlarmName(_textos, alarma.nombre),
'preNoticeTemplate': _preNoticeTemplate(_textos),
'snoozeCountdownTemplate': _snoozeCountdownTemplate(_textos),
'snoozeAgainLabel': _textos.snoozeAgainAction,
'snoozeStopLabel': _textos.stopAlarmAction,
'triggerAtMillis': proxima.millisecondsSinceEpoch,
'preNoticeAtMillis':
alarma.snoozeHasta == null