public Dictionary <string, XliffTranslationFiles> GetXliffFilesPerLocale()
        {
            var files = new Dictionary <string, XliffTranslationFiles>();

            foreach (var document in xlfDocuments)
            {
                string xliffFilePath = XliffFileHelpers.GetRelativeFilePathTo(baseDirectory, document.FileName);
                string plainFileName = XliffFileHelpers.GetPlainFileName(baseDirectory, xliffFilePath);

                foreach (var xlfFile in document.Files)
                {
                    string storageLocation = XliffFileHelpers.GetStorageLocation(plainFileName, xlfFile.Original);
                    string locale          = XliffFileHelpers.ExtractLocaleFromFileName(xliffFilePath);

                    if (!files.TryGetValue(storageLocation, out XliffTranslationFiles translationFiles))
                    {
                        translationFiles = new XliffTranslationFiles(storageLocation);
                        files.Add(storageLocation, translationFiles);
                    }

                    translationFiles.AddXliffFile(locale, xlfFile);
                }
            }

            return(files);
        }
Esempio n. 2
0
        public void Export()
        {
            xliffDocumentProvider.LoadXlfDocuments();
            ReportFileLoadErrors();
            Dictionary <string, XliffTranslationFiles> xliffFiles = xliffDocumentProvider.GetXliffFilesPerLocale();

            IEnumerable <IGrouping <string, StringResource> > groupedStorageLocations = resourceStrings.GroupBy(t => t.StorageLocation);

            foreach (var grouping in groupedStorageLocations)
            {
                IEnumerable <string> missingLocales;
                if (xliffFiles.TryGetValue(grouping.Key, out XliffTranslationFiles translationFiles))
                {
                    missingLocales = localesToExport.Where(t => !translationFiles.AvailableLocales.Contains(t));
                }
                else
                {
                    translationFiles = new XliffTranslationFiles(grouping.Key);
                    xliffFiles.Add(grouping.Key, translationFiles);
                    missingLocales = localesToExport;
                }

                if (!translationFiles.TryGetXliffFileForLocale(InvariantLanguage, out XlfFile invariantFile))
                {
                    if (grouping.Key.Contains("\\"))
                    {
                        int index = grouping.Key.LastIndexOf("\\");
                        if ((index < 0) || (index + 1 == grouping.Key.Length))
                        {
                            continue;
                        }

                        string originalFileName = grouping.Key.Substring(grouping.Key.LastIndexOf("\\") + 1);
                        if (originalFileName.Length == 0)
                        {
                            continue;
                        }

                        invariantFile = CreateXliffFile(grouping.Key, InvariantLanguage, originalFileName, "plaintext", projectLocale);
                        translationFiles.AddXliffFile(InvariantLanguage, invariantFile);
                    }
                }

                foreach (var missingLocale in missingLocales)
                {
                    var xlfFile = CreateXliffFile(grouping.Key, missingLocale, invariantFile);
                    translationFiles.AddXliffFile(missingLocale, xlfFile);
                }

                foreach (var stringResource in grouping)
                {
                    foreach (var locale in stringResource.GetLocales())
                    {
                        if (!localesToExport.Contains(locale))
                        {
                            continue;
                        }

                        if (!translationFiles.TryGetXliffFileForLocale(locale, out XlfFile xlfFile))
                        {
                            continue;
                        }

                        if (xlfFile.TryGetTransUnit(stringResource.Name, XlfDialect.Standard, out XlfTransUnit transUnit))
                        {
                            transUnit.Target = stringResource.GetLocaleText(locale);
                        }
                        else
                        {
                            string source;
                            if (invariantFile.TryGetTransUnit(stringResource.Name, XlfDialect.Standard, out XlfTransUnit invariantTransUnit))
                            {
                                source = invariantTransUnit.Source;
                            }
                            else if (stringResource.IsLocalePresent(InvariantLanguage))
                            {
                                source = stringResource.GetLocaleText(InvariantLanguage);
                            }
                            else
                            {
                                continue;
                            }

                            xlfFile.AddTransUnit(stringResource.Name, source, stringResource.GetLocaleText(locale), XlfFile.AddMode.FailIfExists, XlfDialect.Standard);
                        }
                    }
                }
            }

            xliffDocumentProvider.SaveDocuments(localesToExport);
            ReportFileSaveStatus();
        }