mirror of
https://github.com/SubtitleEdit/subtitleedit.git
synced 2024-11-22 03:02:35 +01:00
Work on NLLB
This commit is contained in:
parent
d435c819b9
commit
fb7d6d24a2
@ -1044,6 +1044,7 @@ We leverage the intrinsic rhythm of the image.</CreateSimpleChainingToolTip>
|
||||
<PleaseWait>Please wait... this may take a while</PleaseWait>
|
||||
<PoweredByGoogleTranslate>Powered by Google translate</PoweredByGoogleTranslate>
|
||||
<PoweredByMicrosoftTranslate>Powered by Microsoft translate</PoweredByMicrosoftTranslate>
|
||||
<PoweredByX>Powered by {0}</PoweredByX>
|
||||
<MsClientSecretNeeded>Sorry, you need a Cognitive Services 'Translator Text' key from Microsoft to use the latest Microsoft Translator.
|
||||
|
||||
Go to "Options -> Settings -> Tools" to enter your key.</MsClientSecretNeeded>
|
||||
|
@ -6,10 +6,34 @@ namespace Nikse.SubtitleEdit.Core.AutoTranslate
|
||||
{
|
||||
public interface IAutoTranslator
|
||||
{
|
||||
void Initialize(string url);
|
||||
/// <summary>
|
||||
/// Name of auto translator (can be translated).
|
||||
/// </summary>
|
||||
string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Url to homepage.
|
||||
/// </summary>
|
||||
string Url { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Initialization before calling translate.
|
||||
/// </summary>
|
||||
void Initialize();
|
||||
|
||||
/// <summary>
|
||||
/// Get languages that can be translated from.
|
||||
/// </summary>
|
||||
List<TranslationPair> GetSupportedSourceLanguages();
|
||||
|
||||
/// <summary>
|
||||
/// Get languages that can be translated to.
|
||||
/// </summary>
|
||||
List<TranslationPair> GetSupportedTargetLanguages();
|
||||
|
||||
/// <summary>
|
||||
/// Do translation.
|
||||
/// </summary>
|
||||
Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode);
|
||||
}
|
||||
}
|
58
src/libse/AutoTranslate/NoLanguageLeftBehindApi.cs
Normal file
58
src/libse/AutoTranslate/NoLanguageLeftBehindApi.cs
Normal file
@ -0,0 +1,58 @@
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
using Nikse.SubtitleEdit.Core.Http;
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
using Nikse.SubtitleEdit.Core.Translate;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.AutoTranslate
|
||||
{
|
||||
public class NoLanguageLeftBehindApi : IAutoTranslator
|
||||
{
|
||||
private IDownloader _httpClient;
|
||||
|
||||
public string Name { get; set; } = "winstxnhdw-nllb-api";
|
||||
public string Url => "https://github.com/winstxnhdw/nllb-api";
|
||||
|
||||
public void Initialize()
|
||||
{
|
||||
_httpClient?.Dispose();
|
||||
_httpClient = DownloaderFactory.MakeHttpClient();
|
||||
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");
|
||||
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("accept", "application/json");
|
||||
_httpClient.BaseAddress = new Uri(Configuration.Settings.Tools.AutoTranslateNllbApiUrl);
|
||||
}
|
||||
|
||||
public List<TranslationPair> GetSupportedSourceLanguages()
|
||||
{
|
||||
return new NoLanguageLeftBehindServe().GetSupportedSourceLanguages();
|
||||
}
|
||||
|
||||
public List<TranslationPair> GetSupportedTargetLanguages()
|
||||
{
|
||||
return new NoLanguageLeftBehindServe().GetSupportedTargetLanguages();
|
||||
}
|
||||
|
||||
public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode)
|
||||
{
|
||||
var content = new StringContent("{ \"text\": \"" + Json.EncodeJsonText(text) + "\", \"source\": \"" + sourceLanguageCode + "\", \"target\": \"" + targetLanguageCode + "\" }", Encoding.UTF8, "application/json");
|
||||
var result = _httpClient.PostAsync("translate", content).Result;
|
||||
result.EnsureSuccessStatusCode();
|
||||
var bytes = await result.Content.ReadAsByteArrayAsync();
|
||||
var resultText = Encoding.UTF8.GetString(bytes).Trim();
|
||||
|
||||
// error messages are returned as json, translated text are just returned as normal utf-8 text
|
||||
var validator = new SeJsonValidator();
|
||||
var isValidJson = validator.ValidateJson(resultText);
|
||||
if (isValidJson)
|
||||
{
|
||||
SeLogger.Error($"{this.GetType().Name} got json back which is probably an error: {resultText}");
|
||||
}
|
||||
|
||||
return resultText;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,28 +1,32 @@
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
using Nikse.SubtitleEdit.Core.Http;
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
using Nikse.SubtitleEdit.Core.Translate;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Nikse.SubtitleEdit.Core.Http;
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
using System.Net.Http.Headers;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.AutoTranslate
|
||||
{
|
||||
public class AutoTranslator : IAutoTranslator
|
||||
public class NoLanguageLeftBehindServe : IAutoTranslator
|
||||
{
|
||||
private IDownloader _httpClient;
|
||||
|
||||
public string Url => "https://winstxnhdw-nllb-api.hf.space/api/v2/";
|
||||
public string Name { get; set; } = "thammegowda-nllb-serve";
|
||||
public string Url => "https://github.com/thammegowda/nllb-serve";
|
||||
|
||||
public void Initialize(string url)
|
||||
public void Initialize()
|
||||
{
|
||||
_httpClient?.Dispose();
|
||||
_httpClient = DownloaderFactory.MakeHttpClient();
|
||||
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");
|
||||
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("accept", "application/json");
|
||||
_httpClient.BaseAddress = new Uri(url);
|
||||
_httpClient.BaseAddress = new Uri(Configuration.Settings.Tools.AutoTranslateNllbServeUrl);
|
||||
}
|
||||
|
||||
public List<TranslationPair> GetSupportedSourceLanguages()
|
||||
@ -37,21 +41,37 @@ namespace Nikse.SubtitleEdit.Core.AutoTranslate
|
||||
|
||||
public async Task<string> Translate(string text, string sourceLanguageCode, string targetLanguageCode)
|
||||
{
|
||||
var content = new StringContent("{\n \"text\": \"" + Json.EncodeJsonText(text) + "\",\n \"source\": \"" + sourceLanguageCode+ "\",\n \"target\": \"" + targetLanguageCode + "\"\n}", Encoding.UTF8, "application/json");
|
||||
var list = text.SplitToLines();
|
||||
var sb = new StringBuilder();
|
||||
foreach (var line in list)
|
||||
{
|
||||
sb.Append("\"" + Json.EncodeJsonText(text) + "\", ");
|
||||
}
|
||||
|
||||
var src = sb.ToString().TrimEnd().TrimEnd(',').Trim();
|
||||
var input = "{\"source\":[" + src + "], \"src_lang\": \"" + sourceLanguageCode + "\", \"tgt_lang\": \"" + targetLanguageCode + "\"}";
|
||||
var content = new StringContent(input, Encoding.UTF8);
|
||||
content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
|
||||
|
||||
var result = _httpClient.PostAsync("translate", content).Result;
|
||||
result.EnsureSuccessStatusCode();
|
||||
var bytes = await result.Content.ReadAsByteArrayAsync();
|
||||
var resultText = Encoding.UTF8.GetString(bytes).Trim();
|
||||
var json = Encoding.UTF8.GetString(bytes).Trim();
|
||||
|
||||
// error messages are returned as json, translated text are just returned as normal utf-8 text
|
||||
var validator = new SeJsonValidator();
|
||||
var isValidJson = validator.ValidateJson(resultText);
|
||||
if (isValidJson)
|
||||
var parser = new SeJsonParser();
|
||||
var arr = parser.GetArrayElementsByName(json, "translation");
|
||||
if (arr == null || arr.Count == 0)
|
||||
{
|
||||
SeLogger.Error($"{this.GetType().Name} got json back which is probably an error: {resultText}");
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
return resultText;
|
||||
var resultText = new StringBuilder();
|
||||
foreach (var item in arr)
|
||||
{
|
||||
resultText.AppendLine(Json.DecodeJsonText(item));
|
||||
}
|
||||
|
||||
return resultText.ToString().Trim();
|
||||
}
|
||||
|
||||
private static List<TranslationPair> ListLanguages()
|
@ -152,6 +152,10 @@ namespace Nikse.SubtitleEdit.Core.Common
|
||||
public bool GoogleTranslateNoKeyWarningShow { get; set; }
|
||||
public int GoogleApiV1ChunkSize { get; set; }
|
||||
public string GoogleTranslateLastTargetLanguage { get; set; }
|
||||
public string AutoTranslateLastName { get; set; }
|
||||
public string AutoTranslateLastUrl { get; set; }
|
||||
public string AutoTranslateNllbApiUrl { get; set; }
|
||||
public string AutoTranslateNllbServeUrl { get; set; }
|
||||
public bool TranslateAllowSplit { get; set; }
|
||||
public string TranslateLastService { get; set; }
|
||||
public string TranslateMergeStrategy { get; set; }
|
||||
@ -493,6 +497,8 @@ namespace Nikse.SubtitleEdit.Core.Common
|
||||
GoogleTranslateNoKeyWarningShow = true;
|
||||
GoogleApiV1ChunkSize = 1500;
|
||||
GoogleTranslateLastTargetLanguage = "en";
|
||||
AutoTranslateNllbApiUrl = "https://winstxnhdw-nllb-api.hf.space/api/v2/";
|
||||
AutoTranslateNllbServeUrl = "http://127.0.0.1:6060/";
|
||||
TranslateAllowSplit = true;
|
||||
TranslateViaCopyPasteAutoCopyToClipboard = true;
|
||||
TranslateViaCopyPasteMaxSize = 5000;
|
||||
@ -5054,6 +5060,30 @@ $HorzAlign = Center
|
||||
settings.Tools.GoogleTranslateLastTargetLanguage = subNode.InnerText;
|
||||
}
|
||||
|
||||
subNode = node.SelectSingleNode("AutoTranslateLastName");
|
||||
if (subNode != null)
|
||||
{
|
||||
settings.Tools.AutoTranslateLastName = subNode.InnerText;
|
||||
}
|
||||
|
||||
subNode = node.SelectSingleNode("AutoTranslateLastUrl");
|
||||
if (subNode != null)
|
||||
{
|
||||
settings.Tools.AutoTranslateLastUrl = subNode.InnerText;
|
||||
}
|
||||
|
||||
subNode = node.SelectSingleNode("AutoTranslateNllbApiUrl");
|
||||
if (subNode != null)
|
||||
{
|
||||
settings.Tools.AutoTranslateNllbApiUrl = subNode.InnerText;
|
||||
}
|
||||
|
||||
subNode = node.SelectSingleNode("AutoTranslateNllbServeUrl");
|
||||
if (subNode != null)
|
||||
{
|
||||
settings.Tools.AutoTranslateNllbServeUrl = subNode.InnerText;
|
||||
}
|
||||
|
||||
subNode = node.SelectSingleNode("TranslateAllowSplit");
|
||||
if (subNode != null)
|
||||
{
|
||||
@ -11036,6 +11066,7 @@ $HorzAlign = Center
|
||||
textWriter.WriteElementString("TextAndOrigianlTextBoxesSwitched", settings.General.TextAndOrigianlTextBoxesSwitched.ToString(CultureInfo.InvariantCulture));
|
||||
textWriter.WriteElementString("LayoutNumber", settings.General.LayoutNumber.ToString(CultureInfo.InvariantCulture));
|
||||
textWriter.WriteElementString("LayoutSizes", settings.General.LayoutSizes);
|
||||
|
||||
textWriter.WriteElementString("ShowVideoPlayer", settings.General.ShowVideoPlayer.ToString(CultureInfo.InvariantCulture));
|
||||
textWriter.WriteElementString("ShowAudioVisualizer", settings.General.ShowAudioVisualizer.ToString(CultureInfo.InvariantCulture));
|
||||
textWriter.WriteElementString("ShowWaveform", settings.General.ShowWaveform.ToString(CultureInfo.InvariantCulture));
|
||||
@ -11112,6 +11143,7 @@ $HorzAlign = Center
|
||||
textWriter.WriteElementString("FixContinuationStyleHideContinuationCandidatesWithoutName", settings.General.FixContinuationStyleHideContinuationCandidatesWithoutName.ToString(CultureInfo.InvariantCulture));
|
||||
textWriter.WriteElementString("SpellCheckLanguage", settings.General.SpellCheckLanguage);
|
||||
textWriter.WriteElementString("VideoPlayer", settings.General.VideoPlayer);
|
||||
|
||||
textWriter.WriteElementString("VideoPlayerDefaultVolume", settings.General.VideoPlayerDefaultVolume.ToString(CultureInfo.InvariantCulture));
|
||||
textWriter.WriteElementString("VideoPlayerPreviewFontName", settings.General.VideoPlayerPreviewFontName);
|
||||
textWriter.WriteElementString("VideoPlayerPreviewFontSize", settings.General.VideoPlayerPreviewFontSize.ToString(CultureInfo.InvariantCulture));
|
||||
@ -11176,6 +11208,7 @@ $HorzAlign = Center
|
||||
textWriter.WriteElementString("DirectShowDoubleLoad", settings.General.DirectShowDoubleLoad.ToString(CultureInfo.InvariantCulture));
|
||||
textWriter.WriteElementString("VlcWaveTranscodeSettings", settings.General.VlcWaveTranscodeSettings);
|
||||
textWriter.WriteElementString("VlcLocation", settings.General.VlcLocation);
|
||||
|
||||
textWriter.WriteElementString("VlcLocationRelative", settings.General.VlcLocationRelative);
|
||||
textWriter.WriteElementString("MpvVideoOutputWindows", settings.General.MpvVideoOutputWindows);
|
||||
textWriter.WriteElementString("MpvVideoOutputLinux", settings.General.MpvVideoOutputLinux);
|
||||
@ -11305,6 +11338,10 @@ $HorzAlign = Center
|
||||
textWriter.WriteElementString("GoogleTranslateNoKeyWarningShow", settings.Tools.GoogleTranslateNoKeyWarningShow.ToString(CultureInfo.InvariantCulture));
|
||||
textWriter.WriteElementString("GoogleApiV1ChunkSize", settings.Tools.GoogleApiV1ChunkSize.ToString(CultureInfo.InvariantCulture));
|
||||
textWriter.WriteElementString("GoogleTranslateLastTargetLanguage", settings.Tools.GoogleTranslateLastTargetLanguage);
|
||||
textWriter.WriteElementString("AutoTranslateLastName", settings.Tools.AutoTranslateLastName);
|
||||
textWriter.WriteElementString("AutoTranslateLastUrl", settings.Tools.AutoTranslateLastUrl);
|
||||
textWriter.WriteElementString("AutoTranslateNllbApiUrl", settings.Tools.AutoTranslateNllbApiUrl);
|
||||
textWriter.WriteElementString("AutoTranslateNllbServeUrl", settings.Tools.AutoTranslateNllbServeUrl);
|
||||
textWriter.WriteElementString("TranslateAllowSplit", settings.Tools.TranslateAllowSplit.ToString(CultureInfo.InvariantCulture));
|
||||
textWriter.WriteElementString("TranslateLastService", settings.Tools.TranslateLastService);
|
||||
textWriter.WriteElementString("TranslateMergeStrategy", settings.Tools.TranslateMergeStrategy);
|
||||
|
69
src/ui/Forms/Translate/AutoTranslate.Designer.cs
generated
69
src/ui/Forms/Translate/AutoTranslate.Designer.cs
generated
@ -36,6 +36,8 @@
|
||||
this.labelTarget = new System.Windows.Forms.Label();
|
||||
this.labelSource = new System.Windows.Forms.Label();
|
||||
this.labelUrl = new System.Windows.Forms.Label();
|
||||
this.linkLabelPoweredBy = new System.Windows.Forms.LinkLabel();
|
||||
this.nikseComboBoxEngine = new Nikse.SubtitleEdit.Controls.NikseComboBox();
|
||||
this.nikseComboBoxUrl = new Nikse.SubtitleEdit.Controls.NikseComboBox();
|
||||
this.comboBoxSource = new Nikse.SubtitleEdit.Controls.NikseComboBox();
|
||||
this.comboBoxTarget = new Nikse.SubtitleEdit.Controls.NikseComboBox();
|
||||
@ -45,7 +47,7 @@
|
||||
//
|
||||
// progressBar1
|
||||
//
|
||||
this.progressBar1.Location = new System.Drawing.Point(699, 27);
|
||||
this.progressBar1.Location = new System.Drawing.Point(699, 29);
|
||||
this.progressBar1.Name = "progressBar1";
|
||||
this.progressBar1.Size = new System.Drawing.Size(192, 16);
|
||||
this.progressBar1.TabIndex = 100;
|
||||
@ -53,7 +55,7 @@
|
||||
// labelPleaseWait
|
||||
//
|
||||
this.labelPleaseWait.AutoSize = true;
|
||||
this.labelPleaseWait.Location = new System.Drawing.Point(697, 11);
|
||||
this.labelPleaseWait.Location = new System.Drawing.Point(697, 13);
|
||||
this.labelPleaseWait.Name = "labelPleaseWait";
|
||||
this.labelPleaseWait.Size = new System.Drawing.Size(171, 13);
|
||||
this.labelPleaseWait.TabIndex = 99;
|
||||
@ -84,7 +86,7 @@
|
||||
//
|
||||
// buttonTranslate
|
||||
//
|
||||
this.buttonTranslate.Location = new System.Drawing.Point(618, 22);
|
||||
this.buttonTranslate.Location = new System.Drawing.Point(618, 24);
|
||||
this.buttonTranslate.Name = "buttonTranslate";
|
||||
this.buttonTranslate.Size = new System.Drawing.Size(75, 23);
|
||||
this.buttonTranslate.TabIndex = 96;
|
||||
@ -95,7 +97,7 @@
|
||||
// labelTarget
|
||||
//
|
||||
this.labelTarget.AutoSize = true;
|
||||
this.labelTarget.Location = new System.Drawing.Point(462, 27);
|
||||
this.labelTarget.Location = new System.Drawing.Point(462, 29);
|
||||
this.labelTarget.Name = "labelTarget";
|
||||
this.labelTarget.Size = new System.Drawing.Size(23, 13);
|
||||
this.labelTarget.TabIndex = 104;
|
||||
@ -104,7 +106,7 @@
|
||||
// labelSource
|
||||
//
|
||||
this.labelSource.AutoSize = true;
|
||||
this.labelSource.Location = new System.Drawing.Point(279, 27);
|
||||
this.labelSource.Location = new System.Drawing.Point(279, 29);
|
||||
this.labelSource.Name = "labelSource";
|
||||
this.labelSource.Size = new System.Drawing.Size(33, 13);
|
||||
this.labelSource.TabIndex = 103;
|
||||
@ -120,6 +122,41 @@
|
||||
this.labelUrl.TabIndex = 106;
|
||||
this.labelUrl.Text = "Url:";
|
||||
//
|
||||
// linkLabelPoweredBy
|
||||
//
|
||||
this.linkLabelPoweredBy.AutoSize = true;
|
||||
this.linkLabelPoweredBy.Location = new System.Drawing.Point(14, 5);
|
||||
this.linkLabelPoweredBy.Name = "linkLabelPoweredBy";
|
||||
this.linkLabelPoweredBy.Size = new System.Drawing.Size(73, 13);
|
||||
this.linkLabelPoweredBy.TabIndex = 109;
|
||||
this.linkLabelPoweredBy.TabStop = true;
|
||||
this.linkLabelPoweredBy.Text = "Powered by X";
|
||||
this.linkLabelPoweredBy.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelPoweredBy_LinkClicked);
|
||||
//
|
||||
// nikseComboBoxEngine
|
||||
//
|
||||
this.nikseComboBoxEngine.BackColor = System.Drawing.SystemColors.Window;
|
||||
this.nikseComboBoxEngine.BackColorDisabled = System.Drawing.Color.FromArgb(((int)(((byte)(240)))), ((int)(((byte)(240)))), ((int)(((byte)(240)))));
|
||||
this.nikseComboBoxEngine.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(171)))), ((int)(((byte)(173)))), ((int)(((byte)(179)))));
|
||||
this.nikseComboBoxEngine.BorderColorDisabled = System.Drawing.Color.FromArgb(((int)(((byte)(120)))), ((int)(((byte)(120)))), ((int)(((byte)(120)))));
|
||||
this.nikseComboBoxEngine.ButtonForeColor = System.Drawing.SystemColors.ControlText;
|
||||
this.nikseComboBoxEngine.ButtonForeColorDown = System.Drawing.Color.Orange;
|
||||
this.nikseComboBoxEngine.ButtonForeColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(120)))), ((int)(((byte)(215)))));
|
||||
this.nikseComboBoxEngine.DropDownHeight = 400;
|
||||
this.nikseComboBoxEngine.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.nikseComboBoxEngine.DropDownWidth = 221;
|
||||
this.nikseComboBoxEngine.FormattingEnabled = true;
|
||||
this.nikseComboBoxEngine.Location = new System.Drawing.Point(12, 24);
|
||||
this.nikseComboBoxEngine.MaxLength = 32767;
|
||||
this.nikseComboBoxEngine.Name = "nikseComboBoxEngine";
|
||||
this.nikseComboBoxEngine.SelectedIndex = -1;
|
||||
this.nikseComboBoxEngine.SelectedItem = null;
|
||||
this.nikseComboBoxEngine.SelectedText = "";
|
||||
this.nikseComboBoxEngine.Size = new System.Drawing.Size(221, 21);
|
||||
this.nikseComboBoxEngine.TabIndex = 107;
|
||||
this.nikseComboBoxEngine.UsePopupWindow = false;
|
||||
this.nikseComboBoxEngine.SelectedIndexChanged += new System.EventHandler(this.nikseComboBoxEngine_SelectedIndexChanged);
|
||||
//
|
||||
// nikseComboBoxUrl
|
||||
//
|
||||
this.nikseComboBoxUrl.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||
@ -143,6 +180,7 @@
|
||||
this.nikseComboBoxUrl.Size = new System.Drawing.Size(280, 21);
|
||||
this.nikseComboBoxUrl.TabIndex = 105;
|
||||
this.nikseComboBoxUrl.UsePopupWindow = false;
|
||||
this.nikseComboBoxUrl.SelectedIndexChanged += new System.EventHandler(this.nikseComboBoxUrl_SelectedIndexChanged);
|
||||
//
|
||||
// comboBoxSource
|
||||
//
|
||||
@ -155,9 +193,9 @@
|
||||
this.comboBoxSource.ButtonForeColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(120)))), ((int)(((byte)(215)))));
|
||||
this.comboBoxSource.DropDownHeight = 400;
|
||||
this.comboBoxSource.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.comboBoxSource.DropDownWidth = 200;
|
||||
this.comboBoxSource.DropDownWidth = 140;
|
||||
this.comboBoxSource.FormattingEnabled = true;
|
||||
this.comboBoxSource.Location = new System.Drawing.Point(321, 23);
|
||||
this.comboBoxSource.Location = new System.Drawing.Point(321, 25);
|
||||
this.comboBoxSource.MaxLength = 32767;
|
||||
this.comboBoxSource.Name = "comboBoxSource";
|
||||
this.comboBoxSource.SelectedIndex = -1;
|
||||
@ -178,9 +216,9 @@
|
||||
this.comboBoxTarget.ButtonForeColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(120)))), ((int)(((byte)(215)))));
|
||||
this.comboBoxTarget.DropDownHeight = 400;
|
||||
this.comboBoxTarget.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.comboBoxTarget.DropDownWidth = 200;
|
||||
this.comboBoxTarget.DropDownWidth = 140;
|
||||
this.comboBoxTarget.FormattingEnabled = true;
|
||||
this.comboBoxTarget.Location = new System.Drawing.Point(491, 23);
|
||||
this.comboBoxTarget.Location = new System.Drawing.Point(491, 25);
|
||||
this.comboBoxTarget.MaxLength = 32767;
|
||||
this.comboBoxTarget.Name = "comboBoxTarget";
|
||||
this.comboBoxTarget.SelectedIndex = -1;
|
||||
@ -199,10 +237,10 @@
|
||||
this.subtitleListViewTarget.GridLines = true;
|
||||
this.subtitleListViewTarget.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
|
||||
this.subtitleListViewTarget.HideSelection = false;
|
||||
this.subtitleListViewTarget.Location = new System.Drawing.Point(465, 52);
|
||||
this.subtitleListViewTarget.Location = new System.Drawing.Point(465, 53);
|
||||
this.subtitleListViewTarget.Name = "subtitleListViewTarget";
|
||||
this.subtitleListViewTarget.OwnerDraw = true;
|
||||
this.subtitleListViewTarget.Size = new System.Drawing.Size(428, 459);
|
||||
this.subtitleListViewTarget.Size = new System.Drawing.Size(428, 458);
|
||||
this.subtitleListViewTarget.SubtitleFontBold = false;
|
||||
this.subtitleListViewTarget.SubtitleFontName = "Tahoma";
|
||||
this.subtitleListViewTarget.SubtitleFontSize = 8;
|
||||
@ -220,10 +258,10 @@
|
||||
this.subtitleListViewSource.GridLines = true;
|
||||
this.subtitleListViewSource.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
|
||||
this.subtitleListViewSource.HideSelection = false;
|
||||
this.subtitleListViewSource.Location = new System.Drawing.Point(12, 52);
|
||||
this.subtitleListViewSource.Location = new System.Drawing.Point(12, 53);
|
||||
this.subtitleListViewSource.Name = "subtitleListViewSource";
|
||||
this.subtitleListViewSource.OwnerDraw = true;
|
||||
this.subtitleListViewSource.Size = new System.Drawing.Size(430, 459);
|
||||
this.subtitleListViewSource.Size = new System.Drawing.Size(430, 458);
|
||||
this.subtitleListViewSource.SubtitleFontBold = false;
|
||||
this.subtitleListViewSource.SubtitleFontName = "Tahoma";
|
||||
this.subtitleListViewSource.SubtitleFontSize = 8;
|
||||
@ -237,6 +275,8 @@
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(1058, 563);
|
||||
this.Controls.Add(this.linkLabelPoweredBy);
|
||||
this.Controls.Add(this.nikseComboBoxEngine);
|
||||
this.Controls.Add(this.labelUrl);
|
||||
this.Controls.Add(this.nikseComboBoxUrl);
|
||||
this.Controls.Add(this.labelTarget);
|
||||
@ -258,6 +298,7 @@
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||
this.Text = "AutoTranslate";
|
||||
this.ResizeEnd += new System.EventHandler(this.AutoTranslate_ResizeEnd);
|
||||
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.AutoTranslate_KeyDown);
|
||||
this.Resize += new System.EventHandler(this.AutoTranslate_Resize);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
@ -279,5 +320,7 @@
|
||||
private System.Windows.Forms.Label labelSource;
|
||||
private System.Windows.Forms.Label labelUrl;
|
||||
private Controls.NikseComboBox nikseComboBoxUrl;
|
||||
private Controls.NikseComboBox nikseComboBoxEngine;
|
||||
private System.Windows.Forms.LinkLabel linkLabelPoweredBy;
|
||||
}
|
||||
}
|
@ -17,7 +17,8 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
||||
public Subtitle TranslatedSubtitle { get; }
|
||||
private readonly Subtitle _subtitle;
|
||||
private readonly Encoding _encoding;
|
||||
private readonly IAutoTranslator _autoTranslator;
|
||||
private IAutoTranslator _autoTranslator;
|
||||
private List<IAutoTranslator> _autoTranslatorEngines;
|
||||
private int _translationProgressIndex = -1;
|
||||
private bool _translationProgressDirty = true;
|
||||
private bool _breakTranslation;
|
||||
@ -41,6 +42,10 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
||||
subtitleListViewTarget.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute);
|
||||
UiUtil.InitializeSubtitleFont(subtitleListViewSource);
|
||||
UiUtil.InitializeSubtitleFont(subtitleListViewTarget);
|
||||
subtitleListViewSource.HideColumn(SubtitleListView.SubtitleColumn.End);
|
||||
subtitleListViewSource.HideColumn(SubtitleListView.SubtitleColumn.Gap);
|
||||
subtitleListViewTarget.HideColumn(SubtitleListView.SubtitleColumn.End);
|
||||
subtitleListViewTarget.HideColumn(SubtitleListView.SubtitleColumn.Gap);
|
||||
subtitleListViewSource.AutoSizeColumns();
|
||||
subtitleListViewSource.AutoSizeColumns();
|
||||
UiUtil.FixLargeFonts(this, buttonOK);
|
||||
@ -51,10 +56,8 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
||||
Text = title;
|
||||
}
|
||||
|
||||
nikseComboBoxUrl.Items.Clear();
|
||||
nikseComboBoxUrl.Items.Add("https://winstxnhdw-nllb-api.hf.space/api/v2/");
|
||||
nikseComboBoxUrl.Items.Add("http://localhost:7860/api/v2/");
|
||||
nikseComboBoxUrl.SelectedIndex = 0;
|
||||
InitializeAutoTranslatorEngines();
|
||||
|
||||
nikseComboBoxUrl.UsePopupWindow = true;
|
||||
|
||||
labelPleaseWait.Visible = false;
|
||||
@ -80,11 +83,92 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
||||
subtitleListViewSource.Fill(_subtitle);
|
||||
AutoTranslate_Resize(null, null);
|
||||
|
||||
_autoTranslator = new AutoTranslator();
|
||||
_autoTranslator = new NoLanguageLeftBehindApi();
|
||||
SetupLanguageSettings();
|
||||
UpdateTranslation();
|
||||
}
|
||||
|
||||
private void InitializeAutoTranslatorEngines()
|
||||
{
|
||||
_autoTranslatorEngines = new List<IAutoTranslator>
|
||||
{
|
||||
new NoLanguageLeftBehindServe(),
|
||||
new NoLanguageLeftBehindApi(),
|
||||
};
|
||||
|
||||
nikseComboBoxEngine.Items.Clear();
|
||||
nikseComboBoxEngine.Items.AddRange(_autoTranslatorEngines.Select(p => p.Name).ToArray<object>());
|
||||
|
||||
if (!string.IsNullOrEmpty(Configuration.Settings.Tools.AutoTranslateLastName))
|
||||
{
|
||||
var lastEngine = _autoTranslatorEngines.FirstOrDefault(p => p.Name == Configuration.Settings.Tools.AutoTranslateLastName);
|
||||
if (lastEngine != null)
|
||||
{
|
||||
nikseComboBoxEngine.SelectedIndex = _autoTranslatorEngines.IndexOf(lastEngine);
|
||||
}
|
||||
}
|
||||
|
||||
if (nikseComboBoxEngine.SelectedIndex < 0)
|
||||
{
|
||||
nikseComboBoxEngine.SelectedIndex = 0;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(Configuration.Settings.Tools.AutoTranslateLastUrl))
|
||||
{
|
||||
nikseComboBoxUrl.SelectedText = Configuration.Settings.Tools.AutoTranslateLastUrl;
|
||||
}
|
||||
}
|
||||
|
||||
private void SetAutoTranslatorEngine()
|
||||
{
|
||||
var engine = GetCurrentEngine();
|
||||
linkLabelPoweredBy.Text = string.Format(LanguageSettings.Current.GoogleTranslate.PoweredByX, engine.Name);
|
||||
var engineType = engine.GetType();
|
||||
|
||||
if (engineType == typeof(NoLanguageLeftBehindServe))
|
||||
{
|
||||
nikseComboBoxUrl.Items.Clear();
|
||||
nikseComboBoxUrl.Items.Add("http://127.0.0.1:6060/");
|
||||
nikseComboBoxUrl.Items.Add("http://192.168.8.127:6060/");
|
||||
nikseComboBoxUrl.SelectedIndex = 0;
|
||||
nikseComboBoxUrl.Visible = true;
|
||||
labelUrl.Visible = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (engineType == typeof(NoLanguageLeftBehindApi))
|
||||
{
|
||||
nikseComboBoxUrl.Items.Clear();
|
||||
nikseComboBoxUrl.Items.Add("http://localhost:7860/api/v2/");
|
||||
nikseComboBoxUrl.SelectedIndex = 0;
|
||||
nikseComboBoxUrl.Visible = true;
|
||||
labelUrl.Visible = true;
|
||||
return;
|
||||
}
|
||||
|
||||
throw new Exception($"Engine {engine.Name} not handled!");
|
||||
}
|
||||
|
||||
private void SetAutoTranslatorUrl(string url)
|
||||
{
|
||||
var engine = GetCurrentEngine();
|
||||
var engineType = engine.GetType();
|
||||
|
||||
if (engineType == typeof(NoLanguageLeftBehindApi))
|
||||
{
|
||||
Configuration.Settings.Tools.AutoTranslateNllbApiUrl = url;
|
||||
return;
|
||||
}
|
||||
|
||||
if (engineType == typeof(NoLanguageLeftBehindServe))
|
||||
{
|
||||
Configuration.Settings.Tools.AutoTranslateNllbApiUrl = url;
|
||||
return;
|
||||
}
|
||||
|
||||
throw new Exception($"Engine {engine.Name} not handled!");
|
||||
}
|
||||
|
||||
private void SetupLanguageSettings()
|
||||
{
|
||||
FillComboWithLanguages(comboBoxSource, _autoTranslator.GetSupportedSourceLanguages());
|
||||
@ -256,7 +340,8 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
||||
progressBar1.Visible = true;
|
||||
labelPleaseWait.Visible = true;
|
||||
|
||||
_autoTranslator.Initialize(nikseComboBoxUrl.Text);
|
||||
_autoTranslator = GetCurrentEngine();
|
||||
_autoTranslator.Initialize();
|
||||
|
||||
var timerUpdate = new Timer();
|
||||
timerUpdate.Interval = 1500;
|
||||
@ -600,6 +685,7 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
||||
_translationProgressDirty = true;
|
||||
subtitleListViewTarget.SelectIndexAndEnsureVisible(_translationProgressIndex);
|
||||
subtitleListViewTarget.EndUpdate();
|
||||
subtitleListViewSource.SelectIndexAndEnsureVisible(_translationProgressIndex);
|
||||
}
|
||||
|
||||
private void AutoTranslate_ResizeEnd(object sender, EventArgs e)
|
||||
@ -609,13 +695,51 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
||||
|
||||
private void buttonOK_Click(object sender, EventArgs e)
|
||||
{
|
||||
var engine = GetCurrentEngine();
|
||||
Configuration.Settings.Tools.AutoTranslateLastName = engine.Name;
|
||||
Configuration.Settings.Tools.AutoTranslateLastUrl = nikseComboBoxUrl.Text;
|
||||
|
||||
var isEmpty = TranslatedSubtitle == null || TranslatedSubtitle.Paragraphs.All(p => string.IsNullOrEmpty(p.Text));
|
||||
DialogResult = isEmpty ? DialogResult.Cancel : DialogResult.OK;
|
||||
}
|
||||
|
||||
private IAutoTranslator GetCurrentEngine()
|
||||
{
|
||||
return _autoTranslatorEngines.First(p => p.Name == nikseComboBoxEngine.Text);
|
||||
}
|
||||
|
||||
private void buttonCancel_Click(object sender, EventArgs e)
|
||||
{
|
||||
DialogResult = DialogResult.Cancel;
|
||||
}
|
||||
|
||||
private void nikseComboBoxEngine_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
SetAutoTranslatorEngine();
|
||||
}
|
||||
|
||||
private void nikseComboBoxUrl_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
SetAutoTranslatorUrl(nikseComboBoxUrl.Text);
|
||||
}
|
||||
|
||||
private void linkLabelPoweredBy_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
|
||||
{
|
||||
var engine = _autoTranslatorEngines.First(p => p.Name == nikseComboBoxEngine.Text);
|
||||
UiUtil.OpenUrl(engine.Url);
|
||||
}
|
||||
|
||||
private void AutoTranslate_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (e.KeyCode == Keys.Escape)
|
||||
{
|
||||
DialogResult = DialogResult.Cancel;
|
||||
}
|
||||
else if (e.KeyData == UiUtil.HelpKeys)
|
||||
{
|
||||
UiUtil.ShowHelp("#translation");
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1303,6 +1303,7 @@ namespace Nikse.SubtitleEdit.Logic
|
||||
PleaseWait = "Please wait... this may take a while",
|
||||
PoweredByGoogleTranslate = "Powered by Google translate",
|
||||
PoweredByMicrosoftTranslate = "Powered by Microsoft translate",
|
||||
PoweredByX = "Powered by {0}",
|
||||
MsClientSecretNeeded = "Sorry, you need a Cognitive Services 'Translator Text' key from Microsoft to use the latest Microsoft Translator." + Environment.NewLine +
|
||||
Environment.NewLine +
|
||||
"Go to \"Options -> Settings -> Tools\" to enter your key.",
|
||||
|
@ -2749,6 +2749,9 @@ namespace Nikse.SubtitleEdit.Logic
|
||||
case "GoogleTranslate/PoweredByMicrosoftTranslate":
|
||||
language.GoogleTranslate.PoweredByMicrosoftTranslate = reader.Value;
|
||||
break;
|
||||
case "GoogleTranslate/PoweredByX":
|
||||
language.GoogleTranslate.PoweredByX = reader.Value;
|
||||
break;
|
||||
case "GoogleTranslate/MsClientSecretNeeded":
|
||||
language.GoogleTranslate.MsClientSecretNeeded = reader.Value;
|
||||
break;
|
||||
|
@ -1127,6 +1127,7 @@
|
||||
public string PleaseWait { get; set; }
|
||||
public string PoweredByGoogleTranslate { get; set; }
|
||||
public string PoweredByMicrosoftTranslate { get; set; }
|
||||
public string PoweredByX { get; set; }
|
||||
public string MsClientSecretNeeded { get; set; }
|
||||
public string GoogleNoApiKeyWarning { get; set; }
|
||||
public string Service { get; set; }
|
||||
|
Loading…
Reference in New Issue
Block a user