PRD-037 · Names in 13 languages: a public glossary page
Status · Draft, for operator sign-off Date · 2026-10-22 Owner · Marko Closes into · #612 Builds on ·
scripts/i18n-tools/native-terms.json(the translation glossary) ·/sourcing(the model for a public, data-driven transparency page) · the naming rules (science-terms-native, origin-language rule,src/lib/name-origins.js)
Why this is a PRD. It adds a public route built from an internal translation tool, and it publishes the site's naming rules as a promise readers can check. That needs agreement on what is shown, how gaps are handled and how readers report a wrong form before anything is built.
1 · What
A page, /names, listing every name in the glossary with its form in each of Orrery's 14 languages.
- Rows: one per name. Columns: English, then the 13 locales. The reader's own language is shown first after English.
- Categories as filters: people (302), stars and constellations (235), surface features (89), bodies (82), places (24), facilities (14), agencies (7), stations (2). 755 names on 2026-10-22.
- Search: one box matching any form in any script (typing Кеплер, ケプラー or Kepler finds the same row).
- Wikidata link per row where the glossary has an id (every star and agency, 289 of 302 people, 43 of 82 bodies; few features and places). It opens Wikidata, which links to every language's Wikipedia.
- The rules, in plain words, at the top: science terms, places and people are written the way each country's schools and agencies write them; built things (vehicles, missions) keep their name except in their origin language; agencies have a local form only in their own language.
- "Report a wrong form" link per row (§4).
2 · Empty cells: what they mean and what we show
The glossary stores a form only where it differs from English, so an empty cell means one of three things:
| Case | Example | Shown as |
|---|---|---|
| Same as English (Latin-script languages) | Houston in German; Michael Collins in French | the English form, greyed |
| Agency, by rule | Roscosmos has only ru Роскосмос | the English form, greyed |
| Real gap (non-Latin script missing) | Hayley Arceneaux has no Serbian or Korean; Chris Sembroski no Arabic, Korean, Serbian; most constellations no Hindi | must not ship empty |
On 2026-10-22, 277 entries have an empty non-Latin cell; 7 are agencies (by rule), so 270 are real gaps: 131 people, 128 stars and constellations, 10 bodies, 1 place.
Proposal: fill the real gaps by hand before the page ships (free route, same sourcing rules as the glossary: each form as that language's universities, schools or space agency write it; unsure → search native pages). Serbian is the operator's call.
Not checked yet: how the site writes those names in its pages today. The translated text may already carry a form where the glossary is empty; filling the glossary from the site's own form, where one exists, keeps one name per language.
3 · Where the name appears (optional, phase 2)
Each row could list the pages that use the name. That needs a scan of the content files per locale. Phase 2, if the operator wants it; phase 1 ships without it.
4 · Reporting a wrong form
Per row, a link that opens a prefilled email (or GitHub issue form) naming the entry, the locale and the current form. No accounts, no form backend. Corrections land in native-terms.json like any other edit.
5 · Translation and design
- Page chrome (title, rules text, filters, column labels, the report link) translated into 13 locales by hand.
- The table is wide (15 columns). Desktop: horizontal scroll with English pinned. Phone: one card per name, the reader's language first, other languages folded.
- RTL: Arabic cells right-to-left inside the table.
- Linked from
/sourcing, the colophon and the footer's About area.
6 · Data path
native-terms.json stays the source of truth. A build step copies the display fields (forms, category, Wikidata id) to static/data/names.json, excluding sources and _comment. validate-data checks that no real gap remains (§2) once the fill is done, so the page cannot regress.
7 · Measurement
Umami: page views, searches (search event with surface: names, query length only, the existing pattern), report-link clicks.
8 · Done
/namesrenders all glossary entries with filters and search, desktop and phone, in all 14 locales.- No real gap left;
validate-dataenforces it. - e2e: search in three scripts finds one row; a category filter; the phone layout.
9 · Non-goals
- Vehicle and mission names (
name-origins.js) in phase 1. They follow a different rule (origin language only); a second table later if wanted. - Editing names on the page.
- Pronunciation or audio.
10 · Open questions for the operator
- Route name:
/names(proposed) or under/library? - Report link: email or GitHub issue form?
- Phase 2 (where each name appears): wanted?
References
- #612
scripts/i18n-tools/native-terms.json,src/lib/name-origins.js/sourcing(src/routes/sourcing/+page.svelte): the transparency-page model