Procedure for migrating DAX Studio OptionsViewModel attributes ([DisplayName], [Description], [Category], [Subcategory]) to their localized equivalents. Use when localizing the Options UI.
DAX Studio's Options UI is built by PropertyList.cs which reads attributes via reflection:
DisplayNameAttribute → option labelDescriptionAttribute → help text below optionCategoryAttribute → tab groupingSubcategoryAttribute → sub-grouping within tabThese standard attributes require compile-time constant strings. To localize them, we use custom subclasses that accept a resource key and override the virtual property to return a localized value at runtime.
Located in DaxStudio.Common:
LocalizedDisplayNameAttribute extends DisplayNameAttributeLocalizedDescriptionAttribute extends DescriptionAttributeLocalizedCategoryAttribute extends CategoryAttributeLocalizedSubcategoryAttribute extends SubcategoryAttributeFor each property in OptionsViewModel.cs:
// BEFORE
[Category("Editor")]
[DisplayName("Editor Font Size")]
[Description("The font size used for the DAX editor")]
[Subcategory("Formatting")]
[SortOrder(20)]
[MinValue(6), MaxValue(120)]
[DataMember, DefaultValue(11d)]
public double EditorFontSize { get; set; }
// AFTER
[LocalizedCategory("Category_Editor")]
[LocalizedDisplayName("Options_EditorFontSize_DisplayName")]
[LocalizedDescription("Options_EditorFontSize_Description")]
[LocalizedSubcategory("Options_Formatting_Subcategory")]
[SortOrder(20)]
[MinValue(6), MaxValue(120)]
[DataMember, DefaultValue(11d)]
public double EditorFontSize { get; set; }
| Attribute | Pattern | Example |
|---|---|---|
| Category | Category_{Name} | Category_Editor |
| DisplayName | Options_{PropertyName}_DisplayName | Options_EditorFontSize_DisplayName |
| Description | Options_{PropertyName}_Description | Options_EditorFontSize_Description |
| Subcategory | Options_{Name}_Subcategory | Options_Formatting_Subcategory |
Add each key-value pair to src\DaxStudio.UI\Resources\Strings.resx with the original English text as the value.
These are the existing category values to create resource keys for:
[SortOrder], [MinValue], [MaxValue], [DataMember], [DefaultValue] — these are not user-visible text.[EnumDisplay] or [EnvironmentVariableAttribute] — these control behavior, not display text.[DisplayName] attribute are intentionally hidden from the UI — do not add one.PropertyList.cs should require ZERO changes — the localized attributes extend the standard ones, so GetCustomAttribute(typeof(DisplayNameAttribute)) still finds them.