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