private static List <DataRow> getDestinationTableRowsByTagName(
            DataTable table,
            string tagName,
            bool allowCreateNewIfNotFound,
            string languageValueForNewRow,
            int destinationColumnIndex)
        {
            if (string.IsNullOrEmpty(tagName))
            {
                throw new ArgumentException(
                          Resources.ExcelImportController_getDestinationTableRowsByTagName_Reference_tag_name_must_be_provided_but_is_currently_NULL_or_empty_,
                          @"tagName");
            }
            else
            {
                var result = new List <DataRow>();

                // --

                // ReSharper disable LoopCanBeConvertedToQuery
                foreach (DataRow row in table.Rows)
                // ReSharper restore LoopCanBeConvertedToQuery
                {
                    var lk = ConvertHelper.ToString(row[1]); // Column 0=FileGroup checksum, column 1=Tag name.

                    if (string.Compare(lk, tagName, StringComparison.OrdinalIgnoreCase) == 0 &&
                        !FileGroup.IsInternalRow(row))
                    {
                        result.Add(row);
                    }
                }

                // --
                // Create new.

                if (result.Count <= 0 && allowCreateNewIfNotFound)
                {
                    var nr = table.NewRow();
                    nr[0] = string.Empty; // Column 0=FileGroup checksum, column 1=Tag name.
                    nr[1] = tagName;      // Column 0=FileGroup checksum, column 1=Tag name.
                    nr[destinationColumnIndex] = languageValueForNewRow;
                    table.Rows.Add(nr);

                    result.Add(nr);
                }

                // --

                return(result);
            }
        }
        private static List <DataRow> getDestinationTableRowsByReferenceLanguageValue(
            DataTable table,
            string referenceLanguageValue,
            int referenceLanguageDestinationColumnIndex,
            bool allowCreateNewIfNotFound)
        {
            if (string.IsNullOrEmpty(referenceLanguageValue))
            {
                throw new ArgumentException(
                          Resources.SR_CommandProcessorReceive_getTableRows_Reference_language_value,
                          @"referenceLanguageValue");
            }
            else
            {
                var result = new List <DataRow>();

                // --

                // ReSharper disable LoopCanBeConvertedToQuery
                foreach (DataRow row in table.Rows)
                // ReSharper restore LoopCanBeConvertedToQuery
                {
                    var lk = ConvertHelper.ToString(row[referenceLanguageDestinationColumnIndex]);
                    if (string.Compare(lk, referenceLanguageValue, StringComparison.OrdinalIgnoreCase) == 0 &&
                        !FileGroup.IsInternalRow(row))
                    {
                        result.Add(row);
                    }
                }

                // --
                // Create new.

                if (result.Count <= 0 && allowCreateNewIfNotFound)
                {
                    var nr = table.NewRow();
                    nr[0] = string.Empty;                                           // Column 0=FileGroup checksum, column 1=Tag name.
                    nr[1] = StringHelper.GenerateMatchCode(referenceLanguageValue); // Column 0=FileGroup checksum, column 1=Tag name.
                    nr[referenceLanguageDestinationColumnIndex] = referenceLanguageValue;
                    table.Rows.Add(nr);

                    result.Add(nr);
                }

                // --

                return(result);
            }
        }
        /// <summary>
        /// Store the changes in the data table back to the .RESX files
        /// </summary>
        private void saveTable(
            Project project,
            DataTable table,
            bool wantBackupFiles,
            bool omitEmptyStrings)
        {
            var index = 0;
            var languageCodeDetection = new LanguageCodeDetection(_gridEditableData.Project);

            foreach (var resxFile in _resxFiles)
            {
                try
                {
                    var checksum = resxFile.FileInformation.FileGroup.GetChecksum(project);
                    var document = resxFile.Document;
                    var fileName = resxFile.FilePath.Name;

                    //Member 802361: access value by culture and not by filename
                    var culture =
                        languageCodeDetection.DetectLanguageCodeFromFileName(
                            _gridEditableData.Project,
                            fileName);

                    // 2011-04-09, Uwe Keim: "nb" => "nb-NO".
                    var cultureLong = LanguageCodeDetection.MakeValidCulture(culture).Name;

                    foreach (DataRow row in table.Rows)
                    {
                        if (row.RowState != DataRowState.Deleted)
                        {
                            if (!FileGroup.IsInternalRow(row))
                            {
                                var fileGroupCheckSum = ConvertHelper.ToInt64(row[@"FileGroup"]);

                                // 2010-10-23, Uwe Keim: Only save if same file group.
                                if (fileGroupCheckSum == checksum)
                                {
                                    var tagName = (string)row[@"Name"];

                                    var xpathQuery = $@"child::data[attribute::name='{escapeXsltChars(tagName)}']";

                                    if (document.DocumentElement != null)
                                    {
                                        var node  = document.DocumentElement.SelectSingleNode(xpathQuery);
                                        var found = node != null;

                                        var content   = row[cultureLong] as string;
                                        var textToSet = content ?? string.Empty;

                                        var commentsAreVisible =
                                            CommentsAreVisible(project, row, CommentVisibilityScope.InMemory);

                                        // AJ CHANGE
                                        var commentToSet =
                                            commentsAreVisible
                                                ? row[@"Comment"] == DBNull.Value
                                                    ? string.Empty
                                                    : (string)row[@"Comment"]
                                                : null;

                                        if (found)
                                        {
                                            var n = node.SelectSingleNode(@"value");

                                            //CHANGED:  Member 802361 if content is null remove this entry
                                            if (content != null &&
                                                (!string.IsNullOrEmpty(textToSet) || !omitEmptyStrings))
                                            {
                                                // If not present (for whatever reason, e.g.
                                                // manually edited and therefore misformed).
                                                if (n == null)
                                                {
                                                    n = document.CreateElement(@"value");
                                                    node.AppendChild(n);
                                                }

                                                n.InnerText = textToSet;

                                                // AJ CHANGE
                                                // Only write the comment to the main resx file
                                                if (commentsAreVisible)
                                                {
                                                    if (resxFile == _resxFiles[0])
                                                    {
                                                        n = node.SelectSingleNode(@"comment");
                                                        // If not present (for whatever reason, e.g.
                                                        // manually edited and therefore misformed).
                                                        if (n == null)
                                                        {
                                                            n = document.CreateElement(@"comment");
                                                            node.AppendChild(n);
                                                        }

                                                        n.InnerText = commentToSet ?? string.Empty;
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                if (n != null)
                                                {
                                                    node.RemoveChild(n);
                                                }

                                                node.ParentNode?.RemoveChild(node);
                                            }
                                        }
                                        else // Resource doesn't exist in XML.
                                        {
                                            if (content != null &&
                                                (!string.IsNullOrEmpty(textToSet) || !omitEmptyStrings))
                                            {
                                                // Member 802361: only do it if editing single fileGroup.
                                                // If no we don't know where to add the new entry.
                                                // TODO: may be add to default file in the list?
                                                if (_gridEditableData.FileGroup == null)
                                                {
                                                    //look if base file has same tagName
                                                    //if base file skip it
                                                    if (string.Compare(
                                                            _gridEditableData.Project.NeutralLanguageCode,
                                                            culture,
                                                            StringComparison.OrdinalIgnoreCase) == 0 ||
                                                        string.Compare(
                                                            _gridEditableData.Project.NeutralLanguageCode,
                                                            cultureLong,
                                                            StringComparison.OrdinalIgnoreCase) == 0)
                                                    {
                                                        continue;
                                                    }

                                                    // 2011-01-26, Uwe Keim:
                                                    var pattern =
                                                        resxFile.FileInformation.FileGroup.ParentSettings
                                                        .EffectiveNeutralLanguageFileNamePattern;
                                                    pattern =
                                                        pattern.Replace(@"[basename]",
                                                                        resxFile.FileInformation.FileGroup.BaseName);
                                                    pattern =
                                                        pattern.Replace(@"[languagecode]", project.NeutralLanguageCode);
                                                    pattern =
                                                        pattern.Replace(@"[extension]",
                                                                        resxFile.FileInformation.FileGroup.BaseExtension);
                                                    pattern = pattern.Replace(@"[optionaldefaulttypes]",
                                                                              resxFile.FileInformation.FileGroup.BaseOptionalDefaultType);

                                                    //has base culture value?
                                                    var baseName = pattern;

                                                    // 2011-01-26, Uwe Keim:
                                                    var file         = resxFile;
                                                    var baseResxFile =
                                                        _resxFiles.Find(
                                                            resx =>
                                                            resx.FilePath.Name == baseName &&
                                                            resx.FileInformation.FileGroup.UniqueID ==
                                                            file.FileInformation.FileGroup.UniqueID);

                                                    var baseNode =
                                                        baseResxFile?.Document?.DocumentElement
                                                        ?.SelectSingleNode(xpathQuery);
                                                    if (baseNode == null)
                                                    {
                                                        continue;
                                                    }
                                                    //ok we can add it.
                                                }
                                                //TODO: use default instead

                                                //Create the new Node
                                                XmlNode newData  = document.CreateElement(@"data");
                                                var     newName  = document.CreateAttribute(@"name");
                                                var     newSpace = document.CreateAttribute(@"xml:space");
                                                XmlNode newValue = document.CreateElement(@"value");

                                                // Set the Values
                                                newName.Value      = (string)row[@"Name"];
                                                newSpace.Value     = @"preserve";
                                                newValue.InnerText = textToSet;

                                                // Get them together
                                                if (newData.Attributes != null)
                                                {
                                                    newData.Attributes.Append(newName);
                                                    newData.Attributes.Append(newSpace);
                                                }
                                                newData.AppendChild(newValue);

                                                // AJ CHANGE
                                                // Only write the comment to the main resx file
                                                if (commentsAreVisible && index == 0)
                                                {
                                                    XmlNode newComment = document.CreateElement(@"comment");
                                                    newComment.InnerText = commentToSet ?? string.Empty;
                                                    newData.AppendChild(newComment);
                                                }

                                                XmlNode root = document.DocumentElement;
                                                root?.InsertAfter(newData, root.LastChild);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                finally
                {
                    index++;
                }
            }

            if (wantBackupFiles)
            {
                backupFiles();
            }

            // Store files back to filesystem
            storeFiles(project);
        }
Ejemplo n.º 4
0
        private int translateArray(
            string appID,
            ITranslationEngine ti,
            DataTable table,
            string refLanguageCode,
            DataColumn column,
            int refValueIndex,
            string raw,
            BackgroundWorker bw,
            int delayMilliseconds,
            string prefixSuccess,
            bool useExistingTranslations,
            bool useExistingTranslationsOnly,
            InMemoryTranslationSnapshot imss,
            int translationSuccessCount,
            ref int translationErrorCount,
            bool continueOnErrors,
            string prefixError,
            ref int translationCount,
            ref int internallyExistingTranslationTranslatedSuccessCount)
        {
            var items = new List <TranslateItemInfo>();

            // --
            // From GUI to in-memory-list.

            if (column != null)
            {
                foreach (DataRow row in table.Rows)
                {
                    items.Clear();
                    if (row != null)
                    {
                        if (bw.CancellationPending)
                        {
                            throw new OperationCanceledException();
                        }

                        var text = row[column] as string;
                        if (!string.IsNullOrEmpty(text) && text.Trim().Length > 0)
                        {
                            continue;
                        }

                        // http://www.codeproject.com/KB/aspnet/ZetaResourceEditor.aspx?msg=3367544#xx3367544xx
                        if (FileGroup.IsInternalRow(row))
                        {
                            continue;
                        }

                        var sourceText = row[refValueIndex] as string;

                        if (string.IsNullOrEmpty(sourceText))
                        {
                            continue;
                        }

                        items.Add(new TranslateItemInfo {
                            Row = row, SourceText = sourceText
                        });
                    }

                    // --
                    // Pack into blocks.

                    var blocks = new List <List <TranslateItemInfo> >();

                    for (var index = 0; index < items.Count; index++)
                    {
                        if (index % ti.MaxArraySize == 0)
                        {
                            blocks.Add(new List <TranslateItemInfo>());
                        }

                        blocks[blocks.Count - 1].Add(items[index]);
                    }

                    // --
                    // Translate each block in batch.

                    foreach (var block in blocks)
                    {
                        if (block != null)
                        {
                            if (bw.CancellationPending)
                            {
                                throw new OperationCanceledException();
                            }

                            if (delayMilliseconds > 0)
                            {
                                Thread.Sleep(delayMilliseconds);
                            }

                            var sourceTexts = block.Select(itemInfo => itemInfo.SourceText).ToList();

                            try
                            {
                                var sourceLanguageCode = ti.MapCultureToSourceLanguageCode(
                                    appID,
                                    CultureHelper.CreateCultureErrorTolerant(refLanguageCode));
                                var destinationLanguageCode = ti.MapCultureToDestinationLanguageCode(
                                    appID,
                                    CultureHelper.CreateCultureErrorTolerant(raw));

                                if (useExistingTranslations)
                                {
                                    // Alle die nehmen, die schon übersetzt sind. Also quasi "aus Cache".
                                    for (var index = 0; index < sourceTexts.Count; ++index)
                                    {
                                        var dstText = imss?.GetTranslation(refLanguageCode, raw, sourceTexts[index]);
                                        if (dstText != null)
                                        {
                                            block[index].Row[column] = prefixSuccess + dstText;

                                            translationSuccessCount++;
                                            internallyExistingTranslationTranslatedSuccessCount++;

                                            sourceTexts[index] = string.Empty; // Markieren als "erledigt".
                                        }
                                    }
                                }

                                if (!useExistingTranslationsOnly && sourceTexts.Any(s => !string.IsNullOrEmpty(s)))
                                {
                                    var destinationTexts =
                                        ti.TranslateArray(
                                            appID,
                                            sourceTexts.ToArray(),
                                            sourceLanguageCode,
                                            destinationLanguageCode,
                                            _project.TranslationWordsToProtect,
                                            _project.TranslationWordsToRemove);

                                    for (var index = 0; index < block.Count; ++index)
                                    {
                                        if (destinationTexts[index] != null)
                                        {
                                            block[index].Row[column] = prefixSuccess + destinationTexts[index];

                                            // Merken für ggf. nächsten Durchlauf.
                                            if (useExistingTranslations)
                                            {
                                                imss?.AddTranslation(
                                                    refLanguageCode,
                                                    raw,
                                                    sourceTexts[index],
                                                    destinationTexts[index]);
                                            }

                                            translationSuccessCount++;
                                        }
                                    }
                                }
                            }
                            catch (Exception x)
                            {
                                translationErrorCount++;

                                if (continueOnErrors)
                                {
                                    var destinationText = prefixError + x.Message;

                                    foreach (var t in block)
                                    {
                                        if (t?.Row?[column] != null)
                                        {
                                            t.Row[column] = destinationText;
                                        }
                                    }
                                }
                                else
                                {
                                    throw;
                                }
                            }

                            translationCount++;
                        }
                    }
                }
            }

            return(translationSuccessCount);
        }
Ejemplo n.º 5
0
        private int translateSingle(
            string appID,
            ITranslationEngine ti,
            DataTable table,
            string refLanguageCode,
            DataColumn column,
            int refValueIndex,
            string raw,
            BackgroundWorker bw,
            int delayMilliseconds,
            string prefixSuccess,
            bool useExistingTranslations,
            bool useExistingTranslationsOnly,
            InMemoryTranslationSnapshot imss,
            int translationSuccessCount,
            ref int translationErrorCount,
            bool continueOnErrors,
            string prefixError,
            ref int translationCount,
            ref int internallyExistingTranslationTranslatedSuccessCount)
        {
            if (column != null)
            {
                foreach (DataRow row in table.Rows)
                {
                    if (row != null)
                    {
                        if (bw.CancellationPending)
                        {
                            throw new OperationCanceledException();
                        }

                        var text = row[column] as string;
                        if (!string.IsNullOrEmpty(text) && text.Trim().Length > 0)
                        {
                            continue;
                        }

                        // http://www.codeproject.com/KB/aspnet/ZetaResourceEditor.aspx?msg=3367544#xx3367544xx
                        if (FileGroup.IsInternalRow(row))
                        {
                            continue;
                        }

                        var sourceText = row[refValueIndex] as string;

                        if (string.IsNullOrEmpty(sourceText))
                        {
                            continue;
                        }

                        if (delayMilliseconds > 0)
                        {
                            Thread.Sleep(delayMilliseconds);
                        }

                        try
                        {
                            var sourceLanguageCode = ti.MapCultureToSourceLanguageCode(
                                appID,
                                CultureHelper.CreateCultureErrorTolerant(refLanguageCode));
                            var destinationLanguageCode = ti.MapCultureToDestinationLanguageCode(
                                appID,
                                CultureHelper.CreateCultureErrorTolerant(raw));

                            var doIt = true;

                            // Ggf. aus Cache holen.
                            if (useExistingTranslations)
                            {
                                var dstText = imss?.GetTranslation(refLanguageCode, raw, sourceText);
                                if (dstText != null)
                                {
                                    row[column] = dstText;

                                    translationSuccessCount++;
                                    internallyExistingTranslationTranslatedSuccessCount++;

                                    doIt = false;
                                }
                            }

                            if (!useExistingTranslationsOnly && doIt)
                            {
                                var destinationText =
                                    prefixSuccess +
                                    ti.Translate(
                                        appID,
                                        sourceText,
                                        sourceLanguageCode,
                                        destinationLanguageCode,
                                        _project.TranslationWordsToProtect,
                                        _project.TranslationWordsToRemove);

                                row[column] = destinationText;

                                // Merken für ggf. nächsten Durchlauf.
                                if (useExistingTranslations)
                                {
                                    imss?.AddTranslation(refLanguageCode, raw, sourceText, destinationText);
                                }

                                translationSuccessCount++;
                            }
                        }
                        catch (Exception x)
                        {
                            translationErrorCount++;

                            if (continueOnErrors)
                            {
                                var destinationText = prefixError + x.Message;

                                if (row[column] != null)
                                {
                                    row[column] = destinationText;
                                }
                            }
                            else
                            {
                                throw;
                            }
                        }

                        translationCount++;
                    }
                }
            }

            return(translationSuccessCount);
        }
Ejemplo n.º 6
0
 private static bool SkipSavingRow(DataRow row)
 {
     return(row.RowState == DataRowState.Deleted ||
            row.RowState == DataRowState.Unchanged ||
            FileGroup.IsInternalRow(row));
 }
        private static bool wantExportRow(
            SnapshotController ssc,
            PreparedInformation preparedInformation,
            IInheritedSettings settings,
            DataRow row,
            CommentVisibilityScope commentVisibilityScope)
        {
            if (FileGroup.IsCompleteRowEmpty(row) &&
                !preparedInformation.ExportCompletelyEmptyRows ||
                // http://www.codeproject.com/KB/aspnet/ZetaResourceEditor.aspx?msg=3367544#xx3367544xx)
                FileGroup.IsInternalRow(row))
            {
                return(false);
            }

            if (preparedInformation.OnlyExportRowsWithNoTranslation)
            {
                var emptyCount = 0;

                // ReSharper disable LoopCanBeConvertedToQuery
                foreach (DataColumn column in row.Table.Columns)
                // ReSharper restore LoopCanBeConvertedToQuery
                {
                    // Column 0=FileGroup checksum, column 1=Tag name.
                    if (column.Ordinal != 0 && column.Ordinal != 1 && !isCommentColumn(column))
                    {
                        var languageCode =
                            IsFileName(column.ColumnName)
                                ? new LanguageCodeDetection(preparedInformation.Project).DetectLanguageCodeFromFileName(
                                settings,
                                column.ColumnName)
                                : column.ColumnName;

                        if (string.Compare(languageCode, preparedInformation.ReferenceLanguageCode,
                                           StringComparison.OrdinalIgnoreCase) != 0)
                        {
                            if (ConvertHelper.ToString(row[column], string.Empty).Trim().Length <= 0)
                            {
                                emptyCount++;
                            }
                        }
                    }
                }

                if (preparedInformation.Project.EnableExcelExportSnapshots)
                {
                    return(emptyCount > 0 ||
                           preparedInformation.OnlyExportRowsWithChangedTexts &&
                           hasChangedTextSinceLastExport(ssc, preparedInformation, settings, row));
                }
                else
                {
                    return(emptyCount > 0);
                }
            }
            else
            {
                if (preparedInformation.Project.EnableExcelExportSnapshots)
                {
                    return(!preparedInformation.OnlyExportRowsWithChangedTexts ||
                           hasChangedTextSinceLastExport(ssc, preparedInformation, settings, row));
                }
                else
                {
                    return(true);
                }
            }
        }
Ejemplo n.º 8
0
        private int translateArray(
            string appID,
            string appID2,
            ITranslationEngine ti,
            DataTable table,
            string refLanguageCode,
            DataColumn column,
            int refValueIndex,
            string raw,
            BackgroundWorker bw,
            int delayMilliseconds,
            string prefixSuccess,
            int translationSuccessCount,
            ref int translationErrorCount,
            bool continueOnErrors,
            string prefixError,
            ref int translationCount)
        {
            var items = new List <TranslateItemInfo>();

            // --
            // From GUI to in-memory-list.

            if (column != null)
            {
                foreach (DataRow row in table.Rows)
                {
                    items.Clear();
                    if (row != null)
                    {
                        if (bw.CancellationPending)
                        {
                            throw new OperationCanceledException();
                        }

                        var text = row[column] as string;
                        if (!string.IsNullOrEmpty(text) && text.Trim().Length > 0)
                        {
                            continue;
                        }

                        // http://www.codeproject.com/KB/aspnet/ZetaResourceEditor.aspx?msg=3367544#xx3367544xx
                        if (FileGroup.IsInternalRow(row))
                        {
                            continue;
                        }

                        var sourceText =
                            row[refValueIndex] as string;

                        if (string.IsNullOrEmpty(sourceText))
                        {
                            continue;
                        }

                        items.Add(new TranslateItemInfo {
                            Row = row, SourceText = sourceText
                        });
                    }

                    // --
                    // Pack into blocks.

                    var blocks = new List <List <TranslateItemInfo> >();

                    for (var index = 0; index < items.Count; index++)
                    {
                        if (index % ti.MaxArraySize == 0)
                        {
                            blocks.Add(new List <TranslateItemInfo>());
                        }

                        blocks[blocks.Count - 1].Add(items[index]);
                    }

                    // --
                    // Translate each block in batch.

                    foreach (var block in blocks)
                    {
                        if (block != null)
                        {
                            if (bw.CancellationPending)
                            {
                                throw new OperationCanceledException();
                            }
                            if (delayMilliseconds > 0)
                            {
                                Thread.Sleep(delayMilliseconds);
                            }

                            var sourceTexts = new List <string>();
                            foreach (var itemInfo in block)
                            {
                                sourceTexts.Add(itemInfo.SourceText);
                            }

                            try
                            {
                                var destinationTexts =
                                    ti.TranslateArray(
                                        appID,
                                        appID2,
                                        sourceTexts.ToArray(),
                                        ti.MapCultureToSourceLanguageCode(
                                            appID, appID2,
                                            CultureHelper.CreateCultureErrorTolerant(refLanguageCode)),
                                        ti.MapCultureToDestinationLanguageCode(
                                            appID, appID2,
                                            CultureHelper.CreateCultureErrorTolerant(raw)),
                                        _project.TranslationWordsToProtect,
                                        _project.TranslationWordsToRemove);

                                for (var index = 0; index < block.Count; ++index)
                                {
                                    block[index].Row[column] = prefixSuccess + destinationTexts[index];

                                    translationSuccessCount++;
                                }
                            }
                            catch (Exception x)
                            {
                                translationErrorCount++;

                                if (continueOnErrors)
                                {
                                    var destinationText =
                                        prefixError +
                                        x.Message;

                                    foreach (var t in block)
                                    {
                                        if (t != null && t.Row != null && t.Row[column] != null)
                                        {
                                            t.Row[column] = destinationText;
                                        }
                                    }
                                }
                                else
                                {
                                    throw;
                                }
                            }

                            translationCount++;
                        }
                    }
                }
            }

            return(translationSuccessCount);
        }
Ejemplo n.º 9
0
        private int translateSingle(
            string appID,
            string appID2,
            ITranslationEngine ti,
            DataTable table,
            string refLanguageCode,
            DataColumn column,
            int refValueIndex,
            string raw,
            BackgroundWorker bw,
            int delayMilliseconds,
            string prefixSuccess,
            int translationSuccessCount,
            ref int translationErrorCount,
            bool continueOnErrors,
            string prefixError,
            ref int translationCount)
        {
            if (column != null)
            {
                foreach (DataRow row in table.Rows)
                {
                    if (row != null)
                    {
                        if (bw.CancellationPending)
                        {
                            throw new OperationCanceledException();
                        }

                        var text = row[column] as string;
                        if (!string.IsNullOrEmpty(text) && text.Trim().Length > 0)
                        {
                            continue;
                        }

                        // http://www.codeproject.com/KB/aspnet/ZetaResourceEditor.aspx?msg=3367544#xx3367544xx
                        if (FileGroup.IsInternalRow(row))
                        {
                            continue;
                        }

                        var sourceText =
                            row[refValueIndex] as string;

                        if (string.IsNullOrEmpty(sourceText))
                        {
                            continue;
                        }

                        if (delayMilliseconds > 0)
                        {
                            Thread.Sleep(delayMilliseconds);
                        }

                        try
                        {
                            var destinationText =
                                prefixSuccess +
                                ti.Translate(
                                    appID, appID2,
                                    sourceText,
                                    ti.MapCultureToSourceLanguageCode(
                                        appID, appID2,
                                        CultureHelper.CreateCultureErrorTolerant(refLanguageCode)),
                                    ti.MapCultureToDestinationLanguageCode(
                                        appID, appID2,
                                        CultureHelper.CreateCultureErrorTolerant(raw)),
                                    _project.TranslationWordsToProtect,
                                    _project.TranslationWordsToRemove);

                            row[column] = destinationText;

                            translationSuccessCount++;
                        }
                        catch (Exception x)
                        {
                            translationErrorCount++;

                            if (continueOnErrors)
                            {
                                var destinationText = prefixError + x.Message;

                                if (row[column] != null)
                                {
                                    row[column] = destinationText;
                                }
                            }
                            else
                            {
                                throw;
                            }
                        }

                        translationCount++;
                    }
                }
            }
            return(translationSuccessCount);
        }