/// <summary> /// Execute. /// </summary> /// <returns></returns> public override bool Execute() { AssignedFiles = new ITaskItem[Files.Length]; CultureNeutralAssignedFiles = new ITaskItem[Files.Length]; var cultureList = new List <ITaskItem>(); var noCultureList = new List <ITaskItem>(); bool retValue = true; for (int i = 0; i < Files.Length; ++i) { try { AssignedFiles[i] = new TaskItem(Files[i]); string dependentUpon = AssignedFiles[i].GetMetadata(ItemMetadataNames.dependentUpon); Culture.ItemCultureInfo info = Culture.GetItemCultureInfo ( AssignedFiles[i].ItemSpec, dependentUpon ); if (!string.IsNullOrEmpty(info.culture)) { AssignedFiles[i].SetMetadata("Culture", info.culture); AssignedFiles[i].SetMetadata("WithCulture", "true"); cultureList.Add(AssignedFiles[i]); } else { noCultureList.Add(AssignedFiles[i]); AssignedFiles[i].SetMetadata("WithCulture", "false"); } CultureNeutralAssignedFiles[i] = new TaskItem(AssignedFiles[i]) { ItemSpec = info.cultureNeutralFilename }; Log.LogMessageFromResources ( MessageImportance.Low, "AssignCulture.Comment", AssignedFiles[i].GetMetadata("Culture"), AssignedFiles[i].ItemSpec ); } catch (ArgumentException e) { Log.LogErrorWithCodeFromResources("AssignCulture.CannotExtractCulture", Files[i].ItemSpec, e.Message); retValue = false; } #if DEBUG catch (Exception e) { Debug.Assert(false, "Unexpected exception in AssignCulture.Execute. " + "Please log a MSBuild bug specifying the steps to reproduce the problem. " + e.Message); throw; } #endif } AssignedFilesWithCulture = cultureList.ToArray(); AssignedFilesWithNoCulture = noCultureList.ToArray(); return(retValue); }
/// <summary> /// Utility function for creating a C#-style manifest name from /// a resource name. Note that this function attempts to emulate the /// Everret implementation of this code which can be found by searching for /// ComputeNonWFCResourceName() or ComputeWFCResourceName() in /// \vsproject\langproj\langbldmgrsite.cpp /// </summary> /// <param name="fileName">The file name of the dependent (usually a .resx)</param> /// <param name="linkFileName">The file name of the dependent (usually a .resx)</param> /// <param name="rootNamespace">The root namespace (usually from the project file). May be null</param> /// <param name="prependCultureAsDirectory">should the culture name be prepended to the manifest name as a path</param> /// <param name="dependentUponFileName">The file name of the parent of this dependency (usually a .cs file). May be null</param> /// <param name="culture">The override culture of this resource, if any</param> /// <param name="binaryStream">File contents binary stream, may be null</param> /// <param name="log">Task's TaskLoggingHelper, for logging warnings or errors</param> /// <returns>Returns the manifest name</returns> internal static string CreateManifestNameImpl ( string fileName, string linkFileName, bool prependCultureAsDirectory, // true by default string rootNamespace, // May be null string dependentUponFileName, // May be null string culture, // may be null Stream binaryStream, // File contents binary stream, may be null TaskLoggingHelper log ) { // Use the link file name if there is one, otherwise, fall back to file name. string embeddedFileName = FileUtilities.FixFilePath(linkFileName); if (string.IsNullOrEmpty(embeddedFileName)) { embeddedFileName = FileUtilities.FixFilePath(fileName); } dependentUponFileName = FileUtilities.FixFilePath(dependentUponFileName); Culture.ItemCultureInfo info = Culture.GetItemCultureInfo(embeddedFileName, dependentUponFileName); // If the item has a culture override, respect that. if (!String.IsNullOrEmpty(culture)) { info.culture = culture; } var manifestName = new StringBuilder(); if (binaryStream != null) { // Resource depends on a form. Now, get the form's class name fully // qualified with a namespace. ExtractedClassName result = CSharpParserUtilities.GetFirstClassNameFullyQualified(binaryStream); if (result.IsInsideConditionalBlock) { log?.LogWarningWithCodeFromResources("CreateManifestResourceName.DefinitionFoundWithinConditionalDirective", dependentUponFileName, embeddedFileName); } if (!string.IsNullOrEmpty(result.Name)) { manifestName.Append(result.Name); // Append the culture if there is one. if (!string.IsNullOrEmpty(info.culture)) { manifestName.Append(".").Append(info.culture); } } } // If there's no manifest name at this point, then fall back to using the // RootNamespace+Filename_with_slashes_converted_to_dots if (manifestName.Length == 0) { // If Rootnamespace was null, then it wasn't set from the project resourceFile. // Empty namespaces are allowed. if (!string.IsNullOrEmpty(rootNamespace)) { manifestName.Append(rootNamespace).Append("."); } // Replace spaces in the directory name with underscores. Needed for compatibility with Everett. // Note that spaces in the file name itself are preserved. string everettCompatibleDirectoryName = MakeValidEverettIdentifier(Path.GetDirectoryName(info.cultureNeutralFilename)); // only strip extension for .resx and .restext files string sourceExtension = Path.GetExtension(info.cultureNeutralFilename); if ( (0 == String.Compare(sourceExtension, ".resx", StringComparison.OrdinalIgnoreCase)) || (0 == String.Compare(sourceExtension, ".restext", StringComparison.OrdinalIgnoreCase)) || (0 == String.Compare(sourceExtension, ".resources", StringComparison.OrdinalIgnoreCase)) ) { manifestName.Append(Path.Combine(everettCompatibleDirectoryName, Path.GetFileNameWithoutExtension(info.cultureNeutralFilename))); // Replace all '\' with '.' manifestName.Replace(Path.DirectorySeparatorChar, '.'); manifestName.Replace(Path.AltDirectorySeparatorChar, '.'); // Append the culture if there is one. if (!string.IsNullOrEmpty(info.culture)) { manifestName.Append(".").Append(info.culture); } // If the original extension was .resources, add it back if (String.Equals(sourceExtension, ".resources", StringComparison.OrdinalIgnoreCase)) { manifestName.Append(sourceExtension); } } else { manifestName.Append(Path.Combine(everettCompatibleDirectoryName, Path.GetFileName(info.cultureNeutralFilename))); // Replace all '\' with '.' manifestName.Replace(Path.DirectorySeparatorChar, '.'); manifestName.Replace(Path.AltDirectorySeparatorChar, '.'); if (prependCultureAsDirectory) { // Prepend the culture as a subdirectory if there is one. if (!string.IsNullOrEmpty(info.culture)) { manifestName.Insert(0, Path.DirectorySeparatorChar); manifestName.Insert(0, info.culture); } } } } return(manifestName.ToString()); }