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); }
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(); }