Localizing WPF Controls with Localizer Objects
- 5 minutes to read
Each DevExpress component or library has a specific Localizer class (see the table below) that contains localized strings. For example, in the Data Grid control, this is the GridControlLocalizer class.
Note
Important: Not all strings can be translated via Localizer classes. Some components contain form resources (e.g., the XtraReports Search dialog), and the only way to translate them is to create satellite assemblies. Thus, localization via resources is the preferable solution.
Localization Process
Use custom localizers to provide translated strings for localization as follows:
- Create a descendant of a corresponding Localizer class and override either the GetLocalizedString method (which returns strings for specific string resource identifiers) or PopulateStringTable method (which adds strings for specified resource identifiers).
- To use this localizer, assign an instance of this class to the static Active property of the localizer class from which you inherited.
The following table lists Localizer classes and Resource String enumerations for DevExpress WPF products:
Product | Localizer Class | Resource String Enumeration | Namespace |
---|---|---|---|
DevExpress.Xpf.PropertyGrid.PropertyGridControlLocalizer | DevExpress.Xpf.PropertyGrid.PropertyGridControlStringID | ||
DevExpress.Xpf.Gantt.Localization.GanttControlLocalizer | DevExpress.Xpf.Gantt.Localization.GanttControlStringId | DevExpress.Xpf.Gantt.Localization | |
DevExpress.Xpf.Docking.Base.DockingStringId | |||
DevExpress.Diagram.Core.Localization.DiagramControlStringId | |||
DevExpress.Xpf.Bars.BarsStringId | |||
DevExpress.Xpf.Scheduling.Common.SchedulerLocalizer | DevExpress.Xpf.Scheduling.Common.SchedulerStringId | ||
DevExpress.Xpf.RichEdit.Localization.XpfRichEditLocalizer | DevExpress.Xpf.RichEdit.RichEditControl.StringId | DevExpress.Xpf.RichEdit.Localization DevExpress.Xpf.RichEdit | |
DevExpress.Xpf.Spreadsheet.Localization.XpfSpreadsheetLocalizer | DevExpress.Xpf.Spreadsheet.SpreadsheetControlStringId | DevExpress.Xpf.Spreadsheet.Localization DevExpress.Xpf.Spreadsheet | |
DevExpress.Xpf.Gauges.Localization.GaugeStringId | |||
DevExpress.XtraSpellChecker.Localization.SpellCheckerStringId | |||
DevExpress.Xpf.Controls.WizardLocalizer | DevExpress.Xpf.Controls.WizardLocalizerStringId | ||
DevExpress.Xpf.WindowsUI.HamburgerMenuLocalizer | DevExpress.Xpf.WindowsUI.HamburgerMenuStringId | ||
Conditional Formatting | DevExpress.Xpf.Core.ConditionalFormatting.ConditionalFormattingLocalizer | DevExpress.Xpf.Core.ConditionalFormatting.ConditionalFormattingStringId |
Examples
Find Localization Strings to Override
The following code sample demonstrates how to handle the XtraLocalizer.QueryLocalizedString
event to display localization string ids instead of localized strings:
public partial class MainWindow {
public MainWindow() {
InitializeComponent();
DevExpress.Utils.Localization.XtraLocalizer.QueryLocalizedString += XtraLocalizer_QueryLocalizedString;
}
void XtraLocalizer_QueryLocalizedString(object sender, XtraLocalizer.QueryLocalizedStringEventArgs e) {
e.Value = $"{e.StringIDType.Name}.{e.StringID}";
}
}
Use GridControlLocalizer to Localize the Grid
This example uses the GridControlLocalizer to replace the following GridControl‘s strings:
- Customize… → Customize Totals
- Totals for ‘Column Name’ → Totals Editor
- Items → Summary Items
public partial class MainWindow : Window {
public MainWindow() {
// ...
}
static MainWindow() {
GridControlLocalizer.Active = new CustomDXGridLocalizer();
}
}
public class CustomDXGridLocalizer : GridControlLocalizer {
protected override void PopulateStringTable() {
base.PopulateStringTable();
// Changes the caption of the menu item used to invoke the Total Summary Editor.
AddString(GridControlStringId.MenuFooterCustomize, "Customize Totals");
// Changes the Total Summary Editor's default caption.
AddString(GridControlStringId.TotalSummaryEditorFormCaption, "Totals Editor");
// Changes the default caption of the tab page that lists total summary items.
AddString(GridControlStringId.SummaryEditorFormItemsTabCaption, "Summary Items");
}
}
Change Localization Strings and Keep the Resource Localization
If you wish to change localized strings obtained from Satellite Resource Assemblies, use *ResXLocalizer counterparts for localizer objects listed in the table above. For example, use the GridControlResXLocalizer
object instead of GridControlLocalizer.
The following code sample demonstrates how to specify custom localized strings with the Japanese localization applied:
public partial class MainWindow {
public MainWindow() {
// ...
}
static MainWindow() {
GridControlResXLocalizer.Active = new CustomDXGridLocalizer();
}
}
public class CustomDXGridLocalizer : GridControlResXLocalizer {
protected override void PopulateStringTable() {
base.PopulateStringTable();
AddString(GridControlStringId.MenuFooterSum, "合計");
AddString(GridControlStringId.MenuFooterMin, "最小値");
AddString(GridControlStringId.MenuFooterMax, "最大値");
}
}
Change GridControl Strings at Runtime
This example shows how to change the default string displayed in the Group Panel at runtime.
<dxg:GridControl x:Name="grid" AutoGenerateColumns="AddNew">
<dxg:GridControl.View>
<dxg:TableView x:Name="view" AutoWidth="True"/>
</dxg:GridControl.View>
</dxg:GridControl>
<StackPanel Grid.Row="1" Orientation="Horizontal">
<TextBox x:Name="textBox" Width="200" KeyDown="textBox_KeyDown" Margin="3,3,3,3"/>
<Button Content="Apply" Click="button_Click" Margin="0,3,0,3"/>
</StackPanel>
void LocalizeGroupPanelText() {
var NewText = textBox.Text;
var localization = new GridRuntimeStringCollection();
localization.Add(new RuntimeStringIdInfo(GridControlRuntimeStringId.GridGroupPanelText, NewText));
view.RuntimeLocalizationStrings = localization;
}
void button_Click(object sender, RoutedEventArgs e) {
LocalizeGroupPanelText();
}
void textBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) {
if (e.Key == System.Windows.Input.Key.Enter) {
LocalizeGroupPanelText();
}
}