Try to make it possible to cancel auto-translate faster - thx Siamak :)

This commit is contained in:
Nikolaj Olsson 2024-01-01 12:28:50 +01:00
parent d93b7692a5
commit 1cf0357ad0
15 changed files with 54 additions and 22 deletions

View File

@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Nikse.SubtitleEdit.Core.AutoTranslate
@ -44,7 +45,7 @@ namespace Nikse.SubtitleEdit.Core.AutoTranslate
return ListLanguages();
}
public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode)
public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
var input = "{\"model\": \"gpt-3.5-turbo\",\"messages\": [{ \"role\": \"user\", \"content\": \"Please translate the following text from " + sourceLanguageCode + " to " + targetLanguageCode + ", only write the result: \\n\\n" + Json.EncodeJsonText(text.Trim()) + "\" }]}";
var content = new StringContent(input, Encoding.UTF8);

View File

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Nikse.SubtitleEdit.Core.Common;
using Nikse.SubtitleEdit.Core.Translate;
@ -97,7 +98,7 @@ namespace Nikse.SubtitleEdit.Core.AutoTranslate
return new TranslationPair(name, code, hasFormality);
}
public Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode)
public Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
var postContent = new FormUrlEncodedContent(new[]
{

View File

@ -8,6 +8,7 @@ using System.Net;
using System.Net.Http;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
namespace Nikse.SubtitleEdit.Core.AutoTranslate
@ -44,7 +45,7 @@ namespace Nikse.SubtitleEdit.Core.AutoTranslate
return GoogleTranslationService.GetTranslationPairs();
}
public Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode)
public Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
string jsonResultString;

View File

@ -5,6 +5,7 @@ using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using Nikse.SubtitleEdit.Core.Common;
using Nikse.SubtitleEdit.Core.Http;
@ -45,7 +46,7 @@ namespace Nikse.SubtitleEdit.Core.AutoTranslate
return GoogleTranslationService.GetTranslationPairs();
}
public Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode)
public Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
var format = "text";
var input = new StringBuilder();

View File

@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Nikse.SubtitleEdit.Core.Translate;
@ -38,6 +39,6 @@ namespace Nikse.SubtitleEdit.Core.AutoTranslate
/// <summary>
/// Do translation.
/// </summary>
Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode);
Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken);
}
}

View File

@ -7,6 +7,7 @@ using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Nikse.SubtitleEdit.Core.AutoTranslate
@ -40,7 +41,7 @@ namespace Nikse.SubtitleEdit.Core.AutoTranslate
return ListLanguages();
}
public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode)
public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
var apiKey = string.Empty;
if (!string.IsNullOrEmpty(Configuration.Settings.Tools.AutoTranslateLibreApiKey))

View File

@ -4,6 +4,7 @@ using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Nikse.SubtitleEdit.Core.Common;
using Nikse.SubtitleEdit.Core.Http;
@ -60,7 +61,7 @@ namespace Nikse.SubtitleEdit.Core.AutoTranslate
return GetTranslationPairs();
}
public Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode)
public Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
var url = string.Format(TranslateUrl, sourceLanguageCode, targetLanguageCode);
if (!string.IsNullOrEmpty(_category))

View File

@ -4,6 +4,7 @@ using Nikse.SubtitleEdit.Core.SubtitleFormats;
using Nikse.SubtitleEdit.Core.Translate;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace Nikse.SubtitleEdit.Core.AutoTranslate
@ -200,7 +201,7 @@ namespace Nikse.SubtitleEdit.Core.AutoTranslate
return new TranslationPair(name, code, twoLetterIsoName);
}
public Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode)
public Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
var apiKey = string.Empty;
if (!string.IsNullOrEmpty(Configuration.Settings.Tools.AutoTranslateLibreApiKey))

View File

@ -6,6 +6,7 @@ using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Nikse.SubtitleEdit.Core.AutoTranslate
@ -39,7 +40,7 @@ namespace Nikse.SubtitleEdit.Core.AutoTranslate
return new NoLanguageLeftBehindServe().GetSupportedTargetLanguages();
}
public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode)
public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
var content = new StringContent("{ \"text\": \"" + Json.EncodeJsonText(text) + "\", \"source\": \"" + sourceLanguageCode + "\", \"target\": \"" + targetLanguageCode + "\" }", Encoding.UTF8, "application/json");
var result = _httpClient.PostAsync("translate", content).Result;

View File

@ -7,6 +7,7 @@ using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Nikse.SubtitleEdit.Core.AutoTranslate
@ -40,7 +41,7 @@ namespace Nikse.SubtitleEdit.Core.AutoTranslate
return ListLanguages();
}
public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode)
public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
var list = text.SplitToLines();
var sb = new StringBuilder();

View File

@ -7,6 +7,7 @@ using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Nikse.SubtitleEdit.Core.AutoTranslate
@ -42,7 +43,7 @@ namespace Nikse.SubtitleEdit.Core.AutoTranslate
return ListLanguages();
}
public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode)
public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
var input = "{\"text\": \"" + Json.EncodeJsonText(text.Trim()) + "\", \"source\": \"" + sourceLanguageCode + "\", \"target\": \"" + targetLanguageCode + "\"}";
var content = new StringContent(input, Encoding.UTF8);

View File

@ -7,6 +7,7 @@ using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Nikse.SubtitleEdit.Core.AutoTranslate
@ -40,7 +41,7 @@ namespace Nikse.SubtitleEdit.Core.AutoTranslate
return ListLanguages();
}
public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode)
public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode, CancellationToken cancellationToken)
{
if (sourceLanguageCode == "en")
{

View File

@ -1970,7 +1970,7 @@ namespace Nikse.SubtitleEdit.Forms
while (index < subtitle.Paragraphs.Count && !_abort)
{
Application.DoEvents();
var linesMergedAndTranslated = await MergeAndSplitHelper.MergeAndTranslateIfPossible(subtitle, translatedSubtitle, source, target, index, engine, forceSingleLineMode);
var linesMergedAndTranslated = await MergeAndSplitHelper.MergeAndTranslateIfPossible(subtitle, translatedSubtitle, source, target, index, engine, forceSingleLineMode, CancellationToken.None);
if (linesMergedAndTranslated > 0)
{
index += linesMergedAndTranslated;
@ -1981,7 +1981,7 @@ namespace Nikse.SubtitleEdit.Forms
var f = new Formatting();
var unformattedText = f.SetTagsAndReturnTrimmed(p.Text, source.Code);
var translation = await _autoTranslator.Translate(unformattedText, source.Code, target.Code);
var translation = await _autoTranslator.Translate(unformattedText, source.Code, target.Code, CancellationToken.None);
translation = translation
.Replace("<br />", Environment.NewLine)
.Replace("<br/>", Environment.NewLine);

View File

@ -9,6 +9,7 @@ using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using MessageBox = Nikse.SubtitleEdit.Forms.SeMsgBox.MessageBox;
using Timer = System.Windows.Forms.Timer;
@ -28,6 +29,8 @@ namespace Nikse.SubtitleEdit.Forms.Translate
private int _translationProgressIndex = -1;
private bool _translationProgressDirty = true;
private bool _breakTranslation;
private bool _translationInProgress;
private CancellationTokenSource _cancellationTokenSource;
public AutoTranslate(Subtitle subtitle, Subtitle selectedLines, string title, Encoding encoding)
{
@ -459,7 +462,7 @@ namespace Nikse.SubtitleEdit.Forms.Translate
if (!string.IsNullOrEmpty(Configuration.Settings.Tools.GoogleTranslateLastSourceLanguage) &&
Configuration.Settings.Tools.GoogleTranslateLastTargetLanguage.StartsWith(defaultSourceLanguageCode) &&
sourceLanguages.Any(p=>p.Code == Configuration.Settings.Tools.GoogleTranslateLastSourceLanguage))
sourceLanguages.Any(p => p.Code == Configuration.Settings.Tools.GoogleTranslateLastSourceLanguage))
{
return Configuration.Settings.Tools.GoogleTranslateLastSourceLanguage;
}
@ -565,17 +568,19 @@ namespace Nikse.SubtitleEdit.Forms.Translate
private async void buttonTranslate_Click(object sender, EventArgs e)
{
if (buttonTranslate.Text == LanguageSettings.Current.General.Cancel)
if (_translationInProgress)
{
buttonTranslate.Enabled = false;
_cancellationTokenSource.Cancel();
_breakTranslation = true;
buttonOK.Enabled = true;
buttonCancel.Enabled = true;
_breakTranslation = true;
Application.DoEvents();
buttonOK.Refresh();
return;
}
_translationInProgress = true;
_cancellationTokenSource = new CancellationTokenSource();
_autoTranslator = GetCurrentEngine();
var engineType = _autoTranslator.GetType();
@ -631,7 +636,14 @@ namespace Nikse.SubtitleEdit.Forms.Translate
break;
}
var linesMergedAndTranslated = await MergeAndSplitHelper.MergeAndTranslateIfPossible(_subtitle, TranslatedSubtitle, source, target, index, _autoTranslator, forceSingleLineMode);
var linesMergedAndTranslated = await MergeAndSplitHelper.MergeAndTranslateIfPossible(_subtitle, TranslatedSubtitle, source, target, index, _autoTranslator, forceSingleLineMode, _cancellationTokenSource.Token);
Application.DoEvents();
if (_breakTranslation)
{
break;
}
if (linesMergedAndTranslated > 0)
{
index += linesMergedAndTranslated;
@ -650,7 +662,13 @@ namespace Nikse.SubtitleEdit.Forms.Translate
var f = new Formatting();
var unformattedText = f.SetTagsAndReturnTrimmed(p.Text, source.Code);
var translation = await _autoTranslator.Translate(unformattedText, source.Code, target.Code);
var translation = await _autoTranslator.Translate(unformattedText, source.Code, target.Code, _cancellationTokenSource.Token);
if (_breakTranslation)
{
break;
}
translation = translation
.Replace("<br />", Environment.NewLine)
.Replace("<br/>", Environment.NewLine);
@ -691,6 +709,7 @@ namespace Nikse.SubtitleEdit.Forms.Translate
_breakTranslation = false;
buttonTranslate.Enabled = true;
buttonTranslate.Text = LanguageSettings.Current.GoogleTranslate.Translate;
_translationInProgress = false;
timerUpdate.Dispose();
_translationProgressDirty = true;

View File

@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Nikse.SubtitleEdit.Forms.Translate
@ -13,7 +14,7 @@ namespace Nikse.SubtitleEdit.Forms.Translate
{
public static bool MergeSplitProblems { get; set; }
public static async Task<int> MergeAndTranslateIfPossible(Subtitle sourceSubtitle, Subtitle targetSubtitle, TranslationPair source, TranslationPair target, int index, IAutoTranslator autoTranslator, bool forceSingleLineMode)
public static async Task<int> MergeAndTranslateIfPossible(Subtitle sourceSubtitle, Subtitle targetSubtitle, TranslationPair source, TranslationPair target, int index, IAutoTranslator autoTranslator, bool forceSingleLineMode, CancellationToken cancellationToken)
{
if (forceSingleLineMode)
{
@ -63,7 +64,7 @@ namespace Nikse.SubtitleEdit.Forms.Translate
var linesTranslate = 0;
if (mergeResult != null)
{
var mergedTranslation = await autoTranslator.Translate(text, source.Code, target.Code);
var mergedTranslation = await autoTranslator.Translate(text, source.Code, target.Code, cancellationToken);
var splitResult = SplitMultipleLines(mergeResult, mergedTranslation, target.Code);
if (splitResult.Count == mergeCount && HasSameEmptyLines(splitResult, tempSubtitle, index))
{