All 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.
[0.6.0] — April 13th, 2026
Added
- Public function wrappers in
Localize.Unit.Mathfor all dimensionless functions:sin/1,cos/1,tan/1,asin/1,acos/1,atan/1,sinh/1,cosh/1,tanh/1,asinh/1,acosh/1,atanh/1,exp/1,ln/1,log/1,log2/1. Previously these were only accessible viaapply_dimensionless/2.
Bug Fixes
apply_dimensionless/2now validates that the unit is actually dimensionless before computing. Previouslysin(1 meter)would silently return a result; it now returns{:error, "sin requires a dimensionless value, got unit with base: meter"}. Units must reduce torevolution(angles) orpart(ratios) to be accepted.
[0.5.0] — April 13th, 2026
Added
:specialconversion support inCustomRegistry. Custom units can now be registered withfactor: :specialplus:forwardand:inverse{module, function}tuples for nonlinear conversions. This enables logarithmic scales (decibels), temperature functions, density hydrometers, wire gauges, and other conversions that cannot be expressed asvalue * factor + offset.Conversion.do_convert/3now uses a generalisedspecial_unit/1lookup that checks bothCustomRegistryand a compiled@built_in_specialmap, replacing the previous hardcoded:beaufortpattern match.
[0.4.0] — April 13th, 2026
Bug Fixes
Localize.all_locale_ids/1(:modern,:moderate,:basic) now returns the correct expanded list of locales. Thanks to @cw789 for the report.
[0.3.0] — April 13th, 2026
Bug Fixes
- Load custom units in a single batch to avoid churning
:persistent_store
[0.2.0] — April 13th, 2026
Bug Fixes
- SI prefix parsing for custom units. Custom units can now be prefixed with SI prefixes and power prefixes.
Enhancements
- Custom unit category validation relaxed from a fixed allowlist to any non-empty string. The faciliates importing a broader range of unit definitions such as those from Gnu units.
[0.1.0] — April 13th, 2026
Initial release.
Highlights
Full CLDR v48.2 locale data with lazy runtime loading from ETF files cached in
:persistent_term. No compile-time backend configuration required.Number formatting — integers, decimals, percentages, currencies, ranges, and rule-based number formats (RBNF) including Roman numerals and CJK ideographs.
Date, time, and datetime formatting using CLDR calendar patterns with
:short,:medium,:long, and:fullstyles, custom skeleton patterns, and interval formatting.Unit formatting with plural-aware patterns, SI/binary prefixes, compound units, measurement system conversion, custom unit registration, and
Localize.Unit.Operatorsfor natural arithmetic (km + m).List formatting with locale-appropriate conjunctions, disjunctions, and unit list styles. Per-element formatting via
Localize.Chars.ICU MessageFormat 2 (MF2) parser and interpreter with custom function registry, offset selection, JSON interchange, and bidirectional text support.
Gettext integration —
Localize.Gettext.Interpolationprovides MF2-based interpolation for Gettext backends.Localize.Charsprotocol — polymorphic locale-aware formatting with built-in implementations for 14 types andAnyfallback toKernel.to_string/1.Currency metadata, ISO 4217 validation, custom currency registration (private-use and extended codes), and territory-to-currency mapping.
Display names for territories, languages, scripts, calendars, and full locale display names per the CLDR algorithm.
Unicode Collation Algorithm (UCA) with CLDR locale-specific tailoring for 97 languages, including digraph expansion and script reordering.
BCP 47 / RFC 5646 language tag parser with full Unicode extension support (
-u-,-t-), locale distance matching, and parent chain resolution.On-disk locale cache with HTTPS download provider, version-based staleness detection, and
mix localize.download_localesfor build-time cache population.Optional NIF backend for faster Unicode normalisation and collation sort-key generation.
Calendar data for all CLDR calendar systems including Buddhist, Hebrew, Islamic (5 variants), ROC, Indian, Persian, Coptic, Ethiopic, Chinese, Japanese, and Dangi.
All public API functions return a standardized
{:error, exception}(except bang variants). The exception is a standard Elixir exception struct populated with semantic information about the error. The error message can be returned byException.message(exception). The exception messages are all Gettext messages using the MF2 format and can be localized.
See the README for full documentation, configuration options, and usage examples.