What changed
Hungarian translations from v4.0.47 actually ship in v4.0.48.
The v4.0.47 hu.po addition for "Random Books" collided with an obsolete #~ msgid for the same string further down the file. msgfmt rejects this as a duplicate definition, but compile_translations.sh is intentionally tolerant — it logs the failure and moves on to other locales so one broken .po doesn't strand the rest. Result: the v4.0.47 image shipped without hu/messages.mo, and Hungarian users got the English fallback on every string — including the four labels the prior release was supposed to fix.
Two changes:
-
Delete the obsolete
#~ msgid "Random Books"block inhu.po. It was commented out; removing it doesn't change behavior. The activemsgid "Random Books"→msgstr "Véletlenszerű könyvek"entry remains and is now the only one in the file. -
New regression test
tests/unit/test_translations_compile.pyrunsmsgfmtagainst every shipped.poas a unit test, parametrized per locale. Catches this class of regression before CI builds an image, not after deploy.
What the user sees
Hungarian users on :v4.0.48 (or :latest once it picks this up) get the four newly-translated OPDS root labels in Hungarian:
- "Alphabetical Books" → "Könyvek ábécé sorrendben"
- "Recently added Books" → "Nemrég hozzáadott könyvek"
- "Random Books" → "Véletlenszerű könyvek"
- "Magic Shelves" → "Varázspolcok"
Other locales unaffected.
To get the update
docker pull ghcr.io/new-usemame/calibre-web-nextgen:v4.0.48
Test verification
- 30/30 locales compile cleanly under
msgfmtin the new regression suite. - Reproduced the v4.0.47 bug by regenerating the obsolete duplicate and confirmed the test fails with the expected
duplicate message definitionerror. - Production Docker build will now ship
hu/messages.mo(verified post-fix that the .mo compiles to 155 KB with all 4 new translations resolving correctly undergettext.translation('messages', languages=['hu'])).
Honest note
This bug shipped because v4.0.47's verification didn't include "pull the GHCR image and check the .mo files survived the production Docker build." That's now a fixed step in the CLAUDE.md enterprise verification checklist — every i18n-touching release must include a gettext.translation(...).gettext(...) probe against the production image, not just the local rebuilt one.