예제 #1
0
        public virtual void Save(string fileName, ResourceBundle resourceBundle)
        {
            var    baseFileInfo = new FileInfo(fileName);
            string basePath     = baseFileInfo.DirectoryName ?? string.Empty;

            // if extension of input file is not .resx and an xslt file to convert an xml into valid resx exists, then use it
            // else consider that the input file is .resx already
            string xsltFile = string.Empty;

            if (!string.Equals(baseFileInfo.Extension, ".resx", StringComparison.InvariantCultureIgnoreCase))
            {
                var xsltFullPath = Path.Combine(basePath, xsltConvertFromResx);
                xsltFile = FileSystem.FileExists(xsltFullPath) ? xsltFullPath : null;
            }

            var extractCultureFromFile = new ResxExtractCultureFromFileStrategy();

            // remove culture information from base file name
            // (eg. if MyFile.en.resx then remove en and keep MyFile..resx)
            string baseName           = baseFileInfo.Name;
            var    cultureOfInputFile = extractCultureFromFile.GetCulture(baseFileInfo.Name);

            if (cultureOfInputFile != ResourceSet.NeutralCulture)
            {
                // if input file contains culture information, then remove it
                baseName = extractCultureFromFile.ReplaceCulture(baseName, string.Empty);
            }

            // remove extension from the base file name
            baseName = Path.GetFileNameWithoutExtension(baseName);

            // remove any trailing dots from the base file name
            // (this can happen if base file name was containing culture name which
            // was removed a few lines above)
            baseName = baseName.TrimEnd('.');

            // create a array instead of enumerating original collection,
            // since the code bellow may delete items from the that collection and would break the foreach process
            var resourceSets = resourceBundle.ToArray();

            foreach (var resourceSet in resourceSets)
            {
                string culture = resourceSet.Culture == ResourceSet.NeutralCulture ? string.Empty : "." + resourceSet.Culture;
                string resourceSetFullFileName = Path.Combine(basePath, baseName + culture + baseFileInfo.Extension);
                switch (resourceSet.Status)
                {
                case ResourceSetStatus.Deleted:
                    // delete file from disk
                    File.Delete(resourceSetFullFileName);

                    // remove from collection
                    resourceBundle.Remove(resourceSet);
                    break;

                case ResourceSetStatus.New:
                case ResourceSetStatus.Updated:
                    // save to resource file
                    ResourceSet2Resx(resourceSet, resourceSetFullFileName, xsltFile);
                    break;
                }
            }
        }
예제 #2
0
        public virtual ResourceBundle Load(string fileName)
        {
            var baseFileInfo = new FileInfo(fileName);
            var basePath     = baseFileInfo.DirectoryName ?? string.Empty;

            // if extension of input file is not .resx and an xslt file to convert an xml into valid resx exists, then use it
            // else consider that the input file is .resx already
            string xsltFile = string.Empty;

            if (!string.Equals(baseFileInfo.Extension, ".resx", StringComparison.InvariantCultureIgnoreCase))
            {
                var xsltFullPath = Path.Combine(basePath, xsltConvertToResx);
                xsltFile = FileSystem.FileExists(xsltFullPath) ? xsltFullPath : null;
            }

            var extractCultureFromFile = new ResxExtractCultureFromFileStrategy();

            // define the search patterh (eg. MyFile.*.resx) that will be used to detect files of
            // other cultures, given the input file
            string searchPattern      = fileName;
            var    cultureOfInputFile = extractCultureFromFile.GetCulture(baseFileInfo.Name);

            if (cultureOfInputFile != ResourceSet.NeutralCulture)
            {
                // if input file contains culture information, then remove it
                searchPattern = extractCultureFromFile.ReplaceCulture(searchPattern, string.Empty);
                baseFileInfo  = new FileInfo(searchPattern);
            }

            // put a wildcard before the extension
            searchPattern = Path.GetFileNameWithoutExtension(searchPattern) + "*" + baseFileInfo.Extension;

            var resourceBundle = new ResourceBundle();

            foreach (string file in this.FileSystem.GetFiles(basePath, searchPattern, SearchOption.TopDirectoryOnly))
            {
                try
                {
                    if (baseFileInfo.FullName == extractCultureFromFile.ReplaceCulture(file, string.Empty))
                    {
                        var culture = extractCultureFromFile.GetCulture(file);

                        // If neutral culture was detected for the second time, we are skipping the file
                        // There are two reasons that this can happen:
                        // a) The ResxExtractCultureFromFileStrategy failed to detect a know culture the file name and returned neutral
                        // b) File name is not part of the same resource bundle but happens to have similar name that pas the same prefix and .resx extension
                        // eg. our main file name could be MyFile.resx and this file name could be MyFile.Version2.resx
                        if (culture == ResourceSet.NeutralCulture && resourceBundle.ContainsCulture(culture))
                        {
                            continue;
                        }

                        var resourceSet = new ResourceSet(culture);
                        Resx2ResourceSet(resourceSet, file, xsltFile);
                        resourceBundle.Add(resourceSet);
                    }
                }
                catch (Exception ex)
                {
                    throw new InvalidOperationException(string.Format("Failed to open file '{0}'", file), ex);
                }
            }

            return(resourceBundle);
        }