Changeset 0688b5f in Klonkt for src/views


Ignore:
Timestamp:
07/01/2026 07:06:45 PM (2 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
1c2dcba
Parents:
d18c60e
Message:

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@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/views/pages/post-edit.ejs

    rd18c60e r0688b5f  
    8787        <textarea name="excerpt" rows="2"><%= post.excerpt %></textarea>
    8888        <small class="pe-hint" style="opacity:.7"><%- t('pedit.excerpt_hint') %></small>
     89      </label>
     90      <% var _postLang = (typeof post.language !== 'undefined' && post.language) ? post.language : (typeof lang !== 'undefined' ? lang : 'en'); %>
     91      <label class="pe-field">
     92        <span><%= t('pedit.f_language') %> <small><%= t('pedit.language_hint') %></small></span>
     93        <select name="language" id="pe-language" style="max-width:220px">
     94          <% [['en','English'],['nl','Nederlands'],['de','Deutsch'],['fr','Français'],['es','Español'],['it','Italiano'],['pt','Português'],['pl','Polski'],['ru','Русский'],['uk','Українська'],['sv','Svenska'],['da','Dansk'],['nb','Norsk'],['fi','Suomi'],['tr','Türkçe'],['ja','日本語'],['zh','中文'],['ar','العربية']].forEach(function (l) { %>
     95            <option value="<%= l[0] %>" <%= l[0] === _postLang ? 'selected' : '' %>><%= l[1] %></option>
     96          <% }); %>
     97        </select>
    8998      </label>
    9099    </section>
Note: See TracChangeset for help on using the changeset viewer.