German (de) translation – l10n-de, #6 |
1.0.196 |
de.json/de.js, informal "du", Nextcloud terms; plus de texts for #4 (this branch only) |
Dark theme fix – fix-dark-mode, #8 |
1.0.196 |
tokens on :root, body (Nextcloud dark vars live on body), hard-coded light colors derived from surface |
Plural-aware counts – l10n-plurals |
1.0.196-1 |
trn() on n(), _%n x_::_%n xs_ keys for en/it/fr/de, "1 recipe" instead of "1 recipes", l10n test checks plural keys |
Composed texts – l10n-composed-texts |
1.0.196-2 |
"Decrease/Increase servings" as full keys, shopping progress {checked} of %n items completed, trn() vars |
Hard-coded texts – l10n-hardcoded-texts |
1.0.196-3 |
backend error messages translated (localizeApiMessage, patterns + placeholders), min unit, manifest description, tr(text, vars); de "Danger zone" = "Unwiderrufliche Aktionen" |
AI meal plan prompt – l10n-ai-prompts |
1.0.196-4 |
prompt in en/it/fr/de via IL10N, default instruction not stored (placeholder), no Italian example |
Default language – language-setting |
1.0.196-4 |
setting was never used; now default for new recipes, import output, assistant; auto = Nextcloud language; datalist autocompletion; validation |
OCR default language – ocr-language-default |
1.0.196-5 |
default from Nextcloud language (deu+eng, fra+eng, …) instead of ita+eng; OCR help lists matching packages |
AI provider errors – ai-http-errors |
1.0.196-6 |
retry on 429/502/503/504 (Retry-After), readable translated errors instead of raw Guzzle message / "unexpected error", API key no longer in logs or messages |
Ingredient units de/fr – ingredient-units |
1.0.196-7 (fr: -8, labels: -9) |
parser knows German and French units (fr: cuillère à soupe/café, pincée, gousse, tranche, boîte, de/d' after the unit); ingredient text editor shows translated unit labels, all en/it/fr/de labels map back (q.b., nach Geschmack, au goût); German: parser knows German units (TL, EL, Prise, Zehe, Stück, Kopf, Scheibe, Bund, Dose, Päckchen, …) with canonical codes, /n and (n) plural markers, Zitrone(n) / Ei(er) no longer become notes, Knoblauchzehe(n) → clove + Knoblauch, smoke tests |
Empty quantity in import editor – import-empty-quantity |
1.0.196-10 |
empty quantity cell in the ingredient text editor is no quantity instead of 0 ("0 Öl"); fractions and decimal commas typed there are kept |
Household – household |
1.0.196-11 (limit: -12, several groups: -13) |
everybody picks one or several of their own Nextcloud groups as household (SmartCook settings); members of the same household see and edit each other's recipes, planner and shopping lists; entries stay owned by their creator (leaving or switching hides them again); AI/cover settings stay personal; taxonomy lists merged by name; admin form (Additional settings) limits the selectable groups (empty = all), a choice that is no longer allowed hides the shared data but is kept |
Translate recipe – recipe-translate |
1.0.196-14 |
AI button (only shown when an AI provider is configured) translates the recipe into the user's language: toggle on the overview (view only, cached), button in the editor and in each import preview (fills the form); POST /recipes/translate, AiPromptFactory::forRequest() replaces the duplicated prompt selection of the four providers |
AI JSON robustness – ai-json-diagnostics |
1.0.196-15 |
raw control characters inside AI JSON strings are accepted, one retry when the answer is still not valid JSON, the shape of a failed answer is logged (no recipe content beyond start/end) |
Planner "+" feedback – planner-add-feedback |
1.0.196-17 |
the "+" of a day scrolls to the "Add a meal" form, focuses the recipe list and says which day it is for (before it only set a date field further down, so nothing seemed to happen) |
Recipe picker filter – recipe-picker-filter |
1.0.196-19 |
typing in the planner's recipe search hides non-matching recipes (display: block overrode the hidden attribute, so the filter had no visible effect); the list opens upwards near the bottom of the screen |