Add Apple Reminders integration for grocery list with local mapping persistence

Introduce a GroceryListManager facade that delegates to either the existing
in-app GroceryList or a new RemindersGroceryStore backed by EventKit. Users
choose the mode in Settings; when Reminders mode is active the Grocery List
tab is hidden. Recipe-to-reminder grouping uses a local mapping file
(reminder_mappings.data) instead of polluting the reminder's notes field,
with automatic pruning when reminders are deleted externally.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-15 02:54:52 +01:00
parent 6824dbea6b
commit 98c82dc537
15 changed files with 800 additions and 12 deletions

View File

@@ -4523,6 +4523,204 @@
}
}
}
},
"In-App" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "In der App"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "En la app"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dans l'app"
}
}
}
},
"Apple Reminders" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apple Erinnerungen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Recordatorios de Apple"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rappels Apple"
}
}
}
},
"Grocery list storage" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Einkaufsliste Speicherort"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Almacenamiento de la lista de compras"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stockage de la liste de courses"
}
}
}
},
"Reminders list" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Erinnerungsliste"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lista de recordatorios"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Liste de rappels"
}
}
}
},
"Grant Reminders Access" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zugriff auf Erinnerungen erlauben"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Permitir acceso a Recordatorios"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoriser l'accès aux Rappels"
}
}
}
},
"Open Settings" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Einstellungen öffnen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir Ajustes"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ouvrir les Réglages"
}
}
}
},
"Reminders access was denied. Please enable it in System Settings to use this feature." : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Der Zugriff auf Erinnerungen wurde verweigert. Bitte aktiviere ihn in den Systemeinstellungen, um diese Funktion zu nutzen."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Se denegó el acceso a Recordatorios. Actívalo en los Ajustes del sistema para usar esta función."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "L'accès aux Rappels a été refusé. Veuillez l'activer dans les Réglages système pour utiliser cette fonctionnalité."
}
}
}
},
"Grocery items will be saved to Apple Reminders. The Grocery List tab will be hidden since you can manage items directly in the Reminders app." : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Einkaufsartikel werden in Apple Erinnerungen gespeichert. Der Einkaufslisten-Tab wird ausgeblendet, da du die Artikel direkt in der Erinnerungen-App verwalten kannst."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Los artículos de la lista se guardarán en Recordatorios de Apple. La pestaña de lista de compras se ocultará, ya que puedes gestionar los artículos directamente en la app Recordatorios."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Les articles seront enregistrés dans Rappels Apple. L'onglet Liste de courses sera masqué car vous pouvez gérer les articles directement dans l'app Rappels."
}
}
}
},
"Grocery items are stored locally on this device." : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Einkaufsartikel werden lokal auf diesem Gerät gespeichert."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Los artículos de la lista se almacenan localmente en este dispositivo."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Les articles sont stockés localement sur cet appareil."
}
}
}
}
},
"version" : "1.1"