Store a nuance in an English word and every translation inherits whatever that word got wrong. Store it in a concept — a definition, a scope note, and one label per culture — and translating stops being word-to-word. This page is the review surface for that scheme, and the English pass over it.
The app page does not read concepts.json. That is deliberate:
this is a place to decide what words should be, separately from the strings currently
shipping, so a decision can be argued with before it reaches anyone. The cost of that
separation is drift — a review document describing strings that changed months ago is
worse than no document, because it is confidently wrong. So every concept records what
actually ships, and a CI test asserts those recordings against the real locale
files. Change a string without revisiting its concept and the build fails.
The app ships 53 keys and most are prose. A sentence does not have a concept — it has meaning in context. Only the terms are modelled here, in three schemes.
Field names are borrowed from SKOS — definition, scopeNote, broader, narrower, related — without the RDF machinery. No triple store, no SPARQL. For fifteen concepts on a site with no backend, that would be all cost.
Two cultures using different words is usually the model working, not a defect. voice note / voice message / nota de voz / áudio are four right answers. Findings say which kind of difference each one is.
Three views of the same data, because part of the exercise is working out which way of looking at this is actually useful. Cards put the definition first and the labels underneath — good for deciding. Matrix puts every culture side by side on one row — good for spotting divergence. Relations draws the broader/narrower/related edges, which is the structure a held-out check would compare — and drawing it is what makes plain how few edges an interface vocabulary this flat actually has.
The full reasoning sits on each concept above. The short version:
draft → unrevieweddraft names a stage of authoring — an unfinished thing its
author is still working on. The concept is a state of verification — a
finished thing nobody has checked. All four locales ship 53 of 53 keys; nothing is
missing. So incomplete and partial are wrong too: they describe
coverage. rascunho was never a bad translation — it faithfully carried a
word that was already pointing at the wrong axis.
soon → plannedA promise about time that nothing backs. en-gb/culture.json declares
this product's register as “Plain, direct British English. No marketing register”
— and soon is marketing. The concept is intent, not imminence.
Routed — cheapest and Restricted*Both name a mechanism inside a group labelled privacy, where the question
is where the audio goes — and the first smuggles a second axis, price, into the same
string. On-device is the only chip already labelled on the scheme's own
axis, which is how the inconsistency was spotted. These are claims made to users about
their recordings, so they are marked decide and want sign-off rather
than a unilateral edit.
pt-PT uses idioma for the setting and língua for the tongue that was spoken. English uses one word for both and gets away with it because context disambiguates. Portuguese is being more precise, not inconsistent — a genuine lexical gap. Recording it is right; forcing agreement would destroy information.
Named so the gap is visible rather than assumed.
core domain is modelled. The chat, flow and
debug panels hold roughly 130 more literals that have not been extracted at all.