maui-accessibility
Guide for making .NET MAUI apps accessible — screen reader support via SemanticProperties, heading levels, AutomationProperties…
Guidance for localizing .NET MAUI apps: multi-language support via .resx resource files, culture resolution and runtime switching, RTL layout, platform language declarations (iOS/Mac Catalyst Info.plist, Windows Package.appxmanifest), and image localization strategies. USE FOR:
$ npx -y skills add davidortinau/maui-skills --skill maui-localization --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/maui-localizationContext preview
The summary Claude sees to decide when to auto-load this skill.
Guidance for localizing .NET MAUI apps: multi-language support via .resx resource files, culture resolution and runtime switching, RTL layout, platform language declarations (iOS/Mac Catalyst Info.plist, Windows Package.appxmanifest), and image localization strategies. USE FOR:
name: maui-localization description: >- Guidance for localizing .NET MAUI apps: multi-language support via .resx resource files, culture resolution and runtime switching, RTL layout, platform language declarations (iOS/Mac Catalyst Info.plist, Windows Package.appxmanifest), and image localization strategies. USE FOR: "localization", "multi-language", "resx resource", "translate app", "RTL layout", "culture switching", "localize strings", "right-to-left", "language support MAUI", "Info.plist languages". DO NOT USE FOR: theming or visual styles (use maui-theming), accessibility labels (use maui-accessibility), or content from REST APIs (use maui-rest-api).
| Issue | Fix | |---|---| | `ResourceManager` returns `null` for default culture | Set `<NeutralLanguage>en-US</NeutralLanguage>` in `.csproj` | | iOS ignores culture overrides | `CFBundleLocalizations` missing from `Info.plist` | | Windows doesn't show correct language | `<Resource Language="..." />` missing from `Package.appxmanifest` | | `x:Static` bindings don't update on language switch | `x:Static` is one-time — use binding approach with `INotifyPropertyChanged` | | `.Designer.cs` not regenerating in VS Code | Add `<CoreCompileDependsOn>PrepareResources;$(CoreCompileDependsOn)</CoreCompileDependsOn>` and run `dotnet build` |
<!-- ✅ Always set in .csproj --> <PropertyGroup> <NeutralLanguage>en-US</NeutralLanguage> </PropertyGroup> <!-- ❌ Missing this causes ResourceManager to return null at runtime -->
⚠️ Without this, iOS won't offer your app's languages in system Settings:
<!-- Platforms/iOS/Info.plist AND Platforms/MacCatalyst/Info.plist --> <key>CFBundleLocalizations</key> <array> <string>en</string> <string>es</string> <string>fr</string> </array>
<!-- Platforms/Windows/Package.appxmanifest --> <Resources> <Resource Language="en-US" /> <Resource Language="es" /> <Resource Language="fr-FR" /> </Resources>
Android picks up `.resx`-based localization automatically. No additional manifest entries required. ✅
<!-- ❌ Won't update when language changes at runtime -->
<Label Text="{x:Static resx:AppResources.WelcomeMessage}" />
<!-- ✅ Updates dynamically via INotifyPropertyChanged -->
<Label Text="{Binding [WelcomeMessage], Source={x:Static local:LocalizationResourceManager.Instance}}" />When switching culture, set **all three** properties or formatting is inconsistent:
// ✅ Complete culture switch
var culture = new CultureInfo("es");
CultureInfo.CurrentUICulture = culture; // resource lookup
CultureInfo.CurrentCulture = culture; // dates/numbers
AppResources.Culture = culture; // ResourceManager
// ❌ Only sets UI culture — dates/numbers stay in old culture
CultureInfo.CurrentUICulture = new CultureInfo("es");<!-- ✅ Page-level — children inherit --> <ContentPage FlowDirection="RightToLeft"> <StackLayout FlowDirection="MatchParent" /> </ContentPage> <!-- ❌ Only on child — parent still LTR, layout breaks --> <ContentPage> <StackLayout FlowDirection="RightToLeft" /> </ContentPage>
⚠️ `.Designer.cs` may not regenerate on save. Add to `.csproj` and run `dotnet build` after `.resx` changes:
<CoreCompileDependsOn>PrepareResources;$(CoreCompileDependsOn)</CoreCompileDependsOn>
| Need | Approach | |---|---| | Static multilingual strings | `.resx` files with `x:Static` bindings | | Runtime language switching | `LocalizationResourceManager` with `INotifyPropertyChanged` bindings | | Culture-specific images | Name images `banner_{culture}.png` or store paths in `.resx` | | RTL support | Set `FlowDirection` at page level, detect with `TextInfo.IsRightToLeft` | | Date/number formatting | Set `CultureInfo.CurrentCulture` alongside `CurrentUICulture` |
A collection of 41 skills for .NET MAUI development, UI/UX design reasoning, and Xamarin migration, designed for use with GitHub Copilot CLI and Claude Code.
Guide for making .NET MAUI apps accessible — screen reader support via SemanticProperties, heading levels, AutomationProperties…
.NET MAUI view animations, custom animations, easing functions, rotation, scale, translation, and fade effects. USE FOR: "animate…
.NET MAUI app icon configuration, splash screen setup, SVG to PNG conversion at build time, composed/adaptive icons, and…
.NET MAUI app lifecycle guidance covering the four app states (not running, running, deactivated, stopped), cross-platform Window…
Guide for .NET MAUI apps consuming .NET Aspire-hosted backend services. Covers AppHost configuration, service discovery for…
Add authentication to .NET MAUI apps. Covers WebAuthenticator for generic OAuth 2.0 / social login, and MSAL.NET for Microsoft…