feat(todo): the weather: a forecast on days, tasks tied to it, the days that fit (ADR 0033, D40)

A task can need weather: dry, sunny, calm and a temperature range (not
freezing, warm, or from and to as typed), set from Weather in its
details (a chip beside Priority, then a row of its own once it needs
any) and kept in its sealed payload (`weather`, schema stays 1).
Where its day's forecast misses any of it, its row carries a mark and
its details say what is missing; nothing moves and its reminder stays.
Its date picker lists the coming days the forecast fits, at its time or
from 8:00 to 20:00 without one.

The forecast is for the place set in Settings' new Weather card, kept in
the sealed settings; else, for a task with a place, its first place. The
device's location is never read for it. `ForecastCubit` asks the
instance for each place (`InstanceWeather`, rounded to about a
kilometre) as it comes, as the app opens, hourly and on a pull, and
holds the answers in memory alone. With a place in Settings, each day's
heading in Today and Upcoming shows its sky and temperatures, the 3-day
grid its icon. Settings says where the instance gives no forecasts, and
credits Open-Meteo as its licence asks.

Whats-New: A task can need dry, sunny, calm or mild weather: it is marked when the forecast doesn't fit, and its date picker shows the days that do; days show the forecast for the place set in Settings.
Whats-New-De: Eine Aufgabe kann trockenes, sonniges, windstilles oder mildes Wetter brauchen: Sie wird markiert, wenn die Vorhersage nicht passt, und ihre Datumsauswahl zeigt die passenden Tage; die Tage zeigen die Vorhersage für den Ort aus den Einstellungen.

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-10 14:51:52 +01:00
commit 8502fb38f0
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -1287,5 +1287,150 @@
"type": "String"
}
}
},
"weatherTitle": "Weather",
"@weatherTitle": {
"description": "A task's weather it needs, in its details and the sheet choosing it (ADR 0033, D40)."
},
"weatherNeedDry": "Dry",
"@weatherNeedDry": {
"description": "A task needs no rain or snow over its hours (D40)."
},
"weatherNeedSunny": "Sunny",
"@weatherNeedSunny": {
"description": "A task needs a clear or partly cloudy sky (D40)."
},
"weatherNeedCalm": "Calm",
"@weatherNeedCalm": {
"description": "A task needs little wind (D40)."
},
"weatherTemperature": "Temperature",
"@weatherTemperature": {
"description": "The temperatures a task needs (D40)."
},
"weatherAnyTemperature": "Any",
"@weatherAnyTemperature": {
"description": "No temperature needed (D40)."
},
"weatherNotFreezing": "Not freezing",
"@weatherNotFreezing": {
"description": "From 1 °C on (D40)."
},
"weatherWarm": "Warm",
"@weatherWarm": {
"description": "From 18 °C on (D40)."
},
"weatherOwnRange": "From … to …",
"@weatherOwnRange": {
"description": "Temperatures typed (D40)."
},
"weatherFromLabel": "From",
"@weatherFromLabel": {
"description": "The lowest temperature typed, in °C (D40)."
},
"weatherToLabel": "To",
"@weatherToLabel": {
"description": "The highest temperature typed, in °C (D40)."
},
"weatherFrom": "from {degrees} °C",
"@weatherFrom": {
"description": "A task needs at least this temperature (D40).",
"placeholders": {
"degrees": {
"type": "String"
}
}
},
"weatherUpTo": "up to {degrees} °C",
"@weatherUpTo": {
"description": "A task needs at most this temperature (D40).",
"placeholders": {
"degrees": {
"type": "String"
}
}
},
"weatherBetween": "{low}–{high} °C",
"@weatherBetween": {
"description": "A range of temperatures (D40).",
"placeholders": {
"low": {
"type": "String"
},
"high": {
"type": "String"
}
}
},
"weatherDone": "Done",
"@weatherDone": {
"description": "Closes the sheet of a task's weather, keeping what was chosen (D40)."
},
"weatherFits": "The forecast fits",
"@weatherFits": {
"description": "Under a task's weather where its day's forecast gives what it needs (D40)."
},
"weatherDoesNotFit": "The forecast doesn't fit: {missed}",
"@weatherDoesNotFit": {
"description": "Under a task's weather, and its row's mark, where its day's forecast doesn't give what it needs (D40).",
"placeholders": {
"missed": {
"type": "String"
}
}
},
"weatherMiss": "{need, select, dry{rain} sunny{clouds} temperature{temperature} calm{wind} other{weather}}",
"@weatherMiss": {
"description": "What of the weather a task needs its forecast misses (D40).",
"placeholders": {
"need": {
"type": "String"
}
}
},
"weatherConditions": "{conditions, select, clear{Clear} partlyCloudy{Partly cloudy} cloudy{Overcast} fog{Fog} drizzle{Drizzle} rain{Rain} freezingRain{Freezing rain} snow{Snow} rainShowers{Showers} snowShowers{Snow showers} thunderstorm{Thunderstorm} other{Weather}}",
"@weatherConditions": {
"description": "A day's sky by its forecast, from Open-Meteo's weather code (D40).",
"placeholders": {
"conditions": {
"type": "String"
}
}
},
"weatherFittingDays": "Days the weather fits",
"@weatherFittingDays": {
"description": "The date picker's days whose forecast gives what the task needs (D40)."
},
"weatherNoFittingDay": "No day of the forecast fits",
"@weatherNoFittingDay": {
"description": "The date picker, where no day of the forecast fits (D40)."
},
"weatherSettings": "Weather",
"@weatherSettings": {
"description": "Settings' group of the forecast (D40)."
},
"weatherPlace": "Place of the forecast",
"@weatherPlace": {
"description": "Settings: the place days' forecasts and tasks' weather are for (D40)."
},
"weatherPlaceNone": "None: each task's own place",
"@weatherPlaceNone": {
"description": "Settings, where no place is set (D40)."
},
"weatherPlaceHelp": "Days show this place's forecast, and tasks tied to the weather are judged by it. Your device's location is never used for it.",
"@weatherPlaceHelp": {
"description": "Settings, below the place of the forecast (D40)."
},
"weatherPlaceRemove": "Remove the place",
"@weatherPlaceRemove": {
"description": "Settings: takes the place of the forecast away (D40)."
},
"weatherOff": "This instance gives no forecasts.",
"@weatherOff": {
"description": "Settings, where the instance's operator switched the weather off (D40)."
},
"weatherBy": "Weather data by Open-Meteo.com",
"@weatherBy": {
"description": "The credit Open-Meteo's licence asks for next to its data (D40)."
}
}