Localize version 0.44.0
[0.44.0] — July 4th, 2026
This release closes the TR35 conformance gaps in the date/time formatting layer and fixes locale-fidelity bugs surfaced by newly-wired conformance data.
Added
-
Flexible day periods: the
Bformat symbol selects CLDR day periods ("in the morning", "mittags", "noon", "midnight") from the day-period rules now in the supplemental data pipeline, andbrenders noon/midnight at the exact points. Languages without rules fall back to AM/PM. -
Localize.LanguageTag.U.parse/1andparse!/1parse a standalone BCP 47-u-extension string (with or without theu-singleton) into a validatedLocalize.LanguageTag.Ustruct, using the same canonicalization asLocalize.validate_locale/1.Localize.LanguageTag.U.encode/1is now a documented public function. -
Downloaded locale files are verified against a SHA-256 hash manifest bundled with the package (
priv/localize/locale_hashes.etf, generated bymix localize.generate_locale_hashesat release time), before any decode or cache write. A mismatch or missing entry fails the download withLocalize.LocaleIntegrityError; when no manifest is present a one-time warning is logged and verification is skipped. -
The rbnf conformance suite now runs the vendored ICU reference data for
de,esandfrin addition toen, and the likely-subtags suite asserts the CLDR FAIL rows.
Fixed
-
Localize.Validity.U.encode/2emits the preferred BCP 47 spelling instead of a deprecated alias (:islamic_civilencodes as "islamic-civil", not "islamicc"), anddecode/2accepts struct-field atom keys and the canonical hyphenated calendar spellings ("islamic-civil"). -
Week fields honour the locale's week configuration:
wandYcompute week-of-year from the locale's first day and minimum days (2023-01-01 is week 1 in en, week 52 of 2022 in de), andWcomputes week-of-month accordingly. Previously all three were ISO-only. -
Multi-replacement territory aliases follow TR35 Annex C:
hy-SUcanonicalizes tohy-AMvia the likely territory,uk-SUtouk-UA,sr-YUtosr-RS; previously the first entry (RU) was always taken. -
RBNF decimal-format substitutions (
=#,##0=) format with the rule's locale instead of the process locale, so fr digits-ordinal renders "1 141e" and de "1.141." rather than the English "1,141". -
Likely-subtags no longer fabricates mappings for languages without one: private-use languages (
qaa) pass through unmaximized per the CLDR test data instead of inheriting theundmapping. -
Locales whose language has no CLDR match resolve to root (
und) data instead of the alphabetically nearest wrong language —tlhno longer formats with Afar data. -
Compact formats no longer raise on a negative
:fractional_digitsoption.
Changed
mix test --covernow excludes build-time tooling (the data-generation pipeline, mix tasks, compile-time parser generators) from coverage measurement so the number reflects the runtime library.