a11y: Critical VoiceOver labels for icon/color-only UI#2124
Conversation
Wrap hardcoded English accessibility labels/hints/values in String(localized:) so Xcode extracts them and the app's 18 locales can translate them. Previously these bound to the non-localizing StringProtocol overload. Adds the 15 missing source keys to the String Catalog with translator comments. Chart-mark labels/values are intentionally excluded (handled in a later Charts a11y PR). Existing NSLocalizedString a11y strings are left as-is.
Expose meaning that was previously conveyed only visually: - Message status badges (PKI-encrypted lock, XEdDSA-signed shield, store-forward envelope) plus detection-sensor and translate overlays now have labels. - LoRaSignalStrengthIndicator gains label + value, mirroring the BLE indicator. - Position-precision sliders (MQTT, ChannelForm) announce their value and hide the decorative plus/minus marker images from VoiceOver. - Purge-stale-nodes days slider announces a plural-aware day count. - Destructive crypto buttons (delete key backup, regenerate private key) get labels instead of reading as raw SF Symbol names. Refactors the message badge tuple into an Identifiable CornerBadge struct (resolves a large_tuple lint) with a stable id. Adds 10 source keys.
|
Warning Review limit reached
Next review available in: 59 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (25)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
garthvh
left a comment
There was a problem hiding this comment.
Approved after detailed manual review (CodeRabbit was rate-limited and did not run). Additive VoiceOver labels + String(localized:) conversions; no behavior/layout/binding changes; CI green. Part of the a11y series (pr1).
What changed?
Adds VoiceOver labels to the highest-impact icon-only / color-only UI so it's no longer invisible to VoiceOver.
Identifiablecorner badges (encrypted / verified / store-and-forward).Localizable.xcstringskeys.Why did it change?
Critical, security-relevant UI — message encryption/verification badges, LoRa signal strength, and crypto-key buttons — conveyed meaning through color or an unlabeled icon only, so VoiceOver users couldn't perceive it. These are the most important labels in the initiative.
How is this tested?
Built the
Meshtasticscheme for iOS Simulator (iPhone 17 Pro, Xcode 26) →** BUILD SUCCEEDED **. SwiftLint clean (the message badges were refactored into anIdentifiableCornerBadgestruct with a stableidto satisfylarge_tupleand avoid render churn). Passed a focused Swift/SwiftUI review (both nits — stable badgeid, plural-aware%lld days— addressed). A live VoiceOver pass is recommended before merge.Screenshots/Videos (when applicable)
N/A — no visual change; adds spoken VoiceOver labels/values only.
Checklist
docs/user/ordocs/developer/. No doc update is needed (VoiceOver labels only, no UI/flow change) — please apply theskip-docs-checklabel.