Download source
This document introduces a way of globalizing and localizing in Windows Presentation Foundation (WPF) and gives a sample project. The solution mentioned in this document is based on Windows SDK documents and some sample projects of the technical web site “CodeProject.com”.
The process of globalization and localization needs some software tools to assist. The following tools will be used:
< <MSBuild.exe (Microsoft build engine)
< <LocBaml.exe
< <Resgen.exe (Resource File Generator)
< <Al.exe (Assembly Linker)
<2. <Globalization
There are two kinds of string constant in code behind. One displayed for user needs to be localized, which is named “Localizable String” in this document, and the other only used for code doesn’t need to be localized, which is named “Non-localizable String”.
For the two types of string:
1. Use a Class NonLocalizableString.cs to save the Non-localizable String.
2. User Properties\Resources.resx to save the Localizable String.
<<!--[if mso & !supportInlineShapes & supportFields]> <![endif]-->
Globalization is the design and development of applications that perform in multiple locations.
The tool is used to globalize a project (refer to 4.2):
< <Microsoft build engine (Msbuild.exe), which is a compiler that runs from the command line.
<1.1 < A Sample of Globalization Application
In this part, a sample of globalization application is provided and a step-by-step approach is given.
Step1. Create an application in WPF
<!--[if gte vml 1]>
<
Use Properties\Resources.resx to save the Localizable String.
<!--[if gte vml 1]>
<
Create NonLocalizableString.cs to save the Unlocalizable String.
<!--[if gte vml 1]>
<
Step2. Create UI
<!--[if gte vml 1]>
<
Step3.Create responsibility function of “ShowMsg” button
<!--[if gte vml 1]> 
Step4.Generate Uid in XAML
Open Windows SDK command shell:
<!--[if gte vml 1]> 
And use the following commands to generate Uid and check it:
Msbuild /t:updateuid LocalizationTest.csproj // generate Uid
Msbuild /t:checkuid LocalizationTest.csproj // check Uid
The result in XAML likes this:
<Grid x:Uid="Grid_1">
Step5. Build
After built, a globalization project is OK to be localized.
The resource to be localized contains two parts.
<1. <The string to be displayed for user in XAML
<2. <The string to be displayed for user in Code behind.
3. Localization
Localization is the translation of application resources into localized versions for the specific cultures that the application supports.
This part gives you a step-by-step approach to localizing the application.
The tools are used to localize (refer to 4.2).
<1. <LocBaml.exe
<2. <Resgen.exe
<3. <Al.exe
The essential files to be used for localization:
Table 3-1 Essential files for localization
|
File name
|
Location
|
Comments
|
|
LocalizationTest.exe
|
bin\Release
|
Main assembly to be used to abstract resource to be localized in XAML.
|
|
LocalizationTest.g.resources
|
obj\Release
|
Generate binary resource file of XAML by using it.
|
|
LocalizationTest.Properties.Resources.resources
|
obj\Release
|
Rename the binary resource file by using the format of its file name.
|
|
Resources.resx
|
Properties\
|
Localizable string in code behind
|
Notes:
1. The release version is used to be localized.
2. To simplify specification, the full path isn’t used in command.
3.1 Localizing resource in code behind
Step1: Create a copy of Properties\Resources.resx and localize relative strings
The resource file:Resources.zh-cn.resx (The name is random)
Update the resource to be localized:
<!--[if gte vml 1]> 
<!--[if gte vml 1]> 
Step2: Use resgen.exe of SDK to generate binary resource file
Resgen Resources.zh-cn.resx
Step3: Rename the binary resource file generated by step2:
Resources.zh-cn.resources à LocalizationTest.resource.LocalizationTestResource.zh-cn.resources
3.2 Localizing resource in XAML
Step1: Use LocBaml to abstract resource to be localized in XAML from mainly assembly.
LocBaml /parse LocalizationTest.exe
And a CSV file containing resource to be localized is generated: LocalizationTest.CSV
Note: 1. Please copy LocBaml to the folder of mainly assembly.
2. The output file name of LocBaml is optional.
Step2: Edit CSV file to localize the resource。Refer to 4.4 to get CSV format.
Step3: Use LocBaml to generate binary resource file with LocalizationTest.g.resources and CSV file localized.
LocBaml /generate LocalizationTest.g.resources /tran: LocalizationTest.CSV /cul:zh-cn /out:.\zh-cn\
Step4:.Rename the binary resource file generated by step3:
LocalizationTest.g.resources à LocalizationTest.g.zh-cn.resources
3.3 Embed the two binary resources into a satellite
Use the tool “al.exe” of SDK and execute the following command.
Al /template:LocalizationTest.exe /embed:LocalizationTest.Properties.Resources.zh-cn.resources /embed:LocalizationTest.g.zh-cn.resources /culture:zh-cn /out:LocalizationTest.resources.dll
And create a “zh-cn” folder to save “LocalizationTest.resources.dll”.
After all steps are finished, a localization version in zh-cn is made successfully. Run the app and check it.
<!--[if gte vml 1]> 
4. Appendix
4.1 Material Link
Please get the overview of globalization and localization in WPF from the following link:
ms-help://MS.MSSDK.1033/MS.NETFX30SDK.1033/wpf_conceptual/html/56e5a5c8-6c96-4d19-b8e1-a5be1dc564af.htm
Please get another sample code from the following link. There are three different ways of localizing a WPF .EXE application in the sample code. And the third approach is our need, by which the localization work can be carried on after the project building.
http://www.codeproject.com/WPF/WPFUsingLocbaml.asp
And you can also get a tutorial how to create a localized application by using the LocBaml tool from the link:
ms-help://MS.MSSDK.1033/MS.NETFX30SDK.1033/wpf_conceptual/html/5001227e-9326-48a4-9dcd-ba1b89ee6653.htm#Some_Tips_for_Using_LocBaml.
4.2 Tools
Table 4-1 Tool specification
|
Tool
|
Specification
|
|
MSBuild.exe
|
The Microsoft Build Engine (MSBuild) is the new build platform for Microsoft and Visual Studio. MSBuild is completely transparent with regards to how it processes and builds software, enabling developers to orchestrate and build products in build lab environments where Visual Studio is not installed.
|
|
LocBaml.exe
|
The LocBaml tool is not a production-ready application. It is presented as a sample that uses some of the localization APIs and illustrates how you might write a localization tool.
|
|
Resgen.exe
Resource File Generator
|
The Resource File Generator converts .txt files and .resx (XML-based resource format) files to common language runtime binary .resources files that can be embedded in a runtime binary executable or compiled into satellite assemblies
|
|
Al.exe
Assembly Linker
|
The Assembly Linker generates a file with an assembly manifest from one or more files that are either modules or resource files.
|
Some Tips for Using LocBaml
<1. <All dependent assemblies that define custom controls must be copied into the local directory of LocBaml or installed into the GAC. This is necessary because the localization API must have access to the dependent assemblies when it reads the binary XAML (BAML).
<2. <If the main assembly is signed, the generated resource dll must also be signed in order for it to be loaded.
<3. <The version of the localized resource dll needs to be synchronized with the main assembly.
4.3 File type specification
Table 4-2 File type specification
|
File type
|
Specification
|
|
.resx
|
XML-based resource format
|
|
.resources
|
Can be embedded in a runtime binary executable or compiled into satellite assemblies
|
4.4 Columns description in CSV file generated by LocBaml
Table 4-3 Columns description in CSV file generated by LocBaml
|
Column
|
Description
|
|
Baml Name
|
Identifies the BAML stream; the value will be of the form AssemblyManifestStreamName:SubStream Name.
|
|
Resource Key
|
Identifies the localizable resource; the value will be of the form Uid:Element Type.$Property.
|
|
Localization Category
|
An entry from the LocalizationCategory enumeration, indicating what kind of content this is.
|
|
Readable
|
Indicates whether the resource is visible for translation.
|
|
Modifiable
|
Indicates whether this value can be modified during translation.
|
|
Comments
|
Localization comments.
|
|
Value
|
The value of this resource.
|
4.4 Best Practices for Globalization and Localization in WPF
Best Practices for WPF UI Design
When you design a WPF–based UI, consider implementing these best practices:
< <Write your UI in XAML; avoid creating UI in code. When you create your UI by using XAML, you expose it through built-in localization APIs.
< <Avoid using absolute positions and fixed sizes to lay out content; instead, use relative or automatic sizing.
1. Use SizeToContent; and keep widths and heights set to Auto.
2. Avoid using Canvas to lay out UIs.
3. Use Grid and its size-sharing feature.
< <Provide extra space in margins because localized text often requires more space. Extra space allows for possible overhanging characters.
< <Enable TextWrapping on TextBlock to avoid clipping.
< <Set the xml:lang attribute. This attribute describes the culture of a specific element and its child elements. The value of this property changes the behavior of several features in WPF. For example, it changes the behavior of hyphenation, spell checking, number substitution, complex script shaping, and font fallback.
<l <Create a customized composite font to obtain better control of fonts that are used for different languages. By default, WPF uses the GlobalUserInterface.composite font in your Windows\Fonts directory.
< <When you create navigation applications that may be localized in a culture that presents text in a right-to-left format, explicitly set the FlowDirection of every page to ensure the page does not inherit FlowDirection from the NavigationWindow.
< <When you create stand-alone navigation applications that are hosted outside a browser, set the StartupUri for your initial application to a NavigationWindow instead of to a page (for example, <Application StartupUri="NavigationWindow.xaml">). This design enables you to change the FlowDirection of the Window and the navigation bar.
Best Practices for WPF Localization
When you localize WPF–based applications, consider implementing these best practices:
< <Use localization comments to provide extra context for localizers.
< <Use localization attributes to control localization instead of selectively omitting Uid properties on elements. See Localization Attributes and Comments for more information.
< <Use msbuild /t:updateuid and /t:checkuid to add and check Uid properties in your XAML. Use Uid properties to track changes between development and localization. Uid properties help you localize new development changes. If you manually add Uid properties to a UI, the task is typically tedious and less accurate.
1. Do not edit or change Uid properties after you begin localization.
2. Do not use duplicate Uid properties (remember this tip when you use the copy-and-paste command).
3. Set the UltimateResourceFallback location in AssemblyInfo.* to specify the appropriate language for fallback (for example, [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]).
If you decide to include your source language in the main assembly by omitting the <UICulture> tag in your project file, set the UltimateResourceFallback location as the main assembly instead of the satellite (for example, [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)]).