private void doTakeSnapshot(
            InMemoryTranslationSnapshot imss,
            Project project,
            IGridEditableData fileGroup,
            IEnumerable <string> languageCodes,
            BackgroundWorker bw)
        {
            //var fgi = fileGroup.GetFileByLanguageCode(Project, languageCode);

            var table = new DataProcessing(fileGroup).GetDataTableFromResxFiles(project, true);

            var lcs = new List <string>(languageCodes);

            for (var i = 0; i < lcs.Count; i++)
            {
                lcs[i] = lcs[i].ToLowerInvariant();
            }

            var rowIndex = 0;

            foreach (DataRow row in table.Rows)
            {
                if (rowIndex % 25 == 0 && (bw?.CancellationPending ?? false))
                {
                    throw new OperationCanceledException();
                }

                var dic = new Dictionary <string, string>();

                for (var sourceColumnIndex = 2;
                     sourceColumnIndex <
                     table.Columns.Count - 1; // Subtract 1, because last column is ALWAYS the comment.
                     ++sourceColumnIndex)
                {
                    var languageValue = row[sourceColumnIndex] as string;
                    var languageCode  =
                        ExcelExportController.IsFileName(table.Columns[sourceColumnIndex].ColumnName)
                            ? new LanguageCodeDetection(project)
                        .DetectLanguageCodeFromFileName(
                            fileGroup.ParentSettings,
                            table.Columns[sourceColumnIndex].ColumnName)
                            : table.Columns[sourceColumnIndex].ColumnName;
                    languageCode = languageCode.ToLowerInvariant();

                    if (lcs.Contains(languageCode))
                    {
                        dic[languageCode] = languageValue;
                    }
                }

                imss.AddBatchTranslation(dic);

                rowIndex++;
            }
        }
        public InMemoryTranslationSnapshot CreateSnapshot(
            Project project,
            string[] languageCodes,
            BackgroundWorker bw)
        {
            var imss = new InMemoryTranslationSnapshot();

            project.FileGroups.ForEach(fg => doTakeSnapshot(imss, project, fg, languageCodes, bw));

            return(imss);
        }