2018-03-21 18:42:54 -07:00
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Collections.Immutable;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using Microsoft.CodeAnalysis;
|
|
|
|
|
using Microsoft.CodeAnalysis.Diagnostics;
|
|
|
|
|
using Microsoft.CodeAnalysis.MSBuild;
|
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
|
2018-03-21 23:40:40 -07:00
|
|
|
namespace RoslynLocalizeDetector
|
2018-03-21 18:42:54 -07:00
|
|
|
{
|
|
|
|
|
class Program
|
|
|
|
|
{
|
|
|
|
|
static void Main(string[] args)
|
|
|
|
|
{
|
|
|
|
|
// ** Only works if run from VSDev Command prompt **
|
|
|
|
|
//
|
|
|
|
|
//var instances = MSBuildLocator.QueryVisualStudioInstances().ToList();
|
|
|
|
|
//var instanceToUse = instances.First(a => a.Version.Major == 15);
|
|
|
|
|
//Environment.SetEnvironmentVariable("VSINSTALLDIR", instanceToUse.VisualStudioRootPath);
|
|
|
|
|
|
|
|
|
|
Environment.SetEnvironmentVariable("VSINSTALLDIR", @"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community");
|
|
|
|
|
Environment.SetEnvironmentVariable("VisualStudioVersion", "15.0");
|
|
|
|
|
|
|
|
|
|
string matterControlRoot = GetMatterControlDirectory();
|
|
|
|
|
|
|
|
|
|
var properties = new Dictionary<string, string>
|
|
|
|
|
{
|
|
|
|
|
{ "Configuration", "Debug" },
|
|
|
|
|
{"Platform", "AnyCPU" }
|
|
|
|
|
};
|
|
|
|
|
//var workspace = MSBuildWorkspace.Create(properties);
|
|
|
|
|
var workspace = MSBuildWorkspace.Create();
|
|
|
|
|
|
|
|
|
|
workspace.WorkspaceFailed += (s, e) => Console.WriteLine(e.Diagnostic.Message);
|
|
|
|
|
workspace.LoadMetadataForReferencedProjects = true;
|
|
|
|
|
|
|
|
|
|
string solutionPath = Path.GetFullPath(Path.Combine(matterControlRoot, "..", "MatterControl.sln"));
|
|
|
|
|
|
|
|
|
|
Solution solution = workspace.OpenSolutionAsync(solutionPath).Result;
|
|
|
|
|
|
|
|
|
|
var translationStrings = new HashSet<string>();
|
|
|
|
|
|
|
|
|
|
DiagnosticAnalyzer analyzer = new LocalizeDetector((locstring) =>
|
|
|
|
|
{
|
|
|
|
|
// Add detected Localize() strings to translations list
|
|
|
|
|
translationStrings.AddLocalization(locstring);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
ProjectDependencyGraph projectGraph = solution.GetProjectDependencyGraph();
|
|
|
|
|
|
|
|
|
|
// Use Roslyn to find localize calls
|
|
|
|
|
foreach (ProjectId projectId in projectGraph.GetTopologicallySortedProjects())
|
|
|
|
|
{
|
|
|
|
|
var project = solution.GetProject(projectId);
|
|
|
|
|
var compilationWithAnalyzers = project.GetCompilationAsync().Result.WithAnalyzers(ImmutableArray.Create(analyzer));
|
|
|
|
|
var diags = compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync().Result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Push properies.json results into newResults
|
|
|
|
|
string json = File.ReadAllText(Path.Combine(matterControlRoot, "StaticData", "SliceSettings", "Properties.json"));
|
|
|
|
|
foreach (var setting in JsonConvert.DeserializeObject<List<SettingItem>>(json))
|
|
|
|
|
{
|
|
|
|
|
translationStrings.AddLocalization(setting.HelpText);
|
|
|
|
|
translationStrings.AddLocalization(setting.PresentationName);
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(setting.Units))
|
|
|
|
|
{
|
|
|
|
|
translationStrings.AddLocalization(setting.Units);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Push layouts.txt results into newResults
|
|
|
|
|
foreach (var line in File.ReadAllLines(Path.Combine(matterControlRoot, "StaticData", "SliceSettings", "Layouts.txt")).Select(s => s.Trim()))
|
|
|
|
|
{
|
|
|
|
|
var isSliceSettingsKey = line.Contains("_") && !line.Contains(" ");
|
|
|
|
|
if (!isSliceSettingsKey)
|
|
|
|
|
{
|
|
|
|
|
translationStrings.AddLocalization(line);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using (var outstream = new StreamWriter(Path.Combine(matterControlRoot, "StaticData", "Translations", "Master.txt")))
|
|
|
|
|
{
|
|
|
|
|
foreach (var line in translationStrings.OrderBy(x => x).ToArray())
|
|
|
|
|
{
|
|
|
|
|
outstream.WriteLine($"English:{line}");
|
|
|
|
|
outstream.WriteLine($"Translated:{line}");
|
|
|
|
|
outstream.WriteLine("");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//GenerateComparisonData();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static string GetMatterControlDirectory()
|
|
|
|
|
{
|
|
|
|
|
var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory());
|
|
|
|
|
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
currentDirectory = currentDirectory.Parent;
|
|
|
|
|
} while (currentDirectory.Name != "MatterControl");
|
|
|
|
|
|
|
|
|
|
return currentDirectory.FullName;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void GenerateComparisonData(string matterControlRoot)
|
|
|
|
|
{
|
|
|
|
|
string classicFilePath = Path.Combine(matterControlRoot, "StaticData", "Translations", "Master.txt_");
|
|
|
|
|
// Parse classic master.txt, extract English: lines, sort, dump as common master.txt format
|
|
|
|
|
var masterTextLines = File.ReadAllLines(classicFilePath);
|
|
|
|
|
|
|
|
|
|
var classicResults = new HashSet<string>();
|
|
|
|
|
|
|
|
|
|
foreach (var line in masterTextLines)
|
|
|
|
|
{
|
|
|
|
|
if (line.StartsWith("English:"))
|
|
|
|
|
{
|
|
|
|
|
classicResults.Add(line.Substring(line.IndexOf(":") + 1).Trim());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using (var outstream = new StreamWriter(Path.Combine(Path.GetDirectoryName(classicFilePath), "re-mastered.txt")))
|
|
|
|
|
{
|
|
|
|
|
foreach (var line in classicResults.OrderBy(x => x).ToArray())
|
|
|
|
|
{
|
|
|
|
|
outstream.WriteLine($"English:{line}");
|
|
|
|
|
outstream.WriteLine($"Translated:{line}");
|
|
|
|
|
outstream.WriteLine("");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private class SettingItem
|
|
|
|
|
{
|
|
|
|
|
public string PresentationName { get; set; }
|
|
|
|
|
public string HelpText { get; set; }
|
|
|
|
|
public string Units { get; set; }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static class HashsetExtensions
|
|
|
|
|
{
|
|
|
|
|
public static void AddLocalization(this HashSet<string> hashset, string line)
|
|
|
|
|
{
|
|
|
|
|
hashset.Add(line.Replace("\r\n", "\\n").Replace("\n", "\\n"));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|