Skip to content

adr: language tagging for preferred_label and alternative_labels #109

Description

@maehr

Context

ADR-0007 gave Work an optional alternative_labels list of plain strings, published as skos:altLabel. It considered language-tagged label objects ({ value: string, language?: string }[]) and rejected them — explicitly not on merit:

it is the better end state, but it leaves preferred_label a bare string, and the inconsistency means the language question should be answered for both fields at once.

It filed the follow-up:

Separate ADR: language tagging for labels, answered for preferred_label and alternative_labels together.

The problem

Both label fields are bare strings today, so the registry publishes labels in several languages with no way to say which is which.

  • preferred_label holds one English string per work, even where the scholarly name is not English.
  • The eight Nietzsche works are registered under German titles; the Dante, Hume and Homer works under Italian, English and English.
  • alternative_labels mixes kinds and languages in one flat list: abbreviations (NE, LXX, PI), Latin and Greek titles, and translated titles.

A client cannot select the label for its reader's language, and skos:altLabel is published without the language tag SKOS expects.

What exists to build on

  • LanguageTag is already implemented at standard/schema/common.ts — RFC 5646 langtag plus privateuse — and mirrored as an OpenAPI pattern. The validator does not need to be written.
  • ResolverTargetEntry already uses it, so there is a precedent for the shape inside this codebase.

Constraints

  • Identity is untouched. No label is a UUID seed input under ADR-0002, so any change here re-mints nothing. That was ADR-0007's central guarantee and it must survive.
  • preferred_label is required and published. Changing its type is a breaking change to Work. Under the working-draft clause that is permitted before 1.0, but it is not free after v0.1.0 is tagged and citable.
  • Homonymy stays legal. ADR-0007 lets two works claim the same label. Language tagging must not turn that into an error.
  • Ranked search reads these fields. src/lib/find.ts ranks on a seven-tier ladder over both label fields. A shape change reaches the finder and the registry browser filter.

Related, and worth deciding together

#92 asks for ranked search over alternative labels and for a way to mark an entry as an abbreviation rather than a title. An abbreviation is language-bearing too — NE is English, EN is German for the same work. If the entry shape gains a language, it may as well gain a kind in the same change rather than in two successive breaking changes.

Links

Activity

  1. added
    enhancementNew feature or request
    adrArchitecture Decision Record
    standardThe published specification and schemas
    on Aug 27, 2026
  2. maehr commented on Sep 1, 2026

    @maehr
    MemberAuthor

    Closed as not planned, and labelled post-v0.1.0.

    This is the strongest deferral candidate of the five, so the argument is worth stating in full.

    The cost of waiting is real but bounded. Typing preferred_label is a breaking change to Work. The working-draft clause permits a breaking change before 1.0, and v0.1.0 is not 1.0: specification.md says 0.1.0-draft and the standard pages carry maturity: working-draft. ADR-0004 and ADR-0006 both used that clause. This change can use it too.

    More important, this issue records the guarantee that makes deferral safe: no label is a UUID seed input under ADR-0002. A later change re-mints no identifier and breaks no citation. The cost is a documented migration of a non-identity field, not a persistence failure.

    The work is also larger than it looks. It needs an ADR, a schema change, a data pass over every work, and an edit to the seven-tier ladder in src/lib/find.ts. This issue asks to decide it together with #92, which has already shipped. That is a cross-repository change against a release that is green and waiting on one approval.

    LanguageTag in standard/schema/common.ts stays available, so the validator is written when the ADR lands.

    Reopen with #92 when a client needs to select a label by language, or before the 1.0 tag, whichever comes first. After 1.0 the working-draft clause no longer applies, and the change becomes genuinely expensive.

  3. added
    post-v0.1.0Deferred past the v0.1.0 baseline. Revisit if the need arises.
    on Sep 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    adrArchitecture Decision RecordenhancementNew feature or requestpost-v0.1.0Deferred past the v0.1.0 baseline. Revisit if the need arises.standardThe published specification and schemas

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions