mirror of
https://github.com/SubtitleEdit/subtitleedit.git
synced 2024-11-24 20:22:41 +01:00
Merge branch 'SubtitleEdit:main' into main
This commit is contained in:
commit
0a73ee6147
@ -14,7 +14,10 @@
|
||||
* Update Finnish translation - thx Teijo S
|
||||
* Update Chinese translation - thx nkh0472
|
||||
* Update French translation - thx Pierre
|
||||
* Update Italian language - thx bovirus
|
||||
* Update Russian translation - thx elfriob
|
||||
* Update Polish translation - thx admas
|
||||
* Update Dutch translation - thx Flitskikker
|
||||
* Improve auto-translate re-split (two lines only)
|
||||
* Some "Beautify time codes" improvements - thx Flitskikker
|
||||
* Set file name after .MKS file import - thx RedSoxFan04
|
||||
@ -25,6 +28,8 @@
|
||||
* Update Danish OCR dictionaries - thx Claus
|
||||
* Add default icon for layout - thx PaulVeld
|
||||
* Improve Macedonian language auto detect - thx Aco
|
||||
* Auto load video when switching to layout w video - thx Dave
|
||||
* Update Libre translate languages - thx thehijacker
|
||||
* FIXED:
|
||||
* Fix Papago translate - thx banziseo
|
||||
* Fix for "outputfilename" in cmd line with SUP source - thx sapphire-bt
|
||||
@ -37,7 +42,9 @@
|
||||
* Fix for MyMemory translate to Russian/Hebrew - thx darnn
|
||||
* Fix json text decode bug - thx darnn
|
||||
* Fix for LRC time code bug - thx fineless71
|
||||
* Fix possible crash in mkv/ts reading - thx Maknol
|
||||
* Fix possible crash in MKV/TS reading - thx Maknol
|
||||
* Fix for "Add missing periods" and ASSA tags - thx Firegloom
|
||||
* Fix Whisper CPP Hebrew language code - thx Udo
|
||||
|
||||
|
||||
4.0.3 (23rd December 2023)
|
||||
|
@ -8,6 +8,7 @@ using Nikse.SubtitleEdit.Logic;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
|
||||
namespace Test.FixCommonErrors
|
||||
{
|
||||
@ -3532,5 +3533,55 @@ namespace Test.FixCommonErrors
|
||||
Assert.AreEqual("<i>It is I this illustrious illiteration. It's this...</i>", _subtitle.Paragraphs[0].Text);
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void FixMissingOpenBracketOneTest()
|
||||
{
|
||||
var engine = new FixMissingOpenBracket();
|
||||
var sub = GetGenericSub();
|
||||
sub.Paragraphs.First().Text = "Hey, FOO).";
|
||||
engine.Fix(sub, new EmptyFixCallback());
|
||||
Assert.AreEqual("(Hey, FOO).", sub.Paragraphs.First().Text);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void FixMissingOpenBracketTwoTest()
|
||||
{
|
||||
var engine = new FixMissingOpenBracket();
|
||||
var sub = GetGenericSub();
|
||||
sub.Paragraphs.First().Text = "Reaper, hostiles, 100 meters\neast. Two hundred meters south).";
|
||||
engine.Fix(sub, new EmptyFixCallback());
|
||||
Assert.AreEqual("(Reaper, hostiles, 100 meters\neast. Two hundred meters south).", sub.Paragraphs.First().Text);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void FixMissingOpenBracketThreeTest()
|
||||
{
|
||||
var engine = new FixMissingOpenBracket();
|
||||
var sub = GetGenericSub();
|
||||
sub.Paragraphs.First().Text = "- Foobar bar zzz).\n- Foo bar Zz";
|
||||
engine.Fix(sub, new EmptyFixCallback());
|
||||
Assert.AreEqual( "- (Foobar bar zzz).\n- Foo bar Zz", sub.Paragraphs.First().Text);
|
||||
}
|
||||
[TestMethod]
|
||||
public void FixMissingOpenBracketFourTest()
|
||||
{
|
||||
var engine = new FixMissingOpenBracket();
|
||||
var sub = GetGenericSub();
|
||||
sub.Paragraphs.First().Text = "Foobar THIS IS A NOISE)";
|
||||
engine.Fix(sub, new EmptyFixCallback());
|
||||
Assert.AreEqual( "Foobar (THIS IS A NOISE)", sub.Paragraphs.First().Text);
|
||||
}
|
||||
|
||||
private static Subtitle GetGenericSub()
|
||||
{
|
||||
return new Subtitle()
|
||||
{
|
||||
Paragraphs =
|
||||
{
|
||||
new Paragraph("Hello World!", 1000, 2000)
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -64,8 +64,7 @@ namespace Nikse.SubtitleEdit.Core.AudioToText
|
||||
new WhisperLanguage("vi", "vietnamese"),
|
||||
};
|
||||
|
||||
if (Configuration.Settings.Tools.WhisperChoice == WhisperChoice.Cpp ||
|
||||
Configuration.Settings.Tools.WhisperChoice == WhisperChoice.ConstMe)
|
||||
if (Configuration.Settings.Tools.WhisperChoice == WhisperChoice.ConstMe)
|
||||
{
|
||||
languages.Add(new WhisperLanguage("iw", "hebrew"));
|
||||
}
|
||||
|
@ -81,36 +81,52 @@ namespace Nikse.SubtitleEdit.Core.AutoTranslate
|
||||
{
|
||||
var languageCodes = new List<string>
|
||||
{
|
||||
"sq",
|
||||
"ar",
|
||||
"az",
|
||||
"bn",
|
||||
"bg",
|
||||
"ca",
|
||||
"zh",
|
||||
"zt",
|
||||
"cs",
|
||||
"da",
|
||||
"de",
|
||||
"el",
|
||||
"nl",
|
||||
"en",
|
||||
"eo",
|
||||
"es",
|
||||
"fa",
|
||||
"et",
|
||||
"fi",
|
||||
"fr",
|
||||
"ga",
|
||||
"de",
|
||||
"el",
|
||||
"he",
|
||||
"hi",
|
||||
"hu",
|
||||
"id",
|
||||
"ga",
|
||||
"it",
|
||||
"ja",
|
||||
"ko",
|
||||
"nl",
|
||||
"lv",
|
||||
"lt",
|
||||
"ms",
|
||||
"nb",
|
||||
"fa",
|
||||
"pl",
|
||||
"pt",
|
||||
"ro",
|
||||
"ru",
|
||||
"ru",
|
||||
"sr",
|
||||
"sk",
|
||||
"sl",
|
||||
"es",
|
||||
"sv",
|
||||
"tl",
|
||||
"th",
|
||||
"tr",
|
||||
"ur",
|
||||
"uk",
|
||||
"zh",
|
||||
"vi",
|
||||
};
|
||||
|
||||
var result = new List<TranslationPair>();
|
||||
|
@ -177,6 +177,7 @@ namespace Nikse.SubtitleEdit.Core.Common
|
||||
public string ChatGptApiKey { get; set; }
|
||||
public int ChatGptDelaySeconds { get; set; }
|
||||
public string GeminiProApiKey { get; set; }
|
||||
public bool DisableVidoInfoViaLabel { get; set; }
|
||||
public bool ListViewSyntaxColorDurationSmall { get; set; }
|
||||
public bool ListViewSyntaxColorDurationBig { get; set; }
|
||||
public bool ListViewSyntaxColorOverlap { get; set; }
|
||||
@ -5343,6 +5344,12 @@ $HorzAlign = Center
|
||||
settings.Tools.TranslateViaCopyPasteAutoCopyToClipboard = Convert.ToBoolean(subNode.InnerText, CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
subNode = node.SelectSingleNode("DisableVidoInfoViaLabel");
|
||||
if (subNode != null)
|
||||
{
|
||||
settings.Tools.DisableVidoInfoViaLabel = Convert.ToBoolean(subNode.InnerText, CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
subNode = node.SelectSingleNode("ListViewSyntaxColorDurationSmall");
|
||||
if (subNode != null)
|
||||
{
|
||||
@ -11789,6 +11796,7 @@ $HorzAlign = Center
|
||||
textWriter.WriteElementString("ChatGptApiKey", settings.Tools.ChatGptApiKey);
|
||||
textWriter.WriteElementString("ChatGptDelaySeconds", settings.Tools.ChatGptDelaySeconds.ToString(CultureInfo.InvariantCulture));
|
||||
textWriter.WriteElementString("GeminiProApiKey", settings.Tools.GeminiProApiKey);
|
||||
textWriter.WriteElementString("DisableVidoInfoViaLabel", settings.Tools.DisableVidoInfoViaLabel.ToString(CultureInfo.InvariantCulture));
|
||||
textWriter.WriteElementString("ListViewSyntaxColorDurationSmall", settings.Tools.ListViewSyntaxColorDurationSmall.ToString(CultureInfo.InvariantCulture));
|
||||
textWriter.WriteElementString("ListViewSyntaxColorDurationBig", settings.Tools.ListViewSyntaxColorDurationBig.ToString(CultureInfo.InvariantCulture));
|
||||
textWriter.WriteElementString("ListViewSyntaxColorLongLines", settings.Tools.ListViewSyntaxColorLongLines.ToString(CultureInfo.InvariantCulture));
|
||||
|
@ -243,14 +243,20 @@ namespace Nikse.SubtitleEdit.Core.Forms.FixCommonErrors
|
||||
return text;
|
||||
}
|
||||
|
||||
if (Utilities.CountTagInText(text, "\"") == 1 && Utilities.CountTagInText(text, "”") == 1)
|
||||
const string doubleQuote = "\"";
|
||||
if (Utilities.CountTagInText(text, doubleQuote) == 1)
|
||||
{
|
||||
return text.Replace("”", "\"");
|
||||
}
|
||||
if (Utilities.CountTagInText(text, "\"") == 1 && Utilities.CountTagInText(text, "“") == 1)
|
||||
{
|
||||
return text.Replace("“", "\"");
|
||||
if (Utilities.CountTagInText(text, "”") == 1)
|
||||
{
|
||||
return text.Replace("”", doubleQuote);
|
||||
}
|
||||
|
||||
if (Utilities.CountTagInText(text, "“") == 1)
|
||||
{
|
||||
return text.Replace("“", doubleQuote);
|
||||
}
|
||||
}
|
||||
|
||||
return text;
|
||||
}
|
||||
}
|
||||
|
@ -35,8 +35,12 @@ namespace Nikse.SubtitleEdit.Core.Forms.FixCommonErrors
|
||||
text = text.TrimEnd();
|
||||
text = text.Replace("... " + Environment.NewLine, "..." + Environment.NewLine);
|
||||
text = text.Replace("... </", "...</"); // </i>, </font>...
|
||||
text = text.Replace("... ?", "...?");
|
||||
text = text.Replace("... !", "...!");
|
||||
|
||||
if (callbacks.Language != "fr")
|
||||
{
|
||||
text = text.Replace("... ?", "...?");
|
||||
text = text.Replace("... !", "...!");
|
||||
}
|
||||
|
||||
if (text.IndexOf(Environment.NewLine, StringComparison.Ordinal) > 1)
|
||||
{
|
||||
|
@ -1,6 +1,7 @@
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
using Nikse.SubtitleEdit.Core.Interfaces;
|
||||
using System;
|
||||
using System.Linq;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Forms.FixCommonErrors
|
||||
{
|
||||
@ -11,96 +12,131 @@ namespace Nikse.SubtitleEdit.Core.Forms.FixCommonErrors
|
||||
public static string FixMissingOpenBracket { get; set; } = "Fix missing [ or ( in line";
|
||||
}
|
||||
|
||||
private static string Fix(string text, string openB)
|
||||
{
|
||||
string pre = string.Empty;
|
||||
string closeB = openB == "(" ? ")" : "]";
|
||||
private static bool IsIgnorable(char ch) => char.IsWhiteSpace(ch) || ch == '-';
|
||||
|
||||
if (text.Contains(" " + closeB))
|
||||
private static char GetOpeningPair(char tag) => tag == ')' ? '(' : '[';
|
||||
|
||||
private static int CalcInsertPositionFromBeginning(string input)
|
||||
{
|
||||
var len = input.Length;
|
||||
var i = 0;
|
||||
|
||||
// skip asa tag
|
||||
while (i < len && input[i] == '{')
|
||||
{
|
||||
openB = openB + " ";
|
||||
i = input.IndexOf('}', i + 1) + 1;
|
||||
if (i == 0) break;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
if (text.Length > 1 && text.StartsWith('-'))
|
||||
{
|
||||
pre += "- ";
|
||||
if (text[1] == ' ')
|
||||
{
|
||||
text = text.Substring(2);
|
||||
}
|
||||
else
|
||||
{
|
||||
text = text.Substring(1);
|
||||
}
|
||||
}
|
||||
if (text.Length > 3 && text.StartsWith("<i>", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
pre += "<i>";
|
||||
if (text[3] == ' ')
|
||||
{
|
||||
text = text.Substring(4);
|
||||
}
|
||||
else
|
||||
{
|
||||
text = text.Substring(3);
|
||||
}
|
||||
}
|
||||
if (text.Length > 1 && (text[0] == ' ' || text[0] == '.'))
|
||||
{
|
||||
pre += text[0] == '.' ? '.' : ' ';
|
||||
text = text.Substring(1);
|
||||
while (text.Length > 0 && text[0] == '.')
|
||||
{
|
||||
pre += ".";
|
||||
text = text.Substring(1);
|
||||
}
|
||||
text = text.TrimStart(' ');
|
||||
}
|
||||
} while (text.StartsWith("<i>", StringComparison.Ordinal) || text.StartsWith('-'));
|
||||
while (i < len && IsIgnorable(input[i])) i++;
|
||||
|
||||
text = pre + openB + text;
|
||||
return text;
|
||||
// skip html tags
|
||||
while (i < len && input[i] == '<')
|
||||
{
|
||||
i = input.IndexOf('>', i + 1) + 1;
|
||||
if (i == 0) break;
|
||||
}
|
||||
|
||||
// skip anything that is not a letter or digit
|
||||
while (i < len && !char.IsLetterOrDigit(input[i])) i++;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
private static string RestoreMissingOpenParenthesis(string input)
|
||||
{
|
||||
var len = input.Length;
|
||||
|
||||
// empty string
|
||||
if (len == 0) return input;
|
||||
|
||||
var closeTags = new[] { ']', ')' };
|
||||
// ignore line if contains opening
|
||||
if (input.Any(ch => ch == '(' || ch == '[')) return input;
|
||||
|
||||
var ci = input.IndexOfAny(closeTags);
|
||||
// invalid position
|
||||
if (ci < 1) return input;
|
||||
|
||||
var k = ci - 1;
|
||||
// jump backward if uppercase or any one of the ignorable chars
|
||||
while (k > 0 && char.IsUpper(input[k]) || IsIgnorable(input[k])) k--;
|
||||
|
||||
// note if we have case like: "Hey, FOO)." then we want to insert the open before the "Hey"
|
||||
if (k > 0 && input[k] == ',')
|
||||
{
|
||||
k--;
|
||||
while (k > 0 && char.IsLetterOrDigit(input[k])) k--;
|
||||
}
|
||||
|
||||
// try landing on white-space char
|
||||
if (k >= 0 && k + 1 < len && input[k] != ' ' && input[k + 1] == ' ') k++;
|
||||
// try finding first valid char (this is used to not insert '(' or '[') in to left of a white-space
|
||||
while (k < ci && char.IsWhiteSpace(input[k])) k++;
|
||||
|
||||
// FO) => (FO)
|
||||
if (ci - k > 1)
|
||||
{
|
||||
input = input.Insert(k, GetOpeningPair(input[ci]).ToString());
|
||||
}
|
||||
else
|
||||
{
|
||||
// recalculate value of k from beginning
|
||||
k = CalcInsertPositionFromBeginning(input);
|
||||
if (k < ci)
|
||||
{
|
||||
input = input.Insert(k, GetOpeningPair(input[ci]).ToString());
|
||||
}
|
||||
}
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
private static bool IsPerLineRestoration(string[] lines) => lines.Length == 1 || lines.All(l => l.HasSentenceEnding());
|
||||
|
||||
public void Fix(Subtitle subtitle, IFixCallbacks callbacks)
|
||||
{
|
||||
string fixAction = Language.FixMissingOpenBracket;
|
||||
int fixCount = 0;
|
||||
for (int i = 0; i < subtitle.Paragraphs.Count; i++)
|
||||
var fixAction = Language.FixMissingOpenBracket;
|
||||
var fixCount = 0;
|
||||
for (var i = 0; i < subtitle.Paragraphs.Count; i++)
|
||||
{
|
||||
var p = subtitle.Paragraphs[i];
|
||||
|
||||
if (callbacks.AllowFix(p, fixAction))
|
||||
{
|
||||
var hit = false;
|
||||
string oldText = p.Text;
|
||||
var openIdx = p.Text.IndexOf('(');
|
||||
var closeIdx = p.Text.IndexOf(')');
|
||||
if (closeIdx >= 0 && (closeIdx < openIdx || openIdx < 0))
|
||||
var oldText = p.Text;
|
||||
var text = p.Text;
|
||||
|
||||
// split only if both lines are closed
|
||||
var lines = p.Text.SplitToLines().ToArray();
|
||||
// logic to perform for when line is/are closed.
|
||||
if (IsPerLineRestoration(lines))
|
||||
{
|
||||
p.Text = Fix(p.Text, "(");
|
||||
hit = true;
|
||||
var count = lines.Length;
|
||||
for (var j = 0; j < count; j++)
|
||||
{
|
||||
lines[j] = RestoreMissingOpenParenthesis(lines[j]);
|
||||
}
|
||||
|
||||
// rebuild the text
|
||||
text = count > 1 ? string.Join(Environment.NewLine, lines) : lines[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
// handles 2+ lines even if the their adjacent is not closed
|
||||
text = RestoreMissingOpenParenthesis(text);
|
||||
}
|
||||
|
||||
openIdx = p.Text.IndexOf('[');
|
||||
closeIdx = p.Text.IndexOf(']');
|
||||
if (closeIdx >= 0 && (closeIdx < openIdx || openIdx < 0))
|
||||
{
|
||||
p.Text = Fix(p.Text, "[");
|
||||
hit = true;
|
||||
}
|
||||
|
||||
if (hit)
|
||||
if (oldText.Length != text.Length)
|
||||
{
|
||||
fixCount++;
|
||||
p.Text = text;
|
||||
callbacks.AddFixToListView(p, fixAction, oldText, p.Text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
callbacks.UpdateFixStatus(fixCount, Language.FixMissingOpenBracket);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
using Nikse.SubtitleEdit.Core.Interfaces;
|
||||
using System;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
using Nikse.SubtitleEdit.Core.Interfaces;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Forms.FixCommonErrors
|
||||
{
|
||||
@ -12,105 +12,120 @@ namespace Nikse.SubtitleEdit.Core.Forms.FixCommonErrors
|
||||
public static string StartWithUppercaseLetterAfterColon { get; set; } = "Start with uppercase letter after colon/semicolon";
|
||||
}
|
||||
|
||||
private static readonly char[] ExpectedChars = { ':', ';' };
|
||||
public void Fix(Subtitle subtitle, IFixCallbacks callbacks)
|
||||
{
|
||||
string fixAction = Language.StartWithUppercaseLetterAfterColon;
|
||||
int noOfFixes = 0;
|
||||
for (int i = 0; i < subtitle.Paragraphs.Count; i++)
|
||||
var fixAction = Language.StartWithUppercaseLetterAfterColon;
|
||||
var noOfFixes = 0;
|
||||
|
||||
var count = subtitle.Paragraphs.Count;
|
||||
var isTurkish = IsTurkish(callbacks.Language);
|
||||
// paragraph
|
||||
for (var i = 0; i < count; i++)
|
||||
{
|
||||
var p = new Paragraph(subtitle.Paragraphs[i]);
|
||||
Paragraph last = subtitle.GetParagraphOrDefault(i - 1);
|
||||
string oldText = p.Text;
|
||||
int skipCount = 0;
|
||||
|
||||
if (last != null)
|
||||
var p = subtitle.Paragraphs[i];
|
||||
if (!callbacks.AllowFix(p, fixAction))
|
||||
{
|
||||
string lastText = HtmlUtil.RemoveHtmlTags(last.Text);
|
||||
if (lastText.EndsWith(':') || lastText.EndsWith(';'))
|
||||
{
|
||||
var st = new StrippableText(p.Text);
|
||||
if (st.StrippedText.Length > 0 && st.StrippedText[0] != char.ToUpper(st.StrippedText[0]))
|
||||
{
|
||||
p.Text = st.Pre + char.ToUpper(st.StrippedText[0]) + st.StrippedText.Substring(1) + st.Post;
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (oldText.Contains(ExpectedChars))
|
||||
|
||||
var text = p.Text;
|
||||
var len = text.Length;
|
||||
|
||||
// text
|
||||
for (var j = 0; j < len; j++)
|
||||
{
|
||||
bool lastWasColon = false;
|
||||
for (int j = 0; j < p.Text.Length; j++)
|
||||
var ch = text[j];
|
||||
if (ch == ':' || ch == ';')
|
||||
{
|
||||
var s = p.Text[j];
|
||||
if (s == ':' || s == ';')
|
||||
var k = j + 1;
|
||||
|
||||
// skip white space before formatting
|
||||
while (k < len && text[k] == ' ') k++;
|
||||
// skip formatting e.g: <i>, <b>,<font..>...
|
||||
while (k < len && text[k] == '<' || text[k] == '{')
|
||||
{
|
||||
lastWasColon = true;
|
||||
var closingPair = GetClosingPair(text[k]);
|
||||
var closeIdx = text.IndexOf(closingPair, k + 1);
|
||||
if (closeIdx < 0)
|
||||
{
|
||||
k++;
|
||||
break;
|
||||
}
|
||||
k = closeIdx + 1;
|
||||
}
|
||||
else if (lastWasColon)
|
||||
// skip whitespace after formatting
|
||||
while (k < len && text[k] == ' ') k++;
|
||||
|
||||
if (k < len)
|
||||
{
|
||||
// skip whitespace index
|
||||
if (j + 2 < p.Text.Length && p.Text[j] == ' ')
|
||||
// slice from k index
|
||||
var textFromK = text.Substring(k);
|
||||
|
||||
if (CanCapitalize(textFromK, callbacks) && !isTurkish)
|
||||
{
|
||||
s = p.Text[++j];
|
||||
text = text.Substring(0, k) + textFromK.CapitalizeFirstLetter();
|
||||
}
|
||||
|
||||
var startFromJ = p.Text.Substring(j);
|
||||
if (startFromJ.Length > 3 && startFromJ[0] == '<' && startFromJ[2] == '>' && (startFromJ[1] == 'i' || startFromJ[1] == 'b' || startFromJ[1] == 'u'))
|
||||
else if (Helper.IsTurkishLittleI(text[k], callbacks.Encoding, callbacks.Language))
|
||||
{
|
||||
skipCount = 2;
|
||||
}
|
||||
else if (startFromJ.StartsWith("<font ", StringComparison.OrdinalIgnoreCase) && p.Text.Substring(j).Contains('>'))
|
||||
{
|
||||
skipCount = (j + startFromJ.IndexOf('>', 6)) - j;
|
||||
}
|
||||
else if (Helper.IsTurkishLittleI(s, callbacks.Encoding, callbacks.Language))
|
||||
{
|
||||
p.Text = p.Text.Remove(j, 1).Insert(j, Helper.GetTurkishUppercaseLetter(s, callbacks.Encoding).ToString(CultureInfo.InvariantCulture));
|
||||
lastWasColon = false;
|
||||
}
|
||||
else if (char.IsLower(s))
|
||||
{
|
||||
// iPhone
|
||||
bool change = true;
|
||||
if (s == 'i' && p.Text.Length > j + 1)
|
||||
{
|
||||
if (p.Text[j + 1] == char.ToUpper(p.Text[j + 1]))
|
||||
{
|
||||
change = false;
|
||||
}
|
||||
}
|
||||
if (change)
|
||||
{
|
||||
p.Text = p.Text.Remove(j, 1).Insert(j, char.ToUpper(s).ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
|
||||
lastWasColon = false;
|
||||
}
|
||||
else if (!(" " + Environment.NewLine).Contains(s))
|
||||
{
|
||||
lastWasColon = false;
|
||||
}
|
||||
|
||||
// move the: 'j' pointer and reset skipCount to 0
|
||||
if (skipCount > 0)
|
||||
{
|
||||
j += skipCount;
|
||||
skipCount = 0;
|
||||
text = text.Remove(j, 1).Insert(j, Helper.GetTurkishUppercaseLetter(text[k], callbacks.Encoding).ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (oldText != p.Text && callbacks.AllowFix(p, fixAction))
|
||||
if (text != p.Text)
|
||||
{
|
||||
noOfFixes++;
|
||||
subtitle.Paragraphs[i].Text = p.Text;
|
||||
var oldText = subtitle.Paragraphs[i].Text;
|
||||
subtitle.Paragraphs[i].Text = text;
|
||||
callbacks.AddFixToListView(subtitle.Paragraphs[i], fixAction, oldText, p.Text);
|
||||
}
|
||||
}
|
||||
|
||||
callbacks.UpdateFixStatus(noOfFixes, Language.StartWithUppercaseLetterAfterColon);
|
||||
|
||||
char GetClosingPair(char ch) => ch == '<' ? '>' : '}';
|
||||
}
|
||||
|
||||
private static bool IsTurkish(string lang) => lang.Equals("tr", StringComparison.OrdinalIgnoreCase);
|
||||
|
||||
private static bool CanCapitalize(string input, IFixCallbacks callbacks)
|
||||
{
|
||||
return !IsAppleNaming(input) && BeginsWithLetter(input);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if first character is convertible to uppercase otherwise false
|
||||
/// </summary>
|
||||
private static bool BeginsWithLetter(string input)
|
||||
{
|
||||
if (input.Length == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var ch = input[0];
|
||||
|
||||
return char.IsLetter(ch) && char.IsLower(ch);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check if word is one of the apple product name e.g; iPhone, iPad, iMac...
|
||||
/// </summary>
|
||||
private static bool IsAppleNaming(string input)
|
||||
{
|
||||
if (string.IsNullOrEmpty(input))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var len = input.Length;
|
||||
if (len < 3)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return input[0] == 'i' && char.IsUpper(input[1]) && char.IsLower(input[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -267,6 +267,21 @@ namespace Nikse.SubtitleEdit.Controls
|
||||
KeyDown?.Invoke(sender, e);
|
||||
Invalidate();
|
||||
}
|
||||
else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A)
|
||||
{
|
||||
_textBox.SelectAll();
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
if (e.Modifiers == Keys.Control && e.KeyCode == Keys.C)
|
||||
{
|
||||
_textBox.Copy();
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
if (e.Modifiers == Keys.Control && e.KeyCode == Keys.V)
|
||||
{
|
||||
_textBox.Paste();
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
KeyDown?.Invoke(sender, e);
|
||||
|
@ -36487,7 +36487,7 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
|
||||
private void labelVideoInfo_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (string.IsNullOrEmpty(_videoFileName) || _videoInfo == null)
|
||||
if (string.IsNullOrEmpty(_videoFileName) || _videoInfo == null || Configuration.Settings.Tools.DisableVidoInfoViaLabel)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
<General>
|
||||
<Title>Subtitle Edit</Title>
|
||||
<Version>4.0.3</Version>
|
||||
<TranslatedBy>Tradotto da NAMP e bovirus - Data traduzione: 20.02.2024</TranslatedBy>
|
||||
<TranslatedBy>Tradotto da NAMP e bovirus - Data traduzione: 22.02.2024</TranslatedBy>
|
||||
<CultureName>it-IT</CultureName>
|
||||
<HelpFile />
|
||||
<Ok>OK</Ok>
|
||||
@ -965,7 +965,7 @@ Si sfrutta così il ritmo intrinseco dell'immagine.</CreateSimpleChainingToolTip
|
||||
<FixDoubleDash>Correggi '--' -> '...'</FixDoubleDash>
|
||||
<FixDoubleGreaterThan>Elimina >></FixDoubleGreaterThan>
|
||||
<FixEllipsesStart>Elimina puntini iniziali '...'</FixEllipsesStart>
|
||||
<FixMissingOpenBracket>Correggi [ mancante nella riga</FixMissingOpenBracket>
|
||||
<FixMissingOpenBracket>Correggi [ o ( mancante nella riga</FixMissingOpenBracket>
|
||||
<FixMusicNotation>Sostituisci simboli musicali (esempio âTª) con simboli preferiti</FixMusicNotation>
|
||||
<FixDoubleDashExample>'Oh sì!' -> 'Wow... oh sì!'</FixDoubleDashExample>
|
||||
<FixDoubleGreaterThanExample>'>> Roberto: La zuppa è pronta!' -> 'Roberto: La zuppa è pronta!'</FixDoubleGreaterThanExample>
|
||||
|
@ -10,10 +10,11 @@
|
||||
<Cancel>&Anuluj</Cancel>
|
||||
<Yes>Tak</Yes>
|
||||
<No>Nie</No>
|
||||
<Close>Zamknij</Close>
|
||||
<Apply>Zastosuj</Apply>
|
||||
<ApplyTo>Zastosuj do</ApplyTo>
|
||||
<None>Brak</None>
|
||||
<All>Wszystko</All>
|
||||
<All>Wszystkie</All>
|
||||
<Preview>Podgląd</Preview>
|
||||
<ShowPreview>Pokaż podgląd</ShowPreview>
|
||||
<HidePreview>Ukryj podgląd</HidePreview>
|
||||
@ -404,6 +405,11 @@ Kliknij "{0}", aby najpierw wyodrębnić lub zaimportować zmiany ujęć, albo w
|
||||
<BatchAlignTimeCodes>Dopasuj kody czasowe do kodów czasowych klatki</BatchAlignTimeCodes>
|
||||
<BatchUseExactTimeCodes>Użyj dokładnych kodów czasowych (jeśli są dostępne)</BatchUseExactTimeCodes>
|
||||
<BatchSnapToShotChanges>Przyciągaj wskaźniki do zmian ujęcia (jeśli są dostępne)</BatchSnapToShotChanges>
|
||||
<UnfixableParagraphsTitle>Przegląd nie w pełni połączonych napisów</UnfixableParagraphsTitle>
|
||||
<UnfixableParagraphsInstructions>Niektóre napisy nie zostały w pełni połączone zgodnie z profilem użytkownika, najprawdopodobniej z powodu zbyt ciasno zgrupowanych zmian ujęć (możliwe fałszywe alarmy). Możesz przejrzeć te przypadki ręcznie, aby upewnić się, że wskazówki są przyciągane do prawidłowych (rzeczywistych) zmian ujęcia.</UnfixableParagraphsInstructions>
|
||||
<UnfixableParagraphsColumnParagraphs>Linie</UnfixableParagraphsColumnParagraphs>
|
||||
<UnfixableParagraphsColumnParagraphsFormat>#{0} – #{1}</UnfixableParagraphsColumnParagraphsFormat>
|
||||
<UnfixableParagraphsColumnGap>Odstęp (klatki)</UnfixableParagraphsColumnGap>
|
||||
</BeautifyTimeCodes>
|
||||
<BeautifyTimeCodesProfile>
|
||||
<Title>Edycja profilu</Title>
|
||||
@ -427,6 +433,7 @@ Kliknij "{0}", aby najpierw wyodrębnić lub zaimportować zmiany ujęć, albo w
|
||||
<Chaining>Łączenie</Chaining>
|
||||
<InCueOnShot>Wskaźnik wejściowy zmiany ujęcia</InCueOnShot>
|
||||
<OutCueOnShot>Wskaźnik wyjściowy zmiany ujęcia</OutCueOnShot>
|
||||
<CheckGeneral>Nadal egzekwuj zasady ogólne, jeśli nie ma to na nie wpływu</CheckGeneral>
|
||||
<MaxGap>Maksymalny odstęp:</MaxGap>
|
||||
<ShotChangeBehavior>Jeśli w międzyczasie nastąpi zmiana ujęcia:</ShotChangeBehavior>
|
||||
<DontChain>Nie łącz</DontChain>
|
||||
@ -956,7 +963,7 @@ Wykorzystujemy naturalny rytm obrazu.</CreateSimpleChainingToolTip>
|
||||
<FixDoubleDash>Popraw '--' na wielokropek '...'</FixDoubleDash>
|
||||
<FixDoubleGreaterThan>Usuń '>>'</FixDoubleGreaterThan>
|
||||
<FixEllipsesStart>Usuń wiodący wielokropek '...'</FixEllipsesStart>
|
||||
<FixMissingOpenBracket>Popraw brakujący '[' w linii</FixMissingOpenBracket>
|
||||
<FixMissingOpenBracket>Popraw brakujący '[' lub '(' w linii</FixMissingOpenBracket>
|
||||
<FixMusicNotation>Zastąp symbole muzyczne (np. âTª) preferowanym symbolem</FixMusicNotation>
|
||||
<FixDoubleDashExample>'Ach-- tak!' -> 'Ach... tak!'</FixDoubleDashExample>
|
||||
<FixDoubleGreaterThanExample>'>> Robert: Siema, stary!' -> 'Robert: Siema, stary!'</FixDoubleGreaterThanExample>
|
||||
@ -1051,9 +1058,9 @@ Wykorzystujemy naturalny rytm obrazu.</CreateSimpleChainingToolTip>
|
||||
<PoweredByX>Obsługiwane przez {0}</PoweredByX>
|
||||
<MsClientSecretNeeded>Przepraszamy, potrzebujesz klucza do usług poznawczych "Translator Text" firmy Microsoft, aby móc korzystać z najnowszego programu Microsoft Translator.
|
||||
|
||||
Przejdź do "Opcje -> Ustawienia -> Narzędzia", aby wpisać swój klucz.</MsClientSecretNeeded>
|
||||
Przejdź do "Opcje -> Ustawienia -> Tłumaczenie automatyczne", aby wpisać swój klucz.</MsClientSecretNeeded>
|
||||
<GoogleNoApiKeyWarning>Spróbuję przetłumaczyć bez klucza API... (powolne i z ograniczonymi danymi).
|
||||
Aby użyć klucza API przejdź do "Opcje -> Ustawienia -> Narzędzia", aby wprowadzić swój klucz API tłumacza Google.</GoogleNoApiKeyWarning>
|
||||
Aby użyć klucza API przejdź do "Opcje -> Ustawienia -> Tłumaczenie automatyczne", aby wprowadzić swój klucz API tłumacza Google.</GoogleNoApiKeyWarning>
|
||||
<Service>Usługa:</Service>
|
||||
<LineMergeHandling>Połącz linie:</LineMergeHandling>
|
||||
<ProcessorMergeNext>Połącz maksymalnie dwie linie</ProcessorMergeNext>
|
||||
@ -1319,6 +1326,7 @@ Aby użyć klucza API przejdź do "Opcje -> Ustawienia -> Narzędzia", aby
|
||||
<CloseTranslation>Zamknij przetłumaczone napisy</CloseTranslation>
|
||||
<OpenContainingFolder>Otwórz folder zawierający wideo</OpenContainingFolder>
|
||||
<Compare>&Porównaj...</Compare>
|
||||
<VerifyCompleteness>Zweryfikuj kompletność...</VerifyCompleteness>
|
||||
<Statistics>S&tatystyki...</Statistics>
|
||||
<Plugins>&Wtyczki...</Plugins>
|
||||
<ImportSubtitleFromVideoFile>Napisy z pliku wideo...</ImportSubtitleFromVideoFile>
|
||||
@ -1565,6 +1573,7 @@ Aby użyć klucza API przejdź do "Opcje -> Ustawienia -> Narzędzia", aby
|
||||
<Subscript>Indeks dolny</Subscript>
|
||||
<Alignment>Wyrównanie...</Alignment>
|
||||
<AutoBalanceSelectedLines>Automatycznie zrównoważ wybrane linie...</AutoBalanceSelectedLines>
|
||||
<EvenlyDistributeSelectedLines>Równomierne rozmieszczenie wybranych linii (ZNS)</EvenlyDistributeSelectedLines>
|
||||
<RemoveLineBreaksFromSelectedLines>Usuń łamanie linii z zaznaczonych linii...</RemoveLineBreaksFromSelectedLines>
|
||||
<TypewriterEffect>Efekt maszyny do pisania...</TypewriterEffect>
|
||||
<KaraokeEffect>Efekt karaoke...</KaraokeEffect>
|
||||
@ -1836,6 +1845,8 @@ Kontynuować?</SubtitleAppendPrompt>
|
||||
<SortedByX>Wykonano sortowanie wg: {0}</SortedByX>
|
||||
<BeforeAutoBalanceSelectedLines>Przed automatycznym zrównoważeniem wybranych linii</BeforeAutoBalanceSelectedLines>
|
||||
<NumberOfLinesAutoBalancedX>Liczba automatycznie zrównoważonych linii: {0}</NumberOfLinesAutoBalancedX>
|
||||
<BeforeEvenlyDistributeSelectedLines>Przed równomiernym rozmieszczeniem wybranych linii</BeforeEvenlyDistributeSelectedLines>
|
||||
<NumberOfLinesEvenlyDistributedX>Liczba równomiernie rozmieszczonych linii: {0}</NumberOfLinesEvenlyDistributedX>
|
||||
<BeforeRemoveLineBreaksInSelectedLines>Przed usunięciem łamania linii z wybranych linii</BeforeRemoveLineBreaksInSelectedLines>
|
||||
<NumberOfWithRemovedLineBreakX>Liczba linii z usuniętym łamaniem linii: {0}</NumberOfWithRemovedLineBreakX>
|
||||
<BeforeMultipleReplace>Przed wielokrotnymi zastąpieniami</BeforeMultipleReplace>
|
||||
@ -2609,6 +2620,7 @@ może edytować ten sam plik napisów (współpraca)</Information>
|
||||
<MergeDialogWithNext>Połącz dialog z następnym (wstaw myślniki)</MergeDialogWithNext>
|
||||
<MergeDialogWithPrevious>Połącz dialog z poprzednim (wstaw myślniki)</MergeDialogWithPrevious>
|
||||
<AutoBalanceSelectedLines>Automatyczne równoważenie wybranych linii</AutoBalanceSelectedLines>
|
||||
<EvenlyDistributeSelectedLines>Równomierne rozmieszczenie wybranych linii (ZNS)</EvenlyDistributeSelectedLines>
|
||||
<GoToNext>Przejdź do następnej linii</GoToNext>
|
||||
<GoToNextPlayTranslate>Przejdź do następnej linii (i odtwarzaj w "Trybie tłumacza")</GoToNextPlayTranslate>
|
||||
<GoToNextCursorAtEnd>Przejdź do następnej linii i ustaw kursor na końcu</GoToNextCursorAtEnd>
|
||||
@ -2708,6 +2720,7 @@ może edytować ten sam plik napisów (współpraca)</Information>
|
||||
<AudioExtractSelectedLines>Wyodrębnij audio (wybrane linie)</AudioExtractSelectedLines>
|
||||
<AudioToTextSelectedLinesX>Audio na tekst wybranych linii ({0})</AudioToTextSelectedLinesX>
|
||||
<VideoToggleBrightness>Przełącz jasność (tylko mpv)</VideoToggleBrightness>
|
||||
<AutoTranslateSelectedLines>Tłumaczenie automatyczne wybranych linii</AutoTranslateSelectedLines>
|
||||
<CustomSearch1>Tłumaczenie, wyszukiwanie niestandardowe 1</CustomSearch1>
|
||||
<CustomSearch2>Tłumaczenie, wyszukiwanie niestandardowe 2</CustomSearch2>
|
||||
<CustomSearch3>Tłumaczenie, wyszukiwanie niestandardowe 3</CustomSearch3>
|
||||
@ -2837,6 +2850,8 @@ Kontynuować?</RestoreDefaultSettingsMsg>
|
||||
<ExportAsHtml>Eksportuj jako HTML...</ExportAsHtml>
|
||||
<SetNewActor>Ustaw nowego aktora/głos</SetNewActor>
|
||||
<SetActorX>Ustaw aktora/głos {0}</SetActorX>
|
||||
<Used>Używane</Used>
|
||||
<Unused>Nieużywane</Unused>
|
||||
</Settings>
|
||||
<SettingsMpv>
|
||||
<DownloadMpv>Pobierz bibliotekę mpv</DownloadMpv>
|
||||
@ -3150,6 +3165,21 @@ Kontynuować?</RestoreDefaultSettingsMsg>
|
||||
<Message>Jeśli chcesz to naprawić, wyślij e-mail na adres mailto: niksedk@gmail.com i dołącz kopię napisów.</Message>
|
||||
<ImportAsPlainText>Importuj jako zwykły tekst...</ImportAsPlainText>
|
||||
</UnknownSubtitle>
|
||||
<VerifyCompleteness>
|
||||
<Title>Weryfikacja kompletności na podstawie innych napisów</Title>
|
||||
<OpenControlSubtitle>Otwórz napisy kontrolne</OpenControlSubtitle>
|
||||
<ControlSubtitleError>Napisy kontrolne są puste lub nie można ich wczytać.</ControlSubtitleError>
|
||||
<ControlSubtitleX>Napisy kontrolne: {0}</ControlSubtitleX>
|
||||
<Coverage>Pokrywanie się</Coverage>
|
||||
<CoveragePercentageX>{0:0.##}%</CoveragePercentageX>
|
||||
<SortByCoverage>Sortuj wg stopnia pokrywania się</SortByCoverage>
|
||||
<SortByTime>Sortuj wg czasu</SortByTime>
|
||||
<Reload>Zweryfikuj ponownie</Reload>
|
||||
<Insert>Wstaw</Insert>
|
||||
<InsertAndNext>Wstaw i idź do następnego</InsertAndNext>
|
||||
<Dismiss>Odrzuć</Dismiss>
|
||||
<DismissAndNext>Odrzuć i idź do następnego</DismissAndNext>
|
||||
</VerifyCompleteness>
|
||||
<VisualSync>
|
||||
<Title>Synchronizacja wizualna</Title>
|
||||
<StartScene>Scena początkowa</StartScene>
|
||||
|
@ -3,14 +3,14 @@
|
||||
<General>
|
||||
<Title>Subtitle Edit</Title>
|
||||
<Version>4.0.3</Version>
|
||||
<TranslatedBy>Перевод на русский: Leserg (mailto:leserg@ua.fm)
|
||||
Последующие правки и дополнения перевода: Elheym https://discord.gg/Z7a5qtDc || (mailto:Subs.for.everybody@gmail.com)</TranslatedBy>
|
||||
<TranslatedBy>Перевод на русский: Leserg | Elheym | elfriob</TranslatedBy>
|
||||
<CultureName>ru-RU</CultureName>
|
||||
<HelpFile />
|
||||
<Ok>ОК</Ok>
|
||||
<Cancel>Отмена</Cancel>
|
||||
<Yes>Да</Yes>
|
||||
<No>Нет</No>
|
||||
<Close>Закрыть</Close>
|
||||
<Apply>Применить</Apply>
|
||||
<ApplyTo>Применить к</ApplyTo>
|
||||
<None>Нет</None>
|
||||
@ -109,8 +109,8 @@
|
||||
</General>
|
||||
<About>
|
||||
<Title>О программе</Title>
|
||||
<AboutText1>Subtitle Edit - это свободное программное обеспечение,
|
||||
распространяемое на основании общественной лицензии GNU.
|
||||
<AboutText1>Subtitle Edit - это бесплатное программное обеспечение,
|
||||
распространяемое на условиях GNU Public License.
|
||||
Вы можете свободно распространять, модифицировать и
|
||||
использовать программу по своему усмотрению.
|
||||
|
||||
@ -154,7 +154,7 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
Командная строка: {1} {2}</WaveFileNotFound>
|
||||
<WaveFileMalformed>{0} не удалось извлечь форму сигнала из аудио-файла!
|
||||
|
||||
Командная строка: {1} {2} Примечание: Проверьте свободное место на диске</WaveFileMalformed>
|
||||
Командная строка: {1} {2} Примечание: проверьте свободное место на диске</WaveFileMalformed>
|
||||
<LowDiskSpace>Недостаточно свободного места на диске!</LowDiskSpace>
|
||||
<FreeDiskSpace>{0} свободно</FreeDiskSpace>
|
||||
<NoAudioTracksFoundGenerateEmptyWaveform>Звуковые дорожки не найдены! Создать пустую форму сигнала?</NoAudioTracksFoundGenerateEmptyWaveform>
|
||||
@ -177,7 +177,7 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<Recalculate>Перерасчёта</Recalculate>
|
||||
<AddSeconds>Добавить секунды</AddSeconds>
|
||||
<SetAsPercent>«%» от продолжительности</SetAsPercent>
|
||||
<Note>Примечание: Временные границы субтитра будут установлены
|
||||
<Note>Примечание: временные границы субтитра будут установлены
|
||||
без наложения на следующий текст</Note>
|
||||
<Fixed>Фиксировано</Fixed>
|
||||
<Milliseconds>Миллисекунд(-ы)</Milliseconds>
|
||||
@ -313,7 +313,7 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<TitleUnbreak>Удалить переносы из выбранных строк</TitleUnbreak>
|
||||
<LinesFoundX>Найдено строк: {0}</LinesFoundX>
|
||||
<OnlyBreakLinesLongerThan>Разделять только строки длиннее, чем</OnlyBreakLinesLongerThan>
|
||||
<OnlyUnbreakLinesLongerThan>Только для строк длиннее чем</OnlyUnbreakLinesLongerThan>
|
||||
<OnlyUnbreakLinesLongerThan>Только для строк длиннее, чем</OnlyUnbreakLinesLongerThan>
|
||||
</AutoBreakUnbreakLines>
|
||||
<BatchConvert>
|
||||
<Title>Пакетная конвертация</Title>
|
||||
@ -407,6 +407,13 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<BatchAlignTimeCodes>Согласование тайм-кодов с тайм-кодами кадров</BatchAlignTimeCodes>
|
||||
<BatchUseExactTimeCodes>Использовать точные тайм-коды (если доступно)</BatchUseExactTimeCodes>
|
||||
<BatchSnapToShotChanges>Привязка метки к смене плана (если доступно)</BatchSnapToShotChanges>
|
||||
<UnfixableParagraphsTitle>Просмотреть не полностью связанные субтитры</UnfixableParagraphsTitle>
|
||||
<UnfixableParagraphsInstructions>Некоторые субтитры не полностью связаны в соответствии с вашим профилем из-за скорости изменения кадров (ложных срабатываний).
|
||||
|
||||
Такие случаи вы можете просмотреть вручную, чтобы убедиться, что реплики привязаны к правильным (реальным) изменениям кадра.</UnfixableParagraphsInstructions>
|
||||
<UnfixableParagraphsColumnParagraphs>Строки</UnfixableParagraphsColumnParagraphs>
|
||||
<UnfixableParagraphsColumnParagraphsFormat>#{0} – #{1}</UnfixableParagraphsColumnParagraphsFormat>
|
||||
<UnfixableParagraphsColumnGap>Разрыв (кадры)</UnfixableParagraphsColumnGap>
|
||||
</BeautifyTimeCodes>
|
||||
<BeautifyTimeCodesProfile>
|
||||
<Title>Редактировать профиль</Title>
|
||||
@ -430,6 +437,7 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<Chaining>Связывание</Chaining>
|
||||
<InCueOnShot>Нач. метка изм-ния плана</InCueOnShot>
|
||||
<OutCueOnShot>Кон. метка изм-ния плана</OutCueOnShot>
|
||||
<CheckGeneral>Применять общие правила, если они не затрагиваются</CheckGeneral>
|
||||
<MaxGap>Макс. интервал:</MaxGap>
|
||||
<ShotChangeBehavior>Если происходит изменение плана:</ShotChangeBehavior>
|
||||
<DontChain>Не связывать</DontChain>
|
||||
@ -439,8 +447,8 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
|
||||
Хотите продолжить?</ResetWarning>
|
||||
<CreateSimpleTitle>Создание упрощённого режима</CreateSimpleTitle>
|
||||
<CreateSimpleInstruction>Введите основные правила и текущий профиль будут обновлен.</CreateSimpleInstruction>
|
||||
<CreateSimpleGapInstruction>Минимальный интервал между субтитрами.</CreateSimpleGapInstruction>
|
||||
<CreateSimpleInstruction>Введите основные правила и текущий профиль будет обновлен</CreateSimpleInstruction>
|
||||
<CreateSimpleGapInstruction>Минимальный интервал между субтитрами</CreateSimpleGapInstruction>
|
||||
<CreateSimpleInCues>Начальные метки:</CreateSimpleInCues>
|
||||
<CreateSimpleInCues0Frames>При смене кадра</CreateSimpleInCues0Frames>
|
||||
<CreateSimpleInCues1Frames>1 кадр после смены плана</CreateSimpleInCues1Frames>
|
||||
@ -454,11 +462,11 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<CreateSimpleOutCuesGap>Минимальный интервал перед сменой плана</CreateSimpleOutCuesGap>
|
||||
<CreateSimpleSnapClosestCue>Для связанных субтитров выровняйте начальную или конечную метку по смене плана, в зависимости от того, какая из них ближе</CreateSimpleSnapClosestCue>
|
||||
<CreateSimpleMaxOffset>Макс. сдвиг:</CreateSimpleMaxOffset>
|
||||
<CreateSimpleMaxOffsetInstruction>Сигналы на этом расстоянии от смены кадров будут привязаны к смене кадров.</CreateSimpleMaxOffsetInstruction>
|
||||
<CreateSimpleMaxOffsetInstruction>Сигналы на этом расстоянии от смены кадров будут привязаны к смене кадров</CreateSimpleMaxOffsetInstruction>
|
||||
<CreateSimpleSafeZone>Безопасная зона:</CreateSimpleSafeZone>
|
||||
<CreateSimpleSafeZoneInstruction>Метки, расположенные на этом расстоянии от изменения плана, будут привязаны к изменению плана.</CreateSimpleSafeZoneInstruction>
|
||||
<CreateSimpleSafeZoneInstruction>Метки, расположенные на этом расстоянии от изменения плана, будут привязаны к изменению плана</CreateSimpleSafeZoneInstruction>
|
||||
<CreateSimpleChainingGap>Макс. интервал связывания:</CreateSimpleChainingGap>
|
||||
<CreateSimpleChainingGapInstruction>Если интервал между двумя субтитрами меньше этого значения, субтитры будут объединены.</CreateSimpleChainingGapInstruction>
|
||||
<CreateSimpleChainingGapInstruction>Если интервал между двумя субтитрами меньше этого значения, субтитры будут объединены</CreateSimpleChainingGapInstruction>
|
||||
<CreateSimpleChainingGapAfterShotChanges>После конечной метки при смене плана, интервал может быть короче</CreateSimpleChainingGapAfterShotChanges>
|
||||
<CreateSimpleChainingToolTip>Рекомендуется связывать субтитры, чтобы согласовать «ритм» с «миганием» субтитров.
|
||||
Это обеспечивает более комфортные условия просмотра.
|
||||
@ -466,7 +474,7 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
После связывания субтитры либо подключаются (т.е. субтитры исчезают, а новые субтитры появляются сразу после небольшой паузы), либо нет.
|
||||
Это даёт зрителям некоторое представление о том, когда они могут снова переключить своё внимание на экран.
|
||||
|
||||
После того, как субтитры исчезнут при смене плана, интервал связывания может быть немного короче, поскольку смены плана «сбрасывают» изображение.
|
||||
После того как субтитры исчезнут при смене плана, интервал связывания может быть немного короче, поскольку смены плана «сбрасывают» изображение.
|
||||
Мы используем естественный ритм изображения.</CreateSimpleChainingToolTip>
|
||||
<CreateSimpleLoadNetflixRules>Загрузить правила Netflix</CreateSimpleLoadNetflixRules>
|
||||
<Frames>кадры(-ов)</Frames>
|
||||
@ -960,7 +968,7 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<FixDoubleDash>Исправить символы тире «--» на многоточие «...»</FixDoubleDash>
|
||||
<FixDoubleGreaterThan>Удалить символы «>>» в начале строки</FixDoubleGreaterThan>
|
||||
<FixEllipsesStart>Удалить многоточие «...» в начале строки</FixEllipsesStart>
|
||||
<FixMissingOpenBracket>Добавить недостающие «[» в строке</FixMissingOpenBracket>
|
||||
<FixMissingOpenBracket>Добавить недостающие [ или ( в строке</FixMissingOpenBracket>
|
||||
<FixMusicNotation>Заменить музыкальные символы (напр. âTª) выбранным</FixMusicNotation>
|
||||
<FixDoubleDashExample>'Хм-- да!' -> 'Хм... да!'</FixDoubleDashExample>
|
||||
<FixDoubleGreaterThanExample>'>> Иван: Спасибо!' -> 'Иван: Спасибо!'</FixDoubleGreaterThanExample>
|
||||
@ -1053,9 +1061,9 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<PoweredByGoogleTranslate>Переводчик Google</PoweredByGoogleTranslate>
|
||||
<PoweredByMicrosoftTranslate>Переводчик Microsoft</PoweredByMicrosoftTranslate>
|
||||
<PoweredByX>Переводчик {0}</PoweredByX>
|
||||
<MsClientSecretNeeded>Извините, вам нужен секретный ключ клиента Bing от Microsoft, чтобы использовать последнюю версию Bing Translate.
|
||||
<MsClientSecretNeeded>К сожалению, для использования последней версии Microsoft Translator вам понадобится ключ «Translator Text» Cognitive Services от Microsoft.
|
||||
|
||||
Перейдите в «Параметры -> Настройки -> Инструменты», чтобы ввести свой секретный ключ клиенту Bing</MsClientSecretNeeded>
|
||||
Чтобы ввести ключ, перейдите в «Параметры -> Настройки -> Автоматический перевод», чтобы ввести ключ.</MsClientSecretNeeded>
|
||||
<GoogleNoApiKeyWarning>Попытка перевести без ключа API… (медленно и с ограничением данных)</GoogleNoApiKeyWarning>
|
||||
<Service>Сервис:</Service>
|
||||
<LineMergeHandling>Слияние строк:</LineMergeHandling>
|
||||
@ -1325,6 +1333,7 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<CloseTranslation>Закрыть переведённые субтитры</CloseTranslation>
|
||||
<OpenContainingFolder>Открыть папку с субтитрами</OpenContainingFolder>
|
||||
<Compare>Сравнить…</Compare>
|
||||
<VerifyCompleteness>Проверка полноты…</VerifyCompleteness>
|
||||
<Statistics>Статистика…</Statistics>
|
||||
<Plugins>Плагины…</Plugins>
|
||||
<ImportSubtitleFromVideoFile>Видеофайла…</ImportSubtitleFromVideoFile>
|
||||
@ -1571,6 +1580,7 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<Subscript>Нижний индекс</Subscript>
|
||||
<Alignment>Выравнивание…</Alignment>
|
||||
<AutoBalanceSelectedLines>Автовыравнивание выбранных строк…</AutoBalanceSelectedLines>
|
||||
<EvenlyDistributeSelectedLines>Равномерно распределить выбранные строки (CPS)</EvenlyDistributeSelectedLines>
|
||||
<RemoveLineBreaksFromSelectedLines>Удалить все переносы из выбранных строк…</RemoveLineBreaksFromSelectedLines>
|
||||
<TypewriterEffect>Эффект машинописи…</TypewriterEffect>
|
||||
<KaraokeEffect>Эффект караоке…</KaraokeEffect>
|
||||
@ -1843,6 +1853,8 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<SortedByX>Выполнена сортировка по: {0}</SortedByX>
|
||||
<BeforeAutoBalanceSelectedLines>Перед автовыравниванием выделенных строк</BeforeAutoBalanceSelectedLines>
|
||||
<NumberOfLinesAutoBalancedX>Число строк с автовыравниванием: {0}</NumberOfLinesAutoBalancedX>
|
||||
<BeforeEvenlyDistributeSelectedLines>Перед равномерным распределением выделенных строк</BeforeEvenlyDistributeSelectedLines>
|
||||
<NumberOfLinesEvenlyDistributedX>Равномерно распределённых строк:</NumberOfLinesEvenlyDistributedX>
|
||||
<BeforeRemoveLineBreaksInSelectedLines>Перед удалением разделителей из выбранных строк</BeforeRemoveLineBreaksInSelectedLines>
|
||||
<NumberOfWithRemovedLineBreakX>Число строк с удалёнными разделителями: {0}</NumberOfWithRemovedLineBreakX>
|
||||
<BeforeMultipleReplace>Перед множественной заменой</BeforeMultipleReplace>
|
||||
@ -2334,7 +2346,7 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<Help>Справка</Help>
|
||||
<FontInUi>Шрифт пользовательского интерфейса</FontInUi>
|
||||
<Appearance>Интерфейс</Appearance>
|
||||
<ShowFrameRate>Показывать частоту кадров в панели инструментов</ShowFrameRate>
|
||||
<ShowFrameRate>Показывать частоту кадров на панели инструментов</ShowFrameRate>
|
||||
<DefaultFrameRate>Частота кадров по умолчанию</DefaultFrameRate>
|
||||
<DefaultFileEncoding>Кодировка файла по умолчанию</DefaultFileEncoding>
|
||||
<AutoDetectAnsiEncoding>Определение ANSI кодировки</AutoDetectAnsiEncoding>
|
||||
@ -2519,16 +2531,16 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<ContinuationStyleLeadingTrailingDash>Тире</ContinuationStyleLeadingTrailingDash>
|
||||
<ContinuationStyleLeadingTrailingDashDots>Тире, но точки для пауз</ContinuationStyleLeadingTrailingDashDots>
|
||||
<ContinuationStyleCustom>Настройка</ContinuationStyleCustom>
|
||||
<CpsLineLengthStyle>cps/Длина строки</CpsLineLengthStyle>
|
||||
<CpsLineLengthStyle>CPS/Длина строки</CpsLineLengthStyle>
|
||||
<CpsLineLengthStyleCalcAll>Все символы</CpsLineLengthStyleCalcAll>
|
||||
<CpsLineLengthStyleCalcNoSpaceCpsOnly>Исключить пробелы, только cps</CpsLineLengthStyleCalcNoSpaceCpsOnly>
|
||||
<CpsLineLengthStyleCalcNoSpaceCpsOnly>Исключить пробелы, только CPS</CpsLineLengthStyleCalcNoSpaceCpsOnly>
|
||||
<CpsLineLengthStyleCalcNoSpace>Исключить пробелы</CpsLineLengthStyleCalcNoSpace>
|
||||
<CpsLineLengthStyleCalcCjk>CJK 1, латиница 0.5</CpsLineLengthStyleCalcCjk>
|
||||
<CpsLineLengthStyleCalcCjkNoSpace>CJK 1, латиница 0.5, пробел 0</CpsLineLengthStyleCalcCjkNoSpace>
|
||||
<CpsLineLengthStyleCalcIgnoreArabicDiacritics>Игнор. арабскую диакритику</CpsLineLengthStyleCalcIgnoreArabicDiacritics>
|
||||
<CpsLineLengthStyleCalcIgnoreArabicDiacriticsNoSpace>Игнор. арабскую диакритику/пробел</CpsLineLengthStyleCalcIgnoreArabicDiacriticsNoSpace>
|
||||
<CpsLineLengthStyleCalcNoSpaceOrPunctuation>Без пробелов и знак. преп. ()[]-:;,.!?</CpsLineLengthStyleCalcNoSpaceOrPunctuation>
|
||||
<CpsLineLengthStyleCalcNoSpaceOrPunctuationCpsOnly>Без пробелов и знак. преп., только cps</CpsLineLengthStyleCalcNoSpaceOrPunctuationCpsOnly>
|
||||
<CpsLineLengthStyleCalcNoSpaceOrPunctuationCpsOnly>Без пробелов и знак. преп., только CPS</CpsLineLengthStyleCalcNoSpaceOrPunctuationCpsOnly>
|
||||
<MusicSymbol>Музыкальный символ</MusicSymbol>
|
||||
<MusicSymbolsReplace>Символы на замену (через запятую)</MusicSymbolsReplace>
|
||||
<FixCommonOcrErrorsUseHardcodedRules>Исправить ошибки OCR - применить жёсткие правила</FixCommonOcrErrorsUseHardcodedRules>
|
||||
@ -2541,7 +2553,7 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<DefaultSaveAsFormatAuto>- Авто -</DefaultSaveAsFormatAuto>
|
||||
<Favorites>Избранное</Favorites>
|
||||
<FavoriteFormats>Избранные форматы</FavoriteFormats>
|
||||
<FavoriteSubtitleFormatsNote>Примечание: Избранные форматы будут отображаться первыми при выборе формата, формат по умолчанию будет всегда отображаться первым</FavoriteSubtitleFormatsNote>
|
||||
<FavoriteSubtitleFormatsNote>Примечание: избранные форматы будут отображаться первыми при выборе формата, формат по умолчанию будет всегда отображаться первым</FavoriteSubtitleFormatsNote>
|
||||
<Shortcuts>Горячие клавиши</Shortcuts>
|
||||
<Shortcut>Команда:</Shortcut>
|
||||
<Control>Ctrl</Control>
|
||||
@ -2621,6 +2633,7 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<MergeDialogWithPrevious>Объединить диалог с предыдущим (вставить тире)</MergeDialogWithPrevious>
|
||||
<AutoBalanceSelectedLines>Автоматическая балансировка выбранных линий
|
||||
</AutoBalanceSelectedLines>
|
||||
<EvenlyDistributeSelectedLines>Равномерно распределить выбранные строки (CPS)</EvenlyDistributeSelectedLines>
|
||||
<GoToNext>Перейти к следующей строке</GoToNext>
|
||||
<GoToNextPlayTranslate>Перейти к следующей строке (и играть в «Режиме перевода»)</GoToNextPlayTranslate>
|
||||
<GoToNextCursorAtEnd>Перейти к следующей строке и установить курсор в конце</GoToNextCursorAtEnd>
|
||||
@ -2795,7 +2808,7 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<MainTextBoxAssaRemoveTag>Удалить тег ASSA у курсора</MainTextBoxAssaRemoveTag>
|
||||
<MainFileSaveAll>Сохранить всё</MainFileSaveAll>
|
||||
<Miscellaneous>Разное</Miscellaneous>
|
||||
<CpsIncludesSpace>Символов/сек (cps), включая пробелы</CpsIncludesSpace>
|
||||
<CpsIncludesSpace>Символов/сек (CPS), включая пробелы</CpsIncludesSpace>
|
||||
<UseDoNotBreakAfterList>Не переносить после</UseDoNotBreakAfterList>
|
||||
<BreakEarlyForLineEnding>Переносить после конца предложения (.!?)</BreakEarlyForLineEnding>
|
||||
<BreakByPixelWidth>Переносить, где большое расстояние между символами</BreakByPixelWidth>
|
||||
@ -2808,7 +2821,7 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<HowToSignUp>Как зарегистрироваться</HowToSignUp>
|
||||
<MicrosoftTranslateApiKey>Ключ</MicrosoftTranslateApiKey>
|
||||
<MicrosoftTranslateTokenEndpoint>Конечная точка токена</MicrosoftTranslateTokenEndpoint>
|
||||
<FontNote>Примечание: Настройки шрифта применяются только к пользовательскому интерфейсу Subtitle Edit.
|
||||
<FontNote>Примечание: настройки шрифта применяются только к пользовательскому интерфейсу Subtitle Edit.
|
||||
Настройка шрифта субтитров обычно выполняется в видеоплеере, но также может быть выполнена при использовании формата субтитров
|
||||
со встроенной информацией о шрифтах, например «Advanced SubStation Alpha», или через экспорт в форматы на основе изображений.</FontNote>
|
||||
<RestoreDefaultSettings>Сбросить</RestoreDefaultSettings>
|
||||
@ -2852,6 +2865,8 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<ExportAsHtml>Экспортировать как HTML…</ExportAsHtml>
|
||||
<SetNewActor>Установить нового актёра/голос</SetNewActor>
|
||||
<SetActorX>Установить актёра/голос {0}</SetActorX>
|
||||
<Used>Используемый</Used>
|
||||
<Unused>Неиспользуемый</Unused>
|
||||
</Settings>
|
||||
<SettingsMpv>
|
||||
<DownloadMpv>Загрузить mpv</DownloadMpv>
|
||||
@ -3020,8 +3035,8 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<CharactersPerSecondMinimum>Символов/сек. - минимум: {0:0.000}</CharactersPerSecondMinimum>
|
||||
<CharactersPerSecondMaximum>Символов/сек. - максимум: {0:0.000}</CharactersPerSecondMaximum>
|
||||
<CharactersPerSecondAverage>Символов/сек. - в среднем: {0:0.000}</CharactersPerSecondAverage>
|
||||
<CharactersPerSecondExceedingOptimal>Символов/сек. - выше оптимальной ({0:0.##} cps): {1} ({2:0.00}%)</CharactersPerSecondExceedingOptimal>
|
||||
<CharactersPerSecondExceedingMaximum>Символов/сек. - выше максимума ({0:0.##} cps): {1} ({2:0.00}%)</CharactersPerSecondExceedingMaximum>
|
||||
<CharactersPerSecondExceedingOptimal>Символов/сек. - выше оптимальной ({0:0.##} CPS): {1} ({2:0.00}%)</CharactersPerSecondExceedingOptimal>
|
||||
<CharactersPerSecondExceedingMaximum>Символов/сек. - выше максимума ({0:0.##} CPS): {1} ({2:0.00}%)</CharactersPerSecondExceedingMaximum>
|
||||
<WordsPerMinuteMinimum>Слов/мин. - минимум: {0:0.000}</WordsPerMinuteMinimum>
|
||||
<WordsPerMinuteMaximum>Слов/мин. - максимум: {0:0.000}</WordsPerMinuteMaximum>
|
||||
<WordsPerMinuteAverage>Слов/мин. - среднее: {0:0.000}</WordsPerMinuteAverage>
|
||||
@ -3150,7 +3165,7 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
<TimedTextSmpteTiming>
|
||||
<Title>Синхронизация SMPTE</Title>
|
||||
<UseSmpteTiming>Использовать синхронизацию времени SMPTE для текущих субтитров?</UseSmpteTiming>
|
||||
<SmpteTimingInfo>Примечание: Синхронизацию SMPTE можно изменить в меню «Видео»</SmpteTimingInfo>
|
||||
<SmpteTimingInfo>Примечание: синхронизацию SMPTE можно изменить в меню «Видео»</SmpteTimingInfo>
|
||||
<YesAlways>Да, всегда с частотой кадров, отличной от целого числа</YesAlways>
|
||||
<NoNever>Нет, никогда</NoNever>
|
||||
</TimedTextSmpteTiming>
|
||||
@ -3166,6 +3181,21 @@ https://github.com/SubtitleEdit/subtitleedit
|
||||
файла субтитров по адресу: niksedk@gmail.com</Message>
|
||||
<ImportAsPlainText>Импортировать как обычный текст…</ImportAsPlainText>
|
||||
</UnknownSubtitle>
|
||||
<VerifyCompleteness>
|
||||
<Title>Проверка полноты по другим субтитрам</Title>
|
||||
<OpenControlSubtitle>Открыть контрольные субтитры</OpenControlSubtitle>
|
||||
<ControlSubtitleError>Контрольные субтитры пусты или не могут быть загружены</ControlSubtitleError>
|
||||
<ControlSubtitleX>Контрольные субтитры: {0}</ControlSubtitleX>
|
||||
<Coverage>Покрытие</Coverage>
|
||||
<CoveragePercentageX>{0:0.##}%</CoveragePercentageX>
|
||||
<SortByCoverage>Сортировать по покрытию</SortByCoverage>
|
||||
<SortByTime>Сортировать по времени</SortByTime>
|
||||
<Reload>Перепроверить</Reload>
|
||||
<Insert>Вставить</Insert>
|
||||
<InsertAndNext>Вставить и к следующему</InsertAndNext>
|
||||
<Dismiss>Игнорировать</Dismiss>
|
||||
<DismissAndNext>Игнор. и к следующему</DismissAndNext>
|
||||
</VerifyCompleteness>
|
||||
<VisualSync>
|
||||
<Title>Визуальная синхронизация</Title>
|
||||
<StartScene>Начало сцены</StartScene>
|
||||
|
@ -962,7 +962,7 @@ Command line: {1} {2}
|
||||
<FixDoubleDash>修复 '-- '为 '...'</FixDoubleDash>
|
||||
<FixDoubleGreaterThan>删除 '>>'</FixDoubleGreaterThan>
|
||||
<FixEllipsesStart>删除开头的 '...'</FixEllipsesStart>
|
||||
<FixMissingOpenBracket>修复行内丢失的 '['</FixMissingOpenBracket>
|
||||
<FixMissingOpenBracket>修复行内丢失的 '[' 及 '('</FixMissingOpenBracket>
|
||||
<FixMusicNotation>用自己喜欢的符号替换音符 (如 âTª)</FixMusicNotation>
|
||||
<FixDoubleDashExample>'Whoa-- um yeah!' -> 'Whoa... um yeah!'</FixDoubleDashExample>
|
||||
<FixDoubleGreaterThanExample>'>> Robert: Sup dude!' -> 'Robert: Sup dude!'</FixDoubleGreaterThanExample>
|
||||
|
@ -1626,9 +1626,9 @@ namespace Nikse.SubtitleEdit.Logic.Ocr
|
||||
}
|
||||
}
|
||||
|
||||
string wordWithCasingChanged = GetWordWithDominatedCasing(word);
|
||||
if (DoSpell(word.ToLowerInvariant()))
|
||||
{
|
||||
var wordWithCasingChanged = GetWordWithDominatedCasing(word);
|
||||
guesses.Insert(0, wordWithCasingChanged);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user