diff --git a/src/libse/Common/Utilities.cs b/src/libse/Common/Utilities.cs index 08f3657d5..dff438f41 100644 --- a/src/libse/Common/Utilities.cs +++ b/src/libse/Common/Utilities.cs @@ -1301,13 +1301,37 @@ namespace Nikse.SubtitleEdit.Core.Common } /// - /// UrlEncodes a string without the requirement for System.Web + /// UrlEncodes a string without the requirement for System.Web. + /// Will crash if text length > 2000. /// public static string UrlEncode(string text) { return Uri.EscapeDataString(text); } + /// + /// Calculates the length if the text url encoded. + /// + public static int UrlEncodeLength(string text) + { + var urlEncodeLength = 0; + foreach (var ch in text) + { + if (ch >= 'a' && ch <= 'z' || + ch >= 'A' && ch <= 'Z' || + ch >= '0' && ch <= '9') + { + urlEncodeLength++; + } + else + { + urlEncodeLength += 3; + } + } + + return urlEncodeLength; + } + /// /// UrlDecodes a string without requiring System.Web /// diff --git a/src/libse/Translate/Processor/TranslationProcessor.cs b/src/libse/Translate/Processor/TranslationProcessor.cs index cae84f8f6..c86e1bc6b 100644 --- a/src/libse/Translate/Processor/TranslationProcessor.cs +++ b/src/libse/Translate/Processor/TranslationProcessor.cs @@ -47,7 +47,7 @@ namespace Nikse.SubtitleEdit.Core.Translate.Processor { public readonly List TranslationUnits = new List(); - public int TextSize => TranslationUnits.ConvertAll(e => Utilities.UrlEncode(e.Text).Length).Sum(); + public int TextSize => TranslationUnits.ConvertAll(e => Utilities.UrlEncodeLength(e.Text)).Sum(); public int ArrayLength => TranslationUnits.Count; } @@ -103,7 +103,7 @@ namespace Nikse.SubtitleEdit.Core.Translate.Processor foreach (var translationUnit in translationUnits) { - if (currentChunk.TextSize + Utilities.UrlEncode(translationUnit.Text).Length > maxTextSize + if (currentChunk.TextSize + Utilities.UrlEncodeLength(translationUnit.Text) > maxTextSize || currentChunk.ArrayLength + 1 > maximumRequestArrayLength) { yield return currentChunk;