|
1 | | -# Worklog — v2.27.4 (in progress) |
| 1 | +# Worklog — v2.28.0 (released) |
2 | 2 |
|
3 | 3 | ## Added |
4 | 4 | - **Dutch, the 11th locale** — `nl.json`, 1523 keys, contributed by @Ptitlouis6012 in #32 and merged as theirs. Reviewed to the same bar as Russian before merging: key set identical to `en.json`, no empty value, every `{{param}}` preserved, the 19 plural objects and 6 arrays kept as such, and the tone held in the playful strings ("Zullen we," for "Let's go,"). The 92 strings identical to English are genuine cognates — Type, Model, Status, Details, Container, Diameter, Online — not untranslated leftovers. Verified by running the app in Dutch: the picker offers Nederlands, every view renders translated and nothing clips. |
5 | | - - Finished on top, the same three gaps the Russian PR left: the whatsnew scripts learn `nl` (and `LOCALE_SINCE` gains `nl: "2.27.4"`, so the 507 items written before it stay valid while everything from this release must carry it), and the locale counts move 10 → 11 wherever a living doc or comment states one — `scripts/whatsnew-{add,check,import-changelog}.mjs`, `CLAUDE.md`, `README.md`, `FEATURES.md`, `ROADMAP.md`, `renderer/CODEMAP.md`, the four `docs/*-BRIEF.md` |
| 5 | + - Finished on top, the same three gaps the Russian PR left: the whatsnew scripts learn `nl` (and `LOCALE_SINCE` gains `nl: "2.28.0"`, so the 507 items written before it stay valid while everything from this release must carry it), and the locale counts move 10 → 11 wherever a living doc or comment states one — `scripts/whatsnew-{add,check,import-changelog}.mjs`, `CLAUDE.md`, `README.md`, `FEATURES.md`, `ROADMAP.md`, `renderer/CODEMAP.md`, the four `docs/*-BRIEF.md` |
6 | 6 |
|
7 | 7 | - **Russian, the 10th locale** — `ru.json`, 1523 keys, contributed by @Ptitlouis6012 in #31 and merged as theirs. Wired into the language picker, the onboarding step, the locale loader and the three i18n scripts; the doc-drift checker now COUNTS the locale files instead of holding "9" as a constant, which is the part that keeps the next locale cheap. Reviewed before merging: key set identical to `en.json`, no empty value, every `{{param}}` preserved, the 19 plural objects and 6 arrays kept as such, and the tone held — the translation avoids ты/вы entirely through impersonal forms, which is the safe register in Russian. |
8 | 8 |
|
|
12 | 12 | - **The Firebase Explorer reaches the TigerSpools**, the collection a TigerSpool writes itself into from firmware 1.65.0 (`users/{uid}/tigerspools/{mac}`, keyed by the Wi-Fi MAC). Presence only, which is all the device publishes today; the app does not list the boxes yet. Reading it is also the fastest way to answer whether a box is declaring itself at all — and the first thing it answered here is that the rules deny the path entirely — `renderer/inventory.js` |
13 | 13 | - **The Firebase Explorer reaches the scales, the racks and the lists.** Its quick chips covered the inventory, the printers and the products but stopped there, so a TigerScale's document — the one holding what the firmware reports about a physical device — could only be seen by typing its path by hand, which means knowing it. Three chips added: `scales`, `racks`, `lists`. A scale's live command channel (TARE) is in the REALTIME database rather than Firestore, so it stays out of reach of this explorer by nature, and the chip comment says so — `renderer/inventory.js` |
14 | 14 | - **Debug mode is every account's switch, not the admins'.** The toggle in the account modal was shown only to `roles: "admin"`, and `state.debugEnabled` was itself `isAdmin && Debug` — so a normal user could never turn on the one view that makes a bug report useful (their own raw Firestore documents, the last call to the API, the per-card "copy ref" helper). The gate bought no safety: the panel reads the SIGNED-IN user's own documents and every path goes through the same Security Rules as the rest of the app — the checkbox was never what stood between a user and someone else's data. The row is always shown now and `Debug` is read as the plain user preference it is; `roles` still gates the Admin badge, and nothing else. The panel button itself was already unconditional — `renderer/inventory.js`, `CLAUDE.md` |
15 | | -- **The "What's New" tooling knows about locales that arrived late.** Adding `ru` to the three whatsnew scripts alone would have failed the whole back-catalogue: the check demands that an item which carries ANY non-English locale carries them all, and 507 items written before Russian existed carry none. A `LOCALE_SINCE` map (`{ ru: "2.27.4" }`) now says which version a locale shipped in, and each version block is held to the locales that existed then — history stays valid, everything from v2.27.4 on must be complete in all 10. `whatsnew:add` scaffolds 10 locales, and `whatsnew:import` recognises a Russian entry as hand-localised so it is never overwritten — `scripts/whatsnew-{add,check,import-changelog}.mjs` |
| 15 | +- **The "What's New" tooling knows about locales that arrived late.** Adding `ru` to the three whatsnew scripts alone would have failed the whole back-catalogue: the check demands that an item which carries ANY non-English locale carries them all, and 507 items written before Russian existed carry none. A `LOCALE_SINCE` map (`{ ru: "2.28.0" }`) now says which version a locale shipped in, and each version block is held to the locales that existed then — history stays valid, everything from v2.28.0 on must be complete in all 11. `whatsnew:add` scaffolds 10 locales, and `whatsnew:import` recognises a Russian entry as hand-localised so it is never overwritten — `scripts/whatsnew-{add,check,import-changelog}.mjs` |
16 | 16 | - **Seven Russian plurals corrected** (kept in the contributor's own style, which sidesteps the problem elsewhere in the file): Russian has three plural forms where the app's engine has two, so "{{n}} материалов" is wrong for 2-4. The counts now read "Материалов: {{n}}", "Друзей: {{n}}", "Подписчиков: {{n}}" — the impersonal form the translation already uses for loaded spools and hidden items — the durations use the invariant abbreviations "{{n}} сек" / "{{n}} мин", and the rack tile's label, which sits under its own number, is the plain plural "стеллажи" — `renderer/locales/ru.json` |
17 | 17 | - **The printer speed dropdown sizes itself to its own label.** Found by running the app in Russian: a fixed 110 px (96 px on Anycubic) clipped "Сбалансированная" to "Сбалансирова…" — the width had been tuned to the English "Standard", and every locale is free to be longer. It now sizes to its widest option, floored at the old width so no other locale moves, and capped so a long label cannot push the card — `renderer/css/57-elegoo.css`, `renderer/printers/anycubic/anycubic.css` |
18 | 18 | - Locale counts updated wherever a doc or a comment stated nine — `CLAUDE.md`, `README.md`, `FEATURES.md`, `ROADMAP.md`, `renderer/CODEMAP.md`, `renderer/inventory.js`, the four `docs/*-BRIEF.md` |
|
23 | 23 | ## Removed |
24 | 24 |
|
25 | 25 | ## i18n |
26 | | -- Pending cleanup, carried over from v2.23.1: `scaleNoActivity` and `scaleReader` are orphaned — still shipped in all 9 locales, no longer referenced anywhere in `renderer/` |
| 26 | +- Pending cleanup, carried over from v2.23.1: `scaleNoActivity` and `scaleReader` are orphaned — still shipped in all 11 locales, no longer referenced anywhere in `renderer/` |
0 commit comments