Ejemplo n.º 1
0
        /// <summary>
        /// Initializes list of ResX items
        /// </summary>
        private Dictionary <string, ResXProjectItem> InitResxItems(string[] targetFiles, Project containingProject)
        {
            Dictionary <string, ResXProjectItem> d = new Dictionary <string, ResXProjectItem>();

            for (int i = 0; i < targetFiles.Length; i++)
            {
                ProjectItem pitem = Agent.GetDTE().Solution.FindProjectItem(targetFiles[i]);
                d.Add(targetFiles[i], ResXProjectItem.ConvertToResXItem(pitem, containingProject));
            }

            return(d);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Loads data from specified ResX file
        /// </summary>
        public override void LoadFile(string path)
        {
            base.LoadFile(path);

            ResXResourceReader reader = null;

            try {
                // initialize corresponding project item instance
                ProjectItem item = VisualLocalizerPackage.Instance.DTE.Solution.FindProjectItem(FileName);
                ProjectItem = ResXProjectItem.ConvertToResXItem(item, item.ContainingProject);

                Dictionary <string, ResXDataNode> data = new Dictionary <string, ResXDataNode>();

                reader = new ResXResourceReader(path);
                reader.UseResXDataNodes = true;
                reader.BasePath         = Path.GetDirectoryName(path);

                foreach (DictionaryEntry pair in reader)
                {
                    data.Add(pair.Key.ToString(), pair.Value as ResXDataNode);
                }

                // display data in GUI
                UIControl.SetData(data);

                VLOutputWindow.VisualLocalizerPane.WriteLine("Opened file \"{0}\"", path);
            } catch (Exception ex) {
                VLOutputWindow.VisualLocalizerPane.WriteException(ex);
                VisualLocalizer.Library.Components.MessageBox.ShowException(ex);
                throw;
            } finally {
                if (reader != null)
                {
                    reader.Close();
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Returns list of ResX files in given project and all referenced projects
        /// </summary>
        /// <param name="project">Base project to search</param>
        /// <param name="includeInternal">True if ResX files with "internal" designer classes should be included in the search</param>
        /// <param name="includeReadonly">True if readonly files should be included in the search</param>
        public static List <ResXProjectItem> GetResXItemsAround(this Project project, bool includeInternal, bool includeReadonly)
        {
            if (project == null)
            {
                throw new ArgumentNullException("project");
            }

            // get files from base project
            List <ProjectItem> items = project.GetFiles(ProjectEx.IsItemResX, true, includeReadonly);

            // convert them to ResX items
            List <ResXProjectItem> resxItems = new List <ResXProjectItem>();

            items.ForEach((i) => {
                ResXProjectItem resxItem = ResXProjectItem.ConvertToResXItem(i, project);
                if (!resxItem.MarkedInternalInReferencedProject || includeInternal)
                {
                    resxItems.Add(resxItem);
                }
            });

            // sort the ResX items
            // - culture-neutral files first
            // - ResX items from base project first (others according to names)
            // - project-default ResX file first (Propertires/Resources.resx)
            // - not-dependant ResX files first (to eliminate Form.cs/Form.resx)
            resxItems.Sort(new Comparison <ResXProjectItem>((a, b) => {
                bool isAneutral = !a.IsCultureSpecific();
                bool isBneutral = !b.IsCultureSpecific();

                bool isAProjectDefault = a.IsProjectDefault(project);
                bool isBProjectDefault = b.IsProjectDefault(project);
                bool isADepOnAny       = a.InternalProjectItem.GetIsDependent();
                bool isBDepOnAny       = b.InternalProjectItem.GetIsDependent();

                if (isAneutral == isBneutral)
                {
                    if (a.InternalProjectItem.ContainingProject == project && b.InternalProjectItem.ContainingProject == project)
                    {
                        if (isAProjectDefault == isBProjectDefault)
                        {
                            if (isADepOnAny == isBDepOnAny)
                            {
                                return(a.InternalProjectItem.Name.CompareTo(b.InternalProjectItem.Name));
                            }
                            else
                            {
                                return(isBDepOnAny ? -1 : 1);
                            }
                        }
                        else
                        {
                            return(isBProjectDefault ? 1 : -1);
                        }
                    }
                    else
                    {
                        if (a.InternalProjectItem.ContainingProject == project)
                        {
                            return(-1);
                        }
                        else if (b.InternalProjectItem.ContainingProject == project)
                        {
                            return(1);
                        }
                        else
                        {
                            return(a.InternalProjectItem.Name.CompareTo(b.InternalProjectItem.Name));
                        }
                    }
                }
                else
                {
                    return(isBneutral ? 1 : -1);
                }
            }));

            // resolve namespace and class of the designer files
            resxItems.ForEach((item) => { item.ResolveNamespaceClass(resxItems); });

            return(resxItems);
        }
        /// <summary>
        /// Add string data from given ResX file to the list of data for translation
        /// </summary>
        private void AddDataForTranslation(GlobalTranslateProjectItem item, List <AbstractTranslateInfoItem> data)
        {
            string path = item.ProjectItem.GetFullPath();

            if (RDTManager.IsFileOpen(path))                              // file is open
            {
                object docData = VLDocumentViewsManager.GetDocData(path); // get document buffer
                if (docData is ResXEditor)                                // document is opened in ResX editor -> use custom method to get string data
                {
                    ResXEditor editor = (ResXEditor)docData;
                    editor.UIControl.AddForTranslation(data);
                }
                else     // document is opened in original VS editor
                {
                    IVsTextLines lines = VLDocumentViewsManager.GetTextLinesForFile(path, false);
                    string       text  = VLDocumentViewsManager.GetTextFrom(lines); // get plain text of ResX file

                    ResXResourceReader reader = null;

                    BufferTranslateInfoItem prev  = null;
                    BufferTranslateInfoItem first = null;

                    try {
                        reader = ResXResourceReader.FromFileContents(text);
                        reader.UseResXDataNodes = true;

                        // add all string resources to the list
                        // items are linked like a linked-list, allowing ApplyTranslation to work
                        foreach (DictionaryEntry entry in reader)
                        {
                            ResXDataNode node = (entry.Value as ResXDataNode);
                            if (node.HasValue <string>())
                            {
                                BufferTranslateInfoItem translateItem = new BufferTranslateInfoItem();
                                translateItem.ResourceKey         = entry.Key.ToString();
                                translateItem.Value               = node.GetValue <string>();
                                translateItem.Filename            = path;
                                translateItem.Applied             = false;
                                translateItem.GlobalTranslateItem = item;
                                translateItem.Prev         = prev;
                                translateItem.IVsTextLines = lines;

                                data.Add(translateItem);
                                prev = translateItem;
                                if (first == null)
                                {
                                    first = translateItem;
                                }
                            }
                            else
                            {
                                item.NonStringData.Add(node);
                            }
                        }
                        if (first != null)
                        {
                            first.Prev = prev;
                        }
                    } finally {
                        if (reader != null)
                        {
                            reader.Close();
                        }
                    }
                }
            }
            else     // file is closed
            {
                ResXProjectItem resxItem = ResXProjectItem.ConvertToResXItem(item.ProjectItem, item.ProjectItem.ContainingProject);
                resxItem.Load();
                loadedResxItems.Add(resxItem);

                // add string data from ResX file
                resxItem.AddAllStringReferencesUnique(data);
            }
        }