Several months ago, I needed to localize a WPF application (it had to have English and German versions. I found an excellent localization package for WPF on the internet and used it for my project. The package was created by Tomer Shamam and was described at WPF Localization – On-the-fly Language Selection (though the link is no longer available). I published the code for the package (kindly sent to me by Tomer) on github at WPFLocalizationPackage.
It proved to be a great solution allowing to create a German version very fast.
The package is open source, allows switching the locales at run time and also allows localizing any Dependency or Attached properties – not only string
s. It provides “Translate” markup extension that can be used from within XAML.
In order to localize an application with the help of this package, you need to create XML catalogs for each of the locales you want your application to support. Here is an excerpt from such a catalog that comes with the demo that comes together with the source:
<Dictionary EnglishName="English"
CultureName="English" Culture="en-US">
<Value Id="0" FlowDirection="LeftToRight"
Title="Demo Window"
Width="700" Height="340" />
<Value Id="1" Content="This is a simple text" />
...
<Dictionary>
Each Value
tag has an Id
attribute used for matching values from the catalogs into XAML or C# code. The rest of the attributes specify WPF object properties and values that those properties should get under the locale.
Here is an example of referring to a catalog value from XAML code:
<Window ...
Title="{loc:Translate Title, Uid=0}"
...
>
Translate markup extension refers to attribute title under Value
tag with Id=0
.
Mapping between the different cultures and catalogs is done with the help of LanguageDictionary.RegisterDictionary
method, e.g.:
LanguageDictionary.RegisterDictionary(
CultureInfo.GetCultureInfo("en-US"),
new XmlLanguageDictionary("Languages/en-US.xml"));
LanguageDictionary.RegisterDictionary(
CultureInfo.GetCultureInfo("he-IL"),
new XmlLanguageDictionary("Languages/he-IL.xml"));
maps culture “en-US
” into en-US.xml catalog file under Languages folder while culture “he-IL
” is mapped into he-IL.xml file.
Here is the code to change localization catalog at run time:
if (LanguageContext.Instance.Culture == CultureInfo.GetCultureInfo("he-IL"))
{
LanguageContext.Instance.Culture = CultureInfo.GetCultureInfo("en-US");
}
else
{
LanguageContext.Instance.Culture = CultureInfo.GetCultureInfo("he-IL");
}
The demo contains an application that can switch between English and Hebrew locales. Here is how the English version looks:
And here is its Hebrew counterpart:
You can switch between English and Hebrew by pressing the button with the corresponding flag. As you can see, not only strings, but also sizes and (even more impressively) the FlowDirection
changes when the locale is switched.
Please find more information at WPF Localization – On-the-fly Language Selection and by browsing the demo code.