| name | spectre-cli-localization |
| description | Procedure for localizing Spectre.Console.Cli command and option descriptions in DaxStudio.CommandLine. Use when internationalizing the dscmd command-line tool. |
Spectre.Console.Cli Localization for dscmd
Overview
The DaxStudio.CommandLine project uses Spectre.Console.Cli with [Description] attributes for help text. There are ~28 [Description] attributes across settings classes and ~9 .WithDescription() calls in Program.cs.
Step 1: Migrate [Description] Attributes
Replace System.ComponentModel.DescriptionAttribute with LocalizedDescriptionAttribute:
[CommandOption("-s|--server <server>")]
[Description("The name of the tabular server to connect to")]
public string Server { get; set; }
[CommandOption("-s|--server <server>")]
[LocalizedDescription("Option_Server_Description")]
public string Server { get; set; }
LocalizedDescriptionAttribute extends DescriptionAttribute and overrides Description to return CommandStrings.ResourceManager.GetString(key). Spectre.Console.Cli reads DescriptionAttribute.Description transparently.
Step 2: Migrate .WithDescription() Calls
In Program.cs, these are method calls that accept a string — use the resource directly:
export.AddCommand<ExportCsvCommand>("csv")
.WithDescription("Exports specified tables to csv files in a folder");
export.AddCommand<ExportCsvCommand>("csv")
.WithDescription(CommandStrings.Command_ExportCsv_Description);
Step 3: Update DirectLakeModeDescriptionAttribute
public override string Description => "Sets the Direct Lake mode. Valid values are: "
+ string.Join(", ", Enum.GetNames(typeof(DirectLakeExtractionMode)));
public override string Description => string.Format(
CommandStrings.Option_DirectLakeMode_DescriptionFormat,
string.Join(", ", Enum.GetNames(typeof(DirectLakeExtractionMode))));
CommandStrings.resx: Option_DirectLakeMode_DescriptionFormat = Sets the Direct Lake mode. Valid values are: {0}
Step 4: Update CustomHelpProvider
Localize the hardcoded text in GetHeader():
new Markup("[dim]DAX Studio command line utility[/]")
Resource Key Naming
| Context | Pattern | Example |
|---|
| Command | Command_{Name}_Description | Command_ExportCsv_Description |
| Option | Option_{Name}_Description | Option_Server_Description |
| Argument | Argument_{Name}_Description | Argument_OutputFolder_Description |
| Help text | Help_{Purpose} | Help_ToolDescription |
Do NOT Localize
[CommandOption("-s|--server <server>")] — CLI flags are part of the API contract
- Command verb names:
csv, file, xlsx, vpax, export, accesstoken
[CommandArgument(0, "<OutputFolder>")] placeholder syntax
.WithExample(...) arrays — these are CLI usage examples showing exact syntax
Files to Process (in order)
Commands\CommandSettingsRawBase.cs — shared connection options (5 descriptions)
Commands\CommandSettingsFolderBase.cs — output folder argument (1 description)
Commands\ExportSqlCommand.cs — SQL export options (3 descriptions)
Commands\ExportCsvCommand.cs — CSV export options (2 descriptions)
Commands\ExportParquetCommand.cs — Parquet export options (2 descriptions)
Commands\FileCommand.cs — file output options (3 descriptions)
Commands\VpaxCommand.cs — VPAX options (6 descriptions)
Commands\XlsxCommand.cs — XLSX options (2 descriptions)
Commands\AccessTokenCommand.cs — token options
Commands\CustomTraceCommand.cs — trace options (2 descriptions)
Commands\CaptureDiagnosticsCommand.cs — diagnostics options (2 descriptions)
Program.cs — command registrations (9 .WithDescription() calls)
Help\CustomHelpProvider.cs — help header text
Attributes\DirectLakeModeDescriptionAttribute.cs — dynamic description