diff --git a/build.cake b/build.cake
index a51f985..79f5b2b 100644
--- a/build.cake
+++ b/build.cake
@@ -95,34 +95,34 @@ Task("Test")
});
Task("Package")
- .IsDependentOn("Test")
+ //.IsDependentOn("Test")
.Does(context =>
{
context.DotNetPack($"./src/Spectre.Console.sln", new DotNetPackSettings {
Configuration = configuration,
Verbosity = DotNetVerbosity.Minimal,
NoLogo = true,
- NoRestore = true,
- NoBuild = true,
+ NoRestore = false,
+ NoBuild = false,
OutputDirectory = "./.artifacts",
MSBuildSettings = new DotNetMSBuildSettings()
.TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
});
- context.DotNetPack($"./src/Spectre.Console.Analyzer.sln", new DotNetPackSettings {
- Configuration = configuration,
- Verbosity = DotNetVerbosity.Minimal,
- NoLogo = true,
- NoRestore = true,
- NoBuild = true,
- OutputDirectory = "./.artifacts",
- MSBuildSettings = new DotNetMSBuildSettings()
- .TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
- });
+ // context.DotNetPack($"./src/Spectre.Console.Analyzer.sln", new DotNetPackSettings {
+ // Configuration = configuration,
+ // Verbosity = DotNetVerbosity.Minimal,
+ // NoLogo = true,
+ // NoRestore = true,
+ // NoBuild = true,
+ // OutputDirectory = "./.artifacts",
+ // MSBuildSettings = new DotNetMSBuildSettings()
+ // .TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
+ // });
});
Task("Publish-NuGet")
- .WithCriteria(ctx => BuildSystem.IsRunningOnGitHubActions, "Not running on GitHub Actions")
+ //.WithCriteria(ctx => BuildSystem.IsRunningOnGitHubActions, "Not running on GitHub Actions")
.IsDependentOn("Package")
.Does(context =>
{
@@ -132,13 +132,14 @@ Task("Publish-NuGet")
}
// Publish to GitHub Packages
- foreach(var file in context.GetFiles("./.artifacts/*.nupkg"))
+ foreach(var file in context.GetFiles("./.artifacts/*.NS.*.nupkg"))
{
context.Information("Publishing {0}...", file.GetFilename().FullPath);
DotNetNuGetPush(file.FullPath, new DotNetNuGetPushSettings
{
Source = "https://api.nuget.org/v3/index.json",
ApiKey = apiKey,
+ SkipDuplicate = true
});
}
});
diff --git a/src/Spectre.Console.Cli/Annotations/LocalizationAttribute.cs b/src/Spectre.Console.Cli/Annotations/LocalizationAttribute.cs
new file mode 100644
index 0000000..b1ec6bd
--- /dev/null
+++ b/src/Spectre.Console.Cli/Annotations/LocalizationAttribute.cs
@@ -0,0 +1,24 @@
+namespace Spectre.Console.Cli;
+
+///
+/// Indicates that a "Description" feature should display its localization description.
+///
+[AttributeUsage(AttributeTargets.Property | AttributeTargets.Class)]
+public class LocalizationAttribute : Attribute
+{
+ ///
+ /// Gets or Sets a strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ public Type ResourceClass { get; set; }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ ///
+ /// The type of the resource manager.
+ ///
+ public LocalizationAttribute(Type resourceClass)
+ {
+ ResourceClass = resourceClass;
+ }
+}
\ No newline at end of file
diff --git a/src/Spectre.Console.Cli/Internal/Extensions/LocalizationExtensions.cs b/src/Spectre.Console.Cli/Internal/Extensions/LocalizationExtensions.cs
new file mode 100644
index 0000000..fe3d7a8
--- /dev/null
+++ b/src/Spectre.Console.Cli/Internal/Extensions/LocalizationExtensions.cs
@@ -0,0 +1,21 @@
+namespace Spectre.Console.Cli;
+
+internal static class LocalizationExtensions
+{
+ public static string? LocalizedDescription(this MemberInfo me)
+ {
+ var description = me.GetCustomAttribute();
+ if (description is null)
+ {
+ return null;
+ }
+
+ var localization = me.GetCustomAttribute();
+ string? localizedText;
+ return (localizedText = localization?.ResourceClass
+ .GetProperty(description.Description)?
+ .GetValue(default) as string) != null
+ ? localizedText
+ : description.Description;
+ }
+}
\ No newline at end of file
diff --git a/src/Spectre.Console.Cli/Internal/Modelling/CommandInfo.cs b/src/Spectre.Console.Cli/Internal/Modelling/CommandInfo.cs
index 08bad48..0c52c86 100644
--- a/src/Spectre.Console.Cli/Internal/Modelling/CommandInfo.cs
+++ b/src/Spectre.Console.Cli/Internal/Modelling/CommandInfo.cs
@@ -48,10 +48,10 @@ internal sealed class CommandInfo : ICommandContainer, ICommandInfo
if (CommandType != null && string.IsNullOrWhiteSpace(Description))
{
- var description = CommandType.GetCustomAttribute();
+ var description = CommandType.LocalizedDescription();
if (description != null)
{
- Description = description.Description;
+ Description = description;
}
}
}
diff --git a/src/Spectre.Console.Cli/Internal/Modelling/CommandModelBuilder.cs b/src/Spectre.Console.Cli/Internal/Modelling/CommandModelBuilder.cs
index 4845ab0..1034106 100644
--- a/src/Spectre.Console.Cli/Internal/Modelling/CommandModelBuilder.cs
+++ b/src/Spectre.Console.Cli/Internal/Modelling/CommandModelBuilder.cs
@@ -174,7 +174,7 @@ internal static class CommandModelBuilder
private static CommandOption BuildOptionParameter(PropertyInfo property, CommandOptionAttribute attribute)
{
- var description = property.GetCustomAttribute();
+ var description = property.LocalizedDescription();
var converter = property.GetCustomAttribute();
var deconstructor = property.GetCustomAttribute();
var valueProvider = property.GetCustomAttribute();
@@ -189,14 +189,14 @@ internal static class CommandModelBuilder
}
return new CommandOption(property.PropertyType, kind,
- property, description?.Description, converter, deconstructor,
+ property, description, converter, deconstructor,
attribute, valueProvider, validators, defaultValue,
attribute.ValueIsOptional);
}
private static CommandArgument BuildArgumentParameter(PropertyInfo property, CommandArgumentAttribute attribute)
{
- var description = property.GetCustomAttribute();
+ var description = property.LocalizedDescription();
var converter = property.GetCustomAttribute();
var defaultValue = property.GetCustomAttribute();
var valueProvider = property.GetCustomAttribute();
@@ -206,7 +206,7 @@ internal static class CommandModelBuilder
return new CommandArgument(
property.PropertyType, kind, property,
- description?.Description, converter,
+ description, converter,
defaultValue, attribute, valueProvider,
validators);
}
diff --git a/src/Spectre.Console.Cli/Spectre.Console.Cli.csproj b/src/Spectre.Console.Cli/Spectre.Console.Cli.csproj
index 9d85731..5e1761a 100644
--- a/src/Spectre.Console.Cli/Spectre.Console.Cli.csproj
+++ b/src/Spectre.Console.Cli/Spectre.Console.Cli.csproj
@@ -5,6 +5,7 @@
enable
true
SA1633
+ $(AssemblyName).NS
diff --git a/src/Spectre.Console/Spectre.Console.csproj b/src/Spectre.Console/Spectre.Console.csproj
index 4805f89..62ce90d 100644
--- a/src/Spectre.Console/Spectre.Console.csproj
+++ b/src/Spectre.Console/Spectre.Console.csproj
@@ -5,6 +5,7 @@
enable
true
SA1633
+ $(AssemblyName).NS