Changelog
View SourceAll notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
0.3.0 - 2026-05-15
Added
- Proficiency level systems —
BeamlabLanguages.level_systems/0,levels/1,level_system_label/1, andlevel_info/2expose curated CEFR, JLPT, and HSK data. Levels are returned in pedagogical order (A1→C2, N5→N1, HSK1→HSK6). Data lives inpriv/data/levels.jsonand is embedded at compile time with zero runtime dependencies. - Development tooling — Added
credoanddialyxiras dev dependencies. Theprecommitalias now runscompile,format,credo,dialyzer, andtest.
0.2.0 - 2026-05-08
Added
- Pedagogical verb conjugation metadata — four new functions on
BeamlabLanguages:has_verb_conjugation?/1—trueiff a paradigm is curated for the language. Data-driven contract: stays in sync withconjugation_paradigm/1. Returnsfalsefor uncurated languages even when they technically inflect verbs (English, Swedish, etc.) until paradigms are added.verb_groups/1— pedagogical group system (e.g. French's-er/-ir/-re), ornilwhen no paradigm exists OR when the language has a paradigm but no meaningful group system.persons/1— person/pronoun list with stable keys ("1sg"…"3pl"for French; future languages may add dual or gender-split persons).conjugation_paradigm/1— modes-and-tenses tree. Order is teaching order, opinionated and stable across versions.
label_native+label_enconvention — every mode, tense, group, and person carries both labels: the term in the target language ("Indicatif") and the canonical English rendering ("Indicative"). Useful for learner UIs that show either side of a translation.- French paradigm in
priv/data/conjugation/fr.json: 3 verb groups, 6 persons, 4 modes (indicatif / subjonctif / conditionnel / impératif) covering 16 tenses total. - Per-language data files under
priv/data/conjugation/<code>.json. Each file is read at compile time as an@external_resource, so edits trigger recompile with no runtime I/O.
Notes
- v0.2 ships French only. More languages will land as consumers need them; the schema is intentionally not locked in for non-Romance / non-Indo-European paradigms (Russian aspect pairs, Arabic stems, Slovenian dual, etc.) — those may extend the shape.
0.1.0 - 2026-05-07
Initial release.
Added
BeamlabLanguages.Languagestruct with six fields:code,name,native_name,direction,has_gender,genders.- Public API on
BeamlabLanguages(10 functions, all with@specand doctests):get/1— fetch aLanguagestruct by code, ornillist/0— every known language, sorted by codelist_codes/0— every known 2-letter base code, sortedhas_gender?/1— predicate,falsefor unknown /nilgenders/1— gender list,[]for unknown / non-gendered languagesdirection/1—:ltror:rtl,:ltrfor unknownname/1— canonical English name, ornilnative_name/1— endonym, ornilnormalize/1— collapse BCP 47 / sloppy casing to a 2-letter baseknown?/1— sugar overget/1
- BCP 47 normalization runs internally on every code-taking function —
"en-US","FR"," fr "all just work. Underscore separator ("en_US") is also accepted, and"nb"/"nn"(Bokmål / Nynorsk, as emitted by POSIX locales and browsers) collapse to"no". - 54 curated languages in
priv/data/languages.json, covering the top-spoken languages plus all CEFR / JLPT / HSK targets. - Compile-time data loading — no runtime file I/O, no GenServer, no ETS, zero runtime dependencies.