You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+6Lines changed: 6 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -12,10 +12,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
12
12
13
13
* The MessageFormat working group's `:test:function`, `:test:format` and `:test:select` registry functions are implemented, so the WG conformance suite's selection-mechanics and fallback cases now run.
14
14
15
+
* The MF2 numeric functions accept the `signDisplay` option (`auto`, `always`, `exceptZero`, `negative`, `never`), with the plus sign taken from the locale's number symbols.
16
+
17
+
* An MF2 pattern expression that re-annotates a declared variable operates on the declaration's original value, and numeric functions inherit unset options from a numeric declaration — `.local $x = {41 :integer signDisplay=always}` rendered with `{$x :offset add=1}` produces "+42".
18
+
15
19
* The locale download base URL can be overridden with `config :localize, locale_base_url: "..."` for deployments mirroring the locale files; downloads are verified against the bundled hash manifest regardless of source.
16
20
17
21
### Changed
18
22
23
+
* An unannotated MF2 placeholder with a numeric operand formats with the locale-aware `:number` default (`{$pi}` renders "3.142" in en and "3,142" in fr), matching the MF2 implicit formatting rules; previously the value was stringified verbatim.
24
+
19
25
* MessageFormat 2 follows the specification's error semantics: unknown functions are an error (`Localize.FormatError` reason `:unknown_function`) instead of formatting the operand, and data-model validation rejects duplicate declarations, duplicate option names, and duplicate variants (NFC-normalized keys) with dedicated error reasons.
20
26
21
27
* MessageFormat 2 function validation is strict per TR35: the `select` option must be a literal set directly on the selector expression, digit-size options must be non-negative integers, string operands of numeric functions must match the `number-literal` production, and `:currency`, `:unit`, `:date`, `:time` and `:datetime` are rejected as selectors.
Copy file name to clipboardExpand all lines: guides/conformance.md
+1-7Lines changed: 1 addition & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -460,7 +460,7 @@ Two areas are explicitly out of scope:
460
460
| Feature | Status | Notes |
461
461
|---------|--------|-------|
462
462
|`:string`| Implemented ||
463
-
|`:number`| Implemented | Delegates to `Localize.Number.to_string/2`. |
463
+
|`:number`| Implemented | Delegates to `Localize.Number.to_string/2`. All numeric functions support `signDisplay`, and an unannotated numeric operand formats with the locale-aware `:number` default. |
464
464
|`:integer`| Implemented ||
465
465
|`:percent`| Implemented ||
466
466
|`:currency`| Implemented ||
@@ -496,16 +496,10 @@ Two areas are explicitly out of scope:
496
496
497
497
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:
498
498
499
-
* Declarations bind the formatted string, so re-annotating an already-annotated variable in a later declaration fails (one case each in the currency, date, time and percent suites).
500
-
501
499
* The `u:dir` / `u:id` expression *options* are not implemented (the `@u:dir` attribute form is).
502
500
503
501
* The `:isolate` bidi strategy isolates every placeholder where the WG default strategy leaves known-LTR placeholders unisolated (three cases).
504
502
505
-
* The `:offset` function's `signDisplay` option is not implemented (two cases).
506
-
507
-
* Unannotated number operands are not implicitly formatted with the locale-aware `:number` function (one case).
Copy file name to clipboardExpand all lines: plans/RELEASE_1.0_READINESS_2026-07-15.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -87,7 +87,7 @@ The July 4 plan is almost entirely executed. Milestones 1–3 are done and verif
87
87
Updated July 15 (second pass): items 1, 2, 4, 5, 6, 7, 8, and 10–13 are all done as annotated above. Remaining:
88
88
89
89
1. Item 3 — delegate removal timing: decide whether 1.0 removes all deprecated delegates (the known_/available_ set, Duration `:style`, and the new Currency positional forms) in one sweep or carries them to a later release. All messages promise removal by 1.0 and no later than December 2026.
90
-
2. The MF2 additive bucket (post-1.0 candidates or pre-1.0 polish): re-annotation of annotated variables (declarations bind formatted strings — an interpreter design change), `u:dir`/`u:id` expression options, WG-default bidi strategy, `:offset``signDisplay`, implicit locale-aware number formatting of unannotated operands.
90
+
2. The MF2 additive bucket — mostly CLOSED July 15 (third pass): `signDisplay` on all numeric functions, implicit locale-aware `:number` formatting of unannotated numeric operands, and re-annotation of declared variables (pattern expressions operate on the declaration's original value with numeric option inheritance). Remaining: `u:dir`/`u:id` expression options and the WG-default bidi strategy (five excluded suite cases in total).
0 commit comments