Repository navigation
feat!: route every lookup through a replaceable message formatter - #31
Merged
rent-a-developer merged 1 commit intoOct 13, 2026
Merged
Conversation
Every lookup, with or without arguments, now passes its resolved value through ILocalizer.MessageFormatter (default: StringFormatMessageFormatter). A failed lookup raises ILocalizer.LookupFailed and returns the failure text from ILocalizer.LookupFailureTextBuilder. RefreshTriggeringRevision changes on every change that can change a lookup's result. Refs #30 BREAKING CHANGE: a formatting failure no longer throws FormatException. Get returns the failure text (by default !key!) and raises ILocalizer.LookupFailed, and XAML renders the failure text. Get(key, args) with an empty array returns the resource value unformatted. ILocalizer has new members (MessageFormatter, LookupFailed, RefreshTriggeringRevision, a hidden Get overload) that custom implementations must add. TranslationNotFound and TranslationNotFoundEventArgs are replaced by LookupFailed and LookupFailedEventArgs, which also report formatting failures. MissingTranslationFormat is replaced by LookupFailureTextBuilder, a Func<LookupFailure, string> that also serves formatting failures. See docs/guides/migration-2.0.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #29
Refs #30
Every lookup, with or without arguments, now passes its resolved value through ILocalizer.MessageFormatter (default: StringFormatMessageFormatter). A failed lookup raises ILocalizer.LookupFailed and returns the failure text from ILocalizer.LookupFailureTextBuilder. RefreshTriggeringRevision changes on every change that can change a lookup's result.
BREAKING CHANGE: a formatting failure no longer throws FormatException. Get returns the failure text (by default !key!) and raises ILocalizer.LookupFailed, and XAML renders the failure text. Get(key, args) with an empty array returns the resource value unformatted. ILocalizer has new members (MessageFormatter, LookupFailed, RefreshTriggeringRevision, a hidden Get overload) that custom implementations must add. TranslationNotFound and TranslationNotFoundEventArgs are replaced by LookupFailed and LookupFailedEventArgs, which also report formatting failures. MissingTranslationFormat is replaced by LookupFailureTextBuilder, a Func<LookupFailure, string> that also serves formatting failures. See docs/guides/migration-2.0.md.
Checklist
Everything under Always applies to every pull request. The rest applies only when its trigger does —
tick it, or leave it and say why in the description. A box that does not apply is not a box to tick.
Always
pwsh -File scripts/pre-commit-gate.ps1passes. It runs the public-API reminder, checks line endings,style, formatting and member ordering, builds Release and runs the test suites. Use
-Fixto have itapply the tidying rather than only report it.
TreatWarningsAsErrorsis on, so this also covers style,member ordering, trim and public-API diagnostics.
<type>/issue-<number>-<slug>, or<type>/<slug>when there is no issue — seeCONTRIBUTING.md.
If the change adds behaviour or fixes a bug
CHANGELOG.mdhas an entry under## [Unreleased]. Do not bump a version — the version, therelease date and the tag are the maintainer's, at release time.
If the change touches one UI package
CONTRIBUTING.md. The Avalonia and WPF markup
extensions and converters are deliberate mirrors of each other.
If the change touches resource lookup, the generated keys, or the packaging that carries them
Culture fallback, satellite discovery, the source generator's output, the
buildTransitivewiring, or adependency version. Nothing is trimmed on the just-in-time compiler, so no other check in this repository
can see the damage a mistake here does to a trimmed application.
pwsh -File scripts/verify-package-aot.ps1 -Packpasses for both frameworks(
-Framework net8.0and thenet10.0default).IL2xxx/IL3xxxdiagnostics, and none suppressed.If the change touches the public API
PublicAPI.Unshipped.txtis updated withpwsh -File scripts/update-public-api.ps1, andthe diff was reviewed line by line. A
*REMOVED*entry is a breaking change.docs/are updated.