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
refactor: consolidate localization into shared .resx + duplication quick-wins (#26)
* style: harden editorconfig style rules from suggestion to warning
Promote dotnet/csharp style + naming rules from :suggestion to :warning so
redundant style smells fail the build instead of accumulating silently.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix: resolve build errors surfaced by editorconfig hardening
Promoting style rules to :warning under TreatWarningsAsErrors surfaced 5
latent violations. Two clean fixes (IDE0130 test namespace, IDE0028 collection
expressions); IDE0060 folded into the existing MapIcons RCS1163 suppression.
IDE0045 (AlarmEmbedRenderer) and IDE0290 (PairingSupervisor.Handle) are
suppressed at the line with documented justification: their "fixes" conflict
with RCS1238/S3358 (nested ternary) and CA2000 (CTS on a primary ctor).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(localization): add shared Strings.resx (en/fr) generated from catalogs
193 keys, globally unique across all 6 feature catalogs, generated by reflection
from the compiled *LocalizationCatalog.Default values so emoji/accents/{0} are
byte-exact. NeutralResourcesLanguage("en") makes the neutral set the English
fallback; verified ResourceManager round-trip resolves en/fr, falls back de->en,
and walks fr-FR->fr.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(localization): add ResxLocalizer + AddRustPlusBotLocalization DI extension
ResxLocalizer resolves per-call culture via ResourceManager.GetString over the
shared Strings resource set, preserving the ILocalizer contract: en fallback,
fr-FR->fr normalization, key returned when missing, per-culture format provider.
AddRustPlusBotLocalization registers it idempotently (TryAddSingleton).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* test(localization): add en/fr resource parity + key-count guard
Enumerates the neutral (en, invariant-keyed) and fr resource sets directly so a
dropped or renamed key fails the build. Asserts 193 keys with matching sets.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* refactor(commands): use shared ILocalizer/ResxLocalizer, drop command catalog
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor(workspace): use shared ILocalizer/ResxLocalizer, drop workspace catalog
* refactor(players): use shared ILocalizer/ResxLocalizer, drop player catalog
* refactor(events): use shared ILocalizer/ResxLocalizer, drop event catalog
* refactor(switches): use shared ILocalizer/ResxLocalizer, drop switch catalog
* refactor(alarms): use shared ILocalizer/ResxLocalizer, drop alarm catalog
* refactor(localization): remove obsolete DictionaryLocalizer
All 6 features now resolve the shared ILocalizer via ResxLocalizer, so the
dictionary-backed implementation and its tests are dead code. Behavioral
equivalence with the old per-feature catalogs spot-checked across feature
prefixes in both cultures (emoji, accents, placeholders byte-identical).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* refactor(commands): share marker-event reply helper across cargo/heli/chinook
The cargo/heli/chinook handlers differed only in MarkerKind and key prefix.
Extract MarkerReply.For(state, context, kind, prefix, localizer, clock),
mirroring the existing RigReply helper; each handler now delegates in one call.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
0 commit comments