Ejemplo n.º 1
0
        /// <summary>
        /// Функция, предназначенная для распарсивания файла 'tmx'
        /// Translation Memory Exchange Format — Обмен памятью переводов
        /// </summary>
        /// <param name="fs">Поток tmx-файла миграции</param>
        public void Load(FileStream fs)
        {
            try
            {
                _logger.WriteLn("Распарсивание tmx-файла");
                //var tempFileName = Path.GetTempFileName();
                //fs.Seek(0, SeekOrigin.Begin);
                //fs.CopyTo(System.IO.File.Open(tempFileName, FileMode.Open));
                var tempFileName = tWriter.CopyFile(fs);
                var d            = XDocument.Load(tempFileName);
                var srclang      = d.Root.Element("header").Attribute("srclang");
                var body         = d.Root.Element("body");
                var ns_xml       = body.GetNamespaceOfPrefix("xml");
                foreach (var tu in body.Elements("tu"))
                {
                    Hashtable ht        = new Hashtable();
                    Guid?     newTermId = null;

                    foreach (var tuv in tu.Elements("tuv"))
                    {
                        var lang  = tuv.Attribute(ns_xml + "lang").Value;
                        var trans = tuv.Element("seg").Value;

                        tWriter.AppendTable(ht, lang, trans);
                        //newTermId = tWriter.AddTranslationSubstring(lang, ht, newTermId, memoryId, (Guid)memory.id_file);

                        try
                        {
                            TranslationSubstring termString =
                                tWriter.AddTranslationSubstring(lang, ht, newTermId, memoryId, (Guid)memory.id_file);
                            if (termString != null)
                            {
                                newTermId = ts.AddAsync(termString).Result;
                                gsr.AddTranslationMemoriesStrings((Guid)memoryId, (Guid)newTermId);
                                //newTermId = glossaryRep.AddNewTermAsync(memoryId, termString, null).Result;
                            }
                        }
                        catch (Exception exc)
                        {
                            _logger.WriteLn("ERROR: Перевод [" + trans + "] на язык [" + lang + "] " + exc.Message, exc);
                        }
                    }

                    foreach (var lang in ht.Keys)
                    {
                        tWriter.AddTranslation(lang, newTermId, ht);
                    }
                }


                System.IO.File.Delete(tempFileName);
                _logger.WriteLn("tmx-файл успешно распарсен");
            }
            catch (Exception ex)
            {
                _loggerError.WriteLn($"Ошибка в {typeof(TmxReader)}.{nameof(Load)}", ex);
            }
        }
Ejemplo n.º 2
0
        public async Task <bool> UploadAsync(File file, IEnumerable <Locale> locales)
        {
            var sqlString = this._insertFileSql + " RETURNING id";

            using (var connection = new NpgsqlConnection(connectionString))
            {
                connection.Open();
                using (IDbTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted))
                {
                    try
                    {
                        this.LogQuery(sqlString, file.GetType(), file);
                        var insertedId = await connection.ExecuteScalarAsync <Guid?>(sqlString, file, transaction);

                        if (!insertedId.HasValue)
                        {
                            this._loggerError.WriteLn("Не удалось загрузить файл в базу");
                            transaction.Rollback();
                            return(false);
                        }

                        file.id = insertedId.Value;

                        if (file.is_folder)
                        {
                            /*Логирование*/
                            _action.AddAddFileActionAsync(file, file.id, WorkTypes.AddFile);
                            /**/
                            transaction.Commit();
                            return(true);
                        }


                        var translationSubstrings      = new Parser().Parse(file);
                        var translationSubstringsCount = translationSubstrings.Count;
                        var n = translationSubstringsCount;
                        foreach (var translationSubstring in translationSubstrings)
                        {
                            this.LogQuery(sqlString, translationSubstring.GetType(), translationSubstring);
                            //n -= await connection.ExecuteAsync(sqlString, translationSubstring, transaction);
                            //var idOfInsertedRow = await connection.ExecuteScalarAsync<int>(sqlString, translationSubstring, transaction);

                            var idOfInsertedRow = _tsr.AddAsync(translationSubstring, connection, transaction);
                            if (idOfInsertedRow != null)
                            {
                                n--;
                                //Мапим языки
                                List <Guid> newLoc = new List <Guid>();
                                foreach (var lc in locales)
                                {
                                    newLoc.Add(lc.id);
                                }

                                // _tsr.AddTranslationLocalesAsync(idOfInsertedRow, newLoc);
                                _tsr.AddTranslationLocalesTransactAsync(idOfInsertedRow, newLoc, connection, transaction);
                            }
                        }

                        if (n == 0)
                        {
                            //TODO word_count
                            file.strings_count = translationSubstringsCount;
                            sqlString          = "UPDATE files SET strings_count = @Strings_Count WHERE id = @Id";
                            this.LogQuery(sqlString, file.GetType(), file);
                            await connection.ExecuteAsync(sqlString, file, transaction);
                        }

                        transaction.Commit();
                        return(n == 0);
                    }
                    catch (NpgsqlException exception)
                    {
                        this._loggerError.WriteLn(
                            $"Ошибка в {nameof(FilesRepository)}.{nameof(FilesRepository.UploadAsync)} {nameof(NpgsqlException)} ",
                            exception);
                        transaction.Rollback();
                        return(false);
                    }
                    catch (ParserException exception)
                    {
                        this._loggerError.WriteLn("Ошибка в блоке распарсивания: ", exception);
                        //здесь фронтенд создает новый объект Parser и с помощью функции UseAllParsers получает Dictonary со всевозможными вариантами распарсивания
                        //ошибка возникает (пока) только в двух случаях: файл имеет неподдерживаемое системой расширение или внутри него не обнаружено строк для перевода
                        transaction.Rollback();
                        throw;
                    }
                    catch (Exception exception)
                    {
                        this._loggerError.WriteLn(
                            $"Ошибка в {nameof(FilesRepository)}.{nameof(FilesRepository.UploadAsync)} {nameof(Exception)} ",
                            exception);
                        transaction.Rollback();
                        return(false);
                    }
                }
            }
        }