The post, category, tag and author descriptors keep one entry per
enabled locale but give a locale a URL only when the record has content
in it: posts and categories by their own translation (a translated slug
alone is no content), tags and authors when one of their published
posts is translated into it, the default locale always. Without content
the entry's URL is "", so hreflang and the sitemaps never advertise an
untranslated locale. The menu item types' Resolve is unchanged.
- posts describe PublishedAt, their categories by name as Parents, the
author (a journal-author reference while author pages are on), the
featured and body images, YouTube embeds, the heading outline and
TopHeading (2 while the H1 setting is on, else 0)
- categories describe their parent, the pillar text's outline and
TopHeading; kinds article/collection and the journal_ fixing tools
- golem15.journal.author_pages (AuthorPagesKey, default true)
- journal-post, journal-category and journal-tag carry pact.ContentDescriptor
(controller, morph name, Describe, Records, Match) through signpost
- Match reads the locale prefix and the pattern with signpost.MatchPattern,
finds the record by its slug in that locale, the default slug, another
locale's slug or :id, and is exact only on the record's own URL (D-20c)
- journal-tag (/blog/tag/:slug, P-11) with references and Resolve; host key
golem15.journal.tag_pages false empties tag URLs and stops tag matches
- TestContentDescriptors, TestJournalTagType; README documents both
- journal-post registers a pact.ContentDescriptor (posts controller, Post
morph name, Describe with per-locale URL, title, excerpt, image, words)
- descriptors read through cabana.TxFromContext inside a save
- TestRecordSavedDescribesNewURL: an admin slug change reaches a subscriber
after commit and Describe answers the new URL; a failed save fires nothing