mirror of
https://github.com/SubtitleEdit/subtitleedit.git
synced 2024-10-27 22:42:38 +01:00
Improve auto-translate re-split (two lines only)
This commit is contained in:
parent
09182dc067
commit
974f165d99
@ -22,7 +22,7 @@ namespace Test.Logic.AutoTranslate
|
|||||||
Assert.AreEqual("Hallo world.", mergeResult.Text);
|
Assert.AreEqual("Hallo world.", mergeResult.Text);
|
||||||
Assert.AreEqual(subtitle.Paragraphs.Count, mergeResult.ParagraphCount);
|
Assert.AreEqual(subtitle.Paragraphs.Count, mergeResult.ParagraphCount);
|
||||||
Assert.AreEqual(1, mergeResult.MergeResultItems.Count);
|
Assert.AreEqual(1, mergeResult.MergeResultItems.Count);
|
||||||
Assert.AreEqual(true, mergeResult.MergeResultItems[0].Continious);
|
Assert.AreEqual(true, mergeResult.MergeResultItems[0].Continuous);
|
||||||
Assert.AreEqual(0, mergeResult.MergeResultItems[0].StartIndex);
|
Assert.AreEqual(0, mergeResult.MergeResultItems[0].StartIndex);
|
||||||
Assert.AreEqual(1, mergeResult.MergeResultItems[0].EndIndex);
|
Assert.AreEqual(1, mergeResult.MergeResultItems[0].EndIndex);
|
||||||
|
|
||||||
@ -50,11 +50,11 @@ namespace Test.Logic.AutoTranslate
|
|||||||
Assert.AreEqual(3, mergeResult.MergeResultItems.Count);
|
Assert.AreEqual(3, mergeResult.MergeResultItems.Count);
|
||||||
Assert.AreEqual(true, mergeResult.MergeResultItems[0].IsEmpty);
|
Assert.AreEqual(true, mergeResult.MergeResultItems[0].IsEmpty);
|
||||||
Assert.AreEqual(false, mergeResult.MergeResultItems[1].IsEmpty);
|
Assert.AreEqual(false, mergeResult.MergeResultItems[1].IsEmpty);
|
||||||
Assert.AreEqual(false, mergeResult.MergeResultItems[1].Continious);
|
Assert.AreEqual(false, mergeResult.MergeResultItems[1].Continuous);
|
||||||
Assert.AreEqual(1, mergeResult.MergeResultItems[1].StartIndex);
|
Assert.AreEqual(1, mergeResult.MergeResultItems[1].StartIndex);
|
||||||
Assert.AreEqual(1, mergeResult.MergeResultItems[1].EndIndex);
|
Assert.AreEqual(1, mergeResult.MergeResultItems[1].EndIndex);
|
||||||
Assert.AreEqual('.', mergeResult.MergeResultItems[1].EndChar);
|
Assert.AreEqual('.', mergeResult.MergeResultItems[1].EndChar);
|
||||||
Assert.AreEqual(1, mergeResult.MergeResultItems[1].EndCharOccurences);
|
Assert.AreEqual(1, mergeResult.MergeResultItems[1].EndCharOccurrences);
|
||||||
|
|
||||||
var splitResult = MergeAndSplitHelper.SplitMultipleLines(mergeResult, mergeResult.Text, "en");
|
var splitResult = MergeAndSplitHelper.SplitMultipleLines(mergeResult, mergeResult.Text, "en");
|
||||||
Assert.AreEqual(subtitle.Paragraphs.Count, splitResult.Count);
|
Assert.AreEqual(subtitle.Paragraphs.Count, splitResult.Count);
|
||||||
@ -77,11 +77,11 @@ namespace Test.Logic.AutoTranslate
|
|||||||
Assert.AreEqual(3, mergeResult.MergeResultItems.Count);
|
Assert.AreEqual(3, mergeResult.MergeResultItems.Count);
|
||||||
Assert.AreEqual(true, mergeResult.MergeResultItems[0].IsEmpty);
|
Assert.AreEqual(true, mergeResult.MergeResultItems[0].IsEmpty);
|
||||||
Assert.AreEqual(false, mergeResult.MergeResultItems[1].IsEmpty);
|
Assert.AreEqual(false, mergeResult.MergeResultItems[1].IsEmpty);
|
||||||
Assert.AreEqual(false, mergeResult.MergeResultItems[1].Continious);
|
Assert.AreEqual(false, mergeResult.MergeResultItems[1].Continuous);
|
||||||
Assert.AreEqual(1, mergeResult.MergeResultItems[1].StartIndex);
|
Assert.AreEqual(1, mergeResult.MergeResultItems[1].StartIndex);
|
||||||
Assert.AreEqual(1, mergeResult.MergeResultItems[1].EndIndex);
|
Assert.AreEqual(1, mergeResult.MergeResultItems[1].EndIndex);
|
||||||
Assert.AreEqual('.', mergeResult.MergeResultItems[1].EndChar);
|
Assert.AreEqual('.', mergeResult.MergeResultItems[1].EndChar);
|
||||||
Assert.AreEqual(1, mergeResult.MergeResultItems[1].EndCharOccurences);
|
Assert.AreEqual(1, mergeResult.MergeResultItems[1].EndCharOccurrences);
|
||||||
|
|
||||||
var splitResult = MergeAndSplitHelper.SplitMultipleLines(mergeResult, mergeResult.Text, "en");
|
var splitResult = MergeAndSplitHelper.SplitMultipleLines(mergeResult, mergeResult.Text, "en");
|
||||||
Assert.AreEqual(subtitle.Paragraphs.Count, splitResult.Count);
|
Assert.AreEqual(subtitle.Paragraphs.Count, splitResult.Count);
|
||||||
@ -104,11 +104,11 @@ namespace Test.Logic.AutoTranslate
|
|||||||
Assert.AreEqual("Hallo there. In the garden." + Environment.NewLine + "How are you?", mergeResult.Text);
|
Assert.AreEqual("Hallo there. In the garden." + Environment.NewLine + "How are you?", mergeResult.Text);
|
||||||
Assert.AreEqual(subtitle.Paragraphs.Count, mergeResult.ParagraphCount);
|
Assert.AreEqual(subtitle.Paragraphs.Count, mergeResult.ParagraphCount);
|
||||||
Assert.AreEqual(2, mergeResult.MergeResultItems.Count);
|
Assert.AreEqual(2, mergeResult.MergeResultItems.Count);
|
||||||
Assert.AreEqual(false, mergeResult.MergeResultItems[0].Continious);
|
Assert.AreEqual(false, mergeResult.MergeResultItems[0].Continuous);
|
||||||
Assert.AreEqual(0, mergeResult.MergeResultItems[0].StartIndex);
|
Assert.AreEqual(0, mergeResult.MergeResultItems[0].StartIndex);
|
||||||
Assert.AreEqual(0, mergeResult.MergeResultItems[0].EndIndex);
|
Assert.AreEqual(0, mergeResult.MergeResultItems[0].EndIndex);
|
||||||
Assert.AreEqual('.', mergeResult.MergeResultItems[0].EndChar);
|
Assert.AreEqual('.', mergeResult.MergeResultItems[0].EndChar);
|
||||||
Assert.AreEqual(2, mergeResult.MergeResultItems[0].EndCharOccurences);
|
Assert.AreEqual(2, mergeResult.MergeResultItems[0].EndCharOccurrences);
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
@ -136,36 +136,36 @@ namespace Test.Logic.AutoTranslate
|
|||||||
Assert.AreEqual(6, mergeResult.MergeResultItems.Count);
|
Assert.AreEqual(6, mergeResult.MergeResultItems.Count);
|
||||||
Assert.AreEqual(subtitle.Paragraphs.Count, mergeResult.ParagraphCount);
|
Assert.AreEqual(subtitle.Paragraphs.Count, mergeResult.ParagraphCount);
|
||||||
|
|
||||||
Assert.AreEqual(true, mergeResult.MergeResultItems[0].Continious);
|
Assert.AreEqual(true, mergeResult.MergeResultItems[0].Continuous);
|
||||||
Assert.AreEqual(0, mergeResult.MergeResultItems[0].StartIndex);
|
Assert.AreEqual(0, mergeResult.MergeResultItems[0].StartIndex);
|
||||||
Assert.AreEqual(2, mergeResult.MergeResultItems[0].EndIndex);
|
Assert.AreEqual(2, mergeResult.MergeResultItems[0].EndIndex);
|
||||||
Assert.AreEqual('.', mergeResult.MergeResultItems[0].EndChar);
|
Assert.AreEqual('.', mergeResult.MergeResultItems[0].EndChar);
|
||||||
Assert.AreEqual(2, mergeResult.MergeResultItems[0].EndCharOccurences);
|
Assert.AreEqual(2, mergeResult.MergeResultItems[0].EndCharOccurrences);
|
||||||
|
|
||||||
Assert.AreEqual(false, mergeResult.MergeResultItems[1].Continious);
|
Assert.AreEqual(false, mergeResult.MergeResultItems[1].Continuous);
|
||||||
Assert.AreEqual(3, mergeResult.MergeResultItems[1].StartIndex);
|
Assert.AreEqual(3, mergeResult.MergeResultItems[1].StartIndex);
|
||||||
Assert.AreEqual(3, mergeResult.MergeResultItems[1].EndIndex);
|
Assert.AreEqual(3, mergeResult.MergeResultItems[1].EndIndex);
|
||||||
Assert.AreEqual('!', mergeResult.MergeResultItems[1].EndChar);
|
Assert.AreEqual('!', mergeResult.MergeResultItems[1].EndChar);
|
||||||
|
|
||||||
Assert.AreEqual(false, mergeResult.MergeResultItems[2].Continious);
|
Assert.AreEqual(false, mergeResult.MergeResultItems[2].Continuous);
|
||||||
Assert.AreEqual(4, mergeResult.MergeResultItems[2].StartIndex);
|
Assert.AreEqual(4, mergeResult.MergeResultItems[2].StartIndex);
|
||||||
Assert.AreEqual(4, mergeResult.MergeResultItems[2].EndIndex);
|
Assert.AreEqual(4, mergeResult.MergeResultItems[2].EndIndex);
|
||||||
Assert.AreEqual('.', mergeResult.MergeResultItems[2].EndChar);
|
Assert.AreEqual('.', mergeResult.MergeResultItems[2].EndChar);
|
||||||
Assert.AreEqual(1, mergeResult.MergeResultItems[2].EndCharOccurences);
|
Assert.AreEqual(1, mergeResult.MergeResultItems[2].EndCharOccurrences);
|
||||||
|
|
||||||
Assert.AreEqual(false, mergeResult.MergeResultItems[3].Continious);
|
Assert.AreEqual(false, mergeResult.MergeResultItems[3].Continuous);
|
||||||
Assert.AreEqual(5, mergeResult.MergeResultItems[3].StartIndex);
|
Assert.AreEqual(5, mergeResult.MergeResultItems[3].StartIndex);
|
||||||
Assert.AreEqual(5, mergeResult.MergeResultItems[3].EndIndex);
|
Assert.AreEqual(5, mergeResult.MergeResultItems[3].EndIndex);
|
||||||
Assert.AreEqual('.', mergeResult.MergeResultItems[3].EndChar);
|
Assert.AreEqual('.', mergeResult.MergeResultItems[3].EndChar);
|
||||||
Assert.AreEqual(2, mergeResult.MergeResultItems[3].EndCharOccurences);
|
Assert.AreEqual(2, mergeResult.MergeResultItems[3].EndCharOccurrences);
|
||||||
|
|
||||||
Assert.AreEqual(true, mergeResult.MergeResultItems[4].IsEmpty);
|
Assert.AreEqual(true, mergeResult.MergeResultItems[4].IsEmpty);
|
||||||
|
|
||||||
Assert.AreEqual(false, mergeResult.MergeResultItems[5].Continious);
|
Assert.AreEqual(false, mergeResult.MergeResultItems[5].Continuous);
|
||||||
Assert.AreEqual(7, mergeResult.MergeResultItems[5].StartIndex);
|
Assert.AreEqual(7, mergeResult.MergeResultItems[5].StartIndex);
|
||||||
Assert.AreEqual(7, mergeResult.MergeResultItems[5].EndIndex);
|
Assert.AreEqual(7, mergeResult.MergeResultItems[5].EndIndex);
|
||||||
Assert.AreEqual('.', mergeResult.MergeResultItems[5].EndChar);
|
Assert.AreEqual('.', mergeResult.MergeResultItems[5].EndChar);
|
||||||
Assert.AreEqual(1, mergeResult.MergeResultItems[5].EndCharOccurences);
|
Assert.AreEqual(1, mergeResult.MergeResultItems[5].EndCharOccurrences);
|
||||||
|
|
||||||
var splitResult = MergeAndSplitHelper.SplitMultipleLines(mergeResult, mergeResult.Text, "en");
|
var splitResult = MergeAndSplitHelper.SplitMultipleLines(mergeResult, mergeResult.Text, "en");
|
||||||
Assert.AreEqual(subtitle.Paragraphs.Count, splitResult.Count);
|
Assert.AreEqual(subtitle.Paragraphs.Count, splitResult.Count);
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
using Nikse.SubtitleEdit.Core.Common;
|
using Nikse.SubtitleEdit.Core.AutoTranslate;
|
||||||
|
using Nikse.SubtitleEdit.Core.Common;
|
||||||
|
using Nikse.SubtitleEdit.Core.Translate;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Nikse.SubtitleEdit.Core.AutoTranslate;
|
|
||||||
using Nikse.SubtitleEdit.Core.Translate;
|
|
||||||
|
|
||||||
namespace Nikse.SubtitleEdit.Forms.Translate
|
namespace Nikse.SubtitleEdit.Forms.Translate
|
||||||
{
|
{
|
||||||
@ -25,7 +25,7 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
|
|
||||||
// Try to handle (remove and save info for later restore) italics, bold, alignment, and more where possible
|
// Try to handle (remove and save info for later restore) italics, bold, alignment, and more where possible
|
||||||
var tempSubtitle = new Subtitle(sourceSubtitle);
|
var tempSubtitle = new Subtitle(sourceSubtitle);
|
||||||
List<Formatting> formattings = HandleFormatting(tempSubtitle, index, target.Code);
|
var formattingList = HandleFormatting(tempSubtitle, index, target.Code);
|
||||||
|
|
||||||
// Merge text for better translation and save info enough to split again later
|
// Merge text for better translation and save info enough to split again later
|
||||||
var maxChars = autoTranslator.MaxCharacters;
|
var maxChars = autoTranslator.MaxCharacters;
|
||||||
@ -34,7 +34,7 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
MergeSplitProblems = false;
|
MergeSplitProblems = false;
|
||||||
if (maxChars > 500)
|
if (maxChars > 500)
|
||||||
{
|
{
|
||||||
maxChars = maxChars / 2;
|
maxChars /= 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
var idx = 0;
|
var idx = 0;
|
||||||
foreach (var line in splitResult)
|
foreach (var line in splitResult)
|
||||||
{
|
{
|
||||||
var reformattedText = formattings[idx].ReAddFormatting(line);
|
var reformattedText = formattingList[idx].ReAddFormatting(line);
|
||||||
targetSubtitle.Paragraphs[index].Text = reformattedText;
|
targetSubtitle.Paragraphs[index].Text = reformattedText;
|
||||||
index++;
|
index++;
|
||||||
linesTranslate++;
|
linesTranslate++;
|
||||||
@ -121,7 +121,7 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
var idx = 0;
|
var idx = 0;
|
||||||
foreach (var p in newSub.Paragraphs)
|
foreach (var p in newSub.Paragraphs)
|
||||||
{
|
{
|
||||||
var reformattedText = formattings[idx].ReAddFormatting(p.Text);
|
var reformattedText = formattingList[idx].ReAddFormatting(p.Text);
|
||||||
targetSubtitle.Paragraphs[index].Text = reformattedText;
|
targetSubtitle.Paragraphs[index].Text = reformattedText;
|
||||||
index++;
|
index++;
|
||||||
linesTranslate++;
|
linesTranslate++;
|
||||||
@ -170,7 +170,7 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
|
|
||||||
private static List<Formatting> HandleFormatting(Subtitle sourceSubtitle, int index, string sourceLanguage)
|
private static List<Formatting> HandleFormatting(Subtitle sourceSubtitle, int index, string sourceLanguage)
|
||||||
{
|
{
|
||||||
var formattings = new List<Formatting>();
|
var formattingList = new List<Formatting>();
|
||||||
|
|
||||||
for (var i = index; i < sourceSubtitle.Paragraphs.Count; i++)
|
for (var i = index; i < sourceSubtitle.Paragraphs.Count; i++)
|
||||||
{
|
{
|
||||||
@ -178,10 +178,10 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
var f = new Formatting();
|
var f = new Formatting();
|
||||||
var text = f.SetTagsAndReturnTrimmed(TranslationHelper.PreTranslate(p.Text, sourceLanguage), sourceLanguage);
|
var text = f.SetTagsAndReturnTrimmed(TranslationHelper.PreTranslate(p.Text, sourceLanguage), sourceLanguage);
|
||||||
p.Text = text;
|
p.Text = text;
|
||||||
formattings.Add(f);
|
formattingList.Add(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
return formattings;
|
return formattingList;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MergeResult MergeMultipleLines(Subtitle sourceSubtitle, int index, int maxTextSize, bool noSentenceEndingSource, bool noSentenceEndingTarget)
|
public static MergeResult MergeMultipleLines(Subtitle sourceSubtitle, int index, int maxTextSize, bool noSentenceEndingSource, bool noSentenceEndingTarget)
|
||||||
@ -197,10 +197,12 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
{
|
{
|
||||||
StartIndex = index,
|
StartIndex = index,
|
||||||
EndIndex = index,
|
EndIndex = index,
|
||||||
Text = string.Empty
|
Text = string.Empty,
|
||||||
|
Paragraphs = new List<Paragraph>(),
|
||||||
};
|
};
|
||||||
|
|
||||||
result.Text = sourceSubtitle.Paragraphs[index].Text;
|
result.Text = sourceSubtitle.Paragraphs[index].Text;
|
||||||
|
item.Paragraphs.Add(sourceSubtitle.Paragraphs[index]);
|
||||||
item.Text = sourceSubtitle.Paragraphs[index].Text;
|
item.Text = sourceSubtitle.Paragraphs[index].Text;
|
||||||
if (string.IsNullOrWhiteSpace(result.Text))
|
if (string.IsNullOrWhiteSpace(result.Text))
|
||||||
{
|
{
|
||||||
@ -236,6 +238,7 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
if (item != null)
|
if (item != null)
|
||||||
{
|
{
|
||||||
item.Text += Environment.NewLine + "." + Environment.NewLine + p.Text;
|
item.Text += Environment.NewLine + "." + Environment.NewLine + p.Text;
|
||||||
|
item.Paragraphs.Add(p);
|
||||||
|
|
||||||
item.TextIndexStart = result.Text.Length;
|
item.TextIndexStart = result.Text.Length;
|
||||||
item.StartIndex = i - 1;
|
item.StartIndex = i - 1;
|
||||||
@ -243,7 +246,7 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
result.MergeResultItems.Add(item);
|
result.MergeResultItems.Add(item);
|
||||||
|
|
||||||
textBuild = new StringBuilder();
|
textBuild = new StringBuilder();
|
||||||
item = new MergeResultItem { StartIndex = i, Text = string.Empty };
|
item = new MergeResultItem { StartIndex = i, Text = string.Empty, Paragraphs = new List<Paragraph>() };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (string.IsNullOrWhiteSpace(p.Text))
|
else if (string.IsNullOrWhiteSpace(p.Text))
|
||||||
@ -254,10 +257,9 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
item.TextIndexStart = result.Text.Length;
|
item.TextIndexStart = result.Text.Length;
|
||||||
item.TextIndexEnd = result.Text.Length;
|
item.TextIndexEnd = result.Text.Length;
|
||||||
item.EndChar = endChar;
|
item.EndChar = endChar;
|
||||||
var endCharOccurences = Utilities.CountTagInText(textBuild.ToString(), endChar);
|
var endCharOccurrences = Utilities.CountTagInText(textBuild.ToString(), endChar);
|
||||||
item.EndCharOccurences = endCharOccurences;
|
item.EndCharOccurrences = endCharOccurrences;
|
||||||
result.MergeResultItems.Add(item);
|
result.MergeResultItems.Add(item);
|
||||||
textBuild = new StringBuilder();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
result.MergeResultItems.Add(new MergeResultItem
|
result.MergeResultItems.Add(new MergeResultItem
|
||||||
@ -268,6 +270,7 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
TextIndexStart = result.Text.Length,
|
TextIndexStart = result.Text.Length,
|
||||||
TextIndexEnd = result.Text.Length,
|
TextIndexEnd = result.Text.Length,
|
||||||
Text = string.Empty,
|
Text = string.Empty,
|
||||||
|
Paragraphs = new List<Paragraph>(),
|
||||||
});
|
});
|
||||||
|
|
||||||
item = null;
|
item = null;
|
||||||
@ -294,7 +297,7 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
{
|
{
|
||||||
item.EndChar = endChar;
|
item.EndChar = endChar;
|
||||||
var endCharOccurrences = Utilities.CountTagInText(textBuild.ToString(), endChar);
|
var endCharOccurrences = Utilities.CountTagInText(textBuild.ToString(), endChar);
|
||||||
item.EndCharOccurences = endCharOccurrences;
|
item.EndCharOccurrences = endCharOccurrences;
|
||||||
item.TextIndexEnd = result.Text.Length;
|
item.TextIndexEnd = result.Text.Length;
|
||||||
result.MergeResultItems.Add(item);
|
result.MergeResultItems.Add(item);
|
||||||
textBuild = new StringBuilder();
|
textBuild = new StringBuilder();
|
||||||
@ -305,15 +308,16 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
|
|
||||||
result.Text += Environment.NewLine + p.Text;
|
result.Text += Environment.NewLine + p.Text;
|
||||||
|
|
||||||
item = new MergeResultItem { StartIndex = i, TextIndexStart = result.Text.Length, Text = p.Text };
|
item = new MergeResultItem { StartIndex = i, TextIndexStart = result.Text.Length, Text = p.Text, Paragraphs = new List<Paragraph>(), };
|
||||||
}
|
}
|
||||||
else if (item != null && (item.Continious || item.StartIndex == item.EndIndex) && p.StartTime.TotalMilliseconds - prev.EndTime.TotalMilliseconds < 1000)
|
else if (item != null && (item.Continuous || item.StartIndex == item.EndIndex) && p.StartTime.TotalMilliseconds - prev.EndTime.TotalMilliseconds < 1000)
|
||||||
{
|
{
|
||||||
textBuild.Append(" ");
|
textBuild.Append(" ");
|
||||||
textBuild.Append(p.Text);
|
textBuild.Append(p.Text);
|
||||||
result.Text += " " + p.Text;
|
result.Text += " " + p.Text;
|
||||||
item.Text += " " + p.Text;
|
item.Text += " " + p.Text;
|
||||||
item.Continious = true;
|
item.Continuous = true;
|
||||||
|
item.Paragraphs.Add(p);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -340,7 +344,7 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
{
|
{
|
||||||
var endChar = result.Text[result.Text.Length - 1];
|
var endChar = result.Text[result.Text.Length - 1];
|
||||||
item.EndChar = endChar;
|
item.EndChar = endChar;
|
||||||
item.EndCharOccurences = Utilities.CountTagInText(textBuild.ToString(), endChar);
|
item.EndCharOccurrences = Utilities.CountTagInText(textBuild.ToString(), endChar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,11 +395,11 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
{
|
{
|
||||||
lines.Add(string.Empty);
|
lines.Add(string.Empty);
|
||||||
}
|
}
|
||||||
else if (item.Continious)
|
else if (item.Continuous)
|
||||||
{
|
{
|
||||||
var part = GetPartFromItem(text, item);
|
var part = GetPartFromItem(text, item);
|
||||||
text = text.Remove(0, part.Length).Trim();
|
text = text.Remove(0, part.Length).Trim();
|
||||||
var lineRange = SplitContontinous(part, item, language);
|
var lineRange = SplitContinuous(part, item, language);
|
||||||
lines.AddRange(lineRange);
|
lines.AddRange(lineRange);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -425,7 +429,7 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
var count = 1;
|
var count = 1;
|
||||||
while (idx >= 0 && idx < input.Length - 1)
|
while (idx >= 0 && idx < input.Length - 1)
|
||||||
{
|
{
|
||||||
if (count == item.EndCharOccurences)
|
if (count == item.EndCharOccurrences)
|
||||||
{
|
{
|
||||||
return input.Substring(0, idx + 1);
|
return input.Substring(0, idx + 1);
|
||||||
}
|
}
|
||||||
@ -437,22 +441,114 @@ namespace Nikse.SubtitleEdit.Forms.Translate
|
|||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<string> SplitContontinous(string text, MergeResultItem item, string language)
|
private static List<string> SplitContinuous(string text, MergeResultItem item, string language)
|
||||||
{
|
{
|
||||||
var count = item.EndIndex - item.StartIndex + 1;
|
var count = item.EndIndex - item.StartIndex + 1;
|
||||||
|
|
||||||
if (count == 2)
|
if (count == 2)
|
||||||
{
|
{
|
||||||
var arr = Utilities.AutoBreakLine(text, Configuration.Settings.General.SubtitleLineMaximumLength * 2, 0, language).SplitToLines();
|
var arr = Utilities.AutoBreakLine(text, Configuration.Settings.General.SubtitleLineMaximumLength * 2, 0, language).SplitToLines();
|
||||||
if (arr.Count == 2)
|
if (arr.Count == 2 && item.Paragraphs.Count == 2)
|
||||||
{
|
{
|
||||||
return arr;
|
// test using character count for percentage
|
||||||
|
var totalCharLength = item.Paragraphs[0].Text.Length + item.Paragraphs[1].Text.Length;
|
||||||
|
var pctCharLength1 = item.Paragraphs[0].Text.Length * 100.0 / totalCharLength;
|
||||||
|
var pctCharLength2 = item.Paragraphs[1].Text.Length * 100.0 / totalCharLength;
|
||||||
|
var pctCharArr = GetTwoPartsByPct(text, pctCharLength1, pctCharLength2);
|
||||||
|
|
||||||
|
// test using duration for percentage
|
||||||
|
var totalDurationLength = item.Paragraphs[0].DurationTotalMilliseconds + item.Paragraphs[1].DurationTotalMilliseconds + 1;
|
||||||
|
var pctDurationLength1 = item.Paragraphs[0].DurationTotalMilliseconds * 100.0 / totalDurationLength;
|
||||||
|
var pctDurationLength2 = item.Paragraphs[1].DurationTotalMilliseconds * 100.0 / totalDurationLength;
|
||||||
|
var pctDurationArr = GetTwoPartsByPct(text, pctDurationLength1, pctDurationLength2);
|
||||||
|
|
||||||
|
|
||||||
|
// use best match of the three arrays considering line separator, adherence to chars/sec
|
||||||
|
|
||||||
|
// same result for char split + duration split
|
||||||
|
if (pctCharArr[0].Length > 0 && pctCharArr[0] == pctDurationArr[0])
|
||||||
|
{
|
||||||
|
return pctCharArr.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
// check max chars
|
||||||
|
var cps1 = Utilities.GetCharactersPerSecond(new Paragraph(arr[0], item.Paragraphs[0].StartTime.TotalMilliseconds, item.Paragraphs[0].EndTime.TotalMilliseconds));
|
||||||
|
var cps2 = Utilities.GetCharactersPerSecond(new Paragraph(arr[1], item.Paragraphs[1].StartTime.TotalMilliseconds, item.Paragraphs[1].EndTime.TotalMilliseconds));
|
||||||
|
|
||||||
|
var cpsChar1 = Utilities.GetCharactersPerSecond(new Paragraph(pctCharArr[0], item.Paragraphs[0].StartTime.TotalMilliseconds, item.Paragraphs[0].EndTime.TotalMilliseconds));
|
||||||
|
var cpsChar2 = Utilities.GetCharactersPerSecond(new Paragraph(pctCharArr[1], item.Paragraphs[1].StartTime.TotalMilliseconds, item.Paragraphs[1].EndTime.TotalMilliseconds));
|
||||||
|
|
||||||
|
var cpsDuration1 = Utilities.GetCharactersPerSecond(new Paragraph(pctDurationArr[0], item.Paragraphs[0].StartTime.TotalMilliseconds, item.Paragraphs[0].EndTime.TotalMilliseconds));
|
||||||
|
var cpsDuration2 = Utilities.GetCharactersPerSecond(new Paragraph(pctDurationArr[1], item.Paragraphs[1].StartTime.TotalMilliseconds, item.Paragraphs[1].EndTime.TotalMilliseconds));
|
||||||
|
|
||||||
|
if (pctCharArr[0].Length > 0 && pctCharArr[0].EndsWith(',') &&
|
||||||
|
cpsChar1 < Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds &&
|
||||||
|
cpsChar2 < Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds)
|
||||||
|
{
|
||||||
|
return pctCharArr.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pctDurationArr[0].Length > 0 && pctDurationArr[0].EndsWith(',') &&
|
||||||
|
cpsDuration1 < Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds &&
|
||||||
|
cpsDuration2 < Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds)
|
||||||
|
{
|
||||||
|
return pctDurationArr.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pctCharArr[0].Length > 0 &&
|
||||||
|
cpsChar1 < Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds &&
|
||||||
|
cpsChar2 < Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds)
|
||||||
|
{
|
||||||
|
return pctCharArr.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pctDurationArr[0].Length > 0 &&
|
||||||
|
cpsDuration1 < Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds &&
|
||||||
|
cpsDuration2 < Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds)
|
||||||
|
{
|
||||||
|
return pctDurationArr.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arr[0].Length > 0 &&
|
||||||
|
cps1 < Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds &&
|
||||||
|
cps2 < Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds)
|
||||||
|
{
|
||||||
|
return arr.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pctDurationArr[0].Length > 0)
|
||||||
|
{
|
||||||
|
return pctDurationArr.ToList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TextSplit.SplitMulti(text, count, language);
|
return TextSplit.SplitMulti(text, count, language);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static string[] GetTwoPartsByPct(string text, double pctCharLength1, double pctCharLength2)
|
||||||
|
{
|
||||||
|
var idx = (int)Math.Round(text.Length * pctCharLength1 / 100.0, MidpointRounding.AwayFromZero);
|
||||||
|
for (var i = 0; i < idx; i++)
|
||||||
|
{
|
||||||
|
var j = idx - i;
|
||||||
|
if (j > 1 && text[j] == ' ')
|
||||||
|
{
|
||||||
|
return new[] { text.Substring(0, j).Trim(), text.Substring(j + 1).Trim() };
|
||||||
|
}
|
||||||
|
|
||||||
|
var k = idx + i;
|
||||||
|
if (k < text.Length - 1 && text[k] == ' ')
|
||||||
|
{
|
||||||
|
return new[] { text.Substring(0, k).Trim(), text.Substring(k + 1).Trim() };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new[] { string.Empty, string.Empty };
|
||||||
|
}
|
||||||
|
|
||||||
private static bool IsNonMergeLanguage(TranslationPair language)
|
private static bool IsNonMergeLanguage(TranslationPair language)
|
||||||
{
|
{
|
||||||
var code = language.TwoLetterIsoLanguageName ?? language.Code;
|
var code = language.TwoLetterIsoLanguageName ?? language.Code;
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
namespace Nikse.SubtitleEdit.Forms.Translate
|
using Nikse.SubtitleEdit.Core.Common;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Nikse.SubtitleEdit.Forms.Translate
|
||||||
{
|
{
|
||||||
public static partial class MergeAndSplitHelper
|
public static partial class MergeAndSplitHelper
|
||||||
{
|
{
|
||||||
@ -9,13 +12,14 @@
|
|||||||
public int EndIndex { get; set; }
|
public int EndIndex { get; set; }
|
||||||
public bool AllItalic { get; set; }
|
public bool AllItalic { get; set; }
|
||||||
public bool AllBold { get; set; }
|
public bool AllBold { get; set; }
|
||||||
public bool Continious { get; set; }
|
public bool Continuous { get; set; }
|
||||||
public char EndChar { get; set; }
|
public char EndChar { get; set; }
|
||||||
public int EndCharOccurences { get; set; }
|
public int EndCharOccurrences { get; set; }
|
||||||
public bool IsEmpty { get; set; }
|
public bool IsEmpty { get; set; }
|
||||||
public bool HasError { get; set; }
|
public bool HasError { get; set; }
|
||||||
public int TextIndexStart { get; set; }
|
public int TextIndexStart { get; set; }
|
||||||
public int TextIndexEnd { get; set; }
|
public int TextIndexEnd { get; set; }
|
||||||
|
public List<Paragraph> Paragraphs { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user