About 100 messages never reached the dictionary: written in English in the code, or on elements
without a data-i18n / data-i18n-title hook, so Portuguese showed them in English. 97 now go through
t()/tn() (107 keys, 10 singular/plural pairs) and pt.js has them: the Fins readout and selected-wall
line, the 3MF/STEP object picker, the section recaps and timings, the hookless tooltips and labels,
and the Draw / sway refusal reasons (translated where shown, so draw.js and sway.js stay free of UI
i18n, as orient.js after #222). de.js is untouched; the hooks are language-neutral, so the 33 strings
de.js already has will show in German too.
English is unchanged: every converted template rendered old vs new at n = 1, 2, 7 (104 cases,
identical), and in Chromium the English page matches main in every state checked. Strings that keep
their English grammar ("1 tines", "The 1 prop sit") keep it on purpose. deno test -A: 533 passed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Translate plugin installation steps, complete sway reason and overhangs zero-state
* feat(i18n): vollständige deutsche Übersetzung für UI, Tooltips und Statusmeldungen
* i18n: Update German translation for updated PETG material tooltip
* i18n: Tooltips für Haltezacken und Stützrippen übersetzt
* Update dynamic readouts and notes reactively on languagechange
* Local adjustments to index.html before upstream merge
* Refine German translations for calibration test prints
* Align bed-pad auto label with options schema to pass CI tests
* Restore selected attribute on bed-pad auto option to match schema default
* i18n: English stays the default until the language picker ships -- German is opt-in by ?lang=de, no browser-language detection yet (restores main's de88eef)
---------
Co-authored-by: matthewtrahan <mathyout@pm.me>
setPart, shade, the flat baseline, readable Euler angles, the stats report,
updateFit, lastResult and the overhang threshold input move byte-for-byte,
with part / partName / topology / rotM3 / analysisTiming. setPart disarms
lay-flat through setLayPlacing(false). app.js exports gizmo and hoverFace
for part.js until the pose moves out; every ui module now imports the part
names from part.js.
Pure move. volume.js owns the preset/custom select, the remembered size and
applyVolume(); updateFit() reads it through currentVolume(). export.js owns
buildExportGeometry() and the STL/3MF buttons, reading part, topology,
lastResult, rotM3, partName and activeAdded from app.js (now exported;
temporary back-imports until those move out).