localizing-wpf-with-baml
WPF BAML Localization
Localize WPF applications using x:Uid attributes and LocBaml tool for satellite assembly generation.
1. BAML Localization Overview
BAML Localization Workflow
├── 1. Add x:Uid to XAML elements
├── 2. Set UICulture in project
├── 3. Build to generate default resources
├── 4. Extract with LocBaml /parse
├── 5. Translate CSV files
└── 6. Generate satellite assemblies with LocBaml /generate
When to use BAML:
- Enterprise applications with professional translation workflow
- Need to localize without recompiling
- Complex UI with many localizable properties
2. Adding x:Uid Attributes
<Window x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Uid="MainWindow"
Title="My Application">
<Grid x:Uid="MainGrid">
<StackPanel x:Uid="ContentPanel">
<TextBlock x:Uid="TitleText" Text="Welcome to My Application"/>
<TextBlock x:Uid="DescriptionText" Text="Please select an option below."/>
<Button x:Uid="SaveButton" Content="Save"/>
<Button x:Uid="CancelButton" Content="Cancel"/>
<Button x:Uid="HelpButton" Content="Help" ToolTip="Click for help"/>
</StackPanel>
</Grid>
</Window>
x:Uid naming conventions:
- Use descriptive names:
SaveButton,TitleText - Unique within the XAML file
- Applied to elements with localizable properties
3. Project Configuration
3.1 Set UICulture
<!-- .csproj -->
<PropertyGroup>
<UICulture>en-US</UICulture>
</PropertyGroup>
3.2 Build Output Structure
bin/Release/
├── MyApp.exe
├── MyApp.resources.dll
└── ko-KR/
└── MyApp.resources.dll ← Korean satellite assembly
4. LocBaml Tool Usage
4.1 Extract Resources
# Parse and extract to CSV
LocBaml /parse MyApp.resources.dll /out:en-US.csv
CSV output format:
MyApp.g.en-US.resources:mainwindow.baml,MainWindow:Window.Title,Title,True,True,None,My Application
MyApp.g.en-US.resources:mainwindow.baml,TitleText:TextBlock.Text,Text,True,True,None,Welcome to My Application
MyApp.g.en-US.resources:mainwindow.baml,SaveButton:Button.Content,Content,True,True,None,Save
4.2 Translate CSV
Create ko-KR.csv with translations:
MyApp.g.en-US.resources:mainwindow.baml,MainWindow:Window.Title,Title,True,True,None,내 애플리케이션
MyApp.g.en-US.resources:mainwindow.baml,TitleText:TextBlock.Text,Text,True,True,None,내 애플리케이션에 오신 것을 환영합니다
MyApp.g.en-US.resources:mainwindow.baml,SaveButton:Button.Content,Content,True,True,None,저장
4.3 Generate Satellite Assembly
# Create Korean satellite assembly
LocBaml /generate MyApp.resources.dll /trans:ko-KR.csv /cul:ko-KR /out:.\ko-KR
# Create Japanese satellite assembly
LocBaml /generate MyApp.resources.dll /trans:ja-JP.csv /cul:ja-JP /out:.\ja-JP
5. Automation Script
# build-localization.ps1
param(
[string]$ProjectPath = ".",
[string[]]$Cultures = @("ko-KR", "ja-JP", "de-DE")
)
$OutputPath = "$ProjectPath\bin\Release"
$ResourceDll = "$OutputPath\MyApp.resources.dll"
# Extract base resources
LocBaml /parse $ResourceDll /out:"$OutputPath\en-US.csv"
# Generate satellite assemblies for each culture
foreach ($culture in $Cultures) {
$csvPath = "$ProjectPath\Localization\$culture.csv"
$outPath = "$OutputPath\$culture"
if (Test-Path $csvPath) {
New-Item -ItemType Directory -Force -Path $outPath | Out-Null
LocBaml /generate $ResourceDll /trans:$csvPath /cul:$culture /out:$outPath
Write-Host "Generated: $culture"
}
}
6. Runtime Culture Selection
// App.xaml.cs
protected override void OnStartup(StartupEventArgs e)
{
// Set culture before any UI is created
var culture = new CultureInfo("ko-KR");
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
base.OnStartup(e);
}
7. Localizable Properties
| Element | Localizable Properties |
|---|---|
| Window | Title |
| TextBlock | Text |
| Button | Content, ToolTip |
| Label | Content |
| MenuItem | Header |
| ToolTip | Content |
8. References
More from christian289/dotnet-with-claudecode
converting-html-css-to-wpf-xaml
Converts HTML/CSS to WPF CustomControl XAML with correct patterns and common pitfall solutions. Use when transforming web designs to WPF, converting CSS animations to Storyboards, implementing CSS border-radius clipping, CSS pseudo-elements (::before/::after), or CSS transforms in XAML.
56publishing-wpf-apps
Guides WPF application publishing and installer options. Use when user mentions publish, deploy, release, packaging, or installer to help choose deployment method and installer technology.
14using-avalonia-collectionview
Provides CollectionView alternatives for AvaloniaUI using DataGridCollectionView and ReactiveUI. Use when filtering, sorting, or grouping collections in AvaloniaUI applications.
9designing-avalonia-customcontrol-architecture
Defines the basic solution structure for AvaloniaUI Desktop Applications using CustomControl. Use when creating new AvaloniaUI projects or designing stand-alone control styles with ControlTheme.
9using-xaml-property-element-syntax
Converts long inline XAML bindings to Property Element Syntax for better readability. Use when XAML binding expressions become too long or complex.
8managing-styles-resourcedictionary
Manages WPF Style definitions and ResourceDictionary patterns including BasedOn inheritance and resource merging. Use when building theme systems, organizing resources, or choosing between StaticResource and DynamicResource.
8