This document maps the features defined in Unicode Technical Standard #35 (LDML) version 48 against the implementation status of the Localize library.
Two areas are explicitly out of scope:
Part 7 — Keyboards. Not relevant to a formatting library.
Part 8 — Person Names. Implemented as the separate localize_person_names package, which uses Localize's person-name locale data (stored under the :person_names key in each locale ETF) and implements the full TR35 Part 8 formatting algorithm.
Legend
Implemented — feature is present and tested.
Partial — core functionality exists but some sub-features are missing.
Calendar (ca), collation (co), currency (cu), number system (nu), hour cycle (hc), first day (fw), region override (rg), measurement system (ms), and others.
Localize.LanguageTag.add_likely_subtags/1 and remove_likely_subtags/2, including both the favor-script (default) and favor-region removal variants, verified against the CLDR likely-subtags test data.
Localize.Unit struct supports mixed units; formatting coverage not fully verified.
Duration unit patterns (hms)
Implemented
Localize.Duration.to_time_string/2 formats durations as "hh:mm:ss" with unbounded hours. to_string/2 formats as localized unit list (e.g., "11 months and 30 days").
All date format pattern symbols (y, M, d, E, G, etc.)
Implemented
Full symbol set in Localize.DateTime.Formatter.
Hour cycle (h, H, k, K)
Implemented
Including territory-based preferences.
Day periods (a, b, B)
Implemented
a renders AM/PM; b renders noon/midnight at the exact points and AM/PM otherwise; B selects flexible day periods ("in the morning", "mittags") from the CLDR day-period rules, falling back to AM/PM for languages without rules.
Available formats (skeletons)
Implemented
Localize.DateTime.Format.Match for skeleton matching.
Number-aware sorting via the :numeric option to Localize.Collation.sort/3 and compare/3, or the -u-kn locale extension.
Reorder (kr)
Implemented
Script reordering with weight remapping.
Max variable (kv)
Implemented
space, punct, symbol, currency.
Hiragana quaternary (kh)
Not implemented
Deprecated in recent UCA.
Collation Tailoring
Feature
Status
Notes
Locale-specific tailoring rules
Implemented
110 locale/type pairs covering 97 languages, extracted from CLDR XML.
Relation operators (<, <<, <<<, <<<<, =)
Implemented
Contractions (multi-character)
Implemented
Expansions (slash notation)
Implemented
e.g., ccs/cs in Hungarian.
Star syntax (<*)
Implemented
Used for CJK and other large character sets.
Context before (|)
Not implemented
[before N] positioning
Not implemented
[suppressContractions]
Implemented
Used by cu, sr, mk.
[optimize]
Not applicable
Advisory hint; intentionally ignored.
[import]
Implemented
Resolved at extraction time — imported rules are inlined into the ETF. Supports BCP47 tags (e.g., und-u-co-search, de-u-co-phonebk) and short locale tags (e.g., hr).
[strength] directive
Not implemented
Used by ja:private-kana only.
Collation Types
Feature
Status
Notes
Standard collation
Implemented
Default type for all locales.
Search collation
Implemented
Root search rules (Arabic form equivalences, Korean jamo decomposition, [suppressContractions]) extracted from CLDR XML. 20 locale-specific search types with resolved imports. Accessed via type: :search option.
Phonebook (de), Pinyin (zh), etc.
Partial
Some non-standard types extracted; not all verified.
Collation Features
Feature
Status
Notes
Alphabetic index characters
Not implemented
No UI bucketing support.
Collation type fallback chain
Partial
Falls back to standard; full 7-step chain not verified.
Delegates to Localize.Number.to_string/2. All numeric functions support signDisplay, and an unannotated numeric operand formats with the locale-aware :number default.
Adjusts a numeric operand with the required add or subtract option (a non-negative integer) for both formatting and selection, per the MF2 :offset function. Used for patterns like "you and N other people".
Localize-specific MF2 functions (not in the spec)
Function
Notes
:list
Formats a list operand by delegating to Localize.List.to_string/2. Each element is itself formatted via Localize.Chars, so a list of dates, numbers, units, etc. picks up the message's locale and forwarded options. Supports a style (or type) option whose values map to CLDR list styles: "and", "and-short", "and-narrow", "or", "or-short", "or-narrow", "unit", "unit-short", "unit-narrow". Default is "and".
Unresolved variables error per spec; an unknown function is a Localize.FormatError with reason :unknown_function.
Data model errors
Implemented
Duplicate declarations (including implicit-use-then-declare and self-reference), duplicate option names, and duplicate variants (NFC-normalized keys) are validated before interpretation.
Function option and operand validation
Implemented
The select option must be a literal set directly on the expression; digit size options must be non-negative integers; string operands of the numeric functions must match the number-literal production; :currency, :unit and the date/time functions are rejected as selectors.
:bidi option (:none, :isolate, :auto) wraps placeholder output in Unicode isolate characters (FSI/PDI), and the @u:dir expression attribute overrides direction per expression. The u:dir / u:id expression options are not implemented, and the :isolate strategy isolates every placeholder where the WG default strategy leaves known-LTR placeholders unisolated.
MF2 known conformance gaps
The MessageFormat working group conformance suite — including the WG :test:function / :test:format / :test:select registry functions it uses to exercise selection mechanics — runs against both the parser and the formatter (test/localize/message/formatter_conformance_test.exs). The few cases the implementation cannot yet satisfy are excluded there, each with a documented reason:
The u:dir / u:id expression options are not implemented (the @u:dir attribute form is).
The :isolate bidi strategy isolates every placeholder where the WG default strategy leaves known-LTR placeholders unisolated (three cases).
Summary
Implemented (core functionality present and tested)
Language tag parsing and validation (BCP 47 / RFC 5646)
Locale management (get/put/default/with_locale)
Likely subtags and locale matching
Number formatting (decimal, percent, currency, accounting, compact, scientific, RBNF)
Number parsing
Date, time, and datetime formatting
Interval formatting
Relative date/time formatting
Unit formatting, conversion, and preferences (also include basic math functions)