feat(todo): pick a place on a map, for quick add and a task's Where (ADR 0033, D32)

The location picker searches by city or district and name through
PlaceSearchGateway, its results a list and pins on Train's OpenFreeMap map,
or takes a pin placed by hand; recent places, and None, Arrive or Leave.
TodoDependencies.places is the seam for the instance's search; until then
komoot's public Photon, in a debug build asked for it alone. Quick add has
`+` suggestions, an entry in its + menu and a pin button; the task sheet a
Where box; a task's row the place's name.

ReminderScheduler plans the places to watch into LocationReminderGateway,
a no-op off Android, which TodoPerson.dispose clears, and Settings' Reminders
says while the device may not watch them.

Whats-New: Tasks can have locations: type + or use the + menu, search by city and name or pick on the map, and be reminded on arriving or leaving (Android).
Whats-New-De: Aufgaben können Orte haben: Tippe + oder nutze das +-Menü, suche nach Stadt und Name oder wähle auf der Karte, und lass dich beim Ankommen oder Verlassen erinnern (Android).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-05 15:23:53 +01:00
commit 77d6a5528c
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -910,5 +910,120 @@
"planFilterTitle": "Filter by project",
"@planFilterTitle": {
"description": "Today's Plan's project filter (ADR 0033, D30): its search field's hint and its name."
},
"locationTitle": "Location",
"@locationTitle": {
"description": "Quick add's + menu and its button (ADR 0033, D32)."
},
"locationAdd": "Add location",
"@locationAdd": {
"description": "A task's Where, and the picker's button."
},
"locationWhere": "Where",
"@locationWhere": {
"description": "The heading of a task's places."
},
"locationAnyOf": "Any of these",
"@locationAnyOf": {
"description": "Under a task's Where, with several places: they are alternatives."
},
"locationSearchHint": "City or district, then the name",
"@locationSearchHint": {
"description": "The location picker's search field."
},
"locationSearchAny": "Search for a place",
"@locationSearchAny": {
"description": "Quick add, as + is typed."
},
"locationSearchFor": "Search for “{query}”",
"@locationSearchFor": {
"description": "Quick add, as +something is typed.",
"placeholders": {
"query": {
"type": "String"
}
}
},
"locationSearchUnavailable": "Search isn't available here. Move the map and tap to place a pin.",
"@locationSearchUnavailable": {
"description": "The location picker without a place search."
},
"locationSearchFailed": "The search didn't work. Try again.",
"@locationSearchFailed": {
"description": "The location picker after a failed search."
},
"locationNoResults": "Nothing found",
"@locationNoResults": {
"description": "The location picker, a search without results."
},
"locationRecent": "Recent",
"@locationRecent": {
"description": "The location picker's places of the person's tasks."
},
"locationPin": "Pinned place",
"@locationPin": {
"description": "The name of a pin placed by hand where nothing names the spot."
},
"locationName": "Name",
"@locationName": {
"description": "The name field of a pin placed by hand."
},
"locationMine": "My position",
"@locationMine": {
"description": "The map's button."
},
"locationRemindNone": "No reminder",
"@locationRemindNone": {
"description": "A location's reminder."
},
"locationRemindArrive": "On arriving",
"@locationRemindArrive": {
"description": "A location's reminder."
},
"locationRemindLeave": "On leaving",
"@locationRemindLeave": {
"description": "A location's reminder."
},
"locationRemove": "Remove",
"@locationRemove": {
"description": "A task's location's menu."
},
"locationAccessTitle": "Allow location all the time",
"@locationAccessTitle": {
"description": "Before asking for the position in the background."
},
"locationAccessHint": "To remind you when you arrive or leave, Halkyon Todo needs your position while it is closed too. It stays on this device. Next, choose “Allow all the time”.",
"@locationAccessHint": {
"description": "Before asking for the position in the background."
},
"locationAccessGo": "Continue",
"@locationAccessGo": {
"description": "Before asking for the position in the background."
},
"locationOffTitle": "Location is off for reminders",
"@locationOffTitle": {
"description": "Settings' Reminders while places are planned and may not be watched."
},
"locationOffHint": "Reminders at a place need “Allow all the time”.",
"@locationOffHint": {
"description": "Settings' Reminders while places are planned and may not be watched."
},
"locationArrived": "You're at {name}",
"@locationArrived": {
"description": "A reminder on arriving, below the task's title.",
"placeholders": {
"name": {
"type": "String"
}
}
},
"locationLeft": "You've left {name}",
"@locationLeft": {
"description": "A reminder on leaving, below the task's title.",
"placeholders": {
"name": {
"type": "String"
}
}
}
}