mirror of
https://github.com/SubtitleEdit/subtitleedit.git
synced 2024-10-27 14:32:35 +01:00
Try to make it possible to cancel auto-translate faster - thx Siamak :)
This commit is contained in:
parent
d93b7692a5
commit
1cf0357ad0
@ -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);
|
||||
|
@ -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[]
|
||||
{
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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))
|
||||
|
@ -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))
|
||||
|
@ -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))
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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")
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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))
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user