/**************************************************************************** ** ** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt VS Tools. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ using System; using System.Collections.Generic; using System.IO; using System.Linq; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.VCProjectEngine; namespace QtVsTools { using Core; using QtMsBuild; /// /// Run Qt translation tools by invoking the corresponding Qt/MSBuild targets /// public static class Translation { 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, project, vcFiles.Select(vcFile => vcFile?.RelativePath)); } 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; foreach (var project in HelperFunctions.ProjectsInSolution(solution.DTE)) RunlRelease(project); } public static void RunlUpdate(VCFile vcFile) { ThreadHelper.ThrowIfNotOnUIThread(); var vcProj = vcFile.project as VCProject; var project = vcProj?.Object as EnvDTE.Project; RunTranslationTarget(BuildAction.Update, project, new[] { vcFile.RelativePath }); } 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, project, vcFiles.Select(vcFile => vcFile?.RelativePath)); } public static void RunlUpdate(EnvDTE.Project project) { ThreadHelper.ThrowIfNotOnUIThread(); RunTranslationTarget(BuildAction.Update, project); } internal enum BuildAction { Update, Release } static void RunTranslationTarget( BuildAction buildAction, EnvDTE.Project project, IEnumerable selectedFiles = null) { ThreadHelper.ThrowIfNotOnUIThread(); using (WaitDialog.Start( "Qt Visual Studio Tools", "Running translation tool...")) { var qtPro = QtProject.Create(project); if (project == null || qtPro == null) { Messages.Print( "translation: Error accessing project interface"); return; } if (qtPro.FormatVersion < Resources.qtMinFormatVersion_Settings) { Messages.Print("translation: Legacy project format"); try { Legacy.Translation.Run(buildAction, qtPro, selectedFiles); } catch (Exception exception) { exception.Log(); } return; } var activeConfig = project.ConfigurationManager?.ActiveConfiguration; if (activeConfig == null) { Messages.Print( "translation: Error accessing build interface"); return; } var activeConfigId = string.Format("{0}|{1}", activeConfig.ConfigurationName, activeConfig.PlatformName); var target = "QtTranslation"; var properties = new Dictionary(); switch (buildAction) { case BuildAction.Update: properties["QtTranslationForceUpdate"] = "true"; break; case BuildAction.Release: properties["QtTranslationForceRelease"] = "true"; break; } if (selectedFiles != null) properties["SelectedFiles"] = string.Join(";", selectedFiles); QtProjectBuild.StartBuild( project, project.FullName, activeConfigId, properties, new[] { target }); } } public static void RunlUpdate(EnvDTE.Solution solution) { ThreadHelper.ThrowIfNotOnUIThread(); if (solution == null) return; foreach (var project in HelperFunctions.ProjectsInSolution(solution.DTE)) RunlUpdate(project); } public static bool ToolsAvailable(EnvDTE.Project project) { if (project == null) return false; if (QtProject.GetPropertyValue(project, "ApplicationType") == "Linux") return true; 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")); } } }