feat(fediverse): post language → AS2 contentMap
A post can now carry a language; it federates as an AS2 contentMap (a BCP-47-keyed
copy of the content, alongside plain content) so Mastodon's timeline language filter
and translate button work. Editor gets a language picker (defaults to the author's
UI language).
- src/config/database.js — posts.language column.
- src/services/ActivityPubService.js — buildNote emits contentMap { <lang>: content }
when the post has a valid BCP-47 language.
- src/routes/posts.js — capture/validate/store language on create/save (default = the
author's current language) and pass it to the federation hooks.
- src/services/Scheduler.js — carry language when a scheduled post goes live.
- src/views/pages/post-edit.ejs — language <select> (18 common languages).
- src/services/i18n.js — pedit.f_language + pedit.language_hint (nl/en/de).
- test/activitypub-as2.test.js — allow contentMap/nameMap/summaryMap; don't treat a
language-map's keys as vocab terms; kitchen-sink post now sets a language.
- test/post-language.test.js — contentMap shape, no-language, invalid-code = ignored.
- CHANGELOG(.nl/.de).md — "Set a post's language" under Unreleased.
Co-Authored-By: Claude <noreply@…>