maui-localization について
.NET MAUI アプリのローカライズや実行時の言語切り替えを行う開発者向けのガイドです。リソース設定、カルチャ設定、RTL レイアウト、プラットフォームごとの宣言を扱います。
主な機能
- 01NeutralLanguage とリソースファイルの設定
- 02各プラットフォームの対応言語宣言
- 03実行時のカルチャ設定切り替え
- 04バインディングによる UI テキスト更新
- 05RTL ページレイアウトの設定
活用シーン
- 01MAUI アプリへの多言語文字列の追加
- 02実行時の言語切り替え実装
- 03プラットフォームの言語一覧やリソース生成の調査
- 04RTL 言語とローカライズされた書式への対応
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ davidortinau/ maui-skills --skill maui-localizationインストール後、Claude Code で/maui-localizationを入力して読み込まれたか確認します。
同梱ファイルreferences/localization-api.md
詳細
.NET MAUI のローカライズ
よくある注意点
| 問題 | 解決方法 |
|---|---|
既定のカルチャで ResourceManager が null を返す | .csproj に <NeutralLanguage>en-US</NeutralLanguage> を設定します |
| iOS でカルチャのオーバーライドが無視される | Info.plist に CFBundleLocalizations がありません |
| Windows で正しい言語が表示されない | Package.appxmanifest に <Resource Language="..." /> がありません |
言語切り替え時に x:Static バインディングが更新されない | x:Static は一度だけ評価されます。INotifyPropertyChanged を使ったバインディング方式を使用します |
VS Code で .Designer.cs が再生成されない | <CoreCompileDependsOn>PrepareResources;$(CoreCompileDependsOn)</CoreCompileDependsOn> を追加し、dotnet build を実行します |
⚠️ NeutralLanguage は必須です
<PropertyGroup>
<NeutralLanguage>en-US</NeutralLanguage>
</PropertyGroup>
プラットフォームごとの宣言 — 忘れずに設定してください
iOS / Mac Catalyst
⚠️ これを設定しないと、iOS のシステム設定でアプリの言語を選択できません。
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>es</string>
<string>fr</string>
</array>
Windows
<Resources>
<Resource Language="en-US" />
<Resource Language="es" />
<Resource Language="fr-FR" />
</Resources>
Android
Android では .resx ベースのローカライズが自動的に適用されます。マニフェストに追加のエントリは不要です。✅
実行時の言語切り替え — x:Static の落とし穴
<Label Text="{x:Static resx:AppResources.WelcomeMessage}" />
<Label Text="{Binding [WelcomeMessage], Source={x:Static local:LocalizationResourceManager.Instance}}" />
カルチャを切り替える際、書式設定に一貫性を持たせるには、次の3つすべてのプロパティを設定します。
// ✅ 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 レイアウト — ページレベルで FlowDirection を設定する
<ContentPage FlowDirection="RightToLeft">
<StackLayout FlowDirection="MatchParent" />
</ContentPage>
<ContentPage>
<StackLayout FlowDirection="RightToLeft" />
</ContentPage>
VS Code での注意点
⚠️ 保存時に .Designer.cs が再生成されない場合があります。.csproj に追加し、.resx の変更後に dotnet build を実行してください。
<CoreCompileDependsOn>PrepareResources;$(CoreCompileDependsOn)</CoreCompileDependsOn>
選択の目安
| 要件 | 方法 |
|---|---|
| 静的な多言語文字列 | .resx ファイルと x:Static バインディング |
| 実行時の言語切り替え | INotifyPropertyChanged バインディングを使う LocalizationResourceManager |
| カルチャ固有の画像 | 画像に banner_{culture}.png という名前を付けるか、パスを .resx に保存します |
| RTL のサポート | ページレベルで FlowDirection を設定し、TextInfo.IsRightToLeft で判定します |
| 日付/数値の書式設定 | CurrentUICulture とともに CultureInfo.CurrentCulture を設定します |
クイックチェックリスト
-
.csprojにNeutralLanguageを設定する - 既定の
AppResources.resxにすべてのキーを含める - 各対象言語用の
AppResources.{culture}.resxを用意する - iOS/Mac:
CFBundleLocalizationsにサポートするすべての言語を記載する - Windows:
Package.appxmanifestで<Resource Language="..." />を宣言する - RTL カルチャではページ/アプリレベルで
FlowDirectionを設定する - 実行時の切り替えでは
CurrentUICulture、CurrentCulture、AppResources.Cultureの3つすべてを設定する -
.resxの変更後にdotnet buildで.Designer.csが再生成されることを確認する
コメント
Markdown 対応