Elvish Translation Tools
Core principle
Every word in an Elvish translation must be traceable to a source: Tolkien's writings, a Neo-Sindarin reconstruction in Eldamo, or a deliberate coinage that you explicitly flag. Hallucinated vocabulary is the failure mode this skill exists to prevent.
Sindarin and Quenya have small attested corpora and large reconstructed vocabularies. Models often "know" plausible-looking words that don't actually exist, or mix Quenya words into Sindarin text. Always check.
When to use
- A translation source file uses Sindarin (
sjn) or Quenya (qya). - The user asks to translate an English string into Elvish.
- The user asks to review or critique an Elvish translation.
- The user asks to add or revise entries in an Elvish translation file.
- You encounter a Tolkien / Middle-earth language question in code context.
When NOT to use
- Translation to natural languages (use a normal translation skill).
- Lore / worldbuilding questions unrelated to language work.
- Tolkien-flavoured naming that explicitly wants made-up words and doesn't need linguistic grounding.
Modes
Mode 1: Review
Use when an entry (or a whole file) already exists and you're checking it.
- For each Elvish word in the entry, run:
This reports: where the word is attested, in what language, and any warnings (Quenya-as-Sindarin, deprecated, Gnomish revival, etc.).python3 ${CLAUDE_SKILL_DIR}/scripts/lookup.py check <word> - Apply the review checklist below.
- If the entry uses the project's translation schema (see Schema section), verify the
elements[]provenance matches whatlookup.py checkreports. - Surface findings: keep / revise / replace, with reasoning. Don't silently rewrite.
Mode 2: Translate
Use when adding new entries (drift from upstream source) or producing a translation from scratch.
- Search the lexicon for relevant words:
For false-friend awareness across languages, addpython3 ${CLAUDE_SKILL_DIR}/scripts/lookup.py search <english-substring>--any-lang. - Check existing project vocabulary for recurring lexemes (e.g. if the project consistently uses
northofor "play", reuse it; don't invent a new word). - Propose candidates ranked: attested > Neo-Sindarin > defensible reconstruction > coinage. Present alternatives, not single answers, when more than one is plausible.
- Verify each component:
python3 ${CLAUDE_SKILL_DIR}/scripts/lookup.py check <proposed-word> - Apply mutation rules at element boundaries (see Mutations section).
- Fill out the project's schema fields if the file uses one. At minimum:
sjn.roman,sjn.literal, andelements[]withattestationandsourceper element. - Defer to the user on any coinage. Never invent vocabulary and present it as established.
The lookup tool (essential)
Path: ${CLAUDE_SKILL_DIR}/scripts/lookup.py. Reads compact TSVs extracted from Paul Strack's Eldamo lexicon. Default scope: Sindarin family (s, n, ns). Add --any-lang to include Quenya / Gnomish.
| Subcommand | Use for |
|---|---|
lookup <lemma> | Exact dictionary lookup. Returns the headword entry. |
search <gloss> | Find Sindarin words whose English gloss contains a substring. |
check <form> | Workhorse. Reports attestation status + warnings for any form. Use before accepting or proposing any word. |
cognates <lemma> | Show related forms across Sindarin / Noldorin / Quenya. False-friend detection. |
forms <pattern> | Search attested inflected / compound surface forms. |
Run python3 ${CLAUDE_SKILL_DIR}/scripts/lookup.py --help for full options.
Languages and how the tool labels them
| Code | Language | Use for |
|---|---|---|
s | Sindarin (post-LotR conception) | Primary target language. |
n | Noldorin (1930s precursor to Sindarin) | Fallback when Sindarin lacks a word; flag explicitly. |
ns | Neo-Sindarin | Modern reconstructions in Eldamo; flag with creator. |
q | Quenya (post-LotR conception) | False-friend check only. Do not mix into Sindarin text. |
nq | Neo-Quenya | Same caution as Quenya. |
g | Gnomish (1910s, ancestor of Sindarin) | Rare revival material; flag explicitly. |
en | Early Noldorin (1920s) | Rare revival material; flag explicitly. |
False friends and common mistakes
The most frequent error is reaching for a Quenya word that looks like the right meaning. Some recurring traps:
| Wrong | Correct Sindarin | Note |
|---|---|---|
lambë "language" | lam (no attested plural; Neo-Sindarin reconstruction: laim) | lambë is Quenya. |
la "not" | ú- (prefix, with mutation) or law / baw | la is Quenya. |
panta "open" | pant | panta is Quenya. |
lintië "speed" | lint "swift" (adj.; no direct attested noun) | lintië is Quenya. |
enquet- "repeat" | No attested Sindarin verb; use ad- prefix on a verb of doing/saying | enquet- is Quenya AND deprecated in Eldamo. |
When in doubt, check the candidate.
Mutations (essential reference)
Sindarin requires consonant mutations at certain word boundaries. Get these wrong and the text looks foreign even when the vocabulary is right.
Soft mutation (lenition)
Triggered by: prepositions ab, adel, am, be, di, na, nu, trî, u-; adjectives after their noun; direct objects of verbs; compound second elements.
| Basic | Mutated |
|---|---|
| b → v | c → g |
| g → (silent) | gw → w |
| hw → chw | m → v |
| s → h | t → d |
Nasal mutation
Triggered by: plural article in; preposition / prefix an "for, to"; preposition dan "against".
| Basic | Mutated |
|---|---|
| b → m | d → n |
| p → ph | t → th |
Hard mutation
Triggered by: prepositions ed "out of", ned "in", o / od "from".
| Basic | Mutated |
|---|---|
| p → ph | t → th |
| b → p | d → t |
For the full table including speculative mixed / liquid mutations, see ${CLAUDE_SKILL_DIR}/references/mutations.md.
Grammar quick reference
- Imperative: ending
-ofor all persons.dar-"halt" →daro!. - Gerund / infinitive:
-edor-ad.teitha-"write" →teithad"writing / to write". - Past participle:
-en(sg) /-in(pl).teitha-→teithen/teithin. - Causative: Quenya
-ta-extended into Neo-Sindarin (nor-"run" →northa-"make run"). Defensible but flag as reconstructed. - Article:
i(sg, lenites) /in(pl, nasal-mutates). - Adjective: follows its noun, undergoes lenition.
aran"king" +pant"open" →aran bant. - "in":
mi(no mutation) or lenitedvi. Notbir(unattested).
For verb paradigms, pluralization rules, pronouns, and prepositions, see ${CLAUDE_SKILL_DIR}/references/grammar.md.
Translation source-file schema
Many translation projects benefit from a structured YAML that records per-word provenance. The recommended v1 schema lives at ${CLAUDE_SKILL_DIR}/references/translation-schema.md. Read it when:
- The project's translation file already uses
elements[]or similar. - You're proposing to introduce structure to an unstructured file.
- The user asks "how should we document this choice?"
Key enums to know:
- Attestation:
attested/noldorin/gnomish/neo-sindarin/quenya/coined/deprecated. - Status:
attested/attested-components/defensible-neo-sindarin/coinage/needs-revision/placeholder.
When filling out elements[], the source citation should be whatever lookup.py check reports (e.g. Ety/NOR, PE17/174, LotR/0339).
Script encoding (Tengwar)
The sjn.tengwar field uses CSUR (ConScript Unicode Registry) Tengwar at U+E000–U+E07F, the encoding supported by the Tengwar Telcontar font and the Tecendil transliterator. Do not hand-edit these characters; they render as boxes without