Part of PAR-251.
Message.ensureDefaultFile() (i18n/Message.java:265-276) writes the bundled messages.properties only when the operator has no base file — comment in code: saveResource(…, true) would clobber operator-edited messages, so it's intentionally write-once. reload() (:279-301) then loads messages*.properties from the data folder only; nothing consults the jar resource for keys missing on disk. So a key a new release adds is absent from any operator who already had a messages.properties, and findRaw() returns null → the literal key is rendered (only framework built-ins that use componentOr(key, fallbackPattern, …) survive a missing key).
On upgrade (trigger per PAR-251), reconcile the base bundle:
plugin.getResource("messages.properties") into a Properties.messages.properties into a Properties.reload() run as normal.messages_<lang>[_<COUNTRY>].properties) are translator/operator-managed and the jar usually ships only the base; don't synthesize translations. Per-key locale fallback already covers untranslated keys..properties is flat and largely comment-free; carrying # comment lines across is a nice-to-have, not required (the comment-preservation ask in PAR-251 is for config.yml). java.util.Properties doesn't round-trip comments/order — if comment/order preservation is wanted later, a small line-based merge would be needed.messages.properties containing that key at its shipped default, with their edited keys unchanged and no duplicates.Ref: hibernia-framework @ efc3f9b.