From 4249bf0afe17ad72e0b90e28f3d754e14a1d6d0d Mon Sep 17 00:00:00 2001 From: Kay Unkroth Date: Sun, 7 Mar 2021 19:44:08 -0800 Subject: [PATCH] MTCmd command-line tool added and documentation updated. --- MetadataTranslator/MTCmd/App.config | 6 + MetadataTranslator/MTCmd/MTCmd.csproj | 94 +++ MetadataTranslator/MTCmd/Program.cs | 114 ++++ .../MTCmd/Properties/AssemblyInfo.cs | 36 + MetadataTranslator/MTCmd/Strings.Designer.cs | 162 +++++ MetadataTranslator/MTCmd/Strings.resx | 153 +++++ MetadataTranslator/MTCmd/icon.ico | Bin 0 -> 67646 bytes MetadataTranslator/MTCmd/packages.config | 9 + .../Metadata Translator Setup.vdproj | 633 +++++++++++++++++- MetadataTranslator/Metadata Translator.sln | 6 + .../Metadata Translator/Data/DataModel.cs | 56 ++ .../Images/MT command-line app.png | Bin 0 -> 30975 bytes .../Documentation/README.md | 40 +- .../Properties/AssemblyInfo.cs | 4 +- .../Metadata Translator/UI/MainWindow.xaml.cs | 32 +- 15 files changed, 1302 insertions(+), 43 deletions(-) create mode 100644 MetadataTranslator/MTCmd/App.config create mode 100644 MetadataTranslator/MTCmd/MTCmd.csproj create mode 100644 MetadataTranslator/MTCmd/Program.cs create mode 100644 MetadataTranslator/MTCmd/Properties/AssemblyInfo.cs create mode 100644 MetadataTranslator/MTCmd/Strings.Designer.cs create mode 100644 MetadataTranslator/MTCmd/Strings.resx create mode 100644 MetadataTranslator/MTCmd/icon.ico create mode 100644 MetadataTranslator/MTCmd/packages.config create mode 100644 MetadataTranslator/Metadata Translator/Documentation/Images/MT command-line app.png diff --git a/MetadataTranslator/MTCmd/App.config b/MetadataTranslator/MTCmd/App.config new file mode 100644 index 0000000..56efbc7 --- /dev/null +++ b/MetadataTranslator/MTCmd/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/MetadataTranslator/MTCmd/MTCmd.csproj b/MetadataTranslator/MTCmd/MTCmd.csproj new file mode 100644 index 0000000..b032f39 --- /dev/null +++ b/MetadataTranslator/MTCmd/MTCmd.csproj @@ -0,0 +1,94 @@ + + + + + Debug + AnyCPU + {0B0EA3E1-79CC-4674-A763-9C40925DEE31} + Exe + MTCmd + MTCmd + v4.7.2 + 512 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + icon.ico + + + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + ..\packages\System.CommandLine.2.0.0-beta1.20574.7\lib\netstandard2.0\System.CommandLine.dll + + + + ..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + + + + + + + + + + + + True + True + Strings.resx + + + + + + + + + {cb7d493c-b67e-4438-b304-efe5d418addf} + Metadata Translator + + + + + ResXFileCodeGenerator + Strings.Designer.cs + + + + + + + \ No newline at end of file diff --git a/MetadataTranslator/MTCmd/Program.cs b/MetadataTranslator/MTCmd/Program.cs new file mode 100644 index 0000000..ecf69b2 --- /dev/null +++ b/MetadataTranslator/MTCmd/Program.cs @@ -0,0 +1,114 @@ +using System; +using System.CommandLine; +using System.CommandLine.Invocation; +using System.IO; +using System.Linq; +using Metadata_Translator; + +namespace MTCmd +{ + public enum Mode + { + Export, + Import, + Overwrite + } + + class Program + { + static int Main(string[] args) + { + /// + /// Create a root command with the required options. + /// + var rootCommand = new RootCommand(Strings.rootCmdDescription) + { + new Option( + new string[]{ "--connection-string", "-cs" }, Strings.csDescription){ IsRequired = true }, + new Option( + new string[]{ "--mode", "-m" }, + getDefaultValue: () => Mode.Export, + description: Strings.modeDescription), + new Option( + new string[]{ "--export-folder", "-ef" }, Strings.efDescription).ExistingOnly(), + new Option( + new string[]{ "--import-file", "-if" }, Strings.ifDescription).ExistingOnly() + }; + + + // Note that the parameters of the handler method are matched according to the names of the options + rootCommand.Handler = CommandHandler.Create((connectionString, mode, exportFolder, importFile) => + { + try + { + DataModel model = DataModel.Connect(connectionString); + model.InitializeLanguages(); + + switch (mode) + { + case Mode.Export: + Export(model, exportFolder); + break; + case Mode.Import: + Import(model, importFile, false); + break; + case Mode.Overwrite: + Import(model, importFile, true); + break; + default: + break; + } + } + catch(Exception ex) + { + Console.WriteLine($"{ex}"); + } + }); + + // Parse the incoming args and invoke the handler + return rootCommand.InvokeAsync(args).Result; + } + + static void Import(DataModel model, FileInfo importFile, bool overwriteMode) + { + if (importFile != null) + { + string lcid = Path.GetFileNameWithoutExtension(importFile.Name); + if (model.SetLanguageFlags(lcid, true)) + { + model.ImportFromCsv(importFile.FullName, lcid, overwriteMode); + model.Update(); + Console.WriteLine(Strings.importSuccess, importFile); + } + else + { + Console.WriteLine(Strings.invalidLocale); + } + } + else + { + Console.WriteLine(Strings.noImportFileSpecified); + } + } + + static void Export(DataModel model, DirectoryInfo exportFolder) + { + if (exportFolder != null) + { + if (model.HasTargetLanguages) + { + model.ExportToCsv(exportFolder.FullName); + Console.WriteLine(Strings.exportSuccess, exportFolder); + } + else + { + Console.WriteLine(Strings.noExportableTranslations); + } + } + else + { + Console.WriteLine(Strings.noExportFolderSpecified); + } + } + } +} diff --git a/MetadataTranslator/MTCmd/Properties/AssemblyInfo.cs b/MetadataTranslator/MTCmd/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..09eb94f --- /dev/null +++ b/MetadataTranslator/MTCmd/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("MTCmd")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MTCmd")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("0b0ea3e1-79cc-4674-a763-9c40925dee31")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.2.0.0")] +[assembly: AssemblyFileVersion("1.2.0.0")] diff --git a/MetadataTranslator/MTCmd/Strings.Designer.cs b/MetadataTranslator/MTCmd/Strings.Designer.cs new file mode 100644 index 0000000..59c55a1 --- /dev/null +++ b/MetadataTranslator/MTCmd/Strings.Designer.cs @@ -0,0 +1,162 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace MTCmd { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MTCmd.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to The connection string to connect to the Azure Analysis Services (Azure AS) or SQL Server Analysis Services (SSAS) data model, or Power BI Premium dataset. + /// + internal static string csDescription { + get { + return ResourceManager.GetString("csDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The full path to the export folder.. + /// + internal static string efDescription { + get { + return ResourceManager.GetString("efDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Existing translations exported to: {0}. + /// + internal static string exportSuccess { + get { + return ResourceManager.GetString("exportSuccess", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The full path and name of the comma-separated values (csv) translation file to import.. + /// + internal static string ifDescription { + get { + return ResourceManager.GetString("ifDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Translation file {0} imported successfully.. + /// + internal static string importSuccess { + get { + return ResourceManager.GetString("importSuccess", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Either the imported language matches the default locale, or the file name does not correspond to a supported locale identifier. The file name convention is <lcid>.csv.. + /// + internal static string invalidLocale { + get { + return ResourceManager.GetString("invalidLocale", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The mode of the command-line operation. + /// + internal static string modeDescription { + get { + return ResourceManager.GetString("modeDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This dataset has no translations.. + /// + internal static string noExportableTranslations { + get { + return ResourceManager.GetString("noExportableTranslations", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use the --export-folder option to specify an export folder for this operation.. + /// + internal static string noExportFolderSpecified { + get { + return ResourceManager.GetString("noExportFolderSpecified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use the --import-file option to specify an import file for this operation.. + /// + internal static string noImportFileSpecified { + get { + return ResourceManager.GetString("noImportFileSpecified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Machine Translator command-line app. + /// + internal static string rootCmdDescription { + get { + return ResourceManager.GetString("rootCmdDescription", resourceCulture); + } + } + } +} diff --git a/MetadataTranslator/MTCmd/Strings.resx b/MetadataTranslator/MTCmd/Strings.resx new file mode 100644 index 0000000..1ce367e --- /dev/null +++ b/MetadataTranslator/MTCmd/Strings.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + The connection string to connect to the Azure Analysis Services (Azure AS) or SQL Server Analysis Services (SSAS) data model, or Power BI Premium dataset + + + The full path to the export folder. + + + Existing translations exported to: {0} + + + The full path and name of the comma-separated values (csv) translation file to import. + + + Translation file {0} imported successfully. + + + Either the imported language matches the default locale, or the file name does not correspond to a supported locale identifier. The file name convention is <lcid>.csv. + + + The mode of the command-line operation + + + This dataset has no translations. + + + Use the --export-folder option to specify an export folder for this operation. + + + Use the --import-file option to specify an import file for this operation. + + + Machine Translator command-line app + + \ No newline at end of file diff --git a/MetadataTranslator/MTCmd/icon.ico b/MetadataTranslator/MTCmd/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e4317cea02904336c505aa472155fe414b3c971c GIT binary patch literal 67646 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 ISx15Y2LQDG%K!iX literal 0 HcmV?d00001 diff --git a/MetadataTranslator/MTCmd/packages.config b/MetadataTranslator/MTCmd/packages.config new file mode 100644 index 0000000..c558207 --- /dev/null +++ b/MetadataTranslator/MTCmd/packages.config @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/MetadataTranslator/Metadata Translator Setup/Metadata Translator Setup.vdproj b/MetadataTranslator/Metadata Translator Setup/Metadata Translator Setup.vdproj index a38cce5..e196446 100644 --- a/MetadataTranslator/Metadata Translator Setup/Metadata Translator Setup.vdproj +++ b/MetadataTranslator/Metadata Translator Setup/Metadata Translator Setup.vdproj @@ -22,6 +22,12 @@ "Entry" { "MsmKey" = "8:_0635D5A6F23DB1379A0FD91FF1B01507" + "OwnerKey" = "8:_2CE91AB829584CF99B8C35A6E138B5FF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0635D5A6F23DB1379A0FD91FF1B01507" "OwnerKey" = "8:_5EE4AF833E364CBAB977AFCB8CD5E99D" "MsmSig" = "8:_UNDEFINED" } @@ -33,6 +39,30 @@ } "Entry" { + "MsmKey" = "8:_19CCDCF64DCD42A423A21A106271862F" + "OwnerKey" = "8:_4A5BE4840FB638200664527C5EDB50B1" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_19CCDCF64DCD42A423A21A106271862F" + "OwnerKey" = "8:_2CE91AB829584CF99B8C35A6E138B5FF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1EF590E9755E072BDC7697262C8261FD" + "OwnerKey" = "8:_2CE91AB829584CF99B8C35A6E138B5FF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2CE91AB829584CF99B8C35A6E138B5FF" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_2F1DB028FE734DBD9E77D9DCA191FAD1" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -45,18 +75,66 @@ } "Entry" { + "MsmKey" = "8:_441D4DFF8EBA539070D14AA52B77A767" + "OwnerKey" = "8:_1EF590E9755E072BDC7697262C8261FD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_441D4DFF8EBA539070D14AA52B77A767" + "OwnerKey" = "8:_2CE91AB829584CF99B8C35A6E138B5FF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_4A5BE4840FB638200664527C5EDB50B1" + "OwnerKey" = "8:_2CE91AB829584CF99B8C35A6E138B5FF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_4DD4143C26C54926A2B59FBC551F160A" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { + "MsmKey" = "8:_569CA11E5F0BB01E824CD0E8609DC800" + "OwnerKey" = "8:_19CCDCF64DCD42A423A21A106271862F" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_569CA11E5F0BB01E824CD0E8609DC800" + "OwnerKey" = "8:_2CE91AB829584CF99B8C35A6E138B5FF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_579B668A1BF613B39A613E3676204554" + "OwnerKey" = "8:_2CE91AB829584CF99B8C35A6E138B5FF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_579B668A1BF613B39A613E3676204554" + "OwnerKey" = "8:_19CCDCF64DCD42A423A21A106271862F" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_5EE4AF833E364CBAB977AFCB8CD5E99D" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { + "MsmKey" = "8:_64EA80D7EB179AD7DF6F334604D63D4C" + "OwnerKey" = "8:_B92FE44943D4DEC27E1C3FA927231844" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_7C7487CE661C4E1E5239FB4306E0749B" "OwnerKey" = "8:_C48ECEE77D85A17550522737B8522D2B" "MsmSig" = "8:_UNDEFINED" @@ -64,6 +142,18 @@ "Entry" { "MsmKey" = "8:_7C7487CE661C4E1E5239FB4306E0749B" + "OwnerKey" = "8:_2CE91AB829584CF99B8C35A6E138B5FF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_7C7487CE661C4E1E5239FB4306E0749B" + "OwnerKey" = "8:_1EF590E9755E072BDC7697262C8261FD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_7C7487CE661C4E1E5239FB4306E0749B" "OwnerKey" = "8:_5EE4AF833E364CBAB977AFCB8CD5E99D" "MsmSig" = "8:_UNDEFINED" } @@ -76,6 +166,18 @@ "Entry" { "MsmKey" = "8:_905A4AA564BAC6CC36A45AEE36EFE2FD" + "OwnerKey" = "8:_2CE91AB829584CF99B8C35A6E138B5FF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_905A4AA564BAC6CC36A45AEE36EFE2FD" + "OwnerKey" = "8:_1EF590E9755E072BDC7697262C8261FD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_905A4AA564BAC6CC36A45AEE36EFE2FD" "OwnerKey" = "8:_7C7487CE661C4E1E5239FB4306E0749B" "MsmSig" = "8:_UNDEFINED" } @@ -87,6 +189,12 @@ } "Entry" { + "MsmKey" = "8:_9069E279B1FD50CD11B425DE3C9211AC" + "OwnerKey" = "8:_B92FE44943D4DEC27E1C3FA927231844" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_A00C4C4DA66740A385AE811FF37BAA77" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -100,6 +208,12 @@ "Entry" { "MsmKey" = "8:_A1F0AFE5FCA14283B33A21CAC42178E4" + "OwnerKey" = "8:_2CE91AB829584CF99B8C35A6E138B5FF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_A1F0AFE5FCA14283B33A21CAC42178E4" "OwnerKey" = "8:_5EE4AF833E364CBAB977AFCB8CD5E99D" "MsmSig" = "8:_UNDEFINED" } @@ -111,6 +225,18 @@ } "Entry" { + "MsmKey" = "8:_B92FE44943D4DEC27E1C3FA927231844" + "OwnerKey" = "8:_2CE91AB829584CF99B8C35A6E138B5FF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_B92FE44943D4DEC27E1C3FA927231844" + "OwnerKey" = "8:_4A5BE4840FB638200664527C5EDB50B1" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_C0C5DE7473DD8B2395E58F2E339A1AF1" "OwnerKey" = "8:_5EE4AF833E364CBAB977AFCB8CD5E99D" "MsmSig" = "8:_UNDEFINED" @@ -123,8 +249,32 @@ } "Entry" { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_441D4DFF8EBA539070D14AA52B77A767" + "MsmKey" = "8:_C4ACAD76FA650ADD691588B6D2AA3BB2" + "OwnerKey" = "8:_B92FE44943D4DEC27E1C3FA927231844" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C67DA394422F5927664B4F5D40B66A64" + "OwnerKey" = "8:_19CCDCF64DCD42A423A21A106271862F" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C67DA394422F5927664B4F5D40B66A64" + "OwnerKey" = "8:_2CE91AB829584CF99B8C35A6E138B5FF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DE34EA7F69E9468ED2359C26A753AE38" + "OwnerKey" = "8:_C4ACAD76FA650ADD691588B6D2AA3BB2" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DE34EA7F69E9468ED2359C26A753AE38" + "OwnerKey" = "8:_B92FE44943D4DEC27E1C3FA927231844" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -136,6 +286,78 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_2CE91AB829584CF99B8C35A6E138B5FF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_4A5BE4840FB638200664527C5EDB50B1" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_19CCDCF64DCD42A423A21A106271862F" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_569CA11E5F0BB01E824CD0E8609DC800" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_C67DA394422F5927664B4F5D40B66A64" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_579B668A1BF613B39A613E3676204554" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_1EF590E9755E072BDC7697262C8261FD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_B92FE44943D4DEC27E1C3FA927231844" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_64EA80D7EB179AD7DF6F334604D63D4C" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_C4ACAD76FA650ADD691588B6D2AA3BB2" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_DE34EA7F69E9468ED2359C26A753AE38" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_9069E279B1FD50CD11B425DE3C9211AC" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" "OwnerKey" = "8:_C48ECEE77D85A17550522737B8522D2B" "MsmSig" = "8:_UNDEFINED" } @@ -169,6 +391,12 @@ "OwnerKey" = "8:_A1F0AFE5FCA14283B33A21CAC42178E4" "MsmSig" = "8:_UNDEFINED" } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_441D4DFF8EBA539070D14AA52B77A767" + "MsmSig" = "8:_UNDEFINED" + } } "Configurations" { @@ -187,6 +415,22 @@ "PrivateKeyFile" = "8:" "TimeStampServer" = "8:" "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:TRUE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + "Items" + { + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.7.2" + { + "Name" = "8:Microsoft .NET Framework 4.7.2 (x86 and x64)" + "ProductCode" = "8:.NETFramework,Version=v4.7.2" + } + } + } } "Release" { @@ -203,6 +447,14 @@ "PrivateKeyFile" = "8:" "TimeStampServer" = "8:" "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:TRUE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + } } } "Deployable" @@ -291,6 +543,68 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_19CCDCF64DCD42A423A21A106271862F" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_19CCDCF64DCD42A423A21A106271862F" + { + "Name" = "8:System.Memory.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.Memory.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_E31DB11D2BA64930BBAB95E69D1A099C" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_1EF590E9755E072BDC7697262C8261FD" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Metadata Translator, Version=1.2.0.0, Culture=neutral, PublicKeyToken=0e7f9fd02ef157fe, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_1EF590E9755E072BDC7697262C8261FD" + { + "Name" = "8:Metadata Translator.exe" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Metadata Translator.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_E31DB11D2BA64930BBAB95E69D1A099C" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_2F1DB028FE734DBD9E77D9DCA191FAD1" { "SourcePath" = "8:..\\Metadata Translator\\metadata-translator.pbitool.json" @@ -342,6 +656,37 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4A5BE4840FB638200664527C5EDB50B1" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:System.CommandLine, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_4A5BE4840FB638200664527C5EDB50B1" + { + "Name" = "8:System.CommandLine.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.CommandLine.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_E31DB11D2BA64930BBAB95E69D1A099C" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_4DD4143C26C54926A2B59FBC551F160A" { "SourcePath" = "8:..\\Metadata Translator\\Resources\\supportedlanguages.json" @@ -362,6 +707,99 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_569CA11E5F0BB01E824CD0E8609DC800" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_569CA11E5F0BB01E824CD0E8609DC800" + { + "Name" = "8:System.Runtime.CompilerServices.Unsafe.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.Runtime.CompilerServices.Unsafe.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_E31DB11D2BA64930BBAB95E69D1A099C" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_579B668A1BF613B39A613E3676204554" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_579B668A1BF613B39A613E3676204554" + { + "Name" = "8:System.Buffers.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.Buffers.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_E31DB11D2BA64930BBAB95E69D1A099C" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_64EA80D7EB179AD7DF6F334604D63D4C" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_64EA80D7EB179AD7DF6F334604D63D4C" + { + "Name" = "8:System.Net.Http.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.Net.Http.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_E31DB11D2BA64930BBAB95E69D1A099C" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_7C7487CE661C4E1E5239FB4306E0749B" { "AssemblyRegister" = "3:1" @@ -424,6 +862,37 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_9069E279B1FD50CD11B425DE3C9211AC" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:System.Diagnostics.Tracing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_9069E279B1FD50CD11B425DE3C9211AC" + { + "Name" = "8:System.Diagnostics.Tracing.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.Diagnostics.Tracing.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_E31DB11D2BA64930BBAB95E69D1A099C" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A00C4C4DA66740A385AE811FF37BAA77" { "SourcePath" = "8:..\\Metadata Translator\\icon.ico" @@ -475,6 +944,37 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_B92FE44943D4DEC27E1C3FA927231844" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" + "ScatterAssemblies" + { + "_B92FE44943D4DEC27E1C3FA927231844" + { + "Name" = "8:netstandard.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:netstandard.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_E31DB11D2BA64930BBAB95E69D1A099C" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_C0C5DE7473DD8B2395E58F2E339A1AF1" { "AssemblyRegister" = "3:1" @@ -537,6 +1037,99 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_C4ACAD76FA650ADD691588B6D2AA3BB2" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_C4ACAD76FA650ADD691588B6D2AA3BB2" + { + "Name" = "8:System.IO.Compression.FileSystem.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.IO.Compression.FileSystem.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_E31DB11D2BA64930BBAB95E69D1A099C" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_C67DA394422F5927664B4F5D40B66A64" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_C67DA394422F5927664B4F5D40B66A64" + { + "Name" = "8:System.Numerics.Vectors.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.Numerics.Vectors.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_E31DB11D2BA64930BBAB95E69D1A099C" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DE34EA7F69E9468ED2359C26A753AE38" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:System.IO.Compression, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_DE34EA7F69E9468ED2359C26A753AE38" + { + "Name" = "8:System.IO.Compression.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.IO.Compression.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_E31DB11D2BA64930BBAB95E69D1A099C" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } } "FileType" { @@ -604,15 +1197,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:Metadata Translator" - "ProductCode" = "8:{01D7B887-BCC7-4729-9C57-BAE151B6CCC5}" - "PackageCode" = "8:{9915492B-B895-4603-BD96-A379AFDD7089}" + "ProductCode" = "8:{B6113405-F39B-4074-ACFE-79AB32CC2CFA}" + "PackageCode" = "8:{FB893543-9B0F-4DD8-8470-D4FEF396FAE2}" "UpgradeCode" = "8:{67E5697C-787F-4F4D-A7B8-C0C2CB4392DD}" "AspNetVersion" = "8:4.0.30319.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:FALSE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:TRUE" - "ProductVersion" = "8:1.0.0" + "ProductVersion" = "8:1.2.0" "Manufacturer" = "8:Analysis Services Samples" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" @@ -1124,9 +1717,37 @@ } "ProjectOutput" { + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_2CE91AB829584CF99B8C35A6E138B5FF" + { + "SourcePath" = "8:..\\MTCmd\\obj\\Debug\\MTCmd.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_E31DB11D2BA64930BBAB95E69D1A099C" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{0B0EA3E1-79CC-4674-A763-9C40925DEE31}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_5EE4AF833E364CBAB977AFCB8CD5E99D" { - "SourcePath" = "8:..\\Metadata Translator\\obj\\Release\\Metadata Translator.exe" + "SourcePath" = "8:..\\Metadata Translator\\obj\\Debug\\Metadata Translator.exe" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_E31DB11D2BA64930BBAB95E69D1A099C" diff --git a/MetadataTranslator/Metadata Translator.sln b/MetadataTranslator/Metadata Translator.sln index 7d467cf..cbd52ea 100644 --- a/MetadataTranslator/Metadata Translator.sln +++ b/MetadataTranslator/Metadata Translator.sln @@ -12,6 +12,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution README.md = README.md EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MTCmd", "MTCmd\MTCmd.csproj", "{0B0EA3E1-79CC-4674-A763-9C40925DEE31}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -24,6 +26,10 @@ Global {CB7D493C-B67E-4438-B304-EFE5D418ADDF}.Release|Any CPU.Build.0 = Release|Any CPU {FC353DA7-B669-4EDF-B465-CB9827C7F035}.Debug|Any CPU.ActiveCfg = Debug {FC353DA7-B669-4EDF-B465-CB9827C7F035}.Release|Any CPU.ActiveCfg = Release + {0B0EA3E1-79CC-4674-A763-9C40925DEE31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0B0EA3E1-79CC-4674-A763-9C40925DEE31}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0B0EA3E1-79CC-4674-A763-9C40925DEE31}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0B0EA3E1-79CC-4674-A763-9C40925DEE31}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/MetadataTranslator/Metadata Translator/Data/DataModel.cs b/MetadataTranslator/Metadata Translator/Data/DataModel.cs index 48df831..c4ce4cd 100644 --- a/MetadataTranslator/Metadata Translator/Data/DataModel.cs +++ b/MetadataTranslator/Metadata Translator/Data/DataModel.cs @@ -200,6 +200,62 @@ namespace Metadata_Translator } } + /// + /// Marks the languages in the list of supported lanuages as selected and model default. + /// + public void InitializeLanguages() + { + if (this.CultureNames?.Count > 0) + { + /// First the model culture. + /// + SetLanguageFlags(this.CultureNames[0], true, true); + + /// Then all others + /// + for (int i = 1; i < this.CultureNames.Count; i++) + { + SetLanguageFlags(this.CultureNames[i], true, false); + } + } + } + + /// + /// Marks a language specified by lcid as selected and as model default. + /// + /// + /// + /// + public bool SetLanguageFlags(string lcid, bool isSelected, bool isModelDefault = false) + { + if (lcid.Equals(DefaultCulture, StringComparison.InvariantCultureIgnoreCase) && isModelDefault == false) + { + return false; + } + + Language language = this.SupportedLanguages.Where(x => x.LanguageTag.Equals(lcid)).FirstOrDefault(); + if (language != null) + { + language.IsSelected = isSelected; + language.IsModelDefault = isModelDefault; + return true; + } + else + { + return false; + } + } + + /// + /// Gets the Language object based on the lcid (i.e. LanguageTag). + /// + /// + /// + public Language GetLanguageByLcid(string lcid) + { + return this.SupportedLanguages.Where(x => x.LanguageTag.Equals(lcid)).FirstOrDefault(); + } + /// /// Creates a new ExpandoObject for a source string (displayString). /// diff --git a/MetadataTranslator/Metadata Translator/Documentation/Images/MT command-line app.png b/MetadataTranslator/Metadata Translator/Documentation/Images/MT command-line app.png new file mode 100644 index 0000000000000000000000000000000000000000..6160b19d6b3cb8811e514bb215387aaf4f082730 GIT binary patch literal 30975 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 z > During the import operation, Metadata Translators first expects a full match of the default strings including their ordering. If the ordering is different, Metadata Translators switches to case-sensitive string matching. Any strings that don’t have an exact match are ignored and the corresponding cells remain empty in the translation grid. - - -## Applying translations to a dataset +## Applying translations to a dataset Metadata Translator detects the default language and all translations in the dataset and reads corresponding the captions, descriptions, and display folder names on startup. As you work with the translation grid, add or remove cultures, perform machine translations, or import translated strings, the changes only affect the data in Metadata Translator. To apply the changes to the dataset, click on the Apply button in the toolbar, and then save the .pbix file in Power BI Desktop to persist the changes. @@ -98,10 +96,40 @@ Metadata Translator can also connect to data models hosted in SQL Server Analysi > You must provide the full connection string. This is especially important to keep in mind when connecting to a dataset in the Power BI service. The connection string that Power BI displays on the dataset settings page does not include the Data Source property name. It is an incomplete connection string, such as *powerbi://api.powerbi.com/v1.0/myorg/AdventureWorksSource;initial catalog=AdventureWorks*. Make sure to add "Data Source=" in front of it. The screenshot above shows the full connection string: *data source=powerbi://api.powerbi.com/v1.0/myorg/AdventureWorksSource;initial catalog=AdventureWorks*. -# Additional features +## Command-line operations -Metadata Translator v1.1 does not support editing the default language strings because the external tools integration feature of Power BI Desktop does not support these operations yet. +Metadata Translator supports command-line operations through a thin console application called MTCmd.exe so that you can import and export translations in an automated way. You can find MTCmd.exe in the Metadata Translator installation folder. Run MTCmd /? to display available command-line options and operations, as in the following screenshot. -It is planned to add support for command-line import and export operations so that translations can be automated. +![Metadata Translator command-line app](https://github.com/microsoft/Analysis-Services/blob/master/MetadataTranslator/Metadata%20Translator/Documentation/Images/MT%20command-line%20app.png) + +### Connecting to a dataset + +In order to connect to a dataset hosted in SQL Server Analysis Services, Azure Analysis Services, or the Power BI service, you must specify the full connection string by using the --connection-string parameter (or -cs). See also the previous "*Connecting to an online dataset*" section. The --connection-string parameter is mandatory for all export and import operations. + +### Exporting translations + +To export existing translations from a dataset, you must specify full path to an export folder by using the --export-folder (-ef) parameter. For example, the following command exports all translations from an AdventureWorks dataset hosted in Power BI into a folder called ExportedTranslations: + +`MTCmd -cs "powerbi://api.powerbi.com/v1.0/myorg/AdventureWorksSource;initial catalog=AdventureWorks" -ef C:\ExportedTranslations` + +> Note +> +> The specified export folder must exist prior to running the command-line app. MTCmd.exe does not create the export folder. However, if any files exist in the export folder, MTCmd.exe might overwrite them without warning. MTCmd.exe exports each culture into a separate .csv file based on the locale identifier (LCID). + +### Importing translations + +To import translations from a .csv file, you must specify full path to the import file by using the --import-file (-if) parameter. The file name must correspond to the locale identifier (LCID) of the target language. You must also specify the --mode (-m) parameter. Valid options are Import or Overwrite. Import applies translations for strings that have not been translated yet in the dataset. Overwrite, as the name implies, overwrites any existing translations in the dataset. Both, Import and Overwrite create new translations if you import a locale that does not yet exist in the dataset. + +The following command imports German translations from a .csv file called de-DE.csv into an AdventureWorks dataset hosted in Power BI, overwriting any existing German strings in the dataset: + +`MTCmd -cs "powerbi://api.powerbi.com/v1.0/myorg/AdventureWorksSource;initial catalog=AdventureWorks" -if C:\Translations\de-DE.csv -m Overwrite` + +> Note +> +> MTCmd.exe only imports one translation file at a time. To import multiple languages, run MTCmd.exe in a loop. + +## Additional features + +Metadata Translator v1.2 does not support editing the default language strings because the external tools integration feature of Power BI Desktop does not support these operations yet. For additional feature requests, create a new item under [Issues](https://github.com/microsoft/Analysis-Services/issues). diff --git a/MetadataTranslator/Metadata Translator/Properties/AssemblyInfo.cs b/MetadataTranslator/Metadata Translator/Properties/AssemblyInfo.cs index 982401d..a261f9d 100644 --- a/MetadataTranslator/Metadata Translator/Properties/AssemblyInfo.cs +++ b/MetadataTranslator/Metadata Translator/Properties/AssemblyInfo.cs @@ -51,5 +51,5 @@ using System.Windows; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.1.0.0")] -[assembly: AssemblyFileVersion("1.1.0.0")] +[assembly: AssemblyVersion("1.2.0.0")] +[assembly: AssemblyFileVersion("1.2.0.0")] diff --git a/MetadataTranslator/Metadata Translator/UI/MainWindow.xaml.cs b/MetadataTranslator/Metadata Translator/UI/MainWindow.xaml.cs index 716acd3..3bbcaa1 100644 --- a/MetadataTranslator/Metadata Translator/UI/MainWindow.xaml.cs +++ b/MetadataTranslator/Metadata Translator/UI/MainWindow.xaml.cs @@ -58,7 +58,7 @@ namespace Metadata_Translator public void AddColumn(string lcid) { - Language language = GetLanguageByLcid(lcid); + Language language = DataModel.GetLanguageByLcid(lcid); if (language != null) { dataGrid.Columns.Add(new DataGridTextColumn @@ -201,7 +201,7 @@ namespace Metadata_Translator objectHeaderStyle.Setters.Add(new Setter(ToolTipService.ToolTipProperty, FindResource("DefaultCultureColumnHeaderToolTip").ToString())); - Language defaultLang = GetLanguageByLcid(cultures[0]); + Language defaultLang = DataModel.GetLanguageByLcid(cultures[0]); dataGrid.Columns.Add(new DataGridTextColumn { Header = $"{defaultLang.DisplayName}*", @@ -210,7 +210,7 @@ namespace Metadata_Translator IsReadOnly = true, CellStyle = defaultLangColumnStyle }); - SetLanguageFlags(cultures[0], true, true); + DataModel.SetLanguageFlags(cultures[0], true, true); /// Add the remaining languages that already exist in the data model @@ -225,32 +225,6 @@ namespace Metadata_Translator dataGrid.ItemsSource = DataModel.Captions; } - /// - /// Marks a language specified by lcid as selected and as model default. - /// - /// - /// - /// - private void SetLanguageFlags(string lcid, bool isSelected, bool isModelDefault = false) - { - Language language = Languages.Where(x => x.LanguageTag.Equals(lcid)).FirstOrDefault(); - if (language != null) - { - language.IsSelected = isSelected; - language.IsModelDefault = isModelDefault; - } - } - - /// - /// Gets the Language object based on the lcid (i.e. LanguageTag). - /// - /// - /// - private Language GetLanguageByLcid(string lcid) - { - return Languages.Where(x => x.LanguageTag.Equals(lcid)).FirstOrDefault(); - } - /// /// Get a handle to the main window object so that other user controls can /// access the public properties of the main window object directly.