public async Task AddTermAsync(Guid glossaryId, [FromBody] TranslationSubstring newTerm, [FromQuery] Guid?partOfSpeechId) { await this._glossaryService .AddNewTermAsync( glossaryId : glossaryId, newTerm : newTerm, partOfSpeechId : partOfSpeechId); }
/// <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); } }
public async Task <ActionResult <TranslationSubstring> > GetStringById(Guid id) { TranslationSubstring foundedString = await stringRepository.GetByIDAsync(id); if (foundedString == null) { return(BadRequest("String not found")); } return(Ok(foundedString)); }
public async Task UpdateTermAsync( Guid glossaryId, Guid termId, [FromBody] TranslationSubstring updatedTerm, [FromQuery] Guid?partOfSpeechId) { updatedTerm.id = termId; await this._glossaryService .UpdateTermAsync( glossaryId : glossaryId, updatedTerm : updatedTerm, partOfSpeechId : partOfSpeechId); }
public async Task UpdateTermAsync(Guid glossaryId, TranslationSubstring updatedTerm, Guid?partOfSpeechId) { try { await this._glossaryRepository.UpdateTermAsync( glossaryId : glossaryId, updatedTerm : updatedTerm, partOfSpeechId : partOfSpeechId); } catch (Exception exception) { throw new Exception(WriteLn(exception.Message, exception), exception); } }
public TranslationSubstring AddTranslationSubstring(string lang, Hashtable ht, Guid?newTermId, Guid glossaryId, Guid idFile) { if (lang.Equals(_localDefault)) { TranslationSubstring newTerm = new TranslationSubstring(ht[_localDefault].ToString(), null, idFile, null, 0); //newTermId = glossaryRep.AddNewTermAsync(glossaryId, newTerm, null).Result; // newTermId = ts.AddAsync(newTerm).Result; return(newTerm); } return(null); }
public async Task UpdateTermAsync(Guid glossaryId, TranslationSubstring updatedTerm, Guid?partOfSpeechId) { try { using (var dbConnection = new NpgsqlConnection(connectionString)) { var updateTermSql = "UPDATE translation_substrings SET " + "substring_to_translate=@substring_to_translate, " + "description=@description, " + "context=@context, " + "translation_max_length=@translation_max_length, " + "id_file_owner=@id_file_owner, " + "value=@value, " + "position_in_text=@position_in_text " + "WHERE id=@id"; var updateTermParam = updatedTerm; this.LogQuery(updateTermSql, updatedTerm.GetType(), updateTermParam); await dbConnection.ExecuteAsync( sql : updateTermSql, param : updateTermParam); var updateTermPartOfSpeechIdSql = "UPDATE glossaries_strings SET " + "id_part_of_speech=@PartOfSpeechId " + "WHERE id_string=@StringId "; // + //"AND id_glossary=@GlossaryId"; var updateTermPartOfSpeechIdParam = new { GlossaryId = glossaryId, StringId = updatedTerm.id, PartOfSpeechId = partOfSpeechId }; this.LogQuery(updateTermPartOfSpeechIdSql, updateTermPartOfSpeechIdParam); await dbConnection.ExecuteAsync( sql : updateTermPartOfSpeechIdSql, param : updateTermPartOfSpeechIdParam); } } catch (NpgsqlException exception) { this._loggerError.WriteLn( $"Ошибка в {nameof(GlossaryRepository)}.{nameof(GlossaryRepository.UpdateTermAsync)} {nameof(NpgsqlException)} ", exception); // return null; } catch (Exception exception) { this._loggerError.WriteLn( $"Ошибка в {nameof(GlossaryRepository)}.{nameof(GlossaryRepository.UpdateTermAsync)} {nameof(Exception)} ", exception); // return 0; } }
public async Task AddNewTermAsync(Guid glossaryId, TranslationSubstring newTerm, Guid?partOfSpeechId) { var newTermId = await this._glossaryRepository.AddNewTermAsync( glossaryId : glossaryId, newTerm : newTerm, partOfSpeechId : partOfSpeechId); var glossaryLocales = await this._glossaryRepository.GetTranslationLocalesAsync(glossaryId : glossaryId); try { //TODO переделать под одну транзакуцию await this._stringsRepository.AddTranslationLocalesAsync( translationSubstringId : (Guid)newTermId, localesIds : glossaryLocales.Select(locale => locale.id)); } catch (Exception exception) { throw new Exception(WriteLn(exception.Message, exception), exception); } }
public async Task <ActionResult <IEnumerable <SimilarTranslation> > > FindSimilarTranslations(Guid currentProjectId, Guid localeId, [FromBody] TranslationSubstring translationSubstring) { var identityName = User.Identity.Name; Guid userId = (Guid)userRepository.GetID(identityName); var similarTranslations = await translationRepository.GetSimilarTranslationsAsync(currentProjectId, localeId, translationSubstring, userId); return(Ok(similarTranslations)); }
/// <summary> /// Функция, предназначенная для распарсивания файла 'tbx'? /// Termbase Exchange format — Обмен терминологическими базами /// </summary> /// <param name="fs">Поток tbx-файла миграции</param> public void Load(FileStream fs) { try { _logger.WriteLn("Распарсивание tbx-файла"); var tempFileName = tWriter.CopyFile(fs); var d = XDocument.Load(tempFileName); var ns = d.Root.GetNamespaceOfPrefix("xml"); foreach (var text in d.Root.Elements("text")) { foreach (var termEntry in text.Element("body").Elements("termEntry")) { Hashtable ht = new Hashtable(); Guid? newTermId = null; foreach (var langSet in termEntry.Elements("langSet")) { string lang = langSet.Attribute(ns + "lang").Value; string term = langSet.Element("tig").Element("term").Value; //ok, now it's all about where to write gathered data tWriter.AppendTable(ht, lang, term); TranslationSubstring termString = tWriter.AddTranslationSubstring(lang, ht, newTermId, glossaryId, (Guid)glossaries.ID_File); if (termString != null) { newTermId = glossaryRep.AddNewTermAsync(glossaryId, termString, null).Result; } } foreach (var lang in ht.Keys) { tWriter.AddTranslation(lang, newTermId, ht); } // break; } } _logger.WriteLn("tbx-файл успешно распарсен"); System.IO.File.Delete(tempFileName); /* * * * INSERT INTO public.translation_substrings_locales * (id_translation_substrings, id_locale) * select id_string, id_locale * from ( * select distinct t.id_string as id_string, id_locale * FROM public.translations as t) as tt * * * * * INSERT INTO public.files_locales * (id_file, id_locale,percent_of_confirmed, percent_of_translation) * select 'd297766a-8d17-46f4-b8fc-be7e9165c66b', f. id_locale, 0,0 * from (select distinct id_locale as id_locale * FROM public.translations) as f * * */ } catch (Exception ex) { _loggerError.WriteLn($"Ошибка в {typeof(TbxReader)}.{nameof(Load)}", ex); } }
/// <summary> /// Метод получения схожих вариантов перевода в проекте локализации /// </summary> /// <param name="currentProjectId">id проекта в котором происходит поиск</param> /// <param name="translationSubstring">фраза для которой происходит поиск совпадений</param> /// <returns></returns> public async Task <IEnumerable <SimilarTranslation> > GetSimilarTranslationsAsync(Guid currentProjectId, Guid localeId, TranslationSubstring translationSubstring, Guid userId) { //TODO полный запрос, тут загвозка в том, что память переводов подключаеться из все проектов где работает пользователь, а это не так var query = @"select* from(select substring_to_translate as translation_text, similarity(substring_to_translate, @TranslationSubstringText) as similarity, files.name_text as file_owner_name, translations.translated as translation_variant from localization_projects inner join files on files.id_localization_project = localization_projects.id inner join translation_substrings on translation_substrings.id_file_owner = files.id inner join translations on translations.id_string = translation_substrings.id where (localization_projects.id = @ProjectId and substring_to_translate % @TranslationSubstringText and translation_substrings.id != @TranslationSubstringId and translations.id_locale = @localeId) union select substring_to_translate as translation_text, similarity(substring_to_translate, @TranslationSubstringText) as similarity, tm.name_text as file_owner_name, translations.translated as translation_variant from translation_memories as tm inner join translation_memories_strings as tms on tm.id = tms.id_translation_memory inner join translation_substrings on translation_substrings.id = tms.id_string inner join translations on translations.id_string = translation_substrings.id inner join localization_projects_translation_memories as lptm on tm.id = lptm.id_translation_memory inner join participants as p on lptm.id_localization_project = p.id_localization_project where p.id_user = @UserId and substring_to_translate % @TranslationSubstringText and translation_substrings.id != @TranslationSubstringId and translations.id_locale = @localeId and lptm.id_localization_project = @ProjectId ) as t order by t.similarity desc"; //var query = "SELECT substring_to_translate AS translation_text, similarity(substring_to_translate, @TranslationSubstringText) AS similarity, " + // "files.name_text AS file_owner_name, translations.translated AS translation_variant" + // " FROM localization_projects " + // "INNER JOIN files ON files.id_localization_project = localization_projects.id " + // "INNER JOIN translation_substrings ON translation_substrings.id_file_owner = files.id " + // "INNER JOIN translations ON translations.id_string = translation_substrings.id " + // "WHERE (localization_projects.id = @ProjectId " + // "AND substring_to_translate % @TranslationSubstringText " + // "AND translation_substrings.id != @TranslationSubstringId " + // "AND translations.id_locale = @localeId);"; try { using (var dbConnection = new NpgsqlConnection(connectionString)) { var param = new { TranslationSubstringText = translationSubstring.substring_to_translate, TranslationSubstringId = translationSubstring.id, ProjectId = currentProjectId, localeId, UserId = userId }; this.LogQuery(query, param); IEnumerable <SimilarTranslation> similarTranslations = await dbConnection.QueryAsync <SimilarTranslation>(query, param); return(similarTranslations); } } catch (NpgsqlException exception) { this._loggerError.WriteLn( $"Ошибка в {nameof(TranslationRepository)}.{nameof(TranslationRepository.GetSimilarTranslationsAsync)} {nameof(NpgsqlException)} ", exception); return(null); } catch (Exception exception) { this._loggerError.WriteLn( $"Ошибка в {nameof(TranslationRepository)}.{nameof(TranslationRepository.GetSimilarTranslationsAsync)} {nameof(Exception)} ", exception); return(null); } }
public async Task <Guid?> AddNewTermAsync(Guid glossaryId, TranslationSubstring newTerm, Guid?partOfSpeechId) { var glossary = await this.GetByIDAsync(id : glossaryId); newTerm.id_file_owner = glossary.ID_File; newTerm.word_count = TranslationSubstringRepository.GetWordsCount(newTerm.substring_to_translate); try { using (var dbConnection = new NpgsqlConnection(connectionString)) { var insertNewStingSql = "INSERT INTO translation_substrings " + "(" + "substring_to_translate, " + "description, " + "context_file, " + "translation_max_length, " + "id_file_owner, " + "value, " + "position_in_text, " + "word_count" + ") VALUES " + "(" + "@substring_to_translate, " + "@description, " + "@context_file, " + "@translation_max_length, " + "@id_file_owner, " + "@value, " + "@position_in_text, " + "@word_count" + ") " + "RETURNING id"; var insertNewStingParam = newTerm; this.LogQuery(insertNewStingSql, newTerm.GetType(), insertNewStingParam); var idOfNewTerm = await dbConnection .ExecuteScalarAsync <Guid>( sql : insertNewStingSql, param : insertNewStingParam); var instertGlossaryStringAssotiationSql = "INSERT INTO glossaries_strings (id_glossary, id_string,id_part_of_speech) VALUES (@glossary_id, @string_id, @parts_of_speechId)"; var instertGlossaryStringAssotiationParam = new { glossary_id = glossaryId, string_id = idOfNewTerm, parts_of_speechId = partOfSpeechId }; this.LogQuery(instertGlossaryStringAssotiationSql, instertGlossaryStringAssotiationParam); await dbConnection .ExecuteAsync( sql : instertGlossaryStringAssotiationSql, param : instertGlossaryStringAssotiationParam); return(idOfNewTerm); } } catch (NpgsqlException exception) { this._loggerError.WriteLn( $"Ошибка в {nameof(GlossaryRepository)}.{nameof(GlossaryRepository.AddNewTermAsync)} {nameof(NpgsqlException)} ", exception); return(null); } catch (Exception exception) { this._loggerError.WriteLn( $"Ошибка в {nameof(GlossaryRepository)}.{nameof(GlossaryRepository.AddNewTermAsync)} {nameof(Exception)} ", exception); return(null); } }
public async Task UpdateTranslationSubstring(Guid translationSubstringId, [FromBody] TranslationSubstring updatedTranslationSubstring) { updatedTranslationSubstring.id = translationSubstringId; await this.stringRepository.UpdateAsync(item : updatedTranslationSubstring); }