mcpField
M
maui-localization

maui-localization

github.com/davidortinauDevelopment17653 installsUpdated 16w ago
Repository

About maui-localization

A guide for .NET MAUI developers localizing app interfaces and switching languages at runtime. It covers resource configuration, culture settings, RTL layouts, and platform-specific declarations.

Key features

  1. 01Configure NeutralLanguage and resource files
  2. 02Declare supported languages per platform
  3. 03Switch culture settings at runtime
  4. 04Update UI text with bindings
  5. 05Set up RTL page layouts

Use cases

  1. 01Add multilingual strings to a MAUI app
  2. 02Implement runtime language switching
  3. 03Troubleshoot platform language lists or resource generation
  4. 04Support RTL languages and localized formatting

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/davidortinau/maui-skills --skill maui-localization

After installing, type/maui-localizationin Claude Code to confirm it loaded.

Bundled filesreferences/localization-api.md

Details

From the project README

.NET MAUI Localization

Common gotchas

IssueFix
ResourceManager returns null for default cultureSet <NeutralLanguage>en-US</NeutralLanguage> in .csproj
iOS ignores culture overridesCFBundleLocalizations missing from Info.plist
Windows doesn't show correct language<Resource Language="..." /> missing from Package.appxmanifest
x:Static bindings don't update on language switchx:Static is one-time — use binding approach with INotifyPropertyChanged
.Designer.cs not regenerating in VS CodeAdd <CoreCompileDependsOn>PrepareResources;$(CoreCompileDependsOn)</CoreCompileDependsOn> and run dotnet build

⚠️ NeutralLanguage is mandatory

<!-- ✅ Always set in .csproj -->
<PropertyGroup>
  <NeutralLanguage>en-US</NeutralLanguage>
</PropertyGroup>

<!-- ❌ Missing this causes ResourceManager to return null at runtime -->

Platform declarations — don't forget these

iOS / Mac Catalyst

⚠️ 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>
Windows
<!-- Platforms/Windows/Package.appxmanifest -->
<Resources>
  <Resource Language="en-US" />
  <Resource Language="es" />
  <Resource Language="fr-FR" />
</Resources>
Android

Android picks up .resx-based localization automatically. No additional manifest entries required. ✅

Runtime language switching — x:Static trap

<!-- ❌ 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");

RTL layout — set FlowDirection at page level

<!-- ✅ Page-level — children inherit -->
<ContentPage FlowDirection="RightToLeft">
  <StackLayout FlowDirection="MatchParent" />
</ContentPage>

<!-- ❌ Only on child — parent still LTR, layout breaks -->
<ContentPage>
  <StackLayout FlowDirection="RightToLeft" />
</ContentPage>

VS Code pitfall

⚠️ .Designer.cs may not regenerate on save. Add to .csproj and run dotnet build after .resx changes:

<CoreCompileDependsOn>PrepareResources;$(CoreCompileDependsOn)</CoreCompileDependsOn>

Decision framework

NeedApproach
Static multilingual strings.resx files with x:Static bindings
Runtime language switchingLocalizationResourceManager with INotifyPropertyChanged bindings
Culture-specific imagesName images banner_{culture}.png or store paths in .resx
RTL supportSet FlowDirection at page level, detect with TextInfo.IsRightToLeft
Date/number formattingSet CultureInfo.CurrentCulture alongside CurrentUICulture

Quick checklist

  • NeutralLanguage set in .csproj
  • Default AppResources.resx contains all keys
  • Each target language has its own AppResources.{culture}.resx
  • iOS/Mac: CFBundleLocalizations lists all supported languages
  • Windows: Package.appxmanifest declares <Resource Language="..." />
  • RTL cultures set FlowDirection at page/app level
  • Runtime switching sets all three: CurrentUICulture, CurrentCulture, AppResources.Culture
  • dotnet build regenerates .Designer.cs after .resx changes

Comments

Markdown supported