| | |
| | | /****************************************************************************
|
| | | **
|
| | | ** Copyright (C) 2016 The Qt Company Ltd.
|
| | | ** Copyright (C) 2022 The Qt Company Ltd.
|
| | | ** Contact: https://www.qt.io/licensing/
|
| | | **
|
| | | ** This file is part of the Qt VS Tools.
|
| | |
| | | **
|
| | | ****************************************************************************/
|
| | |
|
| | | using Microsoft.VisualStudio;
|
| | | using Microsoft.VisualStudio.Shell.Interop;
|
| | | using Microsoft.VisualStudio.VCProjectEngine;
|
| | | using QtVsTools.Core;
|
| | | using QtVsTools.VisualStudio;
|
| | | using System;
|
| | | using System.Collections.Generic;
|
| | | using System.Diagnostics;
|
| | | using System.IO;
|
| | | using System.Linq;
|
| | | using System.Text;
|
| | | using System.Threading;
|
| | | using System.Threading.Tasks;
|
| | | using System.Windows.Forms;
|
| | | using Microsoft.VisualStudio.Shell;
|
| | | using Microsoft.VisualStudio.VCProjectEngine;
|
| | |
|
| | | namespace QtVsTools
|
| | | {
|
| | | using static Core.HelperFunctions;
|
| | | using Core;
|
| | | using QtMsBuild;
|
| | |
|
| | | /// <summary>
|
| | |
| | | /// </summary>
|
| | | public static class Translation
|
| | | {
|
| | | public static void RunlRelease(VCFile vcFile)
|
| | | {
|
| | | var vcProj = vcFile.project as VCProject;
|
| | | var project = vcProj?.Object as EnvDTE.Project;
|
| | | RunTranslationTarget(BuildAction.Release,
|
| | | project, new[] { vcFile.RelativePath });
|
| | | }
|
| | |
|
| | | public static void RunlRelease(VCFile[] vcFiles)
|
| | | {
|
| | | ThreadHelper.ThrowIfNotOnUIThread();
|
| | |
|
| | | var vcProj = vcFiles.FirstOrDefault()?.project as VCProject;
|
| | | var project = vcProj?.Object as EnvDTE.Project;
|
| | | RunTranslationTarget(BuildAction.Release,
|
| | |
| | |
|
| | | public static void RunlRelease(EnvDTE.Project project)
|
| | | {
|
| | | ThreadHelper.ThrowIfNotOnUIThread();
|
| | | RunTranslationTarget(BuildAction.Release, project);
|
| | | }
|
| | |
|
| | | public static void RunlRelease(EnvDTE.Solution solution)
|
| | | {
|
| | | ThreadHelper.ThrowIfNotOnUIThread();
|
| | |
|
| | | if (solution == null)
|
| | | return;
|
| | |
|
| | |
| | |
|
| | | public static void RunlUpdate(VCFile vcFile)
|
| | | {
|
| | | ThreadHelper.ThrowIfNotOnUIThread();
|
| | |
|
| | | var vcProj = vcFile.project as VCProject;
|
| | | var project = vcProj?.Object as EnvDTE.Project;
|
| | | RunTranslationTarget(BuildAction.Update,
|
| | |
| | |
|
| | | public static void RunlUpdate(VCFile[] vcFiles)
|
| | | {
|
| | | ThreadHelper.ThrowIfNotOnUIThread();
|
| | |
|
| | | var vcProj = vcFiles.FirstOrDefault()?.project as VCProject;
|
| | | var project = vcProj?.Object as EnvDTE.Project;
|
| | | RunTranslationTarget(BuildAction.Update,
|
| | |
| | |
|
| | | public static void RunlUpdate(EnvDTE.Project project)
|
| | | {
|
| | | ThreadHelper.ThrowIfNotOnUIThread();
|
| | | RunTranslationTarget(BuildAction.Update, project);
|
| | | }
|
| | |
|
| | | enum BuildAction { Update, Release }
|
| | | internal enum BuildAction { Update, Release }
|
| | |
|
| | | static void RunTranslationTarget(
|
| | | BuildAction buildAction,
|
| | | EnvDTE.Project project,
|
| | | IEnumerable<string> selectedFiles = null)
|
| | | {
|
| | | ThreadHelper.ThrowIfNotOnUIThread();
|
| | |
|
| | | using (WaitDialog.Start(
|
| | | "Qt Visual Studio Tools", "Running translation tool...")) {
|
| | |
|
| | |
| | | if (qtPro.FormatVersion < Resources.qtMinFormatVersion_Settings) {
|
| | | Messages.Print("translation: Legacy project format");
|
| | | try {
|
| | | Legacy_RunTranslation(buildAction, qtPro, selectedFiles);
|
| | | } catch (Exception e) {
|
| | | Messages.Print(
|
| | | e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace);
|
| | | Legacy.Translation.Run(buildAction, qtPro, selectedFiles);
|
| | | } catch (Exception exception) {
|
| | | exception.Log();
|
| | | }
|
| | | return;
|
| | | }
|
| | |
| | | if (selectedFiles != null)
|
| | | properties["SelectedFiles"] = string.Join(";", selectedFiles);
|
| | |
|
| | | QtProjectBuild.StartBuild(project, activeConfigId, properties, new[] { target });
|
| | | QtProjectBuild.StartBuild(
|
| | | project, project.FullName, activeConfigId, properties, new[] { target });
|
| | | }
|
| | | }
|
| | |
|
| | | public static void RunlUpdate(EnvDTE.Solution solution)
|
| | | {
|
| | | ThreadHelper.ThrowIfNotOnUIThread();
|
| | |
|
| | | if (solution == null)
|
| | | return;
|
| | |
|
| | |
| | | RunlUpdate(project);
|
| | | }
|
| | |
|
| | | static void Legacy_RunTranslation(
|
| | | BuildAction buildAction,
|
| | | QtProject qtProject,
|
| | | IEnumerable<string> tsFiles)
|
| | | {
|
| | | if (tsFiles == null) {
|
| | | tsFiles = (qtProject.VCProject
|
| | | .GetFilesEndingWith(".ts") as IVCCollection)
|
| | | .Cast<VCFile>()
|
| | | .Select(vcFile => vcFile.RelativePath);
|
| | | if (tsFiles == null) {
|
| | | Messages.Print("translation: no translation files found");
|
| | | return;
|
| | | }
|
| | | }
|
| | | string tempFile = null;
|
| | | foreach (var file in tsFiles.Where(file => file != null))
|
| | | Legacy_RunTranslation(buildAction, qtProject, file, ref tempFile);
|
| | | }
|
| | |
|
| | | static void Legacy_RunTranslation(
|
| | | BuildAction buildAction,
|
| | | QtProject qtProject,
|
| | | string tsFile,
|
| | | ref string tempFile)
|
| | | {
|
| | | var qtVersion = qtProject.GetQtVersion();
|
| | | var qtInstallPath = QtVersionManager.The().GetInstallPath(qtVersion);
|
| | | if (string.IsNullOrEmpty(qtInstallPath)) {
|
| | | Messages.Print("translation: Error accessing Qt installation");
|
| | | return;
|
| | | }
|
| | |
|
| | | var procInfo = new ProcessStartInfo
|
| | | {
|
| | | WorkingDirectory = qtProject.ProjectDir,
|
| | | CreateNoWindow = true,
|
| | | UseShellExecute = false,
|
| | | RedirectStandardError = true,
|
| | | RedirectStandardOutput = true,
|
| | | Arguments = ""
|
| | | };
|
| | | switch (buildAction) {
|
| | | case BuildAction.Update:
|
| | | Messages.Print("\r\n--- (lupdate) file: " + tsFile);
|
| | | procInfo.FileName = Path.Combine(qtInstallPath, "bin", "lupdate.exe");
|
| | | var options = QtVSIPSettings.GetLUpdateOptions();
|
| | | if (!string.IsNullOrEmpty(options))
|
| | | procInfo.Arguments += options + " ";
|
| | | if (tempFile == null) {
|
| | | var inputFiles = GetProjectFiles(qtProject.Project, FilesToList.FL_HFiles)
|
| | | .Union(GetProjectFiles(qtProject.Project, FilesToList.FL_CppFiles))
|
| | | .Union(GetProjectFiles(qtProject.Project, FilesToList.FL_UiFiles))
|
| | | .Union(GetProjectFiles(qtProject.Project, FilesToList.FL_QmlFiles));
|
| | | tempFile = Path.GetTempFileName();
|
| | | File.WriteAllLines(tempFile, inputFiles);
|
| | | }
|
| | | procInfo.Arguments += string.Format("\"@{0}\" -ts \"{1}\"", tempFile, tsFile);
|
| | | break;
|
| | | case BuildAction.Release:
|
| | | Messages.Print("\r\n--- (lrelease) file: " + tsFile);
|
| | | procInfo.FileName = Path.Combine(qtInstallPath, "bin", "lrelease.exe");
|
| | | options = QtVSIPSettings.GetLReleaseOptions();
|
| | | if (!string.IsNullOrEmpty(options))
|
| | | procInfo.Arguments += options + " ";
|
| | | procInfo.Arguments += string.Format("\"{0}\"", tsFile);
|
| | | break;
|
| | | }
|
| | | using (var proc = Process.Start(procInfo)) {
|
| | | proc.OutputDataReceived += (object sender, DataReceivedEventArgs e) =>
|
| | | {
|
| | | if (!string.IsNullOrEmpty(e.Data))
|
| | | Messages.Print(e.Data);
|
| | | };
|
| | | proc.ErrorDataReceived += (object sender, DataReceivedEventArgs e) =>
|
| | | {
|
| | | if (!string.IsNullOrEmpty(e.Data))
|
| | | Messages.Print(e.Data);
|
| | | };
|
| | | proc.BeginOutputReadLine();
|
| | | proc.BeginErrorReadLine();
|
| | | proc.WaitForExit();
|
| | | switch (proc.ExitCode) {
|
| | | case 0:
|
| | | Messages.Print("translation: ok");
|
| | | break;
|
| | | default:
|
| | | Messages.Print(string.Format("translation: ERROR {0}", proc.ExitCode));
|
| | | break;
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | public static void CreateNewTranslationFile(EnvDTE.Project project)
|
| | | public static bool ToolsAvailable(EnvDTE.Project project)
|
| | | {
|
| | | if (project == null)
|
| | | return;
|
| | | return false;
|
| | | if (QtProject.GetPropertyValue(project, "ApplicationType") == "Linux")
|
| | | return true;
|
| | |
|
| | | using (var transDlg = new AddTranslationDialog(project)) {
|
| | | if (transDlg.ShowDialog() == DialogResult.OK) {
|
| | | try {
|
| | | var qtPro = QtProject.Create(project);
|
| | | var file = qtPro.AddFileInFilter(Filters.TranslationFiles(),
|
| | | transDlg.TranslationFile, true);
|
| | | RunlUpdate(file);
|
| | | } catch (QtVSException e) {
|
| | | Messages.DisplayErrorMessage(e.Message);
|
| | | } catch (System.Exception ex) {
|
| | | Messages.DisplayErrorMessage(ex.Message);
|
| | | }
|
| | | }
|
| | | var qtToolsPath = QtProject.GetPropertyValue(project, "QtToolsPath");
|
| | | if (string.IsNullOrEmpty(qtToolsPath)) {
|
| | | var qtVersion = QtVersionManager.The().GetProjectQtVersion(project);
|
| | | var qtInstallPath = QtVersionManager.The().GetInstallPath(qtVersion);
|
| | | if (string.IsNullOrEmpty(qtInstallPath))
|
| | | return false;
|
| | | qtToolsPath = Path.Combine(qtInstallPath, "bin");
|
| | | }
|
| | | return File.Exists(Path.Combine(qtToolsPath, "lupdate.exe"))
|
| | | && File.Exists(Path.Combine(qtToolsPath, "lrelease.exe"));
|
| | | }
|
| | | }
|
| | | }
|