From 76b124cda457a8168fb32f2d00bce2badbd1c314 Mon Sep 17 00:00:00 2001 From: Ivandro Jao Date: Thu, 2 Apr 2026 14:21:19 +0100 Subject: [PATCH 01/74] Remove unused _edited field from RemoveTextForHearingImpairedViewModel The _edited list was never populated, making the branch that checked it dead code. Removed the field, its initialization, and the unreachable branch in GeneratePreview. Co-Authored-By: Claude Sonnet 4.6 --- .../RemoveTextForHearingImpairedViewModel.cs | 28 ++----------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/src/UI/Features/Tools/RemoveTextForHearingImpaired/RemoveTextForHearingImpairedViewModel.cs b/src/UI/Features/Tools/RemoveTextForHearingImpaired/RemoveTextForHearingImpairedViewModel.cs index 8ae37181c8c..d25252d2c79 100644 --- a/src/UI/Features/Tools/RemoveTextForHearingImpaired/RemoveTextForHearingImpairedViewModel.cs +++ b/src/UI/Features/Tools/RemoveTextForHearingImpaired/RemoveTextForHearingImpairedViewModel.cs @@ -77,8 +77,6 @@ public static List GetAll() private Subtitle _subtitle; private RemoveTextForHI? _removeTextForHiLib; private readonly Timer _timer; - private readonly List _edited; - private readonly IWindowService _windowService; public RemoveTextForHearingImpairedViewModel(IWindowService windowService) @@ -91,7 +89,6 @@ public RemoveTextForHearingImpairedViewModel(IWindowService windowService) Languages = new ObservableCollection(LanguageItem.GetAll()); Fixes = new ObservableCollection(); FixText = string.Empty; - _edited = new List(); _timer = new Timer(500); _timer.Elapsed += TimerElapsed; FixedSubtitle = new Subtitle(); @@ -238,11 +235,10 @@ private void GeneratePreview() { var p = _subtitle.Paragraphs[index]; _removeTextForHiLib.WarningIndex = index - 1; - if (_edited.Contains(p)) + var newText = _removeTextForHiLib.RemoveTextFromHearImpaired(p.Text, _subtitle, index, + SelectedLanguage == null ? "en" : SelectedLanguage.Code); + if (p.Text.RemoveChar(' ') != newText.RemoveChar(' ')) { - var editedParagraph = _edited.First(x => x.Id == p.Id); - var newText = editedParagraph.Text; - var apply = true; var oldItem = Fixes.FirstOrDefault(f => f.Index == index); if (oldItem != null) @@ -254,24 +250,6 @@ private void GeneratePreview() newFixes.Add(item); count++; } - else - { - var newText = _removeTextForHiLib.RemoveTextFromHearImpaired(p.Text, _subtitle, index, - SelectedLanguage == null ? "en" : SelectedLanguage.Code); - if (p.Text.RemoveChar(' ') != newText.RemoveChar(' ')) - { - var apply = true; - var oldItem = Fixes.FirstOrDefault(f => f.Index == index); - if (oldItem != null) - { - apply = oldItem.Apply; - } - - var item = new RemoveItem(apply, index, p.Text, newText, p); - newFixes.Add(item); - count++; - } - } } if (newFixes.Count == Fixes.Count) From 5d582d62d60e8b61e849847d5e0d1dc295b771f9 Mon Sep 17 00:00:00 2001 From: Ivandro Jao Date: Thu, 2 Apr 2026 14:31:41 +0100 Subject: [PATCH 02/74] refactor: simplify RemoveTextForHearingImpairedViewModel by removing unnecessary variable and inline initialization --- .../RemoveTextForHearingImpairedViewModel.cs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/UI/Features/Tools/RemoveTextForHearingImpaired/RemoveTextForHearingImpairedViewModel.cs b/src/UI/Features/Tools/RemoveTextForHearingImpaired/RemoveTextForHearingImpairedViewModel.cs index d25252d2c79..02f582eb900 100644 --- a/src/UI/Features/Tools/RemoveTextForHearingImpaired/RemoveTextForHearingImpairedViewModel.cs +++ b/src/UI/Features/Tools/RemoveTextForHearingImpaired/RemoveTextForHearingImpairedViewModel.cs @@ -229,14 +229,13 @@ private void GeneratePreview() var skipList = interjections?.SkipStartList ?? new List(); _removeTextForHiLib.ReloadInterjection(list, skipList); - var count = 0; var newFixes = new List(); + var twoLetterIsoLanguageName = SelectedLanguage == null ? "en" : SelectedLanguage.Code; for (var index = 0; index < _subtitle.Paragraphs.Count; index++) { var p = _subtitle.Paragraphs[index]; _removeTextForHiLib.WarningIndex = index - 1; - var newText = _removeTextForHiLib.RemoveTextFromHearImpaired(p.Text, _subtitle, index, - SelectedLanguage == null ? "en" : SelectedLanguage.Code); + var newText = _removeTextForHiLib.RemoveTextFromHearImpaired(p.Text, _subtitle, index, twoLetterIsoLanguageName); if (p.Text.RemoveChar(' ') != newText.RemoveChar(' ')) { var apply = true; @@ -245,10 +244,7 @@ private void GeneratePreview() { apply = oldItem.Apply; } - - var item = new RemoveItem(apply, index, p.Text, newText, p); - newFixes.Add(item); - count++; + newFixes.Add(new RemoveItem(apply, index, p.Text, newText, p)); } } From a6cda900c36ecfb7a4758a93b5647e4f31d1f571 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Thu, 2 Apr 2026 18:42:49 +0200 Subject: [PATCH 03/74] Work on plain text import auto-sync --- .../ImportPlainTextViewModel.cs | 48 ++- .../ImportPlainText/ImportPlainTextWindow.cs | 2 +- .../ImportPlainText/ScriptSyncService.cs | 319 ++++++++++++++++++ 3 files changed, 364 insertions(+), 5 deletions(-) create mode 100644 src/UI/Features/Files/ImportPlainText/ScriptSyncService.cs diff --git a/src/UI/Features/Files/ImportPlainText/ImportPlainTextViewModel.cs b/src/UI/Features/Files/ImportPlainText/ImportPlainTextViewModel.cs index b0ec9cc5491..b7b4d71a469 100644 --- a/src/UI/Features/Files/ImportPlainText/ImportPlainTextViewModel.cs +++ b/src/UI/Features/Files/ImportPlainText/ImportPlainTextViewModel.cs @@ -5,6 +5,8 @@ using CommunityToolkit.Mvvm.Input; using Nikse.SubtitleEdit.Core.Common; using Nikse.SubtitleEdit.Features.Main; +using Nikse.SubtitleEdit.Features.Video.SpeechToText; +using Nikse.SubtitleEdit.Logic; using Nikse.SubtitleEdit.Logic.Config; using Nikse.SubtitleEdit.Logic.Media; using System; @@ -38,8 +40,9 @@ public partial class ImportPlainTextViewModel : ObservableObject public bool OkPressed { get; private set; } private Subtitle _subtitle = new Subtitle(); - private string _videoFileName = string.Empty; + private string _videoFileName = string.Empty; private readonly IFileHelper _fileHelper; + private readonly IWindowService _windowService; private readonly List _textExtensions = new List { "*.txt", @@ -48,9 +51,10 @@ public partial class ImportPlainTextViewModel : ObservableObject private bool _dirty; private readonly System.Timers.Timer _timerUpdatePreview; - public ImportPlainTextViewModel(IFileHelper fileHelper) + public ImportPlainTextViewModel(IFileHelper fileHelper, IWindowService windowService) { _fileHelper = fileHelper; + _windowService = windowService; Subtitles = new ObservableCollection(); Files = new ObservableCollection(); SplitAtOptions = new ObservableCollection @@ -93,7 +97,7 @@ private void TimerUpdatePreviewElapsed(object? sender, ElapsedEventArgs e) subtitles = TimeCodeCalculator.CalculateFixedTimeCodes(subtitles, FixedDurationMs, MinGapMs); } else - { + { subtitles = TimeCodeCalculator.CalculateTimeCodes( subtitles, Se.Settings.General.SubtitleOptimalCharactersPerSeconds, @@ -242,9 +246,45 @@ private void Cancel() } [RelayCommand] - private void AlignScriptWithTimestampsFromWhisper() + private async Task AlignScriptWithTimestampsFromWhisper() { + if (Window == null) + { + return; + } + + // Wait for any pending preview update to finish populating Subtitles. + if (_dirty) + { + await Task.Delay(500); + } + + if (Subtitles.Count == 0) + { + return; + } + + if (string.IsNullOrEmpty(_videoFileName) || !File.Exists(_videoFileName)) + { + var picked = await _fileHelper.PickOpenVideoFile(Window, "Open video file for transcription"); + if (string.IsNullOrEmpty(picked)) + { + return; + } + + _videoFileName = picked; + } + + var whisperVm = await _windowService.ShowDialogAsync( + Window, + viewModel => { viewModel.Initialize(_videoFileName, -1); }); + + if (!whisperVm.OkPressed || whisperVm.TranscribedSubtitle.Paragraphs.Count == 0) + { + return; + } + ScriptSyncService.SyncScript(Subtitles.ToList(), whisperVm.TranscribedSubtitle); } diff --git a/src/UI/Features/Files/ImportPlainText/ImportPlainTextWindow.cs b/src/UI/Features/Files/ImportPlainText/ImportPlainTextWindow.cs index 1b350c3224a..66625fec462 100644 --- a/src/UI/Features/Files/ImportPlainText/ImportPlainTextWindow.cs +++ b/src/UI/Features/Files/ImportPlainText/ImportPlainTextWindow.cs @@ -70,7 +70,7 @@ public ImportPlainTextWindow(ImportPlainTextViewModel vm) var buttonAlignViaWhisper = UiUtil.MakeButton(Se.Language.File.Import.AlignViaWhisper, vm.AlignScriptWithTimestampsFromWhisperCommand); var buttonOk = UiUtil.MakeButtonOk(vm.OkCommand); var buttonCancel = UiUtil.MakeButtonCancel(vm.CancelCommand); - var panelButtons = UiUtil.MakeButtonBar(buttonOk, buttonCancel); + var panelButtons = UiUtil.MakeButtonBar(buttonAlignViaWhisper, buttonOk, buttonCancel); grid.Add(panelImport, 0); grid.Add(MakeTextBoxAndControlsView(vm), 1); diff --git a/src/UI/Features/Files/ImportPlainText/ScriptSyncService.cs b/src/UI/Features/Files/ImportPlainText/ScriptSyncService.cs new file mode 100644 index 00000000000..3f82386e705 --- /dev/null +++ b/src/UI/Features/Files/ImportPlainText/ScriptSyncService.cs @@ -0,0 +1,319 @@ +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Features.Main; +using Nikse.SubtitleEdit.Logic.Config; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Nikse.SubtitleEdit.Features.Files.ImportPlainText; + +public static class ScriptSyncService +{ + private sealed record WordTimestamp(string Word, double StartMs, double EndMs); + + private const int Lookahead = 60; + private const double SimilarityThreshold = 0.45; + + public static void SyncScript(List scriptLines, Subtitle whisperSubtitle) + { + var minDurationMs = (double)Se.Settings.General.SubtitleMinimumDisplayMilliseconds; + var maxDurationMs = (double)Se.Settings.General.SubtitleMaximumDisplayMilliseconds; + var minGapMs = (double)Se.Settings.General.MinimumMillisecondsBetweenLines; + + var whisperWords = ExtractWordTimestamps(whisperSubtitle); + if (whisperWords.Count == 0) + { + return; + } + + var scriptTokens = new List<(string Word, int LineIdx)>(); + for (var i = 0; i < scriptLines.Count; i++) + { + var rawText = HtmlUtil.RemoveHtmlTags(scriptLines[i].Text ?? string.Empty, true); + var words = rawText.Split(new[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + foreach (var word in words) + { + scriptTokens.Add((word, i)); + } + } + + if (scriptTokens.Count == 0) + { + return; + } + + var alignments = AlignWords(scriptTokens.Select(t => t.Word).ToList(), whisperWords); + + var lineStartMs = new double[scriptLines.Count]; + var lineEndMs = new double[scriptLines.Count]; + var lineHasMatch = new bool[scriptLines.Count]; + for (var i = 0; i < lineStartMs.Length; i++) + { + lineStartMs[i] = -1; + lineEndMs[i] = -1; + } + + for (var i = 0; i < alignments.Count; i++) + { + int whisperIdx = alignments[i]; + if (whisperIdx < 0) + { + continue; + } + + int lineIdx = scriptTokens[i].LineIdx; + var wt = whisperWords[whisperIdx]; + if (!lineHasMatch[lineIdx]) + { + lineStartMs[lineIdx] = wt.StartMs; + lineEndMs[lineIdx] = wt.EndMs; + lineHasMatch[lineIdx] = true; + } + else + { + lineEndMs[lineIdx] = wt.EndMs; + } + } + + InterpolateUnmatched(lineStartMs, lineEndMs, lineHasMatch, minDurationMs, minGapMs); + + // Apply min/max duration clamping + for (int i = 0; i < scriptLines.Count; i++) + { + if (lineStartMs[i] < 0) + { + continue; + } + + lineEndMs[i] = Math.Max(lineEndMs[i], lineStartMs[i] + minDurationMs); + if (maxDurationMs > 0) + { + lineEndMs[i] = Math.Min(lineEndMs[i], lineStartMs[i] + maxDurationMs); + } + } + + // Overlap prevention: ensure each line starts at least minGapMs after the previous ends + for (int i = 1; i < scriptLines.Count; i++) + { + if (lineStartMs[i] < 0 || lineStartMs[i - 1] < 0) + { + continue; + } + + var minStart = lineEndMs[i - 1] + minGapMs; + if (lineStartMs[i] < minStart) + { + lineStartMs[i] = minStart; + lineEndMs[i] = Math.Max(lineEndMs[i], lineStartMs[i] + minDurationMs); + } + } + + for (int i = 0; i < scriptLines.Count; i++) + { + if (lineStartMs[i] < 0) + { + continue; + } + + scriptLines[i].StartTime = TimeSpan.FromMilliseconds(lineStartMs[i]); + scriptLines[i].EndTime = TimeSpan.FromMilliseconds(lineEndMs[i]); + scriptLines[i].UpdateDuration(); + } + } + + private static List AlignWords(List scriptWords, List whisperWords) + { + var result = new List(scriptWords.Count); + int whisperPos = 0; + + for (int i = 0; i < scriptWords.Count; i++) + { + int windowEnd = Math.Min(whisperPos + Lookahead, whisperWords.Count); + double bestScore = SimilarityThreshold; + int bestPos = -1; + + for (int wp = whisperPos; wp < windowEnd; wp++) + { + double score = WordSimilarity(scriptWords[i], whisperWords[wp].Word); + if (score > bestScore) + { + bestScore = score; + bestPos = wp; + } + } + + result.Add(bestPos); + if (bestPos >= 0) + { + whisperPos = bestPos + 1; + } + } + + return result; + } + + private static List ExtractWordTimestamps(Subtitle subtitle) + { + var result = new List(); + + // Detect whisper word-level highlight output: each paragraph wraps its timed word in + bool isWordLevel = subtitle.Paragraphs.Any(p => p.Text.Contains("", StringComparison.OrdinalIgnoreCase)); + + if (isWordLevel) + { + foreach (var paragraph in subtitle.Paragraphs) + { + var text = paragraph.Text; + var startTag = text.IndexOf("", StringComparison.OrdinalIgnoreCase); + var endTag = text.IndexOf("", StringComparison.OrdinalIgnoreCase); + if (startTag >= 0 && endTag > startTag + 2) + { + var word = text.Substring(startTag + 3, endTag - startTag - 3).Trim(); + if (!string.IsNullOrEmpty(word)) + { + result.Add(new WordTimestamp(word, + paragraph.StartTime.TotalMilliseconds, + paragraph.EndTime.TotalMilliseconds)); + } + } + } + } + else + { + foreach (var paragraph in subtitle.Paragraphs) + { + var text = HtmlUtil.RemoveHtmlTags(paragraph.Text, true); + var words = text.Split(new[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + if (words.Length == 0) + { + continue; + } + + double startMs = paragraph.StartTime.TotalMilliseconds; + double totalMs = paragraph.EndTime.TotalMilliseconds - startMs; + int totalChars = words.Sum(w => w.Length); + + double currentMs = startMs; + foreach (var word in words) + { + double proportion = totalChars > 0 ? (double)word.Length / totalChars : 1.0 / words.Length; + double durationMs = totalMs * proportion; + result.Add(new WordTimestamp(word, currentMs, currentMs + durationMs)); + currentMs += durationMs; + } + } + } + + return result; + } + + private static void InterpolateUnmatched(double[] lineStartMs, double[] lineEndMs, bool[] lineHasMatch, double minDurationMs, double minGapMs) + { + int n = lineStartMs.Length; + var matchedIndices = new List(); + for (int i = 0; i < n; i++) + { + if (lineHasMatch[i]) + { + matchedIndices.Add(i); + } + } + + if (matchedIndices.Count == 0) + { + return; + } + + for (int i = 0; i < n; i++) + { + if (lineHasMatch[i]) + { + continue; + } + + int prevMatched = -1; + int nextMatched = -1; + + for (int m = matchedIndices.Count - 1; m >= 0; m--) + { + if (matchedIndices[m] < i) { prevMatched = matchedIndices[m]; break; } + } + for (int m = 0; m < matchedIndices.Count; m++) + { + if (matchedIndices[m] > i) { nextMatched = matchedIndices[m]; break; } + } + + if (prevMatched >= 0 && nextMatched >= 0) + { + double prevEnd = lineEndMs[prevMatched]; + double nextStart = lineStartMs[nextMatched]; + double totalGap = nextStart - prevEnd; + int gapLines = nextMatched - prevMatched; + double posInGap = i - prevMatched; + lineStartMs[i] = prevEnd + totalGap * posInGap / gapLines; + lineEndMs[i] = Math.Max(prevEnd + totalGap * (posInGap + 1) / gapLines, lineStartMs[i] + minDurationMs); + } + else if (prevMatched >= 0) + { + int offset = i - prevMatched; + lineStartMs[i] = lineEndMs[prevMatched] + (offset - 1) * minGapMs; + lineEndMs[i] = lineStartMs[i] + minGapMs; + } + else if (nextMatched >= 0) + { + int offset = nextMatched - i; + lineEndMs[i] = lineStartMs[nextMatched] - (offset - 1) * minGapMs; + lineStartMs[i] = Math.Max(0, lineEndMs[i] - minGapMs); + } + } + } + + private static string NormalizeWord(string word) + => new string(word.ToLowerInvariant().Where(char.IsLetterOrDigit).ToArray()); + + private static double WordSimilarity(string a, string b) + { + a = NormalizeWord(a); + b = NormalizeWord(b); + if (a.Length == 0 && b.Length == 0) + { + return 1.0; + } + + if (a.Length == 0 || b.Length == 0) + { + return 0.0; + } + + if (a == b) + { + return 1.0; + } + + int dist = LevenshteinDistance(a, b); + return 1.0 - (double)dist / Math.Max(a.Length, b.Length); + } + + private static int LevenshteinDistance(string a, string b) + { + int m = a.Length, n = b.Length; + var prev = new int[n + 1]; + var curr = new int[n + 1]; + for (int j = 0; j <= n; j++) + { + prev[j] = j; + } + + for (int i = 1; i <= m; i++) + { + curr[0] = i; + for (int j = 1; j <= n; j++) + { + int cost = a[i - 1] == b[j - 1] ? 0 : 1; + curr[j] = Math.Min(Math.Min(prev[j] + 1, curr[j - 1] + 1), prev[j - 1] + cost); + } + Array.Copy(curr, prev, n + 1); + } + return prev[n]; + } +} From e34f00424acd0ec26e312742a57380897b2075c8 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Thu, 2 Apr 2026 18:44:03 +0200 Subject: [PATCH 04/74] Update version to v5.0.0-beta13 --- ChangeLog.txt | 2 +- src/UI/Logic/Config/Se.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index c575767948f..5c93cda6b77 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -2,7 +2,7 @@ Subtitle Edit Changelog -v5.0.0-beta13 (xth April 2026) +v5.0.0-beta13 (2nd April 2026) * Add Turkish translation - thx Hayri * Update Italian translation - thx bovirus diff --git a/src/UI/Logic/Config/Se.cs b/src/UI/Logic/Config/Se.cs index 14f937906eb..0e3d87310ae 100644 --- a/src/UI/Logic/Config/Se.cs +++ b/src/UI/Logic/Config/Se.cs @@ -186,7 +186,7 @@ public static string TesseractModelFolder public static string SpectrogramsFolder => Path.Combine(DataFolder, "Spectrograms"); public static string ShotChangesFolder => Path.Combine(DataFolder, "ShotChanges"); - public static string Version { get; set; } = "v5.0.0-beta12"; + public static string Version { get; set; } = "v5.0.0-beta13"; public Se() { From 030693ca80a556c46d47e7888699d4bcc769441b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20R=C3=BCckert?= Date: Thu, 2 Apr 2026 14:15:09 -0300 Subject: [PATCH 05/74] Update Portuguese (Brazil).json --- .../Assets/Languages/Portuguese (Brazil).json | 154 ++++++++++++++++-- 1 file changed, 142 insertions(+), 12 deletions(-) diff --git a/src/UI/Assets/Languages/Portuguese (Brazil).json b/src/UI/Assets/Languages/Portuguese (Brazil).json index f73d3678b50..d983962b65d 100644 --- a/src/UI/Assets/Languages/Portuguese (Brazil).json +++ b/src/UI/Assets/Languages/Portuguese (Brazil).json @@ -131,6 +131,7 @@ "DoNoChange": "Não alterar", "Done": "Concluído", "DoubleWords": "Palavras duplas", + "DoubleLines": "Linhas duplas", "Download": "Baixar", "DownloadX": "Baixar {0}", "DownloadingX": "Baixando {0}", @@ -246,6 +247,7 @@ "InsertAtPositionAndFocusTextBox": "Inserir legenda na posição do vídeo e focar caixa de texto", "InsertAtPositionNoFocusTextBox": "Inserir legenda na posição do vídeo (sem caixa de texto focada)", "InsertBefore": "Inserir antes", + "InsertLine": "Inserir linha", "InsertNewSelection": "Inserir nova seleção", "InsertSubtitleAfterCurrentLine": "Inserir legenda após a linha atual...", "InsertSubtitleFileAtVideoPositionDotDotDot": "Inserir arquivo de legenda na posição do vídeo...", @@ -308,6 +310,7 @@ "NewDotDotDot": "Novo...", "NewProfile": "Novo perfil", "NewSubtitleStartKeyDownSetEndKeyUp": "Inserir legenda: Início com seta para baixo, fim com seta para cima", + "SetSubtitleStartAtVideoPositionSetEndAtKeyUpAndGoToNext": "Definir início na posição do vídeo, definir fim com tecla para cima e ir para próximo", "No": "Não", "NoFilesToConvert": "Nenhum arquivo para converter", "NoLanguageCode": "Nenhum código de idioma", @@ -482,6 +485,7 @@ "ShowCpsColumn": "Mostrar coluna \"Caracteres/seg.\"", "ShowDurationColumn": "Mostrar coluna \"Duração\"", "ShowGapColumn": "Mostrar coluna \"Pausa\"", + "ShowStartColumn": "Mostrar coluna \"Início\"", "ShowHideColumn": "Mostrar coluna \"Ocultar\"", "ShowHistory": "Mostrar histórico", "ShowLayerColumn": "Mostrar coluna \"Camada\"", @@ -490,6 +494,7 @@ "ShowStyleColumn": "Mostrar coluna \"Estilo\"", "ShowTimeCodes": "Mostrar códigos de tempo", "ShowWpmColumn": "Mostrar coluna \"Palavras/min.\"", + "ShowPixelWidthColumn": "Mostrar coluna \"Largura do pixel\"", "Shrink": "Encolher", "SingleBox": "Caixa única", "SingleLineLengths": "Comprimento linha única:", @@ -627,6 +632,7 @@ "Width": "Largura", "WindowPositionAndSize": "Posição e tamanho da janela", "WordsPerMin": "Palavras/min.", + "PixelWidth": "Largura do pixel", "Wpm": "Palavras/min.", "XFiles": "{0:#,###,##0} arquivos", "XFilesConvertedInY": "{0:#,###,##0} arquivos convertidos em {1}", @@ -638,7 +644,10 @@ "CopyToClipboard": "Copiar para a área de transferência", "PlayCurrent": "Reproduzir atual", "LeftMargin": "Margem esquerda", - "RightMargin": "Margem direita" + "RightMargin": "Margem direita", + "Installed": "Instalado", + "AdvancedDotDotDot": "Avançado...", + "ChooseAlignment": "Escolha o alinhamento" }, "Main": { "AudioTrackIsNowX": "A faixa de áudio agora é \"{0}", @@ -783,6 +792,7 @@ "MergeLinesWithSameTimeCodes": "Unir linhas com os mesmos códigos de tempo...", "SplitBreakLongLines": "Dividir", "MergeShortLines": "Mesclar linhas curtas...", + "Renumber": "Numerar novamente...", "RemoveTextForHearingImpaired": "_Remover texto para surdos...", "ConvertActors": "Converter atores...", "JoinSubtitles": "_Juntar legendas...", @@ -802,6 +812,7 @@ "SpellCheckTitle": "_Verificação ortográfica", "SpellCheck": "_Verificação ortográfica...", "FindDoubleWords": "_Localizar palavras duplicadas", + "FindDoubleLines": "_Localizar linhas duplas...", "AddNameToNamesList": "_Adicionar nome à lista de nomes...", "GetDictionaries": "_Obter dicionários...", "Video": "_Vídeo", @@ -836,6 +847,7 @@ "HelpTitle": "A_juda", "Help": "_Ajuda", "About": "So_bre...", + "CheckForUpdates": "_Verificar por atualizações...", "FixRightToLeftViaUnicodeControlCharacters": "Corrigir RTL via caracteres de controle Unicode (linhas selecionadas)", "RemoveUnicodeControlCharacters": "Remover caracteres de controle Unicode (das linhas selecionadas)", "ReverseRightToLeftStartEnd": "Reverter início/fim RTL (para linhas selecionadas)", @@ -1130,6 +1142,9 @@ "CpsGreaterThan": "CPS maior que", "LengthLessThan": "Tamanho menor que", "LengthGreaterThan": "Tamanho maior que", + "PixelLengthGreaterThan": "Tamanhdo do pixel maior que", + "GapLessThan": "Pausa em ms <", + "GapGreaterThan": "Pausa em ms >", "ExactlyOneLine": "Exatamente uma linha", "ExactlyTwoLines": "Exatamente duas linhas", "MoreThanTwoLines": "Mais de duas linhas", @@ -1149,7 +1164,13 @@ "NewCategory": "Nova categoria", "CategoryName": "Nome da categoria", "ExportReplaceRules": "Exportar regras", - "AppliedRules": "Regras aplicadas" + "AppliedRules": "Regras aplicadas", + "FindRule": "Localizar regra", + "XLinesAffected": "{0:#,##0} linhas afetadas", + "DeleteCategoryConfirm": "Excluir categoria '{0}'?", + "DeleteRuleConfirm": "Excluir regra '{0}'?", + "FindWhat": "Localizar o que", + "DescriptionOptional": "Descrição (opcional)" }, "Find": { "SearchTextWatermark": "Pesquisar texto...", @@ -1294,7 +1315,9 @@ "BackToFixList": "Voltar à lista de correções", "ApplyFixesAndClose": "Aplicar correções e fechar", "FixCommonOcrErrorsStep2": "Corrija erros comuns, etapa 2 (aplicar correções)", - "FixCommonOcrErrorsStep2FixesFoundX": "Corrigir erros comuns, etapa 2 – Correções encontradas: {0}" + "FixCommonOcrErrorsStep2FixesFoundX": "Corrigir erros comuns, etapa 2 – Correções encontradas: {0}", + "Action": "Ação", + "ApplySelectedFixes": "Aplicar correções selecionadas" }, "AdjustDurations": { "Title": "Ajustar durações", @@ -1351,6 +1374,10 @@ "PercentFoPrevious": "Pausa para anterior (%)", "GapChange": "Mudança de pausa" }, + "Renumber": { + "Title": "Numerar novamente", + "StartFromNumber": "Iniciar do número:" + }, "SortBy": { "Title": "Classificar legendas", "SortOrder": "Ordem de classificação" @@ -1470,6 +1497,24 @@ "ResizeImages": "Redimensionar imagens", "Percentage": "Porcentagem", "ResizeImagesInfo": "Insira a porcentagem para redimensionar as imagens.\r\nVisualize as alterações automaticamente." + }, + "RemoveTextForHearingImpaired": { + "Title": "Remover texto para deficientes auditivos", + "Interjections": "Interjeições", + "SkipIfStartWith": "Pular se começar com", + "RemoveTextBetween": "Remover texto entre", + "Brackets": "Colchetes", + "CurlyBrackets": "Chaves", + "Parentheses": "Parênteses", + "And": "e", + "OnlySeparateLines": "Somente linhas separadas", + "RemoveTextBeforeColon": "Remover texto antes dos dois pontos", + "OnlyIfTextIsUppercase": "Somente se o texto estiver em letras maiúsculas", + "OnlyOnSeparateLine": "Somente em linha separada", + "IfLineIsUppercase": "Se a linha estiver em maiúscula", + "IfLineContains": "Se a linha contiver", + "IfLineOnlyContainsMusicSymbols": "Se a linha contiver apenas símbolos musicais", + "RemoveInterjections": "Remover interjeições" } }, "SpellCheck": { @@ -1523,6 +1568,8 @@ "AddCurrentSubtitle": "Adicionar legenda atual", "TitleOrLanguage": "Título/idioma", "ViewMatroskaTrackX": "Ver trilha Matroska - {0}", + "ResolutionSeparator": "x", + "OpenFromUrlTitle": "Abrir arquivo de vídeo da URL", "BurnIn": { "Title": "Gerar vídeo com legendas fixas", "InfoAssaOff": "Nota: estilo Advanced Substation Alpha suportado.", @@ -1590,7 +1637,15 @@ "SelectModel": "Selecionar modelo", "ViewWhisperLogFile": "Ver arquivo de registro do Whisper", "ReDownloadX": "Baixar novamente {0}", - "DownloadingSpeechToTextModel": "Baixando modelo de fala para texto" + "DownloadingSpeechToTextModel": "Baixando modelo de fala para texto", + "WhisperPostProcessingTitle": "Pós-processamento do Whisper", + "AdjustTimings": "Ajustar tempos", + "MergeShortLines": "Unir linhas curtas", + "BreakSplitLongLines": "Quebrar/dividir linhas longas", + "FixShortDuration": "Corrigir curta duração", + "FixCasing": "Corrigir maiúsculas/minúsculas", + "AddPeriods": "Adicionar pontos", + "ChangeUnderlineToColor": "Alterar sublinhado para cor" }, "TextToSpeech": { "Title": "Texto para fala", @@ -1614,7 +1669,31 @@ "RegenerateAudio": "Regenerar áudio", "AutoContinuePlaying": "Continuar reproduzindo automaticamente", "AddingAudioToVideoFileDotDotDot": "Adicionando áudio ao arquivo de vídeo...", - "PreparingMergeDotDotDot": "Preparando união..." + "PreparingMergeDotDotDot": "Preparando união...", + "ImportVoiceDotDotDot": "Importar voz...", + "VoiceImportSuccessTitle": "Voz importada", + "VoiceXImported": "Voz '{0}' importada com sucesso", + "AdvancedTtsSettings": "Configurações avançadas de TTS", + "ProAudioPostProcessing": "Pós-processamento de áudio profissional", + "ProAudioPostProcessingDescription": "Aplica calor de equalização, gate de ruído, compressão, normalização de volume (-16 LUFS) e fade in/out a cada segmento.", + "AudioDucking": "Ducking de áudio", + "AudioDuckingDescription": "Reduz o volume do áudio do vídeo original e mistura-o com o áudio TTS, para que a faixa de áudio original ainda seja ligeiramente audível.", + "OriginalVolumePercent": "% do volume original", + "VadSilenceCompression": "Compressão de silêncio VAD", + "VadSilenceCompressionDescription": "Encurta as pausas entre as palavras antes de alterar o andamento. Usa detecção de atividade de voz para compactar apenas os intervalos de silêncio, mantendo a fala intacta. Este é o primeiro passo preferido – reduz a duração sem qualquer perda de qualidade.", + "MaxSilenceMs": "Silêncio máximo (ms)", + "HighQualityTimeStretch": "Alongamento de tempo de alta qualidade (WSOLA/elástico)", + "HighQualityTimeStretchDescription": "Usa o algoritmo elástico (WSOLA) em vez do filtro atempo padrão para alterações de velocidade que preservam o tom. Produz uma fala com som mais natural, especialmente em fatores de velocidade mais elevados. Requer librubberband em sua compilação FFmpeg - volta ao atempo automaticamente se não estiver disponível.", + "SilencePaddingMs": "Preenchimento de silêncio (ms)", + "SilencePaddingMsDescription": "Adiciona um breve silêncio no final de cada segmento. Útil para pausas entre as frases.", + "OutputSampleRate": "Taxa de amostragem de saída (0 = padrão)", + "OutputSampleRateDescription": "Reamostra todos os segmentos para a taxa de amostragem especificada (por exemplo, 44100, 48000). Defina como 0 para manter a taxa original.", + "EdgeTtsRate": "Taxa Edge-TTS", + "EdgeTtsRateDescription": "Taxa de fala para Edge-TTS, por ex. \"+50%\", \"-30%\" ou \"+0%\" como padrão.", + "EdgeTtsPitch": "Tom Edge-TTS", + "EdgeTtsPitchDescription": "Ajuste de tom para Edge-TTS, por ex. \"+10Hz\", \"-5Hz\" ou \"+0Hz\" como padrão.", + "EdgeTtsVolume": "Volume Edge-TTS", + "EdgeTtsVolumeDescription": "Ajuste de volume para Edge-TTS, por ex. \"+20%\", \"-10%\" ou \"+0%\" como padrão." }, "ShotChanges": { "TitleGenerateOrImport": "Gerar/importar mudanças de cena", @@ -1688,7 +1767,9 @@ "PointSync": "Ponto de sincronização...", "PointSyncViaOther": "Pontos de sincronização via outra legenda", "AdjustmentX": "Ajuste: {0}", - "AdjustAllShortcuts": "Atalhos de teclado:\r\n\r\n• Shift + Esquerda/Direita: Mover 10 ms\r\n• Ctrl + Esquerda/Direita: Mover 100 ms\r\n• Alt + Esquerda/Direita: Mover 500 ms" + "AdjustAllShortcuts": "Atalhos de teclado:\r\n\r\n• Shift + Esquerda/Direita: Mover 10 ms\r\n• Ctrl + Esquerda/Direita: Mover 100 ms\r\n• Alt + Esquerda/Direita: Mover 500 ms", + "OffsetInSeconds": "Deslocamento em segundos", + "SpeedFactor": "Fator de velocidade" }, "Translate": { "TranslateViaCopyPaste": "Traduzir automaticamente via copiar/colar...", @@ -1699,7 +1780,11 @@ "ReCopyTextToClipboard": "Copiar novamente texto para a área de transferência (para tradutor/IA)", "BlockXOfY": "Bloco {0} de {1}", "NoTextInClipboard": "Nenhum texto na área de transferência", - "TextInClipboardIsSameAsSourceText": "O texto na área de transferência é igual ao texto fonte. Tente novamente." + "TextInClipboardIsSameAsSourceText": "O texto na área de transferência é igual ao texto fonte. Tente novamente.", + "LineMerge": "Unir linha", + "DelayInSecondsBetweenRequests": "Atraso em segundos entre solicitações", + "MaxBytesPerRequest": "Máximo de bytes por solicitação", + "PromptText": "Texto de solicitação" }, "Options": { "Settings": { @@ -1792,7 +1877,7 @@ "MaxLines": "Colorir texto se tiver mais de {0} linhas", "UnbreakSubtitlesShortThan": "Unir legendas menores que", "NewEmptyDefaultMs": "Duração padrão da nova legenda (ms)", - "PromptDeleteLines": "Confirmar eliminação de linhas", + "PromptBeforeDelete": "Avisar antes de excluir", "RememberPositionAndSize": "Lembrar tamanho e posição da janela principal", "AutoBackupOn": "Backup automático", "AutoBackupIntervalMinutes": "Intervalo de backup automático (minutos)", @@ -1940,6 +2025,8 @@ "SplitOddLinesAction": "Ação de dividir linhas ímpares", "OcrUseWordSplitList": "OCR: use lista de divisão de palavras", "SpeechToTextSelectedLinesPromptFistTimeOnly": "Fala em texto: linhas selecionadas, solicitação de idioma/mecanismo apenas na primeira vez", + "MultipleReplaceShowDotDotDotButtons": "Substituição múltipla: mostra botões do menu de contexto", + "GridFocusTextboxAfterInsertNew": "Grade: focar caixa de texto após inserir nova legenda", "UseFocusedButtonBackgroundColor": "Use a cor de fundo do botão em foco", "FocusedButtonBackgroundColor": "Cor de fundo do botão em foco", "ForceCrLfOnSave": "Forçar CR+LF ao salvar (arquivos de legenda de texto)", @@ -1955,7 +2042,8 @@ "AllSettings": "Todas as configurações", "UiScale": "Escala da interface (%)", "WaveformToolbarItems": "Itens da barra de ferramentas da forma de onda", - "MatchIconColorToDarkTheme": "Combinar cor do ícone com a cor de primeiro plano do tema escuro" + "MatchIconColorToDarkTheme": "Combinar cor do ícone com a cor de primeiro plano do tema escuro", + "SubtitlePreviewProperties": "Propriedades de pré-visualização de legendas" }, "Shortcuts": { "Title": "Atalhos", @@ -2165,6 +2253,7 @@ "GoToPreviousError": "Ir para erro anterior", "AddNameToNameList": "Adicionar nome à lista de nomes", "FindDoubleWords": "Encontrar palavras duplas", + "FindDoubleLines": "Localizar linhas duplas", "ColorX": "Cor {0}", "RemoveColor": "Remover cor", "SurroundWith": "Cercar com...", @@ -2225,7 +2314,13 @@ } }, "Help": { - "AboutSubtitleEdit": "Sobre o Subtitle Edit" + "AboutSubtitleEdit": "Sobre o Subtitle Edit", + "CheckForUpdates": "Verifique por atualizações", + "CheckForUpdatesChecking": "Verificando atualizações...", + "CheckForUpdatesUpToDate": "Você está executando a versão mais recente.", + "CheckForUpdatesNewVersionAvailable": "Nova versão disponível: {0}", + "CheckForUpdatesUnableToCheck": "Não foi possível verificar se há atualizações.", + "CheckForUpdatesDownloadNewVersion": "Baixar nova versão" }, "Ocr": { "LinesToDraw": "Linhas para desenhar", @@ -2295,7 +2390,8 @@ "RemoveXFromUnknownWordsList": "Remover \"{0}\" da lista de palavras desconhecidas", "DownloadingPaddleOcrEngineDotDotDot": "Baixando o mecanismo Paddle OCR...", "DownloadingPaddleOcrModelsDotDotDot": "Baixando modelos Paddle OCR...", - "PaddleOcr": "Paddle OCR" + "PaddleOcr": "Paddle OCR", + "BinaryImageCompareInspectImageMatches": "\"Comparação de imagens binárias\" - inspecionar correspondências de imagens" }, "Assa": { "AssaDraw": "Desenho ASSA", @@ -2355,6 +2451,13 @@ "BackgroundBoxCircle": "Círculo", "BackgroundBoxSpikes": "Espinhos", "BackgroundBoxBubbles": "Bolhas", + "BackgroundBoxWave": "Onda", + "BackgroundBoxHexagon": "Hexágono", + "BackgroundBoxTornPaper": "Papel rasgado", + "BackgroundBoxCloud": "Nuvem", + "BackgroundBoxTornPaperDouble": "Papel rasgado (superior e inferior)", + "BackgroundBoxStarburst": "Explosão estelar", + "BackgroundBoxScroll": "Rolagem / Pergaminho", "StylesTitle": "Estilos alfa avançados de subestação", "StylesInFile": "Estilos em arquivo", "StylesSaved": "Estilos salvos", @@ -2407,6 +2510,8 @@ "AdvancedEffectWordByWordDescription": "Revela o texto, uma palavra por vez, durante a duração da legenda", "AdvancedEffectKaraoke": "Karaokê", "AdvancedEffectKaraokeDescription": "Destaca cada caractere em sequência, revelando o texto da esquerda para a direita, como letras de karaokê", + "AdvancedEffectFancyKaraoke": "Karaokê - palavra ativa pop", + "AdvancedEffectFancyKaraokeDescription": "Aprimora as legendas com uma palavra ativa pré-marcada (por meio de sublinhado ou cor de destaque) — escurece as palavras inativas e aplica uma animação pop-glow à palavra ativa", "AdvancedEffectScrambleReveal": "Revelação de embaralhamento", "AdvancedEffectScrambleRevealDescription": "Caracteres embaralhados são decodificados no texto real da esquerda para a direita", "AdvancedEffectRainbowPulse": "Pulso arco-íris", @@ -2448,7 +2553,32 @@ "AdvancedEffectConfetti": "Explosão de confete", "AdvancedEffectConfettiDescription": "Explosão explosiva de confetes de papel giratório colorido de poppers de canto e uma estrela central em cada legenda", "AdvancedEffectHearts": "Corações (chuva)", - "AdvancedEffectHeartsDescription": "Corações desenhados em Bézier em três formas chovem suavemente do topo da tela, caindo e desaparecendo ao longo de cada legenda" + "AdvancedEffectHeartsDescription": "Corações desenhados em Bézier em três formas chovem suavemente do topo da tela, caindo e desaparecendo ao longo de cada legenda", + "AdvancedEffectWordSpacing": "Espaçamento entre palavras", + "AdvancedEffectWordSpacingDescription": "Aumenta o espaçamento entre palavras usando a tag \\fsp para melhor legibilidade", + "AdvancedEffectFancyKaraokeAutoDetectActiveWord": "Detectar automaticamente a palavra ativa", + "AdvancedEffectFancyKaraokeGlow": "Brilho da palavra ativa", + "AdvancedEffectFancyKaraokeActiveColor": "Cor ativa", + "AdvancedEffectFancyKaraokeInactiveColor": "Cor inativa", + "AdvancedEffectFancyKaraokeInactiveOpacity": "Opacidade inativa (0-255)", + "AdvancedEffectWordSpacingPixels": "Espaçamento (pixels)", + "AdvancedEffectSlowZoomOut": "Diminuição lenta do zoom", + "AdvancedEffectSlowZoomOutDescription": "O texto começa um pouco maior e diminui suavemente para o tamanho normal ao longo da duração da legenda", + "AdvancedEffectSlowZoomIn": "Aumento lento do zoom", + "AdvancedEffectSlowZoomInDescription": "O texto começa no tamanho normal e aumenta ligeiramente ao longo da duração da legenda", + "AdvancedEffectFadeIn": "Transição - fade-in", + "AdvancedEffectFadeInDescription": "Um efeito de fade-in por linha onde a tela começa preta e revela o vídeo.", + "AdvancedEffectFadeOut": "Transição - fade-out", + "AdvancedEffectFadeOutDescription": "Um efeito de fade-out por linha em que a tela fica preta.", + "AdvancedEffectTvClose": "Transição - Desligar TV", + "AdvancedEffectTvCloseDescription": "As barras pretas crescem para dentro, de cima para baixo, enquanto o meio fica branco (parte superior preta/meio branco/fundo preto).\r\nA segunda metade é preta sólida.", + "AdvancedEffectSlideInLeft": "Deslizar da esquerda", + "AdvancedEffectSlideInLeftDescription": "O texto desliza da esquerda para fora da tela, é mantido e sai de volta para a esquerda", + "AdvancedEffectSlideInRight": "Deslizar da direita", + "AdvancedEffectSlideInRightDescription": "O texto desliza da direita para fora da tela, é mantido e sai de volta para a direita", + "AdvancedEffectFadeInOut": "Fade in/out", + "AdvancedEffectFadeInOutDescription": "O texto aparece gradualmente no início e desaparece no final de cada legenda", + "OverrideTagsHistory": "Substituir histórico de tags" }, "About": { "Title": "Sobre o Subtitle Edit", From e6a0b9a9b74df479f2efbafb080d89fd3642bbb7 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Fri, 3 Apr 2026 11:08:57 +0200 Subject: [PATCH 06/74] Work on #10518 --- .../SyntaxColorTooWideSettingsWindow.cs | 8 ++-- .../Sync/VisualSync/VisualSyncWindow.cs | 2 +- .../FixNetflixErrorsViewModel.cs | 24 +----------- .../MergeShortLines/MergeShortLinesHelper.cs | 2 +- .../MergeShortLinesViewModel.cs | 2 +- .../Translate/TranslateSettingsViewModel.cs | 4 +- .../Features/Video/BurnIn/BurnInEffectItem.cs | 19 ++++----- .../Features/Video/BurnIn/BurnInLogoWindow.cs | 6 +-- .../BurnIn/BurnInResolutionPickerWindow.cs | 3 +- .../TextToSpeech/TextToSpeechViewModel.cs | 4 +- .../Config/Language/Edit/LanguageEditFind.cs | 2 +- .../Logic/Config/Language/LanguageGeneral.cs | 14 +++++++ .../Language/Options/LanguageSettings.cs | 2 + .../Language/Tools/LanguageBatchConvert.cs | 17 +++++++- .../Language/Tools/LanguageMergeShortLines.cs | 12 +++++- .../Tools/LanguageNetflixCheckAndFix.cs | 32 +++++++++++++++ .../Language/Translate/LanguageTranslate.cs | 2 + .../Config/Language/Video/LanguageBurnIn.cs | 2 + .../Language/Video/LanguageTextToSpeech.cs | 6 ++- .../INetflixQualityChecker.cs | 1 + .../NetflixCheckBridgeGaps.cs | 7 ++++ .../NetflixCheckDialogHyphenSpace.cs | 8 ++++ .../NetflixCheckEllipsesNotThreeDots.cs | 7 ++++ .../NetflixQualityCheck/NetflixCheckGlyph.cs | 7 ++++ .../NetflixCheckItalics.cs | 6 +++ .../NetflixQualityCheck/NetflixCheckMaxCps.cs | 7 ++++ .../NetflixCheckMaxDuration.cs | 7 ++++ .../NetflixCheckMaxLineLength.cs | 7 ++++ .../NetflixCheckMinDuration.cs | 7 ++++ .../NetflixCheckNumberOfLines.cs | 7 ++++ .../NetflixCheckNumbersOneToTenSpellOut.cs | 7 ++++ .../NetflixCheckShotChange.cs | 7 ++++ .../NetflixCheckStartNumberSpellOut.cs | 7 ++++ .../NetflixCheckTextForHiUseBrackets.cs | 7 ++++ .../NetflixCheckTimedTextFrameRate.cs | 8 ++++ .../NetflixCheckTwoFramesGap.cs | 7 ++++ .../NetflixCheckWhiteSpace.cs | 7 ++++ .../NetflixQualityController.cs | 39 ++++++++++--------- 38 files changed, 252 insertions(+), 71 deletions(-) diff --git a/src/UI/Features/Options/Settings/SyntaxColorTooWideSettings/SyntaxColorTooWideSettingsWindow.cs b/src/UI/Features/Options/Settings/SyntaxColorTooWideSettings/SyntaxColorTooWideSettingsWindow.cs index 693c0bc97bf..d1617301bbc 100644 --- a/src/UI/Features/Options/Settings/SyntaxColorTooWideSettings/SyntaxColorTooWideSettingsWindow.cs +++ b/src/UI/Features/Options/Settings/SyntaxColorTooWideSettings/SyntaxColorTooWideSettingsWindow.cs @@ -33,14 +33,14 @@ public SyntaxColorTooWideSettingsWindow(SyntaxColorTooWideSettingsViewModel vm) numericFontSize.ValueChanged += (_, _) => vm.MarkPreviewDirty(); // Row 2 – max width - var labelMaxWidth = UiUtil.MakeLabel("Max width (px):"); + var labelMaxWidth = UiUtil.MakeLabel(Se.Language.General.MaxWidthPixels); var numericMaxWidth = UiUtil.MakeNumericUpDownInt(10, 9999, 560, 120, vm, nameof(vm.MaxWidthPixels)); numericMaxWidth.ValueChanged += (_, _) => vm.MarkPreviewDirty(); // Row 3 – separator // Row 4 – sample text - var labelSampleText = UiUtil.MakeLabel("Sample text:"); + var labelSampleText = UiUtil.MakeLabel(Se.Language.General.SampleText); var textBoxSampleText = new TextBox { HorizontalAlignment = HorizontalAlignment.Stretch, @@ -50,7 +50,7 @@ public SyntaxColorTooWideSettingsWindow(SyntaxColorTooWideSettingsViewModel vm) textBoxSampleText.TextChanged += (_, _) => vm.MarkPreviewDirty(); // Row 5 – box width - var labelBoxWidth = UiUtil.MakeLabel("Box width (px):"); + var labelBoxWidth = UiUtil.MakeLabel(Se.Language.General.BoxWidthPixels); var numericBoxWidth = UiUtil.MakeNumericUpDownInt(100, 9999, 720, 120, vm, nameof(vm.SampleBoxWidth)); numericBoxWidth.ValueChanged += (_, _) => vm.MarkPreviewDirty(); @@ -69,7 +69,7 @@ public SyntaxColorTooWideSettingsWindow(SyntaxColorTooWideSettingsViewModel vm) // Row 7 – hint var hint = new TextBlock { - Text = "Green lines = max-width limit | Red area = text exceeds limit", + Text = Se.Language.Options.Settings.PixelWidthInfo, FontStyle = FontStyle.Italic, Opacity = 0.65, HorizontalAlignment = HorizontalAlignment.Left, diff --git a/src/UI/Features/Sync/VisualSync/VisualSyncWindow.cs b/src/UI/Features/Sync/VisualSync/VisualSyncWindow.cs index cc142810926..d45ee7be7f5 100644 --- a/src/UI/Features/Sync/VisualSync/VisualSyncWindow.cs +++ b/src/UI/Features/Sync/VisualSync/VisualSyncWindow.cs @@ -113,7 +113,7 @@ public VisualSyncWindow(VisualSyncViewModel vm) { new MenuItem { - Header = "Manual sync", + Header = Se.Language.General.ManualSync, Command = vm.ManualSyncCommand, }, }, diff --git a/src/UI/Features/Tools/FixNetflixErrors/FixNetflixErrorsViewModel.cs b/src/UI/Features/Tools/FixNetflixErrors/FixNetflixErrorsViewModel.cs index a41b6a9cdb0..4d48d8dabef 100644 --- a/src/UI/Features/Tools/FixNetflixErrors/FixNetflixErrorsViewModel.cs +++ b/src/UI/Features/Tools/FixNetflixErrors/FixNetflixErrorsViewModel.cs @@ -111,33 +111,11 @@ private void LoadChecks() Checks.Clear(); foreach (var checker in NetflixQualityController.GetAllCheckers()) { - var name = GetFriendlyCheckerName(checker.GetType().Name); + var name = checker.Name; Checks.Add(new NetflixCheckDisplayItem(checker, name, true)); } } - private static string GetFriendlyCheckerName(string typeName) - { - // Remove common prefix - if (typeName.StartsWith("NetflixCheck", StringComparison.Ordinal)) - { - typeName = typeName.Substring("NetflixCheck".Length); - } - - // Insert spaces before capitals - var chars = new List(); - for (int i = 0; i < typeName.Length; i++) - { - var c = typeName[i]; - if (i > 0 && char.IsUpper(c) && (char.IsLower(typeName[i - 1]) || (i + 1 < typeName.Length && char.IsLower(typeName[i + 1])))) - { - chars.Add(' '); - } - chars.Add(c); - } - return new string(chars.ToArray()); - } - private void LoadSettings() { } diff --git a/src/UI/Features/Tools/MergeShortLines/MergeShortLinesHelper.cs b/src/UI/Features/Tools/MergeShortLines/MergeShortLinesHelper.cs index e14cbf9e630..0c9f54a4145 100644 --- a/src/UI/Features/Tools/MergeShortLines/MergeShortLinesHelper.cs +++ b/src/UI/Features/Tools/MergeShortLines/MergeShortLinesHelper.cs @@ -97,7 +97,7 @@ public static MergeShortLinesResult Merge( var fix = new MergeShortLinesItem( Se.Language.Tools.MergeShortLines.Title, index + 1, - $"Merged line {j + 1} into {index + 1} - {current.Text.Replace(Environment.NewLine, " ⏎ ")}", + string.Format(Se.Language.Tools.MergeShortLines.MergedLineInfo, j + 1, index + 1, current.Text.Replace(Environment.NewLine, " ⏎ ")), new SubtitleLineViewModel(current)); fixes.Add(fix); diff --git a/src/UI/Features/Tools/MergeShortLines/MergeShortLinesViewModel.cs b/src/UI/Features/Tools/MergeShortLines/MergeShortLinesViewModel.cs index 980bb353d7d..220b3c1366f 100644 --- a/src/UI/Features/Tools/MergeShortLines/MergeShortLinesViewModel.cs +++ b/src/UI/Features/Tools/MergeShortLines/MergeShortLinesViewModel.cs @@ -107,7 +107,7 @@ private void UpdatePreview() } else { - FixesInfo = $"Lines merged: {mergeResult.MergeCount}"; + FixesInfo = string.Format(Se.Language.Tools.MergeShortLines.LinesMergedX, mergeResult.MergeCount); } }); } diff --git a/src/UI/Features/Translate/TranslateSettingsViewModel.cs b/src/UI/Features/Translate/TranslateSettingsViewModel.cs index 479f1a87813..e31c915363d 100644 --- a/src/UI/Features/Translate/TranslateSettingsViewModel.cs +++ b/src/UI/Features/Translate/TranslateSettingsViewModel.cs @@ -143,8 +143,8 @@ public void LoadValues(IAutoTranslator translator) MergeOptions = new ObservableCollection { - "Default", - "Translate each line separately", + Se.Language.General.Default, + Se.Language.Translate.TranslateEachLineSeparately, }; SelectedMergeOptions = MergeOptions[0]; diff --git a/src/UI/Features/Video/BurnIn/BurnInEffectItem.cs b/src/UI/Features/Video/BurnIn/BurnInEffectItem.cs index de5d260d1a6..40f3566c30d 100644 --- a/src/UI/Features/Video/BurnIn/BurnInEffectItem.cs +++ b/src/UI/Features/Video/BurnIn/BurnInEffectItem.cs @@ -1,4 +1,5 @@ using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Logic.Config; using System; namespace Nikse.SubtitleEdit.Features.Video.BurnIn; @@ -76,15 +77,15 @@ public static BurnInEffectItem[] List() { return [ - new BurnInEffectItem("Fix right-to-left", BurnInEffectType.FixRightToLeft), - new BurnInEffectItem("Fade in/out", BurnInEffectType.FadeInOut), - new BurnInEffectItem("Font size change", BurnInEffectType.SlowFontSizeChange), - new BurnInEffectItem("Increase font kerning", BurnInEffectType.IncreaseFontKerning), - new BurnInEffectItem("Scroll up", BurnInEffectType.SrollUp), - new BurnInEffectItem("Scroll down", BurnInEffectType.ScrollDown), - new BurnInEffectItem("Rotate in", BurnInEffectType.RotateIn), - new BurnInEffectItem("Tilt bounce", BurnInEffectType.TiltBounce), - new BurnInEffectItem("Font size bounce in", BurnInEffectType.FontSizeBounceIn) + new BurnInEffectItem(Se.Language.General.FixRightToLeft, BurnInEffectType.FixRightToLeft), + new BurnInEffectItem(Se.Language.General.FadeInOut, BurnInEffectType.FadeInOut), + new BurnInEffectItem(Se.Language.Tools.BatchConvert.SlowFontSizeChange, BurnInEffectType.SlowFontSizeChange), + new BurnInEffectItem(Se.Language.Tools.BatchConvert.IncreaseFontKerning, BurnInEffectType.IncreaseFontKerning), + new BurnInEffectItem(Se.Language.Tools.BatchConvert.ScrollUp, BurnInEffectType.SrollUp), + new BurnInEffectItem(Se.Language.Tools.BatchConvert.ScrollDown, BurnInEffectType.ScrollDown), + new BurnInEffectItem(Se.Language.Tools.BatchConvert.RotateIn, BurnInEffectType.RotateIn), + new BurnInEffectItem(Se.Language.Tools.BatchConvert.TiltBounce, BurnInEffectType.TiltBounce), + new BurnInEffectItem(Se.Language.Tools.BatchConvert.FontSizeBounceIn, BurnInEffectType.FontSizeBounceIn) ]; } } \ No newline at end of file diff --git a/src/UI/Features/Video/BurnIn/BurnInLogoWindow.cs b/src/UI/Features/Video/BurnIn/BurnInLogoWindow.cs index 13050c77974..14e0317f61a 100644 --- a/src/UI/Features/Video/BurnIn/BurnInLogoWindow.cs +++ b/src/UI/Features/Video/BurnIn/BurnInLogoWindow.cs @@ -59,7 +59,7 @@ public BurnInLogoWindow(BurnInLogoViewModel vm) var labelLogoPosition = UiUtil.MakeLabel().WithBindText(vm, nameof(vm.LogoPositionText)); // Alpha slider - var labelAlpha = UiUtil.MakeLabel("Alpha:"); + var labelAlpha = UiUtil.MakeLabel(Se.Language.General.Alpha); labelAlpha.VerticalAlignment = VerticalAlignment.Center; labelAlpha.Margin = new Thickness(20, 0, 5, 0); @@ -80,7 +80,7 @@ public BurnInLogoWindow(BurnInLogoViewModel vm) labelAlphaValue[!TextBlock.TextProperty] = new Binding("BurnInLogo.Alpha") { StringFormat = "{0}%" }; // Logo size slider - var labelSize = UiUtil.MakeLabel("Size:"); + var labelSize = UiUtil.MakeLabel(Se.Language.General.Size); labelSize.VerticalAlignment = VerticalAlignment.Center; labelSize.Margin = new Thickness(20, 0, 5, 0); @@ -220,7 +220,7 @@ public BurnInLogoWindow(BurnInLogoViewModel vm) }; // Instructions label - var instructionsLabel = UiUtil.MakeLabel("Pick a PNG image and drag it to position it on the video."); + var instructionsLabel = UiUtil.MakeLabel(Se.Language.Video.BurnIn.LogoInfo); // Buttons var buttonOk = UiUtil.MakeButtonOk(vm.OkCommand); diff --git a/src/UI/Features/Video/BurnIn/BurnInResolutionPickerWindow.cs b/src/UI/Features/Video/BurnIn/BurnInResolutionPickerWindow.cs index 3d5aa401e8b..844b43ccb3b 100644 --- a/src/UI/Features/Video/BurnIn/BurnInResolutionPickerWindow.cs +++ b/src/UI/Features/Video/BurnIn/BurnInResolutionPickerWindow.cs @@ -6,6 +6,7 @@ using Avalonia.Layout; using Avalonia.Styling; using Nikse.SubtitleEdit.Logic; +using Nikse.SubtitleEdit.Logic.Config; namespace Nikse.SubtitleEdit.Features.Video.BurnIn; @@ -16,7 +17,7 @@ public class BurnInResolutionPickerWindow : Window public BurnInResolutionPickerWindow(BurnInResolutionPickerViewModel vm) { UiUtil.InitializeWindow(this, GetType().Name); - Title = "Pick resolution"; + Title = Se.Language.General.PickResolution; SizeToContent = SizeToContent.WidthAndHeight; MaxHeight = 900; CanResize = false; diff --git a/src/UI/Features/Video/TextToSpeech/TextToSpeechViewModel.cs b/src/UI/Features/Video/TextToSpeech/TextToSpeechViewModel.cs index fb168d62c4c..26a246ebc23 100644 --- a/src/UI/Features/Video/TextToSpeech/TextToSpeechViewModel.cs +++ b/src/UI/Features/Video/TextToSpeech/TextToSpeechViewModel.cs @@ -652,8 +652,8 @@ await Dispatcher.UIThread.InvokeAsync(async () => { var answer = await MessageBox.Show( Window, - "Download Piper?", - $"{Environment.NewLine}\"Text to speech\" requires Piper.{Environment.NewLine}{Environment.NewLine}Download and use Piper?", + string.Format(Se.Language.General.DownloadX, "Piper"), + Se.Language.Video.TextToSpeech.DownloadPiperPrompt, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); diff --git a/src/UI/Logic/Config/Language/Edit/LanguageEditFind.cs b/src/UI/Logic/Config/Language/Edit/LanguageEditFind.cs index 086c45930d2..65e2aea01ea 100644 --- a/src/UI/Logic/Config/Language/Edit/LanguageEditFind.cs +++ b/src/UI/Logic/Config/Language/Edit/LanguageEditFind.cs @@ -8,7 +8,7 @@ public class LanguageEditFind public string CaseInsensitive { get; set; } public string FindPrevious { get; set; } public string FindNext { get; set; } - public string ReplaceAndFindNext { get; internal set; } + public string ReplaceAndFindNext { get; set; } public string ReplaceAll { get; set; } public string ReplaceTitle { get; set; } public string ReplaceWith { get; set; } diff --git a/src/UI/Logic/Config/Language/LanguageGeneral.cs b/src/UI/Logic/Config/Language/LanguageGeneral.cs index 00467e66f14..e65f808ed4c 100644 --- a/src/UI/Logic/Config/Language/LanguageGeneral.cs +++ b/src/UI/Logic/Config/Language/LanguageGeneral.cs @@ -649,6 +649,13 @@ public class LanguageGeneral public string Installed { get; set; } public string AdvancedDotDotDot { get; set; } public string ChooseAlignment { get; set; } + public string MaxWidthPixels { get; set; } + public string SampleText { get; set; } + public string BoxWidthPixels { get; set; } + public string FadeInOut { get; set; } + public string Alpha { get; set; } + public string PickResolution { get; set; } + public string ManualSync { get; set; } public LanguageGeneral() { @@ -1297,5 +1304,12 @@ public LanguageGeneral() Installed = "Installed"; AdvancedDotDotDot = "Advanced..."; ChooseAlignment = "Choose alignment"; + MaxWidthPixels = "Max width (pixels)"; + SampleText = "Sample text"; + BoxWidthPixels = "Box width (pixels)"; + FadeInOut = "Fade in/out"; + Alpha = "Alpha"; + PickResolution = "Pick resolution"; + ManualSync = "Manual sync"; } } \ No newline at end of file diff --git a/src/UI/Logic/Config/Language/Options/LanguageSettings.cs b/src/UI/Logic/Config/Language/Options/LanguageSettings.cs index 39147f9fc06..d8e44afe1ad 100644 --- a/src/UI/Logic/Config/Language/Options/LanguageSettings.cs +++ b/src/UI/Logic/Config/Language/Options/LanguageSettings.cs @@ -276,6 +276,7 @@ public class LanguageSettings public string WaveformToolbarItems { get; set; } public string MatchIconColorToDarkTheme { get; set; } public string SubtitlePreviewProperties { get; set; } + public string PixelWidthInfo { get; set; } public LanguageSettings() { @@ -548,6 +549,7 @@ public LanguageSettings() WaveformToolbarItems = "Waveform toolbar items"; MatchIconColorToDarkTheme = "Match icon color to dark theme foreground color"; SubtitlePreviewProperties = "Subtitle preview properties"; + PixelWidthInfo = "Green lines = max-width limit | Red area = text exceeds limit"; } public string GetContinuationStyleName(ContinuationStyle continuationStyle) diff --git a/src/UI/Logic/Config/Language/Tools/LanguageBatchConvert.cs b/src/UI/Logic/Config/Language/Tools/LanguageBatchConvert.cs index d775b985019..b32bd86a463 100644 --- a/src/UI/Logic/Config/Language/Tools/LanguageBatchConvert.cs +++ b/src/UI/Logic/Config/Language/Tools/LanguageBatchConvert.cs @@ -1,4 +1,5 @@ -using System; +using Nikse.SubtitleEdit.Features.Video.BurnIn; +using System; namespace Nikse.SubtitleEdit.Logic.Config.Language.Tools; @@ -26,6 +27,13 @@ public class LanguageBatchConvert public string EditProperties { get; set; } public string EditAttachments { get; set; } public string ErrorsExportedX { get; set; } + public string SlowFontSizeChange { get; set; } + public string IncreaseFontKerning { get; set; } + public string ScrollUp { get; set; } + public string ScrollDown { get; set; } + public string RotateIn { get; set; } + public string TiltBounce { get; set; } + public string FontSizeBounceIn { get; set; } public LanguageBatchConvert() { @@ -51,5 +59,12 @@ public LanguageBatchConvert() EditProperties = "Edit properties"; EditAttachments = "Edit attachments"; ErrorsExportedX = "Errors exported: {0}"; + SlowFontSizeChange = "Slow font size change"; + IncreaseFontKerning = "Increase font kerning"; + ScrollUp = "Scroll up"; + ScrollDown = "Scroll down"; + RotateIn = "Rotate in"; + TiltBounce = "Tilt bounce"; + FontSizeBounceIn = "Font size bounce in"; } } \ No newline at end of file diff --git a/src/UI/Logic/Config/Language/Tools/LanguageMergeShortLines.cs b/src/UI/Logic/Config/Language/Tools/LanguageMergeShortLines.cs index 34aeaefc2af..54ee3f41ac4 100644 --- a/src/UI/Logic/Config/Language/Tools/LanguageMergeShortLines.cs +++ b/src/UI/Logic/Config/Language/Tools/LanguageMergeShortLines.cs @@ -1,13 +1,21 @@ -namespace Nikse.SubtitleEdit.Logic.Config.Language; +using DocumentFormat.OpenXml.Drawing.Charts; +using System; +using static Nikse.SubtitleEdit.Features.Translate.MergeAndSplitHelper; + +namespace Nikse.SubtitleEdit.Logic.Config.Language; public class LanguageMergeShortLines { public string Title { get; set; } - public string HighlightParts { get; internal set; } + public string HighlightParts { get; set; } + public string MergedLineInfo { get; set; } + public string LinesMergedX { get; set; } public LanguageMergeShortLines() { Title = "Merge short lines"; HighlightParts = "Highlight parts (karaoke)"; + MergedLineInfo = "Merged line {0} into {1} - {2}"; + LinesMergedX = "Lines merged: {0}"; } } \ No newline at end of file diff --git a/src/UI/Logic/Config/Language/Tools/LanguageNetflixCheckAndFix.cs b/src/UI/Logic/Config/Language/Tools/LanguageNetflixCheckAndFix.cs index 9a561757d09..b98ac1c418c 100644 --- a/src/UI/Logic/Config/Language/Tools/LanguageNetflixCheckAndFix.cs +++ b/src/UI/Logic/Config/Language/Tools/LanguageNetflixCheckAndFix.cs @@ -8,6 +8,22 @@ public class LanguageNetflixCheckAndFix public string SaveNetflixQualityReport { get; set; } public string NetflixReportSaved { get; set; } public string NetFlixQualityReportSavedToX { get; set; } + public string DialogHyphenSpace { get; set; } + public string EllipsesNotThreeDots { get; set; } + public string OnlyAllowedGlyphs { get; set; } + public string Italics { get; set; } + public string MaxCharsSec { get; set; } + public string MaxDuration { get; set; } + public string MaxLineLength { get; set; } + public string MinDuration { get; set; } + public string MaxNumberOfLines { get; set; } + public string OneToTenSpellOut { get; set; } + public string ShotChanges { get; set; } + public string StartNumberSpellOut { get; set; } + public string TextforHiUseBrackets { get; set; } + public string FrameRate { get; set; } + public string TwoFrameGrap { get; set; } + public string WhiteSpace { get; set; } public LanguageNetflixCheckAndFix() { @@ -17,5 +33,21 @@ public LanguageNetflixCheckAndFix() SaveNetflixQualityReport = "Save Netflix quality report"; NetflixReportSaved = "Netflix quality report saved"; NetFlixQualityReportSavedToX = "Netflix quality report saved to:\n {0}"; + DialogHyphenSpace = "Dialog hyphen space"; + EllipsesNotThreeDots = "Use elipses (not three dots)"; + OnlyAllowedGlyphs = "Only allowed glyphs"; + Italics = "Italics"; + MaxCharsSec = "Max chars/sec"; + MaxDuration = "Max duration"; + MaxLineLength = "Max line length"; + MinDuration = "Min duration"; + MaxNumberOfLines = "Max number of lines"; + OneToTenSpellOut = "One to ten spell out"; + ShotChanges = "Shot changes"; + StartNumberSpellOut = "Start number spell out"; + TextforHiUseBrackets = "Text for HI, use brackets"; + FrameRate = "Frame rate"; + TwoFrameGrap = "Two frame gap"; + WhiteSpace = "White space"; } } \ No newline at end of file diff --git a/src/UI/Logic/Config/Language/Translate/LanguageTranslate.cs b/src/UI/Logic/Config/Language/Translate/LanguageTranslate.cs index 11c477ee874..e9c09345984 100644 --- a/src/UI/Logic/Config/Language/Translate/LanguageTranslate.cs +++ b/src/UI/Logic/Config/Language/Translate/LanguageTranslate.cs @@ -15,6 +15,7 @@ public class LanguageTranslate public string DelayInSecondsBetweenRequests { get; set; } public string MaxBytesPerRequest { get; set; } public string PromptText { get; set; } + public string TranslateEachLineSeparately { get; set; } public LanguageTranslate() { @@ -31,5 +32,6 @@ public LanguageTranslate() DelayInSecondsBetweenRequests = "Delay in seconds between requests"; MaxBytesPerRequest = "Max bytes per request"; PromptText = "Prompt text"; + TranslateEachLineSeparately = "Translate each line separately"; } } \ No newline at end of file diff --git a/src/UI/Logic/Config/Language/Video/LanguageBurnIn.cs b/src/UI/Logic/Config/Language/Video/LanguageBurnIn.cs index 95d7bac5610..c52b9cfbaaa 100644 --- a/src/UI/Logic/Config/Language/Video/LanguageBurnIn.cs +++ b/src/UI/Logic/Config/Language/Video/LanguageBurnIn.cs @@ -44,6 +44,7 @@ public class LanguageBurnIn public string VideoFileSize { get; set; } public string OneBox { get; set; } public string BoxPerLine { get; set; } + public string LogoInfo { get; set; } public LanguageBurnIn() { @@ -89,5 +90,6 @@ public LanguageBurnIn() OneBox = "One box"; BoxPerLine = "Box per line"; UseSourceResolution = "Use source resolution"; + LogoInfo = "Pick a PNG image and drag it to position it on the video."; } } \ No newline at end of file diff --git a/src/UI/Logic/Config/Language/Video/LanguageTextToSpeech.cs b/src/UI/Logic/Config/Language/Video/LanguageTextToSpeech.cs index 39c6b2e0360..ada23b60361 100644 --- a/src/UI/Logic/Config/Language/Video/LanguageTextToSpeech.cs +++ b/src/UI/Logic/Config/Language/Video/LanguageTextToSpeech.cs @@ -1,4 +1,6 @@ -namespace Nikse.SubtitleEdit.Logic.Config.Language; +using System; + +namespace Nikse.SubtitleEdit.Logic.Config.Language; public class LanguageTextToSpeech { @@ -48,6 +50,7 @@ public class LanguageTextToSpeech public string EdgeTtsPitchDescription { get; set; } public string EdgeTtsVolume { get; set; } public string EdgeTtsVolumeDescription { get; set; } + public string DownloadPiperPrompt { get; set; } public LanguageTextToSpeech() { @@ -97,5 +100,6 @@ public LanguageTextToSpeech() EdgeTtsPitchDescription = "Pitch adjustment for Edge-TTS, e.g. \"+10Hz\", \"-5Hz\", or \"+0Hz\" for default."; EdgeTtsVolume = "Edge-TTS volume"; EdgeTtsVolumeDescription = "Volume adjustment for Edge-TTS, e.g. \"+20%\", \"-10%\", or \"+0%\" for default."; + DownloadPiperPrompt = $"\"Text to speech\" requires Piper.{Environment.NewLine}{Environment.NewLine}Download and use Piper?"; } } \ No newline at end of file diff --git a/src/UI/Logic/NetflixQualityCheck/INetflixQualityChecker.cs b/src/UI/Logic/NetflixQualityCheck/INetflixQualityChecker.cs index 5239383903f..fdb915b1340 100644 --- a/src/UI/Logic/NetflixQualityCheck/INetflixQualityChecker.cs +++ b/src/UI/Logic/NetflixQualityCheck/INetflixQualityChecker.cs @@ -4,5 +4,6 @@ namespace Nikse.SubtitleEdit.Logic.NetflixQualityCheck; public interface INetflixQualityChecker { + string Name { get; } void Check(Subtitle subtitle, NetflixQualityController controller); } diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckBridgeGaps.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckBridgeGaps.cs index ad142c5d3c8..9825abd77e1 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckBridgeGaps.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckBridgeGaps.cs @@ -11,6 +11,13 @@ namespace Nikse.SubtitleEdit.Logic.NetflixQualityCheck; /// public class NetflixCheckBridgeGaps : INetflixQualityChecker { + public string Name { get; set; } + + public NetflixCheckBridgeGaps(string name) + { + Name = name; + } + public void Check(Subtitle subtitle, NetflixQualityController controller) { if (controller.Language == "ja") diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckDialogHyphenSpace.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckDialogHyphenSpace.cs index 44a6f136df1..582c4e9b3d9 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckDialogHyphenSpace.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckDialogHyphenSpace.cs @@ -8,6 +8,14 @@ namespace Nikse.SubtitleEdit.Logic.NetflixQualityCheck; /// public class NetflixCheckDialogHyphenSpace : INetflixQualityChecker { + public string Name { get; set; } + + public NetflixCheckDialogHyphenSpace(string name) + { + Name = name; + } + + public void Check(Subtitle subtitle, NetflixQualityController controller) { if (controller.Language == "ja") diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckEllipsesNotThreeDots.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckEllipsesNotThreeDots.cs index 40c1bc1d7f2..00d5c76ec6d 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckEllipsesNotThreeDots.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckEllipsesNotThreeDots.cs @@ -7,6 +7,13 @@ namespace Nikse.SubtitleEdit.Logic.NetflixQualityCheck; /// public class NetflixCheckEllipsesNotThreeDots : INetflixQualityChecker { + public string Name { get; set; } + + public NetflixCheckEllipsesNotThreeDots(string name) + { + Name = name; + } + public void Check(Subtitle subtitle, NetflixQualityController controller) { string comment = "Use the single smart character (U+2026) as opposed to three dots/periods in a row"; diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckGlyph.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckGlyph.cs index e832178ba87..dc68bd69177 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckGlyph.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckGlyph.cs @@ -13,6 +13,13 @@ public class NetflixCheckGlyph : INetflixQualityChecker { private static HashSet? _netflixGlyphs = null; + public string Name { get; set; } + + public NetflixCheckGlyph(string name) + { + Name = name; + } + private static HashSet LoadNetflixGlyphs() { if (_netflixGlyphs != null) diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckItalics.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckItalics.cs index af187630169..fac5e1401b6 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckItalics.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckItalics.cs @@ -5,6 +5,12 @@ namespace Nikse.SubtitleEdit.Logic.NetflixQualityCheck; public class NetflixCheckItalics : INetflixQualityChecker { + public string Name { get; set; } + + public NetflixCheckItalics(string name) + { + Name = name; + } public void Check(Subtitle subtitle, NetflixQualityController controller) { diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckMaxCps.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckMaxCps.cs index 1a7096aea02..04215141b3b 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckMaxCps.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckMaxCps.cs @@ -10,6 +10,13 @@ namespace Nikse.SubtitleEdit.Logic.NetflixQualityCheck; /// public class NetflixCheckMaxCps : INetflixQualityChecker { + public string Name { get; set; } + + public NetflixCheckMaxCps(string name) + { + Name = name; + } + public void Check(Subtitle subtitle, NetflixQualityController controller) { ICalcLength calc = CalcFactory.MakeCalculator(nameof(CalcAll)); diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckMaxDuration.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckMaxDuration.cs index ecbde852d8f..9d55a5e9374 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckMaxDuration.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckMaxDuration.cs @@ -7,6 +7,13 @@ namespace Nikse.SubtitleEdit.Logic.NetflixQualityCheck; /// public class NetflixCheckMaxDuration : INetflixQualityChecker { + public string Name { get; set; } + + public NetflixCheckMaxDuration(string name) + { + Name = name; + } + public void Check(Subtitle subtitle, NetflixQualityController controller) { foreach (Paragraph p in subtitle.Paragraphs) diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckMaxLineLength.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckMaxLineLength.cs index 17000f9f08e..2b675d747dd 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckMaxLineLength.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckMaxLineLength.cs @@ -11,6 +11,13 @@ namespace Nikse.SubtitleEdit.Logic.NetflixQualityCheck; /// public class NetflixCheckMaxLineLength : INetflixQualityChecker { + public string Name { get; set; } + + public NetflixCheckMaxLineLength(string name) + { + Name = name; + } + public void Check(Subtitle subtitle, NetflixQualityController controller) { foreach (var p in subtitle.Paragraphs) diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckMinDuration.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckMinDuration.cs index 9d4673320b9..94d9e98a456 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckMinDuration.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckMinDuration.cs @@ -8,6 +8,13 @@ namespace Nikse.SubtitleEdit.Logic.NetflixQualityCheck; /// public class NetflixCheckMinDuration : INetflixQualityChecker { + public string Name { get; set; } + + public NetflixCheckMinDuration(string name) + { + Name = name; + } + public void Check(Subtitle subtitle, NetflixQualityController controller) { for (int index = 0; index < subtitle.Paragraphs.Count; index++) diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckNumberOfLines.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckNumberOfLines.cs index 4213d631557..678170f54d3 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckNumberOfLines.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckNumberOfLines.cs @@ -9,6 +9,13 @@ namespace Nikse.SubtitleEdit.Logic.NetflixQualityCheck; /// public class NetflixCheckNumberOfLines : INetflixQualityChecker { + public string Name { get; set; } + + public NetflixCheckNumberOfLines(string name) + { + Name = name; + } + public void Check(Subtitle subtitle, NetflixQualityController controller) { foreach (var p in subtitle.Paragraphs) diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckNumbersOneToTenSpellOut.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckNumbersOneToTenSpellOut.cs index 29d23f148a8..493c439bd86 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckNumbersOneToTenSpellOut.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckNumbersOneToTenSpellOut.cs @@ -12,6 +12,13 @@ public class NetflixCheckNumbersOneToTenSpellOut : INetflixQualityChecker private static readonly Regex NumberOneToNine = new Regex(@"\b\d\b", RegexOptions.Compiled); private static readonly Regex NumberTen = new Regex(@"\b10\b", RegexOptions.Compiled); + public string Name { get; set; } + + public NetflixCheckNumbersOneToTenSpellOut(string name) + { + Name = name; + } + public void Check(Subtitle subtitle, NetflixQualityController controller) { if (controller.Language == "ja" || controller.Language == "ar") diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckShotChange.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckShotChange.cs index 2d1ef697a2c..b815d8b8059 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckShotChange.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckShotChange.cs @@ -14,6 +14,13 @@ public class NetflixCheckShotChange : INetflixQualityChecker { public static string ShotChangeDirectory = string.Empty; + public string Name { get; set; } + + public NetflixCheckShotChange(string name) + { + Name = name; + } + public void Check(Subtitle subtitle, NetflixQualityController controller) { if (!controller.VideoExists) diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckStartNumberSpellOut.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckStartNumberSpellOut.cs index 5c804061c52..28c84b9cb00 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckStartNumberSpellOut.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckStartNumberSpellOut.cs @@ -12,6 +12,13 @@ public class NetflixCheckStartNumberSpellOut : INetflixQualityChecker private static readonly Regex NumberStartInside = new Regex(@"[\.,!] \d+ [A-Za-z]", RegexOptions.Compiled); private static readonly Regex NumberStartInside2 = new Regex(@"[\.,!]\r\n\d+ [A-Za-z]", RegexOptions.Compiled); + public string Name { get; set; } + + public NetflixCheckStartNumberSpellOut(string name) + { + Name = name; + } + public void Check(Subtitle subtitle, NetflixQualityController controller) { foreach (var p in subtitle.Paragraphs) diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckTextForHiUseBrackets.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckTextForHiUseBrackets.cs index ea766ca93c7..45570be7024 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckTextForHiUseBrackets.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckTextForHiUseBrackets.cs @@ -8,6 +8,13 @@ namespace Nikse.SubtitleEdit.Logic.NetflixQualityCheck; /// public class NetflixCheckTextForHiUseBrackets : INetflixQualityChecker { + public string Name { get; set; } + + public NetflixCheckTextForHiUseBrackets(string name) + { + Name = name; + } + public void Check(Subtitle subtitle, NetflixQualityController controller) { if (controller.Language == "jp") diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckTimedTextFrameRate.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckTimedTextFrameRate.cs index 6acc81e0e35..38a1b3a5ebe 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckTimedTextFrameRate.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckTimedTextFrameRate.cs @@ -7,6 +7,14 @@ namespace Nikse.SubtitleEdit.Logic.NetflixQualityCheck; public class NetflixCheckTimedTextFrameRate : INetflixQualityChecker { + + public string Name { get; set; } + + public NetflixCheckTimedTextFrameRate(string name) + { + Name = name; + } + public void Check(Subtitle subtitle, NetflixQualityController controller) { if (subtitle?.Header != null && subtitle.Header.Contains("ttp:frameRate=")) diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckTwoFramesGap.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckTwoFramesGap.cs index f0e357c1768..19be9c1a218 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckTwoFramesGap.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckTwoFramesGap.cs @@ -8,6 +8,13 @@ namespace Nikse.SubtitleEdit.Logic.NetflixQualityCheck; /// public class NetflixCheckTwoFramesGap : INetflixQualityChecker { + public string Name { get; set; } + + public NetflixCheckTwoFramesGap(string name) + { + Name = name; + } + public void Check(Subtitle subtitle, NetflixQualityController controller) { if (controller.Language == "ja") diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixCheckWhiteSpace.cs b/src/UI/Logic/NetflixQualityCheck/NetflixCheckWhiteSpace.cs index 23762a4e7fd..7cbedb8fdeb 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixCheckWhiteSpace.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixCheckWhiteSpace.cs @@ -10,6 +10,13 @@ public class NetflixCheckWhiteSpace : INetflixQualityChecker private static readonly Regex SpacesBeforePunctuation = new Regex(@"[^\s]( |\n|\r\n)[!?).,؟،…]", RegexOptions.Compiled); private static readonly Regex TwoPlusConsequentSpaces = new Regex(@"( |\n|\r\n){2,}", RegexOptions.Compiled); + public string Name { get; set; } + + public NetflixCheckWhiteSpace(string name) + { + Name = name; + } + private static void AddWhiteSpaceWarning(Paragraph p, NetflixQualityController report, string issue, int pos) { string timeCode = p.StartTime.ToHHMMSSFF(); diff --git a/src/UI/Logic/NetflixQualityCheck/NetflixQualityController.cs b/src/UI/Logic/NetflixQualityCheck/NetflixQualityController.cs index 1d7f2ce843e..10b6669ca17 100644 --- a/src/UI/Logic/NetflixQualityCheck/NetflixQualityController.cs +++ b/src/UI/Logic/NetflixQualityCheck/NetflixQualityController.cs @@ -1,5 +1,6 @@ using Nikse.SubtitleEdit.Core.Common; using Nikse.SubtitleEdit.Core.Enums; +using Nikse.SubtitleEdit.Logic.Config; using System; using System.Collections.Generic; using System.Globalization; @@ -299,25 +300,25 @@ public static string StringContext(string str, int pos, int radius) public static List GetAllCheckers() { return new List - { - new NetflixCheckBridgeGaps(), - new NetflixCheckDialogHyphenSpace(), - new NetflixCheckEllipsesNotThreeDots(), - new NetflixCheckGlyph(), - new NetflixCheckItalics(), - new NetflixCheckMaxCps(), - new NetflixCheckMaxDuration(), - new NetflixCheckMaxLineLength(), - new NetflixCheckMinDuration(), - new NetflixCheckNumberOfLines(), - new NetflixCheckNumbersOneToTenSpellOut(), - new NetflixCheckShotChange(), - new NetflixCheckStartNumberSpellOut(), - new NetflixCheckTextForHiUseBrackets(), - new NetflixCheckTimedTextFrameRate(), - new NetflixCheckTwoFramesGap(), - new NetflixCheckWhiteSpace(), - }; + { + new NetflixCheckBridgeGaps(Se.Language.Tools.BridgeGaps.Title), + new NetflixCheckDialogHyphenSpace(Se.Language.Tools.NetflixCheckAndFix.DialogHyphenSpace), + new NetflixCheckEllipsesNotThreeDots(Se.Language.Tools.NetflixCheckAndFix.EllipsesNotThreeDots), + new NetflixCheckGlyph(Se.Language.Tools.NetflixCheckAndFix.OnlyAllowedGlyphs), + new NetflixCheckItalics(Se.Language.Tools.NetflixCheckAndFix.Italics), + new NetflixCheckMaxCps(Se.Language.Tools.NetflixCheckAndFix.MaxCharsSec), + new NetflixCheckMaxDuration(Se.Language.Tools.NetflixCheckAndFix.MaxDuration), + new NetflixCheckMaxLineLength(Se.Language.Tools.NetflixCheckAndFix.MaxLineLength), + new NetflixCheckMinDuration(Se.Language.Tools.NetflixCheckAndFix.MinDuration), + new NetflixCheckNumberOfLines(Se.Language.Tools.NetflixCheckAndFix.MaxNumberOfLines), + new NetflixCheckNumbersOneToTenSpellOut(Se.Language.Tools.NetflixCheckAndFix.OneToTenSpellOut), + new NetflixCheckShotChange(Se.Language.Tools.NetflixCheckAndFix.ShotChanges), + new NetflixCheckStartNumberSpellOut(Se.Language.Tools.NetflixCheckAndFix.StartNumberSpellOut), + new NetflixCheckTextForHiUseBrackets(Se.Language.Tools.NetflixCheckAndFix.TextforHiUseBrackets), + new NetflixCheckTimedTextFrameRate(Se.Language.Tools.NetflixCheckAndFix.FrameRate), + new NetflixCheckTwoFramesGap(Se.Language.Tools.NetflixCheckAndFix.TwoFrameGrap), + new NetflixCheckWhiteSpace(Se.Language.Tools.NetflixCheckAndFix.WhiteSpace), + }; } public void RunChecks(Subtitle subtitle) From e1f4d091fa464fafd7c9be606eaf1a860dbad200 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Fri, 3 Apr 2026 13:13:23 +0200 Subject: [PATCH 07/74] Work on vlc --- src/UI/DependencyInjectionExtensions.cs | 1 + src/UI/Features/Main/MainViewModel.cs | 87 ++++-- src/UI/Logic/Media/IVlcReloader.cs | 13 + src/UI/Logic/Media/VlcReloader.cs | 256 ++++++++++++++++++ .../LibVlcDynamic/LibVlcDynamicPlayer.cs | 47 ++++ 5 files changed, 387 insertions(+), 17 deletions(-) create mode 100644 src/UI/Logic/Media/IVlcReloader.cs create mode 100644 src/UI/Logic/Media/VlcReloader.cs diff --git a/src/UI/DependencyInjectionExtensions.cs b/src/UI/DependencyInjectionExtensions.cs index 29bb98093ef..bcdf07a2d21 100644 --- a/src/UI/DependencyInjectionExtensions.cs +++ b/src/UI/DependencyInjectionExtensions.cs @@ -197,6 +197,7 @@ public static void AddSubtitleEditServices(this IServiceCollection collection) collection.AddTransient(); collection.AddTransient(); collection.AddTransient(); + collection.AddTransient(); collection.AddTransient(); collection.AddTransient(); diff --git a/src/UI/Features/Main/MainViewModel.cs b/src/UI/Features/Main/MainViewModel.cs index 8facdf97575..5d986b31d57 100644 --- a/src/UI/Features/Main/MainViewModel.cs +++ b/src/UI/Features/Main/MainViewModel.cs @@ -319,6 +319,7 @@ public partial class MainViewModel : private readonly IUndoRedoManager _undoRedoManager; private readonly IBluRayHelper _bluRayHelper; private readonly IMpvReloader _mpvReloader; + private readonly IVlcReloader _vlcReloader; private readonly IFindService _findService; private readonly IColorService _colorService; private readonly IFontNameService _fontNameService; @@ -378,6 +379,7 @@ public MainViewModel( IUndoRedoManager undoRedoManager, IBluRayHelper bluRayHelper, IMpvReloader mpvReloader, + IVlcReloader vlcReloader, IFindService findService, IDictionaryInitializer dictionaryInitializer, ILanguageInitializer languageInitializer, @@ -400,6 +402,7 @@ public MainViewModel( _undoRedoManager = undoRedoManager; _bluRayHelper = bluRayHelper; _mpvReloader = mpvReloader; + _vlcReloader = vlcReloader; _findService = findService; _colorService = colorService; _fontNameService = fontNameService; @@ -778,6 +781,7 @@ private void SetLayout(int layoutNumber) Se.Settings.General.LayoutNumber = InitLayout.MakeLayout(MainView!, this, layoutNumber); SelectAndScrollToRow(Math.Max(0, idx)); _mpvReloader.Reset(); + _vlcReloader.Reset(); _mpvPreviewDirty = true; } @@ -902,6 +906,7 @@ private async Task ShowAssaStyles() ApplyAssaStyles(result); _subtitle.Footer = result.ResultSubtitle.Footer; _mpvReloader.Reset(); + _vlcReloader.Reset(); _mpvPreviewDirty = true; } } @@ -932,6 +937,7 @@ public void ApplyAssaStyles(AssaStylesViewModel result) } _mpvReloader.Reset(); + _vlcReloader.Reset(); _mpvPreviewDirty = true; } @@ -953,6 +959,7 @@ private async Task ShowAssaProperties() { _subtitle.Header = result.Header; _mpvReloader.Reset(); + _vlcReloader.Reset(); _mpvPreviewDirty = true; } } @@ -976,6 +983,7 @@ private async Task ShowAssaAttachments() _subtitle.Header = result.Header; _subtitle.Footer = result.Footer; _mpvReloader.Reset(); + _vlcReloader.Reset(); _mpvPreviewDirty = true; } } @@ -1043,6 +1051,7 @@ private async Task ShowAssaDraw() Renumber(); _mpvReloader.Reset(); + _vlcReloader.Reset(); _mpvPreviewDirty = true; _updateAudioVisualizer = true; } @@ -1076,6 +1085,7 @@ private async Task ShowAssaGenerateProgressBar() Renumber(); _updateAudioVisualizer = true; _mpvReloader.Reset(); + _vlcReloader.Reset(); _mpvPreviewDirty = true; } @@ -1096,6 +1106,7 @@ private async Task ShowAssaChangeResolution() _subtitle.Header = result.ResultSubtitle.Header; ShowStatus(Se.Language.Main.AssaResolutionResamplerDone); _mpvReloader.Reset(); + _vlcReloader.Reset(); _mpvPreviewDirty = true; } @@ -1134,6 +1145,7 @@ private async Task ShowAssaGenerateBackground() _subtitle.Header = result.ResultSubtitle.Header; SetSubtitles(result.ResultSubtitle); _mpvReloader.Reset(); + _vlcReloader.Reset(); _mpvPreviewDirty = true; } @@ -1158,6 +1170,7 @@ private async Task ShowAssaImageColorPicker() }); _mpvReloader.Reset(); + _vlcReloader.Reset(); _mpvPreviewDirty = true; } @@ -1190,6 +1203,7 @@ private async Task ShowAssaSetPosition() var y = result.ResultY; selectedItem.Text = $"{{\\pos({x},{y})}}" + RemovePositionTags(selectedItem.Text); _mpvReloader.Reset(); + _vlcReloader.Reset(); _mpvPreviewDirty = true; } @@ -1343,6 +1357,7 @@ private void ResetSubtitle(SubtitleFormat? format = null) AutoFitColumns(); _mpvReloader.Reset(); + _vlcReloader.Reset(); if (_findViewModel != null) { @@ -1368,10 +1383,8 @@ private void ResetSubtitle(SubtitleFormat? format = null) vp.IsSmpteTimingEnabled = IsSmpteTimingEnabled; } - if (_mpvReloader != null) - { - _mpvReloader.SmpteMode = IsSmpteTimingEnabled; - } + _mpvReloader.SmpteMode = IsSmpteTimingEnabled; + _vlcReloader.SmpteMode = IsSmpteTimingEnabled; _formatChangedByUser = false; _undoRedoManager.Reset(); @@ -1527,10 +1540,18 @@ private async Task OpenSecondarySubtitle() IsSubtitleSecondaryVisible = true; var vp = GetVideoPlayerControl(); - if (vp != null && vp.VideoPlayerInstance is LibMpvDynamicPlayer mpv) + if (vp != null) { - _mpvReloader.Reset(); - _ = _mpvReloader.RefreshMpv(mpv, GetUpdateSubtitle(), _subtitleSecondary, SelectedSubtitleFormat); + if (vp.VideoPlayerInstance is LibMpvDynamicPlayer mpv) + { + _mpvReloader.Reset(); + _ = _mpvReloader.RefreshMpv(mpv, GetUpdateSubtitle(), _subtitleSecondary, SelectedSubtitleFormat); + } + else if (vp.VideoPlayerInstance is LibVlcDynamicPlayer vlc) + { + _vlcReloader.Reset(); + _ = _vlcReloader.RefreshVlc(vlc, GetUpdateSubtitle(), _subtitleSecondary, SelectedSubtitleFormat); + } } } @@ -4182,6 +4203,7 @@ private async Task ShowToolsSplitBreakLongLines() SelectAndScrollToRow(0); _updateAudioVisualizer = true; _mpvReloader.Reset(); + _vlcReloader.Reset(); } } @@ -4210,6 +4232,7 @@ private async Task ShowToolsMergeShortLines() SelectAndScrollToRow(0); _updateAudioVisualizer = true; _mpvReloader.Reset(); + _vlcReloader.Reset(); } } @@ -4928,10 +4951,8 @@ private void ToggleSmpteTiming() vp.IsSmpteTimingEnabled = IsSmpteTimingEnabled; } - if (_mpvReloader != null) - { - _mpvReloader.SmpteMode = IsSmpteTimingEnabled; - } + _mpvReloader.SmpteMode = IsSmpteTimingEnabled; + _vlcReloader.SmpteMode = IsSmpteTimingEnabled; } [RelayCommand] @@ -6050,10 +6071,18 @@ public void ApplySettings() _oldEditTextBox = EditTextBox; var vp = GetVideoPlayerControl(); - if (vp != null && vp.VideoPlayerInstance is LibMpvDynamicPlayer mpv) + if (vp != null) { - _mpvReloader.Reset(); - _mpvReloader.RefreshMpv(mpv, GetUpdateSubtitle(), _subtitleSecondary, SelectedSubtitleFormat); + if (vp.VideoPlayerInstance is LibMpvDynamicPlayer mpv) + { + _mpvReloader.Reset(); + _mpvReloader.RefreshMpv(mpv, GetUpdateSubtitle(), _subtitleSecondary, SelectedSubtitleFormat); + } + else if (vp.VideoPlayerInstance is LibVlcDynamicPlayer vlc) + { + _vlcReloader.Reset(); + _vlcReloader.RefreshVlc(vlc, GetUpdateSubtitle(), _subtitleSecondary, SelectedSubtitleFormat); + } } if (Se.Settings.Appearance.RightToLeft) @@ -6085,6 +6114,7 @@ public void ApplySettings() } _mpvReloader.Reset(); + _vlcReloader.Reset(); _mpvPreviewDirty = true; } @@ -8183,10 +8213,18 @@ private void VideoFullScreen() _shortcutManager.ClearKeys(); var vp = GetVideoPlayerControl(); - if (vp != null && vp.VideoPlayerInstance is LibMpvDynamicPlayer mpv) + if (vp != null) { - _mpvReloader.Reset(); - _mpvReloader.RefreshMpv(mpv, GetUpdateSubtitle(), _subtitleSecondary, SelectedSubtitleFormat); + if (vp.VideoPlayerInstance is LibMpvDynamicPlayer mpv) + { + _mpvReloader.Reset(); + _mpvReloader.RefreshMpv(mpv, GetUpdateSubtitle(), _subtitleSecondary, SelectedSubtitleFormat); + } + else if (vp.VideoPlayerInstance is LibVlcDynamicPlayer vlc) + { + _vlcReloader.Reset(); + _vlcReloader.RefreshVlc(vlc, GetUpdateSubtitle(), _subtitleSecondary, SelectedSubtitleFormat); + } } } @@ -12194,6 +12232,7 @@ private async Task VideoOpenFile(string videoFileName) // OpenVideoFile await vp.Open(videoFileName); _videoFileName = videoFileName; _mpvReloader.Reset(); + _vlcReloader.Reset(); _mpvPreviewDirty = true; if (IsValidUrl(videoFileName)) @@ -14264,6 +14303,20 @@ private void StartTimers() _mpvReloader.RefreshMpv(mpv, subtitle, _subtitleSecondary, SelectedSubtitleFormat).ConfigureAwait(false); } + else if (_mpvPreviewDirty && vp?.VideoPlayerInstance is LibVlcDynamicPlayer vlc) + { + var subtitle = GetUpdateSubtitle(); + _mpvPreviewDirty = false; // clear only after subtitle snapshot is successfully obtained + var hasVisibleLayers = _visibleLayers != null && Se.Settings.Assa.HideLayersFromVideoPreview; + if (hasVisibleLayers) + { + var paragraphs = subtitle.Paragraphs.Where(p => _visibleLayers!.Contains(p.Layer)).ToList(); + subtitle.Paragraphs.Clear(); + subtitle.Paragraphs.AddRange(paragraphs); + } + + _vlcReloader.RefreshVlc(vlc, subtitle, _subtitleSecondary, SelectedSubtitleFormat).ConfigureAwait(false); + } }; _slowTimer.Start(); } diff --git a/src/UI/Logic/Media/IVlcReloader.cs b/src/UI/Logic/Media/IVlcReloader.cs new file mode 100644 index 00000000000..5bf2ad5eff8 --- /dev/null +++ b/src/UI/Logic/Media/IVlcReloader.cs @@ -0,0 +1,13 @@ +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic.VideoPlayers.LibMpvDynamic; +using System.Threading.Tasks; + +namespace Nikse.SubtitleEdit.Logic.Media; + +public interface IVlcReloader +{ + Task RefreshVlc(LibVlcDynamicPlayer vlc, Subtitle subtitle, Subtitle? subtitleSecondary, SubtitleFormat uiFormat); + void Reset(); + bool SmpteMode { get; set; } +} diff --git a/src/UI/Logic/Media/VlcReloader.cs b/src/UI/Logic/Media/VlcReloader.cs new file mode 100644 index 00000000000..818545e60a7 --- /dev/null +++ b/src/UI/Logic/Media/VlcReloader.cs @@ -0,0 +1,256 @@ +using Avalonia.Skia; +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic.Config; +using Nikse.SubtitleEdit.Logic.VideoPlayers.LibMpvDynamic; +using System; +using System.IO; +using System.Linq; +using System.Threading.Tasks; + +namespace Nikse.SubtitleEdit.Logic.Media; + +public class VlcReloader : IVlcReloader +{ + public bool SmpteMode { get; set; } + public int VideoWidth { get; set; } = 1280; + public int VideoHeight { get; set; } = 720; + + private readonly AdvancedSubStationAlpha _assFormat = new(); + private Subtitle? _subtitlePrev; + private string _mpvTextOld = string.Empty; + private int _mpvSubOldHash = -1; + private string? _mpvTextFileName; + private string? _mpvTextFileExtension; + private int _retryCount = 3; + private string? _mpvPreviewStyleHeader; + + public async Task RefreshVlc(LibVlcDynamicPlayer vlc, Subtitle subtitle, Subtitle? subtitleSecondary, SubtitleFormat uiFormat) + { + if (subtitle.Paragraphs.Count == 0 && subtitleSecondary == null) + { + return; + } + + try + { + var uiFormatType = uiFormat.GetType(); + subtitle = new Subtitle(subtitle, false); + + if (SmpteMode) + { + foreach (var paragraph in subtitle.Paragraphs) + { + paragraph.StartTime.TotalMilliseconds *= 1.001; + paragraph.EndTime.TotalMilliseconds *= 1.001; + } + } + + SubtitleFormat format = _assFormat; + string text; + if (uiFormatType == typeof(WebVTT) || uiFormatType == typeof(WebVTTFileWithLineNumber)) + { + var defaultStyle = GetMpvPreviewStyle(Se.Settings.Video); + defaultStyle.BorderStyle = "3"; + subtitle = new Subtitle(subtitle); + subtitle = WebVttToAssa.Convert(subtitle, defaultStyle, VideoWidth, VideoHeight); + AddSecondarySubtitle(subtitle, subtitleSecondary); + text = subtitle.ToText(_assFormat); + } + else + { + if (subtitle.Header == null || !subtitle.Header.Contains("[V4+ Styles]") || uiFormatType != typeof(AdvancedSubStationAlpha)) + { + if (string.IsNullOrEmpty(subtitle.Header) && uiFormatType == typeof(SubStationAlpha)) + { + subtitle.Header = SubStationAlpha.DefaultHeader; + } + + if (subtitle.Header != null && subtitle.Header.Contains("[V4 Styles]", StringComparison.Ordinal)) + { + subtitle.Header = AdvancedSubStationAlpha.GetHeaderAndStylesFromSubStationAlpha(subtitle.Header); + } + + var oldSub = subtitle; + subtitle = new Subtitle(subtitle); + if (Se.Settings.Appearance.RightToLeft) + { + for (var index = 0; index < subtitle.Paragraphs.Count; index++) + { + var paragraph = subtitle.Paragraphs[index]; + if (LanguageAutoDetect.ContainsRightToLeftLetter(paragraph.Text)) + { + paragraph.Text = Utilities.FixRtlViaUnicodeChars(paragraph.Text); + } + } + } + + if (subtitle.Header == null || !(subtitle.Header.Contains("[V4+ Styles]") && uiFormatType == typeof(SubStationAlpha))) + { + subtitle.Header = MpvPreviewStyleHeader; + } + + if (oldSub.Header != null && oldSub.Header.Length > 20 && oldSub.Header.AsSpan(3, 3).SequenceEqual("STL")) + { + var boldValue = Configuration.Settings.General.VideoPlayerPreviewFontBold ? "-1" : "0"; + var boxStyle = $"Style: Box,{Configuration.Settings.General.VideoPlayerPreviewFontName},{Configuration.Settings.General.VideoPlayerPreviewFontSize},&H00FFFFFF,&H0300FFFF,&H00000000,&H02000000,{boldValue},0,0,0,100,100,0,0,3,2,0,2,10,10,10,1{Environment.NewLine}Style: Default,"; + subtitle.Header = subtitle.Header.Replace("Style: Default,", boxStyle, StringComparison.Ordinal); + + var useBox = false; + if (Configuration.Settings.SubtitleSettings.EbuStlTeletextUseBox) + { + try + { + var encoding = Ebu.GetEncoding(oldSub.Header[..3]); + var buffer = encoding.GetBytes(oldSub.Header); + var header = Ebu.ReadHeader(buffer); + if (header.DisplayStandardCode != "0") + { + useBox = true; + } + } + catch + { + // ignore + } + } + + for (var index = 0; index < subtitle.Paragraphs.Count; index++) + { + var p = subtitle.Paragraphs[index]; + + p.Extra = useBox ? "Box" : "Default"; + + if (p.Text.Contains("", StringComparison.Ordinal)) + { + p.Extra = "Box"; + p.Text = p.Text.Replace("", string.Empty).Replace("", string.Empty); + } + } + } + } + + AddSecondarySubtitle(subtitle, subtitleSecondary); + var hash = subtitle.GetFastHashCode(null); + if (hash != _mpvSubOldHash || string.IsNullOrEmpty(_mpvTextOld)) + { + text = subtitle.ToText(_assFormat); + _mpvSubOldHash = hash; + } + else + { + text = _mpvTextOld; + } + } + + if (text != _mpvTextOld || _mpvTextFileName == null || _retryCount > 0) + { + if (_retryCount >= 0 || string.IsNullOrEmpty(_mpvTextFileName) || _subtitlePrev == null || _subtitlePrev.FileName != subtitle.FileName || _mpvTextFileExtension != format.Extension) + { + DeleteTempMpvFileName(); + _mpvTextFileName = FileUtil.GetTempFileName(format.Extension); + _mpvTextFileExtension = format.Extension; + await File.WriteAllTextAsync(_mpvTextFileName, text); + vlc.SubRemove(); + vlc.SubAdd(_mpvTextFileName); + _retryCount--; + } + else + { + await File.WriteAllTextAsync(_mpvTextFileName, text); + vlc.SubReload(); + } + _mpvTextOld = text; + } + _subtitlePrev = subtitle; + } + catch (Exception exception) + { + Se.LogError(exception); + } + } + + private static void AddSecondarySubtitle(Subtitle subtitle, Subtitle? subtitleSecondary) + { + if (subtitleSecondary == null) + { + return; + } + + + var styleName = subtitleSecondary.Paragraphs.FirstOrDefault()?.Extra ?? "Secondary"; + var style = AdvancedSubStationAlpha.GetSsaStyle(styleName, subtitleSecondary.Header); + subtitle.Header = AdvancedSubStationAlpha.AddSsaStyle(style, subtitle.Header); + foreach (var p in subtitleSecondary.Paragraphs) + { + subtitle.Paragraphs.Add(p); + } + } + + private string MpvPreviewStyleHeader + { + get + { + if (string.IsNullOrEmpty(_mpvPreviewStyleHeader)) + { + UpdateMpvStyle(); + } + + return _mpvPreviewStyleHeader ?? string.Empty; + } + set => _mpvPreviewStyleHeader = value; + } + + public void UpdateMpvStyle() + { + var mpvStyle = GetMpvPreviewStyle(Se.Settings.Video); + MpvPreviewStyleHeader = string.Format(AdvancedSubStationAlpha.HeaderNoStyles, "MPV preview file", mpvStyle.ToRawAss(SsaStyle.DefaultAssStyleFormat)); + } + + private static SsaStyle GetMpvPreviewStyle(SeVideo gs) + { + return new SsaStyle + { + Name = "Default", + FontName = gs.MpvPreviewFontName, + FontSize = gs.MpvPreviewFontSize, + Bold = gs.MpvPreviewFontBold, + Primary = gs.MpvPreviewColorPrimary.FromHexToColor().ToSKColor(), + Outline = gs.MpvPreviewColorOutline.FromHexToColor().ToSKColor(), + Background = gs.MpvPreviewColorShadow.FromHexToColor().ToSKColor(), + OutlineWidth = gs.MpvPreviewOutlineWidth, + ShadowWidth = gs.MpvPreviewShadowWidth, + BorderStyle = gs.MpvPreviewBorderType.ToString(), + Alignment = "2", // bottom center + MarginVertical = gs.MpvPreviewMargin, + MarginLeft = gs.MpvPreviewMargin, + MarginRight = gs.MpvPreviewMargin, + }; + } + + private void DeleteTempMpvFileName() + { + try + { + if (File.Exists(_mpvTextFileName)) + { + File.Delete(_mpvTextFileName); + _mpvTextFileName = null; + } + } + catch + { + // ignored + } + } + + public void Reset() + { + _mpvTextFileName = null; + _mpvTextFileExtension = null; + _mpvTextOld = string.Empty; + _mpvPreviewStyleHeader = null; + _retryCount = 3; + _mpvSubOldHash = -1; + } +} diff --git a/src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs b/src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs index 46ae3a029a6..552f17f1a36 100644 --- a/src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs +++ b/src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs @@ -399,6 +399,53 @@ private bool LoadLibraryInternal() return false; } + private string? _currentSubtitleFileName; + + public void SubAdd(string fileName) + { + if (_mediaPlayer == IntPtr.Zero || _libvlc_media_player_add_slave == null) + { + return; + } + + try + { + _currentSubtitleFileName = fileName; + var fileUri = new Uri(fileName).AbsoluteUri; + _libvlc_media_player_add_slave(_mediaPlayer, 1, GetUtf8Bytes(fileUri), true); + } + catch + { + // Ignore + } + } + + public void SubRemove() + { + if (_mediaPlayer == IntPtr.Zero || _libvlc_video_set_spu == null) + { + return; + } + + try + { + _libvlc_video_set_spu(_mediaPlayer, -1); + } + catch + { + // Ignore + } + } + + public void SubReload() + { + if (_currentSubtitleFileName != null) + { + SubRemove(); + SubAdd(_currentSubtitleFileName); + } + } + public void LoadLib() { if (_library == IntPtr.Zero) From 53a229042f9155bdffed7aad6573e922dfcba58c Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Fri, 3 Apr 2026 13:44:50 +0200 Subject: [PATCH 08/74] Test vlc --- src/UI/Logic/Media/VlcReloader.cs | 8 +- .../LibVlcDynamic/LibVlcDynamicPlayer.cs | 74 +++++++++++++++---- 2 files changed, 64 insertions(+), 18 deletions(-) diff --git a/src/UI/Logic/Media/VlcReloader.cs b/src/UI/Logic/Media/VlcReloader.cs index 818545e60a7..19c5cc3c0b6 100644 --- a/src/UI/Logic/Media/VlcReloader.cs +++ b/src/UI/Logic/Media/VlcReloader.cs @@ -151,14 +151,16 @@ public async Task RefreshVlc(LibVlcDynamicPlayer vlc, Subtitle subtitle, Subtitl _mpvTextFileName = FileUtil.GetTempFileName(format.Extension); _mpvTextFileExtension = format.Extension; await File.WriteAllTextAsync(_mpvTextFileName, text); - vlc.SubRemove(); - vlc.SubAdd(_mpvTextFileName); + await vlc.SubAdd(_mpvTextFileName); _retryCount--; } else { + DeleteTempMpvFileName(); + _mpvTextFileName = FileUtil.GetTempFileName(format.Extension); + _mpvTextFileExtension = format.Extension; await File.WriteAllTextAsync(_mpvTextFileName, text); - vlc.SubReload(); + await vlc.SubAdd(_mpvTextFileName); } _mpvTextOld = text; } diff --git a/src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs b/src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs index 552f17f1a36..12d4acddf2a 100644 --- a/src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs +++ b/src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs @@ -67,7 +67,15 @@ public sealed class LibVlcDynamicPlayer : IDisposable, IVideoPlayerInstance private delegate long libvlc_media_get_duration(IntPtr media); private libvlc_media_get_duration? _libvlc_media_get_duration; - // LibVLC Video Controls - http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__video.html#g8f55326b8b51aecb59d8b8a446c3f118 + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void libvlc_media_add_option(IntPtr media, byte[] options); + private libvlc_media_add_option? _libvlc_media_add_option; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void libvlc_media_player_set_media(IntPtr mediaPlayer, IntPtr media); + private libvlc_media_player_set_media? _libvlc_media_player_set_media; + + // LibVLC Video Controls [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void libvlc_video_get_size(IntPtr mediaPlayer, UInt32 number, out UInt32 x, out UInt32 y); private libvlc_video_get_size? _libvlc_video_get_size; @@ -186,6 +194,10 @@ public sealed class LibVlcDynamicPlayer : IDisposable, IVideoPlayerInstance private delegate int libvlc_video_set_spu(IntPtr mediaPlayer, int trackNumber); private libvlc_video_set_spu? _libvlc_video_set_spu; + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate IntPtr libvlc_video_get_spu_description(IntPtr mediaPlayer); + private libvlc_video_get_spu_description? _libvlc_video_get_spu_description; + /// /// Callback prototype to allocate and lock a picture buffer. Whenever a new video frame needs to be decoded, the lock callback is invoked. Depending on the video chroma, one or three pixel planes of adequate dimensions must be returned via the second parameter. Those planes must be aligned on 32-bytes boundaries. /// @@ -310,9 +322,12 @@ private void LoadLibVlcMethods() _libvlc_media_release = (libvlc_media_release)GetDllType(typeof(libvlc_media_release), "libvlc_media_release"); _libvlc_media_parse_with_options = (libvlc_media_parse_with_options)GetDllType(typeof(libvlc_media_parse_with_options), "libvlc_media_parse_with_options"); _libvlc_media_get_duration = (libvlc_media_get_duration)GetDllType(typeof(libvlc_media_get_duration), "libvlc_media_get_duration"); + _libvlc_media_add_option = (libvlc_media_add_option)GetDllType(typeof(libvlc_media_add_option), "libvlc_media_add_option"); + _libvlc_media_player_set_media = (libvlc_media_player_set_media)GetDllType(typeof(libvlc_media_player_set_media), "libvlc_media_player_set_media"); _libvlc_video_get_size = (libvlc_video_get_size)GetDllType(typeof(libvlc_video_get_size), "libvlc_video_get_size"); _libvlc_video_set_spu = (libvlc_video_set_spu)GetDllType(typeof(libvlc_video_set_spu), "libvlc_video_set_spu"); + _libvlc_video_get_spu_description = (libvlc_video_get_spu_description)GetDllType(typeof(libvlc_video_get_spu_description), "libvlc_video_get_spu_description"); _libvlc_video_set_callbacks = (libvlc_video_set_callbacks)GetDllType(typeof(libvlc_video_set_callbacks), "libvlc_video_set_callbacks"); _libvlc_video_set_format = (libvlc_video_set_format)GetDllType(typeof(libvlc_video_set_format), "libvlc_video_set_format"); _libvlc_video_take_snapshot = (libvlc_video_take_snapshot)GetDllType(typeof(libvlc_video_take_snapshot), "libvlc_video_take_snapshot"); @@ -401,23 +416,53 @@ private bool LoadLibraryInternal() private string? _currentSubtitleFileName; - public void SubAdd(string fileName) + public Task SubAdd(string fileName) { - if (_mediaPlayer == IntPtr.Zero || _libvlc_media_player_add_slave == null) + _currentSubtitleFileName = fileName; + if (_mediaPlayer == IntPtr.Zero || _libVlc == IntPtr.Zero || string.IsNullOrEmpty(_fileName) || + _libvlc_media_new_path == null || _libvlc_media_add_option == null || _libvlc_media_player_set_media == null) { - return; + return Task.CompletedTask; } - try + return Task.Run(() => { - _currentSubtitleFileName = fileName; - var fileUri = new Uri(fileName).AbsoluteUri; - _libvlc_media_player_add_slave(_mediaPlayer, 1, GetUtf8Bytes(fileUri), true); - } - catch - { - // Ignore - } + try + { + var savedTime = _libvlc_media_player_get_time?.Invoke(_mediaPlayer) ?? 0; + var wasPlaying = IsPlaying; + + var media = _libvlc_media_new_path(_libVlc, GetUtf8Bytes(_fileName)); + _libvlc_media_add_option(media, GetUtf8Bytes($"--sub-file={fileName}")); + _libvlc_media_player_set_media(_mediaPlayer, media); + _libvlc_media_release?.Invoke(media); + + ApplyWindowHandle(); + _libvlc_media_player_play?.Invoke(_mediaPlayer); + + var timeout = 3000; + var elapsed = 0; + while (elapsed < timeout) + { + System.Threading.Thread.Sleep(50); + elapsed += 50; + if ((_libvlc_media_player_get_length?.Invoke(_mediaPlayer) ?? 0) > 0) + { + break; + } + } + + _libvlc_media_player_set_time?.Invoke(_mediaPlayer, savedTime); + if (!wasPlaying) + { + _libvlc_media_player_set_pause?.Invoke(_mediaPlayer, 1); + } + } + catch + { + // Ignore + } + }); } public void SubRemove() @@ -441,8 +486,7 @@ public void SubReload() { if (_currentSubtitleFileName != null) { - SubRemove(); - SubAdd(_currentSubtitleFileName); + _ = SubAdd(_currentSubtitleFileName); } } From be053697b2490eef45883a10d4400536bdfeae86 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Fri, 3 Apr 2026 13:49:26 +0200 Subject: [PATCH 09/74] work on vlc --- src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs b/src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs index 12d4acddf2a..973ea1b398a 100644 --- a/src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs +++ b/src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs @@ -433,7 +433,7 @@ public Task SubAdd(string fileName) var wasPlaying = IsPlaying; var media = _libvlc_media_new_path(_libVlc, GetUtf8Bytes(_fileName)); - _libvlc_media_add_option(media, GetUtf8Bytes($"--sub-file={fileName}")); + _libvlc_media_add_option(media, GetUtf8Bytes($":sub-file={fileName}")); _libvlc_media_player_set_media(_mediaPlayer, media); _libvlc_media_release?.Invoke(media); @@ -452,6 +452,7 @@ public Task SubAdd(string fileName) } } + _libvlc_video_set_spu?.Invoke(_mediaPlayer, 0); _libvlc_media_player_set_time?.Invoke(_mediaPlayer, savedTime); if (!wasPlaying) { From 2d28aab619f1a804fd3c3736b9ddfbdf5ee67895 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Fri, 3 Apr 2026 14:14:24 +0200 Subject: [PATCH 10/74] Work on vlc --- .../LibVlcDynamic/LibVlcDynamicPlayer.cs | 131 ++++++++++++------ 1 file changed, 90 insertions(+), 41 deletions(-) diff --git a/src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs b/src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs index 973ea1b398a..4c71da787d7 100644 --- a/src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs +++ b/src/UI/Logic/VideoPlayers/LibVlcDynamic/LibVlcDynamicPlayer.cs @@ -416,78 +416,127 @@ private bool LoadLibraryInternal() private string? _currentSubtitleFileName; - public Task SubAdd(string fileName) + private int _slaveCount = 0; + + public async Task SubAdd(string fileName) { _currentSubtitleFileName = fileName; - if (_mediaPlayer == IntPtr.Zero || _libVlc == IntPtr.Zero || string.IsNullOrEmpty(_fileName) || - _libvlc_media_new_path == null || _libvlc_media_add_option == null || _libvlc_media_player_set_media == null) + + if (_mediaPlayer == IntPtr.Zero || _libvlc_media_player_add_slave == null) + return; + + // --- HYBRID LOGIC --- + // If we've added more than 100 slaves, the track list is getting messy. + // Let's do a full media refresh to clear the internal VLC cache. + if (_slaveCount > 100) { - return Task.CompletedTask; + await HardReloadWithSub(fileName); + return; } - return Task.Run(() => + await Task.Run(() => { try { - var savedTime = _libvlc_media_player_get_time?.Invoke(_mediaPlayer) ?? 0; - var wasPlaying = IsPlaying; + string uriPath = PathToUri(fileName); + byte[] pathBytes = GetUtf8Bytes(uriPath); - var media = _libvlc_media_new_path(_libVlc, GetUtf8Bytes(_fileName)); - _libvlc_media_add_option(media, GetUtf8Bytes($":sub-file={fileName}")); - _libvlc_media_player_set_media(_mediaPlayer, media); - _libvlc_media_release?.Invoke(media); + int result = _libvlc_media_player_add_slave(_mediaPlayer, 0, pathBytes, true); - ApplyWindowHandle(); - _libvlc_media_player_play?.Invoke(_mediaPlayer); - - var timeout = 3000; - var elapsed = 0; - while (elapsed < timeout) + if (result == 0) { + _slaveCount++; // Increment our tracker + + // Small delay to ensure VLC registered the new track System.Threading.Thread.Sleep(50); - elapsed += 50; - if ((_libvlc_media_player_get_length?.Invoke(_mediaPlayer) ?? 0) > 0) + + // Find the highest ID to ensure we show the LATEST version of the file + int newestId = GetHighestSpuId(); + if (newestId != -1) { - break; + _libvlc_video_set_spu?.Invoke(_mediaPlayer, newestId); } - } - _libvlc_video_set_spu?.Invoke(_mediaPlayer, 0); - _libvlc_media_player_set_time?.Invoke(_mediaPlayer, savedTime); - if (!wasPlaying) - { - _libvlc_media_player_set_pause?.Invoke(_mediaPlayer, 1); + // Force a frame refresh by "nudging" the time + long currentTime = _libvlc_media_player_get_time?.Invoke(_mediaPlayer) ?? 0; + + // Seeking to the exact same time often works, + // but +1ms is a guaranteed trigger for the subtitle decoder. + _libvlc_media_player_set_time?.Invoke(_mediaPlayer, currentTime + 1); } } - catch + catch (Exception ex) { - // Ignore + System.Diagnostics.Debug.WriteLine($"SubAdd Error: {ex.Message}"); } }); } - public void SubRemove() + private int GetHighestSpuId() { - if (_mediaPlayer == IntPtr.Zero || _libvlc_video_set_spu == null) - { - return; - } + IntPtr pTrackList = _libvlc_video_get_spu_description?.Invoke(_mediaPlayer) ?? IntPtr.Zero; + if (pTrackList == IntPtr.Zero) return -1; - try + int highestId = -1; + IntPtr pCurrent = pTrackList; + + while (pCurrent != IntPtr.Zero) { - _libvlc_video_set_spu(_mediaPlayer, -1); + var track = Marshal.PtrToStructure(pCurrent); + if (track.Id > highestId) highestId = track.Id; + pCurrent = track.PNext; } - catch + + _libvlc_track_description_release?.Invoke(pTrackList); + return highestId; + } + + private async Task HardReloadWithSub(string subFileName) + { + // Save current state + long currentTime = _libvlc_media_player_get_time?.Invoke(_mediaPlayer) ?? 0; + bool wasPlaying = IsPlaying; + + // Reset the counter + _slaveCount = 0; + + // Re-load the video (this destroys the old media and its 100 slaves) + await LoadFile(_fileName); + + // Restore time + _libvlc_media_player_set_time?.Invoke(_mediaPlayer, currentTime); + + // Add the sub fresh (it will now be ID 1 again) + await SubAdd(subFileName); + + if (wasPlaying) Play(); + } + + private static string PathToUri(string path) + { + // libvlc_media_player_add_slave expects a URI, not a raw file path + if (path.StartsWith("file://", StringComparison.OrdinalIgnoreCase)) { - // Ignore + return path; } + + return new Uri(path).AbsoluteUri; + } + + public void SubRemove() + { + if (_mediaPlayer == IntPtr.Zero || _libvlc_video_set_spu == null) return; + + // -1 disables subtitle rendering + _libvlc_video_set_spu(_mediaPlayer, -1); } - public void SubReload() + public async Task SubReload() { - if (_currentSubtitleFileName != null) + if (!string.IsNullOrEmpty(_currentSubtitleFileName)) { - _ = SubAdd(_currentSubtitleFileName); + SubRemove(); // Clear current view + await SubAdd(_currentSubtitleFileName); // Inject fresh file } } @@ -980,7 +1029,7 @@ public double Speed _libvlc_audio_set_track(_mediaPlayer, next.id); return new AudioTrackInfo() - { + { FfIndex = next.id, Id = next.id, Title = next.name, From 02ee03029a99b73caf192eb9513e8e7c750d9c97 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Fri, 3 Apr 2026 14:49:26 +0200 Subject: [PATCH 11/74] Work on find history --- src/UI/Logic/Config/SeTools.cs | 2 ++ src/UI/Logic/FindService.cs | 15 +++++++++------ src/UI/Logic/IFindService.cs | 1 - 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/UI/Logic/Config/SeTools.cs b/src/UI/Logic/Config/SeTools.cs index f75c0ea85ca..142847302b3 100644 --- a/src/UI/Logic/Config/SeTools.cs +++ b/src/UI/Logic/Config/SeTools.cs @@ -1,5 +1,6 @@ using Avalonia.Media; using Nikse.SubtitleEdit.Core.SubtitleFormats; +using System.Collections.Generic; namespace Nikse.SubtitleEdit.Logic.Config; @@ -81,6 +82,7 @@ public class SeTools public bool SpeechToTextSelectedLinesPromptFistTimeOnly { get; set; } public bool MultipleReplaceShowDotDotDotButtons { get; set; } public bool GridFocusTextboxAfterInsertNew { get; set; } + public List FindHistory { get; set; } = new List(); public SeTools() { diff --git a/src/UI/Logic/FindService.cs b/src/UI/Logic/FindService.cs index e07833ce1e8..961f45917f0 100644 --- a/src/UI/Logic/FindService.cs +++ b/src/UI/Logic/FindService.cs @@ -1,4 +1,5 @@ -using System; +using Nikse.SubtitleEdit.Logic.Config; +using System; using System.Collections.Generic; using System.Text.RegularExpressions; @@ -26,6 +27,11 @@ public void Initialize(List textLines, int currentLineNumber, bool whole WholeWord = wholeWord; CurrentFindMode = findMode; ResetSearchState(); + + foreach (var findHistory in Se.Settings.Tools.FindHistory) + { + _searchHistory.Add(findHistory); + } } public int FindNext(string searchText, List textLines, int startLineIndex, int startTextIndex) @@ -254,11 +260,6 @@ public void Reset() ResetSearchState(); } - public void ClearSearchHistory() - { - _searchHistory.Clear(); - } - public void RemoveFromSearchHistory(string searchText) { _searchHistory.Remove(searchText); @@ -289,6 +290,8 @@ private void AddToSearchHistory(string searchText) { _searchHistory.RemoveAt(_searchHistory.Count - 1); } + + Se.Settings.Tools.FindHistory = _searchHistory; } private (int lineIndex, int textIndex, string foundText) FindInList(string searchText, int startLineIndex, int startTextIndex = 0) diff --git a/src/UI/Logic/IFindService.cs b/src/UI/Logic/IFindService.cs index 9ee70a27077..48a8ec7d46e 100644 --- a/src/UI/Logic/IFindService.cs +++ b/src/UI/Logic/IFindService.cs @@ -21,6 +21,5 @@ public interface IFindService int Count(string searchText); List<(int LineIndex, int TextIndex, string FoundText)> FindAll(string searchText); void Reset(); - void ClearSearchHistory(); void RemoveFromSearchHistory(string searchText); } \ No newline at end of file From 8e914595e03976d61a67537e9924ec3ffddc8013 Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Fri, 3 Apr 2026 15:50:29 +0200 Subject: [PATCH 12/74] Italian language update --- src/UI/Assets/Languages/Italian.json | 96 +++++++++++++++++++++++++--- 1 file changed, 86 insertions(+), 10 deletions(-) diff --git a/src/UI/Assets/Languages/Italian.json b/src/UI/Assets/Languages/Italian.json index 1061778ec00..b52c79c8c96 100644 --- a/src/UI/Assets/Languages/Italian.json +++ b/src/UI/Assets/Languages/Italian.json @@ -1,6 +1,6 @@ { "Title": "SubtitleEdit", - "TranslatedBy": "v. 02.04.2026 di bovirus", + "TranslatedBy": "v. 03.04.2026 di bovirus", "CultureName": "it-IT", "General": { "Abort": "Annulla", @@ -310,6 +310,7 @@ "NewDotDotDot": "Nuovo...", "NewProfile": "Nuovo profilo", "NewSubtitleStartKeyDownSetEndKeyUp": "Inserisci sottotitolo: inizia con il tasto giù, imposta la fine con il tasto su", + "SetSubtitleStartAtVideoPositionSetEndAtKeyUpAndGoToNext": "Imposta l'inizio nella posizione del video, imposta la fine premendo il tasto su e vai al successivo", "No": "No", "NoFilesToConvert": "Nessun file da convertire", "NoLanguageCode": "Nessun codice lingua", @@ -643,7 +644,10 @@ "CopyToClipboard": "Copia negli appunti", "PlayCurrent": "Riproduci attuale", "LeftMargin": "Margine sinistro", - "RightMargin": "Margine destro" + "RightMargin": "Margine destro", + "Installed": "Installato", + "AdvancedDotDotDot": "Avanzate...", + "ChooseAlignment": "Scegli allineamento" }, "Main": { "AudioTrackIsNowX": "La traccia audio ora è \"{0}", @@ -843,6 +847,7 @@ "HelpTitle": "_Aiuto", "Help": "_Guida in linea", "About": "_Info programma...", + "CheckForUpdates": "_Controlla aggiornamenti...", "FixRightToLeftViaUnicodeControlCharacters": "Correggi RTL tramite caratteri di controllo Unicode (righe selezionate)", "RemoveUnicodeControlCharacters": "Rimuovi caratteri di controllo Unicode (righe selezionate)", "ReverseRightToLeftStartEnd": "Inverti inizio/fine RTL (righe selezionate)", @@ -1138,6 +1143,8 @@ "LengthLessThan": "Lunghezza inferiore a", "LengthGreaterThan": "Lunghezza superiore a", "PixelLengthGreaterThan": "Lunghezza pixel >", + "GapLessThan": "Gap in ms <", + "GapGreaterThan": "Gap in ms >", "ExactlyOneLine": "Esattamente una linea", "ExactlyTwoLines": "Esattamente due righe", "MoreThanTwoLines": "Più di due righe", @@ -1159,7 +1166,11 @@ "ExportReplaceRules": "Esporta regole", "AppliedRules": "Regole applicate", "FindRule": "Trova regola", - "XLinesAffected": "{0:#,##0} righe interessate" + "XLinesAffected": "{0:#,##0} righe interessate", + "DeleteCategoryConfirm": "Vuoi eliminare la categoria '{0}'?", + "DeleteRuleConfirm": "Vuoi eliminare la regola '{0}'?", + "FindWhat": "Trova questo", + "DescriptionOptional": "Descrizione (facoltativa)" }, "Find": { "SearchTextWatermark": "Cerca testo...", @@ -1304,7 +1315,9 @@ "BackToFixList": "Torna all'elenco correzioni", "ApplyFixesAndClose": "Applica correzioni e chiudi", "FixCommonOcrErrorsStep2": "Correggi errori comuni, passaggio 2 (applica correzioni)", - "FixCommonOcrErrorsStep2FixesFoundX": "Correggi errori comuni, passaggio 2 - correzioni trovate: {0}" + "FixCommonOcrErrorsStep2FixesFoundX": "Correggi errori comuni, passaggio 2 - correzioni trovate: {0}", + "Action": "Azione", + "ApplySelectedFixes": "Applica correzioni selezionate" }, "AdjustDurations": { "Title": "Modifica durate", @@ -1484,6 +1497,24 @@ "ResizeImages": "Ridimensiona immagini", "Percentage": "Percentuale", "ResizeImagesInfo": "Inserisci la percentuale per ridimensionare le immagini.\r\n\r\nGli aggiornamenti verranno visualizzati in tempo reale." + }, + "RemoveTextForHearingImpaired": { + "Title": "Rimuovi testo per non udenti", + "Interjections": "Interiezioni", + "SkipIfStartWith": "Salta se inizia con", + "RemoveTextBetween": "Rimuovi testo tra", + "Brackets": "Parentesi", + "CurlyBrackets": "Parentesi graffe", + "Parentheses": "Parentesi", + "And": "E", + "OnlySeparateLines": "Solo linee separate", + "RemoveTextBeforeColon": "Rimuovi testo prima dei due punti", + "OnlyIfTextIsUppercase": "Solo se il testo è in maiuscolo", + "OnlyOnSeparateLine": "Solo in riga separata", + "IfLineIsUppercase": "Se la riga è maiuscola", + "IfLineContains": "Se la riga contiene", + "IfLineOnlyContainsMusicSymbols": "Se la riga contiene solo simboli musicali", + "RemoveInterjections": "Rimuovi interiezioni" } }, "SpellCheck": { @@ -1537,6 +1568,8 @@ "AddCurrentSubtitle": "Aggiungi sottotitolo attuale", "TitleOrLanguage": "Titolo/lingua", "ViewMatroskaTrackX": "Visualizza traccia Matroska - {0}", + "ResolutionSeparator": "x", + "OpenFromUrlTitle": "Apri file video dall'URL", "BurnIn": { "Title": "Genera video con sottotitoli incorporati", "InfoAssaOff": "Nota: è supportato lo stile Advanced SubStation Alpha.", @@ -1604,7 +1637,15 @@ "SelectModel": "Seleziona modello", "ViewWhisperLogFile": "Visualizza file registro Whisper", "ReDownloadX": "Scarica nuovamente {0}", - "DownloadingSpeechToTextModel": "Download modello sintesi vocale" + "DownloadingSpeechToTextModel": "Download modello sintesi vocale", + "WhisperPostProcessingTitle": "Post-elaborazione Whisper", + "AdjustTimings": "Regola tempi", + "MergeShortLines": "Unisci righe brevi", + "BreakSplitLongLines": "Interrompi/dividi righe lunghe", + "FixShortDuration": "Correggi durata breve", + "FixCasing": "Correggi maiuscolo/minuscolo", + "AddPeriods": "Aggiungi periodi", + "ChangeUnderlineToColor": "Cambia sottolineatura in colore" }, "TextToSpeech": { "Title": "Sintesi vocale", @@ -1628,7 +1669,31 @@ "RegenerateAudio": "Rigenera audio", "AutoContinuePlaying": "Continua automaticamente la riproduzione", "AddingAudioToVideoFileDotDotDot": "Aggiunta audio al file video...", - "PreparingMergeDotDotDot": "Preparazione unione..." + "PreparingMergeDotDotDot": "Preparazione unione...", + "ImportVoiceDotDotDot": "Importa voce...", + "VoiceImportSuccessTitle": "Voce importata", + "VoiceXImported": "La voce '{0}' è stata importata correttamente", + "AdvancedTtsSettings": "Impostazioni TTS avanzate", + "ProAudioPostProcessing": "Post-elaborazione professionale audio", + "ProAudioPostProcessingDescription": "Applica a ciascun segmento EQ warmth, noise gate, compressione, normalizzazione del volume (-16 LUFS) e dissolvenza in entrata/uscita.", + "AudioDucking": "Ducking audio", + "AudioDuckingDescription": "Riduci il volume dell'audio del video originale e uniscilo con l'audio TTS, in modo che la colonna sonora originale sia ancora debolmente udibile.", + "OriginalVolumePercent": "% volume originale", + "VadSilenceCompression": "Compressione silenzio VAD", + "VadSilenceCompressionDescription": "Riduci le pause tra le parole prima di cambiare tempo.\r\nUsa il rilevamento dell'attività vocale per comprimere solo le pause di silenzio mantenendo intatto il parlato.\r\nQuesto è il primo passo preferibile: riduce la durata senza alcuna perdita di qualità.", + "MaxSilenceMs": "Silenzio massimo (ms)", + "HighQualityTimeStretch": "Time-stretch ad alta qualità (WSOLA/elastico)", + "HighQualityTimeStretchDescription": "Per i cambiamenti di velocità che preservano l'intonazione usa l'algoritmo della banda elastica (WSOLA) invece del filtro a tempo predefinito .\r\nProduce un parlato dal suono più naturale, soprattutto a fattori di velocità più elevati.\r\nRichiede librubberband nella build di FFmpeg: torna automaticamente al tempo se non disponibile.", + "SilencePaddingMs": "Riempimento silenzio (ms)", + "SilencePaddingMsDescription": "Aggiunge un breve silenzio alla fine di ogni segmento.\r\nUtile per prendere respiro tra una frase e l'altra.", + "OutputSampleRate": "Frequenza campionamento in uscita (0 = predefinita)", + "OutputSampleRateDescription": "Ricampiona tutti i segmenti alla frequenza di campionamento specificata (ad esempio 44100, 48000).\r\nPer mantenere la frequenza di campionamento originale Impostalo a 0 .", + "EdgeTtsRate": "Tasso Edge-TTS", + "EdgeTtsRateDescription": "Velocità voce Edge-TTS, ad es.\r\n\"+50%\", \"-30%\" o \"+0%\" per impostazione predefinita.", + "EdgeTtsPitch": "Tono Edge-TTS", + "EdgeTtsPitchDescription": "Regolazione tono Edge-TTS, ad es.\r\n\"+10Hz\", \"-5Hz\" o \"+0Hz\" per impostazione predefinita.", + "EdgeTtsVolume": "Volume Edge-TTS", + "EdgeTtsVolumeDescription": "Regolazione volume Edge-TTS, ad es.\r\n\"+20%\", \"-10%\" o \"+0%\" per impostazione predefinita." }, "ShotChanges": { "TitleGenerateOrImport": "Genera/importa cambi inquadrature", @@ -1715,7 +1780,11 @@ "ReCopyTextToClipboard": "Ricopia il testo negli appunti (per traduttore/IA)", "BlockXOfY": "Blocco {0} di {1}", "NoTextInClipboard": "Nessun testo negli appunti", - "TextInClipboardIsSameAsSourceText": "Il testo negli appunti è lo stesso del testo sorgente, riprova." + "TextInClipboardIsSameAsSourceText": "Il testo negli appunti è lo stesso del testo sorgente, riprova.", + "LineMerge": "Unione riga", + "DelayInSecondsBetweenRequests": "Ritardo tra le richieste (secondi)", + "MaxBytesPerRequest": "Numero massimo byte per richiesta", + "PromptText": "Testo suggerito" }, "Options": { "Settings": { @@ -1808,7 +1877,7 @@ "MaxLines": "Numero massimo di righe", "UnbreakSubtitlesShortThan": "Non interrompere sottotitoli più brevi di", "NewEmptyDefaultMs": "Durata predefinita nuovi sottotitoli (ms)", - "PromptDeleteLines": "Richiedi di eliminare righe", + "PromptBeforeDelete": "Chiedi conferma prima dell'eliminazione", "RememberPositionAndSize": "Ricorda posizione/dimensioni finestra", "AutoBackupOn": "Backup automatico", "AutoBackupIntervalMinutes": "Intervallo backup automatico (minuti)", @@ -1973,7 +2042,8 @@ "AllSettings": "Tutte le impostazioni", "UiScale": "Scala interfaccia utente (%)", "WaveformToolbarItems": "Elementi barra strumenti forma d'onda", - "MatchIconColorToDarkTheme": "Abbina colore icona al colore di primo piano del tema scuro" + "MatchIconColorToDarkTheme": "Abbina colore icona al colore di primo piano del tema scuro", + "SubtitlePreviewProperties": "Proprietà anteprima sottotitoli" }, "Shortcuts": { "Title": "Tasti rapidi", @@ -2244,7 +2314,13 @@ } }, "Help": { - "AboutSubtitleEdit": "Info su Subtitile Edit" + "AboutSubtitleEdit": "Info su Subtitile Edit", + "CheckForUpdates": "Controlla aggiornamenti", + "CheckForUpdatesChecking": "Controllo aggiornamenti...", + "CheckForUpdatesUpToDate": "Questa versione è aggiornata.", + "CheckForUpdatesNewVersionAvailable": "Disponibile nuova versione: {0}", + "CheckForUpdatesUnableToCheck": "Impossibile controllare gli aggiornamenti.", + "CheckForUpdatesDownloadNewVersion": "Download nuova versione" }, "Ocr": { "LinesToDraw": "Righe da disegnare", From f4dd059a1f8d4bdfa4a8275bfc8546d9dc28b276 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Fri, 3 Apr 2026 22:16:43 +0200 Subject: [PATCH 13/74] Remember find text history --- src/UI/Logic/FindService.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/UI/Logic/FindService.cs b/src/UI/Logic/FindService.cs index 961f45917f0..77edc67c13d 100644 --- a/src/UI/Logic/FindService.cs +++ b/src/UI/Logic/FindService.cs @@ -20,6 +20,14 @@ public partial class FindService : IFindService public IReadOnlyList SearchHistory => _searchHistory.AsReadOnly(); + public FindService() + { + foreach (var findHistory in Se.Settings.Tools.FindHistory) + { + _searchHistory.Add(findHistory); + } + } + public void Initialize(List textLines, int currentLineNumber, bool wholeWord, FindMode findMode) { _textLines = textLines; @@ -27,11 +35,6 @@ public void Initialize(List textLines, int currentLineNumber, bool whole WholeWord = wholeWord; CurrentFindMode = findMode; ResetSearchState(); - - foreach (var findHistory in Se.Settings.Tools.FindHistory) - { - _searchHistory.Add(findHistory); - } } public int FindNext(string searchText, List textLines, int startLineIndex, int startTextIndex) From 7ead9ff39bf0ab54ae4db1bede6e2c02ac27083f Mon Sep 17 00:00:00 2001 From: niksedk Date: Sat, 4 Apr 2026 09:15:13 +0200 Subject: [PATCH 14/74] More fixes for mpv refresh --- src/UI/Features/Main/MainViewModel.cs | 69 ++++++++++----------------- 1 file changed, 25 insertions(+), 44 deletions(-) diff --git a/src/UI/Features/Main/MainViewModel.cs b/src/UI/Features/Main/MainViewModel.cs index 5d986b31d57..ee4279457fa 100644 --- a/src/UI/Features/Main/MainViewModel.cs +++ b/src/UI/Features/Main/MainViewModel.cs @@ -780,6 +780,11 @@ private void SetLayout(int layoutNumber) var idx = SubtitleGrid.SelectedIndex; Se.Settings.General.LayoutNumber = InitLayout.MakeLayout(MainView!, this, layoutNumber); SelectAndScrollToRow(Math.Max(0, idx)); + RefreshSubtitlePreview(); + } + + private void RefreshSubtitlePreview() + { _mpvReloader.Reset(); _vlcReloader.Reset(); _mpvPreviewDirty = true; @@ -905,9 +910,7 @@ private async Task ShowAssaStyles() { ApplyAssaStyles(result); _subtitle.Footer = result.ResultSubtitle.Footer; - _mpvReloader.Reset(); - _vlcReloader.Reset(); - _mpvPreviewDirty = true; + RefreshSubtitlePreview(); } } @@ -936,9 +939,7 @@ public void ApplyAssaStyles(AssaStylesViewModel result) } } - _mpvReloader.Reset(); - _vlcReloader.Reset(); - _mpvPreviewDirty = true; + RefreshSubtitlePreview(); } [RelayCommand] @@ -958,13 +959,10 @@ private async Task ShowAssaProperties() if (result.OkPressed) { _subtitle.Header = result.Header; - _mpvReloader.Reset(); - _vlcReloader.Reset(); - _mpvPreviewDirty = true; + RefreshSubtitlePreview(); } } - - + [RelayCommand] private async Task ShowAssaAttachments() { @@ -982,9 +980,7 @@ private async Task ShowAssaAttachments() { _subtitle.Header = result.Header; _subtitle.Footer = result.Footer; - _mpvReloader.Reset(); - _vlcReloader.Reset(); - _mpvPreviewDirty = true; + RefreshSubtitlePreview(); } } @@ -1050,9 +1046,7 @@ private async Task ShowAssaDraw() } Renumber(); - _mpvReloader.Reset(); - _vlcReloader.Reset(); - _mpvPreviewDirty = true; + RefreshSubtitlePreview(); _updateAudioVisualizer = true; } @@ -1084,9 +1078,7 @@ private async Task ShowAssaGenerateProgressBar() Renumber(); _updateAudioVisualizer = true; - _mpvReloader.Reset(); - _vlcReloader.Reset(); - _mpvPreviewDirty = true; + RefreshSubtitlePreview(); } [RelayCommand] @@ -1105,9 +1097,7 @@ private async Task ShowAssaChangeResolution() SetSubtitles(result.ResultSubtitle); _subtitle.Header = result.ResultSubtitle.Header; ShowStatus(Se.Language.Main.AssaResolutionResamplerDone); - _mpvReloader.Reset(); - _vlcReloader.Reset(); - _mpvPreviewDirty = true; + RefreshSubtitlePreview(); } [RelayCommand] @@ -1144,9 +1134,7 @@ private async Task ShowAssaGenerateBackground() _subtitle.Header = result.ResultSubtitle.Header; SetSubtitles(result.ResultSubtitle); - _mpvReloader.Reset(); - _vlcReloader.Reset(); - _mpvPreviewDirty = true; + RefreshSubtitlePreview(); } [RelayCommand] @@ -1169,9 +1157,7 @@ private async Task ShowAssaImageColorPicker() vm.Initialize(_subtitle, selectedItem, _videoFileName, _mediaInfo?.Dimension.Width, _mediaInfo?.Dimension.Height); }); - _mpvReloader.Reset(); - _vlcReloader.Reset(); - _mpvPreviewDirty = true; + RefreshSubtitlePreview(); } [RelayCommand] @@ -1202,9 +1188,7 @@ private async Task ShowAssaSetPosition() var x = result.ResultX; var y = result.ResultY; selectedItem.Text = $"{{\\pos({x},{y})}}" + RemovePositionTags(selectedItem.Text); - _mpvReloader.Reset(); - _vlcReloader.Reset(); - _mpvPreviewDirty = true; + RefreshSubtitlePreview(); } private static string RemovePositionTags(string text) @@ -1356,8 +1340,7 @@ private void ResetSubtitle(SubtitleFormat? format = null) AutoFitColumns(); - _mpvReloader.Reset(); - _vlcReloader.Reset(); + RefreshSubtitlePreview(); if (_findViewModel != null) { @@ -4202,8 +4185,7 @@ private async Task ShowToolsSplitBreakLongLines() Subtitles.AddRange(result.AllSubtitlesFixed); SelectAndScrollToRow(0); _updateAudioVisualizer = true; - _mpvReloader.Reset(); - _vlcReloader.Reset(); + RefreshSubtitlePreview(); } } @@ -4231,8 +4213,7 @@ private async Task ShowToolsMergeShortLines() Subtitles.AddRange(result.AllSubtitlesFixed); SelectAndScrollToRow(0); _updateAudioVisualizer = true; - _mpvReloader.Reset(); - _vlcReloader.Reset(); + RefreshSubtitlePreview(); } } @@ -4424,6 +4405,7 @@ private void VideoUndockControls() }); InitLayout.MakeLayout12KeepVideo(MainView!, this); + RefreshSubtitlePreview(); }); } @@ -4452,6 +4434,7 @@ private void VideoRedockControls() if (!string.IsNullOrEmpty(videoFileName)) { Dispatcher.UIThread.Post(async void () => { await VideoOpenFile(videoFileName); }); + RefreshSubtitlePreview(); } } @@ -6113,9 +6096,7 @@ public void ApplySettings() p.Name == Se.Settings.General.DefaultSubtitleFormat) ?? SubtitleFormats[0]; } - _mpvReloader.Reset(); - _vlcReloader.Reset(); - _mpvPreviewDirty = true; + RefreshSubtitlePreview(); } public VideoPlayerControl? GetVideoPlayerControl() @@ -8226,6 +8207,8 @@ private void VideoFullScreen() _vlcReloader.RefreshVlc(vlc, GetUpdateSubtitle(), _subtitleSecondary, SelectedSubtitleFormat); } } + + RefreshSubtitlePreview(); } [RelayCommand] @@ -12231,9 +12214,7 @@ private async Task VideoOpenFile(string videoFileName) // OpenVideoFile _videoOpenTokenSource?.Cancel(); await vp.Open(videoFileName); _videoFileName = videoFileName; - _mpvReloader.Reset(); - _vlcReloader.Reset(); - _mpvPreviewDirty = true; + RefreshSubtitlePreview(); if (IsValidUrl(videoFileName)) { From 9ace0ea0e9228b6e832cdb48275e3e8a5d84e68c Mon Sep 17 00:00:00 2001 From: Ivandro Jao Date: Sat, 4 Apr 2026 23:40:54 +0100 Subject: [PATCH 15/74] Fix incorrect naming and typos in UiUtil separator methods - Rename MakeVerticalSeperator to MakeHorizontalSeparator (was creating a horizontal line via Height) - Rename MakeHorizontalSeperator to MakeVerticalSeparator (was creating a vertical line via Width) - Fix typo backgroud -> background in both method parameters - Update all call sites accordingly Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/UI/Features/Main/MainView.cs | 2 +- .../SyntaxColorTooWideSettingsWindow.cs | 2 +- src/UI/Logic/UiUtil.cs | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/UI/Features/Main/MainView.cs b/src/UI/Features/Main/MainView.cs index c6f36ca5204..845bca01dff 100644 --- a/src/UI/Features/Main/MainView.cs +++ b/src/UI/Features/Main/MainView.cs @@ -77,7 +77,7 @@ protected override object Build() if (Se.Settings.Appearance.ShowHorizontalLineAboveToolbar) { - root.Children.Add(UiUtil.MakeVerticalSeperator(0.5, 0.5, new Thickness(0, 0, 0, 0)).Dock(Dock.Top)); + root.Children.Add(UiUtil.MakeHorizontalSeparator(0.5, 0.5, new Thickness(0, 0, 0, 0)).Dock(Dock.Top)); } // Toolbar diff --git a/src/UI/Features/Options/Settings/SyntaxColorTooWideSettings/SyntaxColorTooWideSettingsWindow.cs b/src/UI/Features/Options/Settings/SyntaxColorTooWideSettings/SyntaxColorTooWideSettingsWindow.cs index d1617301bbc..358a367bf3e 100644 --- a/src/UI/Features/Options/Settings/SyntaxColorTooWideSettings/SyntaxColorTooWideSettingsWindow.cs +++ b/src/UI/Features/Options/Settings/SyntaxColorTooWideSettings/SyntaxColorTooWideSettingsWindow.cs @@ -113,7 +113,7 @@ public SyntaxColorTooWideSettingsWindow(SyntaxColorTooWideSettingsViewModel vm) grid.Add(numericFontSize, 1, 1); grid.Add(labelMaxWidth, 2, 0); grid.Add(numericMaxWidth, 2, 1); - grid.Add(UiUtil.MakeVerticalSeperator(), 3, 0, 1, 2); + grid.Add(UiUtil.MakeVerticalSeparator(), 3, 0, 1, 2); grid.Add(labelSampleText, 4, 0); grid.Add(textBoxSampleText, 4, 1); grid.Add(labelBoxWidth, 5, 0); diff --git a/src/UI/Logic/UiUtil.cs b/src/UI/Logic/UiUtil.cs index 74ca5ed7cb8..fa839f60dfc 100644 --- a/src/UI/Logic/UiUtil.cs +++ b/src/UI/Logic/UiUtil.cs @@ -173,26 +173,26 @@ public static Color GetBorderColor() return new Color(128, color.R, color.G, color.B); } - public static Separator MakeVerticalSeperator(double height = 0.5, double opacity = 0.5, Thickness? margin = null, - IBrush? backgroud = null) + public static Separator MakeHorizontalSeparator(double height = 0.5, double opacity = 0.5, Thickness? margin = null, + IBrush? background = null) { return new Separator { Height = height, Margin = margin ?? new Thickness(5, 1), - Background = backgroud ?? GetBorderBrush(), + Background = background ?? GetBorderBrush(), Opacity = opacity, }; } - public static Border MakeHorizontalSeperator(double width = 2.5, double opacity = 0.5, Thickness? margin = null, - IBrush? backgroud = null) + public static Border MakeVerticalSeparator(double width = 2.5, double opacity = 0.5, Thickness? margin = null, + IBrush? background = null) { return new Border { Width = width, Margin = margin ?? new Thickness(1, 5), - Background = backgroud ?? GetBorderBrush(), + Background = background ?? GetBorderBrush(), Opacity = opacity, VerticalAlignment = VerticalAlignment.Stretch, HorizontalAlignment = HorizontalAlignment.Center From 39ef3fdd619a5cd54c2f8c25eb225932138ac6fc Mon Sep 17 00:00:00 2001 From: niksedk Date: Sun, 5 Apr 2026 19:24:41 +0200 Subject: [PATCH 16/74] Minor fix for effects --- .../Effects/AdvancedEffectFancyKaraoke.cs | 6 +++--- .../Tools/BatchConvert/BatchConverter.cs | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/UI/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectFancyKaraoke.cs b/src/UI/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectFancyKaraoke.cs index 8c9a7e75f58..dc0a302b2b5 100644 --- a/src/UI/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectFancyKaraoke.cs +++ b/src/UI/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectFancyKaraoke.cs @@ -29,12 +29,12 @@ public class AdvancedEffectFancyKaraoke : IAdvancedEffectDisplay /// When true, ignore explicit active-word markup and auto-sequence whole words /// (one subtitle per word, timing = duration / wordCount). /// - public bool AutoDetectActiveWord { get; set; } = false; + public bool AutoDetectActiveWord { get; set; } = true; /// /// Alpha value used for inactive words (ASS \alpha uses hex). /// - public int InactiveAlpha { get; set; } = 100; + public int InactiveAlpha { get; set; } = 200; /// /// Glow color used for the active word's 3c (ASS BGR). @@ -88,7 +88,7 @@ public List ApplyEffect( if (!string.IsNullOrEmpty(posTags)) sb.Append(posTags); // Inactive tags now explicitly set \1c to InactiveWordColor so color resets after active word. - string inactiveTags = $"{{\\alpha&H{InactiveAlpha:X2}&\\1c{ToAssColor(InactiveWordColor)}\\bord0\\shad0\\blur0\\fscx100\\fscy100}}"; + string inactiveTags = $"{{\\alpha&H{(255 -InactiveAlpha):X2}&\\1c{ToAssColor(InactiveWordColor)}\\bord0\\shad0\\blur0\\fscx100\\fscy100}}"; if (parsed == null || string.IsNullOrEmpty(parsed.Value.Active)) { diff --git a/src/UI/Features/Tools/BatchConvert/BatchConverter.cs b/src/UI/Features/Tools/BatchConvert/BatchConverter.cs index 03a182d33db..92663f97f02 100644 --- a/src/UI/Features/Tools/BatchConvert/BatchConverter.cs +++ b/src/UI/Features/Tools/BatchConvert/BatchConverter.cs @@ -325,7 +325,8 @@ public async Task Convert(BatchConvertItem item, CancellationToken cancellationT SaveSubtitleFormat(item, binaryPersistableSubtitle, format, cancellationToken); return; } - else if (format is Ayato ayato) //TODO: make Ayato implement IBinaryPersistableSubtitle + + if (format is Ayato ayato) //TODO: make Ayato implement IBinaryPersistableSubtitle { var path = MakeOutputFileName(item, format.Extension); ayato.Save(path, string.Empty, item.Subtitle); @@ -1880,6 +1881,11 @@ private Subtitle MergeLinesWithSameText(Subtitle subtitle) private string MakeOutputFileName(BatchConvertItem item, string extension) { + System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] item.FileName='{item.FileName}'"); + System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] item.OutputFileName='{item.OutputFileName}'"); + System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] extension='{extension}'"); + System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] SaveInSourceFolder={_config.SaveInSourceFolder}, OutputFolder='{_config.OutputFolder}'"); + var outputFolder = _config.SaveInSourceFolder || string.IsNullOrEmpty(_config.OutputFolder) ? Path.GetDirectoryName(item.FileName) : _config.OutputFolder; @@ -1888,13 +1894,18 @@ private string MakeOutputFileName(BatchConvertItem item, string extension) throw new InvalidOperationException("Output folder is not set"); } + System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] outputFolder='{outputFolder}'"); + var fileName = Path.GetFileNameWithoutExtension(item.FileName); + System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] fileName (from item.FileName)='{fileName}'"); if (!string.IsNullOrEmpty(item.OutputFileName)) { fileName = Path.GetFileNameWithoutExtension(item.OutputFileName); + System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] fileName (from item.OutputFileName)='{fileName}'"); } var targetExtension = extension; + System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] targetExtension='{targetExtension}'"); if (!string.IsNullOrEmpty(item.LanguageCode)) { @@ -1936,18 +1947,22 @@ private string MakeOutputFileName(BatchConvertItem item, string extension) } var outputFileName = Path.Combine(outputFolder, fileName + targetExtension); + System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] outputFileName (combined)='{outputFileName}'"); if (targetExtension != string.Empty && !File.Exists(outputFileName) && Directory.Exists(outputFolder)) { + System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] returning (new file, folder exists)='{outputFileName}'"); return outputFileName; } if (targetExtension == string.Empty && Directory.Exists(outputFileName)) { + System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] returning (empty ext, dir exists)='{outputFileName}'"); return outputFileName; } if (targetExtension != string.Empty && _config.Overwrite && File.Exists(outputFileName)) { + System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] overwriting existing file='{outputFileName}'"); File.Delete(outputFileName); } else @@ -1958,8 +1973,10 @@ private string MakeOutputFileName(BatchConvertItem item, string extension) outputFileName = Path.Combine(outputFolder, fileName + $"_{counter}" + targetExtension); counter++; } while (File.Exists(outputFileName) || Directory.Exists(outputFileName)); + System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] counter-suffixed outputFileName='{outputFileName}'"); } + System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] returning (final)='{outputFileName}'"); return outputFileName; } From e0e3bb523b1665f860e640810825a1f61753a44b Mon Sep 17 00:00:00 2001 From: Ivandro Jao Date: Sun, 5 Apr 2026 23:11:07 +0100 Subject: [PATCH 17/74] refactor: implement `IBinaryPersistableSubtitle` in Ayato and streamline save logic - Added `Save` method for binary persistence. - Refactored `Save` logic to use a shared `WriteToStream` method. - Removed obsolete Ayato-specific handling in `BatchConverter`. --- .../Tools/BatchConvert/BatchConverter.cs | 7 - src/libse/SubtitleFormats/Ayato.cs | 264 +++++++++--------- 2 files changed, 138 insertions(+), 133 deletions(-) diff --git a/src/UI/Features/Tools/BatchConvert/BatchConverter.cs b/src/UI/Features/Tools/BatchConvert/BatchConverter.cs index 92663f97f02..21c6226a52b 100644 --- a/src/UI/Features/Tools/BatchConvert/BatchConverter.cs +++ b/src/UI/Features/Tools/BatchConvert/BatchConverter.cs @@ -326,13 +326,6 @@ public async Task Convert(BatchConvertItem item, CancellationToken cancellationT return; } - if (format is Ayato ayato) //TODO: make Ayato implement IBinaryPersistableSubtitle - { - var path = MakeOutputFileName(item, format.Extension); - ayato.Save(path, string.Empty, item.Subtitle); - return; - } - await SaveSubtitleFormat(item, format, cancellationToken); return; } diff --git a/src/libse/SubtitleFormats/Ayato.cs b/src/libse/SubtitleFormats/Ayato.cs index 702d6b078df..6a55e5b08cc 100644 --- a/src/libse/SubtitleFormats/Ayato.cs +++ b/src/libse/SubtitleFormats/Ayato.cs @@ -1,4 +1,5 @@ using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Interfaces; using System; using System.Collections.Generic; using System.IO; @@ -6,7 +7,7 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats { - public class Ayato : SubtitleFormat + public class Ayato : SubtitleFormat, IBinaryPersistableSubtitle { public override string Extension => ".aya"; @@ -35,135 +36,146 @@ public override string ToText(Subtitle subtitle, string title) throw new NotImplementedException(); } + public bool Save(string fileName, Stream stream, Subtitle subtitle, bool batchMode) + { + WriteToStream(stream, subtitle); + return true; + } + public void Save(string fileName, string videoFileName, Subtitle subtitle) { using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) { - // header - var header = new byte[2713]; - header[00] = 0x05; - header[01] = 0x30; - header[02] = 0x32; - header[03] = 0x2E; - header[04] = 0x30; - header[05] = 0x33; - header[06] = 0x05; - header[07] = 0x41; - header[08] = 0x79; - header[09] = 0x61; - header[10] = 0x74; - header[11] = 0x6F; - header[12] = 0x02; - header[77] = 0x01; - header[81] = 0x01; - header[608] = 0x3b; - header[609] = 0x32; - header[613] = 0x58; - header[614] = 0x02; - header[615] = 0xE8; - header[616] = 0x03; - header[617] = 0xE8; - header[618] = 0x03; - header[619] = 0xE8; - header[620] = 0x03; - header[621] = 0xE8; - header[622] = 0x03; - header[639] = 0x02; - - header[682] = (byte)(subtitle.Paragraphs.Count & 0xff); - header[683] = (byte)((subtitle.Paragraphs.Count >> 8) & 0xff); - - header[686] = 0x09; - header[687] = 0x04; - - header[751] = 0x08; - - header[760] = 0x01; - header[761] = 0x0a; - - header[830] = 0x58; - header[831] = 0x48; - - header[2048] = 0x99; - header[2049] = 0x02; - - header[2050] = (byte)(subtitle.Paragraphs.Count & 0xff); - header[2051] = (byte)((subtitle.Paragraphs.Count >> 8) & 0xff); - - header[2069] = 0x17; - header[2071] = 0x17; - header[2073] = 0x02; - header[2075] = 0x27; - header[2077] = 0x0c; - header[2079] = 0x04; - - header[2082] = 0x01; - header[2085] = 0x01; - - // Microsoft Sans Serif - header[2088] = 0x4d; - header[2089] = 0x69; - header[2090] = 0x63; - header[2091] = 0x72; - header[2092] = 0x6f; - header[2093] = 0x73; - header[2094] = 0x6f; - header[2095] = 0x66; - header[2096] = 0x74; - header[2097] = 0x20; - header[2098] = 0x53; - header[2099] = 0x61; - header[2100] = 0x6e; - header[2101] = 0x73; - header[2102] = 0x20; - header[2103] = 0x53; - header[2104] = 0x65; - header[2105] = 0x72; - header[2106] = 0x69; - header[2107] = 0x66; - - header[2120] = 0x1f; - header[2123] = 0x01; - header[2124] = 0x02; - - header[2128] = 0xff; - header[2136] = 0x02; - header[2176] = 0x01; - header[2193] = 0x02; - header[2194] = 0x02; - - header[2197] = 0x0C; - header[2198] = 0x14; - header[2199] = 0x0C; - header[2200] = 0x01; - header[2201] = 0xe8; - header[2202] = 0x03; - header[2203] = 0xe8; - header[2204] = 0x03; - header[2205] = 0xe8; - header[2206] = 0x03; - header[2207] = 0xe8; - header[2208] = 0x03; - - header[2225] = 0x13; - header[2226] = 0x08; - header[2227] = 0xdf; - header[2228] = 0x07; - header[2229] = 0x13; - header[2230] = 0x08; - header[2231] = 0xdf; - header[2232] = 0x07; - - fs.Write(header, 0, header.Length); - - // paragraphs - var sub = new Subtitle(subtitle); - int number = 1; - foreach (Paragraph p in sub.Paragraphs) - { - WriteParagraph(fs, p, number); - number++; - } + WriteToStream(fs, subtitle); + } + } + + private static void WriteToStream(Stream fs, Subtitle subtitle) + { + // header + var header = new byte[2713]; + header[00] = 0x05; + header[01] = 0x30; + header[02] = 0x32; + header[03] = 0x2E; + header[04] = 0x30; + header[05] = 0x33; + header[06] = 0x05; + header[07] = 0x41; + header[08] = 0x79; + header[09] = 0x61; + header[10] = 0x74; + header[11] = 0x6F; + header[12] = 0x02; + header[77] = 0x01; + header[81] = 0x01; + header[608] = 0x3b; + header[609] = 0x32; + header[613] = 0x58; + header[614] = 0x02; + header[615] = 0xE8; + header[616] = 0x03; + header[617] = 0xE8; + header[618] = 0x03; + header[619] = 0xE8; + header[620] = 0x03; + header[621] = 0xE8; + header[622] = 0x03; + header[639] = 0x02; + + header[682] = (byte)(subtitle.Paragraphs.Count & 0xff); + header[683] = (byte)((subtitle.Paragraphs.Count >> 8) & 0xff); + + header[686] = 0x09; + header[687] = 0x04; + + header[751] = 0x08; + + header[760] = 0x01; + header[761] = 0x0a; + + header[830] = 0x58; + header[831] = 0x48; + + header[2048] = 0x99; + header[2049] = 0x02; + + header[2050] = (byte)(subtitle.Paragraphs.Count & 0xff); + header[2051] = (byte)((subtitle.Paragraphs.Count >> 8) & 0xff); + + header[2069] = 0x17; + header[2071] = 0x17; + header[2073] = 0x02; + header[2075] = 0x27; + header[2077] = 0x0c; + header[2079] = 0x04; + + header[2082] = 0x01; + header[2085] = 0x01; + + // Microsoft Sans Serif + header[2088] = 0x4d; + header[2089] = 0x69; + header[2090] = 0x63; + header[2091] = 0x72; + header[2092] = 0x6f; + header[2093] = 0x73; + header[2094] = 0x6f; + header[2095] = 0x66; + header[2096] = 0x74; + header[2097] = 0x20; + header[2098] = 0x53; + header[2099] = 0x61; + header[2100] = 0x6e; + header[2101] = 0x73; + header[2102] = 0x20; + header[2103] = 0x53; + header[2104] = 0x65; + header[2105] = 0x72; + header[2106] = 0x69; + header[2107] = 0x66; + + header[2120] = 0x1f; + header[2123] = 0x01; + header[2124] = 0x02; + + header[2128] = 0xff; + header[2136] = 0x02; + header[2176] = 0x01; + header[2193] = 0x02; + header[2194] = 0x02; + + header[2197] = 0x0C; + header[2198] = 0x14; + header[2199] = 0x0C; + header[2200] = 0x01; + header[2201] = 0xe8; + header[2202] = 0x03; + header[2203] = 0xe8; + header[2204] = 0x03; + header[2205] = 0xe8; + header[2206] = 0x03; + header[2207] = 0xe8; + header[2208] = 0x03; + + header[2225] = 0x13; + header[2226] = 0x08; + header[2227] = 0xdf; + header[2228] = 0x07; + header[2229] = 0x13; + header[2230] = 0x08; + header[2231] = 0xdf; + header[2232] = 0x07; + + fs.Write(header, 0, header.Length); + + // paragraphs + var sub = new Subtitle(subtitle); + int number = 1; + foreach (Paragraph p in sub.Paragraphs) + { + WriteParagraph(fs, p, number); + number++; } } From acfd421c9cd4b46f636deb72941621e328324ea6 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 11:57:30 +0200 Subject: [PATCH 18/74] Add Romanian translation - thx zildan :) --- src/UI/Assets/Languages/Romanian.json | 2596 +++++++++++++++++++++++++ src/UI/UI.csproj | 2 + 2 files changed, 2598 insertions(+) create mode 100644 src/UI/Assets/Languages/Romanian.json diff --git a/src/UI/Assets/Languages/Romanian.json b/src/UI/Assets/Languages/Romanian.json new file mode 100644 index 00000000000..0f4a3ed1e35 --- /dev/null +++ b/src/UI/Assets/Languages/Romanian.json @@ -0,0 +1,2596 @@ +{ + "title": "Subtitle Edit", + "version": null, + "translatedBy": "zildan v1 05.04.26", + "cultureName": "ro-RO", + "general": { + "abort": "Renunță", + "actor": "Actor", + "actors": "Actori", + "add": "Adăuga", + "addDotDotDot": "Adăuga...", + "addToNamesListCaseSensitive": "Adăugați la lista de nume (se face distincția între majuscule și minuscule)", + "addToUserDictionary": "Adăugați la dicționarul utilizatorului", + "addVideoFiles": "Adăugați fișiere video...", + "adjustAlpha": "Ajustați alfa (transparență)", + "adjustDisplayDuration": "Reglați durata de afișare", + "adjustment": "Ajustare", + "advanced": "Avansat", + "advancedSettings": "Setări avansate", + "after": "După", + "alignment": "Aliniere", + "alignmentDotDotDot": "Aliniere...", + "alignmentX": "Setați alinierea „{0}” pentru liniile selectate", + "all": "Toate", + "allFiles": "Toate fișierele", + "alphaAdjustment": "Ajustare alfa", + "aphaThreshold": "Pragul alfa", + "apiKey": "cheie API", + "apiSecret": "SecretAPI", + "appearance": "Aspect", + "append": "Adăuga", + "apply": "Aplicați", + "applyTo": "Aplica la", + "ascending": "Ascendent", + "attachDotDotDot": "Atașați...", + "audioFiles": "Fișiere audio", + "audioVisualizer": "Vizualizator audio", + "auto": "Auto", + "autoBreak": "Întreruperea automată a textului", + "autoContinue": "Continuare automată", + "autoTranslate": "Traducere automată", + "autodetect": "Detectare automată", + "background": "Fundal", + "backgroundColor": "Culoare de fundal", + "backward": "Înapoi", + "batchMode": "Modul lot", + "bdnXml": "BDN/xml", + "before": "Înainte", + "beforeX": "Înainte de „{0}”", + "beginning": "Început", + "bluRaySup": "Blu-ray (sup)", + "bold": "Îndrăzneţ", + "bookmarkAdd": "Adăugați marcaj", + "bookmarkAddForSelectedLinesX": "Adăugați marcaj pentru {0} linii selectate", + "bookmarkClearQuestion": "Ștergeți toate marcajele?", + "bookmarkDeleteSelectedQuestion": "Ștergeți marcajul selectat?", + "bookmarkDotDotDot": "Marcaj...", + "bookmarkEdit": "Editați marcajul", + "bookmarkEditForSelectedLinesX": "Editați marcajul pentru {0} linii selectate", + "bookmarksList": "Listează marcaje", + "borderColor": "Culoarea chenarului", + "borderStyle": "Stil de chenar", + "bottomCenter": "Centru de jos", + "bottomLeft": "Jos-Stânga", + "bottomRight": "Jos-Dreapta", + "box": "Cutie", + "boxColor": "Culoarea casetei", + "boxCornerRadius": "Raza colțului cutiei", + "boxPerLine": "Cutie pe linie", + "bridgeGaps": "Goluri de pod", + "cancel": "Renunță", + "cancelled": "Anulat", + "caseInsensitive": "Nu ține seama de majuscule", + "caseSensitive": "Caz sensibil", + "category": "Categorie", + "center": "Centru", + "centerHorizontally": "Centrați pe orizontală", + "centerVertically": "Centrați pe verticală", + "change": "Schimba", + "changeAll": "Schimbați totul", + "changeCasing": "Schimbați carcasa", + "changeFormatting": "Schimbați formatarea", + "changeFrameRate": "Schimbați rata de cadre", + "changeLanguageFilter": "Schimbați filtrul de limbă...", + "changeOnce": "Schimbați o dată", + "changeSpeed": "Schimbați viteza", + "character": "Caracter", + "characters": "Personaje", + "charsPerSec": "Caractere/sec", + "chooseColorDotDotDot": "Alege culoarea...", + "chooseImageFiles": "Alegeți fișierele imagine", + "class": "Clasă", + "classic": "Clasic", + "clear": "Clar", + "close": "Aproape", + "codec": "Codec", + "collapse": "Colaps", + "color": "Culoare", + "colorDotDotDot": "Culoare...", + "column": "Coloană", + "consoleLog": "Jurnalul consolei", + "contentAlignment": "Alinierea conținutului", + "conversionCancelledByUser": "Conversie anulată de utilizator", + "convert": "Convertit", + "converted": "Convertit", + "convertingDotDotDot": "Se convertește...", + "convertingXofYDotDoDot": "Se convertește {0:#,###,##0}/{1:#,###,##0}...", + "copy": "Copie", + "copyImageToClipboard": "Copiați imaginea în clipboard", + "copyTextToClipboard": "Copiați textul în clipboard", + "couldNotSaveFileXErrorY": "Nu s-a putut salva fișierul „{0}”. ", + "count": "Conta", + "cps": "Caractere/sec", + "currentSubtitle": "Subtitrare curentă", + "currentVideoPosition": "Poziția video actuală", + "cut": "Tăiați", + "dark": "Întuneric", + "dateAndTime": "Data și ora", + "default": "Implicit", + "delete": "Şterge", + "deleteAtPosition": "Ștergeți subtitrarea la poziția videoclipului", + "deleteCurrentLine": "Ștergeți linia curentă", + "deleteFirstLines": "Ștergeți primele rânduri", + "deleteLastLines": "Șterge ultimele rânduri", + "deleteLineXPrompt": "Ștergeți numărul de linie {0}?", + "deleteLines": "Șterge linii", + "deleteLinesContainingText": "Ștergeți liniile care conțin text", + "deleteXLinesPrompt": "Ștergeți {0} rânduri?", + "description": "Descriere", + "dictionary": "Dicţionar", + "diskSpace": "Spațiu pe disc", + "doNoChange": "Nu te schimba", + "done": "Făcut", + "doubleWords": "Cuvinte duble", + "doubleLines": "Linii duble", + "download": "Descărcați", + "downloadX": "Descărcați {0}", + "downloadingX": "Se descarcă {0}", + "downloadingXPercent": "Se descarcă {0}%", + "duplicate": "Duplicat", + "duration": "Durată", + "durationMinutes": "Durata in minute", + "edit": "Edita", + "editDotDotDot": "Edita...", + "editing": "Editare", + "effect": "Efect", + "enabled": "Activat", + "encoding": "Codificare", + "endTime": "Ora de sfârșit", + "engine": "Motor", + "enterProfileName": "Introduceți numele profilului", + "error": "Eroare", + "errorX": "Eroare; ", + "example": "Exemplu", + "exampleX": "Exemplu: {0}", + "expand": "Extinde", + "export": "Export", + "exportDotDotDot": "Export...", + "exportToX": "Exportați în {0}", + "extendAfter": "Extinde/scurta la linie după", + "extendBefore": "Extinde/scurta la linie înainte", + "extendSelectedLinesToNextShotChangeOrNextSubtitle": "Extindeți liniile selectate până la următoarea modificare a imaginii (sau următoarea subtitrare)", + "extendSelectedToNext": "Extindeți selectat la următorul", + "extendSelectedToPrevious": "Extindeți selectat la precedentul", + "extractingAudioClips": "Se extrag clipuri audio...", + "fade": "Se estompează", + "fetchFirstWordFromNextSubtitle": "Preluați primul cuvânt din subtitrarea următoare", + "fileAlreadyExists": "Fișierul există deja", + "fileExtension": "Extensie de fișier", + "fileName": "Nume de fișier", + "fileNameX": "Nume fișier: {0}", + "fileNameXAndSize": "Nume fișier: {0} ({1})", + "fileSaved": "Fișier salvat", + "fileSavedToX": "Fișier salvat în {0}", + "fileXAlreadyExists": "Fișierul „{0}” există deja.", + "fileXOfY": "Fișier {0} din {1}", + "filter": "Filtra", + "filterByLayer": "Filtrați după strat", + "find": "Găsi", + "findNext": "Găsiți următorul", + "findTextX": "Găsiți text - {0}", + "fiveHundredMilliseconds": "500 de milisecunde", + "fiveSeconds": "Cinci secunde", + "fix": "Fix", + "fixCommonErrors": "Remediați erorile comune", + "fixRightToLeft": "Remediați de la dreapta la stânga", + "fixRightToLeftViaUnicodeTags": "Remediați RTL prin etichete Unicode", + "fixedValue": "Valoare fixă", + "focusSelectedLine": "Focalizează linia selectată (defilează în vizualizare în grilă)", + "font": "Font", + "fontColor": "Culoarea fontului", + "fontHeight": "Înălțimea fontului", + "fontName": "Numele fontului", + "fontNameDotDotDot": "Numele fontului...", + "fontSize": "Dimensiunea fontului", + "fonts": "Fonturi", + "footer": "Subsol", + "forced": "Forţat", + "foreground": "Prim plan", + "format": "Format", + "forward": "Redirecţiona", + "foundNoMatches": "Nu s-au găsit potriviri", + "foundOneMatch": "Am găsit o potrivire", + "foundXInLineYZ": "S-a găsit „{0}” în rândul {1}, poziția {2}", + "foundXMatches": "S-au găsit {0} potriviri", + "frameRate": "Rata de cadre", + "frameRateX": "Frecvența cadrelor: {0:0.0###}", + "frames": "Rame", + "from": "Din", + "fromCurrentVideoPosition": "din poziția video curentă", + "gap": "Decalaj", + "general": "General", + "generalText": "General", + "generate": "Genera", + "generateImportShotChanges": "Generați/importați modificări de fotografie", + "generating": "Se generează...", + "generatingImageXofY": "Se generează imaginea {0:#,##0} din {1:#,##0}...", + "generatingWavFile": "Se generează fișierul wav...", + "getAudioClips": "Obțineți clipuri audio", + "goTo": "Du-te la", + "goToLineNumber": "Accesați numărul rândului", + "goToNextShotChange": "Treceți la următoarea schimbare a fotografiei", + "goToPreviousShotChange": "Treceți la schimbarea fotografiei anterioare", + "googleIt": "Google-l ", + "group": "Grup", + "header": "Antet", + "height": "Înălţime", + "help": "Ajutor", + "hex": "Hex", + "hide": "Ascunde", + "hidePreview": "Ascunde previzualizarea", + "history": "Istorie", + "horizontal": "Orizontală", + "hourMinutesSecondsDecimalSeparatorMilliseconds": "Ora:min:sec{0}ms", + "hourMinutesSecondsFrames": "Ora:min:sec:cadre", + "ip": "IP", + "id": "ID", + "image": "Imagine", + "imageSaved": "Imaginea salvată", + "imagedBasedSubtitles": "Subtitrări bazate pe imagini", + "images": "Imagini", + "imagesWithTimeCode": "Imagini cu cod temporal", + "import": "Import", + "importDotDotDot": "Import...", + "include": "Include", + "information": "Informaţii", + "insertAfter": "Inserați după", + "insertAtPositionAndFocusTextBox": "Introduceți subtitrare la poziția videoclipului și focalizați caseta de text", + "insertAtPositionNoFocusTextBox": "Inserați subtitrare la poziția videoclipului (fără casetă de text focalizată)", + "insertBefore": "Introduceți înainte", + "insertLine": "Inserați linia", + "insertNewSelection": "Introduceți o nouă selecție", + "insertSubtitleAfterCurrentLine": "Introduceți subtitrare după linia curentă...", + "insertSubtitleFileAtVideoPositionDotDotDot": "Inserați fișierul de subtitrare la poziția videoclipului...", + "inspectAdditions": "Verificați completările...", + "invertSelection": "Inversați selecția", + "isDefault": "Este implicit", + "italic": "Cursiv", + "keepExistingTimeCodes": "Păstrați codurile de timp existente (nu adăugați decalaj video)", + "keyFile": "Fișierul cheii", + "language": "Limbă", + "languagePostFix": "Limbă post-fix (mkv/mp4)", + "layer": "Strat", + "layerFilterOn": "Filtru de straturi activat", + "left": "Stânga", + "light": "Aprinde", + "lineHeigth": "Înălțimea liniei", + "lineNumber": "Linia#", + "lineXColumnY": "Linia {0}, coloana {1}", + "lines": "Linii", + "linesAddedX": "Rânduri adăugate: {0}", + "linesChangedX": "Liniile modificate: {0}", + "linesDeletedX": "Linii șterse: {0}", + "listErrors": "Enumeră erorile", + "loadDefaults": "Încărcați valorile implicite", + "lockTimeCodes": "Blocați codurile de timp", + "logo": "Logo", + "margin": "Marja", + "match": "Meci", + "maxCharactersPerSecond": "Maximum de caractere pe secundă", + "mediaInformation": "Informații media", + "mergeAfter": "Îmbinați cu linia de după", + "mergeBefore": "Îmbinați cu linia de dinainte", + "mergeLines": "Îmbina liniile", + "mergeLinesWithSameText": "Îmbina liniile cu același text", + "mergeLinesWithSameTimeCodes": "Îmbina liniile cu aceleași coduri de timp", + "mergeSelected": "Îmbinare selectată", + "mergeSelectedAsDialog": "Îmbinați selectat ca dialog", + "mergeSelectedLines": "Îmbina liniile selectate", + "mergeSelectedLinesDialog": "Îmbina liniile selectate ca dialog", + "mergeWithLineAfterAndAutoBreak": "Îmbinați cu linia după și auto-break", + "mergeWithLineAfterKeepBreaks": "Îmbinați cu linia după (păstrați pauzele)", + "mergeWithLineBeforeAndAutoBreak": "Îmbinați cu linia înainte și auto-break", + "mergeWithLineBeforeKeepBreaks": "Îmbinați cu linia înainte (păstrați pauzele)", + "middleCenter": "Centru-Mijloc", + "middleLeft": "Mijloc-Stânga", + "middleRight": "Mijloc-Dreapta", + "milliseconds": "Milisecunde", + "model": "Model", + "models": "Modele", + "more": "Mai mult", + "moreInfo": "Mai multe informații", + "moveAllShotChangeOneFrameBack": "Mutați toate modificările capturii cu un cadru înapoi", + "moveAllShotChangeOneFrameForward": "Mutați toate modificările de fotografiere cu un cadru înainte", + "moveDown": "Deplasați-vă în jos", + "moveUp": "Mișcă-te în sus", + "multipleReplace": "Înlocuire multiplă", + "name": "Nume", + "negative": "Negativ", + "new": "Nou", + "newDotDotDot": "Nou...", + "newProfile": "Profil nou", + "newSubtitleStartKeyDownSetEndKeyUp": "Inserați subtitrare: Începeți cu tasta în jos, setați sfârșitul cu tasta sus", + "setSubtitleStartAtVideoPositionSetEndAtKeyUpAndGoToNext": "Setați începutul la poziția video, setați sfârșitul pe tasta sus și treceți la următorul", + "no": "Nu", + "noFilesToConvert": "Nu există fișiere de convertit", + "noLanguageCode": "Fără cod de limbă", + "noSubtitleLoaded": "Nu s-a încărcat subtitrare", + "noSubtitlesFound": "Nu s-au găsit subtitrări!", + "noSymbolLines": "#Linii", + "noVideoLoaded": "Niciun videoclip încărcat", + "none": "Nici unul", + "normalCasing": "Carcasă normală", + "notAvailable": "N / A", + "notInstalled": "Neinstalat", + "number": "Număr", + "numberSymbol": "#", + "ocrDotDotDot": "OCR...", + "ocrPercentX": "OCR: {0}%", + "offset": "Offset", + "offsetTimeCodes": "Offset coduri de timp", + "offsetX": "Offset X", + "offsetY": "Offset Y", + "ok": "_OK", + "oneFile": "Un singur dosar", + "oneHundredMilliseconds": "100 de milisecunde", + "oneSecond": "O secundă", + "oneSecondBack": "O secundă înapoi", + "oneSecondForward": "O secundă", + "onlineVideoFeatureNotAvailable": "Funcția nu este disponibilă pentru videoclipurile online", + "openContainingFolder": "Deschideți folderul care conține", + "openDictionaryFolder": "Deschideți folderul dicționar", + "openFile": "Deschideți fișierul", + "openImageBasedSubtitle": "Deschideți subtitrarea bazată pe imagini", + "openImageFile": "Deschideți fișierul imagine", + "openOriginalSubtitleFile": "Deschide fișierul de subtitrare original...", + "openOriginalSubtitleFileTitle": "Deschideți fișierul de subtitrare original", + "openOutputFolder": "Deschideți folderul de ieșire", + "openSubtitle": "Deschide subtitrarea...", + "openSubtitleFileTitle": "Deschideți fișierul de subtitrare", + "openSubtitles": "Deschideți subtitrări...", + "openVideoFile": "Deschide fișierul video...", + "openVideoFileTitle": "Deschideți fișierul video", + "optimalCharactersPerSecond": "Caractere optime pe secundă", + "options": "Opțiuni", + "originalText": "Textul original", + "outline": "Contur", + "outlineColor": "Culoarea conturului", + "outlineWidth": "Lățimea conturului", + "outputFolder": "Dosarul de ieșire", + "outputProperties": "Proprietăți de ieșire", + "overlap": "Suprapune", + "overlapNextX": "Se suprapune în continuare ({0:#;##0.###})", + "overlapPreviousLineX": "Se suprapune linia anterioară ({0:#;##0.###})", + "overlapStartAndEnd": "Se suprapun începutul și sfârșitul", + "overlapX": "Suprapunere ({0:#;##0.###})", + "overwriteExistingFiles": "Suprascrie fișierele existente", + "overwriteFilesInFolderX": "Suprascrierea fișierelor din dosarul: „{0}”", + "overwriteQuestion": "Suprascrie?", + "padding": "Captuseala", + "parameters": "Parametrii", + "parsingXDotDotDot": "Se analizează {0}...", + "paste": "Pastă", + "pasteNewSelection": "Lipiți textul clipboard în noua selecție", + "pause": "Pauză", + "percent": "La sută", + "pickLayer": "Setați stratul", + "pickOllamaModel": "Alege modelul Ollama", + "pickOutputFolder": "Alegeți folderul de ieșire", + "pickResolutionFromCurrentVideo": "Alegeți rezoluția din videoclipul curent", + "pickResolutionFromVideoDotDotDot": "Alegeți rezoluția din videoclip...", + "pickSubtitleFile": "Alegeți fișierul de subtitrare...", + "pickVideoFile": "Alegeți fișierul video...", + "pickVideoPosition": "Alegeți poziția video", + "play": "Juca", + "playFromStartOfVideo": "Redați de la începutul videoclipului", + "playNext": "Joacă în continuare", + "playSelectedLines": "Redați liniile selectate", + "playSelectedLinesWithLoop": "Redați liniile selectate cu buclă", + "pleaseEnterAValidValueForX": "Vă rugăm să introduceți o valoare validă pentru „{0}”", + "pleaseWait": "Va rugam asteptati...", + "position": "Poziţie", + "positionX": "Poziție: {0}", + "postProcessing": "Postprocesare", + "poweredBy": "Cu sprijinul", + "prefix": "Prefix", + "preview": "Previzualizare", + "profile": "Profil", + "profileName": "Numele profilului", + "profiles": "Profiluri", + "property": "Proprietate", + "question": "Întrebare", + "reDownloadX": "Descărcați din nou {0}", + "reason": "Motiv", + "recentFiles": "Fișiere recente", + "redo": "Reface", + "refresh": "Reîmprospăta", + "region": "Regiune", + "regularExpression": "Expresia regulată", + "regularExpressionIsNotValid": "Expresia regulată nu este validă!", + "relativeToCurrentVideoPosition": "Raportat la poziția video curentă", + "remove": "Elimina", + "removeAlignment": "Eliminați alinierea", + "removeAllFormatting": "Eliminați toate formatările", + "removeBlankLines": "Eliminați liniile goale", + "removeBold": "Eliminați bold", + "removeColor": "Îndepărtați culoarea", + "removeFilter": "Scoateți filtrul", + "removeFontName": "Eliminați numele fontului", + "removeFormatting": "Eliminați formatarea", + "removeItalic": "Eliminați cursiv", + "removeRightToLeftUnicodeTags": "Eliminați etichetele RTL Unicode", + "removeSelectedFile": "Eliminați fișierul selectat?", + "removeStyling": "Eliminați stilul", + "removeTextForHearingImpaired": "Eliminați textul pentru persoanele cu deficiențe de auz", + "removeUnderline": "Eliminați sublinierea", + "rename": "Redenumiți", + "replace": "Înlocui", + "replaceWith": "Înlocuiește cu", + "requiresRestart": "Necesită repornire", + "reset": "Resetați", + "resolution": "Rezoluţie", + "resolutionX": "Rezoluție: {0}", + "reverseRightToLeftStartEnd": "Reverse RTL start/end", + "right": "Corect", + "rightToLeft": "De la dreapta la stânga", + "rules": "Reguli", + "saveChangesMessage": "Doriți să salvați modificările la fișierul de subtitrare curent?", + "saveChangesTitle": "Salvați modificările?", + "saveChangesToX": "Doriți să salvați modificările aduse „{0}”?", + "saveChangesToXOriginal": "Doriți să salvați modificările aduse fișierului de subtitrare original „{0}”?", + "saveDotDotDot": "Salva...", + "saveFileAsTitle": "Salvați fișierul ca", + "saveImageAs": "Salvați imaginea ca", + "saveImageAsDotDotDot": "Salvați imaginea ca...", + "saveOriginalAsTitle": "Salvați originalul ca", + "saveTranslationAsTitle": "Salvați traducerea ca", + "saveVideoAsVideoTitle": "Salvați videoclipul ca", + "savedChangesToX": "Salvat „{0}”", + "savedChangesToXAndY": "„{0}” și „{1}” au fost salvate", + "savingDotDotDot": "Economisire...", + "script": "Scenariul", + "search": "Căutare", + "searchDirection": "Direcția de căutare", + "searchFontNames": "Căutați numele fonturilor...", + "searchSubtitleFormats": "Căutați formate de subtitrare", + "seconds": "secunde", + "selectAll": "Selectați toate", + "selectFilesToConvert": "Selectați fișierele de convertit", + "selectNone": "Selectați niciunul", + "selectSaveFolder": "Selectați un dosar în care să salvați", + "selectSubtitle": "Selectați subtitrarea", + "selectedAFolderToSaveTo": "S-a selectat un folder în care să se salveze", + "selectedLines": "Liniile selectate", + "selectedlinesX": "Liniile selectate: {0}", + "sensitivity": "Sensibilitate", + "separator": "Separator", + "sessionKey": "Cheia de sesiune", + "sessionKeyGenerate": "Generați o cheie nouă", + "setEnd": "Setează sfârșitul", + "setEndAndGoToNext": "Setați sfârșitul și treceți la următorul", + "setEndAndOffsetTheRest": "Setează capătul și compensează restul", + "setFontDotDotDot": "Setați fontul...", + "setStart": "Setează startul", + "setStartAndOffsetTheRest": "Setați startul și compensați restul", + "setVideoOffset": "Setați decalajul video", + "settings": "Setări", + "shadow": "Umbră", + "shadowColor": "Culoarea umbrei", + "shadowWidth": "Lățimea umbrei", + "shortcut": "Comandă rapidă", + "shortcutX": "Comandă rapidă: {0}", + "shortcuts": "Comenzi rapide", + "show": "Spectacol", + "showActorColumn": "Afișați coloana „Actor”.", + "showCpsColumn": "Afișați coloana „Caracteri/sec”.", + "showDurationColumn": "Afișați coloana „Durată”.", + "showGapColumn": "Afișați coloana „Gap”.", + "showStartColumn": "Afișați coloana „Start”.", + "showHideColumn": "Afișați coloana „Ascunde”.", + "showHistory": "Arată istoricul", + "showLayerColumn": "Afișați coloana „Strat”.", + "showPreview": "Afișează previzualizarea", + "showShotChangesList": "Afișează lista cu modificări de fotografiere", + "showStyleColumn": "Afișați coloana „Stil”.", + "showTimeCodes": "Afișați codurile de timp", + "showWpmColumn": "Afișați coloana „Cuvinte/min”.", + "showPixelWidthColumn": "Afișați coloana „Lățimea pixelilor”.", + "shrink": "Se micsoreaza", + "singleBox": "Cutie unică", + "singleLineLengths": "Lungimea unei singure linii:", + "singleMode": "Mod unic", + "size": "Dimensiune", + "sizeX": "Dimensiune: {0}", + "skip": "Sari peste", + "skipAll": "Sari peste toate", + "skipOnce": "Sari peste o data", + "smart": "Inteligent", + "snapSelectedLinesToNearestShotChange": "Fixați liniile selectate începutul/sfârșitul la cea mai apropiată schimbare a fotografiei", + "solidColor": "Culoare solidă", + "sourceViewX": "Vizualizare sursă - {0}", + "spacing": "Spațiere", + "speechToTextSelectedLines": "Vorbire în text selectat (consultați Opțiuni - Setări)", + "speechToTextSelectedLinesPromptAlways": "Vorbire în text liniile selectate (intotdeauna prompt motor/limba)", + "speechToTextSelectedLinesPromptFirstTime": "Rândurile selectate vorbire în text (motorul prompt/limbă numai prima dată)", + "speed": "Viteză", + "splitAtTextBoxCursorPosition": "Împărțire la poziția cursorului text", + "splitLine": "Linie împărțită", + "splitLineAtTextBoxCursorPosition": "Linie împărțită la poziția cursorului", + "splitLineAtVideoAndTextBoxPosition": "Linie împărțită în poziția video și a casetei de text", + "splitLineAtVideoPosition": "Linie împărțită la poziția video", + "startFrom": "Începe de la", + "startTime": "Ora de începere", + "startingDotDotDot": "Pornire...", + "status": "Stare", + "stereo": "Stereo", + "stop": "Stop", + "strikeout": "Strikeout", + "style": "Stil", + "styleExaggeration": "Exagerarea stilului", + "styleLanguage": "Stil / Limbă", + "styles": "Stiluri", + "subtitleFile": "Fișier cu subtitrare", + "subtitleFileName": "Nume fișier de subtitrare", + "subtitleFileSaved": "Fișierul de subtitrare a fost salvat", + "subtitleFileSavedToX": "Fișierul cu subtitrare salvat în {0}", + "subtitleFiles": "Fișiere de subtitrare", + "subtitleFormats": "Formate de subtitrare", + "subtitleLoadedX": "Subtitrare încărcată: {0}", + "subtitleXOfY": "Subtitrare {0} din {1}", + "suffix": "Sufix", + "suggestions": "Sugestii", + "sync": "Sincronizare", + "syntaxColoring": "Colorarea sintaxelor", + "system": "Sistem", + "targetEncoding": "Codarea țintă", + "targetFormat": "Format țintă", + "tenHours": "10 ore", + "tenMilliseconds": "10 milisecunde", + "text": "Text", + "textColor": "Culoarea textului", + "textFiles": "Fișiere text", + "textOrImage": "Text/imagine", + "threeLetterLanguageCode": "Cod de limbă din trei litere", + "time": "Timp", + "timeCodes": "Codurile de timp", + "timing": "Sincronizare", + "title": "Titlu", + "to": "La", + "toggleCasing": "Comutați carcasa", + "toggleDirection": "Comutați direcția", + "toggleForced": "Comutare forțată", + "toggleShotChangesAtVideoPosition": "Comutați modificările de fotografiere la poziția videoclipului", + "toolbar": "Bara de instrumente", + "tools": "Instrumente", + "topCenter": "Sus-Centru", + "topLeft": "Sus-Stânga", + "topRight": "Sus-Dreapta", + "totalAdjustmentX": "Ajustare totală: {0}", + "totalFramesX": "Total cadre: {0:#;##0.##}", + "totalLengthX": "Lungime totală: {0}", + "totalLengthXSplitLine": "Lungime totală: {0} (linie divizată!)", + "translate": "Traduce", + "translateRow": "Traduceți rândul", + "translation": "Traducere", + "twoLetterLanguageCode": "Cod de limbă din două litere", + "type": "Tip", + "unbreak": "Desfaceți textul", + "unbreakLines": "Desfaceți liniile", + "underline": "Subliniați", + "undo": "Revenire", + "unknown": "Necunoscut", + "unknownSubtitleFormat": "Format necunoscut de subtitrare", + "unpacking7ZipArchiveDotDotDot": "Se despachetează arhiva 7-zip...", + "unpackingX": "Despachetarea {0}", + "untitled": "Fără titlu", + "update": "Actualizare", + "updateAndClose": "Actualizați și închideți", + "updateDetails": "Actualizați detaliile", + "updatedBy": "Actualizat de", + "url": "URL", + "usages": "Utilizări", + "use": "Utilizare", + "useAlways": "Folosiți întotdeauna", + "useLargerFontForThisWindow": "Utilizați font mai mare pentru această fereastră", + "useOnce": "Utilizați o dată", + "useOutputFolder": "Folosiți folderul de ieșire", + "useSourceFolder": "Utilizați folderul sursă", + "useSourceResolution": "Utilizați rezoluția sursei", + "userName": "Nume de utilizator", + "userNameAlreadyInUse": "Numele de utilizator este deja folosit", + "vertical": "Vertical", + "video100MsBack": "Video, cu 100 de milisecunde înapoi", + "video100MsForward": "Video, 100 de milisecunde înainte", + "video500MsBack": "Video, 500 de milisecunde înapoi", + "video500MsForward": "Video, 500 de milisecunde înainte", + "videoCustom1BackX": "Video, milisecunde personalizate ({0:#,###,##0}) înapoi, 1", + "videoCustom1ForwardX": "Videoclip, milisecunde personalizate ({0:#,###,##0}) înainte, 1", + "videoCustom2BackX": "Videoclip, milisecunde personalizate ({0:#,###,##0}) înapoi, 2", + "videoCustom2ForwardX": "Video, milisecunde personalizate ({0:#,###,##0}) înainte, 2", + "videoEncodingX": "Codificare video: {0}", + "videoExtension": "Extensie fișier video", + "videoFile": "Fișier video", + "videoFileGeneratedX": "Fișier video generat: „{0}”", + "videoFiles": "Fișiere video", + "videoInformation": "Informații video", + "videoOffset": "Compensare video", + "videoOneFrameBack": "Video, un cadru înapoi", + "videoOneFrameForward": "Video, un cadru înainte", + "videoOneSecondBack": "Video, o secundă înapoi", + "videoOneSecondForward": "Video, o secundă înainte", + "videoPlayer": "Player video", + "videoPosition": "Poziția video", + "videoResolution": "Rezoluție video", + "viewX": "Vedeți {0}", + "visible": "Vizibil", + "voice": "Voce", + "warning": "Avertizare", + "waveformCenterOnVideoPosition": "Centrul formei de undă pe poziția video", + "waveformPasteFromClipboard": "Lipiți din clipboard", + "waveformSpectrogram": "Formă de undă/spectrogramă", + "webServiceUrl": "Adresa URL a serviciului web", + "width": "Lăţime", + "windowPositionAndSize": "Poziția și dimensiunea ferestrei", + "wordsPerMin": "Cuvinte/min", + "pixelWidth": "Lățimea pixelilor", + "wpm": "Cuvinte/min", + "xFiles": "{0:#,###,##0} fișiere", + "xFilesConvertedInY": "{0:#,###,##0} fișiere convertite în {1}", + "xNotFound": "„{0}” nu a fost găsit", + "xRequiresAnApiKey": "!!!>>> JSON.parse: unexpected character at line 1 column 1 of the JSON data <<", + "cpsLessThan": "CPS <", + "cpsGreaterThan": "CPS >", + "lengthLessThan": "Lungime <", + "lengthGreaterThan": "Lungime >", + "pixelLengthGreaterThan": "Lungimea pixelilor >", + "gapLessThan": "Gap în ms <", + "gapGreaterThan": "Gap în ms >", + "exactlyOneLine": "Exact o linie", + "exactlyTwoLines": "Exact două rânduri", + "moreThanTwoLines": "Mai mult de două rânduri", + "bookmarked": "Marcat", + "bookmarkContains": "Marcaj conține", + "blankLines": "Linii goale", + "selectionNew": "Selecție nouă", + "selectionAdd": "Adăugați la selecție", + "selectionSubtract": "Scădeți din selecție", + "selectionIntersect": "Se intersectează cu selecția" + }, + "multipleReplace": { + "title": "Înlocuire multiplă", + "editRule": "Editați regula", + "newRule": "Regulă nouă", + "editCategory": "Editați categoria", + "newCategory": "Noua categorie", + "categoryName": "Numele categoriei", + "exportReplaceRules": "Reguli de export", + "appliedRules": "Reguli aplicate", + "findRule": "Găsiți regula", + "xLinesAffected": "{0:#,##0} linii afectate", + "deleteCategoryConfirm": "Ștergeți categoria „{0}”?", + "deleteRuleConfirm": "Ștergeți regula „{0}”?", + "findWhat": "Găsiți ce", + "descriptionOptional": "Descriere (opțional)" + }, + "find": { + "searchTextWatermark": "Căutați text...", + "wholeWord": "Cuvântul întreg", + "caseSensitive": "Caz sensibil", + "caseInsensitive": "Nu ține seama de majuscule", + "findPrevious": "Găsiți _anterior", + "findNext": "_Găsiți următorul", + "replaceAndFindNext": "_Înlocuiți și găsiți următorul", + "replaceAll": "Înlocuiți _toate", + "replaceTitle": "Înlocui", + "replaceWith": "Înlocuiește cu", + "replaceTextWatermark": "Inlocuieste cu..." + }, + "showHistory": "Istoric pentru anulare", + "restoreSelected": "Restabiliți selectat" + }, + "tools": { + "fixCommonErrors": { + "title": "Remediați erorile comune", + "step1": "Pasul 1/2 - Alegeți ce erori să remediați", + "whatToFix": "Ce să repare", + "example": "Exemplu", + "selectAll": "Selectați toate", + "inverseSelection": "Inversați selecția", + "back": "< &Înapoi", + "next": "&Următorul >", + "step2": "Pasul 2/2 - Verificați remedierea", + "fixes": "Remedieri", + "log": "Jurnal", + "function": "Funcţie", + "removedEmptyLine": "Eliminați linia goală", + "removedEmptyLineAtTop": "Îndepărtați linia goală din partea de sus", + "removedEmptyLineAtBottom": "Îndepărtați linia goală din partea de jos", + "removedEmptyLineInMiddle": "Îndepărtați linia goală din mijloc", + "removedEmptyLinesUnusedLineBreaks": "Eliminați liniile goale/întreruperile de linie neutilizate", + "fixOverlappingDisplayTimes": "Remediați timpul de afișare suprapus", + "fixShortDisplayTimes": "Fixați timpi scurti de afișare", + "fixLongDisplayTimes": "Fixați timpi lungi de afișare", + "fixShortGaps": "Remediați golurile scurte", + "fixInvalidItalicTags": "Remediați etichetele cursive nevalide", + "removeUnneededSpaces": "Eliminați spațiile care nu sunt necesare", + "removeUnneededPeriods": "Eliminați perioadele care nu sunt necesare", + "fixCommas": "Remediați virgulele", + "fixMissingSpaces": "Remediați spațiile lipsă", + "breakLongLines": "Rupe linii lungi", + "removeLineBreaks": "Eliminați întreruperile de rând în texte scurte cu o singură propoziție", + "removeLineBreaksAll": "Eliminați întreruperile de rând în texte scurte (toate cu excepția casetelor de dialog)", + "removeLineBreaksPixelWidth": "Desfaceți subtitrări care se pot încadra pe o singură linie (lățimea pixelilor)", + "fixUppercaseIInsideLowercaseWords": "Remediați „i” majuscul în interiorul cuvintelor cu minuscule (eroare OCR)", + "fixDoubleApostrophes": "Fixați caracterele cu apostrof dublu ('') la un singur ghilimele (\")", + "addPeriods": "Adăugați punct după rânduri în care rândul următor începe cu literă mare", + "startWithUppercaseLetterAfterParagraph": "Începeți cu litera mare după paragraf", + "startWithUppercaseLetterAfterPeriodInsideParagraph": "Începeți cu literă mare după punct în interiorul paragrafului", + "startWithUppercaseLetterAfterColon": "Începeți cu majuscule după două puncte/punct virgulă", + "fixLowercaseIToUppercaseI": "Remediați singur „i” minuscul la „I” (engleză)", + "fixCommonOcrErrors": "Remediați erorile OCR obișnuite (folosind lista de înlocuire OCR)", + "commonOcrErrorsFixed": "Erori OCR obișnuite remediate (fișierul OcrReplaceList utilizat): {0}", + "removeSpaceBetweenNumber": "Eliminați spațiul dintre numere", + "breakDialogsOnOneLine": "Împărțiți dialogurile pe o singură linie", + "removeDialogFirstInNonDialogs": "Eliminați liniuța de pornire din prima linie pentru non-dialoguri", + "normalizeStrings": "Normalizați șirurile", + "fixTurkishAnsi": "Remediați literele turcești ANSI (islandeză) la Unicode", + "fixDanishLetterI": "Remediați litera daneză „i”", + "fixSpanishInvertedQuestionAndExclamationMarks": "Remediați semnele de întrebare și exclamare inversate spaniole", + "addMissingQuote": "Adăugați citatul lipsă (\")", + "addMissingQuotes": "Adăugați ghilimele lipsă (\")", + "removeHyphensSingleLine": "Eliminați liniuțele de dialog în rânduri simple", + "fixHyphensInDialogs": "Remediați liniuța în casetele de dialog prin stil: {0}", + "addMissingQuotesExample": "\"Ce mai faci? -> \"Ce mai faci?\"", + "xMissingQuotesAdded": "Au adăugat ghilimele lipsă: {0}", + "fix3PlusLine": "Remediați subtitrarea cu mai mult de două rânduri", + "fix3PlusLines": "Remediați subtitrările cu mai mult de două rânduri", + "analysing": "Se analizează...", + "nothingToFix": "Nimic de reparat :)", + "fixesFoundX": "Remedieri găsite: {0}", + "xFixesApplied": "Remedieri aplicate: {0}", + "nothingFixableBut": "Nimic nu a putut fi reparat automat. ", + "xFixedBut": "S-au rezolvat {0} probleme, dar subtitrarea conține încă erori - consultați jurnalul pentru detalii", + "xCouldBeFixedBut": "{0} probleme ar putea fi remediate, dar subtitrarea va conține în continuare erori - consultați jurnalul pentru detalii", + "fixFirstLetterToUppercaseAfterParagraph": "Fixați prima literă la majuscule după paragraf", + "mergeShortLine": "Îmbinați linia scurtă (o singură propoziție)", + "mergeShortLineAll": "Îmbinați linia scurtă (toate cu excepția casetelor de dialog)", + "unbreakShortLinePixelWidth": "Desfaceți linia scurtă (lățimea pixelilor)", + "breakLongLine": "Rupe linia lungă", + "fixLongDisplayTime": "Remediați timpul de afișare lung", + "fixInvalidItalicTag": "Remediați eticheta cursiv nevalidă", + "fixShortDisplayTime": "Remediați timpul scurt de afișare", + "fixOverlappingDisplayTime": "Remediați timpul de afișare suprapus", + "fixShortGap": "Remediați decalajul scurt", + "fixInvalidItalicTagsExample": "ce-mi pasă. -> ce-mi pasă.", + "removeUnneededSpacesExample": "Hei, tu ; ", + "removeUnneededPeriodsExample": "Hei, tu!. ", + "fixMissingSpacesExample": "Hei, tu. ", + "fixUppercaseIInsideLowercaseWordsExample": "Pământul este bine. ", + "fixLowercaseIToUppercaseIExample": "ce-mi pasă. ", + "startTimeLaterThanEndTime": "Numărul text {0}: ora de început este mai târziu decât ora de încheiere: {4}{1} -> {2} {3}", + "unableToFixStartTimeLaterThanEndTime": "Nu se poate remedia numărul textului {0}: ora de începere este mai târziu decât ora de încheiere: {1}", + "xFixedToYZ": "{0} fixat la: {1}{2}", + "unableToFixTextXY": "Nu se poate remedia numărul textului {0}: {1}", + "unneededSpace": "Spațiu inutil", + "unneededPeriod": "Perioada inutila", + "fixMissingSpace": "Remediați spațiul lipsă", + "fixUppercaseIInsideLowercaseWord": "Remediați „i” majuscul în interiorul cuvântului cu minuscule", + "fixMissingPeriodAtEndOfLine": "Adăugați un punct lipsă la sfârșitul rândului", + "refreshFixes": "Actualizați corecțiile disponibile", + "applyFixes": "Aplicați corecțiile selectate și închideți", + "autoBreak": "Auto &br", + "unbreak": "&Unbreak", + "fixDoubleDash": "Remediați „--” -> „...”", + "fixDoubleGreaterThan": "Eliminați „>>”", + "fixEllipsesStart": "Eliminați primul „...”", + "fixMissingOpenBracket": "Remediați lipsa [ sau ( în linie", + "fixMusicNotation": "Înlocuiți simbolurile muzicale (de exemplu, âTª) cu simbolul preferat", + "fixDoubleDashExample": "'Woa-- um da!' ", + "fixDoubleGreaterThanExample": "'>> Robert: Sup dude!' ", + "fixEllipsesStartExample": "'... și apoi noi' -> 'și apoi noi'", + "fixMissingOpenBracketExample": "Atentie! ", + "fixMusicNotationExample": "„âTª visele dulci sunt” -> „♫ visele dulci sunt”", + "numberOfImportantLogMessages": "{0} mesaje de jurnal importante!", + "fixedOkXY": "Remediat și OK - „{0}”: {1}", + "fixOcrErrorExample": "Nu -> Nu", + "fixSpaceBetweenNumbersExample": "1 100 -> 1100", + "fixDialogsOneLineExample": "Salut John!
- Bună Ida!", + "removeDialogFirstInNonDialogsExample": "- Ce mai faci? ", + "selectDefault": "Selectați implicit", + "setDefault": "Setați corecțiile curente ca implicite", + "fixContinuationStyleX": "Remediați stilul de continuare: {0}", + "fixUnnecessaryLeadingDots": "Eliminați punctele principale inutile", + "fixCommonErrorsProfiles": "Remediați profilurile de erori comune", + "fixCommonOcrErrorsStep1": "Remediați erorile comune, pasul 1 (alegeți remedieri)", + "searchRulesDotDotDot": "Reguli de căutare...", + "goToApplyFixes": "Accesați aplicați remedieri", + "backToFixList": "Înapoi la lista de remedieri", + "applyFixesAndClose": "Aplicați remedieri și închideți", + "fixCommonOcrErrorsStep2": "Remediați erorile comune, pasul 2 (aplicați remedieri)", + "fixCommonOcrErrorsStep2FixesFoundX": "Remediați erorile comune, pasul 2 - Remedieri găsite: {0}", + "action": "Acţiune", + "applySelectedFixes": "Aplicați corecțiile selectate" + }, + "adjustDurations": { + "title": "Ajustați duratele", + "adjustVia": "Reglați prin", + "seconds": "secunde", + "percent": "La sută", + "recalculate": "Recalculați", + "addSeconds": "Adăugați secunde", + "setAsPercent": "Setați ca procent din durată", + "note": "Notă: ora de afișare nu se va suprapune cu ora de începere a textului următor", + "fixed": "Fix", + "milliseconds": "Milisecunde", + "extendOnly": "Extindeți numai", + "enforceDurationLimits": "Aplicați durata minimă și maximă", + "checkShotChanges": "Nu extindeți modificările din trecut", + "batchCheckShotChanges": "Respectați modificările de lovituri (dacă sunt disponibile)" + }, + "applyDurationLimits": { + "title": "Aplicați limite de durată", + "fixMinDurationMs": "Fixați durata minimă (ms)", + "doNotGoPastShotChange": "Nu treceți de schimbarea loviturii", + "fixMaxDurationMs": "Fixați durata maximă (ms)", + "maxDurationShouldBeHigherThanMinDuration": "Durata maximă ar trebui să fie mai mare decât durata minimă", + "changedDurationFromXToYCommentZ": "S-a schimbat durata de la {0} la {1} {2}", + "onlyPartialFixed": "(doar remediere parțială)", + "unfixableX": "Neremediabil: {0}", + "fixedX": "Remediat: {0}", + "fixedXImprovedY": "Remedieri: {0}, Îmbunătățiri: {1}", + "noChangesNeeded": "Nu sunt necesare modificări" + }, + "applyMinGaps": { + "title": "Aplicați intervale minime între subtitrări", + "numberOfGapsFixedX": "Numărul de goluri minime aplicate: {0}", + "minFramesBetweenLines": "Cadre minime între linii", + "minMsBetweenLines": "Minim milisecunde între linii", + "changedGapFromXToYCommentZ": "S-a schimbat decalajul de la {0} la {1} {2}" + }, + "beautifyTimeCodes": { + "title": "Înfrumusețați codurile de timp", + "beautifySettings": "Setări înfrumusețați", + "snapToFrames": "Snap la cadre", + "frameGap": "Gap de cadru", + "minDuration": "Durata min. (ms)", + "shotChangeThreshold": "Pragul de modificare a tragerii (ms)", + "shotChangeOffset": "Shot Change Offset (cadre)", + "original": "Original", + "beautified": "Înfrumusețată" + }, + "bridgeGaps": { + "title": "Goluri de pod", + "bridgeGapsSmallerThan": "Goluri de punte mai mici de (ms)", + "minGap": "Interval minim (ms)", + "numberOfSmallGapsBridgedX": "Numărul de goluri mici acoperite: {0}", + "percentFoPrevious": "Diferența anterioară (%)", + "gapChange": "Schimbarea decalajului" + }, + "renumber": { + "title": "Renumerota", + "startFromNumber": "Începe de la numărul:" + }, + "sortBy": { + "title": "Sortați subtitrări", + "sortOrder": "Ordinea de sortare" + }, + "batchConvert": { + "title": "Conversie în lot", + "oneActionsSelected": "O acțiune selectată", + "xActionsSelected": "{0} acțiuni selectate", + "outputFolderSource": " Dosar de ieșire: folder sursă", + "outputFolderX": " Dosar de ieșire: {0}", + "encodingXOverwriteY": "Codificare: {0}, suprascrieți fișierele existente: {1}", + "targetFormatSettings": "Setări de format țintă", + "fileNameContainsDotDotDot": "Numele fișierului conține...", + "trackLanguageContainsDotDotDot": "Limba urmăririi conține...", + "batchConvertSettings": "Setări de conversie în lot", + "addFormatting": "Adăugați formatare", + "addItalic": "Adăugați cursive", + "addBold": "Adăugați bold", + "addUnderline": "Adăugați subliniere", + "addAlignment": "Adăugați alinierea", + "addColor": "Adăugați culoare", + "deleteLinesWithSpecificActorsOrStyles": "Ștergeți liniile cu actori sau stiluri (separați multiplu prin virgulă)", + "useSourceStylesIfPossible": "Folosiți stiluri sursă dacă este posibil", + "editStyles": "Editați stiluri", + "editProperties": "Editați proprietăți", + "editAttachments": "Editați atașamentele", + "errorsExportedX": "Erori exportate: {0}" + }, + "changeCasing": { + "title": "Schimbați carcasa", + "fixNames": "Remediați numele", + "extraNames": "Nume suplimentare", + "enterExtraNamesHint": "Introduceți nume suplimentare de corectat, separate prin virgulă", + "onlyFixUppercaseLines": "Remediați numai linii mari", + "fixNamesOnly": "Remediați numai numele", + "allUppercase": "Toate majuscule", + "allLowercase": "Toate litere mici" + }, + "changeFormatting": { + "title": "Schimbați formatarea" + }, + "convertActors": { + "title": "Convertiți actorii", + "convertActorFrom": "Convertiți actorul din", + "convertActorTo": "Transformă actorul în", + "inlineActorViaX": "Actor inline prin {0}", + "setColor": "Setați culoarea", + "onlyNames": "Doar nume", + "numberOfConversionsX": "Număr de conversii: {0}" + }, + "joinSubtitles": { + "title": "Alăturați-vă subtitrarilor", + "keepTimeCodes": "Păstrați codurile de timp", + "appendTimeCodes": "Adăugați coduri de timp", + "addMsAfterEachFile": "Adăugați milisecunde după fiecare fișier", + "join": "_Alăturați-vă" + }, + "splitSubtitle": { + "title": "Subtitrare împărțită", + "numberOfEqualParts": "Număr de părți egale", + "saveSplitParts": "_Salvați părțile divizate", + "subtitleSplitIntoXParts": "Subtitrare împărțită în {0} părți.", + "xPartsSavedInFormatYToFolder": "{0} părți salvate în format {1} în dosar:" + }, + "splitBreakLongLines": { + "title": "Împărțiți/reechilibrați linii lungi", + "splitLongLines": "Împărțiți linii lungi (în mai multe linii)", + "rebalanceLongLines": "Reechilibrează liniile lungi", + "splitLongLine": "Linie lungă împărțită", + "rebalanceLongLine": "Reechilibrați linia lungă", + "splitIntoXLines": "Împărțit în {0} linii: „{1}” → „{2}...”", + "linesSplitX": "Liniile împărțite: {0}", + "linesSplitXLinesRebalancedY": "Linii împărțite: {0}, linii reechilibrate: {1}" + }, + "mergeShortLines": { + "title": "Îmbinați linii scurte", + "highlightParts": "Evidențiați părți (karaoke)" + }, + "mergeLinesWithSameText": { + "title": "Îmbina liniile cu același text", + "maxMsBetweenLines": "Max milisecunde între linii", + "includeIncrementingLines": "Includeți linii cu text în creștere" + }, + "mergeLinesWithSameTimeCodes": { + "title": "Îmbina liniile cu aceleași coduri de timp", + "maxMsDifference": "Diferența maximă (milisecunde)", + "makeDialog": "Faceți dialoguri" + }, + "netflixCheckAndFix": { + "title": "Netflix verifică și remediază erorile", + "generateReport": "Generați raport", + "nothingToReport": "Nu s-au găsit probleme.", + "saveNetflixQualityReport": "Salvați raportul de calitate Netflix", + "netflixReportSaved": "Raportul de calitate Netflix a fost salvat", + "netFlixQualityReportSavedToX": "Raport de calitate Netflix salvat pe:\n " + }, + "imageBasedEdit": { + "editImagedBaseSubtitle": "Editați subtitrarea bazată pe imagini", + "editImagedBaseSubtitleX": "Editați subtitrarea bazată pe imagini: {0}", + "resizeImagesDotDotDot": "Redimensionați imaginile...", + "adjustBrightnessDotDotDot": "Reglați luminozitatea...", + "adjustAlphaDotDotDot": "Ajustați alfa...", + "centerHorizontally": "Centrați pe orizontală", + "cropImages": "Decupați imaginile", + "importTimeCodes": "Importă coduri de timp...", + "setTextForSubtitle": "Setați textul pentru subtitrare", + "screenWidth": "Lățimea ecranului", + "screenHeight": "Înălțimea ecranului", + "alphaThresholdInfo": "Pixelii cu alfa sub prag devin complet transparenți", + "resetToDefaults": "Resetați la valorile implicite", + "alphaAdjustmentInfo": "Ajustare alfa: Adăugați/scădeți din canalul alfa.\n", + "adjustBrightness": "Reglați luminozitatea", + "brightness": "Luminozitate", + "contrast": "Contrast", + "gamma": "Gamma", + "brightnessAdjustmentInfo": "Reglați glisoarele pentru a modifica luminozitatea, contrastul și gama.\n", + "resizeImages": "Redimensionați imaginile", + "percentage": "Procent", + "resizeImagesInfo": "Introduceți procentul de redimensionare a imaginilor.\n" + }, + "removeTextForHearingImpaired": { + "title": "Eliminați textul pentru persoanele cu deficiențe de auz", + "interjections": "Interjecții", + "skipIfStartWith": "Sariți dacă începeți cu", + "removeTextBetween": "Eliminați textul dintre", + "brackets": "Paranteze", + "curlyBrackets": "Paranteze ondulate", + "parentheses": "Paranteze", + "and": "şi", + "onlySeparateLines": "Doar linii separate", + "removeTextBeforeColon": "Eliminați textul înainte de două puncte", + "onlyIfTextIsUppercase": "Doar dacă textul este cu majuscule", + "onlyOnSeparateLine": "Doar pe linie separată", + "ifLineIsUppercase": "Dacă linia este cu majuscule", + "ifLineContains": "Dacă linia conține", + "ifLineOnlyContainsMusicSymbols": "Dacă linia conține doar simboluri muzicale", + "removeInterjections": "Eliminați interjecțiile" + }, + "pickAlignmentTitle": "Alegeți alinierea", + "pickFontNameTitle": "Alegeți numele fontului", + "colorPickerTitle": "Alege culoarea", + "filterLayersTitle": "Straturi de filtrare pentru afișare", + "filterLayersHideFromWaveform": "Ascundeți din forma de undă/spectrogramă", + "filterLayersHideFromSubtitleGrid": "Ascundeți din grila de subtitrare", + "filterLayersHideFromVideoPreview": "Ascundeți din previzualizarea videoclipului", + "pickSubtitleFormat": "Alegeți formatul de subtitrare", + "pickLayerTitle": "Setați stratul", + "recentColors": "Culori recente" + }, + "spellCheck": { + "spellCheck": "Verificare ortografică", + "getDictionariesTitle": "Verificare ortografică - obțineți dicționare", + "getDictionaryInstructions": "Alegeți limba și faceți clic pe descărcare", + "addNameToUserDictionary": "Adăugați numele în dicționarul utilizatorului", + "addNameToNamesList": "Adăugați un nume la lista de nume", + "noDictionariesFound": "Nu s-au găsit dicționare", + "wordNotFound": "Cuvântul nu a fost găsit", + "lineXofY": "Verificator ortografic - rândul {0} din {1}", + "changeWordFromXToY": "Schimbați cuvântul din „{0}” în „{1}”", + "changeAllWordsFromXToY": "Schimbați toate cuvintele din „{0}” în „{1}”", + "ignoreWordXOnce": "Ignorați cuvântul „{0}” o dată", + "ignoreWordXAlways": "Ignorați întotdeauna cuvântul „{0}”.", + "wordXAddedToNamesList": "Cuvântul „{0}” a fost adăugat la lista de nume", + "wordXAddedToUserDictionary": "Cuvântul „{0}” a fost adăugat în dicționarul utilizatorului", + "useSuggestionX": "Utilizați sugestia „{0}”", + "useSuggestionXAlways": "Folosiți întotdeauna sugestia „{0}”.", + "addXToUserDictionary": "Adăugați „{0}” la dicționarul utilizatorului", + "ignoreAllX": "Ignorați toate „{0}”", + "pickSpellCheckDictionaryDotDotDot": "Alegeți dicționarul de verificare ortografică...", + "chooseSpellCheckDictionary": "Alegeți dicționarul de verificare ortografică" + }, + "video": { + "burnIn": { + "title": "Generați videoclipuri cu subtitrări arse", + "infoAssaOff": "Notă: este acceptat stilul Advanced SubStation Alpha.", + "infoAssaOn": "Notă: va fi folosit stilul avansat al SubStation Alpha :)", + "xGeneratedWithBurnedInSubsInX": "„{0}” generat cu subtitrare inscripționată în {1}.", + "timeRemainingMinutes": "Timp rămas: {0} minute", + "timeRemainingOneMinute": "Timp rămas: un minut", + "timeRemainingSeconds": "Timp rămas: {0} secunde", + "timeRemainingAFewSeconds": "Timp rămas: câteva secunde", + "timeRemainingMinutesAndSeconds": "Timp rămas: {0} minute și {1} secunde", + "timeRemainingOneMinuteAndSeconds": "Timp rămas: un minut și {0} secunde", + "targetFileName": "Nume fișier țintă: {0}", + "targetFileSize": "Dimensiunea fișierului țintă (necesită codare cu 2 treceri)", + "fileSizeMb": "Dimensiunea fișierului în MB", + "passX": "Treceți {0}", + "encoding": "Codificare", + "bitRate": "Rata de biți", + "totalBitRateX": "Rată totală de biți: {0}", + "sampleRate": "Rata de eșantionare", + "audio": "Audio", + "stereo": "Stereo", + "preset": "Presetat", + "pixelFormat": "Format pixel", + "crf": "CRF", + "tuneFor": "Acordați pentru", + "alignRight": "Aliniați dreapta", + "getStartPosition": "Obțineți poziția de pornire", + "getEndPosition": "Obțineți poziția finală", + "useSource": "Utilizați sursa", + "useSourceFolder": "Utilizați folderul sursă", + "useSourceResolution": "Utilizați rezoluția sursei", + "outputSettings": "Fișier/dosar de ieșire...", + "fontSizeFactor": "Factor de dimensiune a fontului", + "boxType": "Tip cutie", + "fixRightToLeft": "Remediați de la dreapta la stânga", + "cut": "Tăiați", + "fromTime": "Din timp", + "toTime": "La timp", + "audioEncoding": "Codificare audio", + "outputProperties": "Proprietăți de ieșire...", + "videoFileSize": "Dimensiunea fișierului video", + "oneBox": "O cutie", + "boxPerLine": "Cutie pe linie" + }, + "videoTransparent": { + "title": "Generați videoclipuri transparente cu subtitrări", + "infoAssaOff": "Notă: este acceptat stilul Advanced SubStation Alpha.", + "infoAssaOn": "Notă: va fi folosit stilul avansat al SubStation Alpha :)" + }, + "audioToText": { + "title": "Vorbire către text", + "transcribe": "Transcrie", + "translateToEnglish": "Traduceți în engleză", + "transcribing": "Se transcrie...", + "transcribingXOfY": "Se transcrie {0} din {1}...", + "inputLanguage": "Limba de intrare", + "advancedWhisperSettings": "Setări avansate pentru șoaptă", + "downloadingWhisperEngine": "Se descarcă motorul Whisper", + "enableVad": "Activați VAD", + "whisperXxlStandard": "Standard", + "whisperXxlStandardAsia": "Asia standard", + "whisperXxlSentence": "!!!>>> JSON.parse: unexpected character at line 1 column 1 of the JSON data <<>> JSON.parse: unexpected character at line 1 column 1 of the JSON data << + @@ -99,6 +100,7 @@ + From 27f79eebbe79d152714f5b6278f7fbf60f8763e4 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 13:14:29 +0200 Subject: [PATCH 19/74] Fix click on libmpv-wid to toggle play/pause - thx vsemozhetbyt :) Fix #10538 --- .../LibMpvDynamicNativeControl.cs | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/UI/Logic/VideoPlayers/LibMpvDynamic/LibMpvDynamicNativeControl.cs b/src/UI/Logic/VideoPlayers/LibMpvDynamic/LibMpvDynamicNativeControl.cs index 7c2c1d9eae3..f0d09c06e78 100644 --- a/src/UI/Logic/VideoPlayers/LibMpvDynamic/LibMpvDynamicNativeControl.cs +++ b/src/UI/Logic/VideoPlayers/LibMpvDynamic/LibMpvDynamicNativeControl.cs @@ -22,6 +22,15 @@ public class LibMpvDynamicNativeControl : NativeControlHost private const uint WS_VISIBLE = 0x10000000; private const uint WS_CLIPSIBLINGS = 0x04000000; private const uint WS_CLIPCHILDREN = 0x02000000; + private const uint WM_LBUTTONDOWN = 0x0201; + private const uint WM_NCHITTEST = 0x0084; + private const int GWLP_WNDPROC = -4; + private const int HTCLIENT = 1; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + private delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); + private WndProcDelegate? _customWndProc; + private IntPtr _originalWndProc = IntPtr.Zero; // Linux still needs the temporary hide/show workaround during live resize. private static bool ShouldHideNativeControlDuringResize => RuntimeInformation.IsOSPlatform(OSPlatform.Linux); @@ -143,6 +152,12 @@ protected override void DestroyNativeControlCore(IPlatformHandle control) if (_ownedChildHandle != IntPtr.Zero) { + if (_originalWndProc != IntPtr.Zero) + { + SetWindowLongPtr(_ownedChildHandle, GWLP_WNDPROC, _originalWndProc); + _originalWndProc = IntPtr.Zero; + _customWndProc = null; + } DestroyWindow(_ownedChildHandle); _ownedChildHandle = IntPtr.Zero; } @@ -181,6 +196,9 @@ private IntPtr CreateRenderTargetHandle(IntPtr parentHandle) return parentHandle; } + _customWndProc = CustomWndProc; + _originalWndProc = SetWindowLongPtr(_ownedChildHandle, GWLP_WNDPROC, Marshal.GetFunctionPointerForDelegate(_customWndProc)); + return _ownedChildHandle; } @@ -271,6 +289,40 @@ private static extern IntPtr CreateWindowExW( [return: MarshalAs(UnmanagedType.Bool)] private static extern bool DestroyWindow(IntPtr hWnd); + [DllImport("user32.dll", SetLastError = true)] + private static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong); + + [DllImport("user32.dll")] + private static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); + + private IntPtr CustomWndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam) + { + if (msg == WM_NCHITTEST) + { + // The STATIC window class returns HTTRANSPARENT by default, which forwards + // all mouse messages to the parent HWND before they reach this WndProc. + // Returning HTCLIENT makes the window opaque to mouse input so that + // WM_LBUTTONDOWN is actually delivered here. + return new IntPtr(HTCLIENT); + } + if (msg == WM_LBUTTONDOWN) + { + Dispatcher.UIThread.Post(TogglePlayPause); + } + return CallWindowProc(_originalWndProc, hWnd, msg, wParam, lParam); + } + + protected override void OnPointerPressed(PointerPressedEventArgs e) + { + base.OnPointerPressed(e); + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && + e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) + { + TogglePlayPause(); + e.Handled = true; + } + } + public void LoadFile(string path) { _mpvPlayer?.LoadFile(path); From ef62c7ba946a60690eccd24b33c6858493780910 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 13:31:09 +0200 Subject: [PATCH 20/74] Fix for ocr bin edit db italic --- .../Ocr/BinaryOcr/BinaryOcrDbEditViewModel.cs | 6 ++++ .../Ocr/BinaryOcr/BinaryOcrDbEditWindow.cs | 2 ++ .../BoolToFontStyleConverter.cs | 29 +++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 src/UI/Logic/ValueConverters/BoolToFontStyleConverter.cs diff --git a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrDbEditViewModel.cs b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrDbEditViewModel.cs index 616db1e76d0..fc8ec4c9911 100644 --- a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrDbEditViewModel.cs +++ b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrDbEditViewModel.cs @@ -1,5 +1,6 @@ using Avalonia.Controls; using Avalonia.Input; +using Avalonia.Media; using Avalonia.Media.Imaging; using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; @@ -152,6 +153,11 @@ private void RefreshCharacters(string? selectCharacter) } + partial void OnIsItemItalicChanged(bool value) + { + TextBoxItem.FontStyle = value ? FontStyle.Italic : FontStyle.Normal; + } + private void Close() { Dispatcher.UIThread.Post(() => diff --git a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrDbEditWindow.cs b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrDbEditWindow.cs index 97debcd6763..644cd516385 100644 --- a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrDbEditWindow.cs +++ b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrDbEditWindow.cs @@ -3,6 +3,7 @@ using Avalonia.Data; using Nikse.SubtitleEdit.Logic; using Nikse.SubtitleEdit.Logic.Config; +using Nikse.SubtitleEdit.Logic.ValueConverters; namespace Nikse.SubtitleEdit.Features.Ocr.BinaryOcr; @@ -117,6 +118,7 @@ private static Border MakeCurrentItemControlsView(BinaryOcrDbEditViewModel vm) }; vm.TextBoxItem = UiUtil.MakeTextBox(100, vm, nameof(vm.ItemText)); + vm.TextBoxItem.Bind(TextBox.FontStyleProperty, new Binding(nameof(vm.IsItemItalic)) { Converter = new BoolToFontStyleConverter() }); var image = new Image { diff --git a/src/UI/Logic/ValueConverters/BoolToFontStyleConverter.cs b/src/UI/Logic/ValueConverters/BoolToFontStyleConverter.cs new file mode 100644 index 00000000000..ba56b3cce4d --- /dev/null +++ b/src/UI/Logic/ValueConverters/BoolToFontStyleConverter.cs @@ -0,0 +1,29 @@ +using Avalonia.Data.Converters; +using Avalonia.Media; +using System; +using System.Globalization; + +namespace Nikse.SubtitleEdit.Logic.ValueConverters; + +public class BoolToFontStyleConverter : IValueConverter +{ + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is bool boolValue) + { + return boolValue ? FontStyle.Italic : FontStyle.Normal; + } + + return FontStyle.Normal; + } + + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is FontStyle fontStyle) + { + return fontStyle == FontStyle.Italic; + } + + return false; + } +} From 47f951c9955fd2dd042f9318ba9cbc92b97e06f9 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 13:54:42 +0200 Subject: [PATCH 21/74] Allow large text files in batch-convert - thx phannhanhn201 :) Fix #10536 --- .../Tools/BatchConvert/BatchConvertViewModel.cs | 4 ++-- .../Tools/BatchConvert/BatchConverter.cs | 16 ---------------- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/src/UI/Features/Tools/BatchConvert/BatchConvertViewModel.cs b/src/UI/Features/Tools/BatchConvert/BatchConvertViewModel.cs index 97fd44e5d71..7767e0d358a 100644 --- a/src/UI/Features/Tools/BatchConvert/BatchConvertViewModel.cs +++ b/src/UI/Features/Tools/BatchConvert/BatchConvertViewModel.cs @@ -1013,7 +1013,7 @@ private bool AddFile(string fileName) return false; } - if (format == Se.Language.General.Unknown && fileInfo.Length < 200_000) + if (format == Se.Language.General.Unknown && fileInfo.Length < 20_000_000) { subtitle = Subtitle.Parse(fileName); if (subtitle != null) @@ -1037,7 +1037,7 @@ private bool AddFile(string fileName) } } - if (format == Se.Language.General.Unknown && fileInfo.Length < 300_000) + if (format == Se.Language.General.Unknown && fileInfo.Length < 20_000_000) { subtitle = Subtitle.Parse(fileName); if (subtitle != null) diff --git a/src/UI/Features/Tools/BatchConvert/BatchConverter.cs b/src/UI/Features/Tools/BatchConvert/BatchConverter.cs index 92663f97f02..da2388ece37 100644 --- a/src/UI/Features/Tools/BatchConvert/BatchConverter.cs +++ b/src/UI/Features/Tools/BatchConvert/BatchConverter.cs @@ -1881,11 +1881,6 @@ private Subtitle MergeLinesWithSameText(Subtitle subtitle) private string MakeOutputFileName(BatchConvertItem item, string extension) { - System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] item.FileName='{item.FileName}'"); - System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] item.OutputFileName='{item.OutputFileName}'"); - System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] extension='{extension}'"); - System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] SaveInSourceFolder={_config.SaveInSourceFolder}, OutputFolder='{_config.OutputFolder}'"); - var outputFolder = _config.SaveInSourceFolder || string.IsNullOrEmpty(_config.OutputFolder) ? Path.GetDirectoryName(item.FileName) : _config.OutputFolder; @@ -1894,18 +1889,13 @@ private string MakeOutputFileName(BatchConvertItem item, string extension) throw new InvalidOperationException("Output folder is not set"); } - System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] outputFolder='{outputFolder}'"); - var fileName = Path.GetFileNameWithoutExtension(item.FileName); - System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] fileName (from item.FileName)='{fileName}'"); if (!string.IsNullOrEmpty(item.OutputFileName)) { fileName = Path.GetFileNameWithoutExtension(item.OutputFileName); - System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] fileName (from item.OutputFileName)='{fileName}'"); } var targetExtension = extension; - System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] targetExtension='{targetExtension}'"); if (!string.IsNullOrEmpty(item.LanguageCode)) { @@ -1947,22 +1937,18 @@ private string MakeOutputFileName(BatchConvertItem item, string extension) } var outputFileName = Path.Combine(outputFolder, fileName + targetExtension); - System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] outputFileName (combined)='{outputFileName}'"); if (targetExtension != string.Empty && !File.Exists(outputFileName) && Directory.Exists(outputFolder)) { - System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] returning (new file, folder exists)='{outputFileName}'"); return outputFileName; } if (targetExtension == string.Empty && Directory.Exists(outputFileName)) { - System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] returning (empty ext, dir exists)='{outputFileName}'"); return outputFileName; } if (targetExtension != string.Empty && _config.Overwrite && File.Exists(outputFileName)) { - System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] overwriting existing file='{outputFileName}'"); File.Delete(outputFileName); } else @@ -1973,10 +1959,8 @@ private string MakeOutputFileName(BatchConvertItem item, string extension) outputFileName = Path.Combine(outputFolder, fileName + $"_{counter}" + targetExtension); counter++; } while (File.Exists(outputFileName) || Directory.Exists(outputFileName)); - System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] counter-suffixed outputFileName='{outputFileName}'"); } - System.Diagnostics.Debug.WriteLine($"[MakeOutputFileName] returning (final)='{outputFileName}'"); return outputFileName; } From 5c7225a12579f62e032f131eba57b63a0df029a0 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 13:58:31 +0200 Subject: [PATCH 22/74] Minor clean --- .../SyntaxColorTooWideSettingsWindow.cs | 1 - src/libse/SubtitleFormats/LambdaCap.cs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/UI/Features/Options/Settings/SyntaxColorTooWideSettings/SyntaxColorTooWideSettingsWindow.cs b/src/UI/Features/Options/Settings/SyntaxColorTooWideSettings/SyntaxColorTooWideSettingsWindow.cs index 358a367bf3e..8d1a2825a2f 100644 --- a/src/UI/Features/Options/Settings/SyntaxColorTooWideSettings/SyntaxColorTooWideSettingsWindow.cs +++ b/src/UI/Features/Options/Settings/SyntaxColorTooWideSettings/SyntaxColorTooWideSettingsWindow.cs @@ -113,7 +113,6 @@ public SyntaxColorTooWideSettingsWindow(SyntaxColorTooWideSettingsViewModel vm) grid.Add(numericFontSize, 1, 1); grid.Add(labelMaxWidth, 2, 0); grid.Add(numericMaxWidth, 2, 1); - grid.Add(UiUtil.MakeVerticalSeparator(), 3, 0, 1, 2); grid.Add(labelSampleText, 4, 0); grid.Add(textBoxSampleText, 4, 1); grid.Add(labelBoxWidth, 5, 0); diff --git a/src/libse/SubtitleFormats/LambdaCap.cs b/src/libse/SubtitleFormats/LambdaCap.cs index 2b8cf042fb2..368e567c66d 100644 --- a/src/libse/SubtitleFormats/LambdaCap.cs +++ b/src/libse/SubtitleFormats/LambdaCap.cs @@ -72,7 +72,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode time) { - return time.ToHHMMSSFF().RemoveChar(':'); // HHMMSSFF without seperators, like 00031522 + return time.ToHHMMSSFF().RemoveChar(':'); // HHMMSSFF without separators, like 00031522 } private static string EncodeStyle(string text) From 5a846cdf7ddaa92804bf1ecdd74ebf7b523a0de1 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 14:25:27 +0200 Subject: [PATCH 23/74] Fix Italic character in Binary OCR UI text box - thx tormento :) Fix #10532 --- src/UI/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddWindow.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddWindow.cs b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddWindow.cs index 8c718c8dfa6..0c41abf849f 100644 --- a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddWindow.cs +++ b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddWindow.cs @@ -4,6 +4,7 @@ using Avalonia.Media; using Nikse.SubtitleEdit.Logic; using Nikse.SubtitleEdit.Logic.Config; +using Nikse.SubtitleEdit.Logic.ValueConverters; namespace Nikse.SubtitleEdit.Features.Ocr.BinaryOcr; @@ -68,6 +69,8 @@ public BinaryOcrCharacterAddWindow(BinaryOcrCharacterAddViewModel vm) vm.TextBoxNew.KeyDown += vm.TextBoxNewOnKeyDown; vm.TextBoxNew.KeyUp += vm.TextBoxNewOnKeyUp; vm.TextBoxNew.PointerReleased += vm.TextBoxMacPointerReleased; + vm.TextBoxNew.Bind(TextBox.FontStyleProperty, new Binding(nameof(vm.IsNewTextItalic)) { Converter = new BoolToFontStyleConverter() }); + var menuFlyout = new MenuFlyout(); CharactersFlyoutMenuHelper.MakeFlyoutLetters(menuFlyout, vm.InsertSpecialCharacterCommand); vm.TextBoxNew.ContextFlyout = menuFlyout; From 2739a5155859b64bab562300a9ddff7b958b84f9 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 14:25:44 +0200 Subject: [PATCH 24/74] Update change log --- ChangeLog.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/ChangeLog.txt b/ChangeLog.txt index 5c93cda6b77..aa241af31bf 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -2,6 +2,20 @@ Subtitle Edit Changelog +v5.0.0-beta14 (xth April 2026) + +* Add Romanian translation - thx zildan +* Update Italian translation - thx bovirus +* Update Portuguese (Brazil) translation - thx igorruckert +* Fix click on libmpv-wid to toggle play/pause - thx vsemozhetbyt +* VLC now shows subtitle +* Fix italic in text box for edit image ocr db +* Fix for mpv refresh for full screeen player +* Fix: Allow large text files in batch-convert - thx phannhanhn201 + + +----------------------------------------------------------------------------------------------------- + v5.0.0-beta13 (2nd April 2026) * Add Turkish translation - thx Hayri From 0eedbd9b1644b9b87b57e01bab724b6e02d931b5 Mon Sep 17 00:00:00 2001 From: Ivandro Jao Date: Sun, 5 Apr 2026 18:23:32 +0100 Subject: [PATCH 25/74] Update toolbar separator visibility immediately when setting changes Co-Authored-By: Claude Sonnet 4.6 --- src/UI/Features/Main/MainView.cs | 7 +++---- src/UI/Features/Main/MainViewModel.cs | 6 ++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/UI/Features/Main/MainView.cs b/src/UI/Features/Main/MainView.cs index 845bca01dff..38015164b00 100644 --- a/src/UI/Features/Main/MainView.cs +++ b/src/UI/Features/Main/MainView.cs @@ -75,10 +75,9 @@ protected override object Build() InitMenu.Make(_vm); root.Children.Add(_vm.Menu.Dock(Dock.Top)); - if (Se.Settings.Appearance.ShowHorizontalLineAboveToolbar) - { - root.Children.Add(UiUtil.MakeHorizontalSeparator(0.5, 0.5, new Thickness(0, 0, 0, 0)).Dock(Dock.Top)); - } + _vm.ToolbarTopSeparator = UiUtil.MakeHorizontalSeparator(0.5, 0.5, new Thickness(0, 0, 0, 0)); + _vm.ToolbarTopSeparator.IsVisible = Se.Settings.Appearance.ShowHorizontalLineAboveToolbar; + root.Children.Add(_vm.ToolbarTopSeparator.Dock(Dock.Top)); // Toolbar _vm.Toolbar = InitToolbar.Make(_vm); diff --git a/src/UI/Features/Main/MainViewModel.cs b/src/UI/Features/Main/MainViewModel.cs index ee4279457fa..c7059486a4a 100644 --- a/src/UI/Features/Main/MainViewModel.cs +++ b/src/UI/Features/Main/MainViewModel.cs @@ -335,6 +335,7 @@ public partial class MainViewModel : public VideoPlayerControl? VideoPlayerControl { get; internal set; } public Menu Menu { get; internal set; } public Border Toolbar { get; internal set; } + public Separator? ToolbarTopSeparator { get; internal set; } public StackPanel PanelSingleLineLengths { get; internal set; } public MenuItem MenuItemMergeAsDialog { get; internal set; } public MenuItem MenuItemExtendToLineBefore { get; internal set; } @@ -5954,6 +5955,11 @@ public void ApplySettings() UiUtil.SetFontName(Se.Settings.Appearance.FontName); UiTheme.SetCurrentTheme(); + if (ToolbarTopSeparator != null) + { + ToolbarTopSeparator.IsVisible = Se.Settings.Appearance.ShowHorizontalLineAboveToolbar; + } + if (Toolbar is Border toolbarBorder) { var tb = InitToolbar.Make(this); From 9a675fcfd41a1dc3c537a484487179103a699edd Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 15:34:11 +0200 Subject: [PATCH 26/74] Add Dutch.json - thx MintKing12 :) Fix #10547 --- src/UI/Assets/Languages/Dutch.json | 694 +++++++++++++++++++++++++++++ src/UI/UI.csproj | 2 + 2 files changed, 696 insertions(+) create mode 100644 src/UI/Assets/Languages/Dutch.json diff --git a/src/UI/Assets/Languages/Dutch.json b/src/UI/Assets/Languages/Dutch.json new file mode 100644 index 00000000000..34d9270edce --- /dev/null +++ b/src/UI/Assets/Languages/Dutch.json @@ -0,0 +1,694 @@ +{ + "title": "Subtitle Edit", + "version": null, + "translatedBy": "", + "cultureName": "nl-NL", + "general": { + "abort": "Afbreken", + "actor": "Acteur", + "actors": "Acteurs", + "add": "Toevoegen", + "addDotDotDot": "Toevoegen...", + "addToNamesListCaseSensitive": "Toevoegen aan namenlijst (hoofdlettergevoelig)", + "addToUserDictionary": "Toevoegen aan gebruikerswoordenboek", + "addVideoFiles": "Videobestanden toevoegen...", + "adjustAlpha": "Alpha aanpassen (transparantie)", + "adjustDisplayDuration": "Weergaveduur aanpassen", + "adjustment": "Aanpassing", + "advanced": "Geavanceerd", + "advancedSettings": "Geavanceerde instellingen", + "after": "Na", + "alignment": "Uitlijning", + "alignmentDotDotDot": "Uitlijning...", + "alignmentX": "Stel uitlijning \"{0}\" in voor geselecteerde regels", + "all": "Alle", + "allFiles": "Alle bestanden", + "alphaAdjustment": "Alpha-aanpassing", + "aphaThreshold": "Alpha-drempelwaarde", + "apiKey": "API-sleutel", + "apiSecret": "Geheim", + "appearance": "Uiterlijk", + "append": "Toevoegen (achteraan)", + "apply": "Toepassen", + "applyTo": "Toepassen op", + "ascending": "Oplopend", + "attachDotDotDot": "Bijvoegen...", + "audioFiles": "Audiobestanden", + "audioVisualizer": "Audiovisualisatie", + "auto": "Auto", + "autoBreak": "Regels automatisch afbreken", + "autoContinue": "Automatisch doorgaan", + "autoTranslate": "Automatisch vertalen", + "autodetect": "Automatisch detecteren", + "background": "Achtergrond", + "backgroundColor": "Achtergrondkleur", + "backward": "Achteruit", + "batchMode": "Batchmodus", + "bdnXml": "BDN/xml", + "before": "Voor", + "beforeX": "Voor \"{0}\"", + "beginning": "Begin", + "bluRaySup": "Blu-ray (sup)", + "bold": "Vet", + "bookmarkAdd": "Bladwijzer toevoegen", + "bookmarkAddForSelectedLinesX": "Bladwijzer toevoegen voor {0} geselecteerde regels", + "bookmarkClearQuestion": "Alle bladwijzers wissen?", + "bookmarkDeleteSelectedQuestion": "Geselecteerde bladwijzer verwijderen?", + "bookmarkDotDotDot": "Bladwijzer...", + "bookmarkEdit": "Bladwijzer bewerken", + "bookmarkEditForSelectedLinesX": "Bladwijzer bewerken voor {0} geselecteerde regels", + "bookmarksList": "Bladwijzers weergeven", + "borderColor": "Randkleur", + "borderStyle": "Randstijl", + "bottomCenter": "Onder-Midden", + "bottomLeft": "Onder-Links", + "bottomRight": "Onder-Rechts", + "box": "Kader", + "boxColor": "Kaderkleur", + "boxCornerRadius": "Kader hoekstraal", + "boxPerLine": "Kader per regel", + "bridgeGaps": "Gaten overbruggen", + "cancel": "_Annuleren", + "cancelled": "Geannuleerd", + "caseInsensitive": "Niet hoofdlettergevoelig", + "caseSensitive": "Hoofdlettergevoelig", + "category": "Categorie", + "center": "Midden", + "centerHorizontally": "Horizontaal centreren", + "centerVertically": "Verticaal centreren", + "change": "Wijzigen", + "changeAll": "Alles wijzigen", + "changeCasing": "Hoofdlettergebruik wijzigen", + "changeFormatting": "Opmaak wijzigen", + "changeFrameRate": "Framerate wijzigen", + "changeLanguageFilter": "Taalfilter wijzigen...", + "changeOnce": "Eén keer wijzigen", + "changeSpeed": "Snelheid wijzigen", + "character": "Teken", + "characters": "Tekens", + "charsPerSec": "Tekens/sec", + "chooseColorDotDotDot": "Kies kleur...", + "chooseImageFiles": "Kies afbeeldingen", + "class": "Klasse", + "classic": "Klassiek", + "clear": "Wissen", + "close": "Sluiten", + "codec": "Codec", + "collapse": "Inklappen", + "color": "Kleur", + "colorDotDotDot": "Kleur...", + "column": "Kolom", + "consoleLog": "Consolelog", + "contentAlignment": "Inhoudsuitlijning", + "conversionCancelledByUser": "Conversie geannuleerd door gebruiker", + "convert": "Converteren", + "converted": "Geconverteerd", + "convertingDotDotDot": "Converteren...", + "convertingXofYDotDoDot": "Converteren van {0:#,###,##0}/{1:#,###,##0}...", + "copy": "Kopiëren", + "copyImageToClipboard": "Afbeelding naar klembord kopiëren", + "copyTextToClipboard": "Tekst naar klembord kopiëren", + "couldNotSaveFileXErrorY": "Kan bestand \"{0}\" niet opslaan. Fout: {1}", + "count": "Aantal", + "cps": "Tekens/sec", + "currentSubtitle": "Huidige ondertitel", + "currentVideoPosition": "Huidige videopositie", + "cut": "Knippen", + "dark": "Donker", + "dateAndTime": "Datum en tijd", + "default": "Standaard", + "delete": "Verwijderen", + "deleteAtPosition": "Ondertitel op videopositie verwijderen", + "deleteCurrentLine": "Huidige regel verwijderen", + "deleteFirstLines": "Eerste regels verwijderen", + "deleteLastLines": "Laatste regels verwijderen", + "deleteLineXPrompt": "Regelnummer {0} verwijderen?", + "deleteLines": "Regels verwijderen", + "deleteLinesContainingText": "Regels met tekst verwijderen", + "deleteXLinesPrompt": "{0} regels verwijderen?", + "description": "Beschrijving", + "dictionary": "Woordenboek", + "diskSpace": "Schijfruimte", + "doNoChange": "Niet wijzigen", + "done": "Gereed", + "doubleWords": "Dubbele woorden", + "doubleLines": "Dubbele regels", + "download": "Downloaden", + "downloadX": "Download {0}", + "downloadingX": "Bezig met downloaden van {0}", + "downloadingXPercent": "Downloaden: {0}%", + "duplicate": "Dupliceren", + "duration": "Duur", + "durationMinutes": "Duur in minuten", + "edit": "Bewerken", + "editDotDotDot": "Bewerken...", + "editing": "Bezig met bewerken", + "effect": "Effect", + "enabled": "Ingeschakeld", + "encoding": "Codering", + "endTime": "Eindtijd", + "engine": "Engine", + "enterProfileName": "Voer profielnaam in", + "error": "Fout", + "errorX": "Fout: {0}", + "example": "Voorbeeld", + "exampleX": "Voorbeeld: {0}", + "expand": "Uitvouwen", + "export": "Exporteren", + "exportDotDotDot": "Exporteren...", + "exportToX": "Exporteren naar {0}", + "extendAfter": "Verlengen/inkorten naar volgende regel", + "extendBefore": "Verlengen/inkorten naar vorige regel", + "extendSelectedLinesToNextShotChangeOrNextSubtitle": "Geselecteerde regels verlengen naar volgende shot-wijziging (of ondertitel)", + "extendSelectedToNext": "Geselecteerde verlengen naar volgende", + "extendSelectedToPrevious": "Geselecteerde verlengen naar vorige", + "extractingAudioClips": "Audiofragmenten extraheren...", + "fade": "Fade", + "fetchFirstWordFromNextSubtitle": "Eerste woord van volgende ondertitel ophalen", + "fileAlreadyExists": "Bestand bestaat al", + "fileExtension": "Bestandsextensie", + "fileName": "Bestandsnaam", + "fileNameX": "Bestandsnaam: {0}", + "fileNameXAndSize": "Bestandsnaam: {0} ({1})", + "fileSaved": "Bestand opgeslagen", + "fileSavedToX": "Bestand opgeslagen in {0}", + "fileXAlreadyExists": "Bestand \"{0}\" bestaat al.", + "fileXOfY": "Bestand {0} van {1}", + "filter": "Filter", + "filterByLayer": "Filteren op laag", + "find": "Zoeken", + "findNext": "Volgende zoeken", + "findTextX": "Tekst zoeken - {0}", + "fiveHundredMilliseconds": "500 milliseconden", + "fiveSeconds": "Vijf seconden", + "fix": "Herstellen", + "fixCommonErrors": "Veelvoorkomende fouten herstellen", + "fixRightToLeft": "Rechts-naar-links herstellen", + "fixRightToLeftViaUnicodeTags": "RTL herstellen via Unicode-tags", + "fixedValue": "Vaste waarde", + "focusSelectedLine": "Focus op geselecteerde regel (scrollen in rooster)", + "font": "Lettertype", + "fontColor": "Tekstkleur", + "fontHeight": "Letterhoogte", + "fontName": "Lettertypenaam", + "fontNameDotDotDot": "Lettertypenaam...", + "fontSize": "Lettergrootte", + "fonts": "Lettertypen", + "footer": "Voettekst", + "forced": "Geforceerd", + "foreground": "Voorgrond", + "format": "Formaat", + "forward": "Vooruit", + "foundNoMatches": "Geen overeenkomsten gevonden", + "foundOneMatch": "Eén overeenkomst gevonden", + "foundXInLineYZ": "\"{0}\" gevonden in regel {1}, positie {2}", + "foundXMatches": "{0} overeenkomsten gevonden", + "frameRate": "Framerate", + "frameRateX": "Framerate: {0:0.0###}", + "frames": "Frames", + "from": "Van", + "fromCurrentVideoPosition": "vanaf huidige videopositie", + "gap": "Gat", + "general": "Algemeen", + "generalText": "Algemeen", + "generate": "Genereren", + "generateImportShotChanges": "Shot-wijzigingen genereren/importeren", + "generating": "Bezig met genereren...", + "generatingImageXofY": "Afbeelding {0:#,##0} van {1:#,##0} genereren...", + "generatingWavFile": "WAV-bestand genereren...", + "getAudioClips": "Audiofragmenten ophalen", + "goTo": "Ga naar", + "goToLineNumber": "Ga naar regelnummer", + "goToNextShotChange": "Ga naar volgende shot-wijziging", + "goToPreviousShotChange": "Ga naar vorige shot-wijziging", + "googleIt": "Google het", + "group": "Groep", + "header": "Koptekst", + "height": "Hoogte", + "help": "Help", + "hex": "Hex", + "hide": "Verbergen", + "hidePreview": "Voorbeeld verbergen", + "history": "Geschiedenis", + "horizontal": "Horizontaal", + "hourMinutesSecondsDecimalSeparatorMilliseconds": "Uur:min:sec{0}ms", + "hourMinutesSecondsFrames": "Uur:min:sec:frames", + "ip": "IP", + "id": "ID", + "image": "Afbeelding", + "imageSaved": "Afbeelding opgeslagen", + "imagedBasedSubtitles": "Ondertitels gebaseerd op afbeeldingen", + "images": "Afbeeldingen", + "imagesWithTimeCode": "Afbeeldingen met tijdcode", + "import": "Importeren", + "importDotDotDot": "Importeren...", + "include": "Inclusief", + "information": "Informatie", + "insertAfter": "Invoegen na", + "insertAtPositionAndFocusTextBox": "Ondertitel op videopositie invoegen en tekstvak focus geven", + "insertAtPositionNoFocusTextBox": "Ondertitel op videopositie invoegen (geen focus tekstvak)", + "insertBefore": "Invoegen voor", + "insertLine": "Regel invoegen", + "insertNewSelection": "Nieuwe selectie invoegen", + "insertSubtitleAfterCurrentLine": "Ondertitel invoegen na huidige regel...", + "insertSubtitleFileAtVideoPositionDotDotDot": "Ondertitelbestand invoegen op videopositie...", + "inspectAdditions": "Toevoegingen inspecteren...", + "invertSelection": "Selectie omkeren", + "isDefault": "Is standaard", + "italic": "Cursief", + "keepExistingTimeCodes": "Bestaande tijdcodes behouden (geen video-offset toevoegen)", + "keyFile": "Sleutelbestand", + "language": "Taal", + "languagePostFix": "Taal-postfix (mkv/mp4)", + "layer": "Laag", + "layerFilterOn": "Laagfilter aan", + "left": "Links", + "light": "Licht", + "lineHeigth": "Regelhoogte", + "lineNumber": "Regel#", + "lineXColumnY": "Regel {0}, kolom {1}", + "lines": "Regels", + "linesAddedX": "Regels toegevoegd: {0}", + "linesChangedX": "Regels gewijzigd: {0}", + "linesDeletedX": "Regels verwijderd: {0}", + "listErrors": "Fouten weergeven", + "loadDefaults": "Standaardwaarden laden", + "lockTimeCodes": "Tijdcodes vergrendelen", + "logo": "Logo", + "margin": "Marge", + "match": "Overeenkomst", + "maxCharactersPerSecond": "Max. tekens per seconde", + "mediaInformation": "Media-informatie", + "mergeAfter": "Samenvoegen met volgende regel", + "mergeBefore": "Samenvoegen met vorige regel", + "mergeLines": "Regels samenvoegen", + "mergeLinesWithSameText": "Regels met dezelfde tekst samenvoegen", + "mergeLinesWithSameTimeCodes": "Regels met dezelfde tijdcodes samenvoegen", + "mergeSelected": "Geselecteerde samenvoegen", + "mergeSelectedAsDialog": "Geselecteerde samenvoegen als dialoog", + "mergeSelectedLines": "Geselecteerde regels samenvoegen", + "mergeSelectedLinesDialog": "Geselecteerde regels samenvoegen als dialoog", + "mergeWithLineAfterAndAutoBreak": "Samenvoegen met volgende regel en auto-afbreken", + "mergeWithLineAfterKeepBreaks": "Samenvoegen met volgende regel (afbrekingen behouden)", + "mergeWithLineBeforeAndAutoBreak": "Samenvoegen met vorige regel en auto-afbreken", + "mergeWithLineBeforeKeepBreaks": "Samenvoegen met vorige regel (afbrekingen behouden)", + "middleCenter": "Midden-Centrum", + "middleLeft": "Midden-Links", + "middleRight": "Midden-Rechts", + "milliseconds": "Milliseconden", + "model": "Model", + "models": "Modellen", + "more": "Meer", + "moreInfo": "Meer info", + "moveAllShotChangeOneFrameBack": "Alle shot-wijzigingen één frame terugplaatsen", + "moveAllShotChangeOneFrameForward": "Alle shot-wijzigingen één frame vooruitplaatsen", + "moveDown": "Omlaag verplaatsen", + "moveUp": "Omhoog verplaatsen", + "multipleReplace": "Meervoudig vervangen", + "name": "Naam", + "negative": "Negatief", + "new": "Nieuw", + "newDotDotDot": "Nieuw...", + "newProfile": "Nieuw profiel", + "newSubtitleStartKeyDownSetEndKeyUp": "Ondertitel invoegen: Start bij toets indrukken, eind bij loslaten", + "setSubtitleStartAtVideoPositionSetEndAtKeyUpAndGoToNext": "Start op videopositie, eind bij loslaten toets, en ga naar volgende", + "no": "Nee", + "noFilesToConvert": "Geen bestanden om te converteren", + "noLanguageCode": "Geen taalcode", + "noSubtitleLoaded": "Geen ondertitel geladen", + "noSubtitlesFound": "Geen ondertitels gevonden!", + "noSymbolLines": "#Regels", + "noVideoLoaded": "Geen video geladen", + "none": "Geen", + "normalCasing": "Normaal hoofdlettergebruik", + "notAvailable": "N.v.t.", + "notInstalled": "Niet geïnstalleerd", + "number": "Nummer", + "numberSymbol": "#", + "ocrDotDotDot": "OCR...", + "ocrPercentX": "OCR: {0}%", + "offset": "Offset", + "offsetTimeCodes": "Tijdcodes verschuiven", + "offsetX": "X-verschuiving", + "offsetY": "Y-verschuiving", + "ok": "_OK", + "oneFile": "Eén bestand", + "oneHundredMilliseconds": "100 milliseconden", + "oneSecond": "Eén seconde", + "oneSecondBack": "Eén seconde terug", + "oneSecondForward": "Eén seconde vooruit", + "onlineVideoFeatureNotAvailable": "Functie niet beschikbaar voor online video", + "openContainingFolder": "Map openen", + "openDictionaryFolder": "Woordenboekmap openen", + "openFile": "Bestand openen", + "openImageBasedSubtitle": "Op afbeeldingen gebaseerde ondertitel openen", + "openImageFile": "Afbeeldingsbestand openen", + "openOriginalSubtitleFile": "Origineel ondertitelbestand openen...", + "openOriginalSubtitleFileTitle": "Origineel ondertitelbestand openen", + "openOutputFolder": "Uitvoermap openen", + "openSubtitle": "Ondertitel openen...", + "openSubtitleFileTitle": "Ondertitelbestand openen", + "openSubtitles": "Ondertitels openen...", + "openVideoFile": "Videobestand openen...", + "openVideoFileTitle": "Videobestand openen", + "optimalCharactersPerSecond": "Optimale tekens per seconde", + "options": "Opties", + "originalText": "Originele tekst", + "outline": "Contour", + "outlineColor": "Contourkleur", + "outlineWidth": "Contourbreedte", + "outputFolder": "Uitvoermap", + "outputProperties": "Uitvoereigenschappen", + "overlap": "Overlapping", + "overlapNextX": "Overlap volgende ({0:#;##0.###})", + "overlapPreviousLineX": "Overlap vorige regel ({0:#;##0.###})", + "overlapStartAndEnd": "Overlap begin en eind", + "overlapX": "Overlapping ({0:#;##0.###})", + "overwriteExistingFiles": "Bestaande bestanden overschrijven", + "overwriteFilesInFolderX": "Bestanden in map overschrijven: \"{0}\"", + "overwriteQuestion": "Overschrijven?", + "padding": "Opvulling", + "parameters": "Parameters", + "parsingXDotDotDot": "Bezig met verwerken van {0}...", + "paste": "Plakken", + "pasteNewSelection": "Klembordtekst in nieuwe selectie plakken", + "pause": "Pauze", + "percent": "Procent", + "pickLayer": "Laag instellen", + "pickOllamaModel": "Kies Ollama-model", + "pickOutputFolder": "Kies uitvoermap", + "pickResolutionFromCurrentVideo": "Resolutie van huidige video overnemen", + "pickResolutionFromVideoDotDotDot": "Resolutie van video overnemen...", + "pickSubtitleFile": "Kies ondertitelbestand...", + "pickVideoFile": "Kies videobestand...", + "pickVideoPosition": "Kies videopositie", + "play": "Afspelen", + "playFromStartOfVideo": "Vanaf begin van video afspelen", + "playNext": "Volgende afspelen", + "playSelectedLines": "Geselecteerde regels afspelen", + "playSelectedLinesWithLoop": "Geselecteerde regels herhaald afspelen", + "pleaseEnterAValidValueForX": "Voer een geldige waarde in voor \"{0}\"", + "pleaseWait": "Even geduld a.u.b...", + "position": "Positie", + "positionX": "Positie: {0}", + "postProcessing": "Nabewerking", + "poweredBy": "Mogelijk gemaakt door", + "prefix": "Voorvoegsel", + "preview": "Voorbeeld", + "profile": "Profiel", + "profileName": "Profielnaam", + "profiles": "Profielen", + "property": "Eigenschap", + "question": "Vraag", + "reDownloadX": "{0} opnieuw downloaden", + "reason": "Reden", + "recentFiles": "Recente bestanden", + "redo": "Opnieuw", + "refresh": "Vernieuwen", + "region": "Regio", + "regularExpression": "Reguliere expressie", + "regularExpressionIsNotValid": "Reguliere expressie is niet geldig!", + "relativeToCurrentVideoPosition": "Relatief aan huidige videopositie", + "remove": "Verwijderen", + "removeAlignment": "Uitlijning verwijderen", + "removeAllFormatting": "Alle opmaak verwijderen", + "removeBlankLines": "Lege regels verwijderen", + "removeBold": "Vet verwijderen", + "removeColor": "Kleur verwijderen", + "removeFilter": "Filter verwijderen", + "removeFontName": "Lettertypenaam verwijderen", + "removeFormatting": "Opmaak verwijderen", + "removeItalic": "Cursief verwijderen", + "removeRightToLeftUnicodeTags": "RTL Unicode-tags verwijderen", + "removeSelectedFile": "Geselecteerd bestand verwijderen?", + "removeStyling": "Stijl verwijderen", + "removeTextForHearingImpaired": "Tekst voor slechthorenden verwijderen", + "removeUnderline": "Onderstreping verwijderen", + "rename": "Hernoemen", + "replace": "Vervangen", + "replaceWith": "Vervangen door", + "requiresRestart": "Vereist herstart", + "reset": "Resetten", + "resolution": "Resolutie", + "resolutionX": "Resolutie: {0}", + "reverseRightToLeftStartEnd": "RTL begin/eind omkeren", + "right": "Rechts", + "rightToLeft": "Rechts naar links", + "rules": "Regels", + "saveChangesMessage": "Wilt u de wijzigingen in het huidige ondertitelbestand opslaan?", + "saveChangesTitle": "Wijzigingen opslaan?", + "saveChangesToX": "Wilt u de wijzigingen in \"{0}\" opslaan?", + "saveChangesToXOriginal": "Wilt u de wijzigingen in het originele ondertitelbestand \"{0}\" opslaan?", + "saveDotDotDot": "Opslaan...", + "saveFileAsTitle": "Bestand opslaan als", + "saveImageAs": "Afbeelding opslaan als", + "saveImageAsDotDotDot": "Afbeelding opslaan als...", + "saveOriginalAsTitle": "Origineel opslaan als", + "saveTranslationAsTitle": "Vertaling opslaan als", + "saveVideoAsVideoTitle": "Video opslaan als", + "savedChangesToX": "\"{0}\" opgeslagen", + "savedChangesToXAndY": "\"{0}\" en \"{1}\" opgeslagen", + "savingDotDotDot": "Bezig met opslaan...", + "script": "Script", + "search": "Zoeken", + "searchDirection": "Zoekrichting", + "searchFontNames": "Lettertypen zoeken...", + "searchSubtitleFormats": "Ondertitelformaten zoeken", + "seconds": "Seconden", + "selectAll": "Alles selecteren", + "selectFilesToConvert": "Bestanden kiezen om te converteren", + "selectNone": "Niets selecteren", + "selectSaveFolder": "Kies een map om op te slaan", + "selectSubtitle": "Ondertitel selecteren", + "selectedAFolderToSaveTo": "Map gekozen om in op te slaan", + "selectedLines": "Geselecteerde regels", + "selectedlinesX": "Geselecteerde regels: {0}", + "sensitivity": "Gevoeligheid", + "separator": "Scheidingsteken", + "sessionKey": "Sessiesleutel", + "sessionKeyGenerate": "Nieuwe sleutel genereren", + "setEnd": "Eindtijd instellen", + "setEndAndGoToNext": "Eind instellen en naar volgende", + "setEndAndOffsetTheRest": "Eind instellen en rest verschuiven", + "setFontDotDotDot": "Lettertype instellen...", + "setStart": "Begintijd instellen", + "setStartAndOffsetTheRest": "Begin instellen en rest verschuiven", + "setVideoOffset": "Video-offset instellen", + "settings": "Instellingen", + "shadow": "Schaduw", + "shadowColor": "Schaduwkleur", + "shadowWidth": "Schaduwbreedte", + "shortcut": "Sneltoets", + "shortcutX": "Sneltoets: {0}", + "shortcuts": "Sneltoetsen", + "show": "Weergeven", + "showActorColumn": "Kolom \"Acteur\" weergeven", + "showCpsColumn": "Kolom \"Tekens/sec\" weergeven", + "showDurationColumn": "Kolom \"Duur\" weergeven", + "showGapColumn": "Kolom \"Gat\" weergeven", + "showStartColumn": "Kolom \"Begin\" weergeven", + "showHideColumn": "Kolom \"Verbergen\" weergeven", + "showHistory": "Geschiedenis weergeven", + "showLayerColumn": "Kolom \"Laag\" weergeven", + "showPreview": "Voorbeeld weergeven", + "showShotChangesList": "Shot-wijzigingenlijst weergeven", + "showStyleColumn": "Kolom \"Stijl\" weergeven", + "showTimeCodes": "Tijdcodes weergeven", + "showWpmColumn": "Kolom \"Woorden/min\" weergeven", + "showPixelWidthColumn": "Kolom \"Pixelbreedte\" weergeven", + "shrink": "Verkleinen", + "singleBox": "Enkel kader", + "singleLineLengths": "Lengte enkele regel:", + "singleMode": "Enkele modus", + "size": "Grootte", + "sizeX": "Grootte: {0}", + "skip": "Overslaan", + "skipAll": "Alles overslaan", + "skipOnce": "Eén keer overslaan", + "smart": "Slim", + "snapSelectedLinesToNearestShotChange": "Begin/eind van geselecteerde regels uitlijnen op dichtstbijzijnde shot-wijziging", + "solidColor": "Effen kleur", + "sourceViewX": "Bronweergave - {0}", + "spacing": "Spatiëring", + "speechToTextSelectedLines": "Spraak naar tekst geselecteerd (zie Opties - Instellingen)", + "speechToTextSelectedLinesPromptAlways": "Spraak naar tekst geselecteerde regels (altijd vragen om engine/taal)", + "speechToTextSelectedLinesPromptFirstTime": "Spraak naar tekst geselecteerde regels (vraag engine/taal alleen eerste keer)", + "speed": "Snelheid", + "splitAtTextBoxCursorPosition": "Splitsen op cursorpositie tekstvak", + "splitLine": "Regel splitsen", + "splitLineAtTextBoxCursorPosition": "Regel splitsen op cursorpositie", + "splitLineAtVideoAndTextBoxPosition": "Regel splitsen op video- en tekstvakpositie", + "splitLineAtVideoPosition": "Regel splitsen op videopositie", + "startFrom": "Beginnen vanaf", + "startTime": "Begintijd", + "startingDotDotDot": "Bezig met starten...", + "status": "Status", + "stereo": "Stereo", + "stop": "Stop", + "strikeout": "Doorhalen", + "style": "Stijl", + "styleExaggeration": "Stijl overrijving", + "styleLanguage": "Stijl / Taal", + "styles": "Stijlen", + "subtitleFile": "Ondertitelbestand", + "subtitleFileName": "Bestandsnaam ondertitel", + "subtitleFileSaved": "Ondertitelbestand opgeslagen", + "subtitleFileSavedToX": "Ondertitelbestand opgeslagen in {0}", + "subtitleFiles": "Ondertitelbestanden", + "subtitleFormats": "Ondertitelformaten", + "subtitleLoadedX": "Ondertitel geladen: {0}", + "subtitleXOfY": "Ondertitel {0} van {1}", + "suffix": "Achtervoegsel", + "suggestions": "Suggesties", + "sync": "Synchroniseren", + "syntaxColoring": "Syntax-kleuring", + "system": "Systeem", + "targetEncoding": "Doelcodering", + "targetFormat": "Doelformaat", + "tenHours": "10 uur", + "tenMilliseconds": "10 milliseconden", + "text": "Tekst", + "textColor": "Tekstkleur", + "textFiles": "Tekstbestanden", + "textOrImage": "Tekst/afbeelding", + "threeLetterLanguageCode": "Drieletterige taalcode", + "time": "Tijd", + "timeCodes": "Tijdcodes", + "timing": "Timing", + "title": "Titel", + "to": "Naar", + "toggleCasing": "Hoofdlettergebruik omschakelen", + "toggleDirection": "Richting omschakelen", + "toggleForced": "Geforceerd omschakelen", + "toggleShotChangesAtVideoPosition": "Shot-wijziging op videopositie omschakelen", + "toolbar": "Werkbalk", + "tools": "Gereedschappen", + "topCenter": "Boven-Midden", + "topLeft": "Boven-Links", + "topRight": "Boven-Rechts", + "totalAdjustmentX": "Totale aanpassing: {0}", + "totalFramesX": "Totaal aantal frames: {0:#;##0.##}", + "totalLengthX": "Totale lengte: {0}", + "totalLengthXSplitLine": "Totale lengte: {0} (regel splitsen!)", + "translate": "Vertalen", + "translateRow": "Rij vertalen", + "translation": "Vertaling", + "twoLetterLanguageCode": "Tweeletterige taalcode", + "type": "Type", + "unbreak": "Tekst samenvoegen", + "unbreakLines": "Regels samenvoegen", + "underline": "Onderstrepen", + "undo": "Ongedaan maken", + "unknown": "Onbekend", + "unknownSubtitleFormat": "Onbekend ondertitelformaat", + "unpacking7ZipArchiveDotDotDot": "7-zip archief uitpakken...", + "unpackingX": "Bezig met uitpakken van {0}", + "untitled": "Naamloos", + "update": "Bijwerken", + "updateAndClose": "Bijwerken en sluiten", + "updateDetails": "Details bijwerken", + "updatedBy": "Bijgewerkt door", + "url": "URL", + "usages": "Gebruik", + "use": "Gebruiken", + "useAlways": "Altijd gebruiken", + "useLargerFontForThisWindow": "Groter lettertype gebruiken voor dit venster", + "useOnce": "Eenmalig gebruiken", + "useOutputFolder": "Uitvoermap gebruiken", + "useSourceFolder": "Bronmap gebruiken", + "useSourceResolution": "Bronresolutie gebruiken", + "userName": "Gebruikersnaam", + "userNameAlreadyInUse": "Gebruikersnaam is al in gebruik", + "vertical": "Verticaal", + "video100MsBack": "Video, 100 milliseconden terug", + "video100MsForward": "Video, 100 milliseconden vooruit", + "video500MsBack": "Video, 500 milliseconden terug", + "video500MsForward": "Video, 500 milliseconden vooruit", + "videoCustom1BackX": "Video, aangepaste milliseconden ({0:#,###,##0}) terug, 1", + "videoCustom1ForwardX": "Video, aangepaste milliseconden ({0:#,###,##0}) vooruit, 1", + "videoCustom2BackX": "Video, aangepaste milliseconden ({0:#,###,##0}) terug, 2", + "videoCustom2ForwardX": "Video, aangepaste milliseconden ({0:#,###,##0}) vooruit, 2", + "videoEncodingX": "Videocodering: {0}", + "videoExtension": "Videobestandsextensie", + "videoFile": "Videobestand", + "videoFileGeneratedX": "Videobestand gegenereerd: \"{0}\"", + "videoFiles": "Videobestanden", + "videoInformation": "Video-info", + "videoOffset": "Video-offset", + "videoOneFrameBack": "Video, één frame terug", + "videoOneFrameForward": "Video, één frame vooruit", + "videoOneSecondBack": "Video, één seconde terug", + "videoOneSecondForward": "Video, één seconde vooruit", + "videoPlayer": "Videospeler", + "videoPosition": "Videopositie", + "videoResolution": "Videoresolutie", + "viewX": "{0} bekijken", + "visible": "Zichtbaar", + "voice": "Stem", + "warning": "Waarschuwing", + "waveformCenterOnVideoPosition": "Golfvorm centreren op videopositie", + "waveformPasteFromClipboard": "Plakken van klembord", + "waveformSpectrogram": "Golfvorm/spectrogram", + "webServiceUrl": "Webservice URL", + "width": "Breedte", + "windowPositionAndSize": "Vensterpositie en -grootte", + "wordsPerMin": "Woorden/min", + "pixelWidth": "Pixelbreedte", + "wpm": "Woorden/min", + "xFiles": "{0:#,###,##0} bestanden", + "xFilesConvertedInY": "{0:#,###,##0} bestanden geconverteerd in {1}", + "xNotFound": "\"{0}\" niet gevonden", + "xRequiresAnApiKey": "{0} vereist een API-sleutel", + "xSeconds": "{0:0.0##} seconden", + "xSubtitles": "{0:#,###,##0} ondertitels", + "yes": "Ja", + "copyToClipboard": "Kopiëren naar klembord", + "playCurrent": "Huidige afspelen", + "leftMargin": "Linkermarge", + "rightMargin": "Rechtermarge", + "installed": "Geïnstalleerd", + "advancedDotDotDot": "Geavanceerd...", + "chooseAlignment": "Kies uitlijning" + }, + "main": { + "menu": { + "file": "_Bestand", + "new": "_Nieuw", + "newKeepVideo": "Nieuw (video _behouden)", + "open": "_Openen...", + "openKeepVideo": "Openen (_video behouden)...", + "openOriginal": "Origineel _openen...", + "closeOriginal": "Origineel _sluiten", + "reopen": "_Heropenen...", + "clearRecentFiles": "Recente bestanden _wissen", + "restoreAutoBackup": "Auto-_backup herstellen...", + "save": "_Opslaan", + "saveAs": "Opslaan _als...", + "openContainingFolder": "Bevattende _map openen", + "compare": "Vergelij_ken...", + "statistics": "Statistieken...", + "import": "_Importeren", + "export": "_Exporteren", + "exit": "A_fsluiten", + "edit": "Be_werken", + "undo": "_Ongedaan maken", + "redo": "_Opnieuw", + "showHistory": "Ge_schiedenis voor ongedaan maken...", + "find": "_Zoeken...", + "findNext": "_Volgende zoeken", + "replace": "_Vervangen...", + "multipleReplace": "_Meervoudig vervangen...", + "goToLineNumber": "Ga naar _regelnummer...", + "rightToLeftMode": "_Rechts-naar-links modus", + "modifySelectionDotDotDot": "_Selectie aanpassen...", + "tools": "_Gereedschappen", + "toolsSelectedLines": "Gereedschappen (_geselecteerde regels)", + "adjustDurations": "_Duur aanpassen...", + "applyDurationLimits": "Duurgrenzen _toepassen...", + "batchConvert": "_Batch-conversie...", + "bridgeGaps": "Gaten _overbruggen...", + "applyMinGap": "Minimale afstand tussen ondertitels toepassen...", + "changeCasing": "_Hoofdlettergebruik wijzigen...", + "changeFormatting": "Opmaak wijzigen...", + "fixCommonErrors": "Veelvoorkomende fouten _herstellen...", + "checkAndFixNetflixErrors": diff --git a/src/UI/UI.csproj b/src/UI/UI.csproj index 3254bb030bf..81d7767d845 100644 --- a/src/UI/UI.csproj +++ b/src/UI/UI.csproj @@ -68,6 +68,7 @@ + @@ -94,6 +95,7 @@ + From a1451e6cd14a561f6634a9722ed9f3f36b251bf5 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 16:07:49 +0200 Subject: [PATCH 27/74] Add language tags --- src/UI/Assets/Languages/English.json | 52 +++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/src/UI/Assets/Languages/English.json b/src/UI/Assets/Languages/English.json index d4bc3034c54..e58691e3ae2 100644 --- a/src/UI/Assets/Languages/English.json +++ b/src/UI/Assets/Languages/English.json @@ -648,7 +648,14 @@ "rightMargin": "Right margin", "installed": "Installed", "advancedDotDotDot": "Advanced...", - "chooseAlignment": "Choose alignment" + "chooseAlignment": "Choose alignment", + "maxWidthPixels": "Max width (pixels)", + "sampleText": "Sample text", + "boxWidthPixels": "Box width (pixels)", + "fadeInOut": "Fade in/out", + "alpha": "Alpha", + "pickResolution": "Pick resolution", + "manualSync": "Manual sync" }, "main": { "menu": { @@ -1395,7 +1402,14 @@ "editStyles": "Edit styles", "editProperties": "Edit properties", "editAttachments": "Edit attachments", - "errorsExportedX": "Errors exported: {0}" + "errorsExportedX": "Errors exported: {0}", + "slowFontSizeChange": "Slow font size change", + "increaseFontKerning": "Increase font kerning", + "scrollUp": "Scroll up", + "scrollDown": "Scroll down", + "rotateIn": "Rotate in", + "tiltBounce": "Tilt bounce", + "fontSizeBounceIn": "Font size bounce in" }, "changeCasing": { "title": "Change casing", @@ -1445,7 +1459,9 @@ }, "mergeShortLines": { "title": "Merge short lines", - "highlightParts": "Highlight parts (karaoke)" + "highlightParts": "Highlight parts (karaoke)", + "mergedLineInfo": "Merged line {0} into {1} - {2}", + "linesMergedX": "Lines merged: {0}" }, "mergeLinesWithSameText": { "title": "Merge lines with same text", @@ -1463,7 +1479,23 @@ "nothingToReport": "No issues found.", "saveNetflixQualityReport": "Save Netflix quality report", "netflixReportSaved": "Netflix quality report saved", - "netFlixQualityReportSavedToX": "Netflix quality report saved to:\n {0}" + "netFlixQualityReportSavedToX": "Netflix quality report saved to:\n {0}", + "dialogHyphenSpace": "Dialog hyphen space", + "ellipsesNotThreeDots": "Use elipses (not three dots)", + "onlyAllowedGlyphs": "Only allowed glyphs", + "italics": "Italics", + "maxCharsSec": "Max chars/sec", + "maxDuration": "Max duration", + "maxLineLength": "Max line length", + "minDuration": "Min duration", + "maxNumberOfLines": "Max number of lines", + "oneToTenSpellOut": "One to ten spell out", + "shotChanges": "Shot changes", + "startNumberSpellOut": "Start number spell out", + "textforHiUseBrackets": "Text for HI, use brackets", + "frameRate": "Frame rate", + "twoFrameGrap": "Two frame gap", + "whiteSpace": "White space" }, "imageBasedEdit": { "editImagedBaseSubtitle": "Edit imaged-based subtitle", @@ -1583,7 +1615,8 @@ "outputProperties": "Output properties...", "videoFileSize": "Video file size", "oneBox": "One box", - "boxPerLine": "Box per line" + "boxPerLine": "Box per line", + "logoInfo": "Pick a PNG image and drag it to position it on the video." }, "videoTransparent": { "title": "Generate transparent video with subtitles", @@ -1664,7 +1697,8 @@ "edgeTtsPitch": "Edge-TTS pitch", "edgeTtsPitchDescription": "Pitch adjustment for Edge-TTS, e.g. \"+10Hz\", \"-5Hz\", or \"+0Hz\" for default.", "edgeTtsVolume": "Edge-TTS volume", - "edgeTtsVolumeDescription": "Volume adjustment for Edge-TTS, e.g. \"+20%\", \"-10%\", or \"+0%\" for default." + "edgeTtsVolumeDescription": "Volume adjustment for Edge-TTS, e.g. \"+20%\", \"-10%\", or \"+0%\" for default.", + "downloadPiperPrompt": "\"Text to speech\" requires Piper.\r\n\r\nDownload and use Piper?" }, "shotChanges": { "titleGenerateOrImport": "Generate/import shot changes", @@ -1785,7 +1819,8 @@ "lineMerge": "Line merge", "delayInSecondsBetweenRequests": "Delay in seconds between requests", "maxBytesPerRequest": "Max bytes per request", - "promptText": "Prompt text" + "promptText": "Prompt text", + "translateEachLineSeparately": "Translate each line separately" }, "options": { "settings": { @@ -2044,7 +2079,8 @@ "uiScale": "UI scale (%)", "waveformToolbarItems": "Waveform toolbar items", "matchIconColorToDarkTheme": "Match icon color to dark theme foreground color", - "subtitlePreviewProperties": "Subtitle preview properties" + "subtitlePreviewProperties": "Subtitle preview properties", + "pixelWidthInfo": "Green lines = max-width limit | Red area = text exceeds limit" }, "shortcuts": { "title": "Shortcuts", From 4237ee00c160523287ee47db3e3c6d3f907b9f02 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 16:48:04 +0200 Subject: [PATCH 28/74] Update Danish translation --- src/UI/Assets/Languages/Danish.json | 138 +++++++++++++++++++++++++--- 1 file changed, 125 insertions(+), 13 deletions(-) diff --git a/src/UI/Assets/Languages/Danish.json b/src/UI/Assets/Languages/Danish.json index c1e8c34e267..f57279a2715 100644 --- a/src/UI/Assets/Languages/Danish.json +++ b/src/UI/Assets/Languages/Danish.json @@ -310,6 +310,7 @@ "NewDotDotDot": "Ny...", "NewProfile": "Ny profil", "NewSubtitleStartKeyDownSetEndKeyUp": "Indsæt undertekst: Start på tast ned, sæt ende på tast op", + "SetSubtitleStartAtVideoPositionSetEndAtKeyUpAndGoToNext": "Indstil start ved videoposition sæt ende på tasten op, og gå til næste", "No": "Ingen", "NoFilesToConvert": "Ingen filer at konvertere", "NoLanguageCode": "Ingen sprogkode", @@ -643,7 +644,17 @@ "CopyToClipboard": "Kopiér til udklipsholder", "PlayCurrent": "Spil aktuel", "LeftMargin": "Venstre margin", - "RightMargin": "Højre margin" + "RightMargin": "Højre margin", + "Installed": "Installeret", + "AdvancedDotDotDot": "Avanceret...", + "ChooseAlignment": "Vælg justering", + "MaxWidthPixels": "Maks. bredde (pixels)", + "SampleText": "Eksempel tekst", + "BoxWidthPixels": "Boksbredde (pixels)", + "FadeInOut": "Fade ind/ud", + "Alpha": "Alfa", + "PickResolution": "Vælg opløsning", + "ManualSync": "Manuel synkronisering" }, "Main": { "AudioTrackIsNowX": "Lydsporet er nu \"{0}", @@ -843,6 +854,7 @@ "HelpTitle": "Hjælp", "Help": "Hjælp...", "About": "Om...", + "CheckForUpdates": "_Check opdateringer...", "FixRightToLeftViaUnicodeControlCharacters": "Ret RTL via Unicode-kontroltegn (udvalgte linjer)", "RemoveUnicodeControlCharacters": "Fjern Unicode-kontroltegn (udvalgte linjer)", "ReverseRightToLeftStartEnd": "Omvendt RTL start/slut (udvalgte linjer)", @@ -1138,6 +1150,8 @@ "LengthLessThan": "Længde <", "LengthGreaterThan": "Længde >", "PixelLengthGreaterThan": "Pixellængde >", + "GapLessThan": "Gab i ms <", + "GapGreaterThan": "Gab i ms >", "ExactlyOneLine": "Præcis én linje", "ExactlyTwoLines": "Præcis to linjer", "MoreThanTwoLines": "Mere end to linjer", @@ -1159,7 +1173,11 @@ "ExportReplaceRules": "Eksportregler", "AppliedRules": "Anvendte regler", "FindRule": "Find regel", - "XLinesAffected": "{0:#,##0} linjer påvirket" + "XLinesAffected": "{0:#,##0} linjer påvirket", + "DeleteCategoryConfirm": "Vil du slette kategorien '{0}'?", + "DeleteRuleConfirm": "Vil du slette reglen '{0}'?", + "FindWhat": "Find hvad", + "DescriptionOptional": "Beskrivelse (valgfrit)" }, "Find": { "SearchTextWatermark": "Søg tekst...", @@ -1304,7 +1322,9 @@ "BackToFixList": "Tilbage til rettelseslisten", "ApplyFixesAndClose": "Anvend rettelser og luk", "FixCommonOcrErrorsStep2": "Ret almindelige fejl, trin 2 (anvend rettelser)", - "FixCommonOcrErrorsStep2FixesFoundX": "Ret almindelige fejl, trin 2 - Rettelser fundet: {0}" + "FixCommonOcrErrorsStep2FixesFoundX": "Ret almindelige fejl, trin 2 - Rettelser fundet: {0}", + "Action": "Handling", + "ApplySelectedFixes": "Anvend valgte rettelser" }, "AdjustDurations": { "Title": "Adjust durations", @@ -1391,7 +1411,14 @@ "EditStyles": "Rediger stilarter", "EditProperties": "Rediger egenskaber", "EditAttachments": "Rediger vedhæftede filer", - "ErrorsExportedX": "Fejl eksporteret: {0}" + "ErrorsExportedX": "Fejl eksporteret: {0}", + "SlowFontSizeChange": "Langsom ændring af skriftstørrelse", + "IncreaseFontKerning": "Forøg skrifttype-kernening", + "ScrollUp": "Rul op", + "ScrollDown": "Rul ned", + "RotateIn": "Roter ind", + "TiltBounce": "Tilt bounce", + "FontSizeBounceIn": "Skriftstørrelse hopper ind" }, "ChangeCasing": { "Title": "Change casing", @@ -1441,7 +1468,9 @@ }, "MergeShortLines": { "Title": "Flet korte linjer", - "HighlightParts": "Fremhæv dele (karaoke)" + "HighlightParts": "Fremhæv dele (karaoke)", + "MergedLineInfo": "Flettede linje {0} til {1} ​​- {2}", + "LinesMergedX": "Linjer flettet: {0}" }, "MergeLinesWithSameText": { "Title": "Flet linjer med samme tekst", @@ -1459,7 +1488,23 @@ "NothingToReport": "Ingen problemer fundet.", "SaveNetflixQualityReport": "Gem Netflix kvalitetsrapport", "NetflixReportSaved": "Netflix kvalitetsrapport gemt", - "NetFlixQualityReportSavedToX": "Netflix kvalitetsrapport gemt til:\r\n\r\n{0}" + "NetFlixQualityReportSavedToX": "Netflix kvalitetsrapport gemt til:\r\n\r\n{0}", + "DialogHyphenSpace": "Dialog bindestreg mellemrum", + "EllipsesNotThreeDots": "Brug elipser (ikke tre prikker)", + "OnlyAllowedGlyphs": "Kun tilladte glyffer", + "Italics": "Kursiv", + "MaxCharsSec": "Max tegn/sek", + "MaxDuration": "Max varighed", + "MaxLineLength": "Max linjelængde", + "MinDuration": "Min varighed", + "MaxNumberOfLines": "Max antal linjer", + "OneToTenSpellOut": "En til ti staves ud", + "ShotChanges": "Skudskifter", + "StartNumberSpellOut": "Startnummer udskrives", + "TextforHiUseBrackets": "Tekst til HI, brug parenteser", + "FrameRate": "Billedhastighed", + "TwoFrameGrap": "Mellemrum i to rammer", + "WhiteSpace": "Hvidt rum" }, "ImageBasedEdit": { "EditImagedBaseSubtitle": "Rediger billedbaseret undertekst", @@ -1484,6 +1529,24 @@ "ResizeImages": "Ændre størrelse på billeder", "Percentage": "Procent", "ResizeImagesInfo": "Indtast procentdelen for at ændre størrelse på billeder.\r\n\r\nForhåndsvisning af opdateringer automatisk." + }, + "RemoveTextForHearingImpaired": { + "Title": "Fjern tekst for hørehæmmede", + "Interjections": "Interjektioner", + "SkipIfStartWith": "Spring over hvis start med", + "RemoveTextBetween": "Fjern tekst mellem", + "Brackets": "Firkant", + "CurlyBrackets": "Krøllede ", + "Parentheses": "Parenteser", + "And": "og", + "OnlySeparateLines": "Kun separate linjer", + "RemoveTextBeforeColon": "Fjern tekst før kolon", + "OnlyIfTextIsUppercase": "Kun hvis teksten er med store bogstaver", + "OnlyOnSeparateLine": "Kun på separat linje", + "IfLineIsUppercase": "Hvis stregen er stor", + "IfLineContains": "Hvis linje indeholder", + "IfLineOnlyContainsMusicSymbols": "Hvis linje kun indeholder musiksymboler", + "RemoveInterjections": "Fjern interjektioner" } }, "SpellCheck": { @@ -1537,6 +1600,8 @@ "AddCurrentSubtitle": "Tilføj aktuel undertekst", "TitleOrLanguage": "Titel/sprog", "ViewMatroskaTrackX": "Se Matroska-spor - {0}", + "ResolutionSeparator": "x", + "OpenFromUrlTitle": "Åbn videofil fra URL", "BurnIn": { "Title": "Generer video med indbrændte undertekster", "InfoAssaOff": "Bemærk: Avanceret SubStation Alpha-styling understøttes.", @@ -1579,7 +1644,8 @@ "OutputProperties": "Outputegenskaber...", "VideoFileSize": "Video filstørrelse", "OneBox": "Én kasse", - "BoxPerLine": "Æske pr linje" + "BoxPerLine": "Æske pr linje", + "LogoInfo": "Vælg et PNG-billede, og træk det for at placere det på videoen." }, "VideoTransparent": { "Title": "Generate transparent video with subtitles", @@ -1604,7 +1670,15 @@ "SelectModel": "Vælg model", "ViewWhisperLogFile": "Se Whisper-logfil", "ReDownloadX": "Gendownload {0}", - "DownloadingSpeechToTextModel": "Downloader tale-til-tekst-model" + "DownloadingSpeechToTextModel": "Downloader tale-til-tekst-model", + "WhisperPostProcessingTitle": "Whisper efterbehandling", + "AdjustTimings": "Juster tider", + "MergeShortLines": "Flet korte linjer", + "BreakSplitLongLines": "Bryd/split lange linjer", + "FixShortDuration": "Fix kort varighed", + "FixCasing": "Reparer store/små bogstaver", + "AddPeriods": "Tilføj perioder", + "ChangeUnderlineToColor": "Skift understregning til farve" }, "TextToSpeech": { "Title": "Tekst til tale", @@ -1628,7 +1702,32 @@ "RegenerateAudio": "Gendan lyd", "AutoContinuePlaying": "Fortsæt automatisk med at spille", "AddingAudioToVideoFileDotDotDot": "Tilføjer lyd til videofil...", - "PreparingMergeDotDotDot": "Forbereder fletning..." + "PreparingMergeDotDotDot": "Forbereder fletning...", + "ImportVoiceDotDotDot": "Importer stemme...", + "VoiceImportSuccessTitle": "Stemme importeret", + "VoiceXImported": "Stemmen '{0}' blev importeret", + "AdvancedTtsSettings": "Avancerede TTS-indstillinger", + "ProAudioPostProcessing": "Pro lyd efterbehandling", + "ProAudioPostProcessingDescription": "Anvender EQ-varme, noise gate, kompression, loudness-normalisering (-16 LUFS) og fade ind/ud til hvert segment.", + "AudioDucking": "Audio ducking", + "AudioDuckingDescription": "Reducerer den originale videolydstyrke og blander den med TTS-lyden, så det originale lydspor stadig er svagt hørbart.", + "OriginalVolumePercent": "Original volumen %", + "VadSilenceCompression": "VAD silence komprimering", + "VadSilenceCompressionDescription": "Forkorter pauser mellem ord, før du skifter tempo.\r\nBruger Voice Activity Detection til kun at komprimere tavshedshuller, mens talen holdes urørt.\r\nDette er det foretrukne første trin - det reducerer varigheden uden kvalitetstab.", + "MaxSilenceMs": "Maksimal stilhed (ms)", + "HighQualityTimeStretch": "Tidsstrækning af høj kvalitet (WSOLA/gummibånd)", + "HighQualityTimeStretchDescription": "Bruger gummibåndsalgoritmen (WSOLA) i stedet for standard atempo-filteret til tonehøjdebevarende hastighedsændringer.\r\nProducerer mere naturligt lydende tale, især ved højere hastighedsfaktorer.\r\nKræver librubberband i din FFmpeg-build — falder automatisk tilbage til atempo, hvis den ikke er tilgængelig.", + "SilencePaddingMs": "Silence polstring (ms)", + "SilencePaddingMsDescription": "Tilføjer en kort stilhed i slutningen af ​​hvert segment.\r\nNyttig til at puste plads mellem sætninger.", + "OutputSampleRate": "Output sample rate (0 = standard)", + "OutputSampleRateDescription": "Gensampler alle segmenter til den angivne samplingsfrekvens (f.eks. 44100, 48000).\r\nIndstil til 0 for at beholde den oprindelige hastighed.", + "EdgeTtsRate": "Edge-TTS rate", + "EdgeTtsRateDescription": "Talehastighed for Edge-TTS, f.eks.\r\n\"+50%\", \"-30%\" eller \"+0%\" som standard.", + "EdgeTtsPitch": "Edge-TTS tonehøjde", + "EdgeTtsPitchDescription": "Pitch justering for Edge-TTS, f.eks.\r\n\"+10Hz\", \"-5Hz\" eller \"+0Hz\" som standard.", + "EdgeTtsVolume": "Edge-TTS volumen", + "EdgeTtsVolumeDescription": "Lydstyrkejustering til Edge-TTS, f.eks.\r\n\"+20%\", \"-10%\" eller \"+0%\" som standard.", + "DownloadPiperPrompt": "\"Tekst til tale\" kræver Piper.\r\n\r\nVil du downloade og bruge Piper?" }, "ShotChanges": { "TitleGenerateOrImport": "Generer/importér skudændringer", @@ -1715,7 +1814,12 @@ "ReCopyTextToClipboard": "Kopier tekst til udklipsholder igen (til oversætter/AI)", "BlockXOfY": "Bloker {0} af {1}", "NoTextInClipboard": "Ingen tekst i udklipsholderen", - "TextInClipboardIsSameAsSourceText": "Teksten i udklipsholderen er den samme som kildeteksten, prøv venligst igen." + "TextInClipboardIsSameAsSourceText": "Teksten i udklipsholderen er den samme som kildeteksten, prøv venligst igen.", + "LineMerge": "Linjefletning", + "DelayInSecondsBetweenRequests": "Forsinkelse i sekunder mellem anmodninger", + "MaxBytesPerRequest": "Maks. bytes pr. anmodning", + "PromptText": "Spørg tekst", + "TranslateEachLineSeparately": "Oversæt hver linje separat" }, "Options": { "Settings": { @@ -1808,7 +1912,7 @@ "MaxLines": "Max antal linjer", "UnbreakSubtitlesShortThan": "Split undertekster kortere end", "NewEmptyDefaultMs": "Standard ny undertekstvarighed (ms)", - "PromptDeleteLines": "Spørg om sletning af linjer", + "PromptBeforeDelete": "Spørg før sletning", "RememberPositionAndSize": "Husk vinduets placering og størrelse", "AutoBackupOn": "Auto-backup", "AutoBackupIntervalMinutes": "Interval for automatisk backup (minutter)", @@ -1973,7 +2077,9 @@ "AllSettings": "Alle indstillinger", "UiScale": "UI-skaler (%)", "WaveformToolbarItems": "Waveform værktøjslinjeelementer", - "MatchIconColorToDarkTheme": "Match ikonfarve til mørk temaforgrundsfarve" + "MatchIconColorToDarkTheme": "Match ikonfarve til mørk temaforgrundsfarve", + "SubtitlePreviewProperties": "Egenskaber til forhåndsvisning af undertekster", + "PixelWidthInfo": "Grønne linjer = maks. breddegrænse | \r\nRødt område = tekst overskrider grænsen" }, "Shortcuts": { "Title": "Shortcuts", @@ -2244,7 +2350,13 @@ } }, "Help": { - "AboutSubtitleEdit": "Om Subtitle Edit" + "AboutSubtitleEdit": "Om Subtitle Edit", + "CheckForUpdates": "Se efter opdateringer", + "CheckForUpdatesChecking": "Søger efter opdateringer...", + "CheckForUpdatesUpToDate": "Du kører den seneste version.", + "CheckForUpdatesNewVersionAvailable": "Ny version tilgængelig: {0}", + "CheckForUpdatesUnableToCheck": "Kan ikke søge efter opdateringer.", + "CheckForUpdatesDownloadNewVersion": "Download ny version" }, "Ocr": { "LinesToDraw": "Linjer at tegne", From 8668909be032b55a24584a1c74627c95804e3429 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 17:01:53 +0200 Subject: [PATCH 29/74] Fix for invalid json in Dutch.json --- src/UI/Assets/Languages/Dutch.json | 3323 ++++++++++++++++++++++------ 1 file changed, 2630 insertions(+), 693 deletions(-) diff --git a/src/UI/Assets/Languages/Dutch.json b/src/UI/Assets/Languages/Dutch.json index 34d9270edce..9e22972fbaa 100644 --- a/src/UI/Assets/Languages/Dutch.json +++ b/src/UI/Assets/Languages/Dutch.json @@ -1,694 +1,2631 @@ -{ - "title": "Subtitle Edit", - "version": null, - "translatedBy": "", - "cultureName": "nl-NL", - "general": { - "abort": "Afbreken", - "actor": "Acteur", - "actors": "Acteurs", - "add": "Toevoegen", - "addDotDotDot": "Toevoegen...", - "addToNamesListCaseSensitive": "Toevoegen aan namenlijst (hoofdlettergevoelig)", - "addToUserDictionary": "Toevoegen aan gebruikerswoordenboek", - "addVideoFiles": "Videobestanden toevoegen...", - "adjustAlpha": "Alpha aanpassen (transparantie)", - "adjustDisplayDuration": "Weergaveduur aanpassen", - "adjustment": "Aanpassing", - "advanced": "Geavanceerd", - "advancedSettings": "Geavanceerde instellingen", - "after": "Na", - "alignment": "Uitlijning", - "alignmentDotDotDot": "Uitlijning...", - "alignmentX": "Stel uitlijning \"{0}\" in voor geselecteerde regels", - "all": "Alle", - "allFiles": "Alle bestanden", - "alphaAdjustment": "Alpha-aanpassing", - "aphaThreshold": "Alpha-drempelwaarde", - "apiKey": "API-sleutel", - "apiSecret": "Geheim", - "appearance": "Uiterlijk", - "append": "Toevoegen (achteraan)", - "apply": "Toepassen", - "applyTo": "Toepassen op", - "ascending": "Oplopend", - "attachDotDotDot": "Bijvoegen...", - "audioFiles": "Audiobestanden", - "audioVisualizer": "Audiovisualisatie", - "auto": "Auto", - "autoBreak": "Regels automatisch afbreken", - "autoContinue": "Automatisch doorgaan", - "autoTranslate": "Automatisch vertalen", - "autodetect": "Automatisch detecteren", - "background": "Achtergrond", - "backgroundColor": "Achtergrondkleur", - "backward": "Achteruit", - "batchMode": "Batchmodus", - "bdnXml": "BDN/xml", - "before": "Voor", - "beforeX": "Voor \"{0}\"", - "beginning": "Begin", - "bluRaySup": "Blu-ray (sup)", - "bold": "Vet", - "bookmarkAdd": "Bladwijzer toevoegen", - "bookmarkAddForSelectedLinesX": "Bladwijzer toevoegen voor {0} geselecteerde regels", - "bookmarkClearQuestion": "Alle bladwijzers wissen?", - "bookmarkDeleteSelectedQuestion": "Geselecteerde bladwijzer verwijderen?", - "bookmarkDotDotDot": "Bladwijzer...", - "bookmarkEdit": "Bladwijzer bewerken", - "bookmarkEditForSelectedLinesX": "Bladwijzer bewerken voor {0} geselecteerde regels", - "bookmarksList": "Bladwijzers weergeven", - "borderColor": "Randkleur", - "borderStyle": "Randstijl", - "bottomCenter": "Onder-Midden", - "bottomLeft": "Onder-Links", - "bottomRight": "Onder-Rechts", - "box": "Kader", - "boxColor": "Kaderkleur", - "boxCornerRadius": "Kader hoekstraal", - "boxPerLine": "Kader per regel", - "bridgeGaps": "Gaten overbruggen", - "cancel": "_Annuleren", - "cancelled": "Geannuleerd", - "caseInsensitive": "Niet hoofdlettergevoelig", - "caseSensitive": "Hoofdlettergevoelig", - "category": "Categorie", - "center": "Midden", - "centerHorizontally": "Horizontaal centreren", - "centerVertically": "Verticaal centreren", - "change": "Wijzigen", - "changeAll": "Alles wijzigen", - "changeCasing": "Hoofdlettergebruik wijzigen", - "changeFormatting": "Opmaak wijzigen", - "changeFrameRate": "Framerate wijzigen", - "changeLanguageFilter": "Taalfilter wijzigen...", - "changeOnce": "Eén keer wijzigen", - "changeSpeed": "Snelheid wijzigen", - "character": "Teken", - "characters": "Tekens", - "charsPerSec": "Tekens/sec", - "chooseColorDotDotDot": "Kies kleur...", - "chooseImageFiles": "Kies afbeeldingen", - "class": "Klasse", - "classic": "Klassiek", - "clear": "Wissen", - "close": "Sluiten", - "codec": "Codec", - "collapse": "Inklappen", - "color": "Kleur", - "colorDotDotDot": "Kleur...", - "column": "Kolom", - "consoleLog": "Consolelog", - "contentAlignment": "Inhoudsuitlijning", - "conversionCancelledByUser": "Conversie geannuleerd door gebruiker", - "convert": "Converteren", - "converted": "Geconverteerd", - "convertingDotDotDot": "Converteren...", - "convertingXofYDotDoDot": "Converteren van {0:#,###,##0}/{1:#,###,##0}...", - "copy": "Kopiëren", - "copyImageToClipboard": "Afbeelding naar klembord kopiëren", - "copyTextToClipboard": "Tekst naar klembord kopiëren", - "couldNotSaveFileXErrorY": "Kan bestand \"{0}\" niet opslaan. Fout: {1}", - "count": "Aantal", - "cps": "Tekens/sec", - "currentSubtitle": "Huidige ondertitel", - "currentVideoPosition": "Huidige videopositie", - "cut": "Knippen", - "dark": "Donker", - "dateAndTime": "Datum en tijd", - "default": "Standaard", - "delete": "Verwijderen", - "deleteAtPosition": "Ondertitel op videopositie verwijderen", - "deleteCurrentLine": "Huidige regel verwijderen", - "deleteFirstLines": "Eerste regels verwijderen", - "deleteLastLines": "Laatste regels verwijderen", - "deleteLineXPrompt": "Regelnummer {0} verwijderen?", - "deleteLines": "Regels verwijderen", - "deleteLinesContainingText": "Regels met tekst verwijderen", - "deleteXLinesPrompt": "{0} regels verwijderen?", - "description": "Beschrijving", - "dictionary": "Woordenboek", - "diskSpace": "Schijfruimte", - "doNoChange": "Niet wijzigen", - "done": "Gereed", - "doubleWords": "Dubbele woorden", - "doubleLines": "Dubbele regels", - "download": "Downloaden", - "downloadX": "Download {0}", - "downloadingX": "Bezig met downloaden van {0}", - "downloadingXPercent": "Downloaden: {0}%", - "duplicate": "Dupliceren", - "duration": "Duur", - "durationMinutes": "Duur in minuten", - "edit": "Bewerken", - "editDotDotDot": "Bewerken...", - "editing": "Bezig met bewerken", - "effect": "Effect", - "enabled": "Ingeschakeld", - "encoding": "Codering", - "endTime": "Eindtijd", - "engine": "Engine", - "enterProfileName": "Voer profielnaam in", - "error": "Fout", - "errorX": "Fout: {0}", - "example": "Voorbeeld", - "exampleX": "Voorbeeld: {0}", - "expand": "Uitvouwen", - "export": "Exporteren", - "exportDotDotDot": "Exporteren...", - "exportToX": "Exporteren naar {0}", - "extendAfter": "Verlengen/inkorten naar volgende regel", - "extendBefore": "Verlengen/inkorten naar vorige regel", - "extendSelectedLinesToNextShotChangeOrNextSubtitle": "Geselecteerde regels verlengen naar volgende shot-wijziging (of ondertitel)", - "extendSelectedToNext": "Geselecteerde verlengen naar volgende", - "extendSelectedToPrevious": "Geselecteerde verlengen naar vorige", - "extractingAudioClips": "Audiofragmenten extraheren...", - "fade": "Fade", - "fetchFirstWordFromNextSubtitle": "Eerste woord van volgende ondertitel ophalen", - "fileAlreadyExists": "Bestand bestaat al", - "fileExtension": "Bestandsextensie", - "fileName": "Bestandsnaam", - "fileNameX": "Bestandsnaam: {0}", - "fileNameXAndSize": "Bestandsnaam: {0} ({1})", - "fileSaved": "Bestand opgeslagen", - "fileSavedToX": "Bestand opgeslagen in {0}", - "fileXAlreadyExists": "Bestand \"{0}\" bestaat al.", - "fileXOfY": "Bestand {0} van {1}", - "filter": "Filter", - "filterByLayer": "Filteren op laag", - "find": "Zoeken", - "findNext": "Volgende zoeken", - "findTextX": "Tekst zoeken - {0}", - "fiveHundredMilliseconds": "500 milliseconden", - "fiveSeconds": "Vijf seconden", - "fix": "Herstellen", - "fixCommonErrors": "Veelvoorkomende fouten herstellen", - "fixRightToLeft": "Rechts-naar-links herstellen", - "fixRightToLeftViaUnicodeTags": "RTL herstellen via Unicode-tags", - "fixedValue": "Vaste waarde", - "focusSelectedLine": "Focus op geselecteerde regel (scrollen in rooster)", - "font": "Lettertype", - "fontColor": "Tekstkleur", - "fontHeight": "Letterhoogte", - "fontName": "Lettertypenaam", - "fontNameDotDotDot": "Lettertypenaam...", - "fontSize": "Lettergrootte", - "fonts": "Lettertypen", - "footer": "Voettekst", - "forced": "Geforceerd", - "foreground": "Voorgrond", - "format": "Formaat", - "forward": "Vooruit", - "foundNoMatches": "Geen overeenkomsten gevonden", - "foundOneMatch": "Eén overeenkomst gevonden", - "foundXInLineYZ": "\"{0}\" gevonden in regel {1}, positie {2}", - "foundXMatches": "{0} overeenkomsten gevonden", - "frameRate": "Framerate", - "frameRateX": "Framerate: {0:0.0###}", - "frames": "Frames", - "from": "Van", - "fromCurrentVideoPosition": "vanaf huidige videopositie", - "gap": "Gat", - "general": "Algemeen", - "generalText": "Algemeen", - "generate": "Genereren", - "generateImportShotChanges": "Shot-wijzigingen genereren/importeren", - "generating": "Bezig met genereren...", - "generatingImageXofY": "Afbeelding {0:#,##0} van {1:#,##0} genereren...", - "generatingWavFile": "WAV-bestand genereren...", - "getAudioClips": "Audiofragmenten ophalen", - "goTo": "Ga naar", - "goToLineNumber": "Ga naar regelnummer", - "goToNextShotChange": "Ga naar volgende shot-wijziging", - "goToPreviousShotChange": "Ga naar vorige shot-wijziging", - "googleIt": "Google het", - "group": "Groep", - "header": "Koptekst", - "height": "Hoogte", - "help": "Help", - "hex": "Hex", - "hide": "Verbergen", - "hidePreview": "Voorbeeld verbergen", - "history": "Geschiedenis", - "horizontal": "Horizontaal", - "hourMinutesSecondsDecimalSeparatorMilliseconds": "Uur:min:sec{0}ms", - "hourMinutesSecondsFrames": "Uur:min:sec:frames", - "ip": "IP", - "id": "ID", - "image": "Afbeelding", - "imageSaved": "Afbeelding opgeslagen", - "imagedBasedSubtitles": "Ondertitels gebaseerd op afbeeldingen", - "images": "Afbeeldingen", - "imagesWithTimeCode": "Afbeeldingen met tijdcode", - "import": "Importeren", - "importDotDotDot": "Importeren...", - "include": "Inclusief", - "information": "Informatie", - "insertAfter": "Invoegen na", - "insertAtPositionAndFocusTextBox": "Ondertitel op videopositie invoegen en tekstvak focus geven", - "insertAtPositionNoFocusTextBox": "Ondertitel op videopositie invoegen (geen focus tekstvak)", - "insertBefore": "Invoegen voor", - "insertLine": "Regel invoegen", - "insertNewSelection": "Nieuwe selectie invoegen", - "insertSubtitleAfterCurrentLine": "Ondertitel invoegen na huidige regel...", - "insertSubtitleFileAtVideoPositionDotDotDot": "Ondertitelbestand invoegen op videopositie...", - "inspectAdditions": "Toevoegingen inspecteren...", - "invertSelection": "Selectie omkeren", - "isDefault": "Is standaard", - "italic": "Cursief", - "keepExistingTimeCodes": "Bestaande tijdcodes behouden (geen video-offset toevoegen)", - "keyFile": "Sleutelbestand", - "language": "Taal", - "languagePostFix": "Taal-postfix (mkv/mp4)", - "layer": "Laag", - "layerFilterOn": "Laagfilter aan", - "left": "Links", - "light": "Licht", - "lineHeigth": "Regelhoogte", - "lineNumber": "Regel#", - "lineXColumnY": "Regel {0}, kolom {1}", - "lines": "Regels", - "linesAddedX": "Regels toegevoegd: {0}", - "linesChangedX": "Regels gewijzigd: {0}", - "linesDeletedX": "Regels verwijderd: {0}", - "listErrors": "Fouten weergeven", - "loadDefaults": "Standaardwaarden laden", - "lockTimeCodes": "Tijdcodes vergrendelen", - "logo": "Logo", - "margin": "Marge", - "match": "Overeenkomst", - "maxCharactersPerSecond": "Max. tekens per seconde", - "mediaInformation": "Media-informatie", - "mergeAfter": "Samenvoegen met volgende regel", - "mergeBefore": "Samenvoegen met vorige regel", - "mergeLines": "Regels samenvoegen", - "mergeLinesWithSameText": "Regels met dezelfde tekst samenvoegen", - "mergeLinesWithSameTimeCodes": "Regels met dezelfde tijdcodes samenvoegen", - "mergeSelected": "Geselecteerde samenvoegen", - "mergeSelectedAsDialog": "Geselecteerde samenvoegen als dialoog", - "mergeSelectedLines": "Geselecteerde regels samenvoegen", - "mergeSelectedLinesDialog": "Geselecteerde regels samenvoegen als dialoog", - "mergeWithLineAfterAndAutoBreak": "Samenvoegen met volgende regel en auto-afbreken", - "mergeWithLineAfterKeepBreaks": "Samenvoegen met volgende regel (afbrekingen behouden)", - "mergeWithLineBeforeAndAutoBreak": "Samenvoegen met vorige regel en auto-afbreken", - "mergeWithLineBeforeKeepBreaks": "Samenvoegen met vorige regel (afbrekingen behouden)", - "middleCenter": "Midden-Centrum", - "middleLeft": "Midden-Links", - "middleRight": "Midden-Rechts", - "milliseconds": "Milliseconden", - "model": "Model", - "models": "Modellen", - "more": "Meer", - "moreInfo": "Meer info", - "moveAllShotChangeOneFrameBack": "Alle shot-wijzigingen één frame terugplaatsen", - "moveAllShotChangeOneFrameForward": "Alle shot-wijzigingen één frame vooruitplaatsen", - "moveDown": "Omlaag verplaatsen", - "moveUp": "Omhoog verplaatsen", - "multipleReplace": "Meervoudig vervangen", - "name": "Naam", - "negative": "Negatief", - "new": "Nieuw", - "newDotDotDot": "Nieuw...", - "newProfile": "Nieuw profiel", - "newSubtitleStartKeyDownSetEndKeyUp": "Ondertitel invoegen: Start bij toets indrukken, eind bij loslaten", - "setSubtitleStartAtVideoPositionSetEndAtKeyUpAndGoToNext": "Start op videopositie, eind bij loslaten toets, en ga naar volgende", - "no": "Nee", - "noFilesToConvert": "Geen bestanden om te converteren", - "noLanguageCode": "Geen taalcode", - "noSubtitleLoaded": "Geen ondertitel geladen", - "noSubtitlesFound": "Geen ondertitels gevonden!", - "noSymbolLines": "#Regels", - "noVideoLoaded": "Geen video geladen", - "none": "Geen", - "normalCasing": "Normaal hoofdlettergebruik", - "notAvailable": "N.v.t.", - "notInstalled": "Niet geïnstalleerd", - "number": "Nummer", - "numberSymbol": "#", - "ocrDotDotDot": "OCR...", - "ocrPercentX": "OCR: {0}%", - "offset": "Offset", - "offsetTimeCodes": "Tijdcodes verschuiven", - "offsetX": "X-verschuiving", - "offsetY": "Y-verschuiving", - "ok": "_OK", - "oneFile": "Eén bestand", - "oneHundredMilliseconds": "100 milliseconden", - "oneSecond": "Eén seconde", - "oneSecondBack": "Eén seconde terug", - "oneSecondForward": "Eén seconde vooruit", - "onlineVideoFeatureNotAvailable": "Functie niet beschikbaar voor online video", - "openContainingFolder": "Map openen", - "openDictionaryFolder": "Woordenboekmap openen", - "openFile": "Bestand openen", - "openImageBasedSubtitle": "Op afbeeldingen gebaseerde ondertitel openen", - "openImageFile": "Afbeeldingsbestand openen", - "openOriginalSubtitleFile": "Origineel ondertitelbestand openen...", - "openOriginalSubtitleFileTitle": "Origineel ondertitelbestand openen", - "openOutputFolder": "Uitvoermap openen", - "openSubtitle": "Ondertitel openen...", - "openSubtitleFileTitle": "Ondertitelbestand openen", - "openSubtitles": "Ondertitels openen...", - "openVideoFile": "Videobestand openen...", - "openVideoFileTitle": "Videobestand openen", - "optimalCharactersPerSecond": "Optimale tekens per seconde", - "options": "Opties", - "originalText": "Originele tekst", - "outline": "Contour", - "outlineColor": "Contourkleur", - "outlineWidth": "Contourbreedte", - "outputFolder": "Uitvoermap", - "outputProperties": "Uitvoereigenschappen", - "overlap": "Overlapping", - "overlapNextX": "Overlap volgende ({0:#;##0.###})", - "overlapPreviousLineX": "Overlap vorige regel ({0:#;##0.###})", - "overlapStartAndEnd": "Overlap begin en eind", - "overlapX": "Overlapping ({0:#;##0.###})", - "overwriteExistingFiles": "Bestaande bestanden overschrijven", - "overwriteFilesInFolderX": "Bestanden in map overschrijven: \"{0}\"", - "overwriteQuestion": "Overschrijven?", - "padding": "Opvulling", - "parameters": "Parameters", - "parsingXDotDotDot": "Bezig met verwerken van {0}...", - "paste": "Plakken", - "pasteNewSelection": "Klembordtekst in nieuwe selectie plakken", - "pause": "Pauze", - "percent": "Procent", - "pickLayer": "Laag instellen", - "pickOllamaModel": "Kies Ollama-model", - "pickOutputFolder": "Kies uitvoermap", - "pickResolutionFromCurrentVideo": "Resolutie van huidige video overnemen", - "pickResolutionFromVideoDotDotDot": "Resolutie van video overnemen...", - "pickSubtitleFile": "Kies ondertitelbestand...", - "pickVideoFile": "Kies videobestand...", - "pickVideoPosition": "Kies videopositie", - "play": "Afspelen", - "playFromStartOfVideo": "Vanaf begin van video afspelen", - "playNext": "Volgende afspelen", - "playSelectedLines": "Geselecteerde regels afspelen", - "playSelectedLinesWithLoop": "Geselecteerde regels herhaald afspelen", - "pleaseEnterAValidValueForX": "Voer een geldige waarde in voor \"{0}\"", - "pleaseWait": "Even geduld a.u.b...", - "position": "Positie", - "positionX": "Positie: {0}", - "postProcessing": "Nabewerking", - "poweredBy": "Mogelijk gemaakt door", - "prefix": "Voorvoegsel", - "preview": "Voorbeeld", - "profile": "Profiel", - "profileName": "Profielnaam", - "profiles": "Profielen", - "property": "Eigenschap", - "question": "Vraag", - "reDownloadX": "{0} opnieuw downloaden", - "reason": "Reden", - "recentFiles": "Recente bestanden", - "redo": "Opnieuw", - "refresh": "Vernieuwen", - "region": "Regio", - "regularExpression": "Reguliere expressie", - "regularExpressionIsNotValid": "Reguliere expressie is niet geldig!", - "relativeToCurrentVideoPosition": "Relatief aan huidige videopositie", - "remove": "Verwijderen", - "removeAlignment": "Uitlijning verwijderen", - "removeAllFormatting": "Alle opmaak verwijderen", - "removeBlankLines": "Lege regels verwijderen", - "removeBold": "Vet verwijderen", - "removeColor": "Kleur verwijderen", - "removeFilter": "Filter verwijderen", - "removeFontName": "Lettertypenaam verwijderen", - "removeFormatting": "Opmaak verwijderen", - "removeItalic": "Cursief verwijderen", - "removeRightToLeftUnicodeTags": "RTL Unicode-tags verwijderen", - "removeSelectedFile": "Geselecteerd bestand verwijderen?", - "removeStyling": "Stijl verwijderen", - "removeTextForHearingImpaired": "Tekst voor slechthorenden verwijderen", - "removeUnderline": "Onderstreping verwijderen", - "rename": "Hernoemen", - "replace": "Vervangen", - "replaceWith": "Vervangen door", - "requiresRestart": "Vereist herstart", - "reset": "Resetten", - "resolution": "Resolutie", - "resolutionX": "Resolutie: {0}", - "reverseRightToLeftStartEnd": "RTL begin/eind omkeren", - "right": "Rechts", - "rightToLeft": "Rechts naar links", - "rules": "Regels", - "saveChangesMessage": "Wilt u de wijzigingen in het huidige ondertitelbestand opslaan?", - "saveChangesTitle": "Wijzigingen opslaan?", - "saveChangesToX": "Wilt u de wijzigingen in \"{0}\" opslaan?", - "saveChangesToXOriginal": "Wilt u de wijzigingen in het originele ondertitelbestand \"{0}\" opslaan?", - "saveDotDotDot": "Opslaan...", - "saveFileAsTitle": "Bestand opslaan als", - "saveImageAs": "Afbeelding opslaan als", - "saveImageAsDotDotDot": "Afbeelding opslaan als...", - "saveOriginalAsTitle": "Origineel opslaan als", - "saveTranslationAsTitle": "Vertaling opslaan als", - "saveVideoAsVideoTitle": "Video opslaan als", - "savedChangesToX": "\"{0}\" opgeslagen", - "savedChangesToXAndY": "\"{0}\" en \"{1}\" opgeslagen", - "savingDotDotDot": "Bezig met opslaan...", - "script": "Script", - "search": "Zoeken", - "searchDirection": "Zoekrichting", - "searchFontNames": "Lettertypen zoeken...", - "searchSubtitleFormats": "Ondertitelformaten zoeken", - "seconds": "Seconden", - "selectAll": "Alles selecteren", - "selectFilesToConvert": "Bestanden kiezen om te converteren", - "selectNone": "Niets selecteren", - "selectSaveFolder": "Kies een map om op te slaan", - "selectSubtitle": "Ondertitel selecteren", - "selectedAFolderToSaveTo": "Map gekozen om in op te slaan", - "selectedLines": "Geselecteerde regels", - "selectedlinesX": "Geselecteerde regels: {0}", - "sensitivity": "Gevoeligheid", - "separator": "Scheidingsteken", - "sessionKey": "Sessiesleutel", - "sessionKeyGenerate": "Nieuwe sleutel genereren", - "setEnd": "Eindtijd instellen", - "setEndAndGoToNext": "Eind instellen en naar volgende", - "setEndAndOffsetTheRest": "Eind instellen en rest verschuiven", - "setFontDotDotDot": "Lettertype instellen...", - "setStart": "Begintijd instellen", - "setStartAndOffsetTheRest": "Begin instellen en rest verschuiven", - "setVideoOffset": "Video-offset instellen", - "settings": "Instellingen", - "shadow": "Schaduw", - "shadowColor": "Schaduwkleur", - "shadowWidth": "Schaduwbreedte", - "shortcut": "Sneltoets", - "shortcutX": "Sneltoets: {0}", - "shortcuts": "Sneltoetsen", - "show": "Weergeven", - "showActorColumn": "Kolom \"Acteur\" weergeven", - "showCpsColumn": "Kolom \"Tekens/sec\" weergeven", - "showDurationColumn": "Kolom \"Duur\" weergeven", - "showGapColumn": "Kolom \"Gat\" weergeven", - "showStartColumn": "Kolom \"Begin\" weergeven", - "showHideColumn": "Kolom \"Verbergen\" weergeven", - "showHistory": "Geschiedenis weergeven", - "showLayerColumn": "Kolom \"Laag\" weergeven", - "showPreview": "Voorbeeld weergeven", - "showShotChangesList": "Shot-wijzigingenlijst weergeven", - "showStyleColumn": "Kolom \"Stijl\" weergeven", - "showTimeCodes": "Tijdcodes weergeven", - "showWpmColumn": "Kolom \"Woorden/min\" weergeven", - "showPixelWidthColumn": "Kolom \"Pixelbreedte\" weergeven", - "shrink": "Verkleinen", - "singleBox": "Enkel kader", - "singleLineLengths": "Lengte enkele regel:", - "singleMode": "Enkele modus", - "size": "Grootte", - "sizeX": "Grootte: {0}", - "skip": "Overslaan", - "skipAll": "Alles overslaan", - "skipOnce": "Eén keer overslaan", - "smart": "Slim", - "snapSelectedLinesToNearestShotChange": "Begin/eind van geselecteerde regels uitlijnen op dichtstbijzijnde shot-wijziging", - "solidColor": "Effen kleur", - "sourceViewX": "Bronweergave - {0}", - "spacing": "Spatiëring", - "speechToTextSelectedLines": "Spraak naar tekst geselecteerd (zie Opties - Instellingen)", - "speechToTextSelectedLinesPromptAlways": "Spraak naar tekst geselecteerde regels (altijd vragen om engine/taal)", - "speechToTextSelectedLinesPromptFirstTime": "Spraak naar tekst geselecteerde regels (vraag engine/taal alleen eerste keer)", - "speed": "Snelheid", - "splitAtTextBoxCursorPosition": "Splitsen op cursorpositie tekstvak", - "splitLine": "Regel splitsen", - "splitLineAtTextBoxCursorPosition": "Regel splitsen op cursorpositie", - "splitLineAtVideoAndTextBoxPosition": "Regel splitsen op video- en tekstvakpositie", - "splitLineAtVideoPosition": "Regel splitsen op videopositie", - "startFrom": "Beginnen vanaf", - "startTime": "Begintijd", - "startingDotDotDot": "Bezig met starten...", - "status": "Status", - "stereo": "Stereo", - "stop": "Stop", - "strikeout": "Doorhalen", - "style": "Stijl", - "styleExaggeration": "Stijl overrijving", - "styleLanguage": "Stijl / Taal", - "styles": "Stijlen", - "subtitleFile": "Ondertitelbestand", - "subtitleFileName": "Bestandsnaam ondertitel", - "subtitleFileSaved": "Ondertitelbestand opgeslagen", - "subtitleFileSavedToX": "Ondertitelbestand opgeslagen in {0}", - "subtitleFiles": "Ondertitelbestanden", - "subtitleFormats": "Ondertitelformaten", - "subtitleLoadedX": "Ondertitel geladen: {0}", - "subtitleXOfY": "Ondertitel {0} van {1}", - "suffix": "Achtervoegsel", - "suggestions": "Suggesties", - "sync": "Synchroniseren", - "syntaxColoring": "Syntax-kleuring", - "system": "Systeem", - "targetEncoding": "Doelcodering", - "targetFormat": "Doelformaat", - "tenHours": "10 uur", - "tenMilliseconds": "10 milliseconden", - "text": "Tekst", - "textColor": "Tekstkleur", - "textFiles": "Tekstbestanden", - "textOrImage": "Tekst/afbeelding", - "threeLetterLanguageCode": "Drieletterige taalcode", - "time": "Tijd", - "timeCodes": "Tijdcodes", - "timing": "Timing", - "title": "Titel", - "to": "Naar", - "toggleCasing": "Hoofdlettergebruik omschakelen", - "toggleDirection": "Richting omschakelen", - "toggleForced": "Geforceerd omschakelen", - "toggleShotChangesAtVideoPosition": "Shot-wijziging op videopositie omschakelen", - "toolbar": "Werkbalk", - "tools": "Gereedschappen", - "topCenter": "Boven-Midden", - "topLeft": "Boven-Links", - "topRight": "Boven-Rechts", - "totalAdjustmentX": "Totale aanpassing: {0}", - "totalFramesX": "Totaal aantal frames: {0:#;##0.##}", - "totalLengthX": "Totale lengte: {0}", - "totalLengthXSplitLine": "Totale lengte: {0} (regel splitsen!)", - "translate": "Vertalen", - "translateRow": "Rij vertalen", - "translation": "Vertaling", - "twoLetterLanguageCode": "Tweeletterige taalcode", - "type": "Type", - "unbreak": "Tekst samenvoegen", - "unbreakLines": "Regels samenvoegen", - "underline": "Onderstrepen", - "undo": "Ongedaan maken", - "unknown": "Onbekend", - "unknownSubtitleFormat": "Onbekend ondertitelformaat", - "unpacking7ZipArchiveDotDotDot": "7-zip archief uitpakken...", - "unpackingX": "Bezig met uitpakken van {0}", - "untitled": "Naamloos", - "update": "Bijwerken", - "updateAndClose": "Bijwerken en sluiten", - "updateDetails": "Details bijwerken", - "updatedBy": "Bijgewerkt door", - "url": "URL", - "usages": "Gebruik", - "use": "Gebruiken", - "useAlways": "Altijd gebruiken", - "useLargerFontForThisWindow": "Groter lettertype gebruiken voor dit venster", - "useOnce": "Eenmalig gebruiken", - "useOutputFolder": "Uitvoermap gebruiken", - "useSourceFolder": "Bronmap gebruiken", - "useSourceResolution": "Bronresolutie gebruiken", - "userName": "Gebruikersnaam", - "userNameAlreadyInUse": "Gebruikersnaam is al in gebruik", - "vertical": "Verticaal", - "video100MsBack": "Video, 100 milliseconden terug", - "video100MsForward": "Video, 100 milliseconden vooruit", - "video500MsBack": "Video, 500 milliseconden terug", - "video500MsForward": "Video, 500 milliseconden vooruit", - "videoCustom1BackX": "Video, aangepaste milliseconden ({0:#,###,##0}) terug, 1", - "videoCustom1ForwardX": "Video, aangepaste milliseconden ({0:#,###,##0}) vooruit, 1", - "videoCustom2BackX": "Video, aangepaste milliseconden ({0:#,###,##0}) terug, 2", - "videoCustom2ForwardX": "Video, aangepaste milliseconden ({0:#,###,##0}) vooruit, 2", - "videoEncodingX": "Videocodering: {0}", - "videoExtension": "Videobestandsextensie", - "videoFile": "Videobestand", - "videoFileGeneratedX": "Videobestand gegenereerd: \"{0}\"", - "videoFiles": "Videobestanden", - "videoInformation": "Video-info", - "videoOffset": "Video-offset", - "videoOneFrameBack": "Video, één frame terug", - "videoOneFrameForward": "Video, één frame vooruit", - "videoOneSecondBack": "Video, één seconde terug", - "videoOneSecondForward": "Video, één seconde vooruit", - "videoPlayer": "Videospeler", - "videoPosition": "Videopositie", - "videoResolution": "Videoresolutie", - "viewX": "{0} bekijken", - "visible": "Zichtbaar", - "voice": "Stem", - "warning": "Waarschuwing", - "waveformCenterOnVideoPosition": "Golfvorm centreren op videopositie", - "waveformPasteFromClipboard": "Plakken van klembord", - "waveformSpectrogram": "Golfvorm/spectrogram", - "webServiceUrl": "Webservice URL", - "width": "Breedte", - "windowPositionAndSize": "Vensterpositie en -grootte", - "wordsPerMin": "Woorden/min", - "pixelWidth": "Pixelbreedte", - "wpm": "Woorden/min", - "xFiles": "{0:#,###,##0} bestanden", - "xFilesConvertedInY": "{0:#,###,##0} bestanden geconverteerd in {1}", - "xNotFound": "\"{0}\" niet gevonden", - "xRequiresAnApiKey": "{0} vereist een API-sleutel", - "xSeconds": "{0:0.0##} seconden", - "xSubtitles": "{0:#,###,##0} ondertitels", - "yes": "Ja", - "copyToClipboard": "Kopiëren naar klembord", - "playCurrent": "Huidige afspelen", - "leftMargin": "Linkermarge", - "rightMargin": "Rechtermarge", - "installed": "Geïnstalleerd", - "advancedDotDotDot": "Geavanceerd...", - "chooseAlignment": "Kies uitlijning" +{ + "Title": "Subtitle Edit", + "TranslatedBy": "", + "CultureName": "nl-NL", + "General": { + "Abort": "Afbreken", + "Actor": "Acteur", + "Actors": "Acteurs", + "Add": "Toevoegen", + "AddDotDotDot": "Toevoegen...", + "AddToNamesListCaseSensitive": "Toevoegen aan namenlijst (hoofdlettergevoelig)", + "AddToUserDictionary": "Toevoegen aan gebruikerswoordenboek", + "AddVideoFiles": "Videobestanden toevoegen...", + "AdjustAlpha": "Alpha aanpassen (transparantie)", + "AdjustDisplayDuration": "Weergaveduur aanpassen", + "Adjustment": "Aanpassing", + "Advanced": "Geavanceerd", + "AdvancedSettings": "Geavanceerde instellingen", + "After": "Na", + "Alignment": "Uitlijning", + "AlignmentDotDotDot": "Uitlijning...", + "AlignmentX": "Stel uitlijning \"{0}\" in voor geselecteerde regels", + "All": "Alle", + "AllFiles": "Alle bestanden", + "AlphaAdjustment": "Alpha-aanpassing", + "AphaThreshold": "Alpha-drempelwaarde", + "ApiKey": "API-sleutel", + "ApiSecret": "Geheim", + "Appearance": "Uiterlijk", + "Append": "Toevoegen (achteraan)", + "Apply": "Toepassen", + "ApplyTo": "Toepassen op", + "Ascending": "Oplopend", + "AttachDotDotDot": "Bijvoegen...", + "AudioFiles": "Audiobestanden", + "AudioVisualizer": "Audiovisualisatie", + "Auto": "Auto", + "AutoBreak": "Regels automatisch afbreken", + "AutoContinue": "Automatisch doorgaan", + "AutoTranslate": "Automatisch vertalen", + "Autodetect": "Automatisch detecteren", + "Background": "Achtergrond", + "BackgroundColor": "Achtergrondkleur", + "Backward": "Achteruit", + "BatchMode": "Batchmodus", + "BdnXml": "BDN/xml", + "Before": "Voor", + "BeforeX": "Voor \"{0}\"", + "Beginning": "Begin", + "BluRaySup": "Blu-ray (sup)", + "Bold": "Vet", + "BookmarkAdd": "Bladwijzer toevoegen", + "BookmarkAddForSelectedLinesX": "Bladwijzer toevoegen voor {0} geselecteerde regels", + "BookmarkClearQuestion": "Alle bladwijzers wissen?", + "BookmarkDeleteSelectedQuestion": "Geselecteerde bladwijzer verwijderen?", + "BookmarkDotDotDot": "Bladwijzer...", + "BookmarkEdit": "Bladwijzer bewerken", + "BookmarkEditForSelectedLinesX": "Bladwijzer bewerken voor {0} geselecteerde regels", + "BookmarksList": "Bladwijzers weergeven", + "BorderColor": "Randkleur", + "BorderStyle": "Randstijl", + "BottomCenter": "Onder-Midden", + "BottomLeft": "Onder-Links", + "BottomRight": "Onder-Rechts", + "Box": "Kader", + "BoxColor": "Kaderkleur", + "BoxCornerRadius": "Kader hoekstraal", + "BoxPerLine": "Kader per regel", + "BridgeGaps": "Gaten overbruggen", + "Cancel": "_Annuleren", + "Cancelled": "Geannuleerd", + "CaseInsensitive": "Niet hoofdlettergevoelig", + "CaseSensitive": "Hoofdlettergevoelig", + "Category": "Categorie", + "Center": "Midden", + "CenterHorizontally": "Horizontaal centreren", + "CenterVertically": "Verticaal centreren", + "Change": "Wijzigen", + "ChangeAll": "Alles wijzigen", + "ChangeCasing": "Hoofdlettergebruik wijzigen", + "ChangeFormatting": "Opmaak wijzigen", + "ChangeFrameRate": "Framerate wijzigen", + "ChangeLanguageFilter": "Taalfilter wijzigen...", + "ChangeOnce": "Eén keer wijzigen", + "ChangeSpeed": "Snelheid wijzigen", + "Character": "Teken", + "Characters": "Tekens", + "CharsPerSec": "Tekens/sec", + "ChooseColorDotDotDot": "Kies kleur...", + "ChooseImageFiles": "Kies afbeeldingen", + "Class": "Klasse", + "Classic": "Klassiek", + "Clear": "Wissen", + "Close": "Sluiten", + "Codec": "Codec", + "Collapse": "Inklappen", + "Color": "Kleur", + "ColorDotDotDot": "Kleur...", + "Column": "Kolom", + "ConsoleLog": "Consolelog", + "ContentAlignment": "Inhoudsuitlijning", + "ConversionCancelledByUser": "Conversie geannuleerd door gebruiker", + "Convert": "Converteren", + "Converted": "Geconverteerd", + "ConvertingDotDotDot": "Converteren...", + "ConvertingXofYDotDoDot": "Converteren van {0:#,###,##0}/{1:#,###,##0}...", + "Copy": "Kopiëren", + "CopyImageToClipboard": "Afbeelding naar klembord kopiëren", + "CopyTextToClipboard": "Tekst naar klembord kopiëren", + "CouldNotSaveFileXErrorY": "Kan bestand \"{0}\" niet opslaan. Fout: {1}", + "Count": "Aantal", + "Cps": "Tekens/sec", + "CurrentSubtitle": "Huidige ondertitel", + "CurrentVideoPosition": "Huidige videopositie", + "Cut": "Knippen", + "Dark": "Donker", + "DateAndTime": "Datum en tijd", + "Default": "Standaard", + "Delete": "Verwijderen", + "DeleteAtPosition": "Ondertitel op videopositie verwijderen", + "DeleteCurrentLine": "Huidige regel verwijderen", + "DeleteFirstLines": "Eerste regels verwijderen", + "DeleteLastLines": "Laatste regels verwijderen", + "DeleteLineXPrompt": "Regelnummer {0} verwijderen?", + "DeleteLines": "Regels verwijderen", + "DeleteLinesContainingText": "Regels met tekst verwijderen", + "DeleteXLinesPrompt": "{0} regels verwijderen?", + "Description": "Beschrijving", + "Dictionary": "Woordenboek", + "DiskSpace": "Schijfruimte", + "DoNoChange": "Niet wijzigen", + "Done": "Gereed", + "DoubleWords": "Dubbele woorden", + "DoubleLines": "Dubbele regels", + "Download": "Downloaden", + "DownloadX": "Download {0}", + "DownloadingX": "Bezig met downloaden van {0}", + "DownloadingXPercent": "Downloaden: {0}%", + "Duplicate": "Dupliceren", + "Duration": "Duur", + "DurationMinutes": "Duur in minuten", + "Edit": "Bewerken", + "EditDotDotDot": "Bewerken...", + "Editing": "Bezig met bewerken", + "Effect": "Effect", + "Enabled": "Ingeschakeld", + "Encoding": "Codering", + "EndTime": "Eindtijd", + "Engine": "Engine", + "EnterProfileName": "Voer profielnaam in", + "Error": "Fout", + "ErrorX": "Fout: {0}", + "Example": "Voorbeeld", + "ExampleX": "Voorbeeld: {0}", + "Expand": "Uitvouwen", + "Export": "Exporteren", + "ExportDotDotDot": "Exporteren...", + "ExportToX": "Exporteren naar {0}", + "ExtendAfter": "Verlengen/inkorten naar volgende regel", + "ExtendBefore": "Verlengen/inkorten naar vorige regel", + "ExtendSelectedLinesToNextShotChangeOrNextSubtitle": "Geselecteerde regels verlengen naar volgende shot-wijziging (of ondertitel)", + "ExtendSelectedToNext": "Geselecteerde verlengen naar volgende", + "ExtendSelectedToPrevious": "Geselecteerde verlengen naar vorige", + "ExtractingAudioClips": "Audiofragmenten extraheren...", + "Fade": "Fade", + "FetchFirstWordFromNextSubtitle": "Eerste woord van volgende ondertitel ophalen", + "FileAlreadyExists": "Bestand bestaat al", + "FileExtension": "Bestandsextensie", + "FileName": "Bestandsnaam", + "FileNameX": "Bestandsnaam: {0}", + "FileNameXAndSize": "Bestandsnaam: {0} ({1})", + "FileSaved": "Bestand opgeslagen", + "FileSavedToX": "Bestand opgeslagen in {0}", + "FileXAlreadyExists": "Bestand \"{0}\" bestaat al.", + "FileXOfY": "Bestand {0} van {1}", + "Filter": "Filter", + "FilterByLayer": "Filteren op laag", + "Find": "Zoeken", + "FindNext": "Volgende zoeken", + "FindTextX": "Tekst zoeken - {0}", + "FiveHundredMilliseconds": "500 milliseconden", + "FiveSeconds": "Vijf seconden", + "Fix": "Herstellen", + "FixCommonErrors": "Veelvoorkomende fouten herstellen", + "FixRightToLeft": "Rechts-naar-links herstellen", + "FixRightToLeftViaUnicodeTags": "RTL herstellen via Unicode-tags", + "FixedValue": "Vaste waarde", + "FocusSelectedLine": "Focus op geselecteerde regel (scrollen in rooster)", + "Font": "Lettertype", + "FontColor": "Tekstkleur", + "FontHeight": "Letterhoogte", + "FontName": "Lettertypenaam", + "FontNameDotDotDot": "Lettertypenaam...", + "FontSize": "Lettergrootte", + "Fonts": "Lettertypen", + "Footer": "Voettekst", + "Forced": "Geforceerd", + "Foreground": "Voorgrond", + "Format": "Formaat", + "Forward": "Vooruit", + "FoundNoMatches": "Geen overeenkomsten gevonden", + "FoundOneMatch": "Eén overeenkomst gevonden", + "FoundXInLineYZ": "\"{0}\" gevonden in regel {1}, positie {2}", + "FoundXMatches": "{0} overeenkomsten gevonden", + "FrameRate": "Framerate", + "FrameRateX": "Framerate: {0:0.0###}", + "Frames": "Frames", + "From": "Van", + "FromCurrentVideoPosition": "vanaf huidige videopositie", + "Gap": "Gat", + "General": "Algemeen", + "GeneralText": "Algemeen", + "Generate": "Genereren", + "GenerateImportShotChanges": "Shot-wijzigingen genereren/importeren", + "Generating": "Bezig met genereren...", + "GeneratingImageXofY": "Afbeelding {0:#,##0} van {1:#,##0} genereren...", + "GeneratingWavFile": "WAV-bestand genereren...", + "GetAudioClips": "Audiofragmenten ophalen", + "GoTo": "Ga naar", + "GoToLineNumber": "Ga naar regelnummer", + "GoToNextShotChange": "Ga naar volgende shot-wijziging", + "GoToPreviousShotChange": "Ga naar vorige shot-wijziging", + "GoogleIt": "Google het", + "Group": "Groep", + "Header": "Koptekst", + "Height": "Hoogte", + "Help": "Help", + "Hex": "Hex", + "Hide": "Verbergen", + "HidePreview": "Voorbeeld verbergen", + "History": "Geschiedenis", + "Horizontal": "Horizontaal", + "HourMinutesSecondsDecimalSeparatorMilliseconds": "Uur:min:sec{0}ms", + "HourMinutesSecondsFrames": "Uur:min:sec:frames", + "Ip": "IP", + "Id": "ID", + "Image": "Afbeelding", + "ImageSaved": "Afbeelding opgeslagen", + "ImagedBasedSubtitles": "Ondertitels gebaseerd op afbeeldingen", + "Images": "Afbeeldingen", + "ImagesWithTimeCode": "Afbeeldingen met tijdcode", + "Import": "Importeren", + "ImportDotDotDot": "Importeren...", + "Include": "Inclusief", + "Information": "Informatie", + "InsertAfter": "Invoegen na", + "InsertAtPositionAndFocusTextBox": "Ondertitel op videopositie invoegen en tekstvak focus geven", + "InsertAtPositionNoFocusTextBox": "Ondertitel op videopositie invoegen (geen focus tekstvak)", + "InsertBefore": "Invoegen voor", + "InsertLine": "Regel invoegen", + "InsertNewSelection": "Nieuwe selectie invoegen", + "InsertSubtitleAfterCurrentLine": "Ondertitel invoegen na huidige regel...", + "InsertSubtitleFileAtVideoPositionDotDotDot": "Ondertitelbestand invoegen op videopositie...", + "InspectAdditions": "Toevoegingen inspecteren...", + "InvertSelection": "Selectie omkeren", + "IsDefault": "Is standaard", + "Italic": "Cursief", + "KeepExistingTimeCodes": "Bestaande tijdcodes behouden (geen video-offset toevoegen)", + "KeyFile": "Sleutelbestand", + "Language": "Taal", + "LanguagePostFix": "Taal-postfix (mkv/mp4)", + "Layer": "Laag", + "LayerFilterOn": "Laagfilter aan", + "Left": "Links", + "Light": "Licht", + "LineHeigth": "Regelhoogte", + "LineNumber": "Regel#", + "LineXColumnY": "Regel {0}, kolom {1}", + "Lines": "Regels", + "LinesAddedX": "Regels toegevoegd: {0}", + "LinesChangedX": "Regels gewijzigd: {0}", + "LinesDeletedX": "Regels verwijderd: {0}", + "ListErrors": "Fouten weergeven", + "LoadDefaults": "Standaardwaarden laden", + "LockTimeCodes": "Tijdcodes vergrendelen", + "Logo": "Logo", + "Margin": "Marge", + "Match": "Overeenkomst", + "MaxCharactersPerSecond": "Max. tekens per seconde", + "MediaInformation": "Media-informatie", + "MergeAfter": "Samenvoegen met volgende regel", + "MergeBefore": "Samenvoegen met vorige regel", + "MergeLines": "Regels samenvoegen", + "MergeLinesWithSameText": "Regels met dezelfde tekst samenvoegen", + "MergeLinesWithSameTimeCodes": "Regels met dezelfde tijdcodes samenvoegen", + "MergeSelected": "Geselecteerde samenvoegen", + "MergeSelectedAsDialog": "Geselecteerde samenvoegen als dialoog", + "MergeSelectedLines": "Geselecteerde regels samenvoegen", + "MergeSelectedLinesDialog": "Geselecteerde regels samenvoegen als dialoog", + "MergeWithLineAfterAndAutoBreak": "Samenvoegen met volgende regel en auto-afbreken", + "MergeWithLineAfterKeepBreaks": "Samenvoegen met volgende regel (afbrekingen behouden)", + "MergeWithLineBeforeAndAutoBreak": "Samenvoegen met vorige regel en auto-afbreken", + "MergeWithLineBeforeKeepBreaks": "Samenvoegen met vorige regel (afbrekingen behouden)", + "MiddleCenter": "Midden-Centrum", + "MiddleLeft": "Midden-Links", + "MiddleRight": "Midden-Rechts", + "Milliseconds": "Milliseconden", + "Model": "Model", + "Models": "Modellen", + "More": "Meer", + "MoreInfo": "Meer info", + "MoveAllShotChangeOneFrameBack": "Alle shot-wijzigingen één frame terugplaatsen", + "MoveAllShotChangeOneFrameForward": "Alle shot-wijzigingen één frame vooruitplaatsen", + "MoveDown": "Omlaag verplaatsen", + "MoveUp": "Omhoog verplaatsen", + "MultipleReplace": "Meervoudig vervangen", + "Name": "Naam", + "Negative": "Negatief", + "New": "Nieuw", + "NewDotDotDot": "Nieuw...", + "NewProfile": "Nieuw profiel", + "NewSubtitleStartKeyDownSetEndKeyUp": "Ondertitel invoegen: Start bij toets indrukken, eind bij loslaten", + "SetSubtitleStartAtVideoPositionSetEndAtKeyUpAndGoToNext": "Start op videopositie, eind bij loslaten toets, en ga naar volgende", + "No": "Nee", + "NoFilesToConvert": "Geen bestanden om te converteren", + "NoLanguageCode": "Geen taalcode", + "NoSubtitleLoaded": "Geen ondertitel geladen", + "NoSubtitlesFound": "Geen ondertitels gevonden!", + "NoSymbolLines": "#Regels", + "NoVideoLoaded": "Geen video geladen", + "None": "Geen", + "NormalCasing": "Normaal hoofdlettergebruik", + "NotAvailable": "N.v.t.", + "NotInstalled": "Niet geïnstalleerd", + "Number": "Nummer", + "NumberSymbol": "#", + "OcrDotDotDot": "OCR...", + "OcrPercentX": "OCR: {0}%", + "Offset": "Offset", + "OffsetTimeCodes": "Tijdcodes verschuiven", + "OffsetX": "X-verschuiving", + "OffsetY": "Y-verschuiving", + "Ok": "_OK", + "OneFile": "Eén bestand", + "OneHundredMilliseconds": "100 milliseconden", + "OneSecond": "Eén seconde", + "OneSecondBack": "Eén seconde terug", + "OneSecondForward": "Eén seconde vooruit", + "OnlineVideoFeatureNotAvailable": "Functie niet beschikbaar voor online video", + "OpenContainingFolder": "Map openen", + "OpenDictionaryFolder": "Woordenboekmap openen", + "OpenFile": "Bestand openen", + "OpenImageBasedSubtitle": "Op afbeeldingen gebaseerde ondertitel openen", + "OpenImageFile": "Afbeeldingsbestand openen", + "OpenOriginalSubtitleFile": "Origineel ondertitelbestand openen...", + "OpenOriginalSubtitleFileTitle": "Origineel ondertitelbestand openen", + "OpenOutputFolder": "Uitvoermap openen", + "OpenSubtitle": "Ondertitel openen...", + "OpenSubtitleFileTitle": "Ondertitelbestand openen", + "OpenSubtitles": "Ondertitels openen...", + "OpenVideoFile": "Videobestand openen...", + "OpenVideoFileTitle": "Videobestand openen", + "OptimalCharactersPerSecond": "Optimale tekens per seconde", + "Options": "Opties", + "OriginalText": "Originele tekst", + "Outline": "Contour", + "OutlineColor": "Contourkleur", + "OutlineWidth": "Contourbreedte", + "OutputFolder": "Uitvoermap", + "OutputProperties": "Uitvoereigenschappen", + "Overlap": "Overlapping", + "OverlapNextX": "Overlap volgende ({0:#;##0.###})", + "OverlapPreviousLineX": "Overlap vorige regel ({0:#;##0.###})", + "OverlapStartAndEnd": "Overlap begin en eind", + "OverlapX": "Overlapping ({0:#;##0.###})", + "OverwriteExistingFiles": "Bestaande bestanden overschrijven", + "OverwriteFilesInFolderX": "Bestanden in map overschrijven: \"{0}\"", + "OverwriteQuestion": "Overschrijven?", + "Padding": "Opvulling", + "Parameters": "Parameters", + "ParsingXDotDotDot": "Bezig met verwerken van {0}...", + "Paste": "Plakken", + "PasteNewSelection": "Klembordtekst in nieuwe selectie plakken", + "Pause": "Pauze", + "Percent": "Procent", + "PickLayer": "Laag instellen", + "PickOllamaModel": "Kies Ollama-model", + "PickOutputFolder": "Kies uitvoermap", + "PickResolutionFromCurrentVideo": "Resolutie van huidige video overnemen", + "PickResolutionFromVideoDotDotDot": "Resolutie van video overnemen...", + "PickSubtitleFile": "Kies ondertitelbestand...", + "PickVideoFile": "Kies videobestand...", + "PickVideoPosition": "Kies videopositie", + "Play": "Afspelen", + "PlayFromStartOfVideo": "Vanaf begin van video afspelen", + "PlayNext": "Volgende afspelen", + "PlaySelectedLines": "Geselecteerde regels afspelen", + "PlaySelectedLinesWithLoop": "Geselecteerde regels herhaald afspelen", + "PleaseEnterAValidValueForX": "Voer een geldige waarde in voor \"{0}\"", + "PleaseWait": "Even geduld a.u.b...", + "Position": "Positie", + "PositionX": "Positie: {0}", + "PostProcessing": "Nabewerking", + "PoweredBy": "Mogelijk gemaakt door", + "Prefix": "Voorvoegsel", + "Preview": "Voorbeeld", + "Profile": "Profiel", + "ProfileName": "Profielnaam", + "Profiles": "Profielen", + "Property": "Eigenschap", + "Question": "Vraag", + "ReDownloadX": "{0} opnieuw downloaden", + "Reason": "Reden", + "RecentFiles": "Recente bestanden", + "Redo": "Opnieuw", + "Refresh": "Vernieuwen", + "Region": "Regio", + "RegularExpression": "Reguliere expressie", + "RegularExpressionIsNotValid": "Reguliere expressie is niet geldig!", + "RelativeToCurrentVideoPosition": "Relatief aan huidige videopositie", + "Remove": "Verwijderen", + "RemoveAlignment": "Uitlijning verwijderen", + "RemoveAllFormatting": "Alle opmaak verwijderen", + "RemoveBlankLines": "Lege regels verwijderen", + "RemoveBold": "Vet verwijderen", + "RemoveColor": "Kleur verwijderen", + "RemoveFilter": "Filter verwijderen", + "RemoveFontName": "Lettertypenaam verwijderen", + "RemoveFormatting": "Opmaak verwijderen", + "RemoveItalic": "Cursief verwijderen", + "RemoveRightToLeftUnicodeTags": "RTL Unicode-tags verwijderen", + "RemoveSelectedFile": "Geselecteerd bestand verwijderen?", + "RemoveStyling": "Stijl verwijderen", + "RemoveTextForHearingImpaired": "Tekst voor slechthorenden verwijderen", + "RemoveUnderline": "Onderstreping verwijderen", + "Rename": "Hernoemen", + "Replace": "Vervangen", + "ReplaceWith": "Vervangen door", + "RequiresRestart": "Vereist herstart", + "Reset": "Resetten", + "Resolution": "Resolutie", + "ResolutionX": "Resolutie: {0}", + "ReverseRightToLeftStartEnd": "RTL begin/eind omkeren", + "Right": "Rechts", + "RightToLeft": "Rechts naar links", + "Rules": "Regels", + "SaveChangesMessage": "Wilt u de wijzigingen in het huidige ondertitelbestand opslaan?", + "SaveChangesTitle": "Wijzigingen opslaan?", + "SaveChangesToX": "Wilt u de wijzigingen in \"{0}\" opslaan?", + "SaveChangesToXOriginal": "Wilt u de wijzigingen in het originele ondertitelbestand \"{0}\" opslaan?", + "SaveDotDotDot": "Opslaan...", + "SaveFileAsTitle": "Bestand opslaan als", + "SaveImageAs": "Afbeelding opslaan als", + "SaveImageAsDotDotDot": "Afbeelding opslaan als...", + "SaveOriginalAsTitle": "Origineel opslaan als", + "SaveTranslationAsTitle": "Vertaling opslaan als", + "SaveVideoAsVideoTitle": "Video opslaan als", + "SavedChangesToX": "\"{0}\" opgeslagen", + "SavedChangesToXAndY": "\"{0}\" en \"{1}\" opgeslagen", + "SavingDotDotDot": "Bezig met opslaan...", + "Script": "Script", + "Search": "Zoeken", + "SearchDirection": "Zoekrichting", + "SearchFontNames": "Lettertypen zoeken...", + "SearchSubtitleFormats": "Ondertitelformaten zoeken", + "Seconds": "Seconden", + "SelectAll": "Alles selecteren", + "SelectFilesToConvert": "Bestanden kiezen om te converteren", + "SelectNone": "Niets selecteren", + "SelectSaveFolder": "Kies een map om op te slaan", + "SelectSubtitle": "Ondertitel selecteren", + "SelectedAFolderToSaveTo": "Map gekozen om in op te slaan", + "SelectedLines": "Geselecteerde regels", + "SelectedlinesX": "Geselecteerde regels: {0}", + "Sensitivity": "Gevoeligheid", + "Separator": "Scheidingsteken", + "SessionKey": "Sessiesleutel", + "SessionKeyGenerate": "Nieuwe sleutel genereren", + "SetEnd": "Eindtijd instellen", + "SetEndAndGoToNext": "Eind instellen en naar volgende", + "SetEndAndOffsetTheRest": "Eind instellen en rest verschuiven", + "SetFontDotDotDot": "Lettertype instellen...", + "SetStart": "Begintijd instellen", + "SetStartAndOffsetTheRest": "Begin instellen en rest verschuiven", + "SetVideoOffset": "Video-offset instellen", + "Settings": "Instellingen", + "Shadow": "Schaduw", + "ShadowColor": "Schaduwkleur", + "ShadowWidth": "Schaduwbreedte", + "Shortcut": "Sneltoets", + "ShortcutX": "Sneltoets: {0}", + "Shortcuts": "Sneltoetsen", + "Show": "Weergeven", + "ShowActorColumn": "Kolom \"Acteur\" weergeven", + "ShowCpsColumn": "Kolom \"Tekens/sec\" weergeven", + "ShowDurationColumn": "Kolom \"Duur\" weergeven", + "ShowGapColumn": "Kolom \"Gat\" weergeven", + "ShowStartColumn": "Kolom \"Begin\" weergeven", + "ShowHideColumn": "Kolom \"Verbergen\" weergeven", + "ShowHistory": "Geschiedenis weergeven", + "ShowLayerColumn": "Kolom \"Laag\" weergeven", + "ShowPreview": "Voorbeeld weergeven", + "ShowShotChangesList": "Shot-wijzigingenlijst weergeven", + "ShowStyleColumn": "Kolom \"Stijl\" weergeven", + "ShowTimeCodes": "Tijdcodes weergeven", + "ShowWpmColumn": "Kolom \"Woorden/min\" weergeven", + "ShowPixelWidthColumn": "Kolom \"Pixelbreedte\" weergeven", + "Shrink": "Verkleinen", + "SingleBox": "Enkel kader", + "SingleLineLengths": "Lengte enkele regel:", + "SingleMode": "Enkele modus", + "Size": "Grootte", + "SizeX": "Grootte: {0}", + "Skip": "Overslaan", + "SkipAll": "Alles overslaan", + "SkipOnce": "Eén keer overslaan", + "Smart": "Slim", + "SnapSelectedLinesToNearestShotChange": "Begin/eind van geselecteerde regels uitlijnen op dichtstbijzijnde shot-wijziging", + "SolidColor": "Effen kleur", + "SourceViewX": "Bronweergave - {0}", + "Spacing": "Spatiëring", + "SpeechToTextSelectedLines": "Spraak naar tekst geselecteerd (zie Opties - Instellingen)", + "SpeechToTextSelectedLinesPromptAlways": "Spraak naar tekst geselecteerde regels (altijd vragen om engine/taal)", + "SpeechToTextSelectedLinesPromptFirstTime": "Spraak naar tekst geselecteerde regels (vraag engine/taal alleen eerste keer)", + "Speed": "Snelheid", + "SplitAtTextBoxCursorPosition": "Splitsen op cursorpositie tekstvak", + "SplitLine": "Regel splitsen", + "SplitLineAtTextBoxCursorPosition": "Regel splitsen op cursorpositie", + "SplitLineAtVideoAndTextBoxPosition": "Regel splitsen op video- en tekstvakpositie", + "SplitLineAtVideoPosition": "Regel splitsen op videopositie", + "StartFrom": "Beginnen vanaf", + "StartTime": "Begintijd", + "StartingDotDotDot": "Bezig met starten...", + "Status": "Status", + "Stereo": "Stereo", + "Stop": "Stop", + "Strikeout": "Doorhalen", + "Style": "Stijl", + "StyleExaggeration": "Stijl overrijving", + "StyleLanguage": "Stijl / Taal", + "Styles": "Stijlen", + "SubtitleFile": "Ondertitelbestand", + "SubtitleFileName": "Bestandsnaam ondertitel", + "SubtitleFileSaved": "Ondertitelbestand opgeslagen", + "SubtitleFileSavedToX": "Ondertitelbestand opgeslagen in {0}", + "SubtitleFiles": "Ondertitelbestanden", + "SubtitleFormats": "Ondertitelformaten", + "SubtitleLoadedX": "Ondertitel geladen: {0}", + "SubtitleXOfY": "Ondertitel {0} van {1}", + "Suffix": "Achtervoegsel", + "Suggestions": "Suggesties", + "Sync": "Synchroniseren", + "SyntaxColoring": "Syntax-kleuring", + "System": "Systeem", + "TargetEncoding": "Doelcodering", + "TargetFormat": "Doelformaat", + "TenHours": "10 uur", + "TenMilliseconds": "10 milliseconden", + "Text": "Tekst", + "TextColor": "Tekstkleur", + "TextFiles": "Tekstbestanden", + "TextOrImage": "Tekst/afbeelding", + "ThreeLetterLanguageCode": "Drieletterige taalcode", + "Time": "Tijd", + "TimeCodes": "Tijdcodes", + "Timing": "Timing", + "Title": "Titel", + "To": "Naar", + "ToggleCasing": "Hoofdlettergebruik omschakelen", + "ToggleDirection": "Richting omschakelen", + "ToggleForced": "Geforceerd omschakelen", + "ToggleShotChangesAtVideoPosition": "Shot-wijziging op videopositie omschakelen", + "Toolbar": "Werkbalk", + "Tools": "Gereedschappen", + "TopCenter": "Boven-Midden", + "TopLeft": "Boven-Links", + "TopRight": "Boven-Rechts", + "TotalAdjustmentX": "Totale aanpassing: {0}", + "TotalFramesX": "Totaal aantal frames: {0:#;##0.##}", + "TotalLengthX": "Totale lengte: {0}", + "TotalLengthXSplitLine": "Totale lengte: {0} (regel splitsen!)", + "Translate": "Vertalen", + "TranslateRow": "Rij vertalen", + "Translation": "Vertaling", + "TwoLetterLanguageCode": "Tweeletterige taalcode", + "Type": "Type", + "Unbreak": "Tekst samenvoegen", + "UnbreakLines": "Regels samenvoegen", + "Underline": "Onderstrepen", + "Undo": "Ongedaan maken", + "Unknown": "Onbekend", + "UnknownSubtitleFormat": "Onbekend ondertitelformaat", + "Unpacking7ZipArchiveDotDotDot": "7-zip archief uitpakken...", + "UnpackingX": "Bezig met uitpakken van {0}", + "Untitled": "Naamloos", + "Update": "Bijwerken", + "UpdateAndClose": "Bijwerken en sluiten", + "UpdateDetails": "Details bijwerken", + "UpdatedBy": "Bijgewerkt door", + "Url": "URL", + "Usages": "Gebruik", + "Use": "Gebruiken", + "UseAlways": "Altijd gebruiken", + "UseLargerFontForThisWindow": "Groter lettertype gebruiken voor dit venster", + "UseOnce": "Eenmalig gebruiken", + "UseOutputFolder": "Uitvoermap gebruiken", + "UseSourceFolder": "Bronmap gebruiken", + "UseSourceResolution": "Bronresolutie gebruiken", + "UserName": "Gebruikersnaam", + "UserNameAlreadyInUse": "Gebruikersnaam is al in gebruik", + "Vertical": "Verticaal", + "Video100MsBack": "Video, 100 milliseconden terug", + "Video100MsForward": "Video, 100 milliseconden vooruit", + "Video500MsBack": "Video, 500 milliseconden terug", + "Video500MsForward": "Video, 500 milliseconden vooruit", + "VideoCustom1BackX": "Video, aangepaste milliseconden ({0:#,###,##0}) terug, 1", + "VideoCustom1ForwardX": "Video, aangepaste milliseconden ({0:#,###,##0}) vooruit, 1", + "VideoCustom2BackX": "Video, aangepaste milliseconden ({0:#,###,##0}) terug, 2", + "VideoCustom2ForwardX": "Video, aangepaste milliseconden ({0:#,###,##0}) vooruit, 2", + "VideoEncodingX": "Videocodering: {0}", + "VideoExtension": "Videobestandsextensie", + "VideoFile": "Videobestand", + "VideoFileGeneratedX": "Videobestand gegenereerd: \"{0}\"", + "VideoFiles": "Videobestanden", + "VideoInformation": "Video-info", + "VideoOffset": "Video-offset", + "VideoOneFrameBack": "Video, één frame terug", + "VideoOneFrameForward": "Video, één frame vooruit", + "VideoOneSecondBack": "Video, één seconde terug", + "VideoOneSecondForward": "Video, één seconde vooruit", + "VideoPlayer": "Videospeler", + "VideoPosition": "Videopositie", + "VideoResolution": "Videoresolutie", + "ViewX": "{0} bekijken", + "Visible": "Zichtbaar", + "Voice": "Stem", + "Warning": "Waarschuwing", + "WaveformCenterOnVideoPosition": "Golfvorm centreren op videopositie", + "WaveformPasteFromClipboard": "Plakken van klembord", + "WaveformSpectrogram": "Golfvorm/spectrogram", + "WebServiceUrl": "Webservice URL", + "Width": "Breedte", + "WindowPositionAndSize": "Vensterpositie en -grootte", + "WordsPerMin": "Woorden/min", + "PixelWidth": "Pixelbreedte", + "Wpm": "Woorden/min", + "XFiles": "{0:#,###,##0} bestanden", + "XFilesConvertedInY": "{0:#,###,##0} bestanden geconverteerd in {1}", + "XNotFound": "\"{0}\" niet gevonden", + "XRequiresAnApiKey": "{0} vereist een API-sleutel", + "XSeconds": "{0:0.0##} seconden", + "XSubtitles": "{0:#,###,##0} ondertitels", + "Yes": "Ja", + "CopyToClipboard": "Kopiëren naar klembord", + "PlayCurrent": "Huidige afspelen", + "LeftMargin": "Linkermarge", + "RightMargin": "Rechtermarge", + "Installed": "Geïnstalleerd", + "AdvancedDotDotDot": "Geavanceerd...", + "ChooseAlignment": "Kies uitlijning", + "MaxWidthPixels": "Maximale breedte (pixels)", + "SampleText": "Voorbeeldtekst", + "BoxWidthPixels": "Vakbreedte (pixels)", + "FadeInOut": "In-/uitfaden", + "Alpha": "Alfa", + "PickResolution": "Kies resolutie", + "ManualSync": "Handmatige synchronisatie" }, - "main": { - "menu": { - "file": "_Bestand", - "new": "_Nieuw", - "newKeepVideo": "Nieuw (video _behouden)", - "open": "_Openen...", - "openKeepVideo": "Openen (_video behouden)...", - "openOriginal": "Origineel _openen...", - "closeOriginal": "Origineel _sluiten", - "reopen": "_Heropenen...", - "clearRecentFiles": "Recente bestanden _wissen", - "restoreAutoBackup": "Auto-_backup herstellen...", - "save": "_Opslaan", - "saveAs": "Opslaan _als...", - "openContainingFolder": "Bevattende _map openen", - "compare": "Vergelij_ken...", - "statistics": "Statistieken...", - "import": "_Importeren", - "export": "_Exporteren", - "exit": "A_fsluiten", - "edit": "Be_werken", - "undo": "_Ongedaan maken", - "redo": "_Opnieuw", - "showHistory": "Ge_schiedenis voor ongedaan maken...", - "find": "_Zoeken...", - "findNext": "_Volgende zoeken", - "replace": "_Vervangen...", - "multipleReplace": "_Meervoudig vervangen...", - "goToLineNumber": "Ga naar _regelnummer...", - "rightToLeftMode": "_Rechts-naar-links modus", - "modifySelectionDotDotDot": "_Selectie aanpassen...", - "tools": "_Gereedschappen", - "toolsSelectedLines": "Gereedschappen (_geselecteerde regels)", - "adjustDurations": "_Duur aanpassen...", - "applyDurationLimits": "Duurgrenzen _toepassen...", - "batchConvert": "_Batch-conversie...", - "bridgeGaps": "Gaten _overbruggen...", - "applyMinGap": "Minimale afstand tussen ondertitels toepassen...", - "changeCasing": "_Hoofdlettergebruik wijzigen...", - "changeFormatting": "Opmaak wijzigen...", - "fixCommonErrors": "Veelvoorkomende fouten _herstellen...", - "checkAndFixNetflixErrors": + "Main": { + "AudioTrackIsNowX": "Audiotrack is nu '{0}'", + "AudioTrackX": "Audiotrack {0}", + "AutoBreakHint": "Geselecteerde regels automatisch afbreken", + "CharactersPerSecond": "Tekens/seconde: {0}", + "ChooseColumn": "Kies kolom", + "ColumnPaste": "Kolom plakken", + "CreatedEmptyTranslation": "Lege vertaling gemaakt van de huidige ondertitel", + "DeleteText": "Tekst verwijderen", + "DeleteTextAndShiftCellsUp": "Verwijder tekst en schuif cellen omhoog", + "EndTimeMustBeAfterStartTime": "De eindtijd moet na de starttijd liggen.", + "ErrorLoad7Zip": "Dit bestand lijkt een gecomprimeerd 7-Zip-bestand te zijn.\r\n\r\n\r\nOndertitelbewerking kan geen gecomprimeerde bestanden openen.", + "ErrorLoadBinaryZeroes": "Sorry, dit bestand bevat alleen binaire nullen!\r\n\r\n\r\nAls u dit bestand heeft bewerkt met Subtitle Edit, kunt u mogelijk een back-up vinden via het menu-item Bestand -> Automatische back-up herstellen...", + "ErrorLoadGZip": "Dit bestand lijkt een gecomprimeerd GZip-bestand te zijn.\r\n\r\n\r\nOndertitelbewerking kan geen gecomprimeerde bestanden openen.", + "ErrorLoadJpg": "Dit bestand lijkt een JPG-afbeeldingsbestand te zijn.\r\n\r\n\r\nOndertitelbewerking kan geen afbeeldingsbestanden openen.", + "ErrorLoadPng": "Dit bestand lijkt een PNG-afbeeldingsbestand te zijn.\r\n\r\n\r\nOndertitelbewerking kan geen afbeeldingsbestanden openen.", + "ErrorLoadRar": "Dit bestand lijkt een gecomprimeerd 7-Zip-bestand te zijn.\r\n\r\n\r\nOndertitelbewerking kan geen gecomprimeerde bestanden openen.", + "ErrorLoadSrr": "Dit bestand lijkt een ReScene SRR-bestand te zijn.\r\n\r\n\r\nSubtitle Edit kan SRR-bestanden niet openen.", + "ErrorLoadTorrent": "Dit bestand lijkt een BitTorrent-bestand te zijn.\r\n\r\n\r\nOndertitelbewerking kan geen torrent-bestanden openen.", + "ErrorLoadZip": "Dit bestand lijkt een gecomprimeerd ZIP-bestand te zijn.\r\n\r\n\r\nOndertitelbewerking kan geen gecomprimeerde bestanden openen.", + "ExtractingWaveInfo": "Golfinformatie extraheren...", + "ExtractingShotChanges": "Shotwijzigingen extraheren...", + "FailedToExtractWaveInfo": "Kan golfinformatie niet extraheren.", + "FixedRightToLeftUsingUnicodeControlCharactersX": "Van rechts naar links gecorrigeerd met Unicode-besturingstekens in {0} regels", + "GeneratingSpectrogramDotDotDot": "Spectrogram genereren...", + "GeneratingWaveformDotDotDot": "Golfvorm genereren...", + "InsertEmptyTextAndShiftCellsDown": "Voeg lege tekst in en verplaats cellen naar beneden", + "InsertTextFromSubtitleDotDotDot": "Tekst uit ondertitel invoegen...", + "CopyTextFromOriginalToCurrent": "Kopieer tekst van origineel naar huidige ondertitel", + "InsertedXTextsFromSubtitleY": "{0} teksten ingevoegd uit ondertitelbestand \"{1}", + "ItalicHint": "Cursief geselecteerde regels/tekst", + "JoinedSubtitleLoaded": "Samengevoegde ondertitel geladen", + "LineXTextAndTimingChanged": "Regel {0}: Tekst en timing gewijzigd", + "LineXTextChangedFromYToZ": "Regel {0}: tekst gewijzigd van '{1}' in '{2}'", + "LineXTimingChanged": "Regel {0}: Timing gewijzigd", + "LoadingWaveInfoFromCache": "Wave-informatie uit cache laden...", + "NoTextInClipboard": "Geen tekst op het klembord", + "OneLineCopiedFromOriginal": "Eén regel gekopieerd van de originele ondertitel", + "OneLineMerged": "Eén regel samengevoegd", + "OneLineSwitched": "Eén lijn is geschakeld", + "OverwriteExistingCells": "Bestaande cellen overschrijven", + "OverwriteOrShiftCellsDown": "Cellen overschrijven/naar beneden verschuiven", + "ParsingMatroskaFile": "Matroska-bestand parseren...", + "PasteFromClipboardDotDotDot": "Plakken vanaf klembord...", + "RedoPerformed": "Opnieuw uitgevoerd", + "RedoPerformedXActionLeft": "Opnieuw uitgevoerd (resterende acties: {0})", + "RemovedUnicodeControlCharactersX": "Unicode-besturingstekens verwijderd uit {0} regels", + "RemovedXBlankLines": "{0} lege regels verwijderd", + "ReplacedXWithYCountZ": "Vervangen \"{0}\" door \"{1}\" ({2} exemplaren)", + "ReplacedXWithYInLineZ": "'{0}' vervangen door '{1}' in regel {2}", + "ReversedStartAndEndingsForRightToLeftX": "Omgekeerde start en einde voor rechts naar links in {0} regels", + "RuleProfileIsX": "Regelprofiel is nu '{0}'", + "SaveLanguageFile": "Taalbestand opslaan", + "SaveXFileAs": "Sla {0} bestand op als", + "ShiftTextCellsDown": "Verplaats tekstcellen naar beneden", + "SingleLineLength": "Lijnlengte:", + "SpeedIsNowX": "Snelheid is nu \"{0}", + "SpellCheckResult": "Spellingcontrole voltooid.\r\n\r\n\r\n• Gewijzigde woorden: {0}\r\n\r\n• Overgeslagen woorden: {1}", + "SubtitleImportedFromMatroskaFile": "Ondertitel geïmporteerd uit Matroska-bestand", + "TextDown": "Tekst naar beneden", + "TextOnly": "Alleen tekst", + "TextUp": "Tekst omhoog", + "TimeCodesOnly": "Alleen tijdcodes", + "XPropertiesDotDotDot": "{0} eigenschappen...", + "TotalCharacters": "Totaal aantal tekens: {0}", + "UnbreakHint": "Geselecteerde lijnen ongedaan maken", + "UndoPerformed": "Ongedaan maken uitgevoerd", + "UndoPerformedXActionLeft": "Ongedaan gemaakt (resterende acties: {0})", + "XLinesCopiedFromOriginal": "{0} regels gekopieerd van de originele ondertitel", + "XLinesMerged": "X-lijnen samengevoegd", + "XLinesSelectedOfY": "{0} regels geselecteerd uit {1}", + "XLinesSwitched": "{0} lijnen zijn verwisseld", + "XShotChangedLoaded": "{0} opnamewijzigingen geladen", + "YoutubeDlDownloadedSuccessfully": "\"yt-dlp\" succesvol gedownload.", + "YoutubeDlNotInstalledDownloadNow": "\"yt-dlp\" is niet geïnstalleerd en is vereist voor het afspelen van online video's.\r\n\r\n\r\nNu downloaden?", + "InsertUnicodeSymbol": "Unicode-symbool invoegen", + "TrimmedXLines": "{0} ondertitelregels bijgesneden", + "OpenOriginalDifferentNumberOfSubtitlesXY": "Het originele ondertitelbestand heeft niet hetzelfde aantal ondertitels als het huidige ondertitelbestand.\r\n\r\n\r\n• Originele ondertitels: {0}\r\n\r\n• Huidige ondertitels: {1}", + "ImportXMatchingOriginalLines": "{0} overeenkomende originele ondertitels importeren?", + "VideoOpenedChangeLayoutQuestion": "Er is een videobestand geopend.\r\n\r\n\r\nWilt u de lay-out wijzigen om het videopaneel weer te geven?", + "SortedByStartTime": "Gesorteerd op \"Weergeven\"-tijd", + "SortedByEndTime": "Gesorteerd op \"Verbergen\"-tijd", + "ColorHint": "Kleur geselecteerde lijnen", + "RemoveFormattingHint": "Verwijder de opmaak van geselecteerde regels", + "AssaResolutionResamplerDone": "ASSA-resolutie gewijzigd.", + "LanguageFileSavedToX": "Taalbestand opgeslagen in {0}", + "FileExportedInFormatXToY": "Bestand geëxporteerd in formaat {0} naar {1}", + "FileExportedInFormatXToFileY": "Bestand geëxporteerd in formaat \"{0}\" naar bestand \"{1}", + "FixedXLines": "Vaste {0} lijnen", + "TranscriptionCompletedWithXLines": "Transcriptie voltooid met {0} regels", + "ReplacedXOccurrences": "{0} exemplaren vervangen", + "FfmpegDownloadedAndInstalledToX": "ffmpeg gedownload en geïnstalleerd op {0}", + "NothingToSave": "Niets om op te slaan", + "NothingToSaveOriginal": "Niets om op te slaan (origineel)", + "LiveSpellCheckLanguageXLoaded": "Live spellingcontroletaal {0} geladen", + "DownloadFfmpegTitle": "FFmpeg downloaden?", + "DownloadFfmpegQuestion": "FFmpeg is vereist voor het afspelen van online video's en voor sommige videobewerkingsfuncties.\r\n\r\n\r\nFFmpeg nu downloaden?", + "Menu": { + "File": "_Bestand", + "New": "_Nieuw", + "NewKeepVideo": "Nieuw (video _behouden)", + "Open": "_Openen...", + "OpenKeepVideo": "Openen (_video behouden)...", + "OpenOriginal": "Origineel _openen...", + "CloseOriginal": "Origineel _sluiten", + "Reopen": "_Heropenen...", + "ClearRecentFiles": "Recente bestanden _wissen", + "RestoreAutoBackup": "Auto-_backup herstellen...", + "Save": "_Opslaan", + "SaveAs": "Opslaan _als...", + "OpenContainingFolder": "Bevattende _map openen", + "Compare": "Vergelij_ken...", + "Statistics": "Statistieken...", + "Import": "_Importeren", + "Export": "_Exporteren", + "Exit": "A_fsluiten", + "Edit": "Be_werken", + "Undo": "_Ongedaan maken", + "Redo": "_Opnieuw", + "ShowHistory": "Ge_schiedenis voor ongedaan maken...", + "Find": "_Zoeken...", + "FindNext": "_Volgende zoeken", + "Replace": "_Vervangen...", + "MultipleReplace": "_Meervoudig vervangen...", + "GoToLineNumber": "Ga naar _regelnummer...", + "RightToLeftMode": "_Rechts-naar-links modus", + "ModifySelectionDotDotDot": "_Selectie aanpassen...", + "Tools": "_Gereedschappen", + "ToolsSelectedLines": "Gereedschappen (_geselecteerde regels)", + "AdjustDurations": "_Duur aanpassen...", + "ApplyDurationLimits": "Duurgrenzen _toepassen...", + "BatchConvert": "_Batch-conversie...", + "BridgeGaps": "Gaten _overbruggen...", + "ApplyMinGap": "Minimale afstand tussen ondertitels toepassen...", + "ChangeCasing": "_Hoofdlettergebruik wijzigen...", + "ChangeFormatting": "Opmaak wijzigen...", + "FixCommonErrors": "Veelvoorkomende fouten _herstellen...", + "CheckAndFixNetflixErrors": "Controleer en herstel Netfli_x-fouten...", + "MakeEmptyTranslationFromCurrentSubtitle": "Maak een nieuwe _lege vertaling van de huidige ondertitel", + "MergeLinesWithSameText": "_Lijnen met dezelfde tekst samenvoegen...", + "MergeLinesWithSameTimeCodes": "Lijnen met dezelfde tijdcodes samenvoegen...", + "SplitBreakLongLines": "Lange lijnen splitsen/herbalanceren...", + "MergeShortLines": "Korte lijnen samenvoegen...", + "Renumber": "Hernummeren...", + "RemoveTextForHearingImpaired": "_Verwijder tekst voor slechthorenden...", + "ConvertActors": "Acteurs converteren...", + "JoinSubtitles": "_Doe mee met ondertitels...", + "SplitSubtitle": "_Ondertitel splitsen...", + "AssaTools": "_ASSA-hulpmiddelen", + "AssaProgressBar": "Genereer _voortgangsbalk...", + "AssaChangeResolution": "Wijzig _resolutie...", + "AssaGenerateBackground": "Genereer achtergrond_boxes...", + "AssaApplyAdvancedEffects": "Geavanceerde _effecten toepassen...", + "AssaApplyCustomOverrideTags": "_override-tags toepassen...", + "AssaSetPosition": "_Positie instellen...", + "AssaImageColorPicker": "_Afbeeldingskleurkiezer...", + "AssaDraw": "_Tekenen...", + "AssaStyles": "Stijlen...", + "AssaProperties": "Eigenschappen...", + "AssaAttachments": "_Bijlagen...", + "SpellCheckTitle": "_Spellingcontrole", + "SpellCheck": "_Spellingcontrole...", + "FindDoubleWords": "_Vind dubbele woorden...", + "FindDoubleLines": "_Vind dubbele lijnen...", + "AddNameToNamesList": "_Voeg naam toe aan namenlijst...", + "GetDictionaries": "_Verkrijg woordenboeken...", + "Video": "_Video", + "OpenVideo": "_Video openen...", + "OpenVideoFromUrl": "Video openen van _URL...", + "CloseVideoFile": "_Sluit het videobestand", + "AudioTracks": "_Audiotracks", + "SpeechToText": "_Spraak naar tekst...", + "TextToSpeech": "_Tekst naar spraak...", + "SetVideoOffset": "Video-offset instellen...", + "UpdateVideoOffsetX": "Video-offset bijwerken van {0}...", + "SmpteTiming": "SMPTE-timing (niet-gehele framesnelheid)", + "GenerateBurnIn": "Genereer video met _ingebrande ondertitels...", + "GenerateTransparent": "_Genereer transparante video met ondertitels...", + "GenerateImportShotChanges": "Genereer/importeer belangrijke wijzigingen...", + "ListShotChanges": "Lijst met belangrijke wijzigingen...", + "UndockVideoControls": "_Ontkoppel de videobediening", + "DockVideoControls": "_Dock videobediening", + "Synchronization": "Synchronisatie", + "AdjustAllTimes": "_Alle tijden aanpassen...", + "ChangeFrameRate": "Wijzig _framesnelheid...", + "ChangeSpeed": "Wijzig _snelheid...", + "VisualSync": "_Visuele synchronisatie...", + "Options": "_Opties", + "Settings": "_Instellingen...", + "Shortcuts": "S_snelkoppelingen...", + "WordLists": "_Woordenlijsten...", + "ChooseLanguage": "_Kies UI-taal...", + "Translate": "Vertalen", + "AutoTranslate": "_Automatisch vertalen...", + "TranslateViaCopyPaste": "Automatisch vertalen via _copy-paste...", + "HelpTitle": "_Hulp", + "Help": "_Hulp...", + "About": "_Over...", + "CheckForUpdates": "_Controleer op updates...", + "FixRightToLeftViaUnicodeControlCharacters": "RTL repareren via Unicode-besturingstekens (geselecteerde regels)", + "RemoveUnicodeControlCharacters": "Unicode-besturingstekens verwijderen (geselecteerde regels)", + "ReverseRightToLeftStartEnd": "Omgekeerd RTL begin/einde (geselecteerde regels)", + "PointSync": "_Puntsynchronisatie...", + "PointSyncViaOther": "Puntsynchronisatie via _other ondertiteling...", + "SortSubtitles": "_Ondertiteling sorteren...", + "SetLayer": "Laag instellen...", + "FilterLayersForDisplayDotDotDot": "Filterlagen voor weergave..." + }, + "Toolbar": { + "NewHint": "Start een nieuw ondertitelbestand {0}", + "OpenHint": "Open een bestaand ondertitelbestand {0}", + "OpenVideoHint": "Open een videobestand {0}", + "SaveHint": "Sla de huidige ondertitel {0} op", + "SaveAsHint": "Ondertitel opslaan met een nieuwe naam {0}", + "FindHint": "Zoek tekst in ondertitels {0}", + "ReplaceHint": "Tekst zoeken en vervangen {0}", + "SpellCheckHint": "Controleer ondertitels op spelfouten {0}", + "FixCommonErrorsHint": "Veelvoorkomende ondertitelfouten oplossen {0}", + "SettingsHint": "Programma-instellingen en voorkeuren aanpassen {0}", + "LayoutHint": "Werkbalk- en paneelindeling wijzigen {0}", + "HelpHint": "Help-website {0} openen", + "AutoBreakHint": "Automatisch lange lijnen afbreken {0}", + "UnbreakHint": "Ondertitels van meerdere regels samenvoegen tot één regel {0}", + "AssaStylesHint": "Geavanceerde Sub Station Alpha-stijlen", + "AssaPropertiesHint": "Geavanceerde Sub Station Alpha-eigenschappen", + "AssaAttachmentsHint": "Geavanceerde Sub Station Alpha-bijlagen", + "AssaDrawHint": "Geavanceerde tekenvormen voor Sub Station Alpha" + }, + "Waveform": { + "PlayPauseHint": "Afspelen/pauzeren {0}", + "PlayNextHint": "Speel volgende {0}", + "PlaySelectionHint": "Speelselectie {0}", + "SetStartAndOffsetTheRestHint": "Stel het begin van de huidige ondertitel in en verschuif de rest {0}", + "SetStartHint": "Begin van huidige ondertitel instellen {0}", + "SetEndHint": "Einde van huidige ondertitel instellen {0}", + "NewHint": "Nieuwe ondertitel invoegen op videopositie {0}", + "CenterWaveformHint": "Middengolfvorm op huidige videopositie tijdens afspelen {0}", + "ZoomHorizontalHint": "Horizontaal zoomen {0}", + "ZoomVerticalHint": "Verticaal zoomen {0}", + "SelectCurrentLineWhilePlayingHint": "Selecteer de huidige ondertitel tijdens het afspelen van {0}", + "VideoPosition": "Videopositie {0}", + "HideWaveformToolbar": "Werkbalk verbergen {0}", + "ResetZoomAndSpeed": "Zoom- en afspeelsnelheid opnieuw instellen {0}", + "RemoveBlankLines": "Verwijder lege regels {0}", + "PlaySelectedRepeatHint": "Geselecteerde ondertitel(s) afspelen in herhaalmodus {0}" + } + }, + "File": { + "Compare": "", + "PreviousDifference": "", + "NextDifference": "", + "SubtitlesNotAlike": "", + "XNumberOfDifference": "", + "XNumberOfDifferenceAndPercentChanged": "", + "XNumberOfDifferenceAndPercentLettersChanged": "", + "ShowOnlyDifferences": "", + "IgnoreLineBreaks": "", + "IgnoreWhitespace": "", + "IgnoreFormatting": "", + "OnlyLookForDifferencesInText": "", + "CannotCompareWithImageBasedSubtitles": "", + "StatisticsTitle": "", + "ShowOnlyDifferencesInText": "", + "LoadXFromFile": "", + "SaveCompareHtmlTitle": "", + "PickMatroskaTrackX": "", + "RosettaProperties": "", + "RosettaFontSize": "", + "XProperties": "", + "EbuSaveOptions": { + "Title": "", + "GeneralSubtitleInformation": "", + "CodePageNumber": "", + "DiskFormatCode": "", + "DisplayStandardCode": "", + "ColorRequiresTeletext": "", + "AlignmentRequiresTeletext": "", + "TeletextCharsShouldBe38": "", + "CharacterCodeTable": "", + "LanguageCode": "", + "OriginalProgramTitle": "", + "OriginalEpisodeTitle": "", + "TranslatedProgramTitle": "", + "TranslatedEpisodeTitle": "", + "TranslatorsName": "", + "SubtitleListReferenceCode": "", + "CountryOfOrigin": "", + "TimeCodeStatus": "", + "TimeCodeStartOfProgramme": "", + "RevisionNumber": "", + "MaxNoOfDisplayableChars": "", + "MaxNumberOfDisplayableRows": "", + "DiskSequenceNumber": "", + "TotalNumberOfDisks": "", + "Import": "", + "TextAndTimingInformation": "", + "JustificationCode": "", + "VerticalPosition": "", + "MarginTop": "", + "MarginBottom": "", + "NewLineRows": "", + "Teletext": "", + "UseBox": "", + "DoubleHeight": "", + "Errors": "", + "ErrorsX": "", + "MaxLengthError": "", + "TextUnchangedPresentation": "", + "TextLeftJustifiedText": "", + "TextCenteredText": "", + "TextRightJustifiedText": "", + "UseBoxForOneNewLine": "", + "DiscSequenceNumber": "" + }, + "Import": { + "ImportTimeCodes": "", + "PlainTextDotDotDot": "", + "TitleImportPlainText": "", + "ImagesForOcrDotDotDot": "", + "TimeCodesDotDotDot": "", + "SubtitleWithManuallyChosenEncodingDotDotDot": "", + "TitleImportImages": "", + "ImportFileLabel": "", + "ImportFilesInfo": "", + "FormattingDotDotDot": "", + "ImagedBasedSubtitleForEditDotDotDot": "", + "ImagedBasedSubtitleForOcrDotDotDot": "", + "SplitTextAt": "", + "BlankLines": "", + "OneLineIsOneSubtitle": "", + "TwoLinesAreOneSubtitle": "", + "ImportFilesDotDotDot": "", + "MultipleFiles": "", + "ImportOptions": "", + "AutoSplitText": "", + "LineMode": "", + "MaxLineLength": "", + "MaxLinesPerSubtitle": "", + "MinGapBetweenSubtitles": "", + "MergeShortLines": "", + "RemoveLinesWithoutLetters": "", + "SplitAtEndCharsSetting": "", + "TakeTimeFromCurrentFile": "", + "Fixed": "", + "NumberOfSubtitlesX": "", + "GapMs": "", + "UseFixedDuration": "", + "FixedDurationMs": "", + "AlignViaWhisper": "" + }, + "Export": { + "ExportImagesProfiles": "", + "LeftRightMargin": "", + "TopBottomMargin": "", + "TitleExportBluRaySup": "", + "LineSpacingPercent": "", + "PaddingLeftRight": "", + "PaddingTopBottom": "", + "PreviewTitle": "", + "TitleExportVobSub": "", + "CustomTextFormatsDotDotDot": "", + "PlainTextDotDotDot": "", + "CustomTextFormats": "", + "TitleExportCustomFormat": "", + "EditCustomFormat": "", + "NewCustomFormat": "", + "DeleteSelectedCustomTextFormatX": "", + "TimeCodeFormat": "", + "NewLineFormat": "", + "PleaseEnterNameForTheCustomFormat": "", + "TitleExportPlainText": "", + "LineNumbers": "", + "ShowLineNumbers": "", + "AddNewLineAfterLineNumber": "", + "AddNewLineAfterTimeCode": "", + "AddNewLineAfterText": "", + "AddLineBetweenSubtitles": "", + "TitleExportDCinemaInteropPng": "", + "TitleExportDCinemaSmpte2014Png": "", + "ImageBasedSubtitleSaved": "", + "TitleExportBdnXml": "", + "TitleExportWebVttThumbnails": "" + }, + "Statistics": { + "Title": "", + "TitleWithFileName": "", + "GeneralStatistics": "", + "MostUsed": "", + "MostUsedLines": "", + "MostUsedWords": "", + "NothingFound": "", + "NumberOfLinesX": "", + "NumberOfFilesX": "", + "LengthInFormatXinCharactersY": "", + "NumberOfCharactersInTextOnly": "", + "TotalDuration": "", + "TotalCharsPerSecond": "", + "TotalWords": "", + "NumberOfItalicTags": "", + "NumberOfBoldTags": "", + "NumberOfUnderlineTags": "", + "NumberOfFontTags": "", + "NumberOfAlignmentTags": "", + "LineLengthMinimum": "", + "LineLengthMaximum": "", + "LineLengthAverage": "", + "LinesPerSubtitleAverage": "", + "SingleLineLengthMinimum": "", + "SingleLineLengthMaximum": "", + "SingleLineLengthAverage": "", + "SingleLineLengthExceedingMaximum": "", + "SingleLineWidthMinimum": "", + "SingleLineWidthMaximum": "", + "SingleLineWidthAverage": "", + "SingleLineWidthExceedingMaximum": "", + "DurationMinimum": "", + "DurationMaximum": "", + "DurationAverage": "", + "DurationExceedingMinimum": "", + "DurationExceedingMaximum": "", + "CharactersPerSecondMinimum": "", + "CharactersPerSecondMaximum": "", + "CharactersPerSecondAverage": "", + "CharactersPerSecondExceedingOptimal": "", + "CharactersPerSecondExceedingMaximum": "", + "WordsPerMinuteMinimum": "", + "WordsPerMinuteMaximum": "", + "WordsPerMinuteAverage": "", + "WordsPerMinuteExceedingMaximum": "", + "GapMinimum": "", + "GapMaximum": "", + "GapAverage": "", + "GapExceedingMinimum": "", + "Export": "" + }, + "ManualChosenEncoding": { + "Title": "", + "SearchEncodings": "", + "CodePage": "" + }, + "RestoreAutoBackup": { + "Title": "", + "OpenAutoBackupFolder": "", + "RestoreAutoBackupFile": "", + "DeleteAllSubtitleBackups": "", + "DeleteAll": "" + }, + "PropertiesDCinema": { + "Title": "", + "GenerateIdAuto": "", + "SubtitleId": "", + "GenerateId": "", + "MovieTitle": "", + "ReelNumber": "", + "IssueDate": "", + "Now": "", + "EditRate": "", + "TimeCodeRate": "", + "StartTime": "", + "Font": "", + "FontId": "", + "FontUri": "", + "Generate": "", + "FontColor": "", + "ChooseColor": "", + "FontEffect": "", + "EffectColor": "", + "FontSize": "", + "TopBottomMargin": "", + "FadeUpTime": "", + "FadeDownTime": "", + "Frames": "", + "Export": "" + } + }, + "Edit": { + "ShowHistory": "", + "RestoreSelected": "", + "ModifySelection": { + "Title": "", + "Contains": "", + "StartsWith": "", + "EndsWith": "", + "NotContains": "", + "AllUppercase": "", + "Odd": "", + "Even": "", + "DurationLessThan": "", + "DurationGreaterThan": "", + "CpsLessThan": "", + "CpsGreaterThan": "", + "LengthLessThan": "", + "LengthGreaterThan": "", + "PixelLengthGreaterThan": "", + "GapLessThan": "", + "GapGreaterThan": "", + "ExactlyOneLine": "", + "ExactlyTwoLines": "", + "MoreThanTwoLines": "", + "Bookmarked": "", + "BookmarkContains": "", + "BlankLines": "", + "SelectionNew": "", + "SelectionAdd": "", + "SelectionSubtract": "", + "SelectionIntersect": "" + }, + "MultipleReplace": { + "Title": "", + "EditRule": "", + "NewRule": "", + "EditCategory": "", + "NewCategory": "", + "CategoryName": "", + "ExportReplaceRules": "", + "AppliedRules": "", + "FindRule": "", + "XLinesAffected": "", + "DeleteCategoryConfirm": "", + "DeleteRuleConfirm": "", + "FindWhat": "", + "DescriptionOptional": "" + }, + "Find": { + "SearchTextWatermark": "Tekst zoeken...", + "WholeWord": "Hele woord", + "CaseSensitive": "Hoofdlettergevoelig", + "CaseInsensitive": "Hoofdletterongevoelig", + "FindPrevious": "Zoek _vorige", + "FindNext": "_Zoek volgende", + "ReplaceAndFindNext": "_Vervangen en volgende vinden", + "ReplaceAll": "Vervang _alles", + "ReplaceTitle": "Vervangen", + "ReplaceWith": "Vervangen door", + "ReplaceTextWatermark": "Vervangen door..." + } + }, + "Tools": { + "PickAlignmentTitle": "", + "PickFontNameTitle": "", + "ColorPickerTitle": "", + "FilterLayersTitle": "", + "FilterLayersHideFromWaveform": "", + "FilterLayersHideFromSubtitleGrid": "", + "FilterLayersHideFromVideoPreview": "", + "PickSubtitleFormat": "", + "PickLayerTitle": "", + "RecentColors": "", + "FixCommonErrors": { + "Title": "", + "Step1": "", + "WhatToFix": "", + "Example": "", + "SelectAll": "", + "InverseSelection": "", + "Back": "", + "Next": "", + "Step2": "", + "Fixes": "", + "Log": "", + "Function": "", + "RemovedEmptyLine": "", + "RemovedEmptyLineAtTop": "", + "RemovedEmptyLineAtBottom": "", + "RemovedEmptyLineInMiddle": "", + "RemovedEmptyLinesUnusedLineBreaks": "", + "FixOverlappingDisplayTimes": "", + "FixShortDisplayTimes": "", + "FixLongDisplayTimes": "", + "FixShortGaps": "", + "FixInvalidItalicTags": "", + "RemoveUnneededSpaces": "", + "RemoveUnneededPeriods": "", + "FixCommas": "", + "FixMissingSpaces": "", + "BreakLongLines": "", + "RemoveLineBreaks": "", + "RemoveLineBreaksAll": "", + "RemoveLineBreaksPixelWidth": "", + "FixUppercaseIInsideLowercaseWords": "", + "FixDoubleApostrophes": "", + "AddPeriods": "", + "StartWithUppercaseLetterAfterParagraph": "", + "StartWithUppercaseLetterAfterPeriodInsideParagraph": "", + "StartWithUppercaseLetterAfterColon": "", + "FixLowercaseIToUppercaseI": "", + "FixCommonOcrErrors": "", + "CommonOcrErrorsFixed": "", + "RemoveSpaceBetweenNumber": "", + "BreakDialogsOnOneLine": "", + "RemoveDialogFirstInNonDialogs": "", + "NormalizeStrings": "", + "FixTurkishAnsi": "", + "FixDanishLetterI": "", + "FixSpanishInvertedQuestionAndExclamationMarks": "", + "AddMissingQuote": "", + "AddMissingQuotes": "", + "RemoveHyphensSingleLine": "", + "FixHyphensInDialogs": "", + "AddMissingQuotesExample": "", + "XMissingQuotesAdded": "", + "Fix3PlusLine": "", + "Fix3PlusLines": "", + "Analysing": "", + "NothingToFix": "", + "FixesFoundX": "", + "XFixesApplied": "", + "NothingFixableBut": "", + "XFixedBut": "", + "XCouldBeFixedBut": "", + "FixFirstLetterToUppercaseAfterParagraph": "", + "MergeShortLine": "", + "MergeShortLineAll": "", + "UnbreakShortLinePixelWidth": "", + "BreakLongLine": "", + "FixLongDisplayTime": "", + "FixInvalidItalicTag": "", + "FixShortDisplayTime": "", + "FixOverlappingDisplayTime": "", + "FixShortGap": "", + "FixInvalidItalicTagsExample": "", + "RemoveUnneededSpacesExample": "", + "RemoveUnneededPeriodsExample": "", + "FixMissingSpacesExample": "", + "FixUppercaseIInsideLowercaseWordsExample": "", + "FixLowercaseIToUppercaseIExample": "", + "StartTimeLaterThanEndTime": "", + "UnableToFixStartTimeLaterThanEndTime": "", + "XFixedToYZ": "", + "UnableToFixTextXY": "", + "UnneededSpace": "", + "UnneededPeriod": "", + "FixMissingSpace": "", + "FixUppercaseIInsideLowercaseWord": "", + "FixMissingPeriodAtEndOfLine": "", + "RefreshFixes": "", + "ApplyFixes": "", + "AutoBreak": "", + "Unbreak": "", + "FixDoubleDash": "", + "FixDoubleGreaterThan": "", + "FixEllipsesStart": "", + "FixMissingOpenBracket": "", + "FixMusicNotation": "", + "FixDoubleDashExample": "", + "FixDoubleGreaterThanExample": "", + "FixEllipsesStartExample": "", + "FixMissingOpenBracketExample": "", + "FixMusicNotationExample": "", + "NumberOfImportantLogMessages": "", + "FixedOkXY": "", + "FixOcrErrorExample": "", + "FixSpaceBetweenNumbersExample": "", + "FixDialogsOneLineExample": "", + "RemoveDialogFirstInNonDialogsExample": "", + "SelectDefault": "", + "SetDefault": "", + "FixContinuationStyleX": "", + "FixUnnecessaryLeadingDots": "", + "FixCommonErrorsProfiles": "", + "FixCommonOcrErrorsStep1": "", + "SearchRulesDotDotDot": "", + "GoToApplyFixes": "", + "BackToFixList": "", + "ApplyFixesAndClose": "", + "FixCommonOcrErrorsStep2": "", + "FixCommonOcrErrorsStep2FixesFoundX": "", + "Action": "", + "ApplySelectedFixes": "" + }, + "AdjustDurations": { + "Title": "", + "AdjustVia": "", + "Seconds": "", + "Percent": "", + "Recalculate": "", + "AddSeconds": "", + "SetAsPercent": "", + "Note": "", + "Fixed": "", + "Milliseconds": "", + "ExtendOnly": "", + "EnforceDurationLimits": "", + "CheckShotChanges": "", + "BatchCheckShotChanges": "" + }, + "ApplyDurationLimits": { + "Title": "", + "FixMinDurationMs": "", + "DoNotGoPastShotChange": "", + "FixMaxDurationMs": "", + "MaxDurationShouldBeHigherThanMinDuration": "", + "ChangedDurationFromXToYCommentZ": "", + "OnlyPartialFixed": "", + "UnfixableX": "", + "FixedX": "", + "FixedXImprovedY": "", + "NoChangesNeeded": "" + }, + "ApplyMinGaps": { + "Title": "", + "NumberOfGapsFixedX": "", + "MinFramesBetweenLines": "", + "MinMsBetweenLines": "", + "ChangedGapFromXToYCommentZ": "" + }, + "BeautifyTimeCodes": { + "Title": "", + "BeautifySettings": "", + "SnapToFrames": "", + "FrameGap": "", + "MinDuration": "", + "ShotChangeThreshold": "", + "ShotChangeOffset": "", + "Original": "", + "Beautified": "" + }, + "BridgeGaps": { + "Title": "", + "BridgeGapsSmallerThan": "", + "MinGap": "", + "NumberOfSmallGapsBridgedX": "", + "PercentFoPrevious": "", + "GapChange": "" + }, + "Renumber": { + "Title": "", + "StartFromNumber": "" + }, + "SortBy": { + "Title": "", + "SortOrder": "" + }, + "BatchConvert": { + "Title": "", + "OneActionsSelected": "", + "XActionsSelected": "", + "OutputFolderSource": "", + "OutputFolderX": "", + "EncodingXOverwriteY": "", + "TargetFormatSettings": "", + "FileNameContainsDotDotDot": "", + "TrackLanguageContainsDotDotDot": "", + "BatchConvertSettings": "", + "AddFormatting": "", + "AddItalic": "", + "AddBold": "", + "AddUnderline": "", + "AddAlignment": "", + "AddColor": "", + "DeleteLinesWithSpecificActorsOrStyles": "", + "UseSourceStylesIfPossible": "", + "EditStyles": "", + "EditProperties": "", + "EditAttachments": "", + "ErrorsExportedX": "", + "SlowFontSizeChange": "", + "IncreaseFontKerning": "", + "ScrollUp": "", + "ScrollDown": "", + "RotateIn": "", + "TiltBounce": "", + "FontSizeBounceIn": "" + }, + "ChangeCasing": { + "Title": "", + "FixNames": "", + "ExtraNames": "", + "EnterExtraNamesHint": "", + "OnlyFixUppercaseLines": "", + "FixNamesOnly": "", + "AllUppercase": "", + "AllLowercase": "" + }, + "ChangeFormatting": { + "Title": "" + }, + "ConvertActors": { + "Title": "", + "ConvertActorFrom": "", + "ConvertActorTo": "", + "InlineActorViaX": "", + "SetColor": "", + "OnlyNames": "", + "NumberOfConversionsX": "" + }, + "JoinSubtitles": { + "Title": "", + "KeepTimeCodes": "", + "AppendTimeCodes": "", + "AddMsAfterEachFile": "", + "Join": "" + }, + "SplitSubtitle": { + "Title": "", + "NumberOfEqualParts": "", + "SaveSplitParts": "", + "SubtitleSplitIntoXParts": "", + "XPartsSavedInFormatYToFolder": "" + }, + "SplitBreakLongLines": { + "Title": "", + "SplitLongLines": "", + "RebalanceLongLines": "", + "SplitLongLine": "", + "RebalanceLongLine": "", + "SplitIntoXLines": "", + "LinesSplitX": "", + "LinesSplitXLinesRebalancedY": "" + }, + "MergeShortLines": { + "Title": "", + "HighlightParts": "", + "MergedLineInfo": "", + "LinesMergedX": "" + }, + "MergeLinesWithSameText": { + "Title": "", + "MaxMsBetweenLines": "", + "IncludeIncrementingLines": "" + }, + "MergeLinesWithSameTimeCodes": { + "Title": "", + "MaxMsDifference": "", + "MakeDialog": "" + }, + "NetflixCheckAndFix": { + "Title": "", + "GenerateReport": "", + "NothingToReport": "", + "SaveNetflixQualityReport": "", + "NetflixReportSaved": "", + "NetFlixQualityReportSavedToX": "", + "DialogHyphenSpace": "", + "EllipsesNotThreeDots": "", + "OnlyAllowedGlyphs": "", + "Italics": "", + "MaxCharsSec": "", + "MaxDuration": "", + "MaxLineLength": "", + "MinDuration": "", + "MaxNumberOfLines": "", + "OneToTenSpellOut": "", + "ShotChanges": "", + "StartNumberSpellOut": "", + "TextforHiUseBrackets": "", + "FrameRate": "", + "TwoFrameGrap": "", + "WhiteSpace": "" + }, + "ImageBasedEdit": { + "EditImagedBaseSubtitle": "", + "EditImagedBaseSubtitleX": "", + "ResizeImagesDotDotDot": "", + "AdjustBrightnessDotDotDot": "", + "AdjustAlphaDotDotDot": "", + "CenterHorizontally": "", + "CropImages": "", + "ImportTimeCodes": "", + "SetTextForSubtitle": "", + "ScreenWidth": "", + "ScreenHeight": "", + "AlphaThresholdInfo": "", + "ResetToDefaults": "", + "AlphaAdjustmentInfo": "", + "AdjustBrightness": "", + "Brightness": "", + "Contrast": "", + "Gamma": "", + "BrightnessAdjustmentInfo": "", + "ResizeImages": "", + "Percentage": "", + "ResizeImagesInfo": "" + }, + "RemoveTextForHearingImpaired": { + "Title": "", + "Interjections": "", + "SkipIfStartWith": "", + "RemoveTextBetween": "", + "Brackets": "", + "CurlyBrackets": "", + "Parentheses": "", + "And": "", + "OnlySeparateLines": "", + "RemoveTextBeforeColon": "", + "OnlyIfTextIsUppercase": "", + "OnlyOnSeparateLine": "", + "IfLineIsUppercase": "", + "IfLineContains": "", + "IfLineOnlyContainsMusicSymbols": "", + "RemoveInterjections": "" + } + }, + "SpellCheck": { + "SpellCheck": "", + "GetDictionariesTitle": "", + "GetDictionaryInstructions": "", + "AddNameToUserDictionary": "", + "AddNameToNamesList": "", + "NoDictionariesFound": "", + "WordNotFound": "", + "LineXofY": "", + "ChangeWordFromXToY": "", + "ChangeAllWordsFromXToY": "", + "IgnoreWordXOnce": "", + "IgnoreWordXAlways": "", + "WordXAddedToNamesList": "", + "WordXAddedToUserDictionary": "", + "UseSuggestionX": "", + "UseSuggestionXAlways": "", + "AddXToUserDictionary": "", + "IgnoreAllX": "", + "PickSpellCheckDictionaryDotDotDot": "", + "ChooseSpellCheckDictionary": "" + }, + "Video": { + "GoToVideoPosition": "", + "GenerateBlankVideoDotDotDot": "", + "GenerateBlankVideoTitle": "", + "ReEncodeVideoForBetterSubtitlingTitle": "", + "ReEncodeVideoForBetterSubtitlingDotDotDot": "", + "OpenSecondarySubtitleOnVideoPlayerDotDotDot": "", + "OpenSecondarySubtitleOnVideoPlayer": "", + "RemoveSecondarySubtitleOnVideoPlayer": "", + "CutVideoTitle": "", + "CutVideoDotDotDot": "", + "EmbedSubtitlesDotDotDot": "", + "GenerateTimeCodes": "", + "CheckeredImage": "", + "SaveVideoAsTitle": "", + "PromptForFfmpegParamsAndGenerate": "", + "CutVideoCutSegments": "", + "CutVideoMergeSegments": "", + "CutVideoSplitSegments": "", + "CutVideoType": "", + "MpvRenderAuto": "", + "MpvRenderNative": "", + "MpvRenderOpenGl": "", + "MpvRenderSoftware": "", + "ImportCurrentSubtitle": "", + "AddRemoveEmbeddedSubtitlesTitle": "", + "AddCurrentSubtitle": "", + "TitleOrLanguage": "", + "ViewMatroskaTrackX": "", + "ResolutionSeparator": "", + "OpenFromUrlTitle": "", + "BurnIn": { + "Title": "", + "InfoAssaOff": "", + "InfoAssaOn": "", + "XGeneratedWithBurnedInSubsInX": "", + "TimeRemainingMinutes": "", + "TimeRemainingOneMinute": "", + "TimeRemainingSeconds": "", + "TimeRemainingAFewSeconds": "", + "TimeRemainingMinutesAndSeconds": "", + "TimeRemainingOneMinuteAndSeconds": "", + "TargetFileName": "", + "TargetFileSize": "", + "FileSizeMb": "", + "PassX": "", + "Encoding": "", + "BitRate": "", + "TotalBitRateX": "", + "SampleRate": "", + "Audio": "", + "Stereo": "", + "Preset": "", + "PixelFormat": "", + "Crf": "", + "TuneFor": "", + "AlignRight": "", + "GetStartPosition": "", + "GetEndPosition": "", + "UseSource": "", + "UseSourceFolder": "", + "UseSourceResolution": "", + "OutputSettings": "", + "FontSizeFactor": "", + "BoxType": "", + "FixRightToLeft": "", + "Cut": "", + "FromTime": "", + "ToTime": "", + "AudioEncoding": "", + "OutputProperties": "", + "VideoFileSize": "", + "OneBox": "", + "BoxPerLine": "", + "LogoInfo": "" + }, + "VideoTransparent": { + "Title": "", + "InfoAssaOff": "", + "InfoAssaOn": "" + }, + "AudioToText": { + "Title": "", + "Transcribe": "", + "TranslateToEnglish": "", + "Transcribing": "", + "TranscribingXOfY": "", + "InputLanguage": "", + "AdvancedWhisperSettings": "", + "DownloadingWhisperEngine": "", + "EnableVad": "", + "WhisperXxlStandard": "", + "WhisperXxlStandardAsia": "", + "WhisperXxlSentence": "", + "WhisperXxlSingleWords": "", + "WhisperXxlHighlightWord": "", + "SelectModel": "", + "ViewWhisperLogFile": "", + "ReDownloadX": "", + "DownloadingSpeechToTextModel": "", + "WhisperPostProcessingTitle": "", + "AdjustTimings": "", + "MergeShortLines": "", + "BreakSplitLongLines": "", + "FixShortDuration": "", + "FixCasing": "", + "AddPeriods": "", + "ChangeUnderlineToColor": "" + }, + "TextToSpeech": { + "Title": "", + "TextToSpeechEngine": "", + "ReviewAudioSegments": "", + "ReviewAudioSegmentsHistory": "", + "Stability": "", + "Similarity": "", + "SpeakerBoost": "", + "StyleExaggeration": "", + "RegenerateAudioSelectedLine": "", + "GenerateSpeechFromText": "", + "TestVoice": "", + "AddAudioToVideoFile": "", + "VoiceSettings": "", + "VoiceSampleText": "", + "RefreshVoices": "", + "VideoEncodingSettings": "", + "ElevenLabsSettings": "", + "ElevenLabsSettingsResetHint": "", + "RegenerateAudio": "", + "AutoContinuePlaying": "", + "AddingAudioToVideoFileDotDotDot": "", + "PreparingMergeDotDotDot": "", + "ImportVoiceDotDotDot": "", + "VoiceImportSuccessTitle": "", + "VoiceXImported": "", + "AdvancedTtsSettings": "", + "ProAudioPostProcessing": "", + "ProAudioPostProcessingDescription": "", + "AudioDucking": "", + "AudioDuckingDescription": "", + "OriginalVolumePercent": "", + "VadSilenceCompression": "", + "VadSilenceCompressionDescription": "", + "MaxSilenceMs": "", + "HighQualityTimeStretch": "", + "HighQualityTimeStretchDescription": "", + "SilencePaddingMs": "", + "SilencePaddingMsDescription": "", + "OutputSampleRate": "", + "OutputSampleRateDescription": "", + "EdgeTtsRate": "", + "EdgeTtsRateDescription": "", + "EdgeTtsPitch": "", + "EdgeTtsPitchDescription": "", + "EdgeTtsVolume": "", + "EdgeTtsVolumeDescription": "", + "DownloadPiperPrompt": "" + }, + "ShotChanges": { + "TitleGenerateOrImport": "", + "GenerateShotChanges": "", + "ImportShotChanges": "", + "GenerateShotChangesWithFfmpeg": "", + "ShotChangeTimeCode": "", + "OpenShotChangesFile": "", + "ImportShotChangesFromFile": "", + "TimeCodeFormatColon": "", + "ShotChangesList": "", + "ShotChangesClearQuestion": "", + "DeleteSelectedShotChangeQuestion": "" + } + }, + "Waveform": { + "GuessTimeCodes": "", + "GuessTimeCodesScanBlockSize": "", + "GuessTimeCodesScanBlockAverageMin": "", + "GuessTimeCodesScanBlockAverageMax": "", + "GuessTimeCodesSplitLongSubtitlesAt": "", + "SpeechToTextSelectedLinesDotDotDot": "", + "SeekSilence": "", + "MinSilenceDurationSeconds": "", + "MaxSilenceVolume": "", + "GuessTimeCodesDotDotDot": "", + "SeekSilenceDotDotDot": "", + "ToggleShotChange": "", + "ResetWaveformZoomAndSpeed": "", + "ShowOnlyWaveform": "", + "ShowOnlySpectrogram": "", + "ShowWaveformAndSpectrogram": "", + "SpectrogramClassic": "", + "SpectrogramClassicViridis": "", + "SpectrogramClassicPlasma": "", + "SpectrogramClassicInferno": "", + "SpectrogramClassicTurbo": "", + "SpectrogramNeon": "", + "WaveformDrawStyleClassic": "", + "WaveformDrawStyleFancy": "", + "SetVideoPositionAndPauseAndSelectSubtitle": "", + "SetVideopositionAndPauseAndSelectSubtitleAndCenter": "", + "SetVideoPositionAndPause": "", + "SetVideopositionAndPauseAndCenter": "", + "SetVideoposition": "" + }, + "Sync": { + "VisualSync": "", + "Sync": "", + "StartScene": "", + "EndScene": "", + "PlayTwoSecondsAndBack": "", + "FindText": "", + "ResolutionXDurationYFrameRateZ": "", + "StartSceneMustComeBeforeEndScene": "", + "GoToSubPos": "", + "SpeedInPercentage": "", + "FromDropFrameValue": "", + "ToDropFrameValue": "", + "AdjustAll": "", + "AdjustSelectedLines": "", + "AdjustSelectedLinesAndForward": "", + "ToFrameRate": "", + "FromFrameRate": "", + "AdjustAllTimes": "", + "ShowEarlier": "", + "ShowLater": "", + "ChangeFrameRate": "", + "SetSyncPoint": "", + "SyncPoints": "", + "PointSync": "", + "PointSyncViaOther": "", + "AdjustmentX": "", + "AdjustAllShortcuts": "", + "OffsetInSeconds": "", + "SpeedFactor": "" + }, + "Translate": { + "TranslateViaCopyPaste": "", + "MaxBlockSize": "", + "LineSeparator": "", + "BlockCopyInfo": "", + "BlockCopyGetFromClipboard": "", + "ReCopyTextToClipboard": "", + "BlockXOfY": "", + "NoTextInClipboard": "", + "TextInClipboardIsSameAsSourceText": "", + "LineMerge": "", + "DelayInSecondsBetweenRequests": "", + "MaxBytesPerRequest": "", + "PromptText": "", + "TranslateEachLineSeparately": "" + }, + "Options": { + "Settings": { + "DialogStyle": "", + "DialogStyleDashSecondLineWithoutSpace": "", + "DialogStyleDashSecondLineWithSpace": "", + "DialogStyleDashBothLinesWithSpace": "", + "DialogStyleDashBothLinesWithoutSpace": "", + "ContinuationStyle": "", + "ContinuationStyleNone": "", + "ContinuationStyleNoneTrailingDots": "", + "ContinuationStyleNoneLeadingTrailingDots": "", + "ContinuationStyleNoneTrailingEllipsis": "", + "ContinuationStyleNoneLeadingTrailingEllipsis": "", + "ContinuationStyleOnlyTrailingDots": "", + "ContinuationStyleLeadingTrailingDots": "", + "ContinuationStyleOnlyTrailingEllipsis": "", + "ContinuationStyleLeadingTrailingEllipsis": "", + "ContinuationStyleLeadingTrailingDash": "", + "ContinuationStyleLeadingTrailingDashDots": "", + "ContinuationStyleCustom": "", + "CpsLineLengthStyle": "", + "CpsLineLengthStyleCalcAll": "", + "CpsLineLengthStyleCalcNoSpaceCpsOnly": "", + "CpsLineLengthStyleCalcNoSpace": "", + "CpsLineLengthStyleCalcCjk": "", + "CpsLineLengthStyleCalcCjkNoSpace": "", + "CpsLineLengthStyleCalcIncludeCompositionCharacters": "", + "CpsLineLengthStyleCalcIncludeCompositionCharactersNotSpace": "", + "CpsLineLengthStyleCalcNoSpaceOrPunctuation": "", + "CpsLineLengthStyleCalcNoSpaceOrPunctuationCpsOnly": "", + "CpsLineLengthStyleCalcIgnoreArabicDiacritics": "", + "CpsLineLengthStyleCalcIgnoreArabicDiacriticsNoSpace": "", + "TimeCodeModeHhMmSsMs": "", + "TimeCodeModeHhMmSsFf": "", + "SplitBehaviorPrevious": "", + "SplitBehaviorHalf": "", + "SplitBehaviorNext": "", + "SubtitleListActionNothing": "", + "SubtitleListActionVideoGoToPositionAndPause": "", + "SubtitleListActionVideoGoToPositionAndPlay": "", + "SubtitleListActionVideoGoToPositionAndPlayCurrentAndPause": "", + "SubtitleListActionEditText": "", + "SubtitleListActionVideoGoToPositionMinus1SecAndPause": "", + "SubtitleListActionVideoGoToPositionMinusHalfSecAndPause": "", + "SubtitleListActionVideoGoToPositionMinus1SecAndPlay": "", + "SubtitleListActionEditTextAndPause": "", + "AutoBackupEveryMinute": "", + "AutoBackupEveryXthMinute": "", + "Profiles": "", + "AutoBackupDeleteAfterXMonths": "", + "SearchSettingsDotDoDot": "", + "SyntaxColoring": "", + "WaveformSpectrogram": "", + "Network": "", + "FileTypeAssociations": "", + "TextBoxColorTags": "", + "TextBoxLiveSpellCheck": "", + "TextBoxCenterText": "", + "TextBoxFontBold": "", + "TextBoxFontSize": "", + "SubtitleTextBoxAndGridFontName": "", + "SubtitleGridFontSize": "", + "SubtitleGridTextSingleLine": "", + "SubtitleGridLiveSpellCheck": "", + "SubtitleGridShowFormatting": "", + "ShowUpDownStartTime": "", + "ShowUpDownEndTime": "", + "ShowUpDownDuration": "", + "ShowUpDownLabels": "", + "ShowButtonHints": "", + "GridCompactMode": "", + "UiFont": "", + "Theme": "", + "IconTheme": "", + "DarkThemeForegroundColor": "", + "DarkThemeBackgroundColor": "", + "ShowGridLines": "", + "ResetSettings": "", + "ResetSettingsDetail": "", + "ShowHorizontalLineAboveToolbar": "", + "BookmarkColor": "", + "SingleLineMaxLength": "", + "OptimalCharsPerSec": "", + "MaxCharsPerSec": "", + "MaxWordsPerMin": "", + "MinDurationMs": "", + "MaxDurationMs": "", + "MinGapMs": "", + "MaxLines": "", + "UnbreakSubtitlesShortThan": "", + "NewEmptyDefaultMs": "", + "PromptBeforeDelete": "", + "RememberPositionAndSize": "", + "AutoBackupOn": "", + "AutoBackupIntervalMinutes": "", + "AutoBackupDeleteAfterDays": "", + "AutoConvertToUtf8": "", + "AutoTrimWhiteSpace": "", + "DefaultEncoding": "", + "ColorDurationTooShort": "", + "ColorDurationTooLong": "", + "ColorTextTooLong": "", + "ColorTextTooWide": "", + "ColorTextTooManyLines": "", + "ColorOverlap": "", + "ColorGapTooShort": "", + "ErrorBackgroundColor": "", + "WaveformDrawGridLines": "", + "WaveformCenterVideoPosition": "", + "WaveformShowToolbar": "", + "WaveformShowToolbarEdit": "", + "WaveformSpectrogramCombinedWaveformHeight": "", + "ShowWaveformToolbarPlay": "", + "ShowWaveformToolbarRepeat": "", + "ShowWaveformToolbarRemoveBlankLines": "", + "ShowWaveformToolbarNew": "", + "ShowWaveformToolbarSetStart": "", + "ShowWaveformToolbarSetEnd": "", + "ShowWaveformToolbarStartAndOffsetTheRest": "", + "ShowWaveformToolbarHorizontalZoom": "", + "ShowWaveformToolbarVerticalZoom": "", + "ShowWaveformToolbarVideoPositionSlider": "", + "ShowWaveformToolbarPlaybackSpeed": "", + "WaveformFocusTextboxAfterInsertNew": "", + "WaveformInvertMouseWheel": "", + "WaveformSnapToShotChanges": "", + "WaveformShotChangesAutoGenerate": "", + "WaveformTextFontSize": "", + "WaveformTextFontBold": "", + "WaveformTextColor": "", + "WaveformColor": "", + "WaveformBackgroundColor": "", + "WaveformSelectedColor": "", + "DownloadFfmpeg": "", + "ShowToolbarNew": "", + "ShowToolbarOpen": "", + "ShowToolbarVideoFileOpen": "", + "ShowToolbarSave": "", + "ShowToolbarSaveAs": "", + "ShowToolbarFind": "", + "ShowToolbarReplace": "", + "ShowToolbarSpellCheck": "", + "ShowToolbarFixCommonErrors": "", + "ShowToolbarSettings": "", + "ShowToolbarLayout": "", + "ShowToolbarHelp": "", + "ShowToolbarEncoding": "", + "ShowToolbarFrameRate": "", + "ProxyAddress": "", + "Username": "", + "Password": "", + "DefaultFormat": "", + "DefaultSaveAsFormat": "", + "FavoriteSubtitleFormats": "", + "ShowStopButton": "", + "ShowFullscreenButton": "", + "AutoOpenVideoFile": "", + "DownloadMpv": "", + "DownloadVlc": "", + "GoToLineNumberSetsVideoPosition": "", + "AdjustAllTimesRememberLineSelectionChoice": "", + "FilesAndLogs": "", + "ShowErrorLogFile": "", + "ShowWhisperLogFile": "", + "ShowSettingsFile": "", + "ShowAssaLayer": "", + "WaveformCursorColor": "", + "WaveformParagraphLeftColor": "", + "WaveformParagraphRightColor": "", + "WaveformFancyHighColor": "", + "WaveformFocusOnMouseOver": "", + "ResetAllSettings": "", + "ResetShortcuts": "", + "ResetRecentFiles": "", + "ResetMultipleReplaceRules": "", + "ResetAppearance": "", + "ResetAutoTranslate": "", + "ResetWindowPositionAndSize": "", + "ResetSettingsTitle": "", + "OpenRuleFile": "", + "ExportProfiles": "", + "SaveRuleProfilesFile": "", + "RuleProfilesExportedX": "", + "RuleProfilesImportedX": "", + "UseSpecialStyleAfterLongGaps": "", + "AddSpace": "", + "ProcessIfEndsWithComma": "", + "RemoveComma": "", + "EditContinuationStyleCustom": "", + "LongGapThreshold": "", + "AfterLongGap": "", + "ResetSyntaxColoring": "", + "ResetWaveform": "", + "ResetRules": "", + "UseFrameMode": "", + "TextBoxLimitNewLines": "", + "MpvVideoOutput": "", + "MpvOpenGl": "", + "MpvSoftwareRendering": "", + "MpvWidRendering": "", + "WaveFormsAndSpectrogramFoldersContainsX": "", + "DeleteWaveformAndSpectrogramFoldersQuestion": "", + "WaveformGenerateSpectrogram": "", + "WaveformSpectrogramMode": "", + "WaveformCenterOnSingleClick": "", + "WaveformSingleClickSelectsSubtitle": "", + "WaveformRightClickSelectsSubtitle": "", + "WaveformPauseOnSingleClick": "", + "WaveformDrawStyle": "", + "VlcWidRendering": "", + "SubtitleSEnterKeyAction": "", + "SubtitleSingleClickAction": "", + "SubtitleDoubleClickAction": "", + "SaveAsBehavior": "", + "SaveAsAppendLanguageCode": "", + "GridGoToSubtitleAndSetVideoPosition": "", + "GridGoToNextLine": "", + "GridGoToSubtitleOnlyWaveformOnly": "", + "GridGoToSubtitleAndPause": "", + "GridGoToSubtitleAndPlay": "", + "GridGoToSubtitleAndPauseAndFocusTextBox": "", + "SubtitleGridFormattingNone": "", + "SubtitleGridFormattingShowFormatting": "", + "SubtitleGridFormattingShowTags": "", + "WaveformParagraphBackgroundColor": "", + "WaveformParagraphSelectedBackgroundColor": "", + "WaveformAllowOverlap": "", + "SaveAsBehaviorUseSubtitleVideoFilename": "", + "SaveAsBehaviorUseVideoSubtitleFilename": "", + "SaveAsBehaviorUseVideoFileName": "", + "SaveAsBehaviorUseSubtitleFileName": "", + "SaveAsAppendLanguageCodeTwoLetter": "", + "SaveAsAppendLanguageCodeThreeLetter": "", + "SaveAsAppendLanguageCodeLanguageName": "", + "SplitOddLineActionWeightTop": "", + "SplitOddLineActionWeightBottom": "", + "SplitOddLinesAction": "", + "OcrUseWordSplitList": "", + "SpeechToTextSelectedLinesPromptFistTimeOnly": "", + "MultipleReplaceShowDotDotDotButtons": "", + "GridFocusTextboxAfterInsertNew": "", + "UseFocusedButtonBackgroundColor": "", + "FocusedButtonBackgroundColor": "", + "ForceCrLfOnSave": "", + "ShowWaveformToolbarPlayNext": "", + "ShowWaveformToolbarPlaySelection": "", + "TextBoxButtonShowAutoBreak": "", + "TextBoxButtonShowUnbreak": "", + "TextBoxButtonShowItalic": "", + "TextBoxButtonShowColor": "", + "TextBoxButtonShowRemoveFormatting": "", + "WaveformSingleClickAction": "", + "WaveformDoubleClickAction": "", + "AllSettings": "", + "UiScale": "", + "WaveformToolbarItems": "", + "MatchIconColorToDarkTheme": "", + "SubtitlePreviewProperties": "", + "PixelWidthInfo": "" + }, + "Shortcuts": { + "Title": "", + "SearchShortcuts": "", + "Filter": "", + "CategoryGeneral": "", + "CategorySubtitleGridAndTextBox": "", + "CategorySubtitleGrid": "", + "CategoryWaveform": "", + "GeneralMergeSelectedLines": "", + "GeneralMergeWithPrevious": "", + "GeneralMergeWithNext": "", + "GeneralMergeWithPreviousAndUnbreak": "", + "GeneralMergeWithNextAndUnbreak": "", + "GeneralMergeWithPreviousAndAutoBreak": "", + "GeneralMergeWithNextAndAutoBreak": "", + "GeneralMergeSelectedLinesAndAutoBreak": "", + "GeneralMergeSelectedLinesAndUnbreak": "", + "GeneralMergeSelectedLinesAndUnbreakCjk": "", + "GeneralMergeSelectedLinesOnlyFirstText": "", + "GeneralMergeSelectedLinesBilingual": "", + "GeneralMergeWithPreviousBilingual": "", + "GeneralMergeWithNextBilingual": "", + "GeneralMergeOriginalAndTranslation": "", + "GeneralToggleTranslationMode": "", + "GeneralSwitchOriginalAndTranslation": "", + "GeneralSwitchOriginalAndTranslationTextBoxes": "", + "GeneralChooseLayout": "", + "GeneralLayoutChooseX": "", + "GeneralPlayFirstSelected": "", + "GeneralGoToFirstSelectedLine": "", + "GeneralGoToNextEmptyLine": "", + "GeneralGoToNextSubtitle": "", + "GeneralGoToNextSubtitlePlayTranslate": "", + "GeneralGoToNextSubtitleCursorAtEnd": "", + "GeneralGoToPrevSubtitle": "", + "GeneralGoToPrevSubtitlePlayTranslate": "", + "GeneralGoToStartOfCurrentSubtitle": "", + "GeneralGoToEndOfCurrentSubtitle": "", + "GeneralGoToPreviousSubtitleAndFocusVideo": "", + "GeneralGoToNextSubtitleAndFocusVideo": "", + "GeneralGoToPrevSubtitleAndPlay": "", + "GeneralGoToNextSubtitleAndPlay": "", + "GeneralGoToPreviousSubtitleAndFocusWaveform": "", + "GeneralGoToNextSubtitleAndFocusWaveform": "", + "GeneralGoToLineNumber": "", + "GeneralGoToVideoPosition": "", + "GeneralToggleItalic": "", + "GeneralToggleBold": "", + "GeneralToggleBookmarks": "", + "GeneralFocusTextBox": "", + "GeneralToggleBookmarksWithText": "", + "GeneralEditBookmarks": "", + "FileNew": "", + "FileOpen": "", + "FileOpenKeepVideo": "", + "FileSave": "", + "FileSaveAs": "", + "FileSaveAll": "", + "FileSaveOriginal": "", + "FileSaveOriginalAs": "", + "FileOpenOriginalSubtitle": "", + "FileCloseOriginalSubtitle": "", + "FileTranslatedSubtitle": "", + "FileCompare": "", + "FileStatistics": "", + "FileImportPlainText": "", + "FileImportBluRaySupForOcr": "", + "FileImportBluRaySupForEdit": "", + "FileImportTimeCodes": "", + "FileExportEbuStl": "", + "FileExportPac": "", + "FileExportEdlClipName": "", + "FileExportPlainText": "", + "FileExportCustomTextFormat1": "", + "FileExportCustomTextFormat2": "", + "FileExportCustomTextFormat3": "", + "FileExit": "", + "OpenSeDataFolder": "", + "EditFind": "", + "EditFindNext": "", + "EditFindPrevious": "", + "EditReplace": "", + "EditMultipleReplace": "", + "EditModifySelection": "", + "ListSelectAll": "", + "ListSelectFirst": "", + "ListSelectLast": "", + "ListInverseSelection": "", + "ListDeleteSelection": "", + "RippleDeleteSelection": "", + "Settings": "", + "Assigned": "", + "Unassigned": "", + "PressedKeyX": "", + "PressAKey": "", + "DetectKey": "", + "Control": "", + "Alt": "", + "Win": "", + "Shift": "", + "ControlMac": "", + "AltMac": "", + "WinMac": "", + "ShiftMac": "", + "ResetShortcuts": "", + "ResetShortcutsDetail": "", + "TogglePlayPause": "", + "ToggleLockTimeCodes": "", + "DuplicateSelectedLines": "", + "SourceView": "", + "ShowAlignmentPicker": "", + "AddOrEditBookmark": "", + "ListBookmarks": "", + "ToggleBookmark": "", + "GoToNextBookmark": "", + "ToggleWaveformToolbar": "", + "WaveformSetStartAndSetEndOfPreviousMinusGap": "", + "WaveformSetEndAndStartOfNextAfterGap": "", + "WaveformSetEndAndStartOfNextAfterGapAndGoToNext": "", + "FetchFirstWordFromNextSubtitle": "", + "MoveLastWordToNextSubtitle": "", + "MoveLastWordFromFirstLineDownCurrentSubtitle": "", + "MoveFirstWordFromNextLineUpCurrentSubtitle": "", + "ToggleFocusGridAndWaveform": "", + "ToggleFocusTextBoxAndWaveform": "", + "ToggleFocusTextBoxAndGrid": "", + "GoToPreviousLineAndSetVideoPosition": "", + "GoToPreviousLineFromVideoPosition": "", + "GoToNextLineFromVideoPosition": "", + "GoToNextLineAndSetVideoPosition": "", + "TextBoxDeleteSelectionNoClipboard": "", + "TextBoxCut": "", + "TextBoxCut2": "", + "TextBoxPaste": "", + "TextBoxCopy": "", + "TextBoxSelectAll": "", + "SubtitleGridCut": "", + "SubtitleGridCopy": "", + "SubtitleGridPaste": "", + "SetShortcutForX": "", + "CommandFileNewKeepVideo": "", + "FileOpenOriginal": "", + "FileCloseOriginal": "", + "RestoreAutoBackup": "", + "OpenContainingFolder": "", + "ImportTimeCodes": "", + "ImportSubtitleWithManuallyChosenEncoding": "", + "ExportBluRaySup": "", + "ExportCustomTextFormat": "", + "ExportPlainText": "", + "ShowHistory": "", + "ToggleRightToLeft": "", + "ModifySelection": "", + "AdjustDurations": "", + "ApplyDurationLimits": "", + "BatchConvert": "", + "BridgeGaps": "", + "ApplyMinGap": "", + "FixCommonErrors": "", + "MakeEmptyTranslationFromCurrentSubtitle": "", + "MergeLinesWithSameText": "", + "MergeLinesWithSameTimeCodes": "", + "SplitBreakLongLines": "", + "MergeShortLines": "", + "RemoveTextForHearingImpaired": "", + "JoinSubtitles": "", + "SplitSubtitle": "", + "SpellCheck": "", + "SpellCheckGetDictionary": "", + "OpenVideo": "", + "OpenVideoFromUrl": "", + "CloseVideo": "", + "SpeechToText": "", + "TextToSpeech": "", + "BurnIn": "", + "GenerateTransparent": "", + "UndockVideoControls": "", + "RedockVideoControls": "", + "GenerateBlankVideo": "", + "ReencodeVideo": "", + "CutVideo": "", + "CutVideoSelectedLines": "", + "AdjustAllTimes": "", + "VisualSync": "", + "TranslateViaCopyPaste": "", + "Shortcuts": "", + "WordLists": "", + "ChooseUiLanguage": "", + "ChooseRuleProfile": "", + "VideoFullScreen": "", + "CopyTextFromOriginalSelectedLines": "", + "TextBoxRemoveAllFormatting": "", + "TextBoxItalic": "", + "ResetWaveformZoomAndSpeed": "", + "TogglePlaybackSpeed": "", + "PlaybackSpeedSlower": "", + "PlaybackSpeedFaster": "", + "SwitchOriginalAndTranslationSelectedLines": "", + "MergeOriginalIntoTranslationSelectedLines": "", + "SeekSilence": "", + "SetVideoPositionCurrentSubtitleStart": "", + "SetVideoPositionCurrentSubtitleEnd": "", + "ToggleAudioTracks": "", + "ListErrors": "", + "GoToNextError": "", + "GoToPreviousError": "", + "AddNameToNameList": "", + "FindDoubleWords": "", + "FindDoubleLines": "", + "ColorX": "", + "RemoveColor": "", + "SurroundWith": "", + "SurroundWithXY": "", + "RepeatLine": "", + "RepeatPreviousLine": "", + "RepeatNextLine": "", + "MoveVideoPositionMilliseconds": "", + "ImportShortcutsTitle": "", + "ExportShortcutsTitle": "", + "XShortcutsImportedFromY": "", + "XShortcutsExportedToY": "", + "ImportImageSubtitleForEdit": "", + "ShowPointSyncViaOther": "", + "ShowPointSync": "", + "ShowMediaInformation": "", + "ChooseSubtitleFormat": "", + "TrimWhitespaceSelectedLines": "", + "WaveformHorizontalZoomInCommand": "", + "WaveformHorizontalZoomOutCommand": "", + "WaveformVerticalZoomInCommand": "", + "WaveformVerticalZoomOutCommand": "", + "CopySubtitlePathToClipboard": "", + "CopySubtitleOriginalPathToClipboard": "", + "FocusTextBox": "", + "SortByStartTime": "", + "SortByEndTime": "", + "DuplicatesFound": "", + "CopyTextToClipboard": "", + "CopyTextFromOriginalToClipboard": "", + "AssaDraw": "", + "AssaGenerateProgressBar": "", + "AssaGenerateBackgroundBox": "", + "AssaStyles": "", + "AssaProperties": "", + "AssaAttachments": "", + "AssaVideoColorPicker": "", + "RecalculateDurationSelectedLines": "", + "ToggleWaveformAndSpectrogramHeight": "", + "ToggleSpectrogramStyle": "", + "CopyMsRelativeToCurrentSubtitleLineToClipboard": "", + "LayoutZoomIn": "", + "LayoutZoomOut": "" + }, + "WordLists": { + "Title": "", + "AddName": "", + "AddWord": "", + "AddPair": "", + "NameAndIgnoreList": "", + "UserWords": "", + "OcrFixList": "", + "UnableToAddItem": "", + "UnableToRemoveItem": "" + }, + "ChooseLanguage": { + "Title": "" + } + }, + "Help": { + "AboutSubtitleEdit": "Over ondertiteling bewerken", + "CheckForUpdates": "Controleer op updates", + "CheckForUpdatesChecking": "Controleren op updates...", + "CheckForUpdatesUpToDate": "U gebruikt de nieuwste versie.", + "CheckForUpdatesNewVersionAvailable": "Nieuwe versie beschikbaar: {0}", + "CheckForUpdatesUnableToCheck": "Kan niet controleren op updates.", + "CheckForUpdatesDownloadNewVersion": "Nieuwe versie downloaden" + }, + "Ocr": { + "LinesToDraw": "", + "CurrentImage": "", + "AutoDrawAgain": "", + "StartOcr": "", + "PauseOcr": "", + "InspectLine": "", + "OcrEngine": "", + "Database": "", + "MaxWrongPixels": "", + "MaxErrorPct": "", + "NumberOfPixelsIsSpace": "", + "InspectImageMatches": "", + "ResolutionXYAndTopmarginZ": "", + "RunningOcrDotDotDotXY": "", + "RunningOcrDotDotDot": "", + "AutoSubmitFirstCharacter": "", + "EditNOcrDatabase": "", + "ZoomFactorX": "", + "ExpandInfoX": "", + "EditNOcrDatabaseXWithYItems": "", + "NewNOcrDatabase": "", + "RenameNOcrDatabase": "", + "NOcrDatabase": "", + "DrawMode": "", + "AddNewCharcter": "", + "LineIndexX": "", + "InspectNOcrAdditions": "", + "OcrSelectedLines": "", + "ShowImage": "", + "FixOcrErrors": "", + "PromptForUknownWords": "", + "TryToGuessUnknownWords": "", + "AutoBreakIfMoreThanXLines": "", + "UnknownWords": "", + "AllFixes": "", + "GuessesUsed": "", + "Ocr": "", + "OcrX": "", + "AddBetterMatch": "", + "NOcrInspectImageMatches": "", + "AddToOcrPair": "", + "AddNameToOcrReplaceList": "", + "WordToAdd": "", + "NameToAdd": "", + "ChangeWordFromTo": "", + "ClearBackground": "", + "ClearForeground": "", + "NOcrDrawHelp": "", + "EditWholeText": "", + "EditWordOnly": "", + "ImagePreProcessing": "", + "PreProcessingTitle": "", + "CropTransparent": "", + "InverseColors": "", + "RemoveBorders": "", + "Binarize": "", + "BorderSize": "", + "CaptureTopAlign": "", + "OcrImage": "", + "OneColor": "", + "DarknessThreshold": "", + "EditExportDotDotDot": "", + "EditBinaryOcrDatabase": "", + "BinaryImageCompareDatabase": "", + "RemoveXFromUnknownWordsList": "", + "DownloadingPaddleOcrEngineDotDotDot": "", + "DownloadingPaddleOcrModelsDotDotDot": "", + "PaddleOcr": "", + "BinaryImageCompareInspectImageMatches": "" + }, + "Assa": { + "AssaDraw": "", + "DrawSelectTool": "", + "DrawLineTool": "", + "DrawBezierTool": "", + "DrawRectangleTool": "", + "DrawCircleTool": "", + "DrawCloseShape": "", + "DrawDeleteShape": "", + "DrawChangeLayer": "", + "DrawClearAll": "", + "DrawZoomIn": "", + "DrawZoomOut": "", + "DrawResetView": "", + "DrawToggleGrid": "", + "DrawCopyToClipboard": "", + "DrawShapes": "", + "DrawSelectedPoint": "", + "DrawSelectedShape": "", + "DrawSelectedLayer": "", + "DrawToolX": "", + "DrawHelpText": "", + "ProgressBarTitle": "", + "ProgressBarSettings": "", + "ProgressBarPosition": "", + "ProgressBarBottom": "", + "ProgressBarTop": "", + "ProgressBarForeColor": "", + "ProgressBarBackColor": "", + "ProgressBarStyle": "", + "ProgressBarSquareCorners": "", + "ProgressBarRoundedCorners": "", + "ProgressBarChapters": "", + "ProgressBarSplitterWidth": "", + "ProgressBarSplitterHeight": "", + "ProgressBarXAdjustment": "", + "ProgressBarYAdjustment": "", + "ProgressBarTextAlignment": "", + "ProgressBarTakePosFromVideo": "", + "ProgressBarPreview": "", + "ResolutionResamplerTitle": "", + "ResolutionResamplerSourceRes": "", + "ResolutionResamplerTargetRes": "", + "ResolutionResamplerChangeMargins": "", + "ResolutionResamplerChangeFontSize": "", + "ResolutionResamplerChangePositions": "", + "ResolutionResamplerChangeDrawing": "", + "ResolutionResamplerFromVideo": "", + "ResolutionResamplerSourceAndTargetEqual": "", + "ResolutionResamplerNothingSelected": "", + "BackgroundBoxGenerator": "", + "BackgroundBoxPadding": "", + "BackgroundBoxFillWidth": "", + "BackgroundBoxBoxColor": "", + "BackgroundBoxRadius": "", + "BackgroundBoxCircle": "", + "BackgroundBoxSpikes": "", + "BackgroundBoxBubbles": "", + "BackgroundBoxWave": "", + "BackgroundBoxHexagon": "", + "BackgroundBoxTornPaper": "", + "BackgroundBoxCloud": "", + "BackgroundBoxTornPaperDouble": "", + "BackgroundBoxStarburst": "", + "BackgroundBoxScroll": "", + "StylesTitle": "", + "StylesInFile": "", + "StylesSaved": "", + "StylesTitleX": "", + "PropertiesTitleX": "", + "AttachmentsTitleX": "", + "SmartWrappingTopWide": "", + "EndOfLineWrapping": "", + "NoWrapping": "", + "SmartWrappingBottomWide": "", + "FontsAndGraphics": "", + "WrapStyle": "", + "BorderAndShadowScaling": "", + "OriginalScript": "", + "Graphics": "", + "CopyToStorageStyles": "", + "CopyToFileStyles": "", + "SetStyleAsDefault": "", + "TakeUsagesFromDotDotDot": "", + "NoAttachmentsFound": "", + "DeleteStyleQuestion": "", + "DeleteStylesQuestion": "", + "OpenStyleImportFile": "", + "Primary": "", + "Secondary": "", + "ApplyOverrideTags": "", + "ChooseOverrideTagToAdd": "", + "FontSizeChange": "", + "MoveTextFromLeftToRight": "", + "ColorFromWhiteToRed": "", + "RotateXSlow": "", + "RotateX": "", + "RotateY": "", + "RotateTilt": "", + "SpaceIncrease": "", + "PopIn": "", + "SpinIn": "", + "PlayCurrent": "", + "SetPosition": "", + "ImageColorPicker": "", + "CopyColorAsHextoClipboard": "", + "GeneratingBackgroundBoxXOfY": "", + "ApplyAdvancedEffectTitle": "", + "ChooseEffect": "", + "AdvancedEffectTypewriter": "", + "AdvancedEffectTypewriterDescription": "", + "AdvancedEffectTypewriterWithHighlight": "", + "AdvancedEffectTypewriterWithHighlightDescription": "", + "AdvancedEffectWordByWord": "", + "AdvancedEffectWordByWordDescription": "", + "AdvancedEffectKaraoke": "", + "AdvancedEffectKaraokeDescription": "", + "AdvancedEffectFancyKaraoke": "", + "AdvancedEffectFancyKaraokeDescription": "", + "AdvancedEffectScrambleReveal": "", + "AdvancedEffectScrambleRevealDescription": "", + "AdvancedEffectRainbowPulse": "", + "AdvancedEffectRainbowPulseDescription": "", + "AdvancedEffectWave": "", + "AdvancedEffectWaveDescription": "", + "AdvancedEffectWaveBlue": "", + "AdvancedEffectWaveBlueDescription": "", + "AdvancedEffectStarWarsScroll": "", + "AdvancedEffectStarWarsScrollDescription": "", + "AdvancedEffectEndCreditsScroll": "", + "AdvancedEffectEndCreditsScrollDescription": "", + "AdvancedEffectStarfield": "", + "AdvancedEffectStarfieldDescription": "", + "AdvancedEffectRain": "", + "AdvancedEffectRainDescription": "", + "AdvancedEffectSnow": "", + "AdvancedEffectSnowDescription": "", + "AdvancedEffectOldMovie": "", + "AdvancedEffectOldMovieDescription": "", + "AdvancedEffectNeonBurst": "", + "AdvancedEffectNeonBurstDescription": "", + "AdvancedEffectSettings": "", + "AdvancedEffectSnowFlakeCount": "", + "AdvancedEffectStarfieldStarCount": "", + "AdvancedEffectStarfieldSpeed": "", + "AdvancedEffectGlitch": "", + "AdvancedEffectGlitchDescription": "", + "AdvancedEffectBounceIn": "", + "AdvancedEffectBounceInDescription": "", + "AdvancedEffectFireflies": "", + "AdvancedEffectFirefliesDescription": "", + "AdvancedEffectMatrix": "", + "AdvancedEffectMatrixDescription": "", + "AdvancedEffectAudioBars": "", + "AdvancedEffectAudioBarsDescription": "", + "AdvancedEffectAudioPulse": "", + "AdvancedEffectAudioPulseDescription": "", + "AdvancedEffectConfetti": "", + "AdvancedEffectConfettiDescription": "", + "AdvancedEffectHearts": "", + "AdvancedEffectHeartsDescription": "", + "AdvancedEffectWordSpacing": "", + "AdvancedEffectWordSpacingDescription": "", + "AdvancedEffectFancyKaraokeAutoDetectActiveWord": "", + "AdvancedEffectFancyKaraokeGlow": "", + "AdvancedEffectFancyKaraokeActiveColor": "", + "AdvancedEffectFancyKaraokeInactiveColor": "", + "AdvancedEffectFancyKaraokeInactiveOpacity": "", + "AdvancedEffectWordSpacingPixels": "", + "AdvancedEffectSlowZoomOut": "", + "AdvancedEffectSlowZoomOutDescription": "", + "AdvancedEffectSlowZoomIn": "", + "AdvancedEffectSlowZoomInDescription": "", + "AdvancedEffectFadeIn": "", + "AdvancedEffectFadeInDescription": "", + "AdvancedEffectFadeOut": "", + "AdvancedEffectFadeOutDescription": "", + "AdvancedEffectTvClose": "", + "AdvancedEffectTvCloseDescription": "", + "AdvancedEffectSlideInLeft": "", + "AdvancedEffectSlideInLeftDescription": "", + "AdvancedEffectSlideInRight": "", + "AdvancedEffectSlideInRightDescription": "", + "AdvancedEffectFadeInOut": "", + "AdvancedEffectFadeInOutDescription": "", + "OverrideTagsHistory": "" + }, + "About": { + "Title": "Over ondertitelbewerking", + "TranslatedBy": "Vertaald door: {0}", + "LicenseText": "Subtitle Edit is gratis software onder de MIT-licentie.", + "DescriptionTextBeta": "Subtitle Edit 5 bèta is een ontwikkelingsversie van onze komende grote release.\r\n\r\nWe zijn actief bezig met het verfijnen van de nieuwe tools en stellen uw hulp bij het testen op prijs.\r\n\r\nDeel uw feedback om ons te helpen de best mogelijke definitieve versie te garanderen.\r\n\r\n\r\nBedankt dat je deel uitmaakt van de Subtitle Edit-community!\r\n:)", + "IssueTrackingAndSourceCode": "Probleemtracking en broncode:", + "GitHub": "Github", + "Donate": "Doneer:", + "PayPal": "PayPal", + "GitHubSponsor": "Github-sponsor", + "Or": "of" + } +} \ No newline at end of file From c049fbf286e086e44e4faae05c0afdb90e08ddec Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 18:15:49 +0200 Subject: [PATCH 30/74] Add Spanish translation - thx MintKing12 :) Fix #10554 --- src/UI/Assets/Languages/Spanish.json | 2596 ++++++++++++++++++++++++++ src/UI/UI.csproj | 2 + 2 files changed, 2598 insertions(+) create mode 100644 src/UI/Assets/Languages/Spanish.json diff --git a/src/UI/Assets/Languages/Spanish.json b/src/UI/Assets/Languages/Spanish.json new file mode 100644 index 00000000000..c15b0456611 --- /dev/null +++ b/src/UI/Assets/Languages/Spanish.json @@ -0,0 +1,2596 @@ +{ + "title": "Subtitle Edit", + "version": null, + "translatedBy": "", + "cultureName": "es-ES", + "general": { + "abort": "Abortar", + "actor": "Actor", + "actors": "Actores", + "add": "Añadir", + "addDotDotDot": "Añadir...", + "addToNamesListCaseSensitive": "Añadir a la lista de nombres (sensible a mayúsculas)", + "addToUserDictionary": "Añadir al diccionario de usuario", + "addVideoFiles": "Añadir archivos de vídeo...", + "adjustAlpha": "Ajustar alfa (transparencia)", + "adjustDisplayDuration": "Ajustar duración de visualización", + "adjustment": "Ajuste", + "advanced": "Avanzado", + "advancedSettings": "Ajustes avanzados", + "after": "Después", + "alignment": "Alineación", + "alignmentDotDotDot": "Alineación...", + "alignmentX": "Establecer alineación \"{0}\" para las líneas seleccionadas", + "all": "Todo", + "allFiles": "Todos los archivos", + "alphaAdjustment": "Ajuste de alfa", + "aphaThreshold": "Umbral de alfa", + "apiKey": "Clave API", + "apiSecret": "Secreto", + "appearance": "Apariencia", + "append": "Anexar", + "apply": "Aplicar", + "applyTo": "Aplicar a", + "ascending": "Ascendente", + "attachDotDotDot": "Adjuntar...", + "audioFiles": "Archivos de audio", + "audioVisualizer": "Visualizador de audio", + "auto": "Auto", + "autoBreak": "Dividir texto automáticamente", + "autoContinue": "Continuar automáticamente", + "autoTranslate": "Traducción automática", + "autodetect": "Autodetectar", + "background": "Fondo", + "backgroundColor": "Color de fondo", + "backward": "Atrás", + "batchMode": "Modo por lotes", + "bdnXml": "BDN/xml", + "before": "Antes", + "beforeX": "Antes de \"{0}\"", + "beginning": "Principio", + "bluRaySup": "Blu-ray (sup)", + "bold": "Negrita", + "bookmarkAdd": "Añadir marcador", + "bookmarkAddForSelectedLinesX": "Añadir marcador para {0} líneas seleccionadas", + "bookmarkClearQuestion": "¿Borrar todos los marcadores?", + "bookmarkDeleteSelectedQuestion": "¿Eliminar el marcador seleccionado?", + "bookmarkDotDotDot": "Marcador...", + "bookmarkEdit": "Editar marcador", + "bookmarkEditForSelectedLinesX": "Editar marcador para {0} líneas seleccionadas", + "bookmarksList": "Listar marcadores", + "borderColor": "Color del borde", + "borderStyle": "Estilo del borde", + "bottomCenter": "Abajo-Centro", + "bottomLeft": "Abajo-Izquierda", + "bottomRight": "Abajo-Derecha", + "box": "Caja", + "boxColor": "Color de la caja", + "boxCornerRadius": "Radio de esquina de la caja", + "boxPerLine": "Caja por línea", + "bridgeGaps": "Unir espacios", + "cancel": "_Cancelar", + "cancelled": "Cancelado", + "caseInsensitive": "No sensible a mayúsculas", + "caseSensitive": "Sensible a mayúsculas", + "category": "Categoría", + "center": "Centro", + "centerHorizontally": "Centrar horizontalmente", + "centerVertically": "Centrar verticalmente", + "change": "Cambiar", + "changeAll": "Cambiar todo", + "changeCasing": "Cambiar mayúsculas/minúsculas", + "changeFormatting": "Cambiar formato", + "changeFrameRate": "Cambiar tasa de fotogramas", + "changeLanguageFilter": "Cambiar filtro de idioma...", + "changeOnce": "Cambiar una vez", + "changeSpeed": "Cambiar velocidad", + "character": "Carácter", + "characters": "Caracteres", + "charsPerSec": "Car./seg", + "chooseColorDotDotDot": "Elegir color...", + "chooseImageFiles": "Elegir archivos de imagen", + "class": "Clase", + "classic": "Clásico", + "clear": "Limpiar", + "close": "Cerrar", + "codec": "Códec", + "collapse": "Colapsar", + "color": "Color", + "colorDotDotDot": "Color...", + "column": "Columna", + "consoleLog": "Registro de consola", + "contentAlignment": "Alineación del contenido", + "conversionCancelledByUser": "Conversión cancelada por el usuario", + "convert": "Convertir", + "converted": "Convertido", + "convertingDotDotDot": "Convirtiendo...", + "convertingXofYDotDoDot": "Convirtiendo {0:#,###,##0}/{1:#,###,##0}...", + "copy": "Copiar", + "copyImageToClipboard": "Copiar imagen al portapapeles", + "copyTextToClipboard": "Copiar texto al portapapeles", + "couldNotSaveFileXErrorY": "No se pudo guardar el archivo \"{0}\". Error: {1}", + "count": "Cuenta", + "cps": "Car./seg", + "currentSubtitle": "Subtítulo actual", + "currentVideoPosition": "Posición actual del vídeo", + "cut": "Cortar", + "dark": "Oscuro", + "dateAndTime": "Fecha y hora", + "default": "Predeterminado", + "delete": "Eliminar", + "deleteAtPosition": "Eliminar subtítulo en la posición del vídeo", + "deleteCurrentLine": "Eliminar línea actual", + "deleteFirstLines": "Eliminar primeras líneas", + "deleteLastLines": "Eliminar últimas líneas", + "deleteLineXPrompt": "¿Eliminar la línea número {0}?", + "deleteLines": "Eliminar líneas", + "deleteLinesContainingText": "Eliminar líneas que contengan texto", + "deleteXLinesPrompt": "¿Eliminar {0} líneas?", + "description": "Descripción", + "dictionary": "Diccionario", + "diskSpace": "Espacio en disco", + "doNoChange": "No cambiar", + "done": "Hecho", + "doubleWords": "Palabras dobles", + "doubleLines": "Líneas dobles", + "download": "Descargar", + "downloadX": "Descargar {0}", + "downloadingX": "Descargando {0}", + "downloadingXPercent": "Descargando {0}%", + "duplicate": "Duplicar", + "duration": "Duración", + "durationMinutes": "Duración en minutos", + "edit": "Editar", + "editDotDotDot": "Editar...", + "editing": "Editando", + "effect": "Efecto", + "enabled": "Habilitado", + "encoding": "Codificación", + "endTime": "Tiempo final", + "engine": "Motor", + "enterProfileName": "Introducir nombre del perfil", + "error": "Error", + "errorX": "Error; {0}", + "example": "Ejemplo", + "exampleX": "Ejemplo: {0}", + "expand": "Expandir", + "export": "Exportar", + "exportDotDotDot": "Exportar...", + "exportToX": "Exportar a {0}", + "extendAfter": "Extender/acortar a la línea posterior", + "extendBefore": "Extender/acortar a la línea anterior", + "extendSelectedLinesToNextShotChangeOrNextSubtitle": "Extender líneas seleccionadas al siguiente cambio de plano (o siguiente subtítulo)", + "extendSelectedToNext": "Extender seleccionados al siguiente", + "extendSelectedToPrevious": "Extender seleccionados al anterior", + "extractingAudioClips": "Extrayendo clips de audio...", + "fade": "Desvanecimiento", + "fetchFirstWordFromNextSubtitle": "Traer primera palabra del siguiente subtítulo", + "fileAlreadyExists": "El archivo ya existe", + "fileExtension": "Extensión de archivo", + "fileName": "Nombre de archivo", + "fileNameX": "Nombre de archivo: {0}", + "fileNameXAndSize": "Nombre de archivo: {0} ({1})", + "fileSaved": "Archivo guardado", + "fileSavedToX": "Archivo guardado en {0}", + "fileXAlreadyExists": "El archivo \"{0}\" ya existe.", + "fileXOfY": "Archivo {0} de {1}", + "filter": "Filtro", + "filterByLayer": "Filtrar por capa", + "find": "Buscar", + "findNext": "Buscar siguiente", + "findTextX": "Buscar texto - {0}", + "fiveHundredMilliseconds": "500 milisegundos", + "fiveSeconds": "Cinco segundos", + "fix": "Corregir", + "fixCommonErrors": "Corregir errores comunes", + "fixRightToLeft": "Corregir derecha a izquierda", + "fixRightToLeftViaUnicodeTags": "Corregir RTL mediante etiquetas Unicode", + "fixedValue": "Valor fijo", + "focusSelectedLine": "Enfocar línea seleccionada (desplazar en la cuadrícula)", + "font": "Fuente", + "fontColor": "Color de fuente", + "fontHeight": "Altura de fuente", + "fontName": "Nombre de fuente", + "fontNameDotDotDot": "Nombre de fuente...", + "fontSize": "Tamaño de fuente", + "fonts": "Fuentes", + "footer": "Pie de página", + "forced": "Forzado", + "foreground": "Primer plano", + "format": "Formato", + "forward": "Adelante", + "foundNoMatches": "No se encontraron coincidencias", + "foundOneMatch": "Se encontró una coincidencia", + "foundXInLineYZ": "Encontrado \"{0}\" en la línea {1}, posición {2}", + "foundXMatches": "Encontrado {0} coincidencias", + "frameRate": "Tasa de fotogramas", + "frameRateX": "Tasa de fotogramas: {0:0.0###}", + "frames": "Fotogramas", + "from": "Desde", + "fromCurrentVideoPosition": "desde la posición actual del vídeo", + "gap": "Espacio", + "general": "General", + "generalText": "General", + "generate": "Generar", + "generateImportShotChanges": "Generar/importar cambios de plano", + "generating": "Generando...", + "generatingImageXofY": "Generando imagen {0:#,##0} de {1:#,##0}...", + "generatingWavFile": "Generando archivo wav...", + "getAudioClips": "Obtener clips de audio", + "goTo": "Ir a", + "goToLineNumber": "Ir al número de línea", + "goToNextShotChange": "Ir al siguiente cambio de plano", + "goToPreviousShotChange": "Ir al anterior cambio de plano", + "googleIt": "Buscar en Google", + "group": "Grupo", + "header": "Encabezado", + "height": "Altura", + "help": "Ayuda", + "hex": "Hex", + "hide": "Ocultar", + "hidePreview": "Ocultar vista previa", + "history": "Historial", + "horizontal": "Horizontal", + "hourMinutesSecondsDecimalSeparatorMilliseconds": "Hora:min:seg{0}ms", + "hourMinutesSecondsFrames": "Hora:min:seg:fotogramas", + "ip": "IP", + "id": "ID", + "image": "Imagen", + "imageSaved": "Imagen guardada", + "imagedBasedSubtitles": "Subtítulos basados en imágenes", + "images": "Imágenes", + "imagesWithTimeCode": "Imágenes con código de tiempo", + "import": "Importar", + "importDotDotDot": "Importar...", + "include": "Incluir", + "information": "Información", + "insertAfter": "Insertar después", + "insertAtPositionAndFocusTextBox": "Insertar subtítulo en posición del vídeo y enfocar cuadro de texto", + "insertAtPositionNoFocusTextBox": "Insertar subtítulo en posición del vídeo (sin enfocar cuadro de texto)", + "insertBefore": "Insertar antes", + "insertLine": "Insertar línea", + "insertNewSelection": "Insertar nueva selección", + "insertSubtitleAfterCurrentLine": "Insertar subtítulo tras la línea actual...", + "insertSubtitleFileAtVideoPositionDotDotDot": "Insertar archivo de subtítulos en posición del vídeo...", + "inspectAdditions": "Inspeccionar adiciones...", + "invertSelection": "Invertir selección", + "isDefault": "Es predeterminado", + "italic": "Cursiva", + "keepExistingTimeCodes": "Mantener códigos de tiempo existentes (no añadir desfase)", + "keyFile": "Archivo de clave", + "language": "Idioma", + "languagePostFix": "Postfijo de idioma (mkv/mp4)", + "layer": "Capa", + "layerFilterOn": "Filtro de capa activado", + "left": "Izquierda", + "light": "Luz", + "lineHeigth": "Altura de línea", + "lineNumber": "Línea#", + "lineXColumnY": "Línea {0}, columna {1}", + "lines": "Líneas", + "linesAddedX": "Líneas añadidas: {0}", + "linesChangedX": "Líneas cambiadas: {0}", + "linesDeletedX": "Líneas eliminadas: {0}", + "listErrors": "Listar errores", + "loadDefaults": "Cargar predeterminados", + "lockTimeCodes": "Bloquear códigos de tiempo", + "logo": "Logotipo", + "margin": "Margen", + "match": "Coincidencia", + "maxCharactersPerSecond": "Máximo de caracteres por segundo", + "mediaInformation": "Información del medio", + "mergeAfter": "Combinar con línea posterior", + "mergeBefore": "Combinar con línea anterior", + "mergeLines": "Combinar líneas", + "mergeLinesWithSameText": "Combinar líneas con el mismo texto", + "mergeLinesWithSameTimeCodes": "Combinar líneas con mismos códigos de tiempo", + "mergeSelected": "Combinar seleccionados", + "mergeSelectedAsDialog": "Combinar seleccionados como diálogo", + "mergeSelectedLines": "Combinar líneas seleccionadas", + "mergeSelectedLinesDialog": "Combinar líneas seleccionadas como diálogo", + "mergeWithLineAfterAndAutoBreak": "Combinar con línea posterior y división automática", + "mergeWithLineAfterKeepBreaks": "Combinar con línea posterior (mantener saltos)", + "mergeWithLineBeforeAndAutoBreak": "Combinar con línea anterior y división automática", + "mergeWithLineBeforeKeepBreaks": "Combinar con línea anterior (mantener saltos)", + "middleCenter": "Medio-Centro", + "middleLeft": "Medio-Izquierda", + "middleRight": "Medio-Derecha", + "milliseconds": "Milisegundos", + "model": "Modelo", + "models": "Modelos", + "more": "Más", + "moreInfo": "Más info", + "moveAllShotChangeOneFrameBack": "Mover todos los cambios de plano un fotograma atrás", + "moveAllShotChangeOneFrameForward": "Mover todos los cambios de plano un fotograma adelante", + "moveDown": "Bajar", + "moveUp": "Subir", + "multipleReplace": "Reemplazo múltiple", + "name": "Nombre", + "negative": "Negativo", + "new": "Nuevo", + "newDotDotDot": "Nuevo...", + "newProfile": "Nuevo perfil", + "newSubtitleStartKeyDownSetEndKeyUp": "Insertar subtítulo: Inicio al pulsar tecla, fin al soltar", + "setSubtitleStartAtVideoPositionSetEndAtKeyUpAndGoToNext": "Inicio en pos. vídeo, fin al soltar tecla e ir al siguiente", + "no": "No", + "noFilesToConvert": "Sin archivos para convertir", + "noLanguageCode": "Sin código de idioma", + "noSubtitleLoaded": "Ningún subtítulo cargado", + "noSubtitlesFound": "¡No se han encontrado subtítulos!", + "noSymbolLines": "#Líneas", + "noVideoLoaded": "Ningún vídeo cargado", + "none": "Ninguno", + "normalCasing": "Uso normal de mayúsculas", + "notAvailable": "N/D", + "notInstalled": "No instalado", + "number": "Número", + "numberSymbol": "#", + "ocrDotDotDot": "OCR...", + "ocrPercentX": "OCR: {0}%", + "offset": "Desfase", + "offsetTimeCodes": "Desfasar códigos de tiempo", + "offsetX": "Desfase X", + "offsetY": "Desfase Y", + "ok": "_Aceptar", + "oneFile": "Un archivo", + "oneHundredMilliseconds": "100 milisegundos", + "oneSecond": "Un segundo", + "oneSecondBack": "Un segundo atrás", + "oneSecondForward": "Un segundo adelante", + "onlineVideoFeatureNotAvailable": "Función no disponible para vídeo en línea", + "openContainingFolder": "Abrir carpeta contenedora", + "openDictionaryFolder": "Abrir carpeta de diccionarios", + "openFile": "Abrir archivo", + "openImageBasedSubtitle": "Abrir subtítulo basado en imágenes", + "openImageFile": "Abrir archivo de imagen", + "openOriginalSubtitleFile": "Abrir archivo de subtítulo original...", + "openOriginalSubtitleFileTitle": "Abrir archivo de subtítulo original", + "openOutputFolder": "Abrir carpeta de salida", + "openSubtitle": "Abrir subtítulo...", + "openSubtitleFileTitle": "Abrir archivo de subtítulos", + "openSubtitles": "Abrir subtítulos...", + "openVideoFile": "Abrir archivo de vídeo...", + "openVideoFileTitle": "Abrir archivo de vídeo", + "optimalCharactersPerSecond": "Caracteres por segundo óptimos", + "options": "Opciones", + "originalText": "Texto original", + "outline": "Contorno", + "outlineColor": "Color del contorno", + "outlineWidth": "Ancho del contorno", + "outputFolder": "Carpeta de salida", + "outputProperties": "Propiedades de salida", + "overlap": "Superposición", + "overlapNextX": "Superp. siguiente ({0:#;##0.###})", + "overlapPreviousLineX": "Superp. línea ant. ({0:#;##0.###})", + "overlapStartAndEnd": "Superponer inicio y fin", + "overlapX": "Superposición ({0:#;##0.###})", + "overwriteExistingFiles": "Sobrescribir archivos existentes", + "overwriteFilesInFolderX": "Sobrescribir archivos en la carpeta: \"{0}\"", + "overwriteQuestion": "¿Sobrescribir?", + "padding": "Relleno", + "parameters": "Parámetros", + "parsingXDotDotDot": "Analizando {0}...", + "paste": "Pegar", + "pasteNewSelection": "Pegar texto del portapapeles en nueva selección", + "pause": "Pausa", + "percent": "Porcentaje", + "pickLayer": "Establecer capa", + "pickOllamaModel": "Elegir modelo Ollama", + "pickOutputFolder": "Elegir carpeta de salida", + "pickResolutionFromCurrentVideo": "Elegir resolución del vídeo actual", + "pickResolutionFromVideoDotDotDot": "Elegir resolución del vídeo...", + "pickSubtitleFile": "Elegir archivo de subtítulos...", + "pickVideoFile": "Elegir archivo de vídeo...", + "pickVideoPosition": "Elegir posición del vídeo", + "play": "Reproducir", + "playFromStartOfVideo": "Reprod. desde el inicio del vídeo", + "playNext": "Reprod. siguiente", + "playSelectedLines": "Reprod. líneas seleccionadas", + "playSelectedLinesWithLoop": "Reprod. líneas seleccionadas en bucle", + "pleaseEnterAValidValueForX": "Por favor, introduzca un valor válido para \"{0}\"", + "pleaseWait": "Por favor, espere...", + "position": "Posición", + "positionX": "Posición: {0}", + "postProcessing": "Post-procesamiento", + "poweredBy": "Impulsado por", + "prefix": "Prefijo", + "preview": "Vista previa", + "profile": "Perfil", + "profileName": "Nombre del perfil", + "profiles": "Perfiles", + "property": "Propiedad", + "question": "Pregunta", + "reDownloadX": "Volver a descargar {0}", + "reason": "Razón", + "recentFiles": "Archivos recientes", + "redo": "Rehacer", + "refresh": "Actualizar", + "region": "Región", + "regularExpression": "Expresión regular", + "regularExpressionIsNotValid": "¡La expresión regular no es válida!", + "relativeToCurrentVideoPosition": "Relativo a la posición actual del vídeo", + "remove": "Eliminar", + "removeAlignment": "Eliminar alineación", + "removeAllFormatting": "Eliminar todo el formato", + "removeBlankLines": "Eliminar líneas en blanco", + "removeBold": "Eliminar negrita", + "removeColor": "Eliminar color", + "removeFilter": "Eliminar filtro", + "removeFontName": "Eliminar nombre de fuente", + "removeFormatting": "Eliminar formato", + "removeItalic": "Eliminar cursiva", + "removeRightToLeftUnicodeTags": "Eliminar etiquetas Unicode RTL", + "removeSelectedFile": "¿Eliminar archivo seleccionado?", + "removeStyling": "Eliminar estilo", + "removeTextForHearingImpaired": "Eliminar texto para deficientes auditivos", + "removeUnderline": "Eliminar subrayado", + "rename": "Renombrar", + "replace": "Reemplazar", + "replaceWith": "Reemplazar con", + "requiresRestart": "Requiere reiniciar", + "reset": "Restablecer", + "resolution": "Resolución", + "resolutionX": "Resolución: {0}", + "reverseRightToLeftStartEnd": "Invertir inicio/fin RTL", + "right": "Derecha", + "rightToLeft": "Derecha a izquierda", + "rules": "Reglas", + "saveChangesMessage": "¿Desea guardar los cambios en el archivo de subtítulos actual?", + "saveChangesTitle": "¿Guardar cambios?", + "saveChangesToX": "¿Desea guardar los cambios en \"{0}\"?", + "saveChangesToXOriginal": "¿Desea guardar los cambios en el archivo original \"{0}\"?", + "saveDotDotDot": "Guardar...", + "saveFileAsTitle": "Guardar archivo como", + "saveImageAs": "Guardar imagen como", + "saveImageAsDotDotDot": "Guardar imagen como...", + "saveOriginalAsTitle": "Guardar original como", + "saveTranslationAsTitle": "Guardar traducción como", + "saveVideoAsVideoTitle": "Guardar vídeo como", + "savedChangesToX": "Guardado \"{0}\"", + "savedChangesToXAndY": "Guardado \"{0}\" y \"{1}\"", + "savingDotDotDot": "Guardando...", + "script": "Guion", + "search": "Buscar", + "searchDirection": "Dirección de búsqueda", + "searchFontNames": "Buscar nombres de fuente...", + "searchSubtitleFormats": "Buscar formatos de subtítulos", + "seconds": "Segundos", + "selectAll": "Seleccionar todo", + "selectFilesToConvert": "Seleccionar archivos para convertir", + "selectNone": "No seleccionar nada", + "selectSaveFolder": "Seleccionar carpeta para guardar", + "selectSubtitle": "Seleccionar subtítulo", + "selectedAFolderToSaveTo": "Carpeta seleccionada para guardar", + "selectedLines": "Líneas seleccionadas", + "selectedlinesX": "Líneas seleccionadas: {0}", + "sensitivity": "Sensibilidad", + "separator": "Separador", + "sessionKey": "Clave de sesión", + "sessionKeyGenerate": "Generar nueva clave", + "setEnd": "Establecer fin", + "setEndAndGoToNext": "Establecer fin e ir al siguiente", + "setEndAndOffsetTheRest": "Establecer fin y desfasar el resto", + "setFontDotDotDot": "Establecer fuente...", + "setStart": "Establecer inicio", + "setStartAndOffsetTheRest": "Establecer inicio y desfasar el resto", + "setVideoOffset": "Establecer desfase de vídeo", + "settings": "Ajustes", + "shadow": "Sombra", + "shadowColor": "Color de sombra", + "shadowWidth": "Ancho de sombra", + "shortcut": "Atajo", + "shortcutX": "Atajo: {0}", + "shortcuts": "Atajos", + "show": "Mostrar", + "showActorColumn": "Mostrar columna \"Actor\"", + "showCpsColumn": "Mostrar columna \"Car./seg\"", + "showDurationColumn": "Mostrar columna \"Duración\"", + "showGapColumn": "Mostrar columna \"Espacio\"", + "showStartColumn": "Mostrar columna \"Inicio\"", + "showHideColumn": "Mostrar columna \"Ocultar\"", + "showHistory": "Mostrar historial", + "showLayerColumn": "Mostrar columna \"Capa\"", + "showPreview": "Mostrar vista previa", + "showShotChangesList": "Mostrar lista de cambios de plano", + "showStyleColumn": "Mostrar columna \"Estilo\"", + "showTimeCodes": "Mostrar códigos de tiempo", + "showWpmColumn": "Mostrar columna \"Pal./min\"", + "showPixelWidthColumn": "Mostrar columna \"Ancho píxeles\"", + "shrink": "Encoger", + "singleBox": "Caja única", + "singleLineLengths": "Longitud de línea única:", + "singleMode": "Modo único", + "size": "Tamaño", + "sizeX": "Tamaño: {0}", + "skip": "Omitir", + "skipAll": "Omitir todo", + "skipOnce": "Omitir una vez", + "smart": "Inteligente", + "snapSelectedLinesToNearestShotChange": "Ajustar inicio/fin de líneas al cambio de plano más cercano", + "solidColor": "Color sólido", + "sourceViewX": "Vista de origen - {0}", + "spacing": "Espaciado", + "speechToTextSelectedLines": "Voz a texto seleccionadas (ver Opciones - Ajustes)", + "speechToTextSelectedLinesPromptAlways": "Voz a texto seleccionadas (preguntar siempre motor/idioma)", + "speechToTextSelectedLinesPromptFirstTime": "Voz a texto seleccionadas (preguntar motor/idioma solo la primera vez)", + "speed": "Velocidad", + "splitAtTextBoxCursorPosition": "Dividir en la posición del cursor", + "splitLine": "Dividir línea", + "splitLineAtTextBoxCursorPosition": "Dividir línea en la posición del cursor", + "splitLineAtVideoAndTextBoxPosition": "Dividir línea en pos. vídeo y cuadro texto", + "splitLineAtVideoPosition": "Dividir línea en la posición del vídeo", + "startFrom": "Empezar desde", + "startTime": "Tiempo de inicio", + "startingDotDotDot": "Iniciando...", + "status": "Estado", + "stereo": "Estéreo", + "stop": "Parar", + "strikeout": "Tachado", + "style": "Estilo", + "styleExaggeration": "Exageración de estilo", + "styleLanguage": "Estilo / Idioma", + "styles": "Estilos", + "subtitleFile": "Archivo de subtítulos", + "subtitleFileName": "Nombre del archivo de subtítulos", + "subtitleFileSaved": "Archivo de subtítulos guardado", + "subtitleFileSavedToX": "Archivo de subtítulos guardado en {0}", + "subtitleFiles": "Archivos de subtítulos", + "subtitleFormats": "Formatos de subtítulos", + "subtitleLoadedX": "Subtítulo cargado: {0}", + "subtitleXOfY": "Subtítulo {0} de {1}", + "suffix": "Sufijo", + "suggestions": "Sugerencias", + "sync": "Sincronizar", + "syntaxColoring": "Coloreado de sintaxis", + "system": "Sistema", + "targetEncoding": "Codificación de destino", + "targetFormat": "Formato de destino", + "tenHours": "10 horas", + "tenMilliseconds": "10 milisegundos", + "text": "Texto", + "textColor": "Color de texto", + "textFiles": "Archivos de texto", + "textOrImage": "Texto/imagen", + "threeLetterLanguageCode": "Código de idioma de tres letras", + "time": "Tiempo", + "timeCodes": "Códigos de tiempo", + "timing": "Tiempos", + "title": "Título", + "to": "A", + "toggleCasing": "Alternar mayúsculas/minúsculas", + "toggleDirection": "Alternar dirección", + "toggleForced": "Alternar forzado", + "toggleShotChangesAtVideoPosition": "Alternar cambios de plano en posición del vídeo", + "toolbar": "Barra de herramientas", + "tools": "Herramientas", + "topCenter": "Arriba-Centro", + "topLeft": "Arriba-Izquierda", + "topRight": "Arriba-Derecha", + "totalAdjustmentX": "Ajuste total: {0}", + "totalFramesX": "Fotogramas totales: {0:#;##0.##}", + "totalLengthX": "Longitud total: {0}", + "totalLengthXSplitLine": "Longitud total: {0} (¡dividir línea!)", + "translate": "Traducir", + "translateRow": "Traducir fila", + "translation": "Traducción", + "twoLetterLanguageCode": "Código de idioma de dos letras", + "type": "Tipo", + "unbreak": "Unir texto", + "unbreakLines": "Unir líneas", + "underline": "Subrayado", + "undo": "Deshacer", + "unknown": "Desconocido", + "unknownSubtitleFormat": "Formato de subtítulo desconocido", + "unpacking7ZipArchiveDotDotDot": "Desempaquetando archivo 7-zip...", + "unpackingX": "Desempaquetando {0}", + "untitled": "Sin título", + "update": "Actualizar", + "updateAndClose": "Actualizar y cerrar", + "updateDetails": "Detalles de actualización", + "updatedBy": "Actualizado por", + "url": "URL", + "usages": "Usos", + "use": "Usar", + "useAlways": "Usar siempre", + "useLargerFontForThisWindow": "Usar fuente más grande para esta ventana", + "useOnce": "Usar una vez", + "useOutputFolder": "Usar carpeta de salida", + "useSourceFolder": "Usar carpeta de origen", + "useSourceResolution": "Usar resolución de origen", + "userName": "Nombre de usuario", + "userNameAlreadyInUse": "Nombre de usuario ya en uso", + "vertical": "Vertical", + "video100MsBack": "Vídeo, 100 ms atrás", + "video100MsForward": "Vídeo, 100 ms adelante", + "video500MsBack": "Vídeo, 500 ms atrás", + "video500MsForward": "Vídeo, 500 ms adelante", + "videoCustom1BackX": "Vídeo, milisegundos personalizados ({0:#,###,##0}) atrás, 1", + "videoCustom1ForwardX": "Vídeo, milisegundos personalizados ({0:#,###,##0}) adelante, 1", + "videoCustom2BackX": "Vídeo, milisegundos personalizados ({0:#,###,##0}) atrás, 2", + "videoCustom2ForwardX": "Vídeo, milisegundos personalizados ({0:#,###,##0}) adelante, 2", + "videoEncodingX": "Codificación de vídeo: {0}", + "videoExtension": "Extensión de archivo de vídeo", + "videoFile": "Archivo de vídeo", + "videoFileGeneratedX": "Archivo de vídeo generado: \"{0}\"", + "videoFiles": "Archivos de vídeo", + "videoInformation": "Info. vídeo", + "videoOffset": "Desfase de vídeo", + "videoOneFrameBack": "Vídeo, un fotograma atrás", + "videoOneFrameForward": "Vídeo, un fotograma adelante", + "videoOneSecondBack": "Vídeo, un segundo atrás", + "videoOneSecondForward": "Vídeo, un segundo adelante", + "videoPlayer": "Reproductor de vídeo", + "videoPosition": "Posición del vídeo", + "videoResolution": "Resolución del vídeo", + "viewX": "Ver {0}", + "visible": "Visible", + "voice": "Voz", + "warning": "Aviso", + "waveformCenterOnVideoPosition": "Centrar forma de onda en posición del vídeo", + "waveformPasteFromClipboard": "Pegar desde el portapapeles", + "waveformSpectrogram": "Forma de onda/espectrograma", + "webServiceUrl": "URL del servicio web", + "width": "Ancho", + "windowPositionAndSize": "Posición y tamaño de la ventana", + "wordsPerMin": "Pal./min", + "pixelWidth": "Ancho píxeles", + "wpm": "Pal./min", + "xFiles": "{0:#,###,##0} archivos", + "xFilesConvertedInY": "{0:#,###,##0} archivos convertidos en {1}", + "xNotFound": "\"{0}\" no encontrado", + "xRequiresAnApiKey": "{0} requiere una clave API", + "xSeconds": "{0:0.0##} segundos", + "xSubtitles": "{0:#,###,##0} subtítulos", + "yes": "Sí", + "copyToClipboard": "Copiar al portapapeles", + "playCurrent": "Reproducir actual", + "leftMargin": "Margen izquierdo", + "rightMargin": "Margen derecho", + "installed": "Instalado", + "advancedDotDotDot": "Avanzado...", + "chooseAlignment": "Elegir alineación" + }, + "main": { + "menu": { + "file": "_Archivo", + "new": "_Nuevo", + "newKeepVideo": "Nuevo (mantener _vídeo)", + "open": "_Abrir...", + "openKeepVideo": "Abrir (_mantener vídeo)...", + "openOriginal": "Abrir ori_ginal...", + "closeOriginal": "_Cerrar original", + "reopen": "_Reabrir...", + "clearRecentFiles": "_Limpiar archivos recientes", + "restoreAutoBackup": "Restaurar copia de _seguridad automática...", + "save": "_Guardar", + "saveAs": "Guardar _como...", + "openContainingFolder": "Abrir _carpeta contenedora", + "compare": "Com_parar...", + "statistics": "E_stadísticas...", + "import": "_Importar", + "export": "_Exportar", + "exit": "Sa_lir", + "edit": "_Editar", + "undo": "_Deshacer", + "redo": "Re_hacer", + "showHistory": "_Mostrar historial para deshacer...", + "find": "_Buscar...", + "findNext": "Buscar _siguiente", + "replace": "_Reemplazar...", + "multipleReplace": "Reemplazo _múltiple...", + "goToLineNumber": "_Ir al número de línea...", + "rightToLeftMode": "Modo d_erecha a izquierda", + "modifySelectionDotDotDot": "Modificar _selección...", + "tools": "_Herramientas", + "toolsSelectedLines": "_Herramientas (líneas seleccionadas)", + "adjustDurations": "_Ajustar duraciones...", + "applyDurationLimits": "Aplicar _límites de duración...", + "batchConvert": "Conversión por _lotes...", + "bridgeGaps": "Unir _espacios...", + "applyMinGap": "Aplicar espacio mín. entre subtítulos...", + "changeCasing": "_Cambiar mayúsculas/minúsculas...", + "changeFormatting": "Cambiar formato...", + "fixCommonErrors": "Corregir errores _comunes...", + "checkAndFixNetflixErrors": "Comprobar y corregir errores de Netfli_x...", + "makeEmptyTranslationFromCurrentSubtitle": "Crear nueva traducción _vacía desde subtítulo actual", + "mergeLinesWithSameText": "_Combinar líneas con el mismo texto...", + "mergeLinesWithSameTimeCodes": "Combinar líneas con mismos códigos de tiempo...", + "splitBreakLongLines": "Dividir/reequilibrar líneas largas...", + "mergeShortLines": "Combinar líneas cortas...", + "renumber": "Renumerar...", + "removeTextForHearingImpaired": "_Eliminar texto para deficientes auditivos...", + "convertActors": "Convertir actores...", + "joinSubtitles": "_Unir subtítulos...", + "splitSubtitle": "_Dividir subtítulo...", + "assaTools": "Herramientas _ASSA", + "assaProgressBar": "Generar barra de _progreso...", + "assaChangeResolution": "Cambiar _resolución...", + "assaGenerateBackground": "Generar cajas de _fondo...", + "assaApplyAdvancedEffects": "Aplicar efectos _avanzados...", + "assaApplyCustomOverrideTags": "Aplicar etiquetas de _anulación...", + "assaSetPosition": "Establecer _posición...", + "assaImageColorPicker": "Selector de color de _imagen...", + "assaDraw": "_Dibujar...", + "assaStyles": "E_stilos...", + "assaProperties": "P_ropiedades...", + "assaAttachments": "_Adjuntos...", + "spellCheckTitle": "Ortografía", + "spellCheck": "_Corrector ortográfico...", + "findDoubleWords": "_Buscar palabras dobles...", + "findDoubleLines": "_Buscar líneas dobles...", + "addNameToNamesList": "_Añadir nombre a la lista...", + "getDictionaries": "_Obtener diccionarios...", + "video": "_Vídeo", + "openVideo": "_Abrir vídeo...", + "openVideoFromUrl": "Abrir vídeo desde _URL...", + "closeVideoFile": "_Cerrar archivo de vídeo", + "audioTracks": "_Pistas de audio", + "speechToText": "_Voz a texto...", + "textToSpeech": "_Texto a voz...", + "setVideoOffset": "Establecer desfase de vídeo...", + "updateVideoOffsetX": "Actualizar desfase de vídeo desde {0}...", + "smpteTiming": "Tiempos SMPTE (tasa fotogramas no entera)", + "generateBurnIn": "Generar vídeo con subtítulos _incrustados...", + "generateTransparent": "_Generar vídeo transparente con subtítulos...", + "generateImportShotChanges": "Generar/importar cambios de _plano...", + "listShotChanges": "Listar cambios de p_lano...", + "undockVideoControls": "_Desacoplar controles de vídeo", + "dockVideoControls": "_Acoplar controles de vídeo", + "synchronization": "Si_ncronización", + "adjustAllTimes": "_Ajustar todos los tiempos...", + "changeFrameRate": "Cambiar _tasa de fotogramas...", + "changeSpeed": "Cambiar _velocidad...", + "visualSync": "Sincronización _visual...", + "options": "_Opciones", + "settings": "_Ajustes...", + "shortcuts": "Atajos de _teclado...", + "wordLists": "_Listas de palabras...", + "chooseLanguage": "_Elegir idioma de la interfaz...", + "translate": "Tr_aducir", + "autoTranslate": "Traducción _automática...", + "translateViaCopyPaste": "Auto-traducir mediante _copiar-pegar...", + "helpTitle": "A_yuda", + "help": "A_yuda...", + "about": "_Acerca de...", + "checkForUpdates": "_Buscar actualizaciones...", + "fixRightToLeftViaUnicodeControlCharacters": "Corregir RTL mediante caracteres Unicode (líneas sel.)", + "removeUnicodeControlCharacters": "Eliminar caracteres de control Unicode (líneas sel.)", + "reverseRightToLeftStartEnd": "Invertir inicio/fin RTL (líneas sel.)", + "pointSync": "Sincronización por _puntos...", + "pointSyncViaOther": "Sincronización por puntos mediante _otro subtítulo...", + "sortSubtitles": "_Ordenar subtítulos...", + "setLayer": "Establecer capa...", + "filterLayersForDisplayDotDotDot": "Filtrar capas para visualización..." + }, + "toolbar": { + "newHint": "Iniciar un nuevo archivo de subtítulos {0}", + "openHint": "Abrir un archivo de subtítulos existente {0}", + "openVideoHint": "Abrir un archivo de vídeo {0}", + "saveHint": "Guardar el subtítulo actual {0}", + "saveAsHint": "Guardar subtítulo con un nombre nuevo {0}", + "findHint": "Buscar texto en los subtítulos {0}", + "replaceHint": "Buscar y reemplazar texto {0}", + "spellCheckHint": "Comprobar errores ortográficos {0}", + "fixCommonErrorsHint": "Corregir errores comunes de subtítulos {0}", + "settingsHint": "Ajustar la configuración del programa {0}", + "layoutHint": "Cambiar el diseño de los paneles {0}", + "helpHint": "Abrir sitio web de ayuda {0}", + "autoBreakHint": "Dividir automáticamente las líneas largas {0}", + "unbreakHint": "Combinar subtítulos multilínea en una sola línea {0}", + "assaStylesHint": "Estilos Advanced Sub Station Alpha", + "assaPropertiesHint": "Propiedades Advanced Sub Station Alpha", + "assaAttachmentsHint": "Adjuntos Advanced Sub Station Alpha", + "assaDrawHint": "Dibujar formas Advanced Sub Station Alpha" + }, + "waveform": { + "playPauseHint": "Reproducir / Pausa {0}", + "playNextHint": "Reproducir siguiente {0}", + "playSelectionHint": "Reproducir selección {0}", + "setStartAndOffsetTheRestHint": "Establecer inicio del subtítulo actual y desfasar el resto {0}", + "setStartHint": "Establecer inicio del subtítulo actual {0}", + "setEndHint": "Establecer fin del subtítulo actual {0}", + "newHint": "Insertar nuevo subtítulo en la posición del vídeo {0}", + "centerWaveformHint": "Centrar forma de onda en la posición del vídeo al reproducir {0}", + "zoomHorizontalHint": "Zoom horizontal {0}", + "zoomVerticalHint": "Zoom vertical {0}", + "selectCurrentLineWhilePlayingHint": "Seleccionar subtítulo actual durante la reproducción {0}", + "videoPosition": "Posición del vídeo {0}", + "hideWaveformToolbar": "Ocultar barra de herramientas {0}", + "resetZoomAndSpeed": "Restablecer zoom y velocidad de reproducción {0}", + "removeBlankLines": "Eliminar líneas en blanco {0}", + "playSelectedRepeatHint": "Reproducir subtítulo(s) seleccionados en modo repetición {0}" + }, + "audioTrackIsNowX": "La pista de audio es ahora \"{0}\"", + "audioTrackX": "Pista de audio {0}", + "autoBreakHint": "Dividir líneas seleccionadas automáticamente", + "charactersPerSecond": "Car./segundo: {0}", + "chooseColumn": "Elegir columna", + "columnPaste": "Pegado de columna", + "createdEmptyTranslation": "Creada traducción vacía desde subtítulo actual", + "deleteText": "Eliminar texto", + "deleteTextAndShiftCellsUp": "Eliminar texto y desplazar celdas arriba", + "endTimeMustBeAfterStartTime": "El tiempo final debe ser posterior al tiempo de inicio.", + "errorLoad7Zip": "Este archivo parece ser un archivo 7-Zip comprimido.\n\nSubtitle Edit no puede abrir archivos comprimidos.", + "errorLoadBinaryZeroes": "¡Lo sentimos, este archivo solo contiene ceros binarios!\n\nSi has editado este archivo con Subtitle Edit, podrías encontrar una copia en Archivo -> Restaurar copia de seguridad automática...", + "errorLoadGZip": "Este archivo parece ser un archivo GZip comprimido.\n\nSubtitle Edit no puede abrir archivos comprimidos.", + "errorLoadJpg": "Este archivo parece ser una imagen JPG.\n\nSubtitle Edit no puede abrir archivos de imagen.", + "errorLoadPng": "Este archivo parece ser una imagen PNG.\n\nSubtitle Edit no puede abrir archivos de imagen.", + "errorLoadRar": "Este archivo parece ser un archivo Rar comprimido.\n\nSubtitle Edit no puede abrir archivos comprimidos.", + "errorLoadSrr": "Este archivo parece ser un archivo ReScene SRR.\n\nSubtitle Edit no puede abrir archivos SRR.", + "errorLoadTorrent": "Este archivo parece ser un archivo BitTorrent.\n\nSubtitle Edit no puede abrir archivos torrent.", + "errorLoadZip": "Este archivo parece ser un archivo ZIP comprimido.\n\nSubtitle Edit no puede abrir archivos comprimidos.", + "extractingWaveInfo": "Extrayendo info de onda...", + "extractingShotChanges": "Extrayendo cambios de plano...", + "failedToExtractWaveInfo": "Error al extraer info de onda.", + "fixedRightToLeftUsingUnicodeControlCharactersX": "Corregido derecha a izquierda usando caracteres Unicode en {0} líneas", + "generatingSpectrogramDotDotDot": "Generando espectrograma...", + "generatingWaveformDotDotDot": "Generando forma de onda...", + "insertEmptyTextAndShiftCellsDown": "Insertar texto vacío y desplazar celdas abajo", + "insertTextFromSubtitleDotDotDot": "Insertar texto desde subtítulo...", + "copyTextFromOriginalToCurrent": "Copiar texto del original al subtítulo actual", + "insertedXTextsFromSubtitleY": "Insertados {0} textos del archivo de subtítulos \"{1}\"", + "italicHint": "Poner en cursiva líneas/texto seleccionados", + "joinedSubtitleLoaded": "Subtítulo unido cargado", + "lineXTextAndTimingChanged": "Línea {0}: Texto y tiempos cambiados", + "lineXTextChangedFromYToZ": "Línea {0}: Texto cambiado de \"{1}\" a \"{2}\"", + "lineXTimingChanged": "Línea {0}: Tiempos cambiados", + "loadingWaveInfoFromCache": "Cargando info de onda desde caché...", + "noTextInClipboard": "No hay texto en el portapapeles", + "oneLineCopiedFromOriginal": "Una línea copiada del subtítulo original", + "oneLineMerged": "Una línea combinada", + "oneLineSwitched": "Una línea intercambiada", + "overwriteExistingCells": "Sobrescribir celdas existentes", + "overwriteOrShiftCellsDown": "Sobrescribir/desplazar celdas abajo", + "parsingMatroskaFile": "Analizando archivo Matroska...", + "pasteFromClipboardDotDotDot": "Pegar desde el portapapeles...", + "redoPerformed": "Rehacer realizado", + "redoPerformedXActionLeft": "Rehacer realizado (acciones restantes: {0})", + "removedUnicodeControlCharactersX": "Eliminados caracteres de control Unicode en {0} líneas", + "removedXBlankLines": "Eliminadas {0} líneas en blanco", + "replacedXWithYCountZ": "Reemplazado \"{0}\" con \"{1}\" ({2} ocurrencias)", + "replacedXWithYInLineZ": "Reemplazado \"{0}\" con \"{1}\" en la línea {2}", + "reversedStartAndEndingsForRightToLeftX": "Invertido inicio y fin para derecha a izquierda en {0} líneas", + "ruleProfileIsX": "El perfil de reglas es ahora \"{0}\"", + "saveLanguageFile": "Guardar archivo de idioma", + "saveXFileAs": "Guardar archivo {0} como", + "shiftTextCellsDown": "Desplazar celdas de texto abajo", + "singleLineLength": "Longitud de línea: ", + "speedIsNowX": "La velocidad es ahora \"{0}\"", + "spellCheckResult": "Corrección ortográfica completada. \n\n• Palabras cambiadas: {0}\n• Palabras omitidas: {1}", + "subtitleImportedFromMatroskaFile": "Subtítulo importado desde archivo Matroska", + "textDown": "Texto abajo", + "textOnly": "Solo texto", + "textUp": "Texto arriba", + "timeCodesOnly": "Solo códigos de tiempo", + "xPropertiesDotDotDot": "Propiedades de {0}...", + "totalCharacters": "Total de caracteres: {0}", + "unbreakHint": "Unir líneas seleccionadas", + "undoPerformed": "Deshacer realizado", + "undoPerformedXActionLeft": "Deshacer realizado (acciones restantes: {0})", + "xLinesCopiedFromOriginal": "{0} líneas copiadas del subtítulo original", + "xLinesMerged": "X líneas combinadas", + "xLinesSelectedOfY": "{0} líneas seleccionadas de {1}", + "xLinesSwitched": "{0} líneas intercambiadas", + "xShotChangedLoaded": "{0} cambios de plano cargados", + "youtubeDlDownloadedSuccessfully": "\"yt-dlp\" descargado con éxito.", + "youtubeDlNotInstalledDownloadNow": "\"yt-dlp\" no está instalado y es necesario para reproducir vídeos en línea.\n\n¿Descargar ahora?", + "insertUnicodeSymbol": "Insertar símbolo Unicode", + "trimmedXLines": "Recortadas {0} líneas de subtítulos", + "openOriginalDifferentNumberOfSubtitlesXY": "El archivo original no tiene el mismo número de subtítulos que el actual.\n\n• Subtítulos originales: {0}\n• Subtítulos actuales: {1}", + "importXMatchingOriginalLines": "¿Importar {0} subtítulos originales coincidentes?", + "videoOpenedChangeLayoutQuestion": "Se ha abierto un archivo de vídeo.\n\n¿Deseas cambiar el diseño para mostrar el panel de vídeo?", + "sortedByStartTime": "Ordenado por tiempo de inicio", + "sortedByEndTime": "Ordenado por tiempo final", + "colorHint": "Colorear líneas seleccionadas", + "removeFormattingHint": "Eliminar formato de las líneas seleccionadas", + "assaResolutionResamplerDone": "Resolución ASSA cambiada.", + "languageFileSavedToX": "Archivo de idioma guardado en {0}", + "fileExportedInFormatXToY": "Archivo exportado en formato {0} a {1}", + "fileExportedInFormatXToFileY": "Archivo exportado en formato \"{0}\" al archivo \"{1}\"", + "fixedXLines": "Corregidas {0} líneas", + "transcriptionCompletedWithXLines": "Transcripción completada con {0} líneas", + "replacedXOccurrences": "Reemplazadas {0} ocurrencias", + "ffmpegDownloadedAndInstalledToX": "ffmpeg descargado e instalado en {0}", + "nothingToSave": "Nada que guardar", + "nothingToSaveOriginal": "Nada que guardar (original)", + "liveSpellCheckLanguageXLoaded": "Idioma de corrección en vivo {0} cargado", + "downloadFfmpegTitle": "¿Descargar FFmpeg?", + "downloadFfmpegQuestion": "FFmpeg es necesario para reproducir vídeos en línea y para algunas funciones de edición.\n\n¿Descargar FFmpeg ahora?" + }, + "file": { + "ebuSaveOptions": { + "title": "Opciones de guardado EBU", + "generalSubtitleInformation": "Información general de subtítulos", + "codePageNumber": "Número de página de códigos", + "diskFormatCode": "Código de formato de disco", + "displayStandardCode": "Código estándar de visualización", + "colorRequiresTeletext": "¡Los colores requieren teletexto!", + "alignmentRequiresTeletext": "¡La alineación requiere teletexto!", + "teletextCharsShouldBe38": "¡El máx. de caracteres por fila para teletexto debería ser 38!", + "characterCodeTable": "Tabla de caracteres", + "languageCode": "Código de idioma", + "originalProgramTitle": "Título original del programa", + "originalEpisodeTitle": "Título original del episodio", + "translatedProgramTitle": "Título traducido del programa", + "translatedEpisodeTitle": "Título traducido del episodio", + "translatorsName": "Nombre del traductor", + "subtitleListReferenceCode": "Código de referencia de la lista", + "countryOfOrigin": "País de origen", + "timeCodeStatus": "Estado del código de tiempo", + "timeCodeStartOfProgramme": "Código de tiempo: Inicio del programa", + "revisionNumber": "Número de revisión", + "maxNoOfDisplayableChars": "Máx. caracteres por fila", + "maxNumberOfDisplayableRows": "Máx. número de filas", + "diskSequenceNumber": "Número de secuencia de disco", + "totalNumberOfDisks": "Número total de discos", + "import": "Importar...", + "textAndTimingInformation": "Información de texto y tiempos", + "justificationCode": "Código de justificación", + "verticalPosition": "Posición vertical", + "marginTop": "Margen superior (alineación superior)", + "marginBottom": "Margen inferior (alineación inferior)", + "newLineRows": "Líneas añadidas por un salto de línea", + "teletext": "Teletexto", + "useBox": "Usar caja alrededor del texto", + "doubleHeight": "Usar doble altura para el texto", + "errors": "Errores", + "errorsX": "Errores: {0}", + "maxLengthError": "La línea {0} excede la longitud máx. ({1}) por {2}: {3}", + "textUnchangedPresentation": "Presentación sin cambios", + "textLeftJustifiedText": "Texto justificado a la izquierda", + "textCenteredText": "Texto centrado", + "textRightJustifiedText": "Texto justificado a la derecha", + "useBoxForOneNewLine": "Usar caja para solo un salto de línea", + "discSequenceNumber": "Número de secuencia del disco" + }, + "import": { + "importTimeCodes": "Importar códigos de tiempo...", + "plainTextDotDotDot": "Texto plano...", + "titleImportPlainText": "Importar texto plano", + "imagesForOcrDotDotDot": "Imágenes para OCR...", + "timeCodesDotDotDot": "Códigos de tiempo...", + "subtitleWithManuallyChosenEncodingDotDotDot": "_Subtítulo con codificación manual...", + "titleImportImages": "Importar imágenes", + "importFileLabel": "Elegir imágenes a importar (códigos de tiempo en el nombre)", + "importFilesInfo": "Usar nombres con código de tiempo:\r\ninicio_HH_MM_SS_MMM__fin_HH_MM_SS_MMM[_índice].ext\r\n\r\nEjemplos:\r\n0_00_01_042__0_00_03_919_0001.png\r\n0_00_01_042__0_00_03_919.png\r\n\r\nReglas:\r\n• HH_MM_SS_MMM para tiempos de inicio y fin\r\n• El guion bajo doble separa inicio/fin\r\n• Índice opcional tras el tiempo final", + "formattingDotDotDot": "Formato...", + "imagedBasedSubtitleForEditDotDotDot": "Subtítulo basado en imagen para editar...", + "imagedBasedSubtitleForOcrDotDotDot": "Subtítulo basado en imagen para OCR...", + "splitTextAt": "Dividir texto en", + "blankLines": "Líneas en blanco", + "oneLineIsOneSubtitle": "Una línea es un subtítulo", + "twoLinesAreOneSubtitle": "Dos líneas son un subtítulo", + "importFilesDotDotDot": "Importar archivos...", + "multipleFiles": "Importar de varios archivos de texto (un archivo = un subtítulo)", + "importOptions": "Opciones de importación", + "autoSplitText": "Dividir texto automáticamente", + "lineMode": "Modo de línea", + "maxLineLength": "Longitud máx. de línea", + "maxLinesPerSubtitle": "Máx. líneas por subtítulo", + "minGapBetweenSubtitles": "Espacio mín. entre subtítulos", + "mergeShortLines": "Combinar líneas cortas", + "removeLinesWithoutLetters": "Eliminar líneas sin letras", + "splitAtEndCharsSetting": "Dividir en caracteres finales", + "takeTimeFromCurrentFile": "Tomar tiempo del archivo actual", + "fixed": "Fijo", + "numberOfSubtitlesX": "Número de subtítulos: {0}", + "gapMs": "Espacio (ms)", + "useFixedDuration": "Usar duración fija", + "fixedDurationMs": "Duración fija (ms)", + "alignViaWhisper": "Alinear códigos de tiempo mediante Whisper..." + }, + "export": { + "exportImagesProfiles": "Exportar perfiles de imágenes", + "leftRightMargin": "Margen izq./der.", + "topBottomMargin": "Margen sup./inf.", + "titleExportBluRaySup": "Exportar Blu-ray (sup)", + "lineSpacingPercent": "Espaciado de línea %", + "paddingLeftRight": "Relleno izq./der.", + "paddingTopBottom": "Relleno sup./inf.", + "previewTitle": "Previsualización - tamaño actual: {0}x{1}, destino: {2}x{3}, zoom: {4}%", + "titleExportVobSub": "VobSub (sub/idx)", + "customTextFormatsDotDotDot": "_Formatos de texto personalizados...", + "plainTextDotDotDot": "_Texto plano...", + "customTextFormats": "Formatos de texto personalizados", + "titleExportCustomFormat": "Exportar formato de texto personalizado", + "editCustomFormat": "Editar formato de texto personalizado", + "newCustomFormat": "Nuevo formato de texto personalizado", + "deleteSelectedCustomTextFormatX": "¿Eliminar el formato personalizado \"{0}\"?", + "timeCodeFormat": "Formato de código de tiempo", + "newLineFormat": "Formato de nueva línea", + "pleaseEnterNameForTheCustomFormat": "Introduzca un nombre para el formato personalizado", + "titleExportPlainText": "Exportar texto plano", + "lineNumbers": "Números de línea", + "showLineNumbers": "Mostrar números de línea", + "addNewLineAfterLineNumber": "Añadir nueva línea tras el número de línea", + "addNewLineAfterTimeCode": "Añadir nueva línea tras el código de tiempo", + "addNewLineAfterText": "Añadir nueva línea tras el texto", + "addLineBetweenSubtitles": "Añadir línea entre subtítulos", + "titleExportDCinemaInteropPng": "D-Cinema interop/png", + "titleExportDCinemaSmpte2014Png": "D-Cinema SMPTE 2014/png", + "imageBasedSubtitleSaved": "Subtítulo basado en imágenes guardado", + "titleExportBdnXml": "Exportar BDN/xml", + "titleExportWebVttThumbnails": "Exportar WebVTT (miniaturas)" + }, + "statistics": { + "title": "Estadísticas", + "titleWithFileName": "Estadísticas - {0}", + "generalStatistics": "Estadísticas generales", + "mostUsed": "Más usado...", + "mostUsedLines": "Líneas más usadas", + "mostUsedWords": "Palabras más usadas", + "nothingFound": "No se encontró nada", + "numberOfLinesX": "Número de líneas de subtítulos: {0:#,##0}", + "numberOfFilesX": "Número de archivos de subtítulos: {0:#,##0}", + "lengthInFormatXinCharactersY": "Número de caracteres como {0}: {1:#,###,##0}", + "numberOfCharactersInTextOnly": "Caracteres en solo texto: {0:#,###,##0}", + "totalDuration": "Duración total de todos los subtítulos: {0:#,##0}", + "totalCharsPerSecond": "Total de caracteres/segundo: {0:0.0} segundos", + "totalWords": "Total de palabras: {0:#,##0}", + "numberOfItalicTags": "Etiquetas de cursiva: {0:#,##0}", + "numberOfBoldTags": "Etiquetas de negrita: {0:#,##0}", + "numberOfUnderlineTags": "Etiquetas de subrayado: {0:#,##0}", + "numberOfFontTags": "Etiquetas de fuente: {0:#,##0}", + "numberOfAlignmentTags": "Etiquetas de alineación: {0:#,##0}", + "lineLengthMinimum": "Longitud de subtítulo - mínima: {0}", + "lineLengthMaximum": "Longitud de subtítulo - máxima: {0}", + "lineLengthAverage": "Longitud de subtítulo - media: {0:#.###}", + "linesPerSubtitleAverage": "Líneas por subtítulo - media: {0:0.###}", + "singleLineLengthMinimum": "Longitud de línea única - mínima: {0}", + "singleLineLengthMaximum": "Longitud de línea única - máxima: {0}", + "singleLineLengthAverage": "Longitud de línea única - media: {0:#.###}", + "singleLineLengthExceedingMaximum": "Línea única - exceden máx. ({0} car.): {1} ({2:0.00}%)", + "singleLineWidthMinimum": "Ancho de línea única - mínimo: {0} píxeles", + "singleLineWidthMaximum": "Ancho de línea única - máximo: {0} píxeles", + "singleLineWidthAverage": "Ancho de línea única - medio: {0:#.###} píxeles", + "singleLineWidthExceedingMaximum": "Ancho de línea única - exceden máx. ({0} px): {1} ({2:0.00}%)", + "durationMinimum": "Duración - mínima: {0:0.000} segundos", + "durationMaximum": "Duración - máxima: {0:0.000} segundos", + "durationAverage": "Duración - media: {0:0.000} segundos", + "durationExceedingMinimum": "Duración - bajo el mín. ({0:0.###} s): {1} ({2:0.00}%)", + "durationExceedingMaximum": "Duración - exceden el máx. ({0:0.###} s): {1} ({2:0.00}%)", + "charactersPerSecondMinimum": "Caracteres/seg - mínimo: {0:0.000}", + "charactersPerSecondMaximum": "Caracteres/seg - máximo: {0:0.000}", + "charactersPerSecondAverage": "Caracteres/seg - media: {0:0.000}", + "charactersPerSecondExceedingOptimal": "Caracteres/seg - exceden óptimo ({0:0.##} cps): {1} ({2:0.00}%)", + "charactersPerSecondExceedingMaximum": "Caracteres/seg - exceden máximo ({0:0.##} cps): {1} ({2:0.00}%)", + "wordsPerMinuteMinimum": "Palabras/min - mínimo: {0:0.000}", + "wordsPerMinuteMaximum": "Palabras/min - máximo: {0:0.000}", + "wordsPerMinuteAverage": "Palabras/min - media: {0:0.000}", + "wordsPerMinuteExceedingMaximum": "Palabras/min - exceden el máximo ({0} wpm): {1} ({2:0.00}%)", + "gapMinimum": "Espacio - mínimo: {0:#,##0} ms", + "gapMaximum": "Espacio - máximo: {0:#,##0} ms", + "gapAverage": "Espacio - medio: {0:#,##0.##} ms", + "gapExceedingMinimum": "Espacio - bajo el mín. ({0:#,##0} ms): {1} ({2:0.00}%)", + "export": "Exportar..." + }, + "manualChosenEncoding": { + "title": "Importar subtítulo con codificación manual", + "searchEncodings": "Buscar codificaciones", + "codePage": "Página de códigos" + }, + "restoreAutoBackup": { + "title": "Restaurar copia de seguridad automática", + "openAutoBackupFolder": "Abrir carpeta de copias de seguridad", + "restoreAutoBackupFile": "Restaurar archivo de copia de seguridad", + "deleteAllSubtitleBackups": "¿Desea eliminar todos los archivos de copia de seguridad?", + "deleteAll": "Eliminar todo" + }, + "propertiesDCinema": { + "title": "Propiedades D-Cinema SMPTE", + "generateIdAuto": "Generar nuevo ID al guardar", + "subtitleId": "ID de subtítulo", + "generateId": "Generar ID", + "movieTitle": "Título de la película", + "reelNumber": "Número de rollo", + "issueDate": "Fecha de emisión", + "now": "Ahora", + "editRate": "Tasa de edición", + "timeCodeRate": "Tasa de código de tiempo", + "startTime": "Tiempo de inicio", + "font": "Fuente", + "fontId": "ID de fuente", + "fontUri": "URI de fuente", + "generate": "Generar", + "fontColor": "Color de fuente", + "chooseColor": "Elegir color", + "fontEffect": "Efecto de fuente", + "effectColor": "Color del efecto", + "fontSize": "Tamaño de fuente", + "topBottomMargin": "Margen sup./inf.", + "fadeUpTime": "Tiempo de aparición", + "fadeDownTime": "Tiempo de desaparición", + "frames": "Fotogramas", + "export": "Exportar..." + }, + "compare": "Comparar", + "previousDifference": "Diferencia anterior", + "nextDifference": "Diferencia siguiente", + "subtitlesNotAlike": "Los subtítulos no tienen similitudes", + "xNumberOfDifference": "Número de diferencias: {0}", + "xNumberOfDifferenceAndPercentChanged": "Diferencias: {0} ({1:0.##}% de palabras cambiadas)", + "xNumberOfDifferenceAndPercentLettersChanged": "Diferencias: {0} ({1:0.##}% de letras cambiadas)", + "showOnlyDifferences": "Solo diferencias", + "ignoreLineBreaks": "Ignorar saltos de línea", + "ignoreWhitespace": "Ignorar espacios en blanco", + "ignoreFormatting": "Ignorar formato", + "onlyLookForDifferencesInText": "Solo buscar diferencias en el texto", + "cannotCompareWithImageBasedSubtitles": "No se puede comparar con subtítulos basados en imágenes", + "statisticsTitle": "Estadísticas", + "showOnlyDifferencesInText": "Solo diferencias en texto", + "loadXFromFile": "Cargar \"{0}\" desde archivo", + "saveCompareHtmlTitle": "Guardar archivo HTML de comparación", + "pickMatroskaTrackX": "Elegir pista Matroska - {0}", + "rosettaProperties": "Propiedades Timed Text Rosetta IMSC", + "rosettaFontSize": "Tamaño de fuente (altura de fila)", + "xProperties": "Propiedades de {0}" + }, + "edit": { + "modifySelection": { + "title": "Modificar selección", + "contains": "Contiene", + "startsWith": "Empieza por", + "endsWith": "Termina por", + "notContains": "No contiene", + "allUppercase": "Todo en mayúsculas", + "odd": "Número impar", + "even": "Número par", + "durationLessThan": "Duración en ms <", + "durationGreaterThan": "Duración en ms >", + "cpsLessThan": "CPS <", + "cpsGreaterThan": "CPS >", + "lengthLessThan": "Longitud <", + "lengthGreaterThan": "Longitud >", + "pixelLengthGreaterThan": "Longitud en píxeles >", + "gapLessThan": "Espacio en ms <", + "gapGreaterThan": "Espacio en ms >", + "exactlyOneLine": "Exactamente una línea", + "exactlyTwoLines": "Exactamente dos líneas", + "moreThanTwoLines": "Más de dos líneas", + "bookmarked": "Marcado", + "bookmarkContains": "Marcador contiene", + "blankLines": "Líneas en blanco", + "selectionNew": "Nueva selección", + "selectionAdd": "Añadir a la selección", + "selectionSubtract": "Restar de la selección", + "selectionIntersect": "Intersección con la selección" + }, + "multipleReplace": { + "title": "Reemplazo múltiple", + "editRule": "Editar regla", + "newRule": "Nueva regla", + "editCategory": "Editar categoría", + "newCategory": "Nueva categoría", + "categoryName": "Nombre de la categoría", + "exportReplaceRules": "Exportar reglas", + "appliedRules": "Reglas aplicadas", + "findRule": "Buscar regla", + "xLinesAffected": "{0:#,##0} líneas afectadas", + "deleteCategoryConfirm": "¿Eliminar categoría '{0}'?", + "deleteRuleConfirm": "¿Eliminar regla '{0}'?", + "findWhat": "Buscar", + "descriptionOptional": "Descripción (opcional)" + }, + "find": { + "searchTextWatermark": "Buscar texto...", + "wholeWord": "Palabra completa", + "caseSensitive": "Sensible a mayúsculas", + "caseInsensitive": "No sensible a mayúsculas", + "findPrevious": "Buscar _anterior", + "findNext": "_Buscar siguiente", + "replaceAndFindNext": "_Reemplazar y buscar siguiente", + "replaceAll": "Reemplazar _todo", + "replaceTitle": "Reemplazar", + "replaceWith": "Reemplazar con", + "replaceTextWatermark": "Reemplazar con..." + }, + "showHistory": "Historial para deshacer", + "restoreSelected": "Restaurar seleccionado" + }, + "tools": { + "fixCommonErrors": { + "title": "Corregir errores comunes", + "step1": "Paso 1/2 - Elegir qué errores corregir", + "whatToFix": "Qué corregir", + "example": "Ejemplo", + "selectAll": "Seleccionar todo", + "inverseSelection": "Invertir selección", + "back": "< _Atrás", + "next": "_Siguiente >", + "step2": "Paso 2/2 - Verificar correcciones", + "fixes": "Correcciones", + "log": "Registro", + "function": "Función", + "removedEmptyLine": "Eliminar línea vacía", + "removedEmptyLineAtTop": "Eliminar línea vacía superior", + "removedEmptyLineAtBottom": "Eliminar línea vacía inferior", + "removedEmptyLineInMiddle": "Eliminar línea vacía en medio", + "removedEmptyLinesUnusedLineBreaks": "Eliminar líneas vacías/saltos no usados", + "fixOverlappingDisplayTimes": "Corregir tiempos superpuestos", + "fixShortDisplayTimes": "Corregir tiempos cortos", + "fixLongDisplayTimes": "Corregir tiempos largos", + "fixShortGaps": "Corregir espacios cortos", + "fixInvalidItalicTags": "Corregir etiquetas de cursiva inválidas", + "removeUnneededSpaces": "Eliminar espacios innecesarios", + "removeUnneededPeriods": "Eliminar puntos innecesarios", + "fixCommas": "Corregir comas", + "fixMissingSpaces": "Corregir espacios faltantes", + "breakLongLines": "Dividir líneas largas", + "removeLineBreaks": "Eliminar saltos en textos cortos (una frase)", + "removeLineBreaksAll": "Eliminar saltos en textos cortos (todo menos diálogos)", + "removeLineBreaksPixelWidth": "Unir subtítulos que caben en una línea (ancho píxeles)", + "fixUppercaseIInsideLowercaseWords": "Corregir 'i' mayúscula dentro de palabras en minúscula (error OCR)", + "fixDoubleApostrophes": "Corregir apóstrofes dobles ('') a comilla simple (\")", + "addPeriods": "Añadir punto tras líneas si la siguiente empieza en mayúscula", + "startWithUppercaseLetterAfterParagraph": "Empezar con mayúscula tras párrafo", + "startWithUppercaseLetterAfterPeriodInsideParagraph": "Empezar con mayúscula tras punto dentro del párrafo", + "startWithUppercaseLetterAfterColon": "Empezar con mayúscula tras dos puntos/punto y coma", + "fixLowercaseIToUppercaseI": "Corregir 'i' minúscula sola a 'I' (Inglés)", + "fixCommonOcrErrors": "Corregir errores de OCR comunes (usando lista de reemplazo)", + "commonOcrErrorsFixed": "Errores OCR comunes corregidos: {0}", + "removeSpaceBetweenNumber": "Eliminar espacio entre números", + "breakDialogsOnOneLine": "Dividir diálogos en una sola línea", + "removeDialogFirstInNonDialogs": "Eliminar guion inicial en no-diálogos", + "normalizeStrings": "Normalizar cadenas", + "fixTurkishAnsi": "Corregir letras ANSI turcas a Unicode", + "fixDanishLetterI": "Corregir letra danesa 'i'", + "fixSpanishInvertedQuestionAndExclamationMarks": "Corregir signos de interrogación y exclamación invertidos", + "addMissingQuote": "Añadir comilla faltante (\")", + "addMissingQuotes": "Añadir comillas faltantes (\")", + "removeHyphensSingleLine": "Eliminar guiones de diálogo en líneas únicas", + "fixHyphensInDialogs": "Corregir guion en diálogos vía estilo: {0}", + "addMissingQuotesExample": "¿Cómo estás? -> \"¿Cómo estás?\"", + "xMissingQuotesAdded": "Comillas faltantes añadidas: {0}", + "fix3PlusLine": "Corregir subtítulo con más de dos líneas", + "fix3PlusLines": "Corregir subtítulos con más de dos líneas", + "analysing": "Analizando...", + "nothingToFix": "Nada que corregir :)", + "fixesFoundX": "Correcciones encontradas: {0}", + "xFixesApplied": "Correcciones aplicadas: {0}", + "nothingFixableBut": "Nada pudo corregirse automáticamente. El subtítulo tiene errores; ver registro.", + "xFixedBut": "{0} problema(s) corregido(s) pero aún hay errores; ver registro.", + "xCouldBeFixedBut": "{0} problema(s) podrían corregirse pero aún habrá errores; ver registro.", + "fixFirstLetterToUppercaseAfterParagraph": "Corregir primera letra a mayúscula tras párrafo", + "mergeShortLine": "Combinar línea corta (una frase)", + "mergeShortLineAll": "Combinar línea corta (todo menos diálogos)", + "unbreakShortLinePixelWidth": "Unir línea corta (ancho píxeles)", + "breakLongLine": "Dividir línea larga", + "fixLongDisplayTime": "Corregir tiempo largo", + "fixInvalidItalicTag": "Corregir etiqueta cursiva inválida", + "fixShortDisplayTime": "Corregir tiempo corto", + "fixOverlappingDisplayTime": "Corregir tiempo superpuesto", + "fixShortGap": "Corregir espacio corto", + "fixInvalidItalicTagsExample": "Qué me importa. -> Qué me importa.", + "removeUnneededSpacesExample": "Oye tú ; ahí. -> Oye tú; ahí.", + "removeUnneededPeriodsExample": "¡Oye tú!. -> ¡Oye tú!", + "fixMissingSpacesExample": "Oye.Tú. -> Oye. Tú.", + "fixUppercaseIInsideLowercaseWordsExample": "La tierra es pIana. -> La tierra es plana.", + "fixLowercaseIToUppercaseIExample": "Qué me importa i. -> Qué me importa I.", + "startTimeLaterThanEndTime": "Texto {0}: El inicio es posterior al fin: {4}{1} -> {2} {3}", + "unableToFixStartTimeLaterThanEndTime": "No se puede corregir texto {0}: Inicio posterior al fin: {1}", + "xFixedToYZ": "{0} corregido a: {1}{2}", + "unableToFixTextXY": "No se puede corregir texto {0}: {1}", + "unneededSpace": "Espacio innecesario", + "unneededPeriod": "Punto innecesario", + "fixMissingSpace": "Corregir espacio faltante", + "fixUppercaseIInsideLowercaseWord": "Corregir 'i' mayúscula en palabra en minúscula", + "fixMissingPeriodAtEndOfLine": "Añadir punto faltante al final de línea", + "refreshFixes": "Actualizar correcciones disponibles", + "applyFixes": "Aplicar correcciones y cerrar", + "autoBreak": "Auto &div", + "unbreak": "&Unir", + "fixDoubleDash": "Corregir '--' -> '...'", + "fixDoubleGreaterThan": "Eliminar '>>'", + "fixEllipsesStart": "Eliminar '...' iniciales", + "fixMissingOpenBracket": "Corregir [ o ( faltantes", + "fixMusicNotation": "Reemplazar símbolos musicales por el preferido", + "fixDoubleDashExample": "'Vaya-- um sí!' -> 'Vaya... um sí!'", + "fixDoubleGreaterThanExample": "'>> Robert: ¡Qué pasa!' -> 'Robert: ¡Qué pasa!'", + "fixEllipsesStartExample": "'... y entonces' -> 'y entonces'", + "fixMissingOpenBracketExample": "golpe] ¡Cuidado!' -> '[golpe] ¡Cuidado!'", + "fixMusicNotationExample": "'âTª dulces sueños' -> '♫ dulces sueños'", + "numberOfImportantLogMessages": "¡{0} mensajes importantes en el registro!", + "fixedOkXY": "Corregido y OK - '{0}': {1}", + "fixOcrErrorExample": "N0 -> No", + "fixSpaceBetweenNumbersExample": "1 100 -> 1100", + "fixDialogsOneLineExample": "¡Hola Juan! - ¡Hola Ana! -> ¡Hola Juan!
- ¡Hola Ana!", + "removeDialogFirstInNonDialogsExample": "- ¿Cómo estás? -> ¿Cómo estás?", + "selectDefault": "Seleccionar predet.", + "setDefault": "Establecer correcciones actuales como predet.", + "fixContinuationStyleX": "Corregir estilo de continuación: {0}", + "fixUnnecessaryLeadingDots": "Eliminar puntos iniciales innecesarios", + "fixCommonErrorsProfiles": "Perfiles de corrección de errores", + "fixCommonOcrErrorsStep1": "Corregir errores, paso 1 (elegir)", + "searchRulesDotDotDot": "Buscar reglas...", + "goToApplyFixes": "Ir a aplicar correcciones", + "backToFixList": "Volver a la lista", + "applyFixesAndClose": "Aplicar correcciones y cerrar", + "fixCommonOcrErrorsStep2": "Corregir errores, paso 2 (aplicar)", + "fixCommonOcrErrorsStep2FixesFoundX": "Corregir errores, paso 2 - Encontrados: {0}", + "action": "Acción", + "applySelectedFixes": "Aplicar correcciones seleccionadas" + }, + "adjustDurations": { + "title": "Ajustar duraciones", + "adjustVia": "Ajustar vía", + "seconds": "Segundos", + "percent": "Porcentaje", + "recalculate": "Recalcular", + "addSeconds": "Añadir segundos", + "setAsPercent": "Establecer como porcentaje de duración", + "note": "Nota: El tiempo final no se superpondrá al inicio del siguiente texto", + "fixed": "Fijo", + "milliseconds": "Milisegundos", + "extendOnly": "Solo extender", + "enforceDurationLimits": "Aplicar límites de duración mínima y máxima", + "checkShotChanges": "No extender más allá de los cambios de plano", + "batchCheckShotChanges": "Respetar cambios de plano (si existen)" + }, + "applyDurationLimits": { + "title": "Aplicar límites de duración", + "fixMinDurationMs": "Corregir duración mínima (ms)", + "doNotGoPastShotChange": "No pasar del cambio de plano", + "fixMaxDurationMs": "Corregir duración máxima (ms)", + "maxDurationShouldBeHigherThanMinDuration": "La duración máxima debe ser mayor que la mínima", + "changedDurationFromXToYCommentZ": "Cambiada duración de {0} a {1} {2}", + "onlyPartialFixed": "(solo corrección parcial)", + "unfixableX": "Incorregible: {0}", + "fixedX": "Corregido: {0}", + "fixedXImprovedY": "Correcciones: {0}, Mejoras: {1}", + "noChangesNeeded": "Sin cambios necesarios" + }, + "applyMinGaps": { + "title": "Aplicar espacios mínimos entre subtítulos", + "numberOfGapsFixedX": "Espacios mínimos aplicados: {0}", + "minFramesBetweenLines": "Mínimo de fotogramas entre líneas", + "minMsBetweenLines": "Mínimo de milisegundos entre líneas", + "changedGapFromXToYCommentZ": "Cambiado espacio de {0} a {1} {2}" + }, + "beautifyTimeCodes": { + "title": "Embellecer códigos de tiempo", + "beautifySettings": "Ajustes de embellecimiento", + "snapToFrames": "Ajustar a fotogramas", + "frameGap": "Espacio de fotogramas", + "minDuration": "Duración mín. (ms)", + "shotChangeThreshold": "Umbral de cambio de plano (ms)", + "shotChangeOffset": "Desfase de cambio de plano (fotogramas)", + "original": "Original", + "beautified": "Embellecido" + }, + "bridgeGaps": { + "title": "Unir espacios", + "bridgeGapsSmallerThan": "Unir espacios menores de (ms)", + "minGap": "Espacio mínimo (ms)", + "numberOfSmallGapsBridgedX": "Número de espacios pequeños unidos: {0}", + "percentFoPrevious": "Espacio para el anterior (%)", + "gapChange": "Cambio de espacio" + }, + "renumber": { + "title": "Renumerar", + "startFromNumber": "Empezar por el número:" + }, + "sortBy": { + "title": "Ordenar subtítulos", + "sortOrder": "Orden" + }, + "batchConvert": { + "title": "Conversión por lotes", + "oneActionsSelected": "Una acción seleccionada", + "xActionsSelected": "{0} acciones seleccionadas", + "outputFolderSource": " Carpeta de salida: Carpeta de origen", + "outputFolderX": " Carpeta de salida: {0}", + "encodingXOverwriteY": "Codificación: {0}, sobrescribir archivos: {1}", + "targetFormatSettings": "Ajustes del formato de destino", + "fileNameContainsDotDotDot": "El nombre contiene...", + "trackLanguageContainsDotDotDot": "El idioma de pista contiene...", + "batchConvertSettings": "Ajustes de conversión por lotes", + "addFormatting": "Añadir formato", + "addItalic": "Añadir cursiva", + "addBold": "Añadir negrita", + "addUnderline": "Añadir subrayado", + "addAlignment": "Añadir alineación", + "addColor": "Añadir color", + "deleteLinesWithSpecificActorsOrStyles": "Eliminar líneas con actores o estilos (separados por coma)", + "useSourceStylesIfPossible": "Usar estilos de origen si es posible", + "editStyles": "Editar estilos", + "editProperties": "Editar propiedades", + "editAttachments": "Editar adjuntos", + "errorsExportedX": "Errores exportados: {0}" + }, + "changeCasing": { + "title": "Cambiar mayúsculas/minúsculas", + "fixNames": "Corregir nombres", + "extraNames": "Nombres extra", + "enterExtraNamesHint": "Introduzca nombres extra a corregir, separados por comas", + "onlyFixUppercaseLines": "Solo corregir líneas en mayúsculas", + "fixNamesOnly": "Corregir solo nombres", + "allUppercase": "Todo en mayúsculas", + "allLowercase": "Todo en minúsculas" + }, + "changeFormatting": { + "title": "Cambiar formato" + }, + "convertActors": { + "title": "Convertir actores", + "convertActorFrom": "Convertir actor de", + "convertActorTo": "Convertir actor a", + "inlineActorViaX": "Actor en línea mediante {0}", + "setColor": "Establecer color", + "onlyNames": "Solo nombres", + "numberOfConversionsX": "Número de conversiones: {0}" + }, + "joinSubtitles": { + "title": "Unir subtítulos", + "keepTimeCodes": "Mantener códigos de tiempo", + "appendTimeCodes": "Anexar códigos de tiempo", + "addMsAfterEachFile": "Añadir milisegundos tras cada archivo", + "join": "_Unir" + }, + "splitSubtitle": { + "title": "Dividir subtítulo", + "numberOfEqualParts": "Número de partes iguales", + "saveSplitParts": "_Guardar partes divididas", + "subtitleSplitIntoXParts": "Subtítulo dividido en {0} partes.", + "xPartsSavedInFormatYToFolder": "{0} partes guardadas en formato {1} en la carpeta:" + }, + "splitBreakLongLines": { + "title": "Dividir/reequilibrar líneas largas", + "splitLongLines": "Dividir líneas largas (en varias líneas)", + "rebalanceLongLines": "Reequilibrar líneas largas", + "splitLongLine": "Dividir línea larga", + "rebalanceLongLine": "Reequilibrar línea larga", + "splitIntoXLines": "Dividir en {0} líneas: '{1}' → '{2}...'", + "linesSplitX": "Líneas divididas: {0}", + "linesSplitXLinesRebalancedY": "Líneas divididas: {0}, líneas reequilibradas: {1}" + }, + "mergeShortLines": { + "title": "Combinar líneas cortas", + "highlightParts": "Resaltar partes (karaoke)" + }, + "mergeLinesWithSameText": { + "title": "Combinar líneas con el mismo texto", + "maxMsBetweenLines": "Máximo de milisegundos entre líneas", + "includeIncrementingLines": "Incluir líneas con texto incremental" + }, + "mergeLinesWithSameTimeCodes": { + "title": "Combinar líneas con mismos códigos de tiempo", + "maxMsDifference": "Diferencia máx. (milisegundos)", + "makeDialog": "Crear diálogos" + }, + "netflixCheckAndFix": { + "title": "Comprobar y corregir errores de Netflix", + "generateReport": "Generar informe", + "nothingToReport": "No se encontraron problemas.", + "saveNetflixQualityReport": "Guardar informe de calidad de Netflix", + "netflixReportSaved": "Informe de calidad de Netflix guardado", + "netFlixQualityReportSavedToX": "Informe de calidad de Netflix guardado en:\n {0}" + }, + "imageBasedEdit": { + "editImagedBaseSubtitle": "Editar subtítulo basado en imagen", + "editImagedBaseSubtitleX": "Editar subtítulo basado en imagen: {0}", + "resizeImagesDotDotDot": "Redimensionar imágenes...", + "adjustBrightnessDotDotDot": "Ajustar brillo...", + "adjustAlphaDotDotDot": "Ajustar alfa...", + "centerHorizontally": "Centrar horizontalmente", + "cropImages": "Recortar imágenes", + "importTimeCodes": "Importar códigos de tiempo...", + "setTextForSubtitle": "Establecer texto del subtítulo", + "screenWidth": "Ancho de pantalla", + "screenHeight": "Alto de pantalla", + "alphaThresholdInfo": "Los píxeles con alfa bajo el umbral serán totalmente transparentes", + "resetToDefaults": "Restablecer predeterminados", + "alphaAdjustmentInfo": "Ajuste alfa: Añadir/restar del canal alfa.\nLa vista previa se actualiza automáticamente con fondo de cuadros para visualizar la transparencia.", + "adjustBrightness": "Ajustar brillo", + "brightness": "Brillo", + "contrast": "Contraste", + "gamma": "Gamma", + "brightnessAdjustmentInfo": "Mueve los deslizadores para modificar brillo, contraste y gamma.\nLa vista previa se actualiza automáticamente con el primer subtítulo seleccionado.", + "resizeImages": "Redimensionar imágenes", + "percentage": "Porcentaje", + "resizeImagesInfo": "Introduzca el porcentaje para redimensionar.\nLa vista previa se actualizará automáticamente." + }, + "removeTextForHearingImpaired": { + "title": "Eliminar texto para deficientes auditivos", + "interjections": "Interjecciones", + "skipIfStartWith": "Omitir si empieza por", + "removeTextBetween": "Eliminar texto entre", + "brackets": "Corchetes", + "curlyBrackets": "Llaves", + "parentheses": "Paréntesis", + "and": "y", + "onlySeparateLines": "Solo líneas separadas", + "removeTextBeforeColon": "Eliminar texto antes de los dos puntos", + "onlyIfTextIsUppercase": "Solo si el texto está en mayúsculas", + "onlyOnSeparateLine": "Solo en línea separada", + "ifLineIsUppercase": "Si la línea está en mayúsculas", + "ifLineContains": "Si la línea contiene", + "ifLineOnlyContainsMusicSymbols": "Si la línea solo contiene símbolos musicales", + "removeInterjections": "Eliminar interjecciones" + }, + "pickAlignmentTitle": "Elegir alineación", + "pickFontNameTitle": "Elegir nombre de fuente", + "colorPickerTitle": "Elegir color", + "filterLayersTitle": "Filtrar capas para visualización", + "filterLayersHideFromWaveform": "Ocultar de forma de onda/espectrograma", + "filterLayersHideFromSubtitleGrid": "Ocultar de la cuadrícula", + "filterLayersHideFromVideoPreview": "Ocultar de la vista previa de vídeo", + "pickSubtitleFormat": "Elegir formato de subtítulo", + "pickLayerTitle": "Establecer capa", + "recentColors": "Colores recientes" + }, + "spellCheck": { + "spellCheck": "Ortografía", + "getDictionariesTitle": "Ortografía - Obtener diccionarios", + "getDictionaryInstructions": "Elegir idioma y pulsar descargar", + "addNameToUserDictionary": "Añadir nombre al diccionario de usuario", + "addNameToNamesList": "Añadir nombre a la lista de nombres", + "noDictionariesFound": "No se encontraron diccionarios", + "wordNotFound": "Palabra no encontrada", + "lineXofY": "Corrector - línea {0} de {1}", + "changeWordFromXToY": "Cambiar palabra de '{0}' a '{1}'", + "changeAllWordsFromXToY": "Cambiar todas de '{0}' a '{1}'", + "ignoreWordXOnce": "Ignorar '{0}' una vez", + "ignoreWordXAlways": "Ignorar '{0}' siempre", + "wordXAddedToNamesList": "Palabra '{0}' añadida a la lista de nombres", + "wordXAddedToUserDictionary": "Palabra '{0}' añadida al diccionario de usuario", + "useSuggestionX": "Usar sugerencia '{0}'", + "useSuggestionXAlways": "Usar sugerencia '{0}' siempre", + "addXToUserDictionary": "Añadir '{0}' al diccionario de usuario", + "ignoreAllX": "Ignorar todas las '{0}'", + "pickSpellCheckDictionaryDotDotDot": "Elegir diccionario ortográfico...", + "chooseSpellCheckDictionary": "Elegir diccionario ortográfico" + }, + "video": { + "burnIn": { + "title": "Generar vídeo con subtítulos incrustados", + "infoAssaOff": "Nota: Estilos Advanced SubStation Alpha compatibles.", + "infoAssaOn": "Nota: ¡Se usarán estilos Advanced SubStation Alpha! :)", + "xGeneratedWithBurnedInSubsInX": "\"{0}\" generado con subtítulos incrustados en {1}.", + "timeRemainingMinutes": "Tiempo restante: {0} minutos", + "timeRemainingOneMinute": "Tiempo restante: Un minuto", + "timeRemainingSeconds": "Tiempo restante: {0} segundos", + "timeRemainingAFewSeconds": "Tiempo restante: Unos segundos", + "timeRemainingMinutesAndSeconds": "Tiempo restante: {0} minutos y {1} segundos", + "timeRemainingOneMinuteAndSeconds": "Tiempo restante: Un minuto y {0} segundos", + "targetFileName": "Nombre de archivo de destino: {0}", + "targetFileSize": "Tamaño de destino (requiere codificación de 2 pasos)", + "fileSizeMb": "Tamaño en MB", + "passX": "Paso {0}", + "encoding": "Codificando", + "bitRate": "Tasa de bits", + "totalBitRateX": "Tasa de bits total: {0}", + "sampleRate": "Tasa de muestreo", + "audio": "Audio", + "stereo": "Estéreo", + "preset": "Ajuste", + "pixelFormat": "Formato de píxel", + "crf": "CRF", + "tuneFor": "Optimizar para", + "alignRight": "Alinear a la derecha", + "getStartPosition": "Obtener posición inicial", + "getEndPosition": "Obtener posición final", + "useSource": "Usar origen", + "useSourceFolder": "Usar carpeta de origen", + "useSourceResolution": "Usar resolución de origen", + "outputSettings": "Archivo/carpeta de salida...", + "fontSizeFactor": "Factor de tamaño de fuente", + "boxType": "Tipo de caja", + "fixRightToLeft": "Corregir derecha a izquierda", + "cut": "Cortar", + "fromTime": "Desde el tiempo", + "toTime": "Hasta el tiempo", + "audioEncoding": "Codificación de audio", + "outputProperties": "Propiedades de salida...", + "videoFileSize": "Tamaño de archivo de vídeo", + "oneBox": "Una caja", + "boxPerLine": "Caja por línea" + }, + "videoTransparent": { + "title": "Generar vídeo transparente con subtítulos", + "infoAssaOff": "Nota: Estilos Advanced SubStation Alpha compatibles.", + "infoAssaOn": "Nota: ¡Se usarán estilos Advanced SubStation Alpha! :)" + }, + "audioToText": { + "title": "Voz a texto", + "transcribe": "Transcribir", + "translateToEnglish": "Traducir al inglés", + "transcribing": "Transcribiendo...", + "transcribingXOfY": "Transcribiendo {0} de {1}...", + "inputLanguage": "Idioma de entrada", + "advancedWhisperSettings": "Ajustes avanzados de Whisper", + "downloadingWhisperEngine": "Descargando motor Whisper", + "enableVad": "Habilitar VAD", + "whisperXxlStandard": "Estándar", + "whisperXxlStandardAsia": "Estándar Asia", + "whisperXxlSentence": "Nivel frase", + "whisperXxlSingleWords": "Palabras individuales", + "whisperXxlHighlightWord": "Resaltar palabra", + "selectModel": "Seleccionar modelo", + "viewWhisperLogFile": "Ver registro de Whisper", + "reDownloadX": "Volver a descargar {0}", + "downloadingSpeechToTextModel": "Descargando modelo de voz a texto", + "whisperPostProcessingTitle": "Post-procesamiento de Whisper", + "adjustTimings": "Ajustar tiempos", + "mergeShortLines": "Combinar líneas cortas", + "breakSplitLongLines": "Dividir líneas largas", + "fixShortDuration": "Corregir duración corta", + "fixCasing": "Corregir mayúsculas", + "addPeriods": "Añadir puntos", + "changeUnderlineToColor": "Cambiar subrayado por color" + }, + "textToSpeech": { + "title": "Texto a voz", + "textToSpeechEngine": "Motor de texto a voz", + "reviewAudioSegments": "TTS - Revisar segmentos de audio", + "reviewAudioSegmentsHistory": "TTS - Revisar historial de audio", + "stability": "Estabilidad", + "similarity": "Similitud", + "speakerBoost": "Refuerzo del orador", + "styleExaggeration": "Exageración de estilo", + "regenerateAudioSelectedLine": "Regenerar audio de línea seleccionada", + "generateSpeechFromText": "Generar voz desde texto", + "testVoice": "Probar voz", + "addAudioToVideoFile": "Añadir audio al archivo de vídeo", + "voiceSettings": "TTS - Ajustes de voz", + "voiceSampleText": "Texto de muestra de voz", + "refreshVoices": "Actualizar voces", + "videoEncodingSettings": "TTS - Ajustes de codificación de vídeo", + "elevenLabsSettings": "TTS - Ajustes de ElevenLabs", + "elevenLabsSettingsResetHint": "Restablecer ElevenLabs a valores predeterminados", + "regenerateAudio": "Regenerar audio", + "autoContinuePlaying": "Continuar reproducción automáticamente", + "addingAudioToVideoFileDotDotDot": "Añadiendo audio al archivo de vídeo...", + "preparingMergeDotDotDot": "Preparando combinación...", + "importVoiceDotDotDot": "Importar voz...", + "voiceImportSuccessTitle": "Voz importada", + "voiceXImported": "Voz '{0}' importada con éxito", + "advancedTtsSettings": "Ajustes avanzados de TTS", + "proAudioPostProcessing": "Post-procesamiento de audio Pro", + "proAudioPostProcessingDescription": "Aplica EQ, puerta de ruido, compresión, normalización (-16 LUFS) y fundidos a cada segmento.", + "audioDucking": "Atenuación de audio (ducking)", + "audioDuckingDescription": "Reduce el volumen del vídeo original para mezclarlo con el TTS.", + "originalVolumePercent": "Volumen original %", + "vadSilenceCompression": "Compresión de silencios VAD", + "vadSilenceCompressionDescription": "Acorta las pausas entre palabras mediante detección de voz. Reduce la duración sin pérdida de calidad.", + "maxSilenceMs": "Silencio máx. (ms)", + "highQualityTimeStretch": "Cambio de tiempo de alta calidad (WSOLA/rubberband)", + "highQualityTimeStretchDescription": "Usa el algoritmo rubberband para cambios de velocidad preservando el tono. Requiere librubberband.", + "silencePaddingMs": "Relleno de silencio (ms)", + "silencePaddingMsDescription": "Añade un breve silencio al final de cada segmento. Útil para dar aire entre frases.", + "outputSampleRate": "Tasa de muestreo de salida (0 = predet.)", + "outputSampleRateDescription": "Remuestrea todos los segmentos a la tasa especificada (ej. 44100, 48000).", + "edgeTtsRate": "Velocidad Edge-TTS", + "edgeTtsRateDescription": "Velocidad para Edge-TTS, ej. \"+50%\", \"-30%\", o \"+0%\" para predeterminado.", + "edgeTtsPitch": "Tono Edge-TTS", + "edgeTtsPitchDescription": "Ajuste de tono para Edge-TTS, ej. \"+10Hz\", \"-5Hz\", o \"+0Hz\".", + "edgeTtsVolume": "Volumen Edge-TTS", + "edgeTtsVolumeDescription": "Ajuste de volumen para Edge-TTS, ej. \"+20%\", \"-10%\", o \"+0%\"." + }, + "shotChanges": { + "titleGenerateOrImport": "Generar/importar cambios de plano", + "generateShotChanges": "Generar cambios de plano", + "importShotChanges": "Importar cambios de plano", + "generateShotChangesWithFfmpeg": "Generar cambios de plano con ffmpeg", + "shotChangeTimeCode": "Código de tiempo de cambio de plano", + "openShotChangesFile": "Abrir archivo de cambios de plano", + "importShotChangesFromFile": "Importar cambios de plano desde archivo", + "timeCodeFormatColon": "Formato de código de tiempo:", + "shotChangesList": "Lista de cambios de plano", + "shotChangesClearQuestion": "¿Seguro que desea borrar todos los cambios de plano?", + "deleteSelectedShotChangeQuestion": "¿Seguro que desea eliminar el cambio de plano seleccionado?" + }, + "goToVideoPosition": "Ir a la posición del vídeo", + "generateBlankVideoDotDotDot": "Generar vídeo en blanco...", + "generateBlankVideoTitle": "Generar vídeo en blanco", + "reEncodeVideoForBetterSubtitlingTitle": "Recodificar vídeo para mejor subtitulado", + "reEncodeVideoForBetterSubtitlingDotDotDot": "Recodificar vídeo para mejor subtitulado...", + "openSecondarySubtitleOnVideoPlayerDotDotDot": "Subtítulo secundario en reproductor, abrir...", + "openSecondarySubtitleOnVideoPlayer": "Subtítulo secundario (en reproductor)", + "removeSecondarySubtitleOnVideoPlayer": "Subtítulo secundario en reproductor, quitar", + "cutVideoTitle": "Cortar vídeo", + "cutVideoDotDotDot": "Cortar vídeo...", + "embedSubtitlesDotDotDot": "Añadir/quitar subtítulos incrustados...", + "generateTimeCodes": "Generar códigos de tiempo", + "checkeredImage": "Imagen ajedrezada", + "saveVideoAsTitle": "Guardar vídeo como", + "promptForFfmpegParamsAndGenerate": "Pedir parámetros ffmpeg y generar", + "cutVideoCutSegments": "Cortar segmentos", + "cutVideoMergeSegments": "Combinar segmentos", + "cutVideoSplitSegments": "Guardar segmentos individualmente", + "cutVideoType": "Tipo de corte", + "mpvRenderAuto": "Auto", + "mpvRenderNative": "Nativo", + "mpvRenderOpenGl": "OpenGL", + "mpvRenderSoftware": "Software (lento)", + "importCurrentSubtitle": "Importar subtítulo actual", + "addRemoveEmbeddedSubtitlesTitle": "Añadir/quitar subtítulos incrustados", + "addCurrentSubtitle": "Añadir subtítulo actual", + "titleOrLanguage": "Título/idioma", + "viewMatroskaTrackX": "Ver pista Matroska - {0}", + "resolutionSeparator": "x", + "openFromUrlTitle": "Abrir archivo de vídeo desde URL" + }, + "waveform": { + "guessTimeCodes": "Adivinar códigos de tiempo", + "guessTimeCodesScanBlockSize": "Tamaño bloque escaneo (ms):", + "guessTimeCodesScanBlockAverageMin": "Media mínima del bloque (% del máx):", + "guessTimeCodesScanBlockAverageMax": "Media máxima del bloque (% del máx):", + "guessTimeCodesSplitLongSubtitlesAt": "Dividir subtítulos largos en (ms):", + "speechToTextSelectedLinesDotDotDot": "Voz a texto líneas seleccionadas...", + "seekSilence": "Buscar silencio", + "minSilenceDurationSeconds": "Duración mín. silencio (seg):", + "maxSilenceVolume": "Volumen máx. silencio (0.0 - 1.0):", + "guessTimeCodesDotDotDot": "Adivinar códigos de tiempo...", + "seekSilenceDotDotDot": "Buscar silencio...", + "toggleShotChange": "Alternar cambio de plano", + "resetWaveformZoomAndSpeed": "Restablecer zoom y velocidad", + "showOnlyWaveform": "Solo forma de onda", + "showOnlySpectrogram": "Solo espectrograma", + "showWaveformAndSpectrogram": "Forma de onda y espectrograma", + "spectrogramClassic": "Clásico", + "spectrogramClassicViridis": "Viridis", + "spectrogramClassicPlasma": "Plasma", + "spectrogramClassicInferno": "Inferno", + "spectrogramClassicTurbo": "Turbo", + "spectrogramNeon": "Neón", + "waveformDrawStyleClassic": "Clásico", + "waveformDrawStyleFancy": "Moderno", + "setVideoPositionAndPauseAndSelectSubtitle": "Pos. vídeo, pausar y seleccionar subtítulo", + "setVideopositionAndPauseAndSelectSubtitleAndCenter": "Pos. vídeo, pausar, seleccionar y centrar", + "setVideoPositionAndPause": "Pos. vídeo y pausar", + "setVideopositionAndPauseAndCenter": "Pos. vídeo, pausar y centrar", + "setVideoposition": "Establecer posición de vídeo" + }, + "sync": { + "visualSync": "Sincronización visual", + "sync": "Sincronizar", + "startScene": "Escena inicial", + "endScene": "Escena final", + "playTwoSecondsAndBack": "Reprod. 2s y atrás", + "findText": "Buscar texto", + "resolutionXDurationYFrameRateZ": "Res.: {0}, duración: {1}, FPS: {2}", + "startSceneMustComeBeforeEndScene": "La escena inicial debe ir antes que la final", + "goToSubPos": "Ir a pos. sub", + "speedInPercentage": "Velocidad en %", + "fromDropFrameValue": "Desde valor drop-frame", + "toDropFrameValue": "A valor drop-frame", + "adjustAll": "Ajustar todo", + "adjustSelectedLines": "Ajustar líneas sel.", + "adjustSelectedLinesAndForward": "Ajustar líneas sel. y adelante", + "toFrameRate": "A tasa fotogramas", + "fromFrameRate": "Desde tasa fotogramas", + "adjustAllTimes": "Ajustar todos los tiempos (antes/después)", + "showEarlier": "Mostrar antes", + "showLater": "Mostrar después", + "changeFrameRate": "Cambiar tasa fotogramas", + "setSyncPoint": "Establecer punto sincro", + "syncPoints": "Puntos sincro", + "pointSync": "Sincronización puntos", + "pointSyncViaOther": "Sincronización puntos vía otro subtítulo", + "adjustmentX": "Ajuste: {0}", + "adjustAllShortcuts": "Atajos de teclado:\r\n\r\n• Mayús + Izq/Der: Mover 10 ms\r\n• Ctrl + Izq/Der: Mover 100 ms\r\n• Alt + Izq/Der: Mover 500 ms", + "offsetInSeconds": "Desfase en segundos", + "speedFactor": "Factor de velocidad" + }, + "translate": { + "translateViaCopyPaste": "Auto-traducir vía copiar/pegar", + "maxBlockSize": "Tamaño bloque máx.", + "lineSeparator": "Separador línea", + "blockCopyInfo": "Ve al traductor/IA y pega el texto (ya está en el portapapeles), copia el resultado y pulsa el botón de abajo.", + "blockCopyGetFromClipboard": "Obtener texto del portapapeles (del traductor/IA)", + "reCopyTextToClipboard": "Volver a copiar al portapapeles (para el traductor/IA)", + "blockXOfY": "Bloque {0} de {1}", + "noTextInClipboard": "No hay texto en el portapapeles", + "textInClipboardIsSameAsSourceText": "El texto del portapapeles es igual al de origen, inténtelo de nuevo.", + "lineMerge": "Unir líneas", + "delayInSecondsBetweenRequests": "Retraso en segundos entre peticiones", + "maxBytesPerRequest": "Bytes máx. por petición", + "promptText": "Texto del prompt" + }, + "options": { + "settings": { + "dialogStyle": "Estilo de diálogo", + "dialogStyleDashSecondLineWithoutSpace": "Guion segunda línea sin espacio", + "dialogStyleDashSecondLineWithSpace": "Guion segunda línea con espacio", + "dialogStyleDashBothLinesWithSpace": "Guiones ambas líneas con espacio", + "dialogStyleDashBothLinesWithoutSpace": "Guiones ambas líneas sin espacio", + "continuationStyle": "Estilo de continuación", + "continuationStyleNone": "Ninguno", + "continuationStyleNoneTrailingDots": "Ninguno, puntos para pausas (solo al final)", + "continuationStyleNoneLeadingTrailingDots": "Ninguno, puntos para pausas", + "continuationStyleNoneTrailingEllipsis": "Ninguno, elipsis para pausas (solo al final)", + "continuationStyleNoneLeadingTrailingEllipsis": "Ninguno, elipsis para pausas", + "continuationStyleOnlyTrailingDots": "Puntos (solo al final)", + "continuationStyleLeadingTrailingDots": "Puntos", + "continuationStyleOnlyTrailingEllipsis": "Elipsis (solo al final)", + "continuationStyleLeadingTrailingEllipsis": "Elipsis", + "continuationStyleLeadingTrailingDash": "Guion", + "continuationStyleLeadingTrailingDashDots": "Guion, pero puntos para pausas", + "continuationStyleCustom": "Personalizado", + "cpsLineLengthStyle": "CPS/Longitud línea", + "cpsLineLengthStyleCalcAll": "Contar todos los caracteres", + "cpsLineLengthStyleCalcNoSpaceCpsOnly": "Contar todo menos espacios, solo CPS", + "cpsLineLengthStyleCalcNoSpace": "Contar todo menos espacios", + "cpsLineLengthStyleCalcCjk": "CJK 1, Latín 0.5", + "cpsLineLengthStyleCalcCjkNoSpace": "CJK 1, Latín 0.5, espacio 0", + "cpsLineLengthStyleCalcIncludeCompositionCharacters": "Incluir caracteres de composición", + "cpsLineLengthStyleCalcIncludeCompositionCharactersNotSpace": "Incluir caracteres composición, no espacios", + "cpsLineLengthStyleCalcNoSpaceOrPunctuation": "Sin espacios ni puntuación ()[]-:;,.!?", + "cpsLineLengthStyleCalcNoSpaceOrPunctuationCpsOnly": "Sin espacios ni puntuación, solo CPS", + "cpsLineLengthStyleCalcIgnoreArabicDiacritics": "Ignorar diacríticos árabes", + "cpsLineLengthStyleCalcIgnoreArabicDiacriticsNoSpace": "Ignorar diacríticos árabes, sin espacios", + "timeCodeModeHhMmSsMs": "HH:MM:SS:MS", + "timeCodeModeHhMmSsFf": "HH:MM:SS:FF", + "splitBehaviorPrevious": "Hueco a la izq. de división (foco derecha)", + "splitBehaviorHalf": "Hueco en centro de división (foco izquierda)", + "splitBehaviorNext": "Hueco a la der. de división (foco izquierda)", + "subtitleListActionNothing": "Nada", + "subtitleListActionVideoGoToPositionAndPause": "Ir a pos. vídeo y pausar", + "subtitleListActionVideoGoToPositionAndPlay": "Ir a pos. vídeo y reproducir", + "subtitleListActionVideoGoToPositionAndPlayCurrentAndPause": "Ir a pos. vídeo, reprod. actual y pausar", + "subtitleListActionEditText": "Ir a cuadro de edición", + "subtitleListActionVideoGoToPositionMinus1SecAndPause": "Ir a pos. vídeo - 1 s y pausar", + "subtitleListActionVideoGoToPositionMinusHalfSecAndPause": "Ir a pos. vídeo - 0.5 s y pausar", + "subtitleListActionVideoGoToPositionMinus1SecAndPlay": "Ir a pos. vídeo - 1 s y reproducir", + "subtitleListActionEditTextAndPause": "Ir a cuadro edición y pausar en pos. vídeo", + "autoBackupEveryMinute": "Cada minuto", + "autoBackupEveryXthMinute": "Cada {0} minutos", + "profiles": "Perfiles", + "autoBackupDeleteAfterXMonths": "Eliminar copias tras {0} meses", + "searchSettingsDotDoDot": "Buscar en ajustes...", + "syntaxColoring": "Coloreado de sintaxis", + "waveformSpectrogram": "Forma de onda/espectrograma", + "network": "Red", + "fileTypeAssociations": "Asociaciones de archivo", + "textBoxColorTags": "Etiquetas color (HTML/ASSA) en cuadro de edición", + "textBoxLiveSpellCheck": "Ortografía en vivo en cuadro de edición", + "textBoxCenterText": "Centrar texto en cuadro de edición", + "textBoxFontBold": "Negrita en cuadro de edición", + "textBoxFontSize": "Tamaño fuente en cuadro de edición", + "subtitleTextBoxAndGridFontName": "Fuente UI en cuadro de edición y lista", + "subtitleGridFontSize": "Tamaño fuente en lista de subtítulos", + "subtitleGridTextSingleLine": "Subtítulo en una sola línea en lista", + "subtitleGridLiveSpellCheck": "Ortografía en vivo en lista", + "subtitleGridShowFormatting": "Mostrar formato (HTML/ASSA) en lista", + "showUpDownStartTime": "Control arriba/abajo para \"Inicio\"", + "showUpDownEndTime": "Control arriba/abajo para \"Fin\"", + "showUpDownDuration": "Control arriba/abajo para \"Duración\"", + "showUpDownLabels": "Mostrar etiquetas en controles arriba/abajo", + "showButtonHints": "Mostrar sugerencias de botones", + "gridCompactMode": "Usar modo compacto en listas", + "uiFont": "Fuente de la interfaz", + "theme": "Tema", + "iconTheme": "Tema de iconos", + "darkThemeForegroundColor": "Color de frente (tema oscuro)", + "darkThemeBackgroundColor": "Color de fondo (tema oscuro)", + "showGridLines": "Mostrar líneas de cuadrícula", + "resetSettings": "¿Restablecer ajustes?", + "resetSettingsDetail": "Se restablecerán todos los ajustes a sus valores por defecto.\n\n¿Continuar?", + "showHorizontalLineAboveToolbar": "Línea horizontal sobre barra herramientas", + "bookmarkColor": "Color de marcadores", + "singleLineMaxLength": "Longitud máx. línea única", + "optimalCharsPerSec": "CPS óptimos", + "maxCharsPerSec": "CPS máximos", + "maxWordsPerMin": "WPM máximos", + "minDurationMs": "Duración mín. (ms)", + "maxDurationMs": "Duración máx. (ms)", + "minGapMs": "Espacio mín. (ms)", + "maxLines": "Número máx. de líneas", + "unbreakSubtitlesShortThan": "Unir subtítulos más cortos que", + "newEmptyDefaultMs": "Duración predet. nuevo subtítulo (ms)", + "promptBeforeDelete": "Preguntar antes de borrar", + "rememberPositionAndSize": "Recordar posición y tamaño de ventana", + "autoBackupOn": "Copia seguridad automática", + "autoBackupIntervalMinutes": "Intervalo copia seguridad (min)", + "autoBackupDeleteAfterDays": "Días de retención de copias", + "autoConvertToUtf8": "Auto-convertir a UTF-8 al abrir", + "autoTrimWhiteSpace": "Auto-recortar espacios", + "defaultEncoding": "Codificación predeterminada", + "colorDurationTooShort": "Color duración si es muy corta", + "colorDurationTooLong": "Color duración si es muy larga", + "colorTextTooLong": "Color texto si es muy largo", + "colorTextTooWide": "Color texto si es muy ancho (píxeles)", + "colorTextTooManyLines": "Color texto si hay más de 2 líneas", + "colorOverlap": "Color superposición tiempos", + "colorGapTooShort": "Color si espacio es muy corto", + "errorBackgroundColor": "Color fondo error", + "waveformDrawGridLines": "Dibujar líneas cuadrícula", + "waveformCenterVideoPosition": "Centrar posición vídeo", + "waveformShowToolbar": "Mostrar barra de herramientas", + "waveformShowToolbarEdit": "Editar barra herramientas...", + "waveformSpectrogramCombinedWaveformHeight": "Onda/espectro combinado, altura onda %", + "showWaveformToolbarPlay": "Barra: botón reproducir", + "showWaveformToolbarRepeat": "Barra: botón repetir", + "showWaveformToolbarRemoveBlankLines": "Barra: botón quitar líneas blanco", + "showWaveformToolbarNew": "Barra: botón nuevo subtítulo", + "showWaveformToolbarSetStart": "Barra: botón fijar inicio", + "showWaveformToolbarSetEnd": "Barra: botón fijar fin", + "showWaveformToolbarStartAndOffsetTheRest": "Barra: botón fijar inicio y desfasar resto", + "showWaveformToolbarHorizontalZoom": "Barra: deslizador zoom horizontal", + "showWaveformToolbarVerticalZoom": "Barra: deslizador zoom vertical", + "showWaveformToolbarVideoPositionSlider": "Barra: deslizador posición vídeo", + "showWaveformToolbarPlaybackSpeed": "Barra: velocidad reproducción", + "waveformFocusTextboxAfterInsertNew": "Foco en cuadro texto tras insertar", + "waveformInvertMouseWheel": "Invertir rueda ratón", + "waveformSnapToShotChanges": "Ajustar a cambios de plano", + "waveformShotChangesAutoGenerate": "Auto-generar cambios plano", + "waveformTextFontSize": "Tamaño fuente texto en onda", + "waveformTextFontBold": "Negrita texto en onda", + "waveformTextColor": "Color texto en onda", + "waveformColor": "Color de la forma de onda", + "waveformBackgroundColor": "Color de fondo de onda", + "waveformSelectedColor": "Color de onda seleccionada", + "downloadFfmpeg": "Descargar ffmpeg", + "showToolbarNew": "Icono nuevo", + "showToolbarOpen": "Icono abrir", + "showToolbarVideoFileOpen": "Icono abrir vídeo", + "showToolbarSave": "Icono guardar", + "showToolbarSaveAs": "Icono guardar como", + "showToolbarFind": "Icono buscar", + "showToolbarReplace": "Icono reemplazar", + "showToolbarSpellCheck": "Icono ortografía", + "showToolbarFixCommonErrors": "Icono errores comunes", + "showToolbarSettings": "Icono ajustes", + "showToolbarLayout": "Icono diseño", + "showToolbarHelp": "Icono ayuda", + "showToolbarEncoding": "Mostrar codificación", + "showToolbarFrameRate": "Mostrar tasa fotogramas", + "proxyAddress": "Dirección proxy", + "username": "Usuario", + "password": "Password", + "defaultFormat": "Formato predeterminado", + "defaultSaveAsFormat": "Formato predeterminado \"Guardar como\"", + "favoriteSubtitleFormats": "Formatos favoritos", + "showStopButton": "Botón parar", + "showFullscreenButton": "Botón pantalla completa", + "autoOpenVideoFile": "Abrir vídeo al abrir subtítulos", + "downloadMpv": "Descargar mpv", + "downloadVlc": "Descargar VLC", + "goToLineNumberSetsVideoPosition": "Ir a línea también mueve vídeo", + "adjustAllTimesRememberLineSelectionChoice": "Recordar elección selección líneas al ajustar tiempos", + "filesAndLogs": "Archivos y registros", + "showErrorLogFile": "Ver archivo registro errores", + "showWhisperLogFile": "Ver archivo registro Whisper", + "showSettingsFile": "Ver archivo ajustes", + "showAssaLayer": "Mostrar cuadro capa ASSA", + "waveformCursorColor": "Color cursor/cabezal onda", + "waveformParagraphLeftColor": "Color borde izquierdo onda", + "waveformParagraphRightColor": "Color borde derecho onda", + "waveformFancyHighColor": "Color onda moderno (alto)", + "waveformFocusOnMouseOver": "Foco al pasar ratón", + "resetAllSettings": "Restablecer todos los ajustes", + "resetShortcuts": "Restablecer atajos", + "resetRecentFiles": "Restablecer recientes", + "resetMultipleReplaceRules": "Restablecer reglas reemplazo", + "resetAppearance": "Restablecer apariencia", + "resetAutoTranslate": "Restablecer auto-traducción", + "resetWindowPositionAndSize": "Restablecer posición ventana", + "resetSettingsTitle": "Restablecer ajustes", + "openRuleFile": "Abrir archivo reglas", + "exportProfiles": "Exportar perfiles", + "saveRuleProfilesFile": "Guardar archivo perfiles reglas", + "ruleProfilesExportedX": "{0} perfiles exportados", + "ruleProfilesImportedX": "{0} perfiles importados", + "useSpecialStyleAfterLongGaps": "Estilo especial tras espacios largos", + "addSpace": "Añadir espacio", + "processIfEndsWithComma": "Procesar si acaba en coma", + "removeComma": "Quitar coma", + "editContinuationStyleCustom": "Editar estilo continuación personalizado", + "longGapThreshold": "Umbral espacio largo (ms)", + "afterLongGap": "Tras espacio largo:", + "resetSyntaxColoring": "Restablecer color sintaxis", + "resetWaveform": "Restablecer forma de onda", + "resetRules": "Restablecer reglas", + "useFrameMode": "Usar modo fotogramas (hh.mm.ss.ff)", + "textBoxLimitNewLines": "Limitar saltos línea en cuadro texto", + "mpvVideoOutput": "Salida vídeo (mpv)", + "mpvOpenGl": "libmpv - OpenGL", + "mpvSoftwareRendering": "libmpv - Software (lento)", + "mpvWidRendering": "libmpv - Nativo Window ID (rápido en Win/Linux)", + "waveFormsAndSpectrogramFoldersContainsX": "Carpetas de onda/espectro contienen {0}", + "deleteWaveformAndSpectrogramFoldersQuestion": "¿Borrar archivos de onda y espectro?", + "waveformGenerateSpectrogram": "Generar espectrograma", + "waveformSpectrogramMode": "Modo espectrograma", + "waveformCenterOnSingleClick": "Centrar con un clic", + "waveformSingleClickSelectsSubtitle": "Clic selecciona subtítulo", + "waveformRightClickSelectsSubtitle": "Clic derecho selecciona subtítulo", + "waveformPauseOnSingleClick": "Clic pausa reproducción", + "waveformDrawStyle": "Estilo dibujo onda", + "vlcWidRendering": "libVLC - Nativo Window ID", + "subtitleSEnterKeyAction": "Acción tecla Enter en lista", + "subtitleSingleClickAction": "Acción un clic en lista", + "subtitleDoubleClickAction": "Acción doble clic en lista", + "saveAsBehavior": "Comportamiento \"Guardar como\"", + "saveAsAppendLanguageCode": "\"Guardar como\" añade código idioma", + "gridGoToSubtitleAndSetVideoPosition": "Ir a subtítulo y mover vídeo", + "gridGoToNextLine": "Ir a la siguiente línea", + "gridGoToSubtitleOnlyWaveformOnly": "Ir a subtítulo (solo onda)", + "gridGoToSubtitleAndPause": "Ir a subtítulo y pausar", + "gridGoToSubtitleAndPlay": "Ir a subtítulo y reproducir", + "gridGoToSubtitleAndPauseAndFocusTextBox": "Ir a sub, pausar y foco cuadro texto", + "subtitleGridFormattingNone": "Sin formato", + "subtitleGridFormattingShowFormatting": "Mostrar formato", + "subtitleGridFormattingShowTags": "Mostrar etiquetas", + "waveformParagraphBackgroundColor": "Color fondo subtítulo en onda", + "waveformParagraphSelectedBackgroundColor": "Color fondo subtítulo seleccionado en onda", + "waveformAllowOverlap": "Permitir superposición (mover/redimensionar)", + "saveAsBehaviorUseSubtitleVideoFilename": "Nombre subtítulo/vídeo", + "saveAsBehaviorUseVideoSubtitleFilename": "Nombre vídeo/subtítulo", + "saveAsBehaviorUseVideoFileName": "Usar nombre de vídeo", + "saveAsBehaviorUseSubtitleFileName": "Usar nombre de subtítulo", + "saveAsAppendLanguageCodeTwoLetter": "Dos letras", + "saveAsAppendLanguageCodeThreeLetter": "Tres letras", + "saveAsAppendLanguageCodeLanguageName": "Nombre del idioma", + "splitOddLineActionWeightTop": "Priorizar arriba", + "splitOddLineActionWeightBottom": "Priorizar abajo", + "splitOddLinesAction": "Acción dividir líneas impares", + "ocrUseWordSplitList": "OCR: usar lista división palabras", + "speechToTextSelectedLinesPromptFistTimeOnly": "Voz a texto: preguntar idioma solo primera vez", + "multipleReplaceShowDotDotDotButtons": "Reemplazo múltiple: botones menú contexto", + "gridFocusTextboxAfterInsertNew": "Lista: foco en cuadro texto tras insertar", + "useFocusedButtonBackgroundColor": "Usar color fondo en botón enfocado", + "focusedButtonBackgroundColor": "Color fondo botón enfocado", + "forceCrLfOnSave": "Forzar CR+LF al guardar", + "showWaveformToolbarPlayNext": "Barra: botón reprod. siguiente", + "showWaveformToolbarPlaySelection": "Barra: botón reprod. selección", + "textBoxButtonShowAutoBreak": "C. texto: botón auto-división", + "textBoxButtonShowUnbreak": "C. texto: botón unir", + "textBoxButtonShowItalic": "C. texto: botón cursiva", + "textBoxButtonShowColor": "C. texto: botón color", + "textBoxButtonShowRemoveFormatting": "C. texto: botón quitar formato", + "waveformSingleClickAction": "Acción un clic en onda", + "waveformDoubleClickAction": "Acción doble clic en onda", + "allSettings": "Todos los ajustes", + "uiScale": "Escala de la interfaz (%)", + "waveformToolbarItems": "Elementos barra onda", + "matchIconColorToDarkTheme": "Iconos acordes al tema oscuro", + "subtitlePreviewProperties": "Propiedades vista previa" + }, + "shortcuts": { + "title": "Atajos de teclado", + "searchShortcuts": "Buscar atajos...", + "filter": "Filtro", + "categoryGeneral": "General", + "categorySubtitleGridAndTextBox": "Lista y cuadro texto", + "categorySubtitleGrid": "Lista subtítulos", + "categoryWaveform": "Forma de onda", + "generalMergeSelectedLines": "Combinar líneas seleccionadas", + "generalMergeWithPrevious": "Combinar con el anterior", + "generalMergeWithNext": "Combinar con el siguiente", + "generalMergeWithPreviousAndUnbreak": "Combinar con anterior y unir", + "generalMergeWithNextAndUnbreak": "Combinar con siguiente y unir", + "generalMergeWithPreviousAndAutoBreak": "Combinar con anterior y auto-dividir", + "generalMergeWithNextAndAutoBreak": "Combinar con siguiente y auto-dividir", + "generalMergeSelectedLinesAndAutoBreak": "Combinar seleccionados y auto-dividir", + "generalMergeSelectedLinesAndUnbreak": "Combinar seleccionados y unir", + "generalMergeSelectedLinesAndUnbreakCjk": "Combinar seleccionados y unir CJK", + "generalMergeSelectedLinesOnlyFirstText": "Combinar seleccionados (solo primer texto)", + "generalMergeSelectedLinesBilingual": "Combinar seleccionados bilingüe", + "generalMergeWithPreviousBilingual": "Combinar con anterior bilingüe", + "generalMergeWithNextBilingual": "Combinar con siguiente bilingüe", + "generalMergeOriginalAndTranslation": "Combinar original y traducción", + "generalToggleTranslationMode": "Alternar modo traducción", + "generalSwitchOriginalAndTranslation": "Intercambiar original y traducción", + "generalSwitchOriginalAndTranslationTextBoxes": "Intercambiar cuadros de texto original/trad.", + "generalChooseLayout": "Elegir diseño", + "generalLayoutChooseX": "Diseño {0}", + "generalPlayFirstSelected": "Reproducir primero seleccionado", + "generalGoToFirstSelectedLine": "Ir a primera línea seleccionada", + "generalGoToNextEmptyLine": "Ir a siguiente línea vacía", + "generalGoToNextSubtitle": "Ir al siguiente subtítulo", + "generalGoToNextSubtitlePlayTranslate": "Ir a sig. subtítulo (reprod. trad.)", + "generalGoToNextSubtitleCursorAtEnd": "Ir a sig. subtítulo (cursor al final)", + "generalGoToPrevSubtitle": "Ir al subtítulo anterior", + "generalGoToPrevSubtitlePlayTranslate": "Ir a ant. subtítulo (reprod. trad.)", + "generalGoToStartOfCurrentSubtitle": "Ir al inicio del subtítulo actual", + "generalGoToEndOfCurrentSubtitle": "Ir al fin del subtítulo actual", + "generalGoToPreviousSubtitleAndFocusVideo": "Ir a ant. subtítulo y foco vídeo", + "generalGoToNextSubtitleAndFocusVideo": "Ir a sig. subtítulo y foco vídeo", + "generalGoToPrevSubtitleAndPlay": "Ir a ant. subtítulo y reproducir", + "generalGoToNextSubtitleAndPlay": "Ir a sig. subtítulo y reproducir", + "generalGoToPreviousSubtitleAndFocusWaveform": "Ir a ant. subtítulo y foco onda", + "generalGoToNextSubtitleAndFocusWaveform": "Ir a sig. subtítulo y foco onda", + "generalGoToLineNumber": "Ir al número de línea", + "generalGoToVideoPosition": "Ir a la posición del vídeo", + "generalToggleItalic": "Alternar cursiva", + "generalToggleBold": "Alternar negrita", + "generalToggleBookmarks": "Alternar marcadores", + "generalFocusTextBox": "Enfocar cuadro de texto", + "generalToggleBookmarksWithText": "Alternar marcadores con texto", + "generalEditBookmarks": "Editar marcadores", + "fileNew": "Nuevo", + "fileOpen": "Abrir", + "fileOpenKeepVideo": "Abrir (mantener vídeo)", + "fileSave": "Guardar", + "fileSaveAs": "Guardar como", + "fileSaveAll": "Guardar todo", + "fileSaveOriginal": "Guardar original", + "fileSaveOriginalAs": "Guardar original como", + "fileOpenOriginalSubtitle": "Abrir subtítulo original", + "fileCloseOriginalSubtitle": "Cerrar subtítulo original", + "fileTranslatedSubtitle": "Subtítulo traducido", + "fileCompare": "Comparar", + "fileStatistics": "Estadísticas", + "fileImportPlainText": "Importar texto plano", + "fileImportBluRaySupForOcr": "Importar Blu-ray SUP para OCR", + "fileImportBluRaySupForEdit": "Importar Blu-ray SUP para editar", + "fileImportTimeCodes": "Importar códigos de tiempo", + "fileExportEbuStl": "Exportar EBU STL", + "fileExportPac": "Exportar PAC", + "fileExportEdlClipName": "Exportar nombre clip EDL", + "fileExportPlainText": "Exportar texto plano", + "fileExportCustomTextFormat1": "Exportar formato personal. 1", + "fileExportCustomTextFormat2": "Exportar formato personal. 2", + "fileExportCustomTextFormat3": "Exportar formato personal. 3", + "fileExit": "Salir", + "openSeDataFolder": "Abrir carpeta Subtitle Edit", + "editFind": "Buscar", + "editFindNext": "Buscar siguiente", + "editFindPrevious": "Buscar anterior", + "editReplace": "Reemplazar", + "editMultipleReplace": "Reemplazo múltiple", + "editModifySelection": "Modificar selección", + "listSelectAll": "Seleccionar todo", + "listSelectFirst": "Seleccionar primero", + "listSelectLast": "Seleccionar último", + "listInverseSelection": "Invertir selección", + "listDeleteSelection": "Eliminar selección", + "rippleDeleteSelection": "Eliminar selección (efecto rizo)", + "settings": "Ajustes", + "assigned": "Asignado", + "unassigned": "Sin asignar", + "pressedKeyX": "Tecla pulsada: {0}", + "pressAKey": "Pulse una tecla", + "detectKey": "Detectar tecla", + "control": "Control", + "alt": "Alt", + "win": "Win", + "shift": "Mayús", + "controlMac": "⌃", + "altMac": "⌥", + "winMac": "⌘", + "shiftMac": "⇧", + "resetShortcuts": "Restablecer atajos", + "resetShortcutsDetail": "¿Desea restablecer todos los atajos a sus valores por defecto?", + "togglePlayPause": "Alternar reprod./pausa", + "toggleLockTimeCodes": "Alternar bloqueo tiempos", + "duplicateSelectedLines": "Duplicar líneas seleccionadas", + "sourceView": "Vista de origen", + "showAlignmentPicker": "Alineación", + "addOrEditBookmark": "Añadir o editar marcador", + "listBookmarks": "Listar marcadores", + "toggleBookmark": "Alternar marcador (sin texto)", + "goToNextBookmark": "Ir al siguiente marcador", + "toggleWaveformToolbar": "Alternar barra herramientas onda", + "waveformSetStartAndSetEndOfPreviousMinusGap": "Fijar inicio y fin del anterior menos espacio", + "waveformSetEndAndStartOfNextAfterGap": "Fijar fin e inicio del siguiente más espacio", + "waveformSetEndAndStartOfNextAfterGapAndGoToNext": "Fijar fin, inicio del sig. e ir al siguiente", + "fetchFirstWordFromNextSubtitle": "Traer primera palabra del siguiente", + "moveLastWordToNextSubtitle": "Mover última palabra al siguiente", + "moveLastWordFromFirstLineDownCurrentSubtitle": "Bajar última palabra de la primera línea", + "moveFirstWordFromNextLineUpCurrentSubtitle": "Subir primera palabra de la segunda línea", + "toggleFocusGridAndWaveform": "Cambiar foco entre lista y onda", + "toggleFocusTextBoxAndWaveform": "Cambiar foco entre cuadro texto y onda", + "toggleFocusTextBoxAndGrid": "Cambiar foco entre cuadro texto y lista", + "goToPreviousLineAndSetVideoPosition": "Ir a línea anterior y mover vídeo", + "goToPreviousLineFromVideoPosition": "Ir a subtítulo anterior (desde pos. vídeo)", + "goToNextLineFromVideoPosition": "Ir a subtítulo siguiente (desde pos. vídeo)", + "goToNextLineAndSetVideoPosition": "Ir a línea siguiente y mover vídeo", + "textBoxDeleteSelectionNoClipboard": "Cuadro texto: Borrar sin copiar", + "textBoxCut": "Cuadro texto: Cortar", + "textBoxCut2": "Cuadro texto: Cortar (alt.)", + "textBoxPaste": "Cuadro texto: Pegar", + "textBoxCopy": "Cuadro texto: Copiar", + "textBoxSelectAll": "Cuadro texto: Seleccionar todo", + "subtitleGridCut": "Lista: Cortar", + "subtitleGridCopy": "Lista: Copiar", + "subtitleGridPaste": "Lista: Pegar", + "setShortcutForX": "Fijar atajo para \"{0}\"", + "commandFileNewKeepVideo": "Nuevo (mantener vídeo)", + "fileOpenOriginal": "Abrir original", + "fileCloseOriginal": "Cerrar original", + "restoreAutoBackup": "Restaurar copia seguridad", + "openContainingFolder": "Abrir carpeta contenedora", + "importTimeCodes": "Importar códigos tiempo", + "importSubtitleWithManuallyChosenEncoding": "Importar subtítulo con codificación manual", + "exportBluRaySup": "Exportar Blu-ray SUP", + "exportCustomTextFormat": "Exportar formato personal.", + "exportPlainText": "Exportar texto plano", + "showHistory": "Mostrar historial", + "toggleRightToLeft": "Alternar derecha a izquierda", + "modifySelection": "Modificar selección", + "adjustDurations": "Ajustar duraciones", + "applyDurationLimits": "Aplicar límites duración", + "batchConvert": "Conversión por lotes", + "bridgeGaps": "Unir espacios", + "applyMinGap": "Aplicar espacio mín.", + "fixCommonErrors": "Corregir errores comunes", + "makeEmptyTranslationFromCurrentSubtitle": "Vaciar traducción desde subtítulo actual", + "mergeLinesWithSameText": "Combinar líneas con mismo texto", + "mergeLinesWithSameTimeCodes": "Combinar con mismos códigos tiempo", + "splitBreakLongLines": "Dividir/reequilibrar líneas largas", + "mergeShortLines": "Combinar líneas cortas", + "removeTextForHearingImpaired": "Quitar texto defic. auditivos", + "joinSubtitles": "Unir subtítulos", + "splitSubtitle": "Dividir subtítulo", + "spellCheck": "Corrector ortográfico", + "spellCheckGetDictionary": "Obtener diccionario ortográfico", + "openVideo": "Abrir vídeo", + "openVideoFromUrl": "Abrir vídeo desde URL", + "closeVideo": "Cerrar vídeo", + "speechToText": "Voz a texto (Whisper)", + "textToSpeech": "Texto a voz", + "burnIn": "Incrustar subtítulos en vídeo", + "generateTransparent": "Generar vídeo transparente", + "undockVideoControls": "Desacoplar controles vídeo", + "redockVideoControls": "Reacoplar controles vídeo", + "generateBlankVideo": "Generar vídeo en blanco", + "reencodeVideo": "Recodificar vídeo", + "cutVideo": "Cortar vídeo", + "cutVideoSelectedLines": "Cortar vídeo (líneas sel.)", + "adjustAllTimes": "Ajustar todos los tiempos", + "visualSync": "Sincronización visual", + "translateViaCopyPaste": "Traducir vía copiar-pegar", + "shortcuts": "Atajos de teclado", + "wordLists": "Listas de palabras", + "chooseUiLanguage": "Elegir idioma interfaz", + "chooseRuleProfile": "Elegir perfil de reglas", + "videoFullScreen": "Vídeo pantalla completa", + "copyTextFromOriginalSelectedLines": "Copiar texto original (líneas sel.)", + "textBoxRemoveAllFormatting": "Cuadro texto: Quitar formato", + "textBoxItalic": "Cuadro texto: Cursiva", + "resetWaveformZoomAndSpeed": "Restablecer zoom y velocidad onda", + "togglePlaybackSpeed": "Alternar velocidad reproducción", + "playbackSpeedSlower": "Reproducción más lenta", + "playbackSpeedFaster": "Reproducción más rápida", + "switchOriginalAndTranslationSelectedLines": "Intercambiar original/trad. (líneas sel.)", + "mergeOriginalIntoTranslationSelectedLines": "Combinar original/trad. (líneas sel.)", + "seekSilence": "Buscar silencios", + "setVideoPositionCurrentSubtitleStart": "Ir al inicio de línea actual", + "setVideoPositionCurrentSubtitleEnd": "Ir al fin de línea actual", + "toggleAudioTracks": "Alternar pistas audio", + "listErrors": "Listar errores", + "goToNextError": "Ir al siguiente error", + "goToPreviousError": "Ir al anterior error", + "addNameToNameList": "Añadir nombre a la lista", + "findDoubleWords": "Buscar palabras dobles", + "findDoubleLines": "Buscar líneas dobles", + "colorX": "Color {0}", + "removeColor": "Quitar color", + "surroundWith": "Rodear con...", + "surroundWithXY": "Rodear con {0}/{1}", + "repeatLine": "Repetir línea", + "repeatPreviousLine": "Repetir línea anterior", + "repeatNextLine": "Repetir línea siguiente", + "moveVideoPositionMilliseconds": "Mover vídeo en milisegundos", + "importShortcutsTitle": "Importar atajos", + "exportShortcutsTitle": "Exportar atajos", + "xShortcutsImportedFromY": "{0} atajos importados de {1}", + "xShortcutsExportedToY": "{0} atajos exportados a {1}", + "importImageSubtitleForEdit": "Importar subtítulo imagen para editar", + "showPointSyncViaOther": "Mostrar sincro puntos vía otro", + "showPointSync": "Mostrar sincro por puntos", + "showMediaInformation": "Mostrar información del medio", + "chooseSubtitleFormat": "Elegir formato subtítulo", + "trimWhitespaceSelectedLines": "Quitar espacios (líneas sel.)", + "waveformHorizontalZoomInCommand": "Zoom horizontal onda +", + "waveformHorizontalZoomOutCommand": "Zoom horizontal onda -", + "waveformVerticalZoomInCommand": "Zoom vertical onda +", + "waveformVerticalZoomOutCommand": "Zoom vertical onda -", + "copySubtitlePathToClipboard": "Copiar ruta subtítulo", + "copySubtitleOriginalPathToClipboard": "Copiar ruta subtítulo original", + "focusTextBox": "Enfocar cuadro texto", + "sortByStartTime": "Ordenar por inicio", + "sortByEndTime": "Ordenar por fin", + "duplicatesFound": "Se encontraron los siguientes atajos duplicados:", + "copyTextToClipboard": "Copiar texto portapapeles (líneas sel.)", + "copyTextFromOriginalToClipboard": "Copiar texto original (líneas sel.)", + "assaDraw": "Dibujo ASSA", + "assaGenerateProgressBar": "Generar barra progreso ASSA", + "assaGenerateBackgroundBox": "Generar caja fondo ASSA", + "assaStyles": "Estilos ASSA", + "assaProperties": "Propiedades ASSA", + "assaAttachments": "Adjuntos ASSA", + "assaVideoColorPicker": "Selector color vídeo ASSA", + "recalculateDurationSelectedLines": "Recalcular duración (líneas sel.)", + "toggleWaveformAndSpectrogramHeight": "Alternar altura onda/espectro", + "toggleSpectrogramStyle": "Alternar estilo espectrograma", + "copyMsRelativeToCurrentSubtitleLineToClipboard": "Copiar ms relativos a la línea actual", + "layoutZoomIn": "Escalar interfaz +", + "layoutZoomOut": "Escalar interfaz -" + }, + "wordLists": { + "title": "Listas de palabras", + "addName": "Añadir nombre", + "addWord": "Añadir palabra", + "addPair": "Añadir par", + "nameAndIgnoreList": "Lista nombres/ignorar", + "userWords": "Lista palabras usuario", + "ocrFixList": "Lista corrección OCR", + "unableToAddItem": "¡No se pudo añadir; probablemente ya existe!", + "unableToRemoveItem": "¡No se pudo eliminar!" + }, + "chooseLanguage": { + "title": "Elegir idioma de la interfaz" + } + }, + "help": { + "aboutSubtitleEdit": "Acerca de Subtitle Edit", + "checkForUpdates": "Buscar actualizaciones", + "checkForUpdatesChecking": "Buscando actualizaciones...", + "checkForUpdatesUpToDate": "Está utilizando la última versión.", + "checkForUpdatesNewVersionAvailable": "Nueva versión disponible: {0}", + "checkForUpdatesUnableToCheck": "No se pudo buscar actualizaciones.", + "checkForUpdatesDownloadNewVersion": "Descargar nueva versión" + }, + "ocr": { + "linesToDraw": "Líneas a dibujar", + "currentImage": "Imagen actual", + "autoDrawAgain": "Auto-dibujar de nuevo", + "startOcr": "Iniciar OCR", + "pauseOcr": "Pausar OCR", + "inspectLine": "Inspeccionar línea...", + "ocrEngine": "Motor OCR", + "database": "Base de datos", + "maxWrongPixels": "Máx. píxeles erróneos", + "maxErrorPct": "Máx. % error", + "numberOfPixelsIsSpace": "Nº píxeles es espacio", + "inspectImageMatches": "Inspeccionar coincidencias", + "resolutionXYAndTopmarginZ": "Res. {0}x{1}, margen sup. {2}", + "runningOcrDotDotDotXY": "Ejecutando OCR... {0}/{1}", + "runningOcrDotDotDot": "Ejecutando OCR...", + "autoSubmitFirstCharacter": "Enviar auto. primer carácter", + "editNOcrDatabase": "Editar base datos nOCR", + "zoomFactorX": "Factor zoom: {0}x", + "expandInfoX": "Cuenta expansión: {0}", + "editNOcrDatabaseXWithYItems": "Edición nOCR {0} con {1:#,###,##0} elementos", + "newNOcrDatabase": "Nueva base datos nOCR", + "renameNOcrDatabase": "Renombrar base datos nOCR", + "nOcrDatabase": "Base de datos nOCR", + "drawMode": "Modo dibujo:", + "addNewCharcter": "Añadir nuevo carácter", + "lineIndexX": "Línea {0}", + "inspectNOcrAdditions": "Inspeccionar adiciones nOCR", + "ocrSelectedLines": "OCR líneas seleccionadas", + "showImage": "Mostrar imagen", + "fixOcrErrors": "Corregir errores OCR", + "promptForUknownWords": "Preguntar palabras desconocidas", + "tryToGuessUnknownWords": "Intentar adivinar desconocidas", + "autoBreakIfMoreThanXLines": "Auto-dividir si hay más de {0} líneas", + "unknownWords": "Palabras desconocidas", + "allFixes": "Todas las correcciones", + "guessesUsed": "Adivinanzas usadas", + "ocr": "OCR", + "ocrX": "OCR - {0}", + "addBetterMatch": "Añadir mejor coincidencia", + "nOcrInspectImageMatches": "nOCR - Inspeccionar coincidencias", + "addToOcrPair": "Añadir a pares reemplazo OCR", + "addNameToOcrReplaceList": "Añadir nombre a lista reemplazo OCR", + "wordToAdd": "Palabra a añadir", + "nameToAdd": "Nombre a añadir", + "changeWordFromTo": "Cambiar palabra de/a", + "clearBackground": "Limpiar fondo", + "clearForeground": "Limpiar primer plano", + "nOcrDrawHelp": "Consejos para dibujar\r\n────────────────────\r\n• Ctrl para continuar línea\r\n• Ctrl+z=deshacer, Ctrl+y=rehacer", + "editWholeText": "Editar todo el texto", + "editWordOnly": "Editar solo palabra", + "imagePreProcessing": "Pre-procesamiento imagen", + "preProcessingTitle": "Pre-procesamiento", + "cropTransparent": "Recortar colores transparentes", + "inverseColors": "Invertir colores", + "removeBorders": "Quitar bordes", + "binarize": "Binarizar", + "borderSize": "Tamaño del borde", + "captureTopAlign": "Capturar alineación superior", + "ocrImage": "Imagen OCR", + "oneColor": "Un color (blanco)", + "darknessThreshold": "Umbral de oscuridad", + "editExportDotDotDot": "Editar/exportar...", + "editBinaryOcrDatabase": "Editar base datos \"Binary image compare\"", + "binaryImageCompareDatabase": "Base datos \"Binary image compare\"", + "removeXFromUnknownWordsList": "Quitar \"{0}\" de desconocidas", + "downloadingPaddleOcrEngineDotDotDot": "Descargando motor Paddle OCR...", + "downloadingPaddleOcrModelsDotDotDot": "Descargando modelos Paddle OCR...", + "paddleOcr": "Paddle OCR", + "binaryImageCompareInspectImageMatches": "\"Binary image compare\" - Inspeccionar" + }, + "assa": { + "assaDraw": "Dibujo ASSA", + "drawSelectTool": "Seleccionar (mover puntos)", + "drawLineTool": "Línea (F4)", + "drawBezierTool": "Curva Bézier (F5)", + "drawRectangleTool": "Rectángulo (F6)", + "drawCircleTool": "Círculo (F7)", + "drawCloseShape": "Cerrar forma (F8/Enter)", + "drawDeleteShape": "Borrar forma (Supr)", + "drawChangeLayer": "Cambiar capa", + "drawClearAll": "Limpiar todo (Ctrl+N)", + "drawZoomIn": "Zoom + (Ctrl++)", + "drawZoomOut": "Zoom - (Ctrl+-)", + "drawResetView": "Reset vista (Ctrl+0)", + "drawToggleGrid": "Cuadrícula (Ctrl+G)", + "drawCopyToClipboard": "Copiar (Ctrl+C)", + "drawShapes": "Formas", + "drawSelectedPoint": "Punto seleccionado", + "drawSelectedShape": "Forma seleccionada", + "drawSelectedLayer": "Capa seleccionada", + "drawToolX": "Herramienta: {0}", + "drawHelpText": "Clic para puntos • Enter/F8 cierra forma • Mayús+Arrastrar para desplazar • Ctrl+Rueda para zoom", + "progressBarTitle": "Barra de progreso ASSA", + "progressBarSettings": "Barra de progreso", + "progressBarPosition": "Posición", + "progressBarBottom": "Abajo", + "progressBarTop": "Arriba", + "progressBarForeColor": "Color de frente", + "progressBarBackColor": "Color de fondo", + "progressBarStyle": "Estilo", + "progressBarSquareCorners": "Esquinas cuadradas", + "progressBarRoundedCorners": "Esquinas redondeadas", + "progressBarChapters": "Capítulos", + "progressBarSplitterWidth": "Ancho del separador", + "progressBarSplitterHeight": "Alto del separador", + "progressBarXAdjustment": "Ajuste X", + "progressBarYAdjustment": "Ajuste Y", + "progressBarTextAlignment": "Alineación del texto", + "progressBarTakePosFromVideo": "Tomar posición del vídeo", + "progressBarPreview": "Vista previa", + "resolutionResamplerTitle": "Cambiar resolución", + "resolutionResamplerSourceRes": "Resolución origen", + "resolutionResamplerTargetRes": "Resolución destino", + "resolutionResamplerChangeMargins": "Cambiar márgenes", + "resolutionResamplerChangeFontSize": "Cambiar tamaño fuente", + "resolutionResamplerChangePositions": "Cambiar posiciones", + "resolutionResamplerChangeDrawing": "Cambiar dibujo", + "resolutionResamplerFromVideo": "Del vídeo...", + "resolutionResamplerSourceAndTargetEqual": "Origen y destino son iguales - nada que hacer.", + "resolutionResamplerNothingSelected": "Seleccione al menos una opción para cambiar.", + "backgroundBoxGenerator": "Generar caja de fondo", + "backgroundBoxPadding": "Relleno", + "backgroundBoxFillWidth": "Llenar ancho", + "backgroundBoxBoxColor": "Color caja", + "backgroundBoxRadius": "Radio", + "backgroundBoxCircle": "Círculo", + "backgroundBoxSpikes": "Puntas", + "backgroundBoxBubbles": "Burbujas", + "backgroundBoxWave": "Onda", + "backgroundBoxHexagon": "Hexágono", + "backgroundBoxTornPaper": "Papel rasgado", + "backgroundBoxCloud": "Nube", + "backgroundBoxTornPaperDouble": "Papel rasgado (sup e inf)", + "backgroundBoxStarburst": "Explosión estelar", + "backgroundBoxScroll": "Pergamino", + "stylesTitle": "Estilos Advanced Sub Station Alpha", + "stylesInFile": "Estilos en el archivo", + "stylesSaved": "Estilos guardados", + "stylesTitleX": "Estilos - {0}", + "propertiesTitleX": "Propiedades - {0}", + "attachmentsTitleX": "Adjuntos - {0}", + "smartWrappingTopWide": "0: Ajuste inteligente (superior ancho)", + "endOfLineWrapping": "1: Ajuste al final, solo breaks \\N", + "noWrapping": "2: Sin ajuste, breaks \\N y \\n", + "smartWrappingBottomWide": "3: Ajuste inteligente (inferior ancho)", + "fontsAndGraphics": "Fuentes y gráficos", + "wrapStyle": "Estilo de ajuste", + "borderAndShadowScaling": "Escala de borde y sombra", + "originalScript": "Guion original", + "graphics": "Gráficos", + "copyToStorageStyles": "Copiar a estilos de almacén", + "copyToFileStyles": "Copiar a estilos de archivo", + "setStyleAsDefault": "Estilo por defecto", + "takeUsagesFromDotDotDot": "Tomar usos de...", + "noAttachmentsFound": "No hay adjuntos en el archivo ASSA.", + "deleteStyleQuestion": "¿Borrar estilo?", + "deleteStylesQuestion": "¿Borrar estilos?", + "openStyleImportFile": "Abrir archivo para importar estilos", + "primary": "Primario", + "secondary": "Secundario", + "applyOverrideTags": "Aplicar etiquetas anulación", + "chooseOverrideTagToAdd": "Elegir etiqueta a añadir", + "fontSizeChange": "Cambio tamaño fuente", + "moveTextFromLeftToRight": "Mover de izq. a der.", + "colorFromWhiteToRed": "Color blanco a rojo", + "rotateXSlow": "Rotar X (lento)", + "rotateX": "Rotar X", + "rotateY": "Rotar Y", + "rotateTilt": "Rotar inclinación", + "spaceIncrease": "Aumento espacio", + "popIn": "Aparición (pop in)", + "spinIn": "Giro (spin in)", + "playCurrent": "Reprod. actual", + "setPosition": "Fijar posición", + "imageColorPicker": "Selector color imagen", + "copyColorAsHextoClipboard": "Copiar color hex", + "generatingBackgroundBoxXOfY": "Generando caja fondo {0} de {1}...", + "applyAdvancedEffectTitle": "Aplicar efecto avanzado", + "chooseEffect": "Elegir efecto", + "advancedEffectTypewriter": "Máquina de escribir", + "advancedEffectTypewriterDescription": "Revela el texto carácter a carácter", + "advancedEffectTypewriterWithHighlight": "Máquina escribir con resaltado", + "advancedEffectTypewriterWithHighlightDescription": "Carácter a carácter con brillo en el actual", + "advancedEffectWordByWord": "Palabra por palabra", + "advancedEffectWordByWordDescription": "Revela el texto palabra a palabra", + "advancedEffectKaraoke": "Karaoke", + "advancedEffectKaraokeDescription": "Resalta cada carácter de izquierda a derecha", + "advancedEffectFancyKaraoke": "Karaoke - pop palabra activa", + "advancedEffectFancyKaraokeDescription": "Atenúa inactivas y aplica brillo/animación a la activa (vía \\u1)", + "advancedEffectScrambleReveal": "Revelación revuelta", + "advancedEffectScrambleRevealDescription": "Caracteres aleatorios que se descifran de izq a der", + "advancedEffectRainbowPulse": "Pulso arcoíris", + "advancedEffectRainbowPulseDescription": "Cada carácter cicla colores independientemente", + "advancedEffectWave": "Onda", + "advancedEffectWaveDescription": "Efecto de onda senoidal arriba y abajo", + "advancedEffectWaveBlue": "Onda (azul)", + "advancedEffectWaveBlueDescription": "Onda con animación en azul y cian", + "advancedEffectStarWarsScroll": "Créditos Star Wars", + "advancedEffectStarWarsScrollDescription": "Texto con perspectiva inclinada hacia arriba", + "advancedEffectEndCreditsScroll": "Créditos scroll", + "advancedEffectEndCreditsScrollDescription": "Scroll continuo hacia arriba para créditos finales", + "advancedEffectStarfield": "Campo de estrellas (fondo)", + "advancedEffectStarfieldDescription": "Efecto de viaje hiperespacial", + "advancedEffectRain": "Lluvia infinita (fondo)", + "advancedEffectRainDescription": "Efecto lluvia con capas de profundidad", + "advancedEffectSnow": "Nieve infinita (fondo)", + "advancedEffectSnowDescription": "Nevada continua con capas", + "advancedEffectOldMovie": "Cine antiguo (fondo)", + "advancedEffectOldMovieDescription": "Simula proyector de 35mm con ruido y rayas", + "advancedEffectNeonBurst": "Explosión neón", + "advancedEffectNeonBurstDescription": "Subtítulos estilo 'Shorts' con brillo neón y escala", + "advancedEffectSettings": "Ajustes", + "advancedEffectSnowFlakeCount": "Cantidad de copos", + "advancedEffectStarfieldStarCount": "Cantidad de estrellas", + "advancedEffectStarfieldSpeed": "Velocidad", + "advancedEffectGlitch": "Glitch", + "advancedEffectGlitchDescription": "Fallo digital con aberración cromática y distorsión", + "advancedEffectBounceIn": "Rebote", + "advancedEffectBounceInDescription": "Caracteres que entran rebotando elásticamente", + "advancedEffectFireflies": "Luciérnagas (fondo)", + "advancedEffectFirefliesDescription": "Puntos ámbar brillantes que flotan orgánicamente", + "advancedEffectMatrix": "Matrix", + "advancedEffectMatrixDescription": "Columnas de caracteres verdes cayendo", + "advancedEffectAudioBars": "Barras de audio (onda)", + "advancedEffectAudioBarsDescription": "Ecualizador animado por el audio", + "advancedEffectAudioPulse": "Pulso de texto por audio", + "advancedEffectAudioPulseDescription": "El texto brilla y crece según el volumen del audio", + "advancedEffectConfetti": "Explosión de confeti", + "advancedEffectConfettiDescription": "Lluvia de papeles de colores desde esquinas y centro", + "advancedEffectHearts": "Corazones (lluvia)", + "advancedEffectHeartsDescription": "Corazones Bézier que caen suavemente", + "advancedEffectWordSpacing": "Espaciado de palabras", + "advancedEffectWordSpacingDescription": "Aumenta espacio entre palabras mediante etiqueta \\fsp", + "advancedEffectFancyKaraokeAutoDetectActiveWord": "Auto-detectar palabra activa", + "advancedEffectFancyKaraokeGlow": "Brillo palabra activa", + "advancedEffectFancyKaraokeActiveColor": "Color activo", + "advancedEffectFancyKaraokeInactiveColor": "Color inactivo", + "advancedEffectFancyKaraokeInactiveOpacity": "Opacidad inactiva (0-255)", + "advancedEffectWordSpacingPixels": "Espaciado (píxeles)", + "advancedEffectSlowZoomOut": "Zoom out lento", + "advancedEffectSlowZoomOutDescription": "El texto encoge ligeramente durante el subtítulo", + "advancedEffectSlowZoomIn": "Zoom in lento", + "advancedEffectSlowZoomInDescription": "El texto crece ligeramente durante el subtítulo", + "advancedEffectFadeIn": "Transición - Fundido entrada", + "advancedEffectFadeInDescription": "Vídeo aparece desde negro línea a línea", + "advancedEffectFadeOut": "Transición - Fundido salida", + "advancedEffectFadeOutDescription": "Vídeo termina en negro línea a línea", + "advancedEffectTvClose": "Transición - Cierre TV", + "advancedEffectTvCloseDescription": "Barras negras que cierran hacia el centro", + "advancedEffectSlideInLeft": "Deslizar desde izquierda", + "advancedEffectSlideInLeftDescription": "Entra por la izquierda y sale por la izquierda", + "advancedEffectSlideInRight": "Deslizar desde derecha", + "advancedEffectSlideInRightDescription": "Entra por la derecha y sale por la derecha", + "advancedEffectFadeInOut": "Fundido entrada/salida", + "advancedEffectFadeInOutDescription": "Texto aparece y desaparece suavemente", + "overrideTagsHistory": "Historial etiquetas anulación" + }, + "about": { + "title": "Acerca de Subtite Edit", + "translatedBy": "Traducido por: {0}", + "licenseText": "Subtitle Edit es software libre bajo la licencia MIT.", + "descriptionTextBeta": "Subtitle Edit 5 beta es una versión de desarrollo de nuestra próxima gran versión.\nEstamos refinando activamente las herramientas y agradecemos tu ayuda en las pruebas.\nPor favor, comparte tus comentarios para ayudarnos a asegurar la mejor versión final.\n\n¡Gracias por ser parte de la comunidad de Subtitle Edit! :)", + "issueTrackingAndSourceCode": "Seguimiento de problemas y código fuente: ", + "gitHub": "Github", + "donate": "Donar: ", + "payPal": "PayPal", + "gitHubSponsor": "Github sponsor", + "or": " o " + } +} diff --git a/src/UI/UI.csproj b/src/UI/UI.csproj index 81d7767d845..7f8bdd6436e 100644 --- a/src/UI/UI.csproj +++ b/src/UI/UI.csproj @@ -75,6 +75,7 @@ + @@ -103,6 +104,7 @@ + From 6c991b09beb1665e41de05745c8bb7ffc781338b Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 18:41:06 +0200 Subject: [PATCH 31/74] Update nuget packages --- src/UI/UI.csproj | 4 +-- src/UI/packages.lock.json | 44 +++++++++++++-------------- src/seconv/Commands/ConvertCommand.cs | 2 +- src/seconv/Commands/FormatsCommand.cs | 2 +- src/seconv/Program.cs | 2 +- src/seconv/SeConv.csproj | 4 +-- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/UI/UI.csproj b/src/UI/UI.csproj index 7f8bdd6436e..34fe07f800a 100644 --- a/src/UI/UI.csproj +++ b/src/UI/UI.csproj @@ -39,14 +39,14 @@ - + - + diff --git a/src/UI/packages.lock.json b/src/UI/packages.lock.json index 88beac3761a..a1f5d10670a 100644 --- a/src/UI/packages.lock.json +++ b/src/UI/packages.lock.json @@ -112,11 +112,11 @@ }, "Google.Cloud.TextToSpeech.V1": { "type": "Direct", - "requested": "[3.17.0, )", - "resolved": "3.17.0", - "contentHash": "27vM1NEBmCqAwqagwS0aEHfRBrFy7z6Ef+BblwKMaxtUUY0amdUdeXLY/PU8RSIHtJoan1K6ZKIS6YYqzgp77g==", + "requested": "[3.18.0, )", + "resolved": "3.18.0", + "contentHash": "54/+RASsfltysLSgpNaSkdSa1uEvKD5Wc8hHFtlSRQtJAh41QNaSqY0LmZfFF+oEZiMBuhB2uq7bwieywttVvQ==", "dependencies": { - "Google.Api.Gax.Grpc": "[4.12.1, 5.0.0)", + "Google.Api.Gax.Grpc": "[4.13.1, 5.0.0)", "Google.LongRunning": "[3.5.0, 4.0.0)" } }, @@ -178,9 +178,9 @@ }, "SharpCompress": { "type": "Direct", - "requested": "[0.47.3, )", - "resolved": "0.47.3", - "contentHash": "KPODbBWz4zRs413KAHgy7N43bXCsAJyrCJMTajRan3Gl4epukJQKQxZeK1FVq/VvRZ4Y1MLz4Jc5UYSokwEojQ==" + "requested": "[0.47.4, )", + "resolved": "0.47.4", + "contentHash": "0s2rmGFLFQED6ERPUtJiT/KoDsrBzsc+qDoVX1XT4HfAiLZCtV6Z9mHfArBgHVpDErl4Pt9M5VTMVQLPUJw5Kg==" }, "Simplecto.Avalonia.RichTextBox": { "type": "Direct", @@ -345,8 +345,8 @@ }, "Google.Api.Gax": { "type": "Transitive", - "resolved": "4.12.1", - "contentHash": "G62dRNOv5DolfRviT6CCrL2a5nZ/CWWdRzhADkGnpCkYSOc3QnH5xxRvZiOKuHU8weJ/pAqAqrj7+T9IWdlu2Q==", + "resolved": "4.13.1", + "contentHash": "ujDpZk7O2VqAEIqcSlhH0FKzVpGZWly/qcNjHxpNUrL445Tei9PHnu4V1pwW2WDiMDvo3TpL1Bi4DeU525Afrg==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Newtonsoft.Json": "13.0.4" @@ -354,12 +354,12 @@ }, "Google.Api.Gax.Grpc": { "type": "Transitive", - "resolved": "4.12.1", - "contentHash": "W3LjuitOWxWyvbwqeHvpgp0LdshEiTnw/pneDAfAhQ02VgU2gVEzSXfGNPsvL8hDPBXjngR/fWNme8Kungwwkw==", + "resolved": "4.13.1", + "contentHash": "QgYF0bd8z6xWSVLGkGAMPB70seJSa9J02lFn8LT0Rb7PjSxZYpX+wU6LbVmghxDi6Wd64taulpX37pFq20J61g==", "dependencies": { "Google.Api.CommonProtos": "2.17.0", - "Google.Api.Gax": "4.12.1", - "Google.Apis.Auth": "1.72.0", + "Google.Api.Gax": "4.13.1", + "Google.Apis.Auth": "1.73.0", "Grpc.Auth": "[2.71.0, 3.0.0)", "Grpc.Core.Api": "[2.71.0, 3.0.0)", "Grpc.Net.Client": "[2.71.0, 3.0.0)", @@ -368,26 +368,26 @@ }, "Google.Apis": { "type": "Transitive", - "resolved": "1.72.0", - "contentHash": "QbSJ08W7QuqsfzDPOZDHl1aFzCYwMcfBoHqQRh7koglwDN5WacShCKYMpU/zR1Pf3h3sH6JTGEeM/txAxaJuEg==", + "resolved": "1.73.0", + "contentHash": "TnCjEyV2aCLQ6Zl40OCbEJULDuEkEWc6C/g81KYw5l1PqGo+G7pFZrV+YH8XgUL0JRUanz+IrUp8SsKF4dzkqg==", "dependencies": { - "Google.Apis.Core": "1.72.0" + "Google.Apis.Core": "1.73.0" } }, "Google.Apis.Auth": { "type": "Transitive", - "resolved": "1.72.0", - "contentHash": "RBoFwFKBHKUjuyJf2weEnqICQLaY0TdIrdFv2yC8bsiR2VFYxizOn3C/qN1FWCCb0Uh9GhW+zwAV1yUxPjiocw==", + "resolved": "1.73.0", + "contentHash": "wEu12uhnRv3zrPBSqv4E2vPH6lYLtc1RPAnU9MJRCMFlBVwZ7Lnq3NfbYXi6VG7EurkYInTaMpeBZkbM/HrAog==", "dependencies": { - "Google.Apis": "1.72.0", - "Google.Apis.Core": "1.72.0", + "Google.Apis": "1.73.0", + "Google.Apis.Core": "1.73.0", "System.Management": "7.0.2" } }, "Google.Apis.Core": { "type": "Transitive", - "resolved": "1.72.0", - "contentHash": "ZmYX1PU0vTKFT42c7gp4zaYcb/0TFAXrt9qw8yEz0wjvaug85+/WddlPTfT525Qei8iIUsF6t4bHYrsb2O7crg==", + "resolved": "1.73.0", + "contentHash": "vSc7CY4KCP7HE4QTElDx/ExnGLbg9kXb89MS6cdvI+0D4sxvTYb16vGtXmF2jSDMV3iDmykSXdIUPTz8TDS6gg==", "dependencies": { "Newtonsoft.Json": "13.0.4" } diff --git a/src/seconv/Commands/ConvertCommand.cs b/src/seconv/Commands/ConvertCommand.cs index 28f4026094e..d082d344c45 100644 --- a/src/seconv/Commands/ConvertCommand.cs +++ b/src/seconv/Commands/ConvertCommand.cs @@ -179,7 +179,7 @@ public sealed class Settings : CommandSettings public bool SplitLongLines { get; init; } } - public override async Task ExecuteAsync(CommandContext context, Settings settings, CancellationToken cancellationToken) + protected override async Task ExecuteAsync(CommandContext context, Settings settings, CancellationToken cancellationToken) { try { diff --git a/src/seconv/Commands/FormatsCommand.cs b/src/seconv/Commands/FormatsCommand.cs index 1b42fbac232..5f5588b35d4 100644 --- a/src/seconv/Commands/FormatsCommand.cs +++ b/src/seconv/Commands/FormatsCommand.cs @@ -12,7 +12,7 @@ public sealed class Settings : CommandSettings { } - public override int Execute(CommandContext context, Settings settings, CancellationToken cancellationToken) + protected override int Execute(CommandContext context, Settings settings, CancellationToken cancellationToken) { AnsiConsole.MarkupLine("[bold cyan]Available Subtitle Formats[/]"); AnsiConsole.WriteLine(); diff --git a/src/seconv/Program.cs b/src/seconv/Program.cs index 3dd96bc2cc1..5cc575ebfb3 100644 --- a/src/seconv/Program.cs +++ b/src/seconv/Program.cs @@ -25,7 +25,7 @@ static int Main(string[] args) args[0].Equals("--formats", StringComparison.OrdinalIgnoreCase))) { var formatsCommand = new FormatsCommand(); - return formatsCommand.Execute(null!, new FormatsCommand.Settings(), CancellationToken.None); + return ((ICommand)formatsCommand).ExecuteAsync(null!, new FormatsCommand.Settings(), CancellationToken.None).GetAwaiter().GetResult(); } // Set up Spectre.Console CLI with default command diff --git a/src/seconv/SeConv.csproj b/src/seconv/SeConv.csproj index 5a7dedd106c..8c0e6dc1438 100644 --- a/src/seconv/SeConv.csproj +++ b/src/seconv/SeConv.csproj @@ -9,8 +9,8 @@ - - + + From e6f259879bf4b5849e9518cd57c4651cd2c6f8c1 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 19:02:06 +0200 Subject: [PATCH 32/74] Add Norweigan translation - thx MintKing12 :) Fix #10556 --- src/UI/Assets/Languages/Norwegian.json | 2631 ++++++++++++++++++++++++ 1 file changed, 2631 insertions(+) create mode 100644 src/UI/Assets/Languages/Norwegian.json diff --git a/src/UI/Assets/Languages/Norwegian.json b/src/UI/Assets/Languages/Norwegian.json new file mode 100644 index 00000000000..4d4f2e4f373 --- /dev/null +++ b/src/UI/Assets/Languages/Norwegian.json @@ -0,0 +1,2631 @@ +{ + "Title": "Subtitle Edit", + "TranslatedBy": "Gemini ", + "CultureName": "nb-NO", + "General": { + "Abort": "Avbryt", + "Actor": "Skuespiller", + "Actors": "Skuespillere", + "Add": "Legg til", + "AddDotDotDot": "Legg til...", + "AddToNamesListCaseSensitive": "Legg til i navneliste (skiller mellom store/små bokstaver)", + "AddToUserDictionary": "Legg til i brukerordbok", + "AddVideoFiles": "Legg til videofiler...", + "AdjustAlpha": "Juster alfa (gjennomsiktighet)", + "AdjustDisplayDuration": "Juster visningsvarighet", + "Adjustment": "Justering", + "Advanced": "Avansert", + "AdvancedSettings": "Avanserte innstillinger", + "After": "Etter", + "Alignment": "Justering", + "AlignmentDotDotDot": "Justering...", + "AlignmentX": "Sett justering \"{0}\" for valgte linjer", + "All": "Alle", + "AllFiles": "Alle filer", + "AlphaAdjustment": "Alfajustering", + "AphaThreshold": "Alfaterskel", + "ApiKey": "API-nøkkel", + "ApiSecret": "Hemmelighet", + "Appearance": "Utseende", + "Append": "Legg til på slutten", + "Apply": "Bruk", + "ApplyTo": "Bruk på", + "Ascending": "Stigende", + "AttachDotDotDot": "Legg ved...", + "AudioFiles": "Lydfiler", + "AudioVisualizer": "Lydvisualiserer", + "Auto": "Auto", + "AutoBreak": "Automatisk linjedeling", + "AutoContinue": "Auto-fortsett", + "AutoTranslate": "Auto-oversett", + "Autodetect": "Oppdag automatisk", + "Background": "Bakgrunn", + "BackgroundColor": "Bakgrunnsfarge", + "Backward": "Bakover", + "BatchMode": "Satsvis modus (batch)", + "BdnXml": "BDN/xml", + "Before": "Før", + "BeforeX": "Før \"{0}\"", + "Beginning": "Begynnelse", + "BluRaySup": "Blu-ray (sup)", + "Bold": "Fet", + "BookmarkAdd": "Legg til bokmerke", + "BookmarkAddForSelectedLinesX": "Legg til bokmerke for {0} valgte linjer", + "BookmarkClearQuestion": "Tøm alle bokmerker?", + "BookmarkDeleteSelectedQuestion": "Slett valgt bokmerke?", + "BookmarkDotDotDot": "Bokmerke...", + "BookmarkEdit": "Rediger bokmerke", + "BookmarkEditForSelectedLinesX": "Rediger bokmerke for {0} valgte linjer", + "BookmarksList": "Vis bokmerker", + "BorderColor": "Kantfarge", + "BorderStyle": "Kantstil", + "BottomCenter": "Bunn-Senter", + "BottomLeft": "Bunn-Venstre", + "BottomRight": "Bunn-Høyre", + "Box": "Boks", + "BoxColor": "Boksfarge", + "BoxCornerRadius": "Boks hjørneradius", + "BoxPerLine": "Boks per linje", + "BridgeGaps": "Tett hull", + "Cancel": "A_vbryt", + "Cancelled": "Avbrutt", + "CaseInsensitive": "Skiller ikke mellom store/små bokstaver", + "CaseSensitive": "Skiller mellom store/små bokstaver", + "Category": "Kategori", + "Center": "Senter", + "CenterHorizontally": "Midtstill horisontalt", + "CenterVertically": "Midtstill vertikalt", + "Change": "Endre", + "ChangeAll": "Endre alle", + "ChangeCasing": "Endre bokstavstørrelse", + "ChangeFormatting": "Endre formatering", + "ChangeFrameRate": "Endre bildefrekvens", + "ChangeLanguageFilter": "Endre språkfilter...", + "ChangeOnce": "Endre én gang", + "ChangeSpeed": "Endre hastighet", + "Character": "Tegn", + "Characters": "Tegn", + "CharsPerSec": "Tegn/sek", + "ChooseColorDotDotDot": "Velg farge...", + "ChooseImageFiles": "Velg bildefiler", + "Class": "Klasse", + "Classic": "Klassisk", + "Clear": "Tøm", + "Close": "Lukk", + "Codec": "Kodek", + "Collapse": "Skjul", + "Color": "Farge", + "ColorDotDotDot": "Farge...", + "Column": "Kolonne", + "ConsoleLog": "Konsollogg", + "ContentAlignment": "Innholdsjustering", + "ConversionCancelledByUser": "Konvertering avbrutt av bruker", + "Convert": "Konverter", + "Converted": "Konvertert", + "ConvertingDotDotDot": "Konverterer...", + "ConvertingXofYDotDoDot": "Konverterer {0:#,###,##0}/{1:#,###,##0}...", + "Copy": "Kopier", + "CopyImageToClipboard": "Kopier bilde til utklippstavle", + "CopyTextToClipboard": "Kopier tekst til utklippstavle", + "CouldNotSaveFileXErrorY": "Kunne ikke lagre fil \"{0}\". Feil: {1}", + "Count": "Antall", + "Cps": "Tegn/sek", + "CurrentSubtitle": "Nåværende undertekst", + "CurrentVideoPosition": "Nåværende videoposisjon", + "Cut": "Klipp ut", + "Dark": "Mørk", + "DateAndTime": "Dato og tid", + "Default": "Standard", + "Delete": "Slett", + "DeleteAtPosition": "Slett undertekst ved videoposisjon", + "DeleteCurrentLine": "Slett gjeldende linje", + "DeleteFirstLines": "Slett første linjer", + "DeleteLastLines": "Slett siste linjer", + "DeleteLineXPrompt": "Slett linjenummer {0}?", + "DeleteLines": "Slett linjer", + "DeleteLinesContainingText": "Slett linjer som inneholder tekst", + "DeleteXLinesPrompt": "Slett {0} linjer?", + "Description": "Beskrivelse", + "Dictionary": "Ordbok", + "DiskSpace": "Diskplass", + "DoNoChange": "Ikke endre", + "Done": "Ferdig", + "DoubleWords": "Doble ord", + "DoubleLines": "Doble linjer", + "Download": "Last ned", + "DownloadX": "Last ned {0}", + "DownloadingX": "Laster ned {0}", + "DownloadingXPercent": "Laster ned {0}%", + "Duplicate": "Dupliser", + "Duration": "Varighet", + "DurationMinutes": "Varighet i minutter", + "Edit": "Rediger", + "EditDotDotDot": "Rediger...", + "Editing": "Redigering", + "Effect": "Effekt", + "Enabled": "Aktivert", + "Encoding": "Koding", + "EndTime": "Sluttid", + "Engine": "Motor", + "EnterProfileName": "Skriv inn profilnavn", + "Error": "Feil", + "ErrorX": "Feil; {0}", + "Example": "Eksempel", + "ExampleX": "Eksempel: {0}", + "Expand": "Utvid", + "Export": "Eksporter", + "ExportDotDotDot": "Eksporter...", + "ExportToX": "Eksporter til {0}", + "ExtendAfter": "Utvid/forkort til linjen etter", + "ExtendBefore": "Utvid/forkort til linjen før", + "ExtendSelectedLinesToNextShotChangeOrNextSubtitle": "Utvid valgte linjer til neste sceneskifte (eller neste undertekst)", + "ExtendSelectedToNext": "Utvid valgte til neste", + "ExtendSelectedToPrevious": "Utvid valgte til forrige", + "ExtractingAudioClips": "Trekker ut lydklipp...", + "Fade": "Ton", + "FetchFirstWordFromNextSubtitle": "Hent første ord fra neste undertekst", + "FileAlreadyExists": "Filen finnes allerede", + "FileExtension": "Filtype", + "FileName": "Filnavn", + "FileNameX": "Filnavn: {0}", + "FileNameXAndSize": "Filnavn: {0} ({1})", + "FileSaved": "Fil lagret", + "FileSavedToX": "Fil lagret i {0}", + "FileXAlreadyExists": "Filen \"{0}\" finnes allerede.", + "FileXOfY": "Fil {0} av {1}", + "Filter": "Filter", + "FilterByLayer": "Filtrer etter lag", + "Find": "Finn", + "FindNext": "Finn neste", + "FindTextX": "Finn tekst - {0}", + "FiveHundredMilliseconds": "500 millisekunder", + "FiveSeconds": "Fem sekunder", + "Fix": "Fiks", + "FixCommonErrors": "Fiks vanlige feil", + "FixRightToLeft": "Fiks høyre-til-venstre", + "FixRightToLeftViaUnicodeTags": "Fiks høyre-til-venstre via Unicode-koder", + "FixedValue": "Fast verdi", + "FocusSelectedLine": "Fokus på valgt linje (rull inn i visning i rutenettet)", + "Font": "Skrift", + "FontColor": "Skriftfarge", + "FontHeight": "Skrifthøyde", + "FontName": "Skriftnavn", + "FontNameDotDotDot": "Skriftnavn...", + "FontSize": "Skriftstørrelse", + "Fonts": "Skrifter", + "Footer": "Bunntekst", + "Forced": "Tvunget", + "Foreground": "Forgarunn", + "Format": "Format", + "Forward": "Fremover", + "FoundNoMatches": "Fant ingen treff", + "FoundOneMatch": "Fant ett treff", + "FoundXInLineYZ": "Fant \"{0}\" i linje {1}, posisjon {2}", + "FoundXMatches": "Fant {0} treff", + "FrameRate": "Bildefrekvens", + "FrameRateX": "Bildefrekvens: {0:0.0###}", + "Frames": "Bilder (frames)", + "From": "Fra", + "FromCurrentVideoPosition": "fra nåværende videoposisjon", + "Gap": "Mellomrom", + "General": "Generelt", + "GeneralText": "Generell tekst", + "Generate": "Generer", + "GenerateImportShotChanges": "Generer/importer sceneskifter", + "Generating": "Genererer...", + "GeneratingImageXofY": "Genererer bilde {0:#,##0} av {1:#,##0}...", + "GeneratingWavFile": "Genererer wav-fil...", + "GetAudioClips": "Hent lydklipp", + "GoTo": "Gå til", + "GoToLineNumber": "Gå til linjenummer", + "GoToNextShotChange": "Gå til neste sceneskifte", + "GoToPreviousShotChange": "Gå til forrige sceneskifte", + "GoogleIt": "Søk på Google ", + "Group": "Gruppe", + "Header": "Topptekst", + "Height": "Høyde", + "Help": "Hjelp", + "Hex": "Hex", + "Hide": "Skjul", + "HidePreview": "Skjul forhåndsvisning", + "History": "Historikk", + "Horizontal": "Horisontal", + "HourMinutesSecondsDecimalSeparatorMilliseconds": "Time:min:sek{0}ms", + "HourMinutesSecondsFrames": "Time:min:sek:bilder", + "Ip": "IP", + "Id": "ID", + "Image": "Bilde", + "ImageSaved": "Bilde lagret", + "ImagedBasedSubtitles": "Bildebaserte undertekster", + "Images": "Bilder", + "ImagesWithTimeCode": "Bilder med tidskode", + "Import": "Importer", + "ImportDotDotDot": "Importer...", + "Include": "Inkluder", + "Information": "Informasjon", + "InsertAfter": "Sett inn etter", + "InsertAtPositionAndFocusTextBox": "Sett inn undertekst ved videoposisjon og fokuser på tekstboks", + "InsertAtPositionNoFocusTextBox": "Sett inn undertekst ved videoposisjon (uten fokus på tekstboks)", + "InsertBefore": "Sett inn før", + "InsertLine": "Sett inn linje", + "InsertNewSelection": "Sett inn nytt utvalg", + "InsertSubtitleAfterCurrentLine": "Sett inn undertekst etter gjeldende linje...", + "InsertSubtitleFileAtVideoPositionDotDotDot": "Sett inn undertekstfil ved videoposisjon...", + "InspectAdditions": "Inspiser tillegg...", + "InvertSelection": "Inverter utvalg", + "IsDefault": "Er standard", + "Italic": "Kursiv", + "KeepExistingTimeCodes": "Behold eksisterende tidskoder (ikke legg til videoforskyvning)", + "KeyFile": "Nøkkelfil", + "Language": "Språk", + "LanguagePostFix": "Språk-suffiks (mkv/mp4)", + "Layer": "Lag", + "LayerFilterOn": "Lagfilter på", + "Left": "Venstre", + "Light": "Lys", + "LineHeigth": "Linjehøyde", + "LineNumber": "Linje#", + "LineXColumnY": "Linje {0}, kolonne {1}", + "Lines": "Linjer", + "LinesAddedX": "Linjer lagt til: {0}", + "LinesChangedX": "Linjer endret: {0}", + "LinesDeletedX": "Linjer slettet: {0}", + "ListErrors": "Vis feil", + "LoadDefaults": "Last standardinnstillinger", + "LockTimeCodes": "Lås tidskoder", + "Logo": "Logo", + "Margin": "Margin", + "Match": "Treff", + "MaxCharactersPerSecond": "Maks tegn per sekund", + "MediaInformation": "Medieinformasjon", + "MergeAfter": "Slå sammen med linjen etter", + "MergeBefore": "Slå sammen med linjen før", + "MergeLines": "Slå sammen linjer", + "MergeLinesWithSameText": "Slå sammen linjer med samme tekst", + "MergeLinesWithSameTimeCodes": "Slå sammen linjer med samme tidskoder", + "MergeSelected": "Slå sammen valgte", + "MergeSelectedAsDialog": "Slå sammen valgte som dialog", + "MergeSelectedLines": "Slå sammen valgte linjer", + "MergeSelectedLinesDialog": "Slå sammen valgte linjer som dialog", + "MergeWithLineAfterAndAutoBreak": "Slå sammen med linjen etter og automatisk linjedeling", + "MergeWithLineAfterKeepBreaks": "Slå sammen med linjen etter (behold linjeskift)", + "MergeWithLineBeforeAndAutoBreak": "Slå sammen med linjen før og automatisk linjedeling", + "MergeWithLineBeforeKeepBreaks": "Slå sammen med linjen før (behold linjeskift)", + "MiddleCenter": "Midt-Senter", + "MiddleLeft": "Midt-Venstre", + "MiddleRight": "Midt-Høyre", + "Milliseconds": "Millisekunder", + "Model": "Modell", + "Models": "Modeller", + "More": "Mer", + "MoreInfo": "Mer info", + "MoveAllShotChangeOneFrameBack": "Flytt alle sceneskifter ett bilde bakover", + "MoveAllShotChangeOneFrameForward": "Flytt alle sceneskifter ett bilde fremover", + "MoveDown": "Flytt ned", + "MoveUp": "Flytt opp", + "MultipleReplace": "Søk og erstatt flere", + "Name": "Navn", + "Negative": "Negativ", + "New": "Ny", + "NewDotDotDot": "Ny...", + "NewProfile": "Ny profil", + "NewSubtitleStartKeyDownSetEndKeyUp": "Sett inn undertekst: Start ved tast ned, sett slutt ved tast opp", + "SetSubtitleStartAtVideoPositionSetEndAtKeyUpAndGoToNext": "Sett start ved videoposisjon, sett slutt ved tast opp, og gå til neste", + "No": "Nei", + "NoFilesToConvert": "Ingen filer å konvertere", + "NoLanguageCode": "Ingen språkkode", + "NoSubtitleLoaded": "Ingen undertekst lastet", + "NoSubtitlesFound": "Ingen undertekster funnet!", + "NoSymbolLines": "#Linjer", + "NoVideoLoaded": "Ingen video lastet", + "None": "Ingen", + "NormalCasing": "Normal bokstavstørrelse", + "NotAvailable": "Ikke tilgjengelig", + "NotInstalled": "Ikke installert", + "Number": "Nummer", + "NumberSymbol": "#", + "OcrDotDotDot": "OCR...", + "OcrPercentX": "OCR: {0}%", + "Offset": "Forskyvning", + "OffsetTimeCodes": "Forskyv tidskoder", + "OffsetX": "Forskyvning X", + "OffsetY": "Forskyvning Y", + "Ok": "_OK", + "OneFile": "Én fil", + "OneHundredMilliseconds": "100 millisekunder", + "OneSecond": "Ett sekund", + "OneSecondBack": "Ett sekund bakover", + "OneSecondForward": "Ett sekund fremover", + "OnlineVideoFeatureNotAvailable": "Funksjonen er ikke tilgjengelig for online video", + "OpenContainingFolder": "Åpne inneholdende mappe", + "OpenDictionaryFolder": "Åpne ordboksmappe", + "OpenFile": "Åpne fil", + "OpenImageBasedSubtitle": "Åpne bildebasert undertekst", + "OpenImageFile": "Åpne bildefil", + "OpenOriginalSubtitleFile": "Åpne original undertekstfil...", + "OpenOriginalSubtitleFileTitle": "Åpne original undertekstfil", + "OpenOutputFolder": "Åpne utdatamappe", + "OpenSubtitle": "Åpne undertekst...", + "OpenSubtitleFileTitle": "Åpne undertekstfil", + "OpenSubtitles": "Åpne undertekster...", + "OpenVideoFile": "Åpne videofil...", + "OpenVideoFileTitle": "Åpne videofil", + "OptimalCharactersPerSecond": "Optimalt antall tegn per sekund", + "Options": "Alternativer", + "OriginalText": "Original tekst", + "Outline": "Omriss", + "OutlineColor": "Omrissfarge", + "OutlineWidth": "Omrissbredde", + "OutputFolder": "Utdatamappe", + "OutputProperties": "Utdataegenskaper", + "Overlap": "Overlapp", + "OverlapNextX": "Overlapp neste ({0:#;##0.###})", + "OverlapPreviousLineX": "Overlapp forrige linje ({0:#;##0.###})", + "OverlapStartAndEnd": "Overlapp start og slutt", + "OverlapX": "Overlapp ({0:#;##0.###})", + "OverwriteExistingFiles": "Overskriv eksisterende filer", + "OverwriteFilesInFolderX": "Overskriv filer i mappe: \"{0}\"", + "OverwriteQuestion": "Overskrive?", + "Padding": "Utfylling (padding)", + "Parameters": "Parametere", + "ParsingXDotDotDot": "Analyserer {0}...", + "Paste": "Lim inn", + "PasteNewSelection": "Lim inn tekst fra utklippstavlen til nytt utvalg", + "Pause": "Pause", + "Percent": "Prosent", + "PickLayer": "Velg lag", + "PickOllamaModel": "Velg Ollama-modell", + "PickOutputFolder": "Velg utdatamappe", + "PickResolutionFromCurrentVideo": "Hent oppløsning fra gjeldende video", + "PickResolutionFromVideoDotDotDot": "Hent oppløsning fra video...", + "PickSubtitleFile": "Velg undertekstfil...", + "PickVideoFile": "Velg videofil...", + "PickVideoPosition": "Velg videoposisjon", + "Play": "Spill av", + "PlayFromStartOfVideo": "Spill fra starten av videoen", + "PlayNext": "Spill neste", + "PlaySelectedLines": "Spill valgte linjer", + "PlaySelectedLinesWithLoop": "Spill valgte linjer med loop", + "PleaseEnterAValidValueForX": "Vennligst skriv inn en gyldig verdi for \"{0}\"", + "PleaseWait": "Vennligst vent...", + "Position": "Posisjon", + "PositionX": "Posisjon: {0}", + "PostProcessing": "Etterbehandling", + "PoweredBy": "Drevet av", + "Prefix": "Prefiks", + "Preview": "Forhåndsvisning", + "Profile": "Profil", + "ProfileName": "Profilnavn", + "Profiles": "Profiler", + "Property": "Egenskap", + "Question": "Spørsmål", + "ReDownloadX": "Last ned {0} på nytt", + "Reason": "Årsak", + "RecentFiles": "Nylige filer", + "Redo": "Gjør om", + "Refresh": "Oppdater", + "Region": "Region", + "RegularExpression": "Regulært uttrykk (Regex)", + "RegularExpressionIsNotValid": "Regulært uttrykk er ikke gyldig!", + "RelativeToCurrentVideoPosition": "Relativt til gjeldende videoposisjon", + "Remove": "Fjern", + "RemoveAlignment": "Fjern justering", + "RemoveAllFormatting": "Fjern all formatering", + "RemoveBlankLines": "Fjern tomme linjer", + "RemoveBold": "Fjern fet skrift", + "RemoveColor": "Fjern farge", + "RemoveFilter": "Fjern filter", + "RemoveFontName": "Fjern skriftnavn", + "RemoveFormatting": "Fjern formatering", + "RemoveItalic": "Fjern kursiv", + "RemoveRightToLeftUnicodeTags": "Fjern høyre-til-venstre Unicode-koder", + "RemoveSelectedFile": "Fjern valgt fil?", + "RemoveStyling": "Fjern stil", + "RemoveTextForHearingImpaired": "Fjern tekst for hørselshemmede", + "RemoveUnderline": "Fjern understreking", + "Rename": "Gi nytt navn", + "Replace": "Erstatt", + "ReplaceWith": "Erstatt med", + "RequiresRestart": "Krever omstart", + "Reset": "Tilbakestill", + "Resolution": "Oppløsning", + "ResolutionX": "Oppløsning: {0}", + "ReverseRightToLeftStartEnd": "Reverser høyre-til-venstre start/slutt", + "Right": "Høyre", + "RightToLeft": "Høyre til venstre", + "Rules": "Regler", + "SaveChangesMessage": "Vil du lagre endringer i den gjeldende undertekstfilen?", + "SaveChangesTitle": "Lagre endringer?", + "SaveChangesToX": "Vil du lagre endringer i \"{0}\"?", + "SaveChangesToXOriginal": "Vil du lagre endringer i den originale undertekstfilen \"{0}\"?", + "SaveDotDotDot": "Lagre...", + "SaveFileAsTitle": "Lagre fil som", + "SaveImageAs": "Lagre bilde som", + "SaveImageAsDotDotDot": "Lagre bilde som...", + "SaveOriginalAsTitle": "Lagre original som", + "SaveTranslationAsTitle": "Lagre oversettelse som", + "SaveVideoAsVideoTitle": "Lagre video som", + "SavedChangesToX": "Lagret \"{0}\"", + "SavedChangesToXAndY": "Lagret \"{0}\" og \"{1}\"", + "SavingDotDotDot": "Lagrer...", + "Script": "Skript", + "Search": "Søk", + "SearchDirection": "Søkeretning", + "SearchFontNames": "Søk i skriftnavn...", + "SearchSubtitleFormats": "Søk i undertekstformater", + "Seconds": "Sekunder", + "SelectAll": "Velg alle", + "SelectFilesToConvert": "Velg filer som skal konverteres", + "SelectNone": "Velg ingen", + "SelectSaveFolder": "Velg en mappe å lagre i", + "SelectSubtitle": "Velg undertekst", + "SelectedAFolderToSaveTo": "Valgt en mappe å lagre i", + "SelectedLines": "Valgte linjer", + "SelectedlinesX": "Valgte linjer: {0}", + "Sensitivity": "Følsomhet", + "Separator": "Skilletegn", + "SessionKey": "Øktnøkkel", + "SessionKeyGenerate": "Generer ny nøkkel", + "SetEnd": "Sett slutt", + "SetEndAndGoToNext": "Sett slutt og gå til neste", + "SetEndAndOffsetTheRest": "Sett slutt og forskyv resten", + "SetFontDotDotDot": "Velg skrift...", + "SetStart": "Sett start", + "SetStartAndOffsetTheRest": "Sett start og forskyv resten", + "SetVideoOffset": "Sett videoforskyvning", + "Settings": "Innstillinger", + "Shadow": "Skygge", + "ShadowColor": "Skyggefarge", + "ShadowWidth": "Skyggebredde", + "Shortcut": "Hurtigtast", + "ShortcutX": "Hurtigtast: {0}", + "Shortcuts": "Hurtigtaster", + "Show": "Vis", + "ShowActorColumn": "Vis \"Skuespiller\"-kolonne", + "ShowCpsColumn": "Vis \"Tegn/sek\"-kolonne", + "ShowDurationColumn": "Vis \"Varighet\"-kolonne", + "ShowGapColumn": "Vis \"Mellomrom\"-kolonne", + "ShowStartColumn": "Vis \"Start\"-kolonne", + "ShowHideColumn": "Vis \"Skjul\"-kolonne", + "ShowHistory": "Vis historikk", + "ShowLayerColumn": "Vis \"Lag\"-kolonne", + "ShowPreview": "Vis forhåndsvisning", + "ShowShotChangesList": "Vis liste over sceneskifter", + "ShowStyleColumn": "Vis \"Stil\"-kolonne", + "ShowTimeCodes": "Vis tidskoder", + "ShowWpmColumn": "Vis \"Ord/min\"-kolonne", + "ShowPixelWidthColumn": "Vis \"Pikselbredde\"-kolonne", + "Shrink": "Krymp", + "SingleBox": "Enkeltboks", + "SingleLineLengths": "Enkeltlinjelengde:", + "SingleMode": "Enkeltmodus", + "Size": "Størrelse", + "SizeX": "Størrelse: {0}", + "Skip": "Hopp over", + "SkipAll": "Hopp over alle", + "SkipOnce": "Hopp over én gang", + "Smart": "Smart", + "SnapSelectedLinesToNearestShotChange": "Fest valgte linjers start/slutt til nærmeste sceneskifte", + "SolidColor": "Helfarge", + "SourceViewX": "Kildevisning - {0}", + "Spacing": "Avstand", + "SpeechToTextSelectedLines": "Tale til tekst (valgte) (se Alternativer - Innstillinger)", + "SpeechToTextSelectedLinesPromptAlways": "Tale til tekst for valgte linjer (spør alltid om motor/språk)", + "SpeechToTextSelectedLinesPromptFirstTime": "Tale til tekst for valgte linjer (spør om motor/språk kun første gang)", + "Speed": "Hastighet", + "SplitAtTextBoxCursorPosition": "Del ved skrivemarkørposisjon", + "SplitLine": "Del linje", + "SplitLineAtTextBoxCursorPosition": "Del linje ved markørposisjon", + "SplitLineAtVideoAndTextBoxPosition": "Del linje ved video- og tekstboksposisjon", + "SplitLineAtVideoPosition": "Del linje ved videoposisjon", + "StartFrom": "Start fra", + "StartTime": "Starttid", + "StartingDotDotDot": "Starter...", + "Status": "Status", + "Stereo": "Stereo", + "Stop": "Stopp", + "Strikeout": "Gjennomstrek", + "Style": "Stil", + "StyleExaggeration": "Stiloverdrivelse", + "StyleLanguage": "Stil / Språk", + "Styles": "Stiler", + "SubtitleFile": "Undertekstfil", + "SubtitleFileName": "Undertekstfilnavn", + "SubtitleFileSaved": "Undertekstfil lagret", + "SubtitleFileSavedToX": "Undertekstfil lagret i {0}", + "SubtitleFiles": "Undertekstfiler", + "SubtitleFormats": "Undertekstformater", + "SubtitleLoadedX": "Undertekst lastet: {0}", + "SubtitleXOfY": "Undertekst {0} av {1}", + "Suffix": "Suffiks", + "Suggestions": "Forslag", + "Sync": "Synkronisering", + "SyntaxColoring": "Syntaksfarging", + "System": "System", + "TargetEncoding": "Målkoding", + "TargetFormat": "Målformat", + "TenHours": "10 timer", + "TenMilliseconds": "10 millisekunder", + "Text": "Tekst", + "TextColor": "Tekstfarge", + "TextFiles": "Tekstfiler", + "TextOrImage": "Tekst/bilde", + "ThreeLetterLanguageCode": "Trebokstavs språkkode", + "Time": "Tid", + "TimeCodes": "Tidskoder", + "Timing": "Tidsberegning", + "Title": "Tittel", + "To": "Til", + "ToggleCasing": "Veksle bokstavstørrelse", + "ToggleDirection": "Veksle retning", + "ToggleForced": "Veksle tvunget", + "ToggleShotChangesAtVideoPosition": "Veksle sceneskifter ved videoposisjon", + "Toolbar": "Verktøylinje", + "Tools": "Verktøy", + "TopCenter": "Topp-Senter", + "TopLeft": "Topp-Venstre", + "TopRight": "Topp-Høyre", + "TotalAdjustmentX": "Total justering: {0}", + "TotalFramesX": "Totalt antall bilder: {0:#;##0.##}", + "TotalLengthX": "Total lengde: {0}", + "TotalLengthXSplitLine": "Total lengde: {0} (delt linje!)", + "Translate": "Oversett", + "TranslateRow": "Oversett rad", + "Translation": "Oversettelse", + "TwoLetterLanguageCode": "Tobokstavs språkkode", + "Type": "Type", + "Unbreak": "Fjern linjedeling", + "UnbreakLines": "Fjern linjedeling på linjer", + "Underline": "Understrek", + "Undo": "Angre", + "Unknown": "Ukjent", + "UnknownSubtitleFormat": "Ukjent undertekstformat", + "Unpacking7ZipArchiveDotDotDot": "Pakker ut 7-zip-arkiv...", + "UnpackingX": "Pakker ut {0}", + "Untitled": "Uten tittel", + "Update": "Oppdater", + "UpdateAndClose": "Oppdater og lukk", + "UpdateDetails": "Oppdateringsdetaljer", + "UpdatedBy": "Oppdatert av", + "Url": "URL", + "Usages": "Bruk", + "Use": "Bruk", + "UseAlways": "Bruk alltid", + "UseLargerFontForThisWindow": "Bruk større skrift i dette vinduet", + "UseOnce": "Bruk én gang", + "UseOutputFolder": "Bruk utdatamappe", + "UseSourceFolder": "Bruk kildemappe", + "UseSourceResolution": "Bruk kildeoppløsning", + "UserName": "Brukernavn", + "UserNameAlreadyInUse": "Brukernavn allerede i bruk", + "Vertical": "Vertikal", + "Video100MsBack": "Video, 100 millisekunder bakover", + "Video100MsForward": "Video, 100 millisekunder fremover", + "Video500MsBack": "Video, 500 millisekunder bakover", + "Video500MsForward": "Video, 500 millisekunder fremover", + "VideoCustom1BackX": "Video, egendefinerte millisekunder ({0:#,###,##0}) bakover, 1", + "VideoCustom1ForwardX": "Video, egendefinerte millisekunder ({0:#,###,##0}) fremover, 1", + "VideoCustom2BackX": "Video, egendefinerte millisekunder ({0:#,###,##0}) bakover, 2", + "VideoCustom2ForwardX": "Video, egendefinerte millisekunder ({0:#,###,##0}) fremover, 2", + "VideoEncodingX": "Videokoding: {0}", + "VideoExtension": "Videofiltype", + "VideoFile": "Videofil", + "VideoFileGeneratedX": "Videofil generert: \"{0}\"", + "VideoFiles": "Videofiler", + "VideoInformation": "Videoinfo", + "VideoOffset": "Videoforskyvning", + "VideoOneFrameBack": "Video, ett bilde bakover", + "VideoOneFrameForward": "Video, ett bilde fremover", + "VideoOneSecondBack": "Video, ett sekund bakover", + "VideoOneSecondForward": "Video, ett sekund fremover", + "VideoPlayer": "Videospiller", + "VideoPosition": "Videoposisjon", + "VideoResolution": "Videooppløsning", + "ViewX": "Vis {0}", + "Visible": "Synlig", + "Voice": "Stemme", + "Warning": "Advarsel", + "WaveformCenterOnVideoPosition": "Sentrer bølgeform på videoposisjon", + "WaveformPasteFromClipboard": "Lim inn fra utklippstavle", + "WaveformSpectrogram": "Bølgeform/spektrogram", + "WebServiceUrl": "Nettadresse for webtjeneste", + "Width": "Bredde", + "WindowPositionAndSize": "Vindusposisjon og -størrelse", + "WordsPerMin": "Ord/min", + "PixelWidth": "Pikselbredde", + "Wpm": "Ord/min", + "XFiles": "{0:#,###,##0} filer", + "XFilesConvertedInY": "{0:#,###,##0} filer konvertert på {1}", + "XNotFound": "\"{0}\" ikke funnet", + "XRequiresAnApiKey": "{0} krever en API-nøkkel", + "XSeconds": "{0:0.0##} sekunder", + "XSubtitles": "{0:#,###,##0} undertekster", + "Yes": "Ja", + "CopyToClipboard": "Kopier til utklippstavle", + "PlayCurrent": "Spill gjeldende", + "LeftMargin": "Venstre marg", + "RightMargin": "Høyre marg", + "Installed": "Installert", + "AdvancedDotDotDot": "Avansert...", + "ChooseAlignment": "Velg justering", + "MaxWidthPixels": "Maks bredde (piksler)", + "SampleText": "Eksempeltekst", + "BoxWidthPixels": "Boksbredde (piksler)", + "FadeInOut": "Fade inn/ut", + "Alpha": "Alfa", + "PickResolution": "Velg oppløsning", + "ManualSync": "Manuell synkronisering" + }, + "Main": { + "AudioTrackIsNowX": "Lydspor er nå \"{0}\"", + "AudioTrackX": "Lydspor {0}", + "AutoBreakHint": "Del opp valgte linjer automatisk", + "CharactersPerSecond": "Tegn/sekund: {0}", + "ChooseColumn": "Velg kolonne", + "ColumnPaste": "Lim inn i kolonne", + "CreatedEmptyTranslation": "Opprettet tom oversettelse fra gjeldende undertekst", + "DeleteText": "Slett tekst", + "DeleteTextAndShiftCellsUp": "Slett tekst og flytt celler opp", + "EndTimeMustBeAfterStartTime": "Sluttid må være etter starttid.", + "ErrorLoad7Zip": "Denne filen ser ut til å være en komprimert 7-Zip-fil.\n\nSubtitle Edit kan ikke åpne komprimerte filer.", + "ErrorLoadBinaryZeroes": "Beklager, denne filen inneholder bare binære nuller!\n\nHvis du har redigert denne filen med Subtitle Edit, kan du kanskje finne en sikkerhetskopi via menypunktet Fil -> Gjenopprett auto-sikkerhetskopi...", + "ErrorLoadGZip": "Denne filen ser ut til å være en komprimert GZip-fil.\n\nSubtitle Edit kan ikke åpne komprimerte filer.", + "ErrorLoadJpg": "Denne filen ser ut til å være en JPG-bildefil.\n\nSubtitle Edit kan ikke åpne bildefiler.", + "ErrorLoadPng": "Denne filen ser ut til å være en PNG-bildefil.\n\nSubtitle Edit kan ikke åpne bildefiler.", + "ErrorLoadRar": "Denne filen ser ut til å være en komprimert 7-Zip-fil.\n\nSubtitle Edit kan ikke åpne komprimerte filer.", + "ErrorLoadSrr": "Denne filen ser ut til å være en ReScene SRR-fil.\n\nSubtitle Edit kan ikke åpne SRR-filer.", + "ErrorLoadTorrent": "Denne filen ser ut til å være en BitTorrent-fil.\n\nSubtitle Edit kan ikke åpne torrent-filer.", + "ErrorLoadZip": "Denne filen ser ut til å være en komprimert ZIP-fil.\n\nSubtitle Edit kan ikke åpne komprimerte filer.", + "ExtractingWaveInfo": "Trekker ut bølgeinformasjon...", + "ExtractingShotChanges": "Trekker ut sceneskifter...", + "FailedToExtractWaveInfo": "Kunne ikke trekke ut bølgeinformasjon.", + "FixedRightToLeftUsingUnicodeControlCharactersX": "Fikset høyre-til-venstre ved hjelp av Unicode-kontrolltegn i {0} linjer", + "GeneratingSpectrogramDotDotDot": "Genererer spektrogram...", + "GeneratingWaveformDotDotDot": "Genererer bølgeform...", + "InsertEmptyTextAndShiftCellsDown": "Sett inn tom tekst og flytt celler ned", + "InsertTextFromSubtitleDotDotDot": "Sett inn tekst fra undertekst...", + "CopyTextFromOriginalToCurrent": "Kopier tekst fra original til gjeldende undertekst", + "InsertedXTextsFromSubtitleY": "Satte inn {0} tekster fra undertekstfil \"{1}\"", + "ItalicHint": "Kursiv for valgte linjer/tekst", + "JoinedSubtitleLoaded": "Sammenslått undertekst lastet inn", + "LineXTextAndTimingChanged": "Linje {0}: Tekst og tidsberegning endret", + "LineXTextChangedFromYToZ": "Linje {0}: Tekst endret fra \"{1}\" til \"{2}\"", + "LineXTimingChanged": "Linje {0}: Tidsberegning endret", + "LoadingWaveInfoFromCache": "Laster bølgeinformasjon fra hurtigbuffer...", + "NoTextInClipboard": "Ingen tekst på utklippstavlen", + "OneLineCopiedFromOriginal": "Én linje kopiert fra original undertekst", + "OneLineMerged": "Én linje slått sammen", + "OneLineSwitched": "Én linje byttet", + "OverwriteExistingCells": "Overskriv eksisterende celler", + "OverwriteOrShiftCellsDown": "Overskriv/flytt celler ned", + "ParsingMatroskaFile": "Analyserer Matroska-fil...", + "PasteFromClipboardDotDotDot": "Lim inn fra utklippstavle...", + "RedoPerformed": "Gjør om utført", + "RedoPerformedXActionLeft": "Gjør om utført (handlinger igjen: {0})", + "RemovedUnicodeControlCharactersX": "Fjernet Unicode-kontrolltegn fra {0} linjer", + "RemovedXBlankLines": "Fjernet {0} tomme linjer", + "ReplacedXWithYCountZ": "Erstattet \"{0}\" med \"{1}\" ({2} forekomster)", + "ReplacedXWithYInLineZ": "Erstattet \"{0}\" med \"{1}\" i linje {2}", + "ReversedStartAndEndingsForRightToLeftX": "Reverserte start og slutt for høyre-til-venstre i {0} linjer", + "RuleProfileIsX": "Regelprofil er nå \"{0}\"", + "SaveLanguageFile": "Lagre språkfil", + "SaveXFileAs": "Lagre {0}-fil som", + "ShiftTextCellsDown": "Flytt tekstceller ned", + "SingleLineLength": "Linjelengde: ", + "SpeedIsNowX": "Hastighet er nå \"{0}\"", + "SpellCheckResult": "Stavekontroll fullført. \n\n• Endrede ord: {0}\n• Hoppet over ord: {1}", + "SubtitleImportedFromMatroskaFile": "Undertekst importert fra Matroska-fil", + "TextDown": "Tekst ned", + "TextOnly": "Kun tekst", + "TextUp": "Tekst opp", + "TimeCodesOnly": "Kun tidskoder", + "XPropertiesDotDotDot": "{0} egenskaper...", + "TotalCharacters": "Totalt antall tegn: {0}", + "UnbreakHint": "Fjern linjedeling på valgte linjer", + "UndoPerformed": "Angre utført", + "UndoPerformedXActionLeft": "Angre utført (handlinger igjen: {0})", + "XLinesCopiedFromOriginal": "{0} linjer kopiert fra original undertekst", + "XLinesMerged": "X linjer slått sammen", + "XLinesSelectedOfY": "{0} linjer valgt av {1}", + "XLinesSwitched": "{0} linjer byttet", + "XShotChangedLoaded": "{0} sceneskifter lastet inn", + "YoutubeDlDownloadedSuccessfully": "\"yt-dlp\" lastet ned vellykket.", + "YoutubeDlNotInstalledDownloadNow": "\"yt-dlp\" er ikke installert og kreves for å spille av online videoer.\n\nLast ned nå?", + "InsertUnicodeSymbol": "Sett inn Unicode-symbol", + "TrimmedXLines": "Trimmet {0} undertekstlinjer", + "OpenOriginalDifferentNumberOfSubtitlesXY": "Den originale undertekstfilen har ikke samme antall undertekster som gjeldende undertekstfil.\n\n• Originale undertekster: {0}\n• Gjeldende undertekster: {1}", + "ImportXMatchingOriginalLines": "Importere {0} samsvarende originale undertekster?", + "VideoOpenedChangeLayoutQuestion": "En videofil er åpnet.\n\nVil du endre oppsettet for å vise videopanelet?", + "SortedByStartTime": "Sortert etter \"Vis\"-tid", + "SortedByEndTime": "Sortert etter \"Skjul\"-tid", + "ColorHint": "Farg valgte linjer", + "RemoveFormattingHint": "Fjern formatering fra valgte linjer", + "AssaResolutionResamplerDone": "ASSA-oppløsning endret.", + "LanguageFileSavedToX": "Språkfil lagret til {0}", + "FileExportedInFormatXToY": "Fil eksportert i formatet {0} til {1}", + "FileExportedInFormatXToFileY": "Fil eksportert i formatet \"{0}\" til fil \"{1}\"", + "FixedXLines": "Fikset {0} linjer", + "TranscriptionCompletedWithXLines": "Transkripsjon fullført med {0} linjer", + "ReplacedXOccurrences": "Erstattet {0} forekomster", + "FfmpegDownloadedAndInstalledToX": "ffmpeg lastet ned og installert til {0}", + "NothingToSave": "Ingenting å lagre", + "NothingToSaveOriginal": "Ingenting å lagre (original)", + "LiveSpellCheckLanguageXLoaded": "Språk for direkte stavekontroll {0} lastet inn", + "DownloadFfmpegTitle": "Last ned FFmpeg?", + "DownloadFfmpegQuestion": "FFmpeg kreves for å spille av online videoer og for visse videoredigeringsfunksjoner.\n\nLast ned FFmpeg nå?", + "Menu": { + "File": "_Fil", + "New": "_Ny", + "NewKeepVideo": "Ny (behold _video)", + "Open": "_Åpne...", + "OpenKeepVideo": "Åpne (_behold video)...", + "OpenOriginal": "Åpne ori_ginal...", + "CloseOriginal": "_Lukk original", + "Reopen": "_Åpne på nytt...", + "ClearRecentFiles": "_Tøm nylige filer", + "RestoreAutoBackup": "Gjenopprett auto-_sikkerhetskopi...", + "Save": "_Lagre", + "SaveAs": "Lagre _som...", + "OpenContainingFolder": "Åpne inneholdende _mappe", + "Compare": "Sammenli_gn...", + "Statistics": "Stat_istikk...", + "Import": "_Importer", + "Export": "_Eksporter", + "Exit": "A_vslutt", + "Edit": "_Rediger", + "Undo": "_Angre", + "Redo": "Gjør om", + "ShowHistory": "_Vis historikk for angre...", + "Find": "_Finn...", + "FindNext": "Finn _neste", + "Replace": "_Erstatt...", + "MultipleReplace": "_Søk og erstatt flere...", + "GoToLineNumber": "_Gå til linjenummer...", + "RightToLeftMode": "Høyre-til-venstre-modus", + "ModifySelectionDotDotDot": "Endre _utvalg...", + "Tools": "_Verktøy", + "ToolsSelectedLines": "_Verktøy (valgte linjer)", + "AdjustDurations": "_Juster varigheter...", + "ApplyDurationLimits": "Bruk varighets_grenser...", + "BatchConvert": "_Satsvis konvertering...", + "BridgeGaps": "Tett _hull...", + "ApplyMinGap": "Bruk min. mellomrom mellom undertekster...", + "ChangeCasing": "_Endre bokstavstørrelse...", + "ChangeFormatting": "Endre formatering...", + "FixCommonErrors": "_Fiks vanlige feil...", + "CheckAndFixNetflixErrors": "Sjekk og fiks Netfli_x-feil...", + "MakeEmptyTranslationFromCurrentSubtitle": "Lag ny _tom oversettelse fra gjeldende undertekst", + "MergeLinesWithSameText": "_Slå sammen linjer med samme tekst...", + "MergeLinesWithSameTimeCodes": "Slå sammen linjer med samme tidskoder...", + "SplitBreakLongLines": "Del opp / balanser lange linjer...", + "MergeShortLines": "Slå sammen korte linjer...", + "Renumber": "Gjenummerer...", + "RemoveTextForHearingImpaired": "_Fjern tekst for hørselshemmede...", + "ConvertActors": "Konverter skuespillere...", + "JoinSubtitles": "_Slå sammen undertekster...", + "SplitSubtitle": "_Del opp undertekst...", + "AssaTools": "_ASSA-verktøy", + "AssaProgressBar": "Generer _fremdriftslinje...", + "AssaChangeResolution": "Endre _oppløsning...", + "AssaGenerateBackground": "Generer bakgrunns_bokser...", + "AssaApplyAdvancedEffects": "Bruk avanserte _effekter...", + "AssaApplyCustomOverrideTags": "Bruk _overstyringskoder...", + "AssaSetPosition": "_Angi posisjon...", + "AssaImageColorPicker": "_Fargevelger for bilde...", + "AssaDraw": "_Tegn...", + "AssaStyles": "S_tiler...", + "AssaProperties": "E_genskaper...", + "AssaAttachments": "_Vedlegg...", + "SpellCheckTitle": "_Stavekontroll", + "SpellCheck": "_Stavekontroll...", + "FindDoubleWords": "_Finn doble ord...", + "FindDoubleLines": "_Finn doble linjer...", + "AddNameToNamesList": "_Legg til navn i navneliste...", + "GetDictionaries": "_Hent ordbøker...", + "Video": "_Video", + "OpenVideo": "_Åpne video...", + "OpenVideoFromUrl": "Åpne video fra _nettadresse...", + "CloseVideoFile": "_Lukk videofil", + "AudioTracks": "_Lydspor", + "SpeechToText": "_Tale til tekst...", + "TextToSpeech": "_Tekst til tale...", + "SetVideoOffset": "Sett videoforskyvning...", + "UpdateVideoOffsetX": "Oppdater videoforskyvning fra {0}...", + "SmpteTiming": "SMPTE-tidsberegning (ikke-heltall bildefrekvens)", + "GenerateBurnIn": "Generer video med inn_brente undertekster...", + "GenerateTransparent": "_Generer gjennomsiktig video med undertekster...", + "GenerateImportShotChanges": "Generer/importer _sceneskifter...", + "ListShotChanges": "Vis liste over scenes_kifter...", + "UndockVideoControls": "_Koble fra videokontroller", + "DockVideoControls": "_Fest videokontroller", + "Synchronization": "S_ynkronisering", + "AdjustAllTimes": "_Juster alle tider...", + "ChangeFrameRate": "Endre _bildefrekvens...", + "ChangeSpeed": "Endre _hastighet...", + "VisualSync": "_Visuell synkronisering...", + "Options": "_Alternativer", + "Settings": "_Innstillinger...", + "Shortcuts": "H_urtigtaster...", + "WordLists": "_Ordlister...", + "ChooseLanguage": "_Velg språk for brukergrensesnitt...", + "Translate": "O_versett", + "AutoTranslate": "_Auto-oversett...", + "TranslateViaCopyPaste": "Auto-oversett via _kopier/lim inn...", + "HelpTitle": "_Hjelp", + "Help": "_Hjelp...", + "About": "_Om...", + "CheckForUpdates": "_Se etter oppdateringer...", + "FixRightToLeftViaUnicodeControlCharacters": "Fiks høyre-til-venstre via Unicode-kontrolltegn (valgte linjer)", + "RemoveUnicodeControlCharacters": "Fjern Unicode-kontrolltegn (valgte linjer)", + "ReverseRightToLeftStartEnd": "Reverser høyre-til-venstre start/slutt (valgte linjer)", + "PointSync": "_Punktsynkronisering...", + "PointSyncViaOther": "Punktsynkronisering via _annen undertekst...", + "SortSubtitles": "_Sorter undertekster...", + "SetLayer": "Velg lag...", + "FilterLayersForDisplayDotDotDot": "Filtrer lag for visning..." + }, + "Toolbar": { + "NewHint": "Start en ny undertekstfil {0}", + "OpenHint": "Åpne en eksisterende undertekstfil {0}", + "OpenVideoHint": "Åpne en videofil {0}", + "SaveHint": "Lagre gjeldende undertekst {0}", + "SaveAsHint": "Lagre undertekst med nytt navn {0}", + "FindHint": "Finn tekst i undertekster {0}", + "ReplaceHint": "Søk og erstatt tekst {0}", + "SpellCheckHint": "Sjekk undertekster for skrivefeil {0}", + "FixCommonErrorsHint": "Fiks vanlige undertekstfeil {0}", + "SettingsHint": "Juster programinnstillinger og preferanser {0}", + "LayoutHint": "Endre oppsett for verktøylinje og paneler {0}", + "HelpHint": "Åpne hjelpenettsted {0}", + "AutoBreakHint": "Del opp lange linjer automatisk {0}", + "UnbreakHint": "Slå sammen undertekster med flere linjer til én linje {0}", + "AssaStylesHint": "Advanced Sub Station Alpha-stiler", + "AssaPropertiesHint": "Advanced Sub Station Alpha-egenskaper", + "AssaAttachmentsHint": "Advanced Sub Station Alpha-vedlegg", + "AssaDrawHint": "Tegn former i Advanced Sub Station Alpha" + }, + "Waveform": { + "PlayPauseHint": "Spill av / Pause {0}", + "PlayNextHint": "Spill neste {0}", + "PlaySelectionHint": "Spill av utvalg {0}", + "SetStartAndOffsetTheRestHint": "Sett start for gjeldende undertekst og forskyv resten {0}", + "SetStartHint": "Sett start for gjeldende undertekst {0}", + "SetEndHint": "Sett slutt for gjeldende undertekst {0}", + "NewHint": "Sett inn ny undertekst ved videoposisjon {0}", + "CenterWaveformHint": "Sentrer bølgeform på gjeldende videoposisjon under avspilling {0}", + "ZoomHorizontalHint": "Zoom horisontalt {0}", + "ZoomVerticalHint": "Zoom vertikalt {0}", + "SelectCurrentLineWhilePlayingHint": "Velg gjeldende undertekst under avspilling {0}", + "VideoPosition": "Videoposisjon {0}", + "HideWaveformToolbar": "Skjul verktøylinje {0}", + "ResetZoomAndSpeed": "Tilbakestill zoom og avspillingshastighet {0}", + "RemoveBlankLines": "Fjern tomme linjer {0}", + "PlaySelectedRepeatHint": "Spill av valgt(e) undertekst(er) i repeterende modus {0}" + } + }, + "File": { + "Compare": "Sammenlign", + "PreviousDifference": "Forrige forskjell", + "NextDifference": "Neste forskjell", + "SubtitlesNotAlike": "Undertekster har ingen likheter", + "XNumberOfDifference": "Antall forskjeller: {0}", + "XNumberOfDifferenceAndPercentChanged": "Antall forskjeller: {0} ({1:0.##}% av ord endret)", + "XNumberOfDifferenceAndPercentLettersChanged": "Antall forskjeller: {0} ({1:0.##}% av bokstaver endret)", + "ShowOnlyDifferences": "Bare forskjeller", + "IgnoreLineBreaks": "Ignorer linjeskift", + "IgnoreWhitespace": "Ignorer mellomrom", + "IgnoreFormatting": "Ignorer formatering", + "OnlyLookForDifferencesInText": "Se kun etter forskjeller i tekst", + "CannotCompareWithImageBasedSubtitles": "Kan ikke sammenligne med bildebaserte undertekster", + "StatisticsTitle": "Statistikk", + "ShowOnlyDifferencesInText": "Kun forskjeller i tekst", + "LoadXFromFile": "Last inn \"{0}\" fra fil", + "SaveCompareHtmlTitle": "Lagre HTML-fil for sammenligning", + "PickMatroskaTrackX": "Velg Matroska-spor - {0}", + "RosettaProperties": "Timed Text Rosetta IMSC-egenskaper", + "RosettaFontSize": "Skriftstørrelse (radhøyde)", + "XProperties": "{0} egenskaper", + "EbuSaveOptions": { + "Title": "EBU-lagringsalternativer", + "GeneralSubtitleInformation": "Generell undertekstinformasjon", + "CodePageNumber": "Kodesidenummer", + "DiskFormatCode": "Diskformatkode", + "DisplayStandardCode": "Visningsstandardkode", + "ColorRequiresTeletext": "Farger krever tekst-TV!", + "AlignmentRequiresTeletext": "Justering krever tekst-TV!", + "TeletextCharsShouldBe38": "'Maks antall tegn per rad' for tekst-TV bør være 38!", + "CharacterCodeTable": "Tegntabell", + "LanguageCode": "Språkkode", + "OriginalProgramTitle": "Original programtittel", + "OriginalEpisodeTitle": "Original episodetittel", + "TranslatedProgramTitle": "Oversatt programtittel", + "TranslatedEpisodeTitle": "Oversatt episodetittel", + "TranslatorsName": "Oversetterens navn", + "SubtitleListReferenceCode": "Referansekode for undertekstliste", + "CountryOfOrigin": "Opprinnelsesland", + "TimeCodeStatus": "Status for tidskode", + "TimeCodeStartOfProgramme": "Tidskode: Start på programmet", + "RevisionNumber": "Revisjonsnummer", + "MaxNoOfDisplayableChars": "Maks antall tegn per rad", + "MaxNumberOfDisplayableRows": "Maks antall rader", + "DiskSequenceNumber": "Disksekvensnummer", + "TotalNumberOfDisks": "Totalt antall disker", + "Import": "Importer...", + "TextAndTimingInformation": "Tekst- og tidsinformasjon", + "JustificationCode": "Justeringskode", + "VerticalPosition": "Vertikal posisjon", + "MarginTop": "Toppmarg (for toppjusterte undertekster)", + "MarginBottom": "Bunnmarg (for bunnjusterte undertekster)", + "NewLineRows": "Antall rader lagt til av en ny linje", + "Teletext": "Tekst-TV", + "UseBox": "Bruk boks rundt teksten", + "DoubleHeight": "Bruk dobbel høyde for tekst", + "Errors": "Feil", + "ErrorsX": "Feil: {0}", + "MaxLengthError": "Linje {0} overskrider maks lengde ({1}) med {2}: {3}", + "TextUnchangedPresentation": "Uendret presentasjon", + "TextLeftJustifiedText": "Venstrejustert tekst", + "TextCenteredText": "Sentrert tekst", + "TextRightJustifiedText": "Høyrejustert tekst", + "UseBoxForOneNewLine": "Sjekk 'Bruk boks rundt teksten' kun for én ny linje", + "DiscSequenceNumber": "Disksekvensnummer" + }, + "Import": { + "ImportTimeCodes": "Importer tidskoder...", + "PlainTextDotDotDot": "Klartekst...", + "TitleImportPlainText": "Importer klartekst", + "ImagesForOcrDotDotDot": "Bilder for OCR...", + "TimeCodesDotDotDot": "Tidskoder...", + "SubtitleWithManuallyChosenEncodingDotDotDot": "_Undertekst med manuelt valgt koding...", + "TitleImportImages": "Importer bilder", + "ImportFileLabel": "Velg bilder som skal importeres (støtter tidskoder i filnavn)", + "ImportFilesInfo": "Bruk tidskodede filnavn:\r\nstart_TT_MM_SS_MMM__slutt_TT_MM_SS_MMM[_indeks].ext\r\n\r\nEksempler:\r\n0_00_01_042__0_00_03_919_0001.png\r\n0_00_01_042__0_00_03_919.png\r\n\r\nRegler:\r\n• TT_MM_SS_MMM for start- og sluttider\r\n• Dobbelt understrek skiller start/slutt\r\n• Valgfri indeks etter sluttid", + "FormattingDotDotDot": "Formatering...", + "ImagedBasedSubtitleForEditDotDotDot": "Bildebasert undertekst for redigering...", + "ImagedBasedSubtitleForOcrDotDotDot": "Bildebasert undertekst for OCR...", + "SplitTextAt": "Del tekst ved", + "BlankLines": "Tomme linjer", + "OneLineIsOneSubtitle": "Én linje er én undertekst", + "TwoLinesAreOneSubtitle": "To linjer er én undertekst", + "ImportFilesDotDotDot": "Importer filer...", + "MultipleFiles": "Importer fra flere tekstfiler (én fil er én undertekst)", + "ImportOptions": "Importeringsalternativer", + "AutoSplitText": "Del opp tekst automatisk", + "LineMode": "Linjemodus", + "MaxLineLength": "Maks linjelengde", + "MaxLinesPerSubtitle": "Maks linjer per undertekst", + "MinGapBetweenSubtitles": "Min. mellomrom mellom undertekster", + "MergeShortLines": "Slå sammen korte linjer", + "RemoveLinesWithoutLetters": "Fjern linjer uten bokstaver", + "SplitAtEndCharsSetting": "Del ved sluttegn", + "TakeTimeFromCurrentFile": "Hent tid fra gjeldende fil", + "Fixed": "Fast", + "NumberOfSubtitlesX": "Antall undertekster: {0}", + "GapMs": "Mellomrom (ms)", + "UseFixedDuration": "Bruk fast varighet", + "FixedDurationMs": "Fast varighet (ms)", + "AlignViaWhisper": "Juster tidskoder via Whisper..." + }, + "Export": { + "ExportImagesProfiles": "Eksporter bildeprofiler", + "LeftRightMargin": "Venstre/høyre marg", + "TopBottomMargin": "Topp/bunn marg", + "TitleExportBluRaySup": "Eksporter Blu-ray (sup)", + "LineSpacingPercent": "Linjeavstand %", + "PaddingLeftRight": "Utfylling venstre/høyre", + "PaddingTopBottom": "Utfylling topp/bunn", + "PreviewTitle": "Forhåndsvisning - gjeldende størrelse: {0}x{1}, målstørrelse: {2}x{3}, zoom: {4}%", + "TitleExportVobSub": "VobSub (sub/idx)", + "CustomTextFormatsDotDotDot": "_Egendefinerte tekstformater...", + "PlainTextDotDotDot": "_Klartekst...", + "CustomTextFormats": "Egendefinerte tekstformater", + "TitleExportCustomFormat": "Eksporter egendefinert tekstformat", + "EditCustomFormat": "Rediger egendefinert tekstformat", + "NewCustomFormat": "Nytt egendefinert tekstformat", + "DeleteSelectedCustomTextFormatX": "Slett valgt egendefinert tekstformat \"{0}\"?", + "TimeCodeFormat": "Tidskodeformat", + "NewLineFormat": "Linjeskiftformat", + "PleaseEnterNameForTheCustomFormat": "Vennligst skriv inn navn på det egendefinerte formatet", + "TitleExportPlainText": "Eksporter klartekst", + "LineNumbers": "Linjenummer", + "ShowLineNumbers": "Vis linjenummer", + "AddNewLineAfterLineNumber": "Legg til ny linje etter linjenummer", + "AddNewLineAfterTimeCode": "Legg til ny linje etter tidskode", + "AddNewLineAfterText": "Legg til ny linje etter tekst", + "AddLineBetweenSubtitles": "Legg til linje mellom undertekster", + "TitleExportDCinemaInteropPng": "D-Cinema interop/png", + "TitleExportDCinemaSmpte2014Png": "D-Cinema SMPTE 2014/png", + "ImageBasedSubtitleSaved": "Bildebasert undertekst lagret", + "TitleExportBdnXml": "Eksporter BDN/xml", + "TitleExportWebVttThumbnails": "Eksporter WebVTT (miniatyrbilder)" + }, + "Statistics": { + "Title": "Statistikk", + "TitleWithFileName": "Statistikk - {0}", + "GeneralStatistics": "Generell statistikk", + "MostUsed": "Mest brukt...", + "MostUsedLines": "Mest brukte linjer", + "MostUsedWords": "Mest brukte ord", + "NothingFound": "Ingenting funnet", + "NumberOfLinesX": "Antall undertekstlinjer: {0:#,##0}", + "NumberOfFilesX": "Antall undertekstfiler: {0:#,##0}", + "LengthInFormatXinCharactersY": "Antall tegn som {0}: {1:#,###,##0}", + "NumberOfCharactersInTextOnly": "Antall tegn kun i tekst: {0:#,###,##0}", + "TotalDuration": "Total varighet av alle undertekster: {0:#,##0}", + "TotalCharsPerSecond": "Totalt antall tegn/sekund: {0:0.0} sekunder", + "TotalWords": "Totalt antall ord i undertekst: {0:#,##0}", + "NumberOfItalicTags": "Antall kursiv-koder: {0:#,##0}", + "NumberOfBoldTags": "Antall fet skrift-koder: {0:#,##0}", + "NumberOfUnderlineTags": "Antall understrekings-koder: {0:#,##0}", + "NumberOfFontTags": "Antall skrift-koder: {0:#,##0}", + "NumberOfAlignmentTags": "Antall justeringskoder: {0:#,##0}", + "LineLengthMinimum": "Undertekstlengde - minimum: {0}", + "LineLengthMaximum": "Undertekstlengde - maksimum: {0}", + "LineLengthAverage": "Undertekstlengde - gjennomsnitt: {0:#.###}", + "LinesPerSubtitleAverage": "Undertekst, antall linjer - gjennomsnitt: {0:0.###}", + "SingleLineLengthMinimum": "Enkeltlinjelengde - minimum: {0}", + "SingleLineLengthMaximum": "Enkeltlinjelengde - maksimum: {0}", + "SingleLineLengthAverage": "Enkeltlinjelengde - gjennomsnitt: {0:#.###}", + "SingleLineLengthExceedingMaximum": "Enkeltlinjelengde - overskrider maksimum ({0} tegn): {1} ({2:0.00}%)", + "SingleLineWidthMinimum": "Enkeltlinjebredde - minimum: {0} piksler", + "SingleLineWidthMaximum": "Enkeltlinjebredde - maksimum: {0} piksler", + "SingleLineWidthAverage": "Enkeltlinjebredde - gjennomsnitt: {0:#.###} piksler", + "SingleLineWidthExceedingMaximum": "Enkeltlinjebredde - overskrider maksimum ({0} piksler): {1} ({2:0.00}%)", + "DurationMinimum": "Varighet - minimum: {0:0.000} sekunder", + "DurationMaximum": "Varighet - maksimum: {0:0.000} sekunder", + "DurationAverage": "Varighet - gjennomsnitt: {0:0.000} sekunder", + "DurationExceedingMinimum": "Varighet - under minimum ({0:0.###} sek): {1} ({2:0.00}%)", + "DurationExceedingMaximum": "Varighet - overskrider maksimum ({0:0.###} sek): {1} ({2:0.00}%)", + "CharactersPerSecondMinimum": "Tegn/sek - minimum: {0:0.000}", + "CharactersPerSecondMaximum": "Tegn/sek - maksimum: {0:0.000}", + "CharactersPerSecondAverage": "Tegn/sek - gjennomsnitt: {0:0.000}", + "CharactersPerSecondExceedingOptimal": "Tegn/sek - overskrider optimal ({0:0.##} cps): {1} ({2:0.00}%)", + "CharactersPerSecondExceedingMaximum": "Tegn/sek - overskrider maksimum ({0:0.##} cps): {1} ({2:0.00}%)", + "WordsPerMinuteMinimum": "Ord/min - minimum: {0:0.000}", + "WordsPerMinuteMaximum": "Ord/min - maksimum: {0:0.000}", + "WordsPerMinuteAverage": "Ord/min - gjennomsnitt: {0:0.000}", + "WordsPerMinuteExceedingMaximum": "Ord/min - overskrider maksimum ({0} wpm): {1} ({2:0.00}%)", + "GapMinimum": "Mellomrom - minimum: {0:#,##0} ms", + "GapMaximum": "Mellomrom - maksimum: {0:#,##0} ms", + "GapAverage": "Mellomrom - gjennomsnitt: {0:#,##0.##} ms", + "GapExceedingMinimum": "Mellomrom - under minimum ({0:#,##0} ms): {1} ({2:0.00}%)", + "Export": "Eksporter..." + }, + "ManualChosenEncoding": { + "Title": "Importer undertekst med manuelt valgt koding", + "SearchEncodings": "Søk etter kodinger", + "CodePage": "Kodeside" + }, + "RestoreAutoBackup": { + "Title": "Gjenopprett auto-sikkerhetskopi", + "OpenAutoBackupFolder": "Åpne mappe for auto-sikkerhetskopi", + "RestoreAutoBackupFile": "Gjenopprett auto-sikkerhetskopifil", + "DeleteAllSubtitleBackups": "Vil du slette alle sikkerhetskopifiler for undertekster?", + "DeleteAll": "Slett alle" + }, + "PropertiesDCinema": { + "Title": "D-Cinema SMPTE egenskaper", + "GenerateIdAuto": "Generer ny ID ved lagring", + "SubtitleId": "Undertekst-ID", + "GenerateId": "Generer ID", + "MovieTitle": "Filmtittel", + "ReelNumber": "Spolenummer", + "IssueDate": "Utgivelsesdato", + "Now": "Nå", + "EditRate": "Redigeringsrate", + "TimeCodeRate": "Tidskoderate", + "StartTime": "Starttid", + "Font": "Skrift", + "FontId": "Skrift-ID", + "FontUri": "Skrift-URI", + "Generate": "Generer", + "FontColor": "Skriftfarge", + "ChooseColor": "Velg farge", + "FontEffect": "Skrifteffekt", + "EffectColor": "Effektfarge", + "FontSize": "Skriftstørrelse", + "TopBottomMargin": "Topp/bunn marg", + "FadeUpTime": "Inntoningstid", + "FadeDownTime": "Uttoningstid", + "Frames": "Bilder", + "Export": "Eksporter..." + } + }, + "Edit": { + "ShowHistory": "Historikk for angre", + "RestoreSelected": "Gjenopprett valgte", + "ModifySelection": { + "Title": "Endre utvalg", + "Contains": "Inneholder", + "StartsWith": "Starter med", + "EndsWith": "Slutter med", + "NotContains": "Inneholder ikke", + "AllUppercase": "Bare store bokstaver", + "Odd": "Oddetall", + "Even": "Partall", + "DurationLessThan": "Varighet i ms <", + "DurationGreaterThan": "Varighet i ms >", + "CpsLessThan": "Tegn/sek <", + "CpsGreaterThan": "Tegn/sek >", + "LengthLessThan": "Lengde <", + "LengthGreaterThan": "Lengde >", + "PixelLengthGreaterThan": "Piksellengde >", + "GapLessThan": "Mellomrom i ms <", + "GapGreaterThan": "Mellomrom i ms >", + "ExactlyOneLine": "Nøyaktig én linje", + "ExactlyTwoLines": "Nøyaktig to linjer", + "MoreThanTwoLines": "Mer enn to linjer", + "Bookmarked": "Bokmerket", + "BookmarkContains": "Bokmerke inneholder", + "BlankLines": "Tomme linjer", + "SelectionNew": "Nytt utvalg", + "SelectionAdd": "Legg til i utvalg", + "SelectionSubtract": "Fjern fra utvalg", + "SelectionIntersect": "Kryss med utvalg" + }, + "MultipleReplace": { + "Title": "Søk og erstatt flere", + "EditRule": "Rediger regel", + "NewRule": "Ny regel", + "EditCategory": "Rediger kategori", + "NewCategory": "Ny kategori", + "CategoryName": "Kategorinavn", + "ExportReplaceRules": "Eksporter regler", + "AppliedRules": "Anvendte regler", + "FindRule": "Finn regel", + "XLinesAffected": "{0:#,##0} linjer påvirket", + "DeleteCategoryConfirm": "Slett kategori '{0}'?", + "DeleteRuleConfirm": "Slett regel '{0}'?", + "FindWhat": "Finn hva", + "DescriptionOptional": "Beskrivelse (valgfritt)" + }, + "Find": { + "SearchTextWatermark": "Søk tekst...", + "WholeWord": "Hele ord", + "CaseSensitive": "Skiller mellom store/små bokstaver", + "CaseInsensitive": "Skiller ikke mellom store/små bokstaver", + "FindPrevious": "Finn f_orrige", + "FindNext": "_Finn neste", + "ReplaceAndFindNext": "_Erstatt og finn neste", + "ReplaceAll": "Erstatt _alle", + "ReplaceTitle": "Erstatt", + "ReplaceWith": "Erstatt med", + "ReplaceTextWatermark": "Erstatt med..." + } + }, + "Tools": { + "PickAlignmentTitle": "Velg justering", + "PickFontNameTitle": "Velg skriftnavn", + "ColorPickerTitle": "Velg farge", + "FilterLayersTitle": "Filtrer lag for visning", + "FilterLayersHideFromWaveform": "Skjul fra bølgeform/spektrogram", + "FilterLayersHideFromSubtitleGrid": "Skjul fra undertekstrutenett", + "FilterLayersHideFromVideoPreview": "Skjul fra videoforhåndsvisning", + "PickSubtitleFormat": "Velg undertekstformat", + "PickLayerTitle": "Velg lag", + "RecentColors": "Nylige farger", + "FixCommonErrors": { + "Title": "Fiks vanlige feil", + "Step1": "Trinn 1/2 - Velg hvilke feil som skal fikses", + "WhatToFix": "Hva som skal fikses", + "Example": "Eksempel", + "SelectAll": "Velg alle", + "InverseSelection": "Inverter utvalg", + "Back": "< Til_bake", + "Next": "_Neste >", + "Step2": "Trinn 2/2 - Bekreft rettelser", + "Fixes": "Rettelser", + "Log": "Logg", + "Function": "Funksjon", + "RemovedEmptyLine": "Fjern tom linje", + "RemovedEmptyLineAtTop": "Fjern tom linje øverst", + "RemovedEmptyLineAtBottom": "Fjern tom linje nederst", + "RemovedEmptyLineInMiddle": "Fjern tom linje i midten", + "RemovedEmptyLinesUnusedLineBreaks": "Fjern tomme linjer / ubrukte linjeskift", + "FixOverlappingDisplayTimes": "Fiks overlappende visningstider", + "FixShortDisplayTimes": "Fiks korte visningstider", + "FixLongDisplayTimes": "Fiks lange visningstider", + "FixShortGaps": "Fiks korte mellomrom", + "FixInvalidItalicTags": "Fiks ugyldige kursiv-koder", + "RemoveUnneededSpaces": "Fjern unødvendige mellomrom", + "RemoveUnneededPeriods": "Fjern unødvendige punktum", + "FixCommas": "Fiks kommaer", + "FixMissingSpaces": "Fiks manglende mellomrom", + "BreakLongLines": "Del opp lange linjer", + "RemoveLineBreaks": "Fjern linjeskift i korte tekster med kun én setning", + "RemoveLineBreaksAll": "Fjern linjeskift i korte tekster (alle unntatt dialoger)", + "RemoveLineBreaksPixelWidth": "Fjern linjedeling for undertekster som får plass på én linje (pikselbredde)", + "FixUppercaseIInsideLowercaseWords": "Fiks stor 'i' inni ord med små bokstaver (OCR-feil)", + "FixDoubleApostrophes": "Fiks doble apostrof-tegn ('') til et enkelt anførselstegn (\")", + "AddPeriods": "Legg til punktum etter linjer der neste linje starter med stor bokstav", + "StartWithUppercaseLetterAfterParagraph": "Start med stor bokstav etter avsnitt", + "StartWithUppercaseLetterAfterPeriodInsideParagraph": "Start med stor bokstav etter punktum inni avsnitt", + "StartWithUppercaseLetterAfterColon": "Start med stor bokstav etter kolon/semikolon", + "FixLowercaseIToUppercaseI": "Fiks enslig liten 'i' til 'I' (Engelsk)", + "FixCommonOcrErrors": "Fiks vanlige OCR-feil (bruker OCR-erstattningsliste)", + "CommonOcrErrorsFixed": "Vanlige OCR-feil fikset (OcrReplaceList-fil brukt): {0}", + "RemoveSpaceBetweenNumber": "Fjern mellomrom mellom tall", + "BreakDialogsOnOneLine": "Del dialoger på én linje", + "RemoveDialogFirstInNonDialogs": "Fjern startstrek i første linje for ikke-dialoger", + "NormalizeStrings": "Normaliser strenger", + "FixTurkishAnsi": "Fiks tyrkiske ANSI (islandske) bokstaver til Unicode", + "FixDanishLetterI": "Fiks dansk bokstav 'i'", + "FixSpanishInvertedQuestionAndExclamationMarks": "Fiks spanske omvendte spørsmålstegn og utropstegn", + "AddMissingQuote": "Legg til manglende anførselstegn (\")", + "AddMissingQuotes": "Legg til manglende anførselstegn (\")", + "RemoveHyphensSingleLine": "Fjern dialogstreker i enkeltlinjer", + "FixHyphensInDialogs": "Fiks bindestrek i dialoger via stil: {0}", + "AddMissingQuotesExample": "\"Hvordan har du det? -> \"Hvordan har du det?\"", + "XMissingQuotesAdded": "Manglende anførselstegn lagt til: {0}", + "Fix3PlusLine": "Fiks undertekst med mer enn to linjer", + "Fix3PlusLines": "Fiks undertekster med mer enn to linjer", + "Analysing": "Analyserer...", + "NothingToFix": "Ingenting å fikse :)", + "FixesFoundX": "Rettelser funnet: {0}", + "XFixesApplied": "Rettelser anvendt: {0}", + "NothingFixableBut": "Ingenting kunne fikses automatisk. Underteksten inneholder feil - se loggen for detaljer", + "XFixedBut": "{0} problem(er) fikset, men underteksten inneholder fortsatt feil - se loggen for detaljer", + "XCouldBeFixedBut": "{0} problem(er) kunne fikses, men underteksten vil fortsatt inneholde feil - se loggen for detaljer", + "FixFirstLetterToUppercaseAfterParagraph": "Fiks første bokstav til stor bokstav etter avsnitt", + "MergeShortLine": "Slå sammen kort linje (enkel setning)", + "MergeShortLineAll": "Slå sammen kort linje (alle unntatt dialoger)", + "UnbreakShortLinePixelWidth": "Fjern linjedeling for kort linje (pikselbredde)", + "BreakLongLine": "Del lang linje", + "FixLongDisplayTime": "Fiks lang visningstid", + "FixInvalidItalicTag": "Fiks ugyldig kursiv-kode", + "FixShortDisplayTime": "Fiks kort visningstid", + "FixOverlappingDisplayTime": "Fiks overlappende visningstid", + "FixShortGap": "Fiks kort mellomrom", + "FixInvalidItalicTagsExample": "Bryr meg ikke. -> Bryr meg ikke.", + "RemoveUnneededSpacesExample": "Hei\u00A0 \u00A0du ; der. -> Hei du; der.", + "RemoveUnneededPeriodsExample": "Hei du!. -> Hei du!", + "FixMissingSpacesExample": "Hei.Du. -> Hei. Du.", + "FixUppercaseIInsideLowercaseWordsExample": "Jorden er fIat. -> Jorden er flat.", + "FixLowercaseIToUppercaseIExample": "Hva bryr i meg. -> Hva bryr I meg.", + "StartTimeLaterThanEndTime": "Tekstnummer {0}: Starttid er senere enn sluttid: {4}{1} -> {2} {3}", + "UnableToFixStartTimeLaterThanEndTime": "Kunne ikke fikse tekstnummer {0}: Starttid er senere enn sluttid: {1}", + "XFixedToYZ": "{0} fikset til: {1}{2}", + "UnableToFixTextXY": "Kunne ikke fikse tekstnummer {0}: {1}", + "UnneededSpace": "Unødvendig mellomrom", + "UnneededPeriod": "Unødvendig punktum", + "FixMissingSpace": "Fiks manglende mellomrom", + "FixUppercaseIInsideLowercaseWord": "Fiks stor 'i' inni ord med små bokstaver", + "FixMissingPeriodAtEndOfLine": "Legg til manglende punktum på slutten av linjen", + "RefreshFixes": "Oppdater tilgjengelige rettelser", + "ApplyFixes": "Bruk valgte rettelser og lukk", + "AutoBreak": "Auto &bryt", + "Unbreak": "&Fjern linjedeling", + "FixDoubleDash": "Fiks '--' -> '...'", + "FixDoubleGreaterThan": "Fjern '>>'", + "FixEllipsesStart": "Fjern ledende '...'", + "FixMissingOpenBracket": "Fiks manglende [ eller ( i linje", + "FixMusicNotation": "Erstatt musikksymboler (f.eks. âTª) med foretrukket symbol", + "FixDoubleDashExample": "'Whoa-- um yeah!' -> 'Whoa... um yeah!'", + "FixDoubleGreaterThanExample": "'>> Robert: Hva skjer!' -> 'Robert: Hva skjer!'", + "FixEllipsesStartExample": "'... og så vi' -> 'og så vi'", + "FixMissingOpenBracketExample": "'klunker] Se opp!' -> '[klunker] Se opp!'", + "FixMusicNotationExample": "'âTª sweet dreams are' -> '♫ sweet dreams are'", + "NumberOfImportantLogMessages": "{0} viktige loggmeldinger!", + "FixedOkXY": "Fikset og OK - '{0}': {1}", + "FixOcrErrorExample": "D0n't -> Don't", + "FixSpaceBetweenNumbersExample": "1 100 -> 1100", + "FixDialogsOneLineExample": "Hei John! - Hei Ida! -> Hei John!
- Hei Ida!", + "RemoveDialogFirstInNonDialogsExample": "- Hvordan har du det? -> Hvordan har du det?", + "SelectDefault": "Velg standard", + "SetDefault": "Sett nåværende rettelser som standard", + "FixContinuationStyleX": "Fiks fortsettelsesstil: {0}", + "FixUnnecessaryLeadingDots": "Fjern unødvendige ledende punktum", + "FixCommonErrorsProfiles": "Profiler for fiks vanlige feil", + "FixCommonOcrErrorsStep1": "Fiks vanlige feil, trinn 1 (velg rettelser)", + "SearchRulesDotDotDot": "Søk etter regler...", + "GoToApplyFixes": "Gå til bruk rettelser", + "BackToFixList": "Tilbake til rettelsesliste", + "ApplyFixesAndClose": "Bruk rettelser og lukk", + "FixCommonOcrErrorsStep2": "Fiks vanlige feil, trinn 2 (bruk rettelser)", + "FixCommonOcrErrorsStep2FixesFoundX": "Fiks vanlige feil, trinn 2 - Rettelser funnet: {0}", + "Action": "Handling", + "ApplySelectedFixes": "Bruk valgte rettelser" + }, + "AdjustDurations": { + "Title": "Juster varigheter", + "AdjustVia": "Juster via", + "Seconds": "Sekunder", + "Percent": "Prosent", + "Recalculate": "Beregn på nytt", + "AddSeconds": "Legg til sekunder", + "SetAsPercent": "Sett som prosent av varighet", + "Note": "Merk: Visningstid vil ikke overlappe starttid for neste tekst", + "Fixed": "Fast", + "Milliseconds": "Millisekunder", + "ExtendOnly": "Bare utvid", + "EnforceDurationLimits": "Håndhev minimum- og maksimumsvarighet", + "CheckShotChanges": "Ikke utvid forbi sceneskifter", + "BatchCheckShotChanges": "Respekter sceneskifter (hvis tilgjengelig)" + }, + "ApplyDurationLimits": { + "Title": "Bruk varighetsgrenser", + "FixMinDurationMs": "Fiks minimumsvarighet (ms)", + "DoNotGoPastShotChange": "Ikke gå forbi sceneskifte", + "FixMaxDurationMs": "Fiks maksimumsvarighet (ms)", + "MaxDurationShouldBeHigherThanMinDuration": "Maksimumsvarighet bør være høyere enn minimumsvarighet", + "ChangedDurationFromXToYCommentZ": "Endret varighet fra {0} til {1} {2}", + "OnlyPartialFixed": "(bare delvis fikset)", + "UnfixableX": "Ufiksbar: {0}", + "FixedX": "Fikset: {0}", + "FixedXImprovedY": "Rettelser: {0}, Forbedringer: {1}", + "NoChangesNeeded": "Ingen endringer nødvendig" + }, + "ApplyMinGaps": { + "Title": "Bruk minimumsmellomrom mellom undertekster", + "NumberOfGapsFixedX": "Antall minimumsmellomrom anvendt: {0}", + "MinFramesBetweenLines": "Minimum antall bilder mellom linjer", + "MinMsBetweenLines": "Minimum millisekunder mellom linjer", + "ChangedGapFromXToYCommentZ": "Endret mellomrom fra {0} til {1} {2}" + }, + "BeautifyTimeCodes": { + "Title": "Forskjønn tidskoder", + "BeautifySettings": "Forskjønn-innstillinger", + "SnapToFrames": "Fest til bilder", + "FrameGap": "Bildemellomrom", + "MinDuration": "Min. varighet (ms)", + "ShotChangeThreshold": "Sceneskifteterskel (ms)", + "ShotChangeOffset": "Sceneskifteforskyvning (bilder)", + "Original": "Original", + "Beautified": "Forskjønnet" + }, + "BridgeGaps": { + "Title": "Tett hull", + "BridgeGapsSmallerThan": "Tett hull mindre enn (ms)", + "MinGap": "Minimum mellomrom (ms)", + "NumberOfSmallGapsBridgedX": "Antall små hull tettet: {0}", + "PercentFoPrevious": "Mellomrom for forrige (%)", + "GapChange": "Mellomromsendring" + }, + "Renumber": { + "Title": "Gjenummerer", + "StartFromNumber": "Start fra nummer:" + }, + "SortBy": { + "Title": "Sorter undertekster", + "SortOrder": "Sorteringsrekkefølge" + }, + "BatchConvert": { + "Title": "Satsvis konvertering", + "OneActionsSelected": "Én handling valgt", + "XActionsSelected": "{0} handlinger valgt", + "OutputFolderSource": " Utdatamappe: Kildemappe", + "OutputFolderX": " Utdatamappe: {0}", + "EncodingXOverwriteY": "Koding: {0}, overskriv eksisterende filer: {1}", + "TargetFormatSettings": "Målformat-innstillinger", + "FileNameContainsDotDotDot": "Filnavnet inneholder...", + "TrackLanguageContainsDotDotDot": "Sporspråk inneholder...", + "BatchConvertSettings": "Innstillinger for satsvis konvertering", + "AddFormatting": "Legg til formatering", + "AddItalic": "Legg til kursiv", + "AddBold": "Legg til fet skrift", + "AddUnderline": "Legg til understreking", + "AddAlignment": "Legg til justering", + "AddColor": "Legg til farge", + "DeleteLinesWithSpecificActorsOrStyles": "Slett linjer med skuespillere eller stiler (separer flere med komma)", + "UseSourceStylesIfPossible": "Bruk kildestiler hvis mulig", + "EditStyles": "Rediger stiler", + "EditProperties": "Rediger egenskaper", + "EditAttachments": "Rediger vedlegg", + "ErrorsExportedX": "Feil eksportert: {0}", + "SlowFontSizeChange": "Langsom endring av skriftstørrelse", + "IncreaseFontKerning": "Øk fontkjerning", + "ScrollUp": "Rull opp", + "ScrollDown": "Rull ned", + "RotateIn": "Roter inn", + "TiltBounce": "Tilt sprett", + "FontSizeBounceIn": "Skriftstørrelse spretter inn" + }, + "ChangeCasing": { + "Title": "Endre bokstavstørrelse", + "FixNames": "Fiks navn", + "ExtraNames": "Ekstra navn", + "EnterExtraNamesHint": "Skriv inn ekstra navn som skal fikses, separert med komma", + "OnlyFixUppercaseLines": "Bare fiks linjer med store bokstaver", + "FixNamesOnly": "Bare fiks navn", + "AllUppercase": "Bare store bokstaver", + "AllLowercase": "Bare små bokstaver" + }, + "ChangeFormatting": { + "Title": "Endre formatering" + }, + "ConvertActors": { + "Title": "Konverter skuespillere", + "ConvertActorFrom": "Konverter skuespiller fra", + "ConvertActorTo": "Konverter skuespiller til", + "InlineActorViaX": "Inkluder skuespiller via {0}", + "SetColor": "Sett farge", + "OnlyNames": "Kun navn", + "NumberOfConversionsX": "Antall konverteringer: {0}" + }, + "JoinSubtitles": { + "Title": "Slå sammen undertekster", + "KeepTimeCodes": "Behold tidskoder", + "AppendTimeCodes": "Legg til tidskoder", + "AddMsAfterEachFile": "Legg til millisekunder etter hver fil", + "Join": "Slå _sammen" + }, + "SplitSubtitle": { + "Title": "Del opp undertekst", + "NumberOfEqualParts": "Antall like deler", + "SaveSplitParts": "_Lagre oppdelte deler", + "SubtitleSplitIntoXParts": "Undertekst delt i {0} deler.", + "XPartsSavedInFormatYToFolder": "{0} deler lagret i formatet {1} i mappen:" + }, + "SplitBreakLongLines": { + "Title": "Del opp / balanser lange linjer", + "SplitLongLines": "Del opp lange linjer (til flere linjer)", + "RebalanceLongLines": "Balanser lange linjer på nytt", + "SplitLongLine": "Del opp lang linje", + "RebalanceLongLine": "Balanser lang linje på nytt", + "SplitIntoXLines": "Del i {0} linjer: '{1}' → '{2}...'", + "LinesSplitX": "Linjer delt: {0}", + "LinesSplitXLinesRebalancedY": "Linjer delt: {0}, linjer balansert: {1}" + }, + "MergeShortLines": { + "Title": "Slå sammen korte linjer", + "HighlightParts": "Fremhev deler (karaoke)", + "MergedLineInfo": "Slått sammen linje {0} til {1} ​​- {2}", + "LinesMergedX": "Linjer slått sammen: {0}" + }, + "MergeLinesWithSameText": { + "Title": "Slå sammen linjer med samme tekst", + "MaxMsBetweenLines": "Maks millisekunder mellom linjer", + "IncludeIncrementingLines": "Inkluder linjer med økende tekst" + }, + "MergeLinesWithSameTimeCodes": { + "Title": "Slå sammen linjer med samme tidskoder", + "MaxMsDifference": "Maks forskjell (millisekunder)", + "MakeDialog": "Lag dialoger" + }, + "NetflixCheckAndFix": { + "Title": "Netflix sjekk og fiks feil", + "GenerateReport": "Generer rapport", + "NothingToReport": "Ingen problemer funnet.", + "SaveNetflixQualityReport": "Lagre Netflix-kvalitetsrapport", + "NetflixReportSaved": "Netflix-kvalitetsrapport lagret", + "NetFlixQualityReportSavedToX": "Netflix-kvalitetsrapport lagret til:\n {0}", + "DialogHyphenSpace": "Mellomrom med bindestrek i dialogboksen", + "EllipsesNotThreeDots": "Bruk elipser (ikke tre prikker)", + "OnlyAllowedGlyphs": "Kun tillatte glyffer", + "Italics": "Kursiv", + "MaxCharsSec": "Maks tegn/sek", + "MaxDuration": "Maks varighet", + "MaxLineLength": "Maks linjelengde", + "MinDuration": "Min varighet", + "MaxNumberOfLines": "Maks antall linjer", + "OneToTenSpellOut": "En til ti staver ut", + "ShotChanges": "Skudskifter", + "StartNumberSpellOut": "Startnummer staves ut", + "TextforHiUseBrackets": "Tekst for HI, bruk parenteser", + "FrameRate": "Bildefrekvens", + "TwoFrameGrap": "Mellomrom med to frames", + "WhiteSpace": "Hvit plass" + }, + "ImageBasedEdit": { + "EditImagedBaseSubtitle": "Rediger bildebasert undertekst", + "EditImagedBaseSubtitleX": "Rediger bildebasert undertekst: {0}", + "ResizeImagesDotDotDot": "Endre størrelse på bilder...", + "AdjustBrightnessDotDotDot": "Juster lysstyrke...", + "AdjustAlphaDotDotDot": "Juster alfa...", + "CenterHorizontally": "Midtstill horisontalt", + "CropImages": "Beskjær bilder", + "ImportTimeCodes": "Importer tidskoder...", + "SetTextForSubtitle": "Sett tekst for undertekst", + "ScreenWidth": "Skjermbredde", + "ScreenHeight": "Skjermhøyde", + "AlphaThresholdInfo": "Piksler med alfa under terskelen blir helt gjennomsiktige", + "ResetToDefaults": "Tilbakestill til standard", + "AlphaAdjustmentInfo": "Alfajustering: Legg til/trekk fra i alfakanalen.\nForhåndsvisningen oppdateres automatisk og vises med rutete bakgrunn for å visualisere gjennomsiktighet.", + "AdjustBrightness": "Juster lysstyrke", + "Brightness": "Lysstyrke", + "Contrast": "Kontrast", + "Gamma": "Gamma", + "BrightnessAdjustmentInfo": "Juster glidebryterne for å endre lysstyrke, kontrast og gamma.\nForhåndsvisningen oppdateres automatisk og viser den første valgte underteksten.", + "ResizeImages": "Endre størrelse på bilder", + "Percentage": "Prosent", + "ResizeImagesInfo": "Skriv inn prosenten for å endre bildestørrelse.\nForhåndsvisningen oppdateres automatisk." + }, + "RemoveTextForHearingImpaired": { + "Title": "Fjern tekst for hørselshemmede", + "Interjections": "Interjeksjoner", + "SkipIfStartWith": "Hopp over hvis starter med", + "RemoveTextBetween": "Fjern tekst mellom", + "Brackets": "Hakeparenteser", + "CurlyBrackets": "Krøllparenteser", + "Parentheses": "Parenteser", + "And": "og", + "OnlySeparateLines": "Bare separate linjer", + "RemoveTextBeforeColon": "Fjern tekst før kolon", + "OnlyIfTextIsUppercase": "Bare hvis teksten er med store bokstaver", + "OnlyOnSeparateLine": "Bare på separat linje", + "IfLineIsUppercase": "Hvis linjen er med store bokstaver", + "IfLineContains": "Hvis linjen inneholder", + "IfLineOnlyContainsMusicSymbols": "Hvis linjen kun inneholder musikksymboler", + "RemoveInterjections": "Fjern interjeksjoner" + } + }, + "SpellCheck": { + "SpellCheck": "Stavekontroll", + "GetDictionariesTitle": "Stavekontroll - hent ordbøker", + "GetDictionaryInstructions": "Velg språk og klikk last ned", + "AddNameToUserDictionary": "Legg til navn i brukerordbok", + "AddNameToNamesList": "Legg til navn i navneliste", + "NoDictionariesFound": "Ingen ordbøker funnet", + "WordNotFound": "Ord ikke funnet", + "LineXofY": "Stavekontroll - linje {0} av {1}", + "ChangeWordFromXToY": "Endre ord fra '{0}' til '{1}'", + "ChangeAllWordsFromXToY": "Endre alle ord fra '{0}' til '{1}'", + "IgnoreWordXOnce": "Ignorer ord '{0}' én gang", + "IgnoreWordXAlways": "Ignorer ord '{0}' alltid", + "WordXAddedToNamesList": "Ord '{0}' lagt til i navneliste", + "WordXAddedToUserDictionary": "Ord '{0}' lagt til i brukerordbok", + "UseSuggestionX": "Bruk forslag '{0}'", + "UseSuggestionXAlways": "Bruk forslag '{0}' alltid", + "AddXToUserDictionary": "Legg til '{0}' i brukerordbok", + "IgnoreAllX": "Ignorer alle '{0}'", + "PickSpellCheckDictionaryDotDotDot": "Velg ordbok for stavekontroll...", + "ChooseSpellCheckDictionary": "Velg ordbok for stavekontroll" + }, + "Video": { + "GoToVideoPosition": "Gå til videoposisjon", + "GenerateBlankVideoDotDotDot": "Generer blank video...", + "GenerateBlankVideoTitle": "Generer blank video", + "ReEncodeVideoForBetterSubtitlingTitle": "Omkod video for bedre underteksting", + "ReEncodeVideoForBetterSubtitlingDotDotDot": "Omkod video for bedre underteksting...", + "OpenSecondarySubtitleOnVideoPlayerDotDotDot": "Sekundær undertekst på videospiller, åpne...", + "OpenSecondarySubtitleOnVideoPlayer": "Sekundær undertekst (på videospiller)", + "RemoveSecondarySubtitleOnVideoPlayer": "Sekundær undertekst på videospiller, fjern", + "CutVideoTitle": "Klipp video", + "CutVideoDotDotDot": "Klipp video...", + "EmbedSubtitlesDotDotDot": "Legg til/fjern innebygde undertekster...", + "GenerateTimeCodes": "Generer tidskoder", + "CheckeredImage": "Rutete bilde", + "SaveVideoAsTitle": "Lagre video som", + "PromptForFfmpegParamsAndGenerate": "Spør om ffmpeg-parametere og generer", + "CutVideoCutSegments": "Klipp segmenter", + "CutVideoMergeSegments": "Slå sammen segmenter", + "CutVideoSplitSegments": "Lagre segmenter individuelt", + "CutVideoType": "Klipptype", + "MpvRenderAuto": "Auto", + "MpvRenderNative": "Native", + "MpvRenderOpenGl": "OpenGL", + "MpvRenderSoftware": "Programvare (treg)", + "ImportCurrentSubtitle": "Importer gjeldende undertekst", + "AddRemoveEmbeddedSubtitlesTitle": "Legg til/fjern innebygde undertekster", + "AddCurrentSubtitle": "Legg til gjeldende undertekst", + "TitleOrLanguage": "Tittel/språk", + "ViewMatroskaTrackX": "Vis Matroska-spor - {0}", + "ResolutionSeparator": "x", + "OpenFromUrlTitle": "Åpne videofil fra nettadresse", + "BurnIn": { + "Title": "Generer video med innbrente undertekster", + "InfoAssaOff": "Merk: Advanced SubStation Alpha-stiler støttes.", + "InfoAssaOn": "Merk: Advanced SubStation Alpha-stiler vil bli brukt :)", + "XGeneratedWithBurnedInSubsInX": "\"{0}\" generert med innbrent undertekst på {1}.", + "TimeRemainingMinutes": "Gjenstående tid: {0} minutter", + "TimeRemainingOneMinute": "Gjenstående tid: Ett minutt", + "TimeRemainingSeconds": "Gjenstående tid: {0} sekunder", + "TimeRemainingAFewSeconds": "Gjenstående tid: Noen få sekunder", + "TimeRemainingMinutesAndSeconds": "Gjenstående tid: {0} minutter og {1} sekunder", + "TimeRemainingOneMinuteAndSeconds": "Gjenstående tid: Ett minutt og {0} sekunder", + "TargetFileName": "Målfilnavn: {0}", + "TargetFileSize": "Målfilstørrelse (krever 2-pass-koding)", + "FileSizeMb": "Filstørrelse i MB", + "PassX": "Pass {0}", + "Encoding": "Koding", + "BitRate": "Bitrate", + "TotalBitRateX": "Total bitrate: {0}", + "SampleRate": "Samplingsfrekvens", + "Audio": "Lyd", + "Stereo": "Stereo", + "Preset": "Forhåndsinnstilling", + "PixelFormat": "Pikselformat", + "Crf": "CRF", + "TuneFor": "Optimaliser for", + "AlignRight": "Høyrejuster", + "GetStartPosition": "Hent startposisjon", + "GetEndPosition": "Hent sluttposisjon", + "UseSource": "Bruk kilde", + "UseSourceFolder": "Bruk kildemappe", + "UseSourceResolution": "Bruk kildeoppløsning", + "OutputSettings": "Utdatafil/mappe...", + "FontSizeFactor": "Skriftstørrelsesfaktor", + "BoxType": "Bokstype", + "FixRightToLeft": "Fiks høyre-til-venstre", + "Cut": "Klipp", + "FromTime": "Fra tid", + "ToTime": "Til tid", + "AudioEncoding": "Lydkoding", + "OutputProperties": "Utdataegenskaper...", + "VideoFileSize": "Videofilstørrelse", + "OneBox": "Én boks", + "BoxPerLine": "Boks per linje", + "LogoInfo": "Velg et PNG-bilde og dra det for å plassere det på videoen." + }, + "VideoTransparent": { + "Title": "Generer gjennomsiktig video med undertekster", + "InfoAssaOff": "Merk: Advanced SubStation Alpha-stiler støttes.", + "InfoAssaOn": "Merk: Advanced SubStation Alpha-stiler vil bli brukt :)" + }, + "AudioToText": { + "Title": "Tale til tekst", + "Transcribe": "Transkriber", + "TranslateToEnglish": "Oversett til engelsk", + "Transcribing": "Transkriberer...", + "TranscribingXOfY": "Transkriberer {0} av {1}...", + "InputLanguage": "Inndataspråk", + "AdvancedWhisperSettings": "Avanserte Whisper-innstillinger", + "DownloadingWhisperEngine": "Laster ned Whisper-motor", + "EnableVad": "Aktiver VAD", + "WhisperXxlStandard": "Standard", + "WhisperXxlStandardAsia": "Standard Asia", + "WhisperXxlSentence": "Setningsnivå", + "WhisperXxlSingleWords": "Enkeltord", + "WhisperXxlHighlightWord": "Uthev ord", + "SelectModel": "Velg modell", + "ViewWhisperLogFile": "Vis Whisper-loggfil", + "ReDownloadX": "Last ned {0} på nytt", + "DownloadingSpeechToTextModel": "Laster ned tale-til-tekst-modell", + "WhisperPostProcessingTitle": "Whisper etterbehandling", + "AdjustTimings": "Juster tidsberegninger", + "MergeShortLines": "Slå sammen korte linjer", + "BreakSplitLongLines": "Del opp / splitt lange linjer", + "FixShortDuration": "Fiks kort varighet", + "FixCasing": "Fiks bokstavstørrelse", + "AddPeriods": "Legg til punktum", + "ChangeUnderlineToColor": "Endre understreking til farge" + }, + "TextToSpeech": { + "Title": "Tekst til tale", + "TextToSpeechEngine": "Tekst til tale-motor", + "ReviewAudioSegments": "TTS - Gjennomgå lydsegmenter", + "ReviewAudioSegmentsHistory": "TTS - Gjennomgå lydhistorikk", + "Stability": "Stabilitet", + "Similarity": "Likhet", + "SpeakerBoost": "Talerforsterkning", + "StyleExaggeration": "Stiloverdrivelse", + "RegenerateAudioSelectedLine": "Regenerer lyd for valgt linje", + "GenerateSpeechFromText": "Generer tale fra tekst", + "TestVoice": "Test stemme", + "AddAudioToVideoFile": "Legg lyd til videofil", + "VoiceSettings": "TTS - Stemmeinnstillinger", + "VoiceSampleText": "Prøvetekst for stemme", + "RefreshVoices": "Oppdater stemmer", + "VideoEncodingSettings": "TTS - Videokodingsinnstillinger", + "ElevenLabsSettings": "TTS - ElevenLabs-innstillinger", + "ElevenLabsSettingsResetHint": "Tilbakestill ElevenLabs-innstillinger til standardverdier", + "RegenerateAudio": "Regenerer lyd", + "AutoContinuePlaying": "Auto-fortsett avspilling", + "AddingAudioToVideoFileDotDotDot": "Legger lyd til videofil...", + "PreparingMergeDotDotDot": "Forbereder sammenslåing...", + "ImportVoiceDotDotDot": "Importer stemme...", + "VoiceImportSuccessTitle": "Stemme importert", + "VoiceXImported": "Stemme '{0}' ble importert vellykket", + "AdvancedTtsSettings": "Avanserte TTS-innstillinger", + "ProAudioPostProcessing": "Pro lydetterbehandling", + "ProAudioPostProcessingDescription": "Anvender EQ-varme, støyport, kompresjon, loudness-normalisering (-16 LUFS) og inntoning/uttoning på hvert segment.", + "AudioDucking": "Lyd-ducking", + "AudioDuckingDescription": "Reduserer det originale videolydvolumet og mikser det med TTS-lyden, slik at det originale lydsporet fortsatt høres svakt.", + "OriginalVolumePercent": "Originalt volum %", + "VadSilenceCompression": "VAD stillhetskomprimering", + "VadSilenceCompressionDescription": "Forkorter pauser mellom ord før tempoet endres. Bruker stemmeaktivitetsdeteksjon for å komprimere bare stillhetshull mens talen forblir uberørt. Dette er det foretrukne første trinnet — det reduserer varigheten uten tap av kvalitet.", + "MaxSilenceMs": "Maks stillhet (ms)", + "HighQualityTimeStretch": "Tidsutvidelse av høy kvalitet (WSOLA/rubberband)", + "HighQualityTimeStretchDescription": "Bruker rubberband-algoritmen (WSOLA) i stedet for standard atempo-filter for tonehøydebevarende hastighetsendringer. Gir mer naturlig lydende tale, spesielt ved høyere hastighetsfaktorer. Krever librubberband i FFmpeg-versjonen din — faller automatisk tilbake på atempo hvis ikke tilgjengelig.", + "SilencePaddingMs": "Stillhet-utfylling (ms)", + "SilencePaddingMsDescription": "Legger til en kort stillhet på slutten av hvert segment. Nyttig for pusterom mellom setninger.", + "OutputSampleRate": "Utdata samplingsfrekvens (0 = standard)", + "OutputSampleRateDescription": "Resampler alle segmenter til spesifisert samplingsfrekvens (f.eks. 44100, 48000). Sett til 0 for å beholde originalfrekvens.", + "EdgeTtsRate": "Edge-TTS-rate", + "EdgeTtsRateDescription": "Talehastighet for Edge-TTS, f.eks. \"+50%\", \"-30%\", eller \"+0%\" for standard.", + "EdgeTtsPitch": "Edge-TTS-tonehøyde", + "EdgeTtsPitchDescription": "Tonehøydejustering for Edge-TTS, f.eks. \"+10Hz\", \"-5Hz\", eller \"+0Hz\" for standard.", + "EdgeTtsVolume": "Edge-TTS-volum", + "EdgeTtsVolumeDescription": "Volumjustering for Edge-TTS, f.eks. \"+20%\", \"-10%\", eller \"+0%\" for standard.", + "DownloadPiperPrompt": "«Tekst til tale» krever Piper.\r\n\r\nLaste ned og bruke Piper?" + }, + "ShotChanges": { + "TitleGenerateOrImport": "Generer/importer sceneskifter", + "GenerateShotChanges": "Generer sceneskifter", + "ImportShotChanges": "Importer sceneskifter", + "GenerateShotChangesWithFfmpeg": "Generer sceneskifter med ffmpeg", + "ShotChangeTimeCode": "Sceneskiftetidskode", + "OpenShotChangesFile": "Åpne sceneskiftefil", + "ImportShotChangesFromFile": "Importer sceneskifter fra fil", + "TimeCodeFormatColon": "Tidskodeformat:", + "ShotChangesList": "Sceneskifteliste", + "ShotChangesClearQuestion": "Er du sikker på at du vil tømme alle sceneskifter?", + "DeleteSelectedShotChangeQuestion": "Er du sikker på at du vil slette det valgte sceneskiftet?" + } + }, + "Waveform": { + "GuessTimeCodes": "Gjett tidskoder", + "GuessTimeCodesScanBlockSize": "Skanneblokkstørrelse (ms):", + "GuessTimeCodesScanBlockAverageMin": "Skanneblokk gjennomsnitt minimum (% av maks):", + "GuessTimeCodesScanBlockAverageMax": "Skanneblokk gjennomsnitt maksimum (% av maks):", + "GuessTimeCodesSplitLongSubtitlesAt": "Del lange undertekster ved (ms):", + "SpeechToTextSelectedLinesDotDotDot": "Tale til tekst valgte linjer...", + "SeekSilence": "Søk stillhet", + "MinSilenceDurationSeconds": "Min. varighet på stillhet (sekunder):", + "MaxSilenceVolume": "Maks. volum for stillhet (0.0 - 1.0):", + "GuessTimeCodesDotDotDot": "Gjett tidskoder...", + "SeekSilenceDotDotDot": "Søk stillhet...", + "ToggleShotChange": "Veksle sceneskifte", + "ResetWaveformZoomAndSpeed": "Tilbakestill bølgeform-zoom og hastighet", + "ShowOnlyWaveform": "Vis kun bølgeform", + "ShowOnlySpectrogram": "Vis kun spektrogram", + "ShowWaveformAndSpectrogram": "Vis bølgeform og spektrogram", + "SpectrogramClassic": "Klassisk", + "SpectrogramClassicViridis": "Viridis", + "SpectrogramClassicPlasma": "Plasma", + "SpectrogramClassicInferno": "Inferno", + "SpectrogramClassicTurbo": "Turbo", + "SpectrogramNeon": "Neon", + "WaveformDrawStyleClassic": "Klassisk", + "WaveformDrawStyleFancy": "Fancy", + "SetVideoPositionAndPauseAndSelectSubtitle": "Sett videoposisjon, pause, og velg undertekst", + "SetVideopositionAndPauseAndSelectSubtitleAndCenter": "Sett videoposisjon, pause, velg undertekst, og sentrer", + "SetVideoPositionAndPause": "Sett videoposisjon og pause", + "SetVideopositionAndPauseAndCenter": "Sett videoposisjon, pause, og sentrer", + "SetVideoposition": "Sett videoposisjon" + }, + "Sync": { + "VisualSync": "Visuell synkronisering", + "Sync": "Synkronisering", + "StartScene": "Startscene", + "EndScene": "Sluttscene", + "PlayTwoSecondsAndBack": "Spill 2 sek og tilbake", + "FindText": "Finn tekst", + "ResolutionXDurationYFrameRateZ": "Oppløsning: {0}, varighet: {1}, bildefrekvens: {2}", + "StartSceneMustComeBeforeEndScene": "Startscene må komme før sluttscene", + "GoToSubPos": "Gå til sub pos", + "SpeedInPercentage": "Hastighet i %", + "FromDropFrameValue": "Fra drop-frame-verdi", + "ToDropFrameValue": "Til drop-frame-verdi", + "AdjustAll": "Juster alle", + "AdjustSelectedLines": "Juster valgte linjer", + "AdjustSelectedLinesAndForward": "Juster valgte linjer og fremover", + "ToFrameRate": "Til bildefrekvens", + "FromFrameRate": "Fra bildefrekvens", + "AdjustAllTimes": "Juster alle tider (vis tidligere/senere)", + "ShowEarlier": "Vis tidligere", + "ShowLater": "Vis senere", + "ChangeFrameRate": "Endre bildefrekvens", + "SetSyncPoint": "Sett synkroniseringspunkt", + "SyncPoints": "Synkroniseringspunkter", + "PointSync": "Punktsynkronisering", + "PointSyncViaOther": "Punktsynkronisering via annen undertekst", + "AdjustmentX": "Justering: {0}", + "AdjustAllShortcuts": "Hurtigtaster:\r\n\r\n• Shift + Venstre/Høyre: Flytt 10 ms\r\n• Ctrl + Venstre/Høyre: Flytt 100 ms\r\n• Alt + Venstre/Høyre: Flytt 500 ms", + "OffsetInSeconds": "Forskyvning i sekunder", + "SpeedFactor": "Hastighetsfaktor" + }, + "Translate": { + "TranslateViaCopyPaste": "Auto-oversett via kopier/lim inn", + "MaxBlockSize": "Maks blokkstørrelse", + "LineSeparator": "Linjeskilletegn", + "BlockCopyInfo": "Gå til oversetter/AI og lim inn tekst (allerede på utklippstavlen), kopier resultatet tilbake til utklippstavlen og klikk på knappen nedenfor.", + "BlockCopyGetFromClipboard": "Hent tekst fra utklippstavlen (fra oversetter/AI)", + "ReCopyTextToClipboard": "Kopier tekst tilbake til utklippstavlen (for oversetter/AI)", + "BlockXOfY": "Blokk {0} av {1}", + "NoTextInClipboard": "Ingen tekst på utklippstavlen", + "TextInClipboardIsSameAsSourceText": "Teksten på utklippstavlen er den samme som kildeteksten, prøv igjen.", + "LineMerge": "Linjesammenslåing", + "DelayInSecondsBetweenRequests": "Forsinkelse i sekunder mellom forespørsler", + "MaxBytesPerRequest": "Maks bytes per forespørsel", + "PromptText": "Ledetekst (prompt)", + "TranslateEachLineSeparately": "Oversett hver linje separat" + }, + "Options": { + "Settings": { + "DialogStyle": "Dialogstil", + "DialogStyleDashSecondLineWithoutSpace": "Bindestrek andre linje uten mellomrom", + "DialogStyleDashSecondLineWithSpace": "Bindestrek andre linje med mellomrom", + "DialogStyleDashBothLinesWithSpace": "Bindestrek begge linjer med mellomrom", + "DialogStyleDashBothLinesWithoutSpace": "Bindestrek begge linjer uten mellomrom", + "ContinuationStyle": "Fortsettelsesstil", + "ContinuationStyleNone": "Ingen", + "ContinuationStyleNoneTrailingDots": "Ingen, punktum for pauser (bare etterfølgende)", + "ContinuationStyleNoneLeadingTrailingDots": "Ingen, punktum for pauser", + "ContinuationStyleNoneTrailingEllipsis": "Ingen, ellipse for pauser (bare etterfølgende)", + "ContinuationStyleNoneLeadingTrailingEllipsis": "Ingen, ellipse for pauser", + "ContinuationStyleOnlyTrailingDots": "Punktum (bare etterfølgende)", + "ContinuationStyleLeadingTrailingDots": "Punktum", + "ContinuationStyleOnlyTrailingEllipsis": "Ellipse (bare etterfølgende)", + "ContinuationStyleLeadingTrailingEllipsis": "Ellipse", + "ContinuationStyleLeadingTrailingDash": "Bindestrek", + "ContinuationStyleLeadingTrailingDashDots": "Bindestrek, men punktum for pauser", + "ContinuationStyleCustom": "Egendefinert", + "CpsLineLengthStyle": "Tegn/sek / linjelengde", + "CpsLineLengthStyleCalcAll": "Tell alle tegn", + "CpsLineLengthStyleCalcNoSpaceCpsOnly": "Tell alle unntatt mellomrom, kun for tegn/sek", + "CpsLineLengthStyleCalcNoSpace": "Tell alle unntatt mellomrom", + "CpsLineLengthStyleCalcCjk": "CJK 1, Latinsk 0.5", + "CpsLineLengthStyleCalcCjkNoSpace": "CJK 1, Latinsk 0.5, mellomrom 0", + "CpsLineLengthStyleCalcIncludeCompositionCharacters": "Inkluder komposisjonstegn", + "CpsLineLengthStyleCalcIncludeCompositionCharactersNotSpace": "Inkluder komposisjonstegn, ikke mellomrom", + "CpsLineLengthStyleCalcNoSpaceOrPunctuation": "Ingen mellomrom eller tegnsetting ()[]-:;,.!?", + "CpsLineLengthStyleCalcNoSpaceOrPunctuationCpsOnly": "Ingen mellomrom eller tegnsetting, kun for tegn/sek", + "CpsLineLengthStyleCalcIgnoreArabicDiacritics": "Ignorer arabiske diakritiske tegn", + "CpsLineLengthStyleCalcIgnoreArabicDiacriticsNoSpace": "Ignorer arabiske diakritiske tegn, ingen mellomrom", + "TimeCodeModeHhMmSsMs": "TT:MM:SS:MS", + "TimeCodeModeHhMmSsFf": "TT:MM:SS:FF", + "SplitBehaviorPrevious": "Legg til mellomrom til venstre for delingspunktet (fokus høyre)", + "SplitBehaviorHalf": "Legg til mellomrom i midten av delingspunktet (fokus venstre)", + "SplitBehaviorNext": "Legg til mellomrom til høyre for delingspunktet (fokus venstre)", + "SubtitleListActionNothing": "Ingenting", + "SubtitleListActionVideoGoToPositionAndPause": "Gå til videoposisjon og sett på pause", + "SubtitleListActionVideoGoToPositionAndPlay": "Gå til videoposisjon og spill av", + "SubtitleListActionVideoGoToPositionAndPlayCurrentAndPause": "Gå til videoposisjon, spill gjeldende og sett på pause", + "SubtitleListActionEditText": "Gå til rediger tekstboks", + "SubtitleListActionVideoGoToPositionMinus1SecAndPause": "Gå til videoposisjon - 1 s og sett på pause", + "SubtitleListActionVideoGoToPositionMinusHalfSecAndPause": "Gå til videoposisjon - 0,5 s og sett på pause", + "SubtitleListActionVideoGoToPositionMinus1SecAndPlay": "Gå til videoposisjon - 1 s og spill av", + "SubtitleListActionEditTextAndPause": "Gå til rediger tekstboks, og sett på pause ved videoposisjon", + "AutoBackupEveryMinute": "Hvert minutt", + "AutoBackupEveryXthMinute": "Hvert {0}. minutt", + "Profiles": "Profiler", + "AutoBackupDeleteAfterXMonths": "Slett auto-sikkerhetskopier etter {0} måneder", + "SearchSettingsDotDoDot": "Søk etter innstillinger...", + "SyntaxColoring": "Syntaksfarging", + "WaveformSpectrogram": "Bølgeform/spektrogram", + "Network": "Nettverk", + "FileTypeAssociations": "Filtypetilknytninger", + "TextBoxColorTags": "Fargekoder (HTML/ASSA) i undertekst-tekstboks", + "TextBoxLiveSpellCheck": "Direkte stavekontroll i undertekst-tekstboks", + "TextBoxCenterText": "Sentrert tekst i undertekst-tekstboks", + "TextBoxFontBold": "Fet tekst i undertekst-tekstboks", + "TextBoxFontSize": "Skriftstørrelse i undertekst-tekstboks", + "SubtitleTextBoxAndGridFontName": "UI-skrift i undertekst-tekstboks og rutenett", + "SubtitleGridFontSize": "Skriftstørrelse i undertekst-rutenett", + "SubtitleGridTextSingleLine": "Vis undertekst som én linje i rutenettet", + "SubtitleGridLiveSpellCheck": "Direkte stavekontroll i undertekst-rutenett", + "SubtitleGridShowFormatting": "Vis formatert (HTML/ASSA) tekst i undertekst-rutenett", + "ShowUpDownStartTime": "Vis opp/ned-kontroll for \"Vis\"", + "ShowUpDownEndTime": "Vis opp/ned-kontroll for \"Skjul\"", + "ShowUpDownDuration": "Vis opp/ned-kontroll for \"Varighet\"", + "ShowUpDownLabels": "Vis etiketter for opp/ned-kontroller (Vis/Skjul/Varighet)", + "ShowButtonHints": "Vis knappetips", + "GridCompactMode": "Bruk kompakt modus for rutenett", + "UiFont": "UI-skrift", + "Theme": "Tema", + "IconTheme": "Ikontema", + "DarkThemeForegroundColor": "Mørkt tema forgrunnsfarge", + "DarkThemeBackgroundColor": "Mørkt tema bakgrunnsfarge", + "ShowGridLines": "Vis rutenettlinjer", + "ResetSettings": "Tilbakestill innstillinger?", + "ResetSettingsDetail": "Dette vil tilbakestille alle innstillinger til standardverdiene.\n\nFortsette?", + "ShowHorizontalLineAboveToolbar": "Vis horisontal linje over verktøylinjen", + "BookmarkColor": "Bokmerkefarge", + "SingleLineMaxLength": "Enkeltlinje maks lengde", + "OptimalCharsPerSec": "Optimalt tegn/sek", + "MaxCharsPerSec": "Maks tegn/sek", + "MaxWordsPerMin": "Maks ord/min", + "MinDurationMs": "Min. varighet (ms)", + "MaxDurationMs": "Maks varighet (ms)", + "MinGapMs": "Min. mellomrom (ms)", + "MaxLines": "Maks antall linjer", + "UnbreakSubtitlesShortThan": "Fjern linjedeling på undertekster kortere enn", + "NewEmptyDefaultMs": "Standard varighet for ny undertekst (ms)", + "PromptBeforeDelete": "Spør før sletting", + "RememberPositionAndSize": "Husk vindusposisjon og -størrelse", + "AutoBackupOn": "Auto-sikkerhetskopi", + "AutoBackupIntervalMinutes": "Intervall for auto-sikkerhetskopi (minutter)", + "AutoBackupDeleteAfterDays": "Behold auto-sikkerhetskopi i (dager)", + "AutoConvertToUtf8": "Auto-konverter til UTF-8 ved åpning", + "AutoTrimWhiteSpace": "Auto-trim mellomrom", + "DefaultEncoding": "Standard koding", + "ColorDurationTooShort": "Farg varighet hvis for kort", + "ColorDurationTooLong": "Farg varighet hvis for lang", + "ColorTextTooLong": "Farg tekst hvis for lang", + "ColorTextTooWide": "Farg tekst hvis for bred (piksler)", + "ColorTextTooManyLines": "Farg tekst hvis mer enn 2 linjer", + "ColorOverlap": "Farg tidskodeoverlapp", + "ColorGapTooShort": "Farg hvis mellomrommet er for kort", + "ErrorBackgroundColor": "Feil bakgrunnsfarge", + "WaveformDrawGridLines": "Tegn rutenettlinjer", + "WaveformCenterVideoPosition": "Sentrer videoposisjon", + "WaveformShowToolbar": "Vis verktøylinje", + "WaveformShowToolbarEdit": "Rediger verktøylinje...", + "WaveformSpectrogramCombinedWaveformHeight": "Bølgeform/spektrogram kombinert, bølgeform høyde %", + "ShowWaveformToolbarPlay": "Verktøylinje: vis spill-knapp", + "ShowWaveformToolbarRepeat": "Verktøylinje: vis gjenta-knapp", + "ShowWaveformToolbarRemoveBlankLines": "Verktøylinje: vis knapp for fjern tomme linjer", + "ShowWaveformToolbarNew": "Verktøylinje: vis knapp for ny undertekst", + "ShowWaveformToolbarSetStart": "Verktøylinje: vis knapp for sett start", + "ShowWaveformToolbarSetEnd": "Verktøylinje: vis knapp for sett slutt", + "ShowWaveformToolbarStartAndOffsetTheRest": "Verktøylinje: vis knapp for sett start og forskyv resten", + "ShowWaveformToolbarHorizontalZoom": "Verktøylinje: vis horisontal zoom-glidebryter", + "ShowWaveformToolbarVerticalZoom": "Verktøylinje: vis vertikal zoom-glidebryter", + "ShowWaveformToolbarVideoPositionSlider": "Verktøylinje: vis videoposisjons-glidebryter", + "ShowWaveformToolbarPlaybackSpeed": "Verktøylinje: vis avspillingshastighet", + "WaveformFocusTextboxAfterInsertNew": "Fokus tekstboks etter innsetting", + "WaveformInvertMouseWheel": "Inverter musehjul", + "WaveformSnapToShotChanges": "Fest til sceneskifter", + "WaveformShotChangesAutoGenerate": "Sceneskifter autogenerer", + "WaveformTextFontSize": "Bølgeform tekst skriftstørrelse", + "WaveformTextFontBold": "Bølgeform tekst fet skrift", + "WaveformTextColor": "Bølgeform tekstfarge", + "WaveformColor": "Bølgeformfarge", + "WaveformBackgroundColor": "Bølgeform bakgrunnsfarge", + "WaveformSelectedColor": "Bølgeform valgt farge", + "DownloadFfmpeg": "Last ned ffmpeg", + "ShowToolbarNew": "Vis ny-ikon", + "ShowToolbarOpen": "Vis åpne-ikon", + "ShowToolbarVideoFileOpen": "Vis videofil åpne-ikon", + "ShowToolbarSave": "Vis lagre-ikon", + "ShowToolbarSaveAs": "Vis lagre som-ikon", + "ShowToolbarFind": "Vis finn-ikon", + "ShowToolbarReplace": "Vis erstatt-ikon", + "ShowToolbarSpellCheck": "Vis stavekontroll-ikon", + "ShowToolbarFixCommonErrors": "Vis fiks vanlige feil-ikon", + "ShowToolbarSettings": "Vis innstillinger-ikon", + "ShowToolbarLayout": "Vis oppsett-ikon", + "ShowToolbarHelp": "Vis hjelp-ikon", + "ShowToolbarEncoding": "Vis koding", + "ShowToolbarFrameRate": "Vis bildefrekvens", + "ProxyAddress": "Proxy-adresse", + "Username": "Brukernavn", + "Password": "Passord", + "DefaultFormat": "Standard format", + "DefaultSaveAsFormat": "Standard \"Lagre som\"-format", + "FavoriteSubtitleFormats": "Favoritt undertekstformater", + "ShowStopButton": "Vis stopp-knapp", + "ShowFullscreenButton": "Vis fullskjermsknapp", + "AutoOpenVideoFile": "Åpne videofil automatisk når undertekst åpnes", + "DownloadMpv": "Last ned mpv", + "DownloadVlc": "Last ned VLC", + "GoToLineNumberSetsVideoPosition": "Gå-til-linjenummer setter også videoposisjon", + "AdjustAllTimesRememberLineSelectionChoice": "Juster alle tider, husk valg av linjeutvalg", + "FilesAndLogs": "Filer og logger", + "ShowErrorLogFile": "Vis feilloggfil", + "ShowWhisperLogFile": "Vis Whisper-loggfil", + "ShowSettingsFile": "Vis innstillingsfil", + "ShowAssaLayer": "Vis ASSA lag-boks", + "WaveformCursorColor": "Bølgeform markør/hodefarge", + "WaveformParagraphLeftColor": "Bølgeform venstre kantfarge", + "WaveformParagraphRightColor": "Bølgeform høyre kantfarge", + "WaveformFancyHighColor": "Bølgeform fancy høy farge", + "WaveformFocusOnMouseOver": "Fokus ved mus over", + "ResetAllSettings": "Tilbakestill alle innstillinger", + "ResetShortcuts": "Tilbakestill hurtigtaster", + "ResetRecentFiles": "Tilbakestill nylige filer", + "ResetMultipleReplaceRules": "Tilbakestill regler for søk og erstatt flere", + "ResetAppearance": "Tilbakestill utseende", + "ResetAutoTranslate": "Tilbakestill auto-oversett", + "ResetWindowPositionAndSize": "Tilbakestill vindusposisjon og -størrelse", + "ResetSettingsTitle": "Tilbakestill innstillinger", + "OpenRuleFile": "Åpne regelfil", + "ExportProfiles": "Eksporter profiler", + "SaveRuleProfilesFile": "Lagre profilregelfil", + "RuleProfilesExportedX": "{0} regelprofiler eksportert", + "RuleProfilesImportedX": "{0} regelprofiler importert", + "UseSpecialStyleAfterLongGaps": "Bruk spesialstil etter lange mellomrom", + "AddSpace": "Legg til mellomrom", + "ProcessIfEndsWithComma": "Behandle hvis slutter med komma", + "RemoveComma": "Fjern komma", + "EditContinuationStyleCustom": "Rediger egendefinert fortsettelsesstil", + "LongGapThreshold": "Terskel for lang mellomrom (ms)", + "AfterLongGap": "Etter langt mellomrom:", + "ResetSyntaxColoring": "Tilbakestill syntaksfarging", + "ResetWaveform": "Tilbakestill bølgeform", + "ResetRules": "Tilbakestill regler", + "UseFrameMode": "Bruk bildemodus (tt.mm.ss.bb)", + "TextBoxLimitNewLines": "Begrens antall linjer i undertekst-tekstboks", + "MpvVideoOutput": "Videoutgang (mpv)", + "MpvOpenGl": "libmpv - OpenGL", + "MpvSoftwareRendering": "libmpv - Programvare-rendering (treg)", + "MpvWidRendering": "libmpv - Native Window ID-rendering (raskere på Windows/Linux)", + "WaveFormsAndSpectrogramFoldersContainsX": "\"Waveforms\" og \"spectrogram\"-mapper inneholder {0}", + "DeleteWaveformAndSpectrogramFoldersQuestion": "Slett \"Waveforms\" og \"Spectrogram\"-filer?", + "WaveformGenerateSpectrogram": "Generer spektrogram", + "WaveformSpectrogramMode": "Spektrogrammodus", + "WaveformCenterOnSingleClick": "Sentrer ved enkeltklikk", + "WaveformSingleClickSelectsSubtitle": "Velg undertekst ved enkeltklikk", + "WaveformRightClickSelectsSubtitle": "Velg undertekst ved høyreklikk", + "WaveformPauseOnSingleClick": "Pause ved enkeltklikk", + "WaveformDrawStyle": "Bølgeform tegnestil", + "VlcWidRendering": "libVLC - Native Window ID-rendering", + "SubtitleSEnterKeyAction": "Undertekstrutenett Enter-tast handling", + "SubtitleSingleClickAction": "Undertekstrutenett enkeltklikk-handling", + "SubtitleDoubleClickAction": "Undertekstrutenett dobbeltklikk-handling", + "SaveAsBehavior": "\"Lagre som\"-atferd", + "SaveAsAppendLanguageCode": "\"Lagre som\" legg til språkkode", + "GridGoToSubtitleAndSetVideoPosition": "Gå til undertekst og sett videoposisjon", + "GridGoToNextLine": "Gå til neste linje", + "GridGoToSubtitleOnlyWaveformOnly": "Gå til undertekst bare (kun bølgeform)", + "GridGoToSubtitleAndPause": "Gå til undertekst og sett på pause", + "GridGoToSubtitleAndPlay": "Gå til undertekst og spill av", + "GridGoToSubtitleAndPauseAndFocusTextBox": "Gå til undertekst og pause og fokus tekstboks", + "SubtitleGridFormattingNone": "Ingen formatering", + "SubtitleGridFormattingShowFormatting": "Vis formatering", + "SubtitleGridFormattingShowTags": "Vis koder", + "WaveformParagraphBackgroundColor": "Bølgeform undertekst bakgrunnsfarge", + "WaveformParagraphSelectedBackgroundColor": "Bølgeform valgt undertekst bakgrunnsfarge", + "WaveformAllowOverlap": "Tillat overlapp (ved flytting/størrelsesendring)", + "SaveAsBehaviorUseSubtitleVideoFilename": "Bruk undertekst/videofilnavn", + "SaveAsBehaviorUseVideoSubtitleFilename": "Bruk video/undertekstfilnavn", + "SaveAsBehaviorUseVideoFileName": "Bruk videofilnavn", + "SaveAsBehaviorUseSubtitleFileName": "Bruk undertekstfilnavn", + "SaveAsAppendLanguageCodeTwoLetter": "To bokstaver", + "SaveAsAppendLanguageCodeThreeLetter": "Tre bokstaver", + "SaveAsAppendLanguageCodeLanguageName": "Språknavn", + "SplitOddLineActionWeightTop": "Vekt topp", + "SplitOddLineActionWeightBottom": "Vekt bunn", + "SplitOddLinesAction": "Del opp oddetall-linjer handling", + "OcrUseWordSplitList": "OCR: bruk ord-oppdelingsliste", + "SpeechToTextSelectedLinesPromptFistTimeOnly": "Tale til tekst: valgte linjer, spør om språk/motor kun første gang", + "MultipleReplaceShowDotDotDotButtons": "Søk og erstatt flere: vis kontekstmenyknapper", + "GridFocusTextboxAfterInsertNew": "Rutenett: fokus tekstboks etter innsetting av ny undertekst", + "UseFocusedButtonBackgroundColor": "Bruk fokusert knapp bakgrunnsfarge", + "FocusedButtonBackgroundColor": "Fokusert knapp bakgrunnsfarge", + "ForceCrLfOnSave": "Tving CR+LF ved lagring (tekstbaserte undertekstfiler)", + "ShowWaveformToolbarPlayNext": "Verktøylinje: vis spill neste knapp", + "ShowWaveformToolbarPlaySelection": "Verktøylinje: vis spill av utvalg knapp", + "TextBoxButtonShowAutoBreak": "Tekstboks: vis knapp for automatisk linjedeling", + "TextBoxButtonShowUnbreak": "Tekstboks: vis knapp for fjern linjedeling", + "TextBoxButtonShowItalic": "Tekstboks: vis kursiv-knapp", + "TextBoxButtonShowColor": "Tekstboks: vis farge-knapp", + "TextBoxButtonShowRemoveFormatting": "Tekstboks: vis knapp for fjern formatering", + "WaveformSingleClickAction": "Bølgeform enkeltklikk-handling", + "WaveformDoubleClickAction": "Bølgeform dobbeltklikk-handling (etter enkeltklikk-handling)", + "AllSettings": "Alle innstillinger", + "UiScale": "UI-skalering (%)", + "WaveformToolbarItems": "Bølgeform verktøylinjeelementer", + "MatchIconColorToDarkTheme": "Samsvar ikonfarge med mørkt tema forgrunnsfarge", + "SubtitlePreviewProperties": "Egenskaper for forhåndsvisning av undertekst", + "PixelWidthInfo": "Grønne linjer = maks-breddegrense | \r\nRødt område = tekst overskrider grensen" + }, + "Shortcuts": { + "Title": "Hurtigtaster", + "SearchShortcuts": "Søk etter hurtigtaster...", + "Filter": "Filter", + "CategoryGeneral": "Generelt", + "CategorySubtitleGridAndTextBox": "Undertekstrutenett og tekstboks", + "CategorySubtitleGrid": "Undertekstrutenett", + "CategoryWaveform": "Bølgeform", + "GeneralMergeSelectedLines": "Slå sammen valgte linjer", + "GeneralMergeWithPrevious": "Slå sammen med forrige", + "GeneralMergeWithNext": "Slå sammen med neste", + "GeneralMergeWithPreviousAndUnbreak": "Slå sammen med forrige og fjern linjedeling", + "GeneralMergeWithNextAndUnbreak": "Slå sammen med neste og fjern linjedeling", + "GeneralMergeWithPreviousAndAutoBreak": "Slå sammen med forrige og automatisk linjedeling", + "GeneralMergeWithNextAndAutoBreak": "Slå sammen med neste og automatisk linjedeling", + "GeneralMergeSelectedLinesAndAutoBreak": "Slå sammen valgte linjer og automatisk linjedeling", + "GeneralMergeSelectedLinesAndUnbreak": "Slå sammen valgte linjer og fjern linjedeling", + "GeneralMergeSelectedLinesAndUnbreakCjk": "Slå sammen valgte linjer og fjern linjedeling CJK", + "GeneralMergeSelectedLinesOnlyFirstText": "Slå sammen valgte linjer kun første tekst", + "GeneralMergeSelectedLinesBilingual": "Slå sammen valgte linjer tospråklig", + "GeneralMergeWithPreviousBilingual": "Slå sammen med forrige tospråklig", + "GeneralMergeWithNextBilingual": "Slå sammen med neste tospråklig", + "GeneralMergeOriginalAndTranslation": "Slå sammen original og oversettelse", + "GeneralToggleTranslationMode": "Veksle oversettelsesmodus", + "GeneralSwitchOriginalAndTranslation": "Bytt original og oversettelse", + "GeneralSwitchOriginalAndTranslationTextBoxes": "Bytt tekstbokser for original og oversettelse", + "GeneralChooseLayout": "Velg oppsett", + "GeneralLayoutChooseX": "Oppsett {0}", + "GeneralPlayFirstSelected": "Spill av første valgte", + "GeneralGoToFirstSelectedLine": "Gå til første valgte linje", + "GeneralGoToNextEmptyLine": "Gå til neste tomme linje", + "GeneralGoToNextSubtitle": "Gå til neste undertekst", + "GeneralGoToNextSubtitlePlayTranslate": "Gå til neste undertekst (spill av oversett)", + "GeneralGoToNextSubtitleCursorAtEnd": "Gå til neste undertekst (markør til slutt)", + "GeneralGoToPrevSubtitle": "Gå til forrige undertekst", + "GeneralGoToPrevSubtitlePlayTranslate": "Gå til forrige undertekst (spill av oversett)", + "GeneralGoToStartOfCurrentSubtitle": "Gå til start av gjeldende undertekst", + "GeneralGoToEndOfCurrentSubtitle": "Gå til slutt av gjeldende undertekst", + "GeneralGoToPreviousSubtitleAndFocusVideo": "Gå til forrige undertekst og fokuser på video", + "GeneralGoToNextSubtitleAndFocusVideo": "Gå til neste undertekst og fokuser på video", + "GeneralGoToPrevSubtitleAndPlay": "Gå til forrige undertekst og spill av", + "GeneralGoToNextSubtitleAndPlay": "Gå til neste undertekst og spill av", + "GeneralGoToPreviousSubtitleAndFocusWaveform": "Gå til forrige undertekst og fokuser på bølgeform", + "GeneralGoToNextSubtitleAndFocusWaveform": "Gå til neste undertekst og fokuser på bølgeform", + "GeneralGoToLineNumber": "Gå til linjenummer", + "GeneralGoToVideoPosition": "Gå til videoposisjon", + "GeneralToggleItalic": "Veksle kursiv", + "GeneralToggleBold": "Veksle fet skrift", + "GeneralToggleBookmarks": "Veksle bokmerker", + "GeneralFocusTextBox": "Fokus tekstboks", + "GeneralToggleBookmarksWithText": "Veksle bokmerker med tekst", + "GeneralEditBookmarks": "Rediger bokmerker", + "FileNew": "Ny", + "FileOpen": "Åpne", + "FileOpenKeepVideo": "Åpne (behold video)", + "FileSave": "Lagre", + "FileSaveAs": "Lagre som", + "FileSaveAll": "Lagre alle", + "FileSaveOriginal": "Lagre original", + "FileSaveOriginalAs": "Lagre original som", + "FileOpenOriginalSubtitle": "Åpne original undertekst", + "FileCloseOriginalSubtitle": "Lukk original undertekst", + "FileTranslatedSubtitle": "Oversatt undertekst", + "FileCompare": "Sammenlign", + "FileStatistics": "Statistikk", + "FileImportPlainText": "Importer klartekst", + "FileImportBluRaySupForOcr": "Importer Blu-ray SUP for OCR", + "FileImportBluRaySupForEdit": "Importer Blu-ray SUP for redigering", + "FileImportTimeCodes": "Importer tidskoder", + "FileExportEbuStl": "Eksporter EBU STL", + "FileExportPac": "Eksporter PAC", + "FileExportEdlClipName": "Eksporter EDL klipnavn", + "FileExportPlainText": "Eksporter klartekst", + "FileExportCustomTextFormat1": "Eksporter egendefinert tekstformat 1", + "FileExportCustomTextFormat2": "Eksporter egendefinert tekstformat 2", + "FileExportCustomTextFormat3": "Eksporter egendefinert tekstformat 3", + "FileExit": "Avslutt", + "OpenSeDataFolder": "Åpne Subtitle Edit-mappe", + "EditFind": "Finn", + "EditFindNext": "Finn neste", + "EditFindPrevious": "Finn forrige", + "EditReplace": "Erstatt", + "EditMultipleReplace": "Søk og erstatt flere", + "EditModifySelection": "Endre utvalg", + "ListSelectAll": "Velg alle", + "ListSelectFirst": "Velg første", + "ListSelectLast": "Velg siste", + "ListInverseSelection": "Inverter utvalg", + "ListDeleteSelection": "Slett utvalg", + "RippleDeleteSelection": "Krusning-slett utvalg", + "Settings": "Innstillinger", + "Assigned": "Tilordnet", + "Unassigned": "Ikke tilordnet", + "PressedKeyX": "Trykket tast: {0}", + "PressAKey": "Trykk en tast", + "DetectKey": "Gjenkjenn tast", + "Control": "Control", + "Alt": "Alt", + "Win": "Win", + "Shift": "Shift", + "ControlMac": "⌃", + "AltMac": "⌥", + "WinMac": "⌘", + "ShiftMac": "⇧", + "ResetShortcuts": "Tilbakestill hurtigtaster", + "ResetShortcutsDetail": "Vil du tilbakestille alle hurtigtaster til standardverdier?", + "TogglePlayPause": "Veksle spill/pause", + "ToggleLockTimeCodes": "Veksle lås tidskoder", + "DuplicateSelectedLines": "Dupliser valgte linjer", + "SourceView": "Kildevisning", + "ShowAlignmentPicker": "Justering", + "AddOrEditBookmark": "Legg til eller rediger bokmerke", + "ListBookmarks": "Vis bokmerker", + "ToggleBookmark": "Veksle bokmerke (valgte linjer, ingen tekst)", + "GoToNextBookmark": "Gå til neste bokmerke", + "ToggleWaveformToolbar": "Veksle verktøylinje for bølgeform", + "WaveformSetStartAndSetEndOfPreviousMinusGap": "Sett start og sett slutt for forrige minus mellomrom", + "WaveformSetEndAndStartOfNextAfterGap": "Sett slutt og start for neste pluss mellomrom", + "WaveformSetEndAndStartOfNextAfterGapAndGoToNext": "Sett slutt og start for neste pluss mellomrom og gå til neste", + "FetchFirstWordFromNextSubtitle": "Hent første ord fra neste undertekst", + "MoveLastWordToNextSubtitle": "Flytt siste ord til neste undertekst", + "MoveLastWordFromFirstLineDownCurrentSubtitle": "Flytt siste ord fra første linje ned (gjeldende undertekst)", + "MoveFirstWordFromNextLineUpCurrentSubtitle": "Flytt første ord fra neste linje opp (gjeldende undertekst)", + "ToggleFocusGridAndWaveform": "Veksle fokus mellom undertekstrutenett og bølgeform/spektrogram", + "ToggleFocusTextBoxAndWaveform": "Veksle fokus mellom tekstboks og bølgeform/spektrogram", + "ToggleFocusTextBoxAndGrid": "Veksle fokus mellom tekstboks og undertekstrutenett", + "GoToPreviousLineAndSetVideoPosition": "Gå til forrige undertekst og sett videoposisjon", + "GoToPreviousLineFromVideoPosition": "Gå til forrige undertekst (fra gjeldende videoposisjon)", + "GoToNextLineFromVideoPosition": "Gå til neste undertekst (fra gjeldende videoposisjon)", + "GoToNextLineAndSetVideoPosition": "Gå til neste undertekst og sett videoposisjon", + "TextBoxDeleteSelectionNoClipboard": "Tekstboks: Slett utvalg (ingen utklippstavle)", + "TextBoxCut": "Tekstboks: Klipp ut", + "TextBoxCut2": "Tekstboks: Klipp ut (alternativ)", + "TextBoxPaste": "Tekstboks: Lim inn", + "TextBoxCopy": "Tekstboks: Kopier", + "TextBoxSelectAll": "Tekstboks: Velg alle", + "SubtitleGridCut": "Undertekstrutenett: Klipp ut", + "SubtitleGridCopy": "Undertekstrutenett: Kopier", + "SubtitleGridPaste": "Undertekstrutenett: Lim inn", + "SetShortcutForX": "Angi hurtigtast for \"{0}\"", + "CommandFileNewKeepVideo": "Ny (behold video)", + "FileOpenOriginal": "Åpne original", + "FileCloseOriginal": "Lukk original", + "RestoreAutoBackup": "Gjenopprett auto-sikkerhetskopi", + "OpenContainingFolder": "Åpne inneholdende mappe", + "ImportTimeCodes": "Importer tidskoder", + "ImportSubtitleWithManuallyChosenEncoding": "Importer undertekst med manuelt valgt koding", + "ExportBluRaySup": "Eksporter Blu-ray SUP", + "ExportCustomTextFormat": "Eksporter egendefinert tekstformat", + "ExportPlainText": "Eksporter klartekst", + "ShowHistory": "Vis historikk", + "ToggleRightToLeft": "Veksle høyre-til-venstre", + "ModifySelection": "Endre utvalg", + "AdjustDurations": "Juster varigheter", + "ApplyDurationLimits": "Bruk varighetsgrenser", + "BatchConvert": "Satsvis konvertering", + "BridgeGaps": "Tett hull", + "ApplyMinGap": "Bruk min. mellomrom", + "FixCommonErrors": "Fiks vanlige feil", + "MakeEmptyTranslationFromCurrentSubtitle": "Lag tom oversettelse fra gjeldende undertekst", + "MergeLinesWithSameText": "Slå sammen linjer med samme tekst", + "MergeLinesWithSameTimeCodes": "Slå sammen linjer med samme tidskoder", + "SplitBreakLongLines": "Del opp / balanser lange linjer", + "MergeShortLines": "Slå sammen korte linjer", + "RemoveTextForHearingImpaired": "Fjern tekst for hørselshemmede", + "JoinSubtitles": "Slå sammen undertekster", + "SplitSubtitle": "Del opp undertekst", + "SpellCheck": "Stavekontroll", + "SpellCheckGetDictionary": "Hent ordbok for stavekontroll", + "OpenVideo": "Åpne video", + "OpenVideoFromUrl": "Åpne video fra nettadresse", + "CloseVideo": "Lukk video", + "SpeechToText": "Tale til tekst (Whisper)", + "TextToSpeech": "Tekst til tale", + "BurnIn": "Generer video med innbrente undertekster", + "GenerateTransparent": "Generer gjennomsiktig video med undertekster", + "UndockVideoControls": "Koble fra videokontroller", + "RedockVideoControls": "Fest videokontroller på nytt", + "GenerateBlankVideo": "Generer blank video", + "ReencodeVideo": "Omkod video", + "CutVideo": "Klipp video", + "CutVideoSelectedLines": "Klipp video (valgte linjer)", + "AdjustAllTimes": "Juster alle tider", + "VisualSync": "Visuell synkronisering", + "TranslateViaCopyPaste": "Oversett via kopier-lim inn", + "Shortcuts": "Hurtigtaster", + "WordLists": "Ordlister", + "ChooseUiLanguage": "Velg språk for grensesnitt", + "ChooseRuleProfile": "Velg regelprofil", + "VideoFullScreen": "Video fullskjerm", + "CopyTextFromOriginalSelectedLines": "Kopier tekst fra original (valgte linjer)", + "TextBoxRemoveAllFormatting": "Tekstboks, fjern all formatering", + "TextBoxItalic": "Tekstboks kursiv", + "ResetWaveformZoomAndSpeed": "Tilbakestill bølgeform zoom og avspillingshastighet", + "TogglePlaybackSpeed": "Veksle avspillingshastighet", + "PlaybackSpeedSlower": "Avspillingshastighet saktere", + "PlaybackSpeedFaster": "Avspillingshastighet raskere", + "SwitchOriginalAndTranslationSelectedLines": "Bytt original og oversettelse (valgte linjer)", + "MergeOriginalIntoTranslationSelectedLines": "Slå sammen original og oversettelse (valgte linjer)", + "SeekSilence": "Søk stillhet", + "SetVideoPositionCurrentSubtitleStart": "Sett videoposisjon til gjeldende linjestart", + "SetVideoPositionCurrentSubtitleEnd": "Sett videoposisjon til gjeldende linjeslutt", + "ToggleAudioTracks": "Veksle lydspor", + "ListErrors": "Vis feil", + "GoToNextError": "Gå til neste feil", + "GoToPreviousError": "Gå til forrige feil", + "AddNameToNameList": "Legg til navn i navneliste", + "FindDoubleWords": "Finn doble ord", + "FindDoubleLines": "Finn doble linjer", + "ColorX": "Farge {0}", + "RemoveColor": "Fjern farge", + "SurroundWith": "Omgi med...", + "SurroundWithXY": "Omgi med {0}/{1}", + "RepeatLine": "Gjenta linje", + "RepeatPreviousLine": "Gjenta forrige linje", + "RepeatNextLine": "Gjenta neste linje", + "MoveVideoPositionMilliseconds": "Flytt videoposisjon i millisekunder", + "ImportShortcutsTitle": "Importer hurtigtaster", + "ExportShortcutsTitle": "Eksporter hurtigtaster", + "XShortcutsImportedFromY": "{0} hurtigtaster importert fra {1}", + "XShortcutsExportedToY": "{0} hurtigtaster eksportert til {1}", + "ImportImageSubtitleForEdit": "Importer bildebasert undertekst for redigering", + "ShowPointSyncViaOther": "Vis punktsynkronisering via annen undertekst", + "ShowPointSync": "Vis punktsynkronisering", + "ShowMediaInformation": "Vis medieinformasjon", + "ChooseSubtitleFormat": "Velg undertekstformat", + "TrimWhitespaceSelectedLines": "Trim mellomrom (valgte linjer)", + "WaveformHorizontalZoomInCommand": "Bølgeform horisontal zoom inn", + "WaveformHorizontalZoomOutCommand": "Bølgeform horisontal zoom ut", + "WaveformVerticalZoomInCommand": "Bølgeform vertikal zoom inn", + "WaveformVerticalZoomOutCommand": "Bølgeform vertikal zoom ut", + "CopySubtitlePathToClipboard": "Kopier undertekststi til utklippstavle", + "CopySubtitleOriginalPathToClipboard": "Kopier undertekststi for original til utklippstavle", + "FocusTextBox": "Fokus tekstboks", + "SortByStartTime": "Sorter etter \"Vis\"-tid", + "SortByEndTime": "Sorter etter \"Skjul\"-tid", + "DuplicatesFound": "Følgende dupliserte hurtigtaster ble funnet:", + "CopyTextToClipboard": "Kopier tekst til utklippstavle (valgte linjer)", + "CopyTextFromOriginalToClipboard": "Kopier tekst fra original til utklippstavle (valgte linjer)", + "AssaDraw": "ASSA Tegn", + "AssaGenerateProgressBar": "ASSA Generer fremdriftslinje", + "AssaGenerateBackgroundBox": "ASSA Generer bakgrunnsboks", + "AssaStyles": "ASSA Stiler", + "AssaProperties": "ASSA Egenskaper", + "AssaAttachments": "ASSA Vedlegg", + "AssaVideoColorPicker": "ASSA Videofargevelger", + "RecalculateDurationSelectedLines": "Beregn varighet på nytt (valgte linjer)", + "ToggleWaveformAndSpectrogramHeight": "Veksle delt høyde for bølgeform/spektrogram", + "ToggleSpectrogramStyle": "Veksle spektrogramstil", + "CopyMsRelativeToCurrentSubtitleLineToClipboard": "Kopier millisekunder relativt til gjeldende undertekstlinje til utklippstavle", + "LayoutZoomIn": "Oppsett zoom inn (skaler grensesnitt)", + "LayoutZoomOut": "Oppsett zoom ut (skaler grensesnitt)" + }, + "WordLists": { + "Title": "Ordlister", + "AddName": "Legg til navn", + "AddWord": "Legg til ord", + "AddPair": "Legg til par", + "NameAndIgnoreList": "Navn/ignoreringsliste", + "UserWords": "Brukerordliste", + "OcrFixList": "OCR fikseliste", + "UnableToAddItem": "Kunne ikke legge til element, det finnes sannsynligvis allerede!", + "UnableToRemoveItem": "Kunne ikke fjerne element!" + }, + "ChooseLanguage": { + "Title": "Velg språk for brukergrensesnitt" + } + }, + "Help": { + "AboutSubtitleEdit": "Om Subtitle Edit", + "CheckForUpdates": "Se etter oppdateringer", + "CheckForUpdatesChecking": "Ser etter oppdateringer...", + "CheckForUpdatesUpToDate": "Du kjører den nyeste versjonen.", + "CheckForUpdatesNewVersionAvailable": "Ny versjon tilgjengelig: {0}", + "CheckForUpdatesUnableToCheck": "Kunne ikke se etter oppdateringer.", + "CheckForUpdatesDownloadNewVersion": "Last ned ny versjon" + }, + "Ocr": { + "LinesToDraw": "Linjer å tegne", + "CurrentImage": "Gjeldende bilde", + "AutoDrawAgain": "Autotegn igjen", + "StartOcr": "Start OCR", + "PauseOcr": "Pause OCR", + "InspectLine": "Inspiser linje...", + "OcrEngine": "OCR-motor", + "Database": "Database", + "MaxWrongPixels": "Maks feil piksler", + "MaxErrorPct": "Maks feil %", + "NumberOfPixelsIsSpace": "Antall piksler som er mellomrom", + "InspectImageMatches": "Inspiser bildetreff", + "ResolutionXYAndTopmarginZ": "Oppløsning {0}x{1}, toppmarg {2}", + "RunningOcrDotDotDotXY": "Kjører OCR... {0}/{1}", + "RunningOcrDotDotDot": "Kjører OCR...", + "AutoSubmitFirstCharacter": "Auto-send inn første tegn", + "EditNOcrDatabase": "Rediger nOCR-database", + "ZoomFactorX": "Zoom-faktor: {0}x", + "ExpandInfoX": "Utvid antall: {0}", + "EditNOcrDatabaseXWithYItems": "Rediger nOCR-database {0} med {1:#,###,##0} elementer", + "NewNOcrDatabase": "Ny nOCR-database", + "RenameNOcrDatabase": "Gi nOCR-database nytt navn", + "NOcrDatabase": "nOCR-database", + "DrawMode": "Tegnemodus:", + "AddNewCharcter": "Legg til nytt tegn", + "LineIndexX": "Linje {0}", + "InspectNOcrAdditions": "Inspiser nye nOCR-tillegg", + "OcrSelectedLines": "OCR valgte linjer", + "ShowImage": "Vis bilde", + "FixOcrErrors": "Fiks OCR-feil", + "PromptForUknownWords": "Spør om ukjente ord", + "TryToGuessUnknownWords": "Prøv å gjette ukjente ord", + "AutoBreakIfMoreThanXLines": "Auto-bryt hvis mer enn {0} linjer", + "UnknownWords": "Ukjente ord", + "AllFixes": "Alle rettelser", + "GuessesUsed": "Gjetninger brukt", + "Ocr": "OCR", + "OcrX": "OCR - {0}", + "AddBetterMatch": "Legg til bedre treff", + "NOcrInspectImageMatches": "nOCR - Inspiser bildetreff", + "AddToOcrPair": "Legg til i OCR-erstatt-par", + "AddNameToOcrReplaceList": "Legg til navn i OCR-erstatt-liste", + "WordToAdd": "Ord å legge til", + "NameToAdd": "Navn å legge til", + "ChangeWordFromTo": "Endre ord fra/til", + "ClearBackground": "Fjern bakgrunn", + "ClearForeground": "Fjern forgrunn", + "NOcrDrawHelp": "Tips for tegning\r\n────────────────────\r\n• Hold Ctrl nede for å fortsette linjen\r\n• Ctrl+z=angre, Ctrl+y=gjør om", + "EditWholeText": "Rediger hele teksten", + "EditWordOnly": "Rediger bare ordet", + "ImagePreProcessing": "Bilde-forhåndsbehandling", + "PreProcessingTitle": "Forhåndsbehandling", + "CropTransparent": "Beskjær gjennomsiktige farger", + "InverseColors": "Inverter farger", + "RemoveBorders": "Fjern grenser", + "Binarize": "Binariser", + "BorderSize": "Grensestørrelse", + "CaptureTopAlign": "Fangst toppjustering", + "OcrImage": "OCR bilde", + "OneColor": "Én farge (hvit)", + "DarknessThreshold": "Mørkhetsterskel", + "EditExportDotDotDot": "Rediger/eksporter...", + "EditBinaryOcrDatabase": "Rediger \"Binær bildesammenligning\"-database", + "BinaryImageCompareDatabase": "\"Binær bildesammenligning\"-database", + "RemoveXFromUnknownWordsList": "Fjern \"{0}\" fra liste over ukjente ord", + "DownloadingPaddleOcrEngineDotDotDot": "Laster ned Paddle OCR-motor...", + "DownloadingPaddleOcrModelsDotDotDot": "Laster ned Paddle OCR-modeller...", + "PaddleOcr": "Paddle OCR", + "BinaryImageCompareInspectImageMatches": "\"Binær bildesammenligning\" - Inspiser bildetreff" + }, + "Assa": { + "AssaDraw": "ASSA Tegn", + "DrawSelectTool": "Velg (flytt punkter)", + "DrawLineTool": "Linjeverktøy (F4)", + "DrawBezierTool": "Bezier-kurve (F5)", + "DrawRectangleTool": "Rektangel (F6)", + "DrawCircleTool": "Sirkel (F7)", + "DrawCloseShape": "Lukk form (F8/Enter)", + "DrawDeleteShape": "Slett form (Del)", + "DrawChangeLayer": "Endre lag", + "DrawClearAll": "Tøm alt (Ctrl+N)", + "DrawZoomIn": "Zoom inn (Ctrl++)", + "DrawZoomOut": "Zoom ut (Ctrl+-)", + "DrawResetView": "Tilbakestill visning (Ctrl+0)", + "DrawToggleGrid": "Veksle rutenett (Ctrl+G)", + "DrawCopyToClipboard": "Kopier til utklippstavle (Ctrl+C)", + "DrawShapes": "Former", + "DrawSelectedPoint": "Valgt punkt", + "DrawSelectedShape": "Valgt form", + "DrawSelectedLayer": "Valgt lag", + "DrawToolX": "Verktøy: {0}", + "DrawHelpText": "Klikk for å legge til punkter • Enter/F8 for å lukke form • Shift+Dra for å panorere • Ctrl+Rull for å zoome", + "ProgressBarTitle": "ASSA fremdriftslinje", + "ProgressBarSettings": "Fremdriftslinje", + "ProgressBarPosition": "Posisjon", + "ProgressBarBottom": "Bunn", + "ProgressBarTop": "Topp", + "ProgressBarForeColor": "Forgrunnsfarge", + "ProgressBarBackColor": "Bakgrunnsfarge", + "ProgressBarStyle": "Stil", + "ProgressBarSquareCorners": "Firkantede hjørner", + "ProgressBarRoundedCorners": "Avrundede hjørner", + "ProgressBarChapters": "Kapitler", + "ProgressBarSplitterWidth": "Deler-bredde", + "ProgressBarSplitterHeight": "Deler-høyde", + "ProgressBarXAdjustment": "X-justering", + "ProgressBarYAdjustment": "Y-justering", + "ProgressBarTextAlignment": "Tekstjustering", + "ProgressBarTakePosFromVideo": "Hent posisjon fra video", + "ProgressBarPreview": "Forhåndsvisning", + "ResolutionResamplerTitle": "Endre oppløsning", + "ResolutionResamplerSourceRes": "Kildeoppløsning", + "ResolutionResamplerTargetRes": "Måloppløsning", + "ResolutionResamplerChangeMargins": "Endre marger", + "ResolutionResamplerChangeFontSize": "Endre skriftstørrelse", + "ResolutionResamplerChangePositions": "Endre posisjoner", + "ResolutionResamplerChangeDrawing": "Endre tegning", + "ResolutionResamplerFromVideo": "Fra video...", + "ResolutionResamplerSourceAndTargetEqual": "Kilde- og måloppløsning er lik - ingenting å gjøre.", + "ResolutionResamplerNothingSelected": "Vennligst velg minst ett alternativ å endre.", + "BackgroundBoxGenerator": "Generer bakgrunnsboks", + "BackgroundBoxPadding": "Utfylling", + "BackgroundBoxFillWidth": "Fyll bredde", + "BackgroundBoxBoxColor": "Boksfarge", + "BackgroundBoxRadius": "Radius", + "BackgroundBoxCircle": "Sirkel", + "BackgroundBoxSpikes": "Pigger", + "BackgroundBoxBubbles": "Bobler", + "BackgroundBoxWave": "Bølge", + "BackgroundBoxHexagon": "Sekskant", + "BackgroundBoxTornPaper": "Revet papir", + "BackgroundBoxCloud": "Sky", + "BackgroundBoxTornPaperDouble": "Revet papir (topp & bunn)", + "BackgroundBoxStarburst": "Stjerneburst", + "BackgroundBoxScroll": "Skriftrull / Pergament", + "StylesTitle": "Advanced Sub Station Alpha-stiler", + "StylesInFile": "Stiler i fil", + "StylesSaved": "Stiler lagret", + "StylesTitleX": "Stiler - {0}", + "PropertiesTitleX": "Egenskaper - {0}", + "AttachmentsTitleX": "Vedlegg - {0}", + "SmartWrappingTopWide": "0: Smart innpakking (topp vid)", + "EndOfLineWrapping": "1: Slutt-på-linje orddeling, bare \\N bryter", + "NoWrapping": "2: Ingen innpakking, både \\N og \\n bryter", + "SmartWrappingBottomWide": "3: Smart innpakking (bunn vid)", + "FontsAndGraphics": "Skrifter og grafikk", + "WrapStyle": "Innpakkingsstil", + "BorderAndShadowScaling": "Kant- og skyggeskalering", + "OriginalScript": "Originalskript", + "Graphics": "Grafikk", + "CopyToStorageStyles": "Kopier til lagringsstiler", + "CopyToFileStyles": "Kopier til filstiler", + "SetStyleAsDefault": "Sett stil som standard", + "TakeUsagesFromDotDotDot": "Hent bruk fra...", + "NoAttachmentsFound": "Ingen vedlegg funnet i den valgte ASSA-filen.", + "DeleteStyleQuestion": "Slett stil?", + "DeleteStylesQuestion": "Slett stiler?", + "OpenStyleImportFile": "Åpne undertekstfil å importere stiler fra", + "Primary": "Primær", + "Secondary": "Sekundær", + "ApplyOverrideTags": "Bruk overstyringskoder", + "ChooseOverrideTagToAdd": "Velg overstyringskode å legge til", + "FontSizeChange": "Skriftstørrelsesendring", + "MoveTextFromLeftToRight": "Flytt tekst fra venstre til høyre", + "ColorFromWhiteToRed": "Farge fra hvit til rød", + "RotateXSlow": "Roter X (sakte)", + "RotateX": "Roter X", + "RotateY": "Roter Y", + "RotateTilt": "Roter tilt", + "SpaceIncrease": "Mellomromsøkning", + "PopIn": "Pop inn", + "SpinIn": "Spinn inn", + "PlayCurrent": "Spill gjeldende", + "SetPosition": "Angi posisjon", + "ImageColorPicker": "Bilde fargevelger", + "CopyColorAsHextoClipboard": "Kopier farge som hex til utklippstavle", + "GeneratingBackgroundBoxXOfY": "Genererer bakgrunnsboks {0} av {1}...", + "ApplyAdvancedEffectTitle": "Bruk avansert effekt", + "ChooseEffect": "Velg effekt", + "AdvancedEffectTypewriter": "Skrivemaskin", + "AdvancedEffectTypewriterDescription": "Avslører tekst ett tegn om gangen over undertekstens varighet", + "AdvancedEffectTypewriterWithHighlight": "Skrivemaskin med utheving", + "AdvancedEffectTypewriterWithHighlightDescription": "Avslører tekst ett tegn om gangen med en glødende utheving på det gjeldende tegnet", + "AdvancedEffectWordByWord": "Ord for ord", + "AdvancedEffectWordByWordDescription": "Avslører tekst ett ord om gangen over undertekstens varighet", + "AdvancedEffectKaraoke": "Karaoke", + "AdvancedEffectKaraokeDescription": "Uthever hvert tegn i sekvens, og avslører teksten fra venstre til høyre som karaoke-tekster", + "AdvancedEffectFancyKaraoke": "Karaoke - aktivt ord pop", + "AdvancedEffectFancyKaraokeDescription": "Forbedrer undertekster med et forhåndsmarkert aktivt ord (via \\u1 understreking eller uthevingsfarge) — demper inaktive ord og bruker en pop-glød-animasjon på det aktive ordet", + "AdvancedEffectScrambleReveal": "Kode-avsløring", + "AdvancedEffectScrambleRevealDescription": "Krypterte tegn dekodes til den virkelige teksten fra venstre til høyre", + "AdvancedEffectRainbowPulse": "Regnbue-puls", + "AdvancedEffectRainbowPulseDescription": "Hvert tegn går gjennom regnbuefarger uavhengig av hverandre", + "AdvancedEffectWave": "Bølge", + "AdvancedEffectWaveDescription": "Hvert tegn pulserer opp og ned med en rullende sinusbølge-effekt", + "AdvancedEffectWaveBlue": "Bølge (blå)", + "AdvancedEffectWaveBlueDescription": "Hvert tegn pulserer i en bølge med blå og cyan fargeanimasjon", + "AdvancedEffectStarWarsScroll": "Star Wars-rulling", + "AdvancedEffectStarWarsScrollDescription": "Ruller tekst fra bunn til topp med en perspektivtilt, som i Star Wars' åpningstekst", + "AdvancedEffectEndCreditsScroll": "Rulletekst", + "AdvancedEffectEndCreditsScrollDescription": "Ruller alle undertekstlinjer fra bunn til topp som en kontinuerlig rulletekst", + "AdvancedEffectStarfield": "Uendelig stjernefelt (bakgrunn)", + "AdvancedEffectStarfieldDescription": "Kontinuerlig warp-speed stjernefelt-effekt", + "AdvancedEffectRain": "Uendelig regn (bakgrunn)", + "AdvancedEffectRainDescription": "Kontinuerlig regn med dybdeskarphet-lag", + "AdvancedEffectSnow": "Uendelig snø (bakgrunn)", + "AdvancedEffectSnowDescription": "Kontinuerlig snøfall med dybdeskarphet-lag", + "AdvancedEffectOldMovie": "Gammel film-effekt (bakgrunn)", + "AdvancedEffectOldMovieDescription": "Simulerer en vintage 35mm filmprojektor med støy, vignett og riper", + "AdvancedEffectNeonBurst": "Neon-utbrudd", + "AdvancedEffectNeonBurstDescription": "Høyenergi 'Shorts'-stiltekster med neon-glød og skaler-inn 'pop'-animasjon", + "AdvancedEffectSettings": "Innstillinger", + "AdvancedEffectSnowFlakeCount": "Antall fnugg", + "AdvancedEffectStarfieldStarCount": "Antall stjerner", + "AdvancedEffectStarfieldSpeed": "Hastighet", + "AdvancedEffectGlitch": "Glitch", + "AdvancedEffectGlitchDescription": "Digital glitch med kromatisk avvik, hvite blink og forvrengningsoverlegg", + "AdvancedEffectBounceIn": "Sprett inn", + "AdvancedEffectBounceInDescription": "Hvert tegn spretter inn med elastisk pop-animasjon, forskjøvet fra venstre til høyre", + "AdvancedEffectFireflies": "Ildfluer (bakgrunn)", + "AdvancedEffectFirefliesDescription": "Varme glødende gul-ravfargede prikker driver organisk over skjermen med pulserende glød", + "AdvancedEffectMatrix": "Matrix", + "AdvancedEffectMatrixDescription": "Fallende grønne tegnsøyler hvor underteksten bygges opp bokstav for bokstav fra regnet", + "AdvancedEffectAudioBars": "Lydstolper (bølgeform)", + "AdvancedEffectAudioBarsDescription": "Animerte equalizer-stolper drevet av lydbølgeformen — stolper ruller mot venstre som en bølgeform og pulserer med lyden", + "AdvancedEffectAudioPulse": "Lydtekst-puls", + "AdvancedEffectAudioPulseDescription": "Underteksten gløder og pulserer med lydvolumet — stille partier viser normal tekst, høye topper legger til en farget glorie og en liten oppskalering", + "AdvancedEffectConfetti": "Konfetti-utbrudd", + "AdvancedEffectConfettiDescription": "Eksplosivt utbrudd av fargerik spinnende papirkonfetti fra hjørnene og en stjerneburst i midten for hver undertekst", + "AdvancedEffectHearts": "Hjerter (regn)", + "AdvancedEffectHeartsDescription": "Bezier-tegnede hjerter i tre former regner forsiktig fra toppen av skjermen, tumler og fader gjennom hele underteksten", + "AdvancedEffectWordSpacing": "Ordavstand", + "AdvancedEffectWordSpacingDescription": "Øker avstanden mellom ord ved hjelp av \\fsp-koden for bedre lesbarhet", + "AdvancedEffectFancyKaraokeAutoDetectActiveWord": "Autodetekter aktivt ord", + "AdvancedEffectFancyKaraokeGlow": "Aktivt ord-glød", + "AdvancedEffectFancyKaraokeActiveColor": "Aktiv farge", + "AdvancedEffectFancyKaraokeInactiveColor": "Inaktiv farge", + "AdvancedEffectFancyKaraokeInactiveOpacity": "Inaktiv ugjennomsiktighet (0-255)", + "AdvancedEffectWordSpacingPixels": "Avstand (piksler)", + "AdvancedEffectSlowZoomOut": "Sakte zoom-ut", + "AdvancedEffectSlowZoomOutDescription": "Teksten starter litt større og krymper forsiktig til normal størrelse over undertekstens varighet", + "AdvancedEffectSlowZoomIn": "Sakte zoom-inn", + "AdvancedEffectSlowZoomInDescription": "Teksten starter i normal størrelse og vokser forsiktig over undertekstens varighet", + "AdvancedEffectFadeIn": "Overgang - inntoning", + "AdvancedEffectFadeInDescription": "En per-linje inntoning-effekt hvor skjermen starter svart og avslører videoen.", + "AdvancedEffectFadeOut": "Overgang - uttoning", + "AdvancedEffectFadeOutDescription": "En per-linje uttoning-effekt hvor skjermen ender svart.", + "AdvancedEffectTvClose": "Overgang - TV-slukking", + "AdvancedEffectTvCloseDescription": "Svarte stenger vokser innover fra topp og bunn mens midten tones til hvit (svart topp / hvit midt / svart bunn). Andre halvdel er helt svart.", + "AdvancedEffectSlideInLeft": "Gli inn fra venstre", + "AdvancedEffectSlideInLeftDescription": "Teksten glir inn fra utenfor skjermen til venstre, holdes, og går deretter tilbake til venstre", + "AdvancedEffectSlideInRight": "Gli inn fra høyre", + "AdvancedEffectSlideInRightDescription": "Teksten glir inn fra utenfor skjermen til høyre, holdes, og går deretter tilbake til høyre", + "AdvancedEffectFadeInOut": "Inntoning/uttoning", + "AdvancedEffectFadeInOutDescription": "Teksten tones inn i begynnelsen og tones ut på slutten av hver undertekst", + "OverrideTagsHistory": "Historikk for overstyringskoder" + }, + "About": { + "Title": "Om Subtitle Edit", + "TranslatedBy": "Oversatt av: {0}", + "LicenseText": "Subtitle Edit er gratis programvare under MIT-lisensen.", + "DescriptionTextBeta": "Subtitle Edit 5 beta er en utviklingsversjon av vår kommende store utgivelse.\nVi foredler aktivt de nye verktøyene og setter pris på din hjelp med testing.\nVennligst del tilbakemeldingen din for å hjelpe oss med å sikre en best mulig endelig versjon.\n\nTakk for at du er en del av Subtitle Edit-samfunnet! :)", + "IssueTrackingAndSourceCode": "Feilsporing og kildekode: ", + "GitHub": "Github", + "Donate": "Doner: ", + "PayPal": "PayPal", + "GitHubSponsor": "Github sponsor", + "Or": " eller " + } +} \ No newline at end of file From ed145bfce7dd433a950c14b51769caaf16cb8918 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 19:14:32 +0200 Subject: [PATCH 33/74] Work on https://github.com/SubtitleEdit/subtitleedit/discussions/10545#discussioncomment-16465746 --- src/UI/Features/SpellCheck/WordSpellCheck.cs | 221 +++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 src/UI/Features/SpellCheck/WordSpellCheck.cs diff --git a/src/UI/Features/SpellCheck/WordSpellCheck.cs b/src/UI/Features/SpellCheck/WordSpellCheck.cs new file mode 100644 index 00000000000..5930734654f --- /dev/null +++ b/src/UI/Features/SpellCheck/WordSpellCheck.cs @@ -0,0 +1,221 @@ +using Microsoft.Win32; +using Nikse.SubtitleEdit.Core.Interfaces; +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +namespace Nikse.SubtitleEdit.Features.SpellCheck; + +public record WordSpellCheckLanguage(string Name, int LanguageId); + +public class WordSpellCheck : IDoSpell, IDisposable +{ + private dynamic? _wordApp; + private dynamic? _managedDocument; + private bool _disposed; + private WordSpellCheckLanguage? _currentLanguage; + + public WordSpellCheckLanguage? CurrentLanguage + { + get => _currentLanguage; + set + { + _currentLanguage = value; + + if (_wordApp == null || value == null) + { + return; + } + + try + { + EnsureDocumentOpen(); + _managedDocument!.Content.LanguageID = value.LanguageId; + } + catch + { + // ignored + } + } + } + + public static bool IsWordInstalled() + { + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + return false; + } + + try + { + using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Winword.exe"); + return key != null; + } + catch + { + return false; + } + } + + public bool Initialize() + { + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + return false; + } + + try + { + var type = Type.GetTypeFromProgID("Word.Application"); + if (type == null) + { + return false; + } + + _wordApp = Activator.CreateInstance(type); + _wordApp!.Visible = false; + return true; + } + catch + { + return false; + } + } + + public bool DoSpell(string word) + { + if (_wordApp == null || string.IsNullOrWhiteSpace(word)) + { + return true; + } + + try + { + return (bool)_wordApp!.CheckSpelling(word); + } + catch + { + return true; + } + } + + public List GetInstalledLanguages() + { + var languages = new List(); + + if (_wordApp == null) + { + return languages; + } + + try + { + EnsureDocumentOpen(); + + foreach (var language in _wordApp.Languages) + { + try + { + if (language.ActiveSpellingDictionary != null) + { + languages.Add(new WordSpellCheckLanguage((string)language.NameLocal, (int)language.ID)); + } + } + catch + { + // ignored + } + } + } + catch + { + // ignored + } + + return languages; + } + + public List GetSuggestions(string word) + { + var suggestions = new List(); + + if (_wordApp == null || string.IsNullOrWhiteSpace(word)) + { + return suggestions; + } + + try + { + var spellingSuggestions = _wordApp!.GetSpellingSuggestions(word); + foreach (var suggestion in spellingSuggestions) + { + suggestions.Add((string)suggestion.Name); + } + } + catch + { + // ignored + } + + return suggestions; + } + + /// + /// Ensures a single tracked document is open, reusing it across calls + /// to avoid leaking orphaned Word documents. + /// + private void EnsureDocumentOpen() + { + if (_managedDocument != null) + { + return; + } + + _managedDocument = _wordApp!.Documents.Add(); + } + + protected virtual void Dispose(bool disposing) + { + if (_disposed) + { + return; + } + + if (_wordApp != null) + { + try + { + if (_managedDocument != null) + { + _managedDocument.Close(false); // false = don't save changes + Marshal.ReleaseComObject(_managedDocument); + _managedDocument = null; + } + + _wordApp.Quit(); + Marshal.ReleaseComObject(_wordApp); + } + catch + { + // ignored + } + finally + { + _wordApp = null; + } + } + + _disposed = true; + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + ~WordSpellCheck() + { + Dispose(false); + } +} \ No newline at end of file From dda436a14dd0b8b0b932491d7f8f07cc1650e050 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 19:18:11 +0200 Subject: [PATCH 34/74] Some fixes for language files --- src/UI/Assets/Languages/Norwegian.json | 2 +- src/UI/Assets/Languages/Spanish.json | 5121 ++++++++++++------------ src/UI/UI.csproj | 6 + 3 files changed, 2585 insertions(+), 2544 deletions(-) diff --git a/src/UI/Assets/Languages/Norwegian.json b/src/UI/Assets/Languages/Norwegian.json index 4d4f2e4f373..b85e63d27de 100644 --- a/src/UI/Assets/Languages/Norwegian.json +++ b/src/UI/Assets/Languages/Norwegian.json @@ -1,6 +1,6 @@ { "Title": "Subtitle Edit", - "TranslatedBy": "Gemini ", + "TranslatedBy": "Gemini", "CultureName": "nb-NO", "General": { "Abort": "Avbryt", diff --git a/src/UI/Assets/Languages/Spanish.json b/src/UI/Assets/Languages/Spanish.json index c15b0456611..b5327c0157a 100644 --- a/src/UI/Assets/Languages/Spanish.json +++ b/src/UI/Assets/Languages/Spanish.json @@ -1,2596 +1,2631 @@ -{ - "title": "Subtitle Edit", - "version": null, - "translatedBy": "", - "cultureName": "es-ES", - "general": { - "abort": "Abortar", - "actor": "Actor", - "actors": "Actores", - "add": "Añadir", - "addDotDotDot": "Añadir...", - "addToNamesListCaseSensitive": "Añadir a la lista de nombres (sensible a mayúsculas)", - "addToUserDictionary": "Añadir al diccionario de usuario", - "addVideoFiles": "Añadir archivos de vídeo...", - "adjustAlpha": "Ajustar alfa (transparencia)", - "adjustDisplayDuration": "Ajustar duración de visualización", - "adjustment": "Ajuste", - "advanced": "Avanzado", - "advancedSettings": "Ajustes avanzados", - "after": "Después", - "alignment": "Alineación", - "alignmentDotDotDot": "Alineación...", - "alignmentX": "Establecer alineación \"{0}\" para las líneas seleccionadas", - "all": "Todo", - "allFiles": "Todos los archivos", - "alphaAdjustment": "Ajuste de alfa", - "aphaThreshold": "Umbral de alfa", - "apiKey": "Clave API", - "apiSecret": "Secreto", - "appearance": "Apariencia", - "append": "Anexar", - "apply": "Aplicar", - "applyTo": "Aplicar a", - "ascending": "Ascendente", - "attachDotDotDot": "Adjuntar...", - "audioFiles": "Archivos de audio", - "audioVisualizer": "Visualizador de audio", - "auto": "Auto", - "autoBreak": "Dividir texto automáticamente", - "autoContinue": "Continuar automáticamente", - "autoTranslate": "Traducción automática", - "autodetect": "Autodetectar", - "background": "Fondo", - "backgroundColor": "Color de fondo", - "backward": "Atrás", - "batchMode": "Modo por lotes", - "bdnXml": "BDN/xml", - "before": "Antes", - "beforeX": "Antes de \"{0}\"", - "beginning": "Principio", - "bluRaySup": "Blu-ray (sup)", - "bold": "Negrita", - "bookmarkAdd": "Añadir marcador", - "bookmarkAddForSelectedLinesX": "Añadir marcador para {0} líneas seleccionadas", - "bookmarkClearQuestion": "¿Borrar todos los marcadores?", - "bookmarkDeleteSelectedQuestion": "¿Eliminar el marcador seleccionado?", - "bookmarkDotDotDot": "Marcador...", - "bookmarkEdit": "Editar marcador", - "bookmarkEditForSelectedLinesX": "Editar marcador para {0} líneas seleccionadas", - "bookmarksList": "Listar marcadores", - "borderColor": "Color del borde", - "borderStyle": "Estilo del borde", - "bottomCenter": "Abajo-Centro", - "bottomLeft": "Abajo-Izquierda", - "bottomRight": "Abajo-Derecha", - "box": "Caja", - "boxColor": "Color de la caja", - "boxCornerRadius": "Radio de esquina de la caja", - "boxPerLine": "Caja por línea", - "bridgeGaps": "Unir espacios", - "cancel": "_Cancelar", - "cancelled": "Cancelado", - "caseInsensitive": "No sensible a mayúsculas", - "caseSensitive": "Sensible a mayúsculas", - "category": "Categoría", - "center": "Centro", - "centerHorizontally": "Centrar horizontalmente", - "centerVertically": "Centrar verticalmente", - "change": "Cambiar", - "changeAll": "Cambiar todo", - "changeCasing": "Cambiar mayúsculas/minúsculas", - "changeFormatting": "Cambiar formato", - "changeFrameRate": "Cambiar tasa de fotogramas", - "changeLanguageFilter": "Cambiar filtro de idioma...", - "changeOnce": "Cambiar una vez", - "changeSpeed": "Cambiar velocidad", - "character": "Carácter", - "characters": "Caracteres", - "charsPerSec": "Car./seg", - "chooseColorDotDotDot": "Elegir color...", - "chooseImageFiles": "Elegir archivos de imagen", - "class": "Clase", - "classic": "Clásico", - "clear": "Limpiar", - "close": "Cerrar", - "codec": "Códec", - "collapse": "Colapsar", - "color": "Color", - "colorDotDotDot": "Color...", - "column": "Columna", - "consoleLog": "Registro de consola", - "contentAlignment": "Alineación del contenido", - "conversionCancelledByUser": "Conversión cancelada por el usuario", - "convert": "Convertir", - "converted": "Convertido", - "convertingDotDotDot": "Convirtiendo...", - "convertingXofYDotDoDot": "Convirtiendo {0:#,###,##0}/{1:#,###,##0}...", - "copy": "Copiar", - "copyImageToClipboard": "Copiar imagen al portapapeles", - "copyTextToClipboard": "Copiar texto al portapapeles", - "couldNotSaveFileXErrorY": "No se pudo guardar el archivo \"{0}\". Error: {1}", - "count": "Cuenta", - "cps": "Car./seg", - "currentSubtitle": "Subtítulo actual", - "currentVideoPosition": "Posición actual del vídeo", - "cut": "Cortar", - "dark": "Oscuro", - "dateAndTime": "Fecha y hora", - "default": "Predeterminado", - "delete": "Eliminar", - "deleteAtPosition": "Eliminar subtítulo en la posición del vídeo", - "deleteCurrentLine": "Eliminar línea actual", - "deleteFirstLines": "Eliminar primeras líneas", - "deleteLastLines": "Eliminar últimas líneas", - "deleteLineXPrompt": "¿Eliminar la línea número {0}?", - "deleteLines": "Eliminar líneas", - "deleteLinesContainingText": "Eliminar líneas que contengan texto", - "deleteXLinesPrompt": "¿Eliminar {0} líneas?", - "description": "Descripción", - "dictionary": "Diccionario", - "diskSpace": "Espacio en disco", - "doNoChange": "No cambiar", - "done": "Hecho", - "doubleWords": "Palabras dobles", - "doubleLines": "Líneas dobles", - "download": "Descargar", - "downloadX": "Descargar {0}", - "downloadingX": "Descargando {0}", - "downloadingXPercent": "Descargando {0}%", - "duplicate": "Duplicar", - "duration": "Duración", - "durationMinutes": "Duración en minutos", - "edit": "Editar", - "editDotDotDot": "Editar...", - "editing": "Editando", - "effect": "Efecto", - "enabled": "Habilitado", - "encoding": "Codificación", - "endTime": "Tiempo final", - "engine": "Motor", - "enterProfileName": "Introducir nombre del perfil", - "error": "Error", - "errorX": "Error; {0}", - "example": "Ejemplo", - "exampleX": "Ejemplo: {0}", - "expand": "Expandir", - "export": "Exportar", - "exportDotDotDot": "Exportar...", - "exportToX": "Exportar a {0}", - "extendAfter": "Extender/acortar a la línea posterior", - "extendBefore": "Extender/acortar a la línea anterior", - "extendSelectedLinesToNextShotChangeOrNextSubtitle": "Extender líneas seleccionadas al siguiente cambio de plano (o siguiente subtítulo)", - "extendSelectedToNext": "Extender seleccionados al siguiente", - "extendSelectedToPrevious": "Extender seleccionados al anterior", - "extractingAudioClips": "Extrayendo clips de audio...", - "fade": "Desvanecimiento", - "fetchFirstWordFromNextSubtitle": "Traer primera palabra del siguiente subtítulo", - "fileAlreadyExists": "El archivo ya existe", - "fileExtension": "Extensión de archivo", - "fileName": "Nombre de archivo", - "fileNameX": "Nombre de archivo: {0}", - "fileNameXAndSize": "Nombre de archivo: {0} ({1})", - "fileSaved": "Archivo guardado", - "fileSavedToX": "Archivo guardado en {0}", - "fileXAlreadyExists": "El archivo \"{0}\" ya existe.", - "fileXOfY": "Archivo {0} de {1}", - "filter": "Filtro", - "filterByLayer": "Filtrar por capa", - "find": "Buscar", - "findNext": "Buscar siguiente", - "findTextX": "Buscar texto - {0}", - "fiveHundredMilliseconds": "500 milisegundos", - "fiveSeconds": "Cinco segundos", - "fix": "Corregir", - "fixCommonErrors": "Corregir errores comunes", - "fixRightToLeft": "Corregir derecha a izquierda", - "fixRightToLeftViaUnicodeTags": "Corregir RTL mediante etiquetas Unicode", - "fixedValue": "Valor fijo", - "focusSelectedLine": "Enfocar línea seleccionada (desplazar en la cuadrícula)", - "font": "Fuente", - "fontColor": "Color de fuente", - "fontHeight": "Altura de fuente", - "fontName": "Nombre de fuente", - "fontNameDotDotDot": "Nombre de fuente...", - "fontSize": "Tamaño de fuente", - "fonts": "Fuentes", - "footer": "Pie de página", - "forced": "Forzado", - "foreground": "Primer plano", - "format": "Formato", - "forward": "Adelante", - "foundNoMatches": "No se encontraron coincidencias", - "foundOneMatch": "Se encontró una coincidencia", - "foundXInLineYZ": "Encontrado \"{0}\" en la línea {1}, posición {2}", - "foundXMatches": "Encontrado {0} coincidencias", - "frameRate": "Tasa de fotogramas", - "frameRateX": "Tasa de fotogramas: {0:0.0###}", - "frames": "Fotogramas", - "from": "Desde", - "fromCurrentVideoPosition": "desde la posición actual del vídeo", - "gap": "Espacio", - "general": "General", - "generalText": "General", - "generate": "Generar", - "generateImportShotChanges": "Generar/importar cambios de plano", - "generating": "Generando...", - "generatingImageXofY": "Generando imagen {0:#,##0} de {1:#,##0}...", - "generatingWavFile": "Generando archivo wav...", - "getAudioClips": "Obtener clips de audio", - "goTo": "Ir a", - "goToLineNumber": "Ir al número de línea", - "goToNextShotChange": "Ir al siguiente cambio de plano", - "goToPreviousShotChange": "Ir al anterior cambio de plano", - "googleIt": "Buscar en Google", - "group": "Grupo", - "header": "Encabezado", - "height": "Altura", - "help": "Ayuda", - "hex": "Hex", - "hide": "Ocultar", - "hidePreview": "Ocultar vista previa", - "history": "Historial", - "horizontal": "Horizontal", - "hourMinutesSecondsDecimalSeparatorMilliseconds": "Hora:min:seg{0}ms", - "hourMinutesSecondsFrames": "Hora:min:seg:fotogramas", - "ip": "IP", - "id": "ID", - "image": "Imagen", - "imageSaved": "Imagen guardada", - "imagedBasedSubtitles": "Subtítulos basados en imágenes", - "images": "Imágenes", - "imagesWithTimeCode": "Imágenes con código de tiempo", - "import": "Importar", - "importDotDotDot": "Importar...", - "include": "Incluir", - "information": "Información", - "insertAfter": "Insertar después", - "insertAtPositionAndFocusTextBox": "Insertar subtítulo en posición del vídeo y enfocar cuadro de texto", - "insertAtPositionNoFocusTextBox": "Insertar subtítulo en posición del vídeo (sin enfocar cuadro de texto)", - "insertBefore": "Insertar antes", - "insertLine": "Insertar línea", - "insertNewSelection": "Insertar nueva selección", - "insertSubtitleAfterCurrentLine": "Insertar subtítulo tras la línea actual...", - "insertSubtitleFileAtVideoPositionDotDotDot": "Insertar archivo de subtítulos en posición del vídeo...", - "inspectAdditions": "Inspeccionar adiciones...", - "invertSelection": "Invertir selección", - "isDefault": "Es predeterminado", - "italic": "Cursiva", - "keepExistingTimeCodes": "Mantener códigos de tiempo existentes (no añadir desfase)", - "keyFile": "Archivo de clave", - "language": "Idioma", - "languagePostFix": "Postfijo de idioma (mkv/mp4)", - "layer": "Capa", - "layerFilterOn": "Filtro de capa activado", - "left": "Izquierda", - "light": "Luz", - "lineHeigth": "Altura de línea", - "lineNumber": "Línea#", - "lineXColumnY": "Línea {0}, columna {1}", - "lines": "Líneas", - "linesAddedX": "Líneas añadidas: {0}", - "linesChangedX": "Líneas cambiadas: {0}", - "linesDeletedX": "Líneas eliminadas: {0}", - "listErrors": "Listar errores", - "loadDefaults": "Cargar predeterminados", - "lockTimeCodes": "Bloquear códigos de tiempo", - "logo": "Logotipo", - "margin": "Margen", - "match": "Coincidencia", - "maxCharactersPerSecond": "Máximo de caracteres por segundo", - "mediaInformation": "Información del medio", - "mergeAfter": "Combinar con línea posterior", - "mergeBefore": "Combinar con línea anterior", - "mergeLines": "Combinar líneas", - "mergeLinesWithSameText": "Combinar líneas con el mismo texto", - "mergeLinesWithSameTimeCodes": "Combinar líneas con mismos códigos de tiempo", - "mergeSelected": "Combinar seleccionados", - "mergeSelectedAsDialog": "Combinar seleccionados como diálogo", - "mergeSelectedLines": "Combinar líneas seleccionadas", - "mergeSelectedLinesDialog": "Combinar líneas seleccionadas como diálogo", - "mergeWithLineAfterAndAutoBreak": "Combinar con línea posterior y división automática", - "mergeWithLineAfterKeepBreaks": "Combinar con línea posterior (mantener saltos)", - "mergeWithLineBeforeAndAutoBreak": "Combinar con línea anterior y división automática", - "mergeWithLineBeforeKeepBreaks": "Combinar con línea anterior (mantener saltos)", - "middleCenter": "Medio-Centro", - "middleLeft": "Medio-Izquierda", - "middleRight": "Medio-Derecha", - "milliseconds": "Milisegundos", - "model": "Modelo", - "models": "Modelos", - "more": "Más", - "moreInfo": "Más info", - "moveAllShotChangeOneFrameBack": "Mover todos los cambios de plano un fotograma atrás", - "moveAllShotChangeOneFrameForward": "Mover todos los cambios de plano un fotograma adelante", - "moveDown": "Bajar", - "moveUp": "Subir", - "multipleReplace": "Reemplazo múltiple", - "name": "Nombre", - "negative": "Negativo", - "new": "Nuevo", - "newDotDotDot": "Nuevo...", - "newProfile": "Nuevo perfil", - "newSubtitleStartKeyDownSetEndKeyUp": "Insertar subtítulo: Inicio al pulsar tecla, fin al soltar", - "setSubtitleStartAtVideoPositionSetEndAtKeyUpAndGoToNext": "Inicio en pos. vídeo, fin al soltar tecla e ir al siguiente", - "no": "No", - "noFilesToConvert": "Sin archivos para convertir", - "noLanguageCode": "Sin código de idioma", - "noSubtitleLoaded": "Ningún subtítulo cargado", - "noSubtitlesFound": "¡No se han encontrado subtítulos!", - "noSymbolLines": "#Líneas", - "noVideoLoaded": "Ningún vídeo cargado", - "none": "Ninguno", - "normalCasing": "Uso normal de mayúsculas", - "notAvailable": "N/D", - "notInstalled": "No instalado", - "number": "Número", - "numberSymbol": "#", - "ocrDotDotDot": "OCR...", - "ocrPercentX": "OCR: {0}%", - "offset": "Desfase", - "offsetTimeCodes": "Desfasar códigos de tiempo", - "offsetX": "Desfase X", - "offsetY": "Desfase Y", - "ok": "_Aceptar", - "oneFile": "Un archivo", - "oneHundredMilliseconds": "100 milisegundos", - "oneSecond": "Un segundo", - "oneSecondBack": "Un segundo atrás", - "oneSecondForward": "Un segundo adelante", - "onlineVideoFeatureNotAvailable": "Función no disponible para vídeo en línea", - "openContainingFolder": "Abrir carpeta contenedora", - "openDictionaryFolder": "Abrir carpeta de diccionarios", - "openFile": "Abrir archivo", - "openImageBasedSubtitle": "Abrir subtítulo basado en imágenes", - "openImageFile": "Abrir archivo de imagen", - "openOriginalSubtitleFile": "Abrir archivo de subtítulo original...", - "openOriginalSubtitleFileTitle": "Abrir archivo de subtítulo original", - "openOutputFolder": "Abrir carpeta de salida", - "openSubtitle": "Abrir subtítulo...", - "openSubtitleFileTitle": "Abrir archivo de subtítulos", - "openSubtitles": "Abrir subtítulos...", - "openVideoFile": "Abrir archivo de vídeo...", - "openVideoFileTitle": "Abrir archivo de vídeo", - "optimalCharactersPerSecond": "Caracteres por segundo óptimos", - "options": "Opciones", - "originalText": "Texto original", - "outline": "Contorno", - "outlineColor": "Color del contorno", - "outlineWidth": "Ancho del contorno", - "outputFolder": "Carpeta de salida", - "outputProperties": "Propiedades de salida", - "overlap": "Superposición", - "overlapNextX": "Superp. siguiente ({0:#;##0.###})", - "overlapPreviousLineX": "Superp. línea ant. ({0:#;##0.###})", - "overlapStartAndEnd": "Superponer inicio y fin", - "overlapX": "Superposición ({0:#;##0.###})", - "overwriteExistingFiles": "Sobrescribir archivos existentes", - "overwriteFilesInFolderX": "Sobrescribir archivos en la carpeta: \"{0}\"", - "overwriteQuestion": "¿Sobrescribir?", - "padding": "Relleno", - "parameters": "Parámetros", - "parsingXDotDotDot": "Analizando {0}...", - "paste": "Pegar", - "pasteNewSelection": "Pegar texto del portapapeles en nueva selección", - "pause": "Pausa", - "percent": "Porcentaje", - "pickLayer": "Establecer capa", - "pickOllamaModel": "Elegir modelo Ollama", - "pickOutputFolder": "Elegir carpeta de salida", - "pickResolutionFromCurrentVideo": "Elegir resolución del vídeo actual", - "pickResolutionFromVideoDotDotDot": "Elegir resolución del vídeo...", - "pickSubtitleFile": "Elegir archivo de subtítulos...", - "pickVideoFile": "Elegir archivo de vídeo...", - "pickVideoPosition": "Elegir posición del vídeo", - "play": "Reproducir", - "playFromStartOfVideo": "Reprod. desde el inicio del vídeo", - "playNext": "Reprod. siguiente", - "playSelectedLines": "Reprod. líneas seleccionadas", - "playSelectedLinesWithLoop": "Reprod. líneas seleccionadas en bucle", - "pleaseEnterAValidValueForX": "Por favor, introduzca un valor válido para \"{0}\"", - "pleaseWait": "Por favor, espere...", - "position": "Posición", - "positionX": "Posición: {0}", - "postProcessing": "Post-procesamiento", - "poweredBy": "Impulsado por", - "prefix": "Prefijo", - "preview": "Vista previa", - "profile": "Perfil", - "profileName": "Nombre del perfil", - "profiles": "Perfiles", - "property": "Propiedad", - "question": "Pregunta", - "reDownloadX": "Volver a descargar {0}", - "reason": "Razón", - "recentFiles": "Archivos recientes", - "redo": "Rehacer", - "refresh": "Actualizar", - "region": "Región", - "regularExpression": "Expresión regular", - "regularExpressionIsNotValid": "¡La expresión regular no es válida!", - "relativeToCurrentVideoPosition": "Relativo a la posición actual del vídeo", - "remove": "Eliminar", - "removeAlignment": "Eliminar alineación", - "removeAllFormatting": "Eliminar todo el formato", - "removeBlankLines": "Eliminar líneas en blanco", - "removeBold": "Eliminar negrita", - "removeColor": "Eliminar color", - "removeFilter": "Eliminar filtro", - "removeFontName": "Eliminar nombre de fuente", - "removeFormatting": "Eliminar formato", - "removeItalic": "Eliminar cursiva", - "removeRightToLeftUnicodeTags": "Eliminar etiquetas Unicode RTL", - "removeSelectedFile": "¿Eliminar archivo seleccionado?", - "removeStyling": "Eliminar estilo", - "removeTextForHearingImpaired": "Eliminar texto para deficientes auditivos", - "removeUnderline": "Eliminar subrayado", - "rename": "Renombrar", - "replace": "Reemplazar", - "replaceWith": "Reemplazar con", - "requiresRestart": "Requiere reiniciar", - "reset": "Restablecer", - "resolution": "Resolución", - "resolutionX": "Resolución: {0}", - "reverseRightToLeftStartEnd": "Invertir inicio/fin RTL", - "right": "Derecha", - "rightToLeft": "Derecha a izquierda", - "rules": "Reglas", - "saveChangesMessage": "¿Desea guardar los cambios en el archivo de subtítulos actual?", - "saveChangesTitle": "¿Guardar cambios?", - "saveChangesToX": "¿Desea guardar los cambios en \"{0}\"?", - "saveChangesToXOriginal": "¿Desea guardar los cambios en el archivo original \"{0}\"?", - "saveDotDotDot": "Guardar...", - "saveFileAsTitle": "Guardar archivo como", - "saveImageAs": "Guardar imagen como", - "saveImageAsDotDotDot": "Guardar imagen como...", - "saveOriginalAsTitle": "Guardar original como", - "saveTranslationAsTitle": "Guardar traducción como", - "saveVideoAsVideoTitle": "Guardar vídeo como", - "savedChangesToX": "Guardado \"{0}\"", - "savedChangesToXAndY": "Guardado \"{0}\" y \"{1}\"", - "savingDotDotDot": "Guardando...", - "script": "Guion", - "search": "Buscar", - "searchDirection": "Dirección de búsqueda", - "searchFontNames": "Buscar nombres de fuente...", - "searchSubtitleFormats": "Buscar formatos de subtítulos", - "seconds": "Segundos", - "selectAll": "Seleccionar todo", - "selectFilesToConvert": "Seleccionar archivos para convertir", - "selectNone": "No seleccionar nada", - "selectSaveFolder": "Seleccionar carpeta para guardar", - "selectSubtitle": "Seleccionar subtítulo", - "selectedAFolderToSaveTo": "Carpeta seleccionada para guardar", - "selectedLines": "Líneas seleccionadas", - "selectedlinesX": "Líneas seleccionadas: {0}", - "sensitivity": "Sensibilidad", - "separator": "Separador", - "sessionKey": "Clave de sesión", - "sessionKeyGenerate": "Generar nueva clave", - "setEnd": "Establecer fin", - "setEndAndGoToNext": "Establecer fin e ir al siguiente", - "setEndAndOffsetTheRest": "Establecer fin y desfasar el resto", - "setFontDotDotDot": "Establecer fuente...", - "setStart": "Establecer inicio", - "setStartAndOffsetTheRest": "Establecer inicio y desfasar el resto", - "setVideoOffset": "Establecer desfase de vídeo", - "settings": "Ajustes", - "shadow": "Sombra", - "shadowColor": "Color de sombra", - "shadowWidth": "Ancho de sombra", - "shortcut": "Atajo", - "shortcutX": "Atajo: {0}", - "shortcuts": "Atajos", - "show": "Mostrar", - "showActorColumn": "Mostrar columna \"Actor\"", - "showCpsColumn": "Mostrar columna \"Car./seg\"", - "showDurationColumn": "Mostrar columna \"Duración\"", - "showGapColumn": "Mostrar columna \"Espacio\"", - "showStartColumn": "Mostrar columna \"Inicio\"", - "showHideColumn": "Mostrar columna \"Ocultar\"", - "showHistory": "Mostrar historial", - "showLayerColumn": "Mostrar columna \"Capa\"", - "showPreview": "Mostrar vista previa", - "showShotChangesList": "Mostrar lista de cambios de plano", - "showStyleColumn": "Mostrar columna \"Estilo\"", - "showTimeCodes": "Mostrar códigos de tiempo", - "showWpmColumn": "Mostrar columna \"Pal./min\"", - "showPixelWidthColumn": "Mostrar columna \"Ancho píxeles\"", - "shrink": "Encoger", - "singleBox": "Caja única", - "singleLineLengths": "Longitud de línea única:", - "singleMode": "Modo único", - "size": "Tamaño", - "sizeX": "Tamaño: {0}", - "skip": "Omitir", - "skipAll": "Omitir todo", - "skipOnce": "Omitir una vez", - "smart": "Inteligente", - "snapSelectedLinesToNearestShotChange": "Ajustar inicio/fin de líneas al cambio de plano más cercano", - "solidColor": "Color sólido", - "sourceViewX": "Vista de origen - {0}", - "spacing": "Espaciado", - "speechToTextSelectedLines": "Voz a texto seleccionadas (ver Opciones - Ajustes)", - "speechToTextSelectedLinesPromptAlways": "Voz a texto seleccionadas (preguntar siempre motor/idioma)", - "speechToTextSelectedLinesPromptFirstTime": "Voz a texto seleccionadas (preguntar motor/idioma solo la primera vez)", - "speed": "Velocidad", - "splitAtTextBoxCursorPosition": "Dividir en la posición del cursor", - "splitLine": "Dividir línea", - "splitLineAtTextBoxCursorPosition": "Dividir línea en la posición del cursor", - "splitLineAtVideoAndTextBoxPosition": "Dividir línea en pos. vídeo y cuadro texto", - "splitLineAtVideoPosition": "Dividir línea en la posición del vídeo", - "startFrom": "Empezar desde", - "startTime": "Tiempo de inicio", - "startingDotDotDot": "Iniciando...", - "status": "Estado", - "stereo": "Estéreo", - "stop": "Parar", - "strikeout": "Tachado", - "style": "Estilo", - "styleExaggeration": "Exageración de estilo", - "styleLanguage": "Estilo / Idioma", - "styles": "Estilos", - "subtitleFile": "Archivo de subtítulos", - "subtitleFileName": "Nombre del archivo de subtítulos", - "subtitleFileSaved": "Archivo de subtítulos guardado", - "subtitleFileSavedToX": "Archivo de subtítulos guardado en {0}", - "subtitleFiles": "Archivos de subtítulos", - "subtitleFormats": "Formatos de subtítulos", - "subtitleLoadedX": "Subtítulo cargado: {0}", - "subtitleXOfY": "Subtítulo {0} de {1}", - "suffix": "Sufijo", - "suggestions": "Sugerencias", - "sync": "Sincronizar", - "syntaxColoring": "Coloreado de sintaxis", - "system": "Sistema", - "targetEncoding": "Codificación de destino", - "targetFormat": "Formato de destino", - "tenHours": "10 horas", - "tenMilliseconds": "10 milisegundos", - "text": "Texto", - "textColor": "Color de texto", - "textFiles": "Archivos de texto", - "textOrImage": "Texto/imagen", - "threeLetterLanguageCode": "Código de idioma de tres letras", - "time": "Tiempo", - "timeCodes": "Códigos de tiempo", - "timing": "Tiempos", - "title": "Título", - "to": "A", - "toggleCasing": "Alternar mayúsculas/minúsculas", - "toggleDirection": "Alternar dirección", - "toggleForced": "Alternar forzado", - "toggleShotChangesAtVideoPosition": "Alternar cambios de plano en posición del vídeo", - "toolbar": "Barra de herramientas", - "tools": "Herramientas", - "topCenter": "Arriba-Centro", - "topLeft": "Arriba-Izquierda", - "topRight": "Arriba-Derecha", - "totalAdjustmentX": "Ajuste total: {0}", - "totalFramesX": "Fotogramas totales: {0:#;##0.##}", - "totalLengthX": "Longitud total: {0}", - "totalLengthXSplitLine": "Longitud total: {0} (¡dividir línea!)", - "translate": "Traducir", - "translateRow": "Traducir fila", - "translation": "Traducción", - "twoLetterLanguageCode": "Código de idioma de dos letras", - "type": "Tipo", - "unbreak": "Unir texto", - "unbreakLines": "Unir líneas", - "underline": "Subrayado", - "undo": "Deshacer", - "unknown": "Desconocido", - "unknownSubtitleFormat": "Formato de subtítulo desconocido", - "unpacking7ZipArchiveDotDotDot": "Desempaquetando archivo 7-zip...", - "unpackingX": "Desempaquetando {0}", - "untitled": "Sin título", - "update": "Actualizar", - "updateAndClose": "Actualizar y cerrar", - "updateDetails": "Detalles de actualización", - "updatedBy": "Actualizado por", - "url": "URL", - "usages": "Usos", - "use": "Usar", - "useAlways": "Usar siempre", - "useLargerFontForThisWindow": "Usar fuente más grande para esta ventana", - "useOnce": "Usar una vez", - "useOutputFolder": "Usar carpeta de salida", - "useSourceFolder": "Usar carpeta de origen", - "useSourceResolution": "Usar resolución de origen", - "userName": "Nombre de usuario", - "userNameAlreadyInUse": "Nombre de usuario ya en uso", - "vertical": "Vertical", - "video100MsBack": "Vídeo, 100 ms atrás", - "video100MsForward": "Vídeo, 100 ms adelante", - "video500MsBack": "Vídeo, 500 ms atrás", - "video500MsForward": "Vídeo, 500 ms adelante", - "videoCustom1BackX": "Vídeo, milisegundos personalizados ({0:#,###,##0}) atrás, 1", - "videoCustom1ForwardX": "Vídeo, milisegundos personalizados ({0:#,###,##0}) adelante, 1", - "videoCustom2BackX": "Vídeo, milisegundos personalizados ({0:#,###,##0}) atrás, 2", - "videoCustom2ForwardX": "Vídeo, milisegundos personalizados ({0:#,###,##0}) adelante, 2", - "videoEncodingX": "Codificación de vídeo: {0}", - "videoExtension": "Extensión de archivo de vídeo", - "videoFile": "Archivo de vídeo", - "videoFileGeneratedX": "Archivo de vídeo generado: \"{0}\"", - "videoFiles": "Archivos de vídeo", - "videoInformation": "Info. vídeo", - "videoOffset": "Desfase de vídeo", - "videoOneFrameBack": "Vídeo, un fotograma atrás", - "videoOneFrameForward": "Vídeo, un fotograma adelante", - "videoOneSecondBack": "Vídeo, un segundo atrás", - "videoOneSecondForward": "Vídeo, un segundo adelante", - "videoPlayer": "Reproductor de vídeo", - "videoPosition": "Posición del vídeo", - "videoResolution": "Resolución del vídeo", - "viewX": "Ver {0}", - "visible": "Visible", - "voice": "Voz", - "warning": "Aviso", - "waveformCenterOnVideoPosition": "Centrar forma de onda en posición del vídeo", - "waveformPasteFromClipboard": "Pegar desde el portapapeles", - "waveformSpectrogram": "Forma de onda/espectrograma", - "webServiceUrl": "URL del servicio web", - "width": "Ancho", - "windowPositionAndSize": "Posición y tamaño de la ventana", - "wordsPerMin": "Pal./min", - "pixelWidth": "Ancho píxeles", - "wpm": "Pal./min", - "xFiles": "{0:#,###,##0} archivos", - "xFilesConvertedInY": "{0:#,###,##0} archivos convertidos en {1}", - "xNotFound": "\"{0}\" no encontrado", - "xRequiresAnApiKey": "{0} requiere una clave API", - "xSeconds": "{0:0.0##} segundos", - "xSubtitles": "{0:#,###,##0} subtítulos", - "yes": "Sí", - "copyToClipboard": "Copiar al portapapeles", - "playCurrent": "Reproducir actual", - "leftMargin": "Margen izquierdo", - "rightMargin": "Margen derecho", - "installed": "Instalado", - "advancedDotDotDot": "Avanzado...", - "chooseAlignment": "Elegir alineación" +{ + "Title": "Subtitle Edit", + "TranslatedBy": "Gemini", + "CultureName": "es-ES", + "General": { + "Abort": "Abortar", + "Actor": "Actor", + "Actors": "Actores", + "Add": "Añadir", + "AddDotDotDot": "Añadir...", + "AddToNamesListCaseSensitive": "Añadir a la lista de nombres (sensible a mayúsculas)", + "AddToUserDictionary": "Añadir al diccionario de usuario", + "AddVideoFiles": "Añadir archivos de vídeo...", + "AdjustAlpha": "Ajustar alfa (transparencia)", + "AdjustDisplayDuration": "Ajustar duración de visualización", + "Adjustment": "Ajuste", + "Advanced": "Avanzado", + "AdvancedSettings": "Ajustes avanzados", + "After": "Después", + "Alignment": "Alineación", + "AlignmentDotDotDot": "Alineación...", + "AlignmentX": "Establecer alineación \"{0}\" para las líneas seleccionadas", + "All": "Todo", + "AllFiles": "Todos los archivos", + "AlphaAdjustment": "Ajuste de alfa", + "AphaThreshold": "Umbral de alfa", + "ApiKey": "Clave API", + "ApiSecret": "Secreto", + "Appearance": "Apariencia", + "Append": "Anexar", + "Apply": "Aplicar", + "ApplyTo": "Aplicar a", + "Ascending": "Ascendente", + "AttachDotDotDot": "Adjuntar...", + "AudioFiles": "Archivos de audio", + "AudioVisualizer": "Visualizador de audio", + "Auto": "Auto", + "AutoBreak": "Dividir texto automáticamente", + "AutoContinue": "Continuar automáticamente", + "AutoTranslate": "Traducción automática", + "Autodetect": "Autodetectar", + "Background": "Fondo", + "BackgroundColor": "Color de fondo", + "Backward": "Atrás", + "BatchMode": "Modo por lotes", + "BdnXml": "BDN/xml", + "Before": "Antes", + "BeforeX": "Antes de \"{0}\"", + "Beginning": "Principio", + "BluRaySup": "Blu-ray (sup)", + "Bold": "Negrita", + "BookmarkAdd": "Añadir marcador", + "BookmarkAddForSelectedLinesX": "Añadir marcador para {0} líneas seleccionadas", + "BookmarkClearQuestion": "¿Borrar todos los marcadores?", + "BookmarkDeleteSelectedQuestion": "¿Eliminar el marcador seleccionado?", + "BookmarkDotDotDot": "Marcador...", + "BookmarkEdit": "Editar marcador", + "BookmarkEditForSelectedLinesX": "Editar marcador para {0} líneas seleccionadas", + "BookmarksList": "Listar marcadores", + "BorderColor": "Color del borde", + "BorderStyle": "Estilo del borde", + "BottomCenter": "Abajo-Centro", + "BottomLeft": "Abajo-Izquierda", + "BottomRight": "Abajo-Derecha", + "Box": "Caja", + "BoxColor": "Color de la caja", + "BoxCornerRadius": "Radio de esquina de la caja", + "BoxPerLine": "Caja por línea", + "BridgeGaps": "Unir espacios", + "Cancel": "_Cancelar", + "Cancelled": "Cancelado", + "CaseInsensitive": "No sensible a mayúsculas", + "CaseSensitive": "Sensible a mayúsculas", + "Category": "Categoría", + "Center": "Centro", + "CenterHorizontally": "Centrar horizontalmente", + "CenterVertically": "Centrar verticalmente", + "Change": "Cambiar", + "ChangeAll": "Cambiar todo", + "ChangeCasing": "Cambiar mayúsculas/minúsculas", + "ChangeFormatting": "Cambiar formato", + "ChangeFrameRate": "Cambiar tasa de fotogramas", + "ChangeLanguageFilter": "Cambiar filtro de idioma...", + "ChangeOnce": "Cambiar una vez", + "ChangeSpeed": "Cambiar velocidad", + "Character": "Carácter", + "Characters": "Caracteres", + "CharsPerSec": "Car./seg", + "ChooseColorDotDotDot": "Elegir color...", + "ChooseImageFiles": "Elegir archivos de imagen", + "Class": "Clase", + "Classic": "Clásico", + "Clear": "Limpiar", + "Close": "Cerrar", + "Codec": "Códec", + "Collapse": "Colapsar", + "Color": "Color", + "ColorDotDotDot": "Color...", + "Column": "Columna", + "ConsoleLog": "Registro de consola", + "ContentAlignment": "Alineación del contenido", + "ConversionCancelledByUser": "Conversión cancelada por el usuario", + "Convert": "Convertir", + "Converted": "Convertido", + "ConvertingDotDotDot": "Convirtiendo...", + "ConvertingXofYDotDoDot": "Convirtiendo {0:#,###,##0}/{1:#,###,##0}...", + "Copy": "Copiar", + "CopyImageToClipboard": "Copiar imagen al portapapeles", + "CopyTextToClipboard": "Copiar texto al portapapeles", + "CouldNotSaveFileXErrorY": "No se pudo guardar el archivo \"{0}\". Error: {1}", + "Count": "Cuenta", + "Cps": "Car./seg", + "CurrentSubtitle": "Subtítulo actual", + "CurrentVideoPosition": "Posición actual del vídeo", + "Cut": "Cortar", + "Dark": "Oscuro", + "DateAndTime": "Fecha y hora", + "Default": "Predeterminado", + "Delete": "Eliminar", + "DeleteAtPosition": "Eliminar subtítulo en la posición del vídeo", + "DeleteCurrentLine": "Eliminar línea actual", + "DeleteFirstLines": "Eliminar primeras líneas", + "DeleteLastLines": "Eliminar últimas líneas", + "DeleteLineXPrompt": "¿Eliminar la línea número {0}?", + "DeleteLines": "Eliminar líneas", + "DeleteLinesContainingText": "Eliminar líneas que contengan texto", + "DeleteXLinesPrompt": "¿Eliminar {0} líneas?", + "Description": "Descripción", + "Dictionary": "Diccionario", + "DiskSpace": "Espacio en disco", + "DoNoChange": "No cambiar", + "Done": "Hecho", + "DoubleWords": "Palabras dobles", + "DoubleLines": "Líneas dobles", + "Download": "Descargar", + "DownloadX": "Descargar {0}", + "DownloadingX": "Descargando {0}", + "DownloadingXPercent": "Descargando {0}%", + "Duplicate": "Duplicar", + "Duration": "Duración", + "DurationMinutes": "Duración en minutos", + "Edit": "Editar", + "EditDotDotDot": "Editar...", + "Editing": "Editando", + "Effect": "Efecto", + "Enabled": "Habilitado", + "Encoding": "Codificación", + "EndTime": "Tiempo final", + "Engine": "Motor", + "EnterProfileName": "Introducir nombre del perfil", + "Error": "Error", + "ErrorX": "Error; {0}", + "Example": "Ejemplo", + "ExampleX": "Ejemplo: {0}", + "Expand": "Expandir", + "Export": "Exportar", + "ExportDotDotDot": "Exportar...", + "ExportToX": "Exportar a {0}", + "ExtendAfter": "Extender/acortar a la línea posterior", + "ExtendBefore": "Extender/acortar a la línea anterior", + "ExtendSelectedLinesToNextShotChangeOrNextSubtitle": "Extender líneas seleccionadas al siguiente cambio de plano (o siguiente subtítulo)", + "ExtendSelectedToNext": "Extender seleccionados al siguiente", + "ExtendSelectedToPrevious": "Extender seleccionados al anterior", + "ExtractingAudioClips": "Extrayendo clips de audio...", + "Fade": "Desvanecimiento", + "FetchFirstWordFromNextSubtitle": "Traer primera palabra del siguiente subtítulo", + "FileAlreadyExists": "El archivo ya existe", + "FileExtension": "Extensión de archivo", + "FileName": "Nombre de archivo", + "FileNameX": "Nombre de archivo: {0}", + "FileNameXAndSize": "Nombre de archivo: {0} ({1})", + "FileSaved": "Archivo guardado", + "FileSavedToX": "Archivo guardado en {0}", + "FileXAlreadyExists": "El archivo \"{0}\" ya existe.", + "FileXOfY": "Archivo {0} de {1}", + "Filter": "Filtro", + "FilterByLayer": "Filtrar por capa", + "Find": "Buscar", + "FindNext": "Buscar siguiente", + "FindTextX": "Buscar texto - {0}", + "FiveHundredMilliseconds": "500 milisegundos", + "FiveSeconds": "Cinco segundos", + "Fix": "Corregir", + "FixCommonErrors": "Corregir errores comunes", + "FixRightToLeft": "Corregir derecha a izquierda", + "FixRightToLeftViaUnicodeTags": "Corregir RTL mediante etiquetas Unicode", + "FixedValue": "Valor fijo", + "FocusSelectedLine": "Enfocar línea seleccionada (desplazar en la cuadrícula)", + "Font": "Fuente", + "FontColor": "Color de fuente", + "FontHeight": "Altura de fuente", + "FontName": "Nombre de fuente", + "FontNameDotDotDot": "Nombre de fuente...", + "FontSize": "Tamaño de fuente", + "Fonts": "Fuentes", + "Footer": "Pie de página", + "Forced": "Forzado", + "Foreground": "Primer plano", + "Format": "Formato", + "Forward": "Adelante", + "FoundNoMatches": "No se encontraron coincidencias", + "FoundOneMatch": "Se encontró una coincidencia", + "FoundXInLineYZ": "Encontrado \"{0}\" en la línea {1}, posición {2}", + "FoundXMatches": "Encontrado {0} coincidencias", + "FrameRate": "Tasa de fotogramas", + "FrameRateX": "Tasa de fotogramas: {0:0.0###}", + "Frames": "Fotogramas", + "From": "Desde", + "FromCurrentVideoPosition": "desde la posición actual del vídeo", + "Gap": "Espacio", + "General": "General", + "GeneralText": "General", + "Generate": "Generar", + "GenerateImportShotChanges": "Generar/importar cambios de plano", + "Generating": "Generando...", + "GeneratingImageXofY": "Generando imagen {0:#,##0} de {1:#,##0}...", + "GeneratingWavFile": "Generando archivo wav...", + "GetAudioClips": "Obtener clips de audio", + "GoTo": "Ir a", + "GoToLineNumber": "Ir al número de línea", + "GoToNextShotChange": "Ir al siguiente cambio de plano", + "GoToPreviousShotChange": "Ir al anterior cambio de plano", + "GoogleIt": "Buscar en Google", + "Group": "Grupo", + "Header": "Encabezado", + "Height": "Altura", + "Help": "Ayuda", + "Hex": "Hex", + "Hide": "Ocultar", + "HidePreview": "Ocultar vista previa", + "History": "Historial", + "Horizontal": "Horizontal", + "HourMinutesSecondsDecimalSeparatorMilliseconds": "Hora:min:seg{0}ms", + "HourMinutesSecondsFrames": "Hora:min:seg:fotogramas", + "Ip": "IP", + "Id": "ID", + "Image": "Imagen", + "ImageSaved": "Imagen guardada", + "ImagedBasedSubtitles": "Subtítulos basados en imágenes", + "Images": "Imágenes", + "ImagesWithTimeCode": "Imágenes con código de tiempo", + "Import": "Importar", + "ImportDotDotDot": "Importar...", + "Include": "Incluir", + "Information": "Información", + "InsertAfter": "Insertar después", + "InsertAtPositionAndFocusTextBox": "Insertar subtítulo en posición del vídeo y enfocar cuadro de texto", + "InsertAtPositionNoFocusTextBox": "Insertar subtítulo en posición del vídeo (sin enfocar cuadro de texto)", + "InsertBefore": "Insertar antes", + "InsertLine": "Insertar línea", + "InsertNewSelection": "Insertar nueva selección", + "InsertSubtitleAfterCurrentLine": "Insertar subtítulo tras la línea actual...", + "InsertSubtitleFileAtVideoPositionDotDotDot": "Insertar archivo de subtítulos en posición del vídeo...", + "InspectAdditions": "Inspeccionar adiciones...", + "InvertSelection": "Invertir selección", + "IsDefault": "Es predeterminado", + "Italic": "Cursiva", + "KeepExistingTimeCodes": "Mantener códigos de tiempo existentes (no añadir desfase)", + "KeyFile": "Archivo de clave", + "Language": "Idioma", + "LanguagePostFix": "Postfijo de idioma (mkv/mp4)", + "Layer": "Capa", + "LayerFilterOn": "Filtro de capa activado", + "Left": "Izquierda", + "Light": "Luz", + "LineHeigth": "Altura de línea", + "LineNumber": "Línea#", + "LineXColumnY": "Línea {0}, columna {1}", + "Lines": "Líneas", + "LinesAddedX": "Líneas añadidas: {0}", + "LinesChangedX": "Líneas cambiadas: {0}", + "LinesDeletedX": "Líneas eliminadas: {0}", + "ListErrors": "Listar errores", + "LoadDefaults": "Cargar predeterminados", + "LockTimeCodes": "Bloquear códigos de tiempo", + "Logo": "Logotipo", + "Margin": "Margen", + "Match": "Coincidencia", + "MaxCharactersPerSecond": "Máximo de caracteres por segundo", + "MediaInformation": "Información del medio", + "MergeAfter": "Combinar con línea posterior", + "MergeBefore": "Combinar con línea anterior", + "MergeLines": "Combinar líneas", + "MergeLinesWithSameText": "Combinar líneas con el mismo texto", + "MergeLinesWithSameTimeCodes": "Combinar líneas con mismos códigos de tiempo", + "MergeSelected": "Combinar seleccionados", + "MergeSelectedAsDialog": "Combinar seleccionados como diálogo", + "MergeSelectedLines": "Combinar líneas seleccionadas", + "MergeSelectedLinesDialog": "Combinar líneas seleccionadas como diálogo", + "MergeWithLineAfterAndAutoBreak": "Combinar con línea posterior y división automática", + "MergeWithLineAfterKeepBreaks": "Combinar con línea posterior (mantener saltos)", + "MergeWithLineBeforeAndAutoBreak": "Combinar con línea anterior y división automática", + "MergeWithLineBeforeKeepBreaks": "Combinar con línea anterior (mantener saltos)", + "MiddleCenter": "Medio-Centro", + "MiddleLeft": "Medio-Izquierda", + "MiddleRight": "Medio-Derecha", + "Milliseconds": "Milisegundos", + "Model": "Modelo", + "Models": "Modelos", + "More": "Más", + "MoreInfo": "Más info", + "MoveAllShotChangeOneFrameBack": "Mover todos los cambios de plano un fotograma atrás", + "MoveAllShotChangeOneFrameForward": "Mover todos los cambios de plano un fotograma adelante", + "MoveDown": "Bajar", + "MoveUp": "Subir", + "MultipleReplace": "Reemplazo múltiple", + "Name": "Nombre", + "Negative": "Negativo", + "New": "Nuevo", + "NewDotDotDot": "Nuevo...", + "NewProfile": "Nuevo perfil", + "NewSubtitleStartKeyDownSetEndKeyUp": "Insertar subtítulo: Inicio al pulsar tecla, fin al soltar", + "SetSubtitleStartAtVideoPositionSetEndAtKeyUpAndGoToNext": "Inicio en pos. vídeo, fin al soltar tecla e ir al siguiente", + "No": "No", + "NoFilesToConvert": "Sin archivos para convertir", + "NoLanguageCode": "Sin código de idioma", + "NoSubtitleLoaded": "Ningún subtítulo cargado", + "NoSubtitlesFound": "¡No se han encontrado subtítulos!", + "NoSymbolLines": "#Líneas", + "NoVideoLoaded": "Ningún vídeo cargado", + "None": "Ninguno", + "NormalCasing": "Uso normal de mayúsculas", + "NotAvailable": "N/D", + "NotInstalled": "No instalado", + "Number": "Número", + "NumberSymbol": "#", + "OcrDotDotDot": "OCR...", + "OcrPercentX": "OCR: {0}%", + "Offset": "Desfase", + "OffsetTimeCodes": "Desfasar códigos de tiempo", + "OffsetX": "Desfase X", + "OffsetY": "Desfase Y", + "Ok": "_Aceptar", + "OneFile": "Un archivo", + "OneHundredMilliseconds": "100 milisegundos", + "OneSecond": "Un segundo", + "OneSecondBack": "Un segundo atrás", + "OneSecondForward": "Un segundo adelante", + "OnlineVideoFeatureNotAvailable": "Función no disponible para vídeo en línea", + "OpenContainingFolder": "Abrir carpeta contenedora", + "OpenDictionaryFolder": "Abrir carpeta de diccionarios", + "OpenFile": "Abrir archivo", + "OpenImageBasedSubtitle": "Abrir subtítulo basado en imágenes", + "OpenImageFile": "Abrir archivo de imagen", + "OpenOriginalSubtitleFile": "Abrir archivo de subtítulo original...", + "OpenOriginalSubtitleFileTitle": "Abrir archivo de subtítulo original", + "OpenOutputFolder": "Abrir carpeta de salida", + "OpenSubtitle": "Abrir subtítulo...", + "OpenSubtitleFileTitle": "Abrir archivo de subtítulos", + "OpenSubtitles": "Abrir subtítulos...", + "OpenVideoFile": "Abrir archivo de vídeo...", + "OpenVideoFileTitle": "Abrir archivo de vídeo", + "OptimalCharactersPerSecond": "Caracteres por segundo óptimos", + "Options": "Opciones", + "OriginalText": "Texto original", + "Outline": "Contorno", + "OutlineColor": "Color del contorno", + "OutlineWidth": "Ancho del contorno", + "OutputFolder": "Carpeta de salida", + "OutputProperties": "Propiedades de salida", + "Overlap": "Superposición", + "OverlapNextX": "Superp. siguiente ({0:#;##0.###})", + "OverlapPreviousLineX": "Superp. línea ant. ({0:#;##0.###})", + "OverlapStartAndEnd": "Superponer inicio y fin", + "OverlapX": "Superposición ({0:#;##0.###})", + "OverwriteExistingFiles": "Sobrescribir archivos existentes", + "OverwriteFilesInFolderX": "Sobrescribir archivos en la carpeta: \"{0}\"", + "OverwriteQuestion": "¿Sobrescribir?", + "Padding": "Relleno", + "Parameters": "Parámetros", + "ParsingXDotDotDot": "Analizando {0}...", + "Paste": "Pegar", + "PasteNewSelection": "Pegar texto del portapapeles en nueva selección", + "Pause": "Pausa", + "Percent": "Porcentaje", + "PickLayer": "Establecer capa", + "PickOllamaModel": "Elegir modelo Ollama", + "PickOutputFolder": "Elegir carpeta de salida", + "PickResolutionFromCurrentVideo": "Elegir resolución del vídeo actual", + "PickResolutionFromVideoDotDotDot": "Elegir resolución del vídeo...", + "PickSubtitleFile": "Elegir archivo de subtítulos...", + "PickVideoFile": "Elegir archivo de vídeo...", + "PickVideoPosition": "Elegir posición del vídeo", + "Play": "Reproducir", + "PlayFromStartOfVideo": "Reprod. desde el inicio del vídeo", + "PlayNext": "Reprod. siguiente", + "PlaySelectedLines": "Reprod. líneas seleccionadas", + "PlaySelectedLinesWithLoop": "Reprod. líneas seleccionadas en bucle", + "PleaseEnterAValidValueForX": "Por favor, introduzca un valor válido para \"{0}\"", + "PleaseWait": "Por favor, espere...", + "Position": "Posición", + "PositionX": "Posición: {0}", + "PostProcessing": "Post-procesamiento", + "PoweredBy": "Impulsado por", + "Prefix": "Prefijo", + "Preview": "Vista previa", + "Profile": "Perfil", + "ProfileName": "Nombre del perfil", + "Profiles": "Perfiles", + "Property": "Propiedad", + "Question": "Pregunta", + "ReDownloadX": "Volver a descargar {0}", + "Reason": "Razón", + "RecentFiles": "Archivos recientes", + "Redo": "Rehacer", + "Refresh": "Actualizar", + "Region": "Región", + "RegularExpression": "Expresión regular", + "RegularExpressionIsNotValid": "¡La expresión regular no es válida!", + "RelativeToCurrentVideoPosition": "Relativo a la posición actual del vídeo", + "Remove": "Eliminar", + "RemoveAlignment": "Eliminar alineación", + "RemoveAllFormatting": "Eliminar todo el formato", + "RemoveBlankLines": "Eliminar líneas en blanco", + "RemoveBold": "Eliminar negrita", + "RemoveColor": "Eliminar color", + "RemoveFilter": "Eliminar filtro", + "RemoveFontName": "Eliminar nombre de fuente", + "RemoveFormatting": "Eliminar formato", + "RemoveItalic": "Eliminar cursiva", + "RemoveRightToLeftUnicodeTags": "Eliminar etiquetas Unicode RTL", + "RemoveSelectedFile": "¿Eliminar archivo seleccionado?", + "RemoveStyling": "Eliminar estilo", + "RemoveTextForHearingImpaired": "Eliminar texto para deficientes auditivos", + "RemoveUnderline": "Eliminar subrayado", + "Rename": "Renombrar", + "Replace": "Reemplazar", + "ReplaceWith": "Reemplazar con", + "RequiresRestart": "Requiere reiniciar", + "Reset": "Restablecer", + "Resolution": "Resolución", + "ResolutionX": "Resolución: {0}", + "ReverseRightToLeftStartEnd": "Invertir inicio/fin RTL", + "Right": "Derecha", + "RightToLeft": "Derecha a izquierda", + "Rules": "Reglas", + "SaveChangesMessage": "¿Desea guardar los cambios en el archivo de subtítulos actual?", + "SaveChangesTitle": "¿Guardar cambios?", + "SaveChangesToX": "¿Desea guardar los cambios en \"{0}\"?", + "SaveChangesToXOriginal": "¿Desea guardar los cambios en el archivo original \"{0}\"?", + "SaveDotDotDot": "Guardar...", + "SaveFileAsTitle": "Guardar archivo como", + "SaveImageAs": "Guardar imagen como", + "SaveImageAsDotDotDot": "Guardar imagen como...", + "SaveOriginalAsTitle": "Guardar original como", + "SaveTranslationAsTitle": "Guardar traducción como", + "SaveVideoAsVideoTitle": "Guardar vídeo como", + "SavedChangesToX": "Guardado \"{0}\"", + "SavedChangesToXAndY": "Guardado \"{0}\" y \"{1}\"", + "SavingDotDotDot": "Guardando...", + "Script": "Guion", + "Search": "Buscar", + "SearchDirection": "Dirección de búsqueda", + "SearchFontNames": "Buscar nombres de fuente...", + "SearchSubtitleFormats": "Buscar formatos de subtítulos", + "Seconds": "Segundos", + "SelectAll": "Seleccionar todo", + "SelectFilesToConvert": "Seleccionar archivos para convertir", + "SelectNone": "No seleccionar nada", + "SelectSaveFolder": "Seleccionar carpeta para guardar", + "SelectSubtitle": "Seleccionar subtítulo", + "SelectedAFolderToSaveTo": "Carpeta seleccionada para guardar", + "SelectedLines": "Líneas seleccionadas", + "SelectedlinesX": "Líneas seleccionadas: {0}", + "Sensitivity": "Sensibilidad", + "Separator": "Separador", + "SessionKey": "Clave de sesión", + "SessionKeyGenerate": "Generar nueva clave", + "SetEnd": "Establecer fin", + "SetEndAndGoToNext": "Establecer fin e ir al siguiente", + "SetEndAndOffsetTheRest": "Establecer fin y desfasar el resto", + "SetFontDotDotDot": "Establecer fuente...", + "SetStart": "Establecer inicio", + "SetStartAndOffsetTheRest": "Establecer inicio y desfasar el resto", + "SetVideoOffset": "Establecer desfase de vídeo", + "Settings": "Ajustes", + "Shadow": "Sombra", + "ShadowColor": "Color de sombra", + "ShadowWidth": "Ancho de sombra", + "Shortcut": "Atajo", + "ShortcutX": "Atajo: {0}", + "Shortcuts": "Atajos", + "Show": "Mostrar", + "ShowActorColumn": "Mostrar columna \"Actor\"", + "ShowCpsColumn": "Mostrar columna \"Car./seg\"", + "ShowDurationColumn": "Mostrar columna \"Duración\"", + "ShowGapColumn": "Mostrar columna \"Espacio\"", + "ShowStartColumn": "Mostrar columna \"Inicio\"", + "ShowHideColumn": "Mostrar columna \"Ocultar\"", + "ShowHistory": "Mostrar historial", + "ShowLayerColumn": "Mostrar columna \"Capa\"", + "ShowPreview": "Mostrar vista previa", + "ShowShotChangesList": "Mostrar lista de cambios de plano", + "ShowStyleColumn": "Mostrar columna \"Estilo\"", + "ShowTimeCodes": "Mostrar códigos de tiempo", + "ShowWpmColumn": "Mostrar columna \"Pal./min\"", + "ShowPixelWidthColumn": "Mostrar columna \"Ancho píxeles\"", + "Shrink": "Encoger", + "SingleBox": "Caja única", + "SingleLineLengths": "Longitud de línea única:", + "SingleMode": "Modo único", + "Size": "Tamaño", + "SizeX": "Tamaño: {0}", + "Skip": "Omitir", + "SkipAll": "Omitir todo", + "SkipOnce": "Omitir una vez", + "Smart": "Inteligente", + "SnapSelectedLinesToNearestShotChange": "Ajustar inicio/fin de líneas al cambio de plano más cercano", + "SolidColor": "Color sólido", + "SourceViewX": "Vista de origen - {0}", + "Spacing": "Espaciado", + "SpeechToTextSelectedLines": "Voz a texto seleccionadas (ver Opciones - Ajustes)", + "SpeechToTextSelectedLinesPromptAlways": "Voz a texto seleccionadas (preguntar siempre motor/idioma)", + "SpeechToTextSelectedLinesPromptFirstTime": "Voz a texto seleccionadas (preguntar motor/idioma solo la primera vez)", + "Speed": "Velocidad", + "SplitAtTextBoxCursorPosition": "Dividir en la posición del cursor", + "SplitLine": "Dividir línea", + "SplitLineAtTextBoxCursorPosition": "Dividir línea en la posición del cursor", + "SplitLineAtVideoAndTextBoxPosition": "Dividir línea en pos. vídeo y cuadro texto", + "SplitLineAtVideoPosition": "Dividir línea en la posición del vídeo", + "StartFrom": "Empezar desde", + "StartTime": "Tiempo de inicio", + "StartingDotDotDot": "Iniciando...", + "Status": "Estado", + "Stereo": "Estéreo", + "Stop": "Parar", + "Strikeout": "Tachado", + "Style": "Estilo", + "StyleExaggeration": "Exageración de estilo", + "StyleLanguage": "Estilo / Idioma", + "Styles": "Estilos", + "SubtitleFile": "Archivo de subtítulos", + "SubtitleFileName": "Nombre del archivo de subtítulos", + "SubtitleFileSaved": "Archivo de subtítulos guardado", + "SubtitleFileSavedToX": "Archivo de subtítulos guardado en {0}", + "SubtitleFiles": "Archivos de subtítulos", + "SubtitleFormats": "Formatos de subtítulos", + "SubtitleLoadedX": "Subtítulo cargado: {0}", + "SubtitleXOfY": "Subtítulo {0} de {1}", + "Suffix": "Sufijo", + "Suggestions": "Sugerencias", + "Sync": "Sincronizar", + "SyntaxColoring": "Coloreado de sintaxis", + "System": "Sistema", + "TargetEncoding": "Codificación de destino", + "TargetFormat": "Formato de destino", + "TenHours": "10 horas", + "TenMilliseconds": "10 milisegundos", + "Text": "Texto", + "TextColor": "Color de texto", + "TextFiles": "Archivos de texto", + "TextOrImage": "Texto/imagen", + "ThreeLetterLanguageCode": "Código de idioma de tres letras", + "Time": "Tiempo", + "TimeCodes": "Códigos de tiempo", + "Timing": "Tiempos", + "Title": "Título", + "To": "A", + "ToggleCasing": "Alternar mayúsculas/minúsculas", + "ToggleDirection": "Alternar dirección", + "ToggleForced": "Alternar forzado", + "ToggleShotChangesAtVideoPosition": "Alternar cambios de plano en posición del vídeo", + "Toolbar": "Barra de herramientas", + "Tools": "Herramientas", + "TopCenter": "Arriba-Centro", + "TopLeft": "Arriba-Izquierda", + "TopRight": "Arriba-Derecha", + "TotalAdjustmentX": "Ajuste total: {0}", + "TotalFramesX": "Fotogramas totales: {0:#;##0.##}", + "TotalLengthX": "Longitud total: {0}", + "TotalLengthXSplitLine": "Longitud total: {0} (¡dividir línea!)", + "Translate": "Traducir", + "TranslateRow": "Traducir fila", + "Translation": "Traducción", + "TwoLetterLanguageCode": "Código de idioma de dos letras", + "Type": "Tipo", + "Unbreak": "Unir texto", + "UnbreakLines": "Unir líneas", + "Underline": "Subrayado", + "Undo": "Deshacer", + "Unknown": "Desconocido", + "UnknownSubtitleFormat": "Formato de subtítulo desconocido", + "Unpacking7ZipArchiveDotDotDot": "Desempaquetando archivo 7-zip...", + "UnpackingX": "Desempaquetando {0}", + "Untitled": "Sin título", + "Update": "Actualizar", + "UpdateAndClose": "Actualizar y cerrar", + "UpdateDetails": "Detalles de actualización", + "UpdatedBy": "Actualizado por", + "Url": "URL", + "Usages": "Usos", + "Use": "Usar", + "UseAlways": "Usar siempre", + "UseLargerFontForThisWindow": "Usar fuente más grande para esta ventana", + "UseOnce": "Usar una vez", + "UseOutputFolder": "Usar carpeta de salida", + "UseSourceFolder": "Usar carpeta de origen", + "UseSourceResolution": "Usar resolución de origen", + "UserName": "Nombre de usuario", + "UserNameAlreadyInUse": "Nombre de usuario ya en uso", + "Vertical": "Vertical", + "Video100MsBack": "Vídeo, 100 ms atrás", + "Video100MsForward": "Vídeo, 100 ms adelante", + "Video500MsBack": "Vídeo, 500 ms atrás", + "Video500MsForward": "Vídeo, 500 ms adelante", + "VideoCustom1BackX": "Vídeo, milisegundos personalizados ({0:#,###,##0}) atrás, 1", + "VideoCustom1ForwardX": "Vídeo, milisegundos personalizados ({0:#,###,##0}) adelante, 1", + "VideoCustom2BackX": "Vídeo, milisegundos personalizados ({0:#,###,##0}) atrás, 2", + "VideoCustom2ForwardX": "Vídeo, milisegundos personalizados ({0:#,###,##0}) adelante, 2", + "VideoEncodingX": "Codificación de vídeo: {0}", + "VideoExtension": "Extensión de archivo de vídeo", + "VideoFile": "Archivo de vídeo", + "VideoFileGeneratedX": "Archivo de vídeo generado: \"{0}\"", + "VideoFiles": "Archivos de vídeo", + "VideoInformation": "Info. vídeo", + "VideoOffset": "Desfase de vídeo", + "VideoOneFrameBack": "Vídeo, un fotograma atrás", + "VideoOneFrameForward": "Vídeo, un fotograma adelante", + "VideoOneSecondBack": "Vídeo, un segundo atrás", + "VideoOneSecondForward": "Vídeo, un segundo adelante", + "VideoPlayer": "Reproductor de vídeo", + "VideoPosition": "Posición del vídeo", + "VideoResolution": "Resolución del vídeo", + "ViewX": "Ver {0}", + "Visible": "Visible", + "Voice": "Voz", + "Warning": "Aviso", + "WaveformCenterOnVideoPosition": "Centrar forma de onda en posición del vídeo", + "WaveformPasteFromClipboard": "Pegar desde el portapapeles", + "WaveformSpectrogram": "Forma de onda/espectrograma", + "WebServiceUrl": "URL del servicio web", + "Width": "Ancho", + "WindowPositionAndSize": "Posición y tamaño de la ventana", + "WordsPerMin": "Pal./min", + "PixelWidth": "Ancho píxeles", + "Wpm": "Pal./min", + "XFiles": "{0:#,###,##0} archivos", + "XFilesConvertedInY": "{0:#,###,##0} archivos convertidos en {1}", + "XNotFound": "\"{0}\" no encontrado", + "XRequiresAnApiKey": "{0} requiere una clave API", + "XSeconds": "{0:0.0##} segundos", + "XSubtitles": "{0:#,###,##0} subtítulos", + "Yes": "Sí", + "CopyToClipboard": "Copiar al portapapeles", + "PlayCurrent": "Reproducir actual", + "LeftMargin": "Margen izquierdo", + "RightMargin": "Margen derecho", + "Installed": "Instalado", + "AdvancedDotDotDot": "Avanzado...", + "ChooseAlignment": "Elegir alineación", + "MaxWidthPixels": "Ancho máximo (píxeles)", + "SampleText": "Texto de muestra", + "BoxWidthPixels": "Ancho del cuadro (píxeles)", + "FadeInOut": "Fundido de entrada/salida", + "Alpha": "Alfa", + "PickResolution": "Elegir resolución", + "ManualSync": "Sincronización manual" }, - "main": { - "menu": { - "file": "_Archivo", - "new": "_Nuevo", - "newKeepVideo": "Nuevo (mantener _vídeo)", - "open": "_Abrir...", - "openKeepVideo": "Abrir (_mantener vídeo)...", - "openOriginal": "Abrir ori_ginal...", - "closeOriginal": "_Cerrar original", - "reopen": "_Reabrir...", - "clearRecentFiles": "_Limpiar archivos recientes", - "restoreAutoBackup": "Restaurar copia de _seguridad automática...", - "save": "_Guardar", - "saveAs": "Guardar _como...", - "openContainingFolder": "Abrir _carpeta contenedora", - "compare": "Com_parar...", - "statistics": "E_stadísticas...", - "import": "_Importar", - "export": "_Exportar", - "exit": "Sa_lir", - "edit": "_Editar", - "undo": "_Deshacer", - "redo": "Re_hacer", - "showHistory": "_Mostrar historial para deshacer...", - "find": "_Buscar...", - "findNext": "Buscar _siguiente", - "replace": "_Reemplazar...", - "multipleReplace": "Reemplazo _múltiple...", - "goToLineNumber": "_Ir al número de línea...", - "rightToLeftMode": "Modo d_erecha a izquierda", - "modifySelectionDotDotDot": "Modificar _selección...", - "tools": "_Herramientas", - "toolsSelectedLines": "_Herramientas (líneas seleccionadas)", - "adjustDurations": "_Ajustar duraciones...", - "applyDurationLimits": "Aplicar _límites de duración...", - "batchConvert": "Conversión por _lotes...", - "bridgeGaps": "Unir _espacios...", - "applyMinGap": "Aplicar espacio mín. entre subtítulos...", - "changeCasing": "_Cambiar mayúsculas/minúsculas...", - "changeFormatting": "Cambiar formato...", - "fixCommonErrors": "Corregir errores _comunes...", - "checkAndFixNetflixErrors": "Comprobar y corregir errores de Netfli_x...", - "makeEmptyTranslationFromCurrentSubtitle": "Crear nueva traducción _vacía desde subtítulo actual", - "mergeLinesWithSameText": "_Combinar líneas con el mismo texto...", - "mergeLinesWithSameTimeCodes": "Combinar líneas con mismos códigos de tiempo...", - "splitBreakLongLines": "Dividir/reequilibrar líneas largas...", - "mergeShortLines": "Combinar líneas cortas...", - "renumber": "Renumerar...", - "removeTextForHearingImpaired": "_Eliminar texto para deficientes auditivos...", - "convertActors": "Convertir actores...", - "joinSubtitles": "_Unir subtítulos...", - "splitSubtitle": "_Dividir subtítulo...", - "assaTools": "Herramientas _ASSA", - "assaProgressBar": "Generar barra de _progreso...", - "assaChangeResolution": "Cambiar _resolución...", - "assaGenerateBackground": "Generar cajas de _fondo...", - "assaApplyAdvancedEffects": "Aplicar efectos _avanzados...", - "assaApplyCustomOverrideTags": "Aplicar etiquetas de _anulación...", - "assaSetPosition": "Establecer _posición...", - "assaImageColorPicker": "Selector de color de _imagen...", - "assaDraw": "_Dibujar...", - "assaStyles": "E_stilos...", - "assaProperties": "P_ropiedades...", - "assaAttachments": "_Adjuntos...", - "spellCheckTitle": "Ortografía", - "spellCheck": "_Corrector ortográfico...", - "findDoubleWords": "_Buscar palabras dobles...", - "findDoubleLines": "_Buscar líneas dobles...", - "addNameToNamesList": "_Añadir nombre a la lista...", - "getDictionaries": "_Obtener diccionarios...", - "video": "_Vídeo", - "openVideo": "_Abrir vídeo...", - "openVideoFromUrl": "Abrir vídeo desde _URL...", - "closeVideoFile": "_Cerrar archivo de vídeo", - "audioTracks": "_Pistas de audio", - "speechToText": "_Voz a texto...", - "textToSpeech": "_Texto a voz...", - "setVideoOffset": "Establecer desfase de vídeo...", - "updateVideoOffsetX": "Actualizar desfase de vídeo desde {0}...", - "smpteTiming": "Tiempos SMPTE (tasa fotogramas no entera)", - "generateBurnIn": "Generar vídeo con subtítulos _incrustados...", - "generateTransparent": "_Generar vídeo transparente con subtítulos...", - "generateImportShotChanges": "Generar/importar cambios de _plano...", - "listShotChanges": "Listar cambios de p_lano...", - "undockVideoControls": "_Desacoplar controles de vídeo", - "dockVideoControls": "_Acoplar controles de vídeo", - "synchronization": "Si_ncronización", - "adjustAllTimes": "_Ajustar todos los tiempos...", - "changeFrameRate": "Cambiar _tasa de fotogramas...", - "changeSpeed": "Cambiar _velocidad...", - "visualSync": "Sincronización _visual...", - "options": "_Opciones", - "settings": "_Ajustes...", - "shortcuts": "Atajos de _teclado...", - "wordLists": "_Listas de palabras...", - "chooseLanguage": "_Elegir idioma de la interfaz...", - "translate": "Tr_aducir", - "autoTranslate": "Traducción _automática...", - "translateViaCopyPaste": "Auto-traducir mediante _copiar-pegar...", - "helpTitle": "A_yuda", - "help": "A_yuda...", - "about": "_Acerca de...", - "checkForUpdates": "_Buscar actualizaciones...", - "fixRightToLeftViaUnicodeControlCharacters": "Corregir RTL mediante caracteres Unicode (líneas sel.)", - "removeUnicodeControlCharacters": "Eliminar caracteres de control Unicode (líneas sel.)", - "reverseRightToLeftStartEnd": "Invertir inicio/fin RTL (líneas sel.)", - "pointSync": "Sincronización por _puntos...", - "pointSyncViaOther": "Sincronización por puntos mediante _otro subtítulo...", - "sortSubtitles": "_Ordenar subtítulos...", - "setLayer": "Establecer capa...", - "filterLayersForDisplayDotDotDot": "Filtrar capas para visualización..." + "Main": { + "AudioTrackIsNowX": "La pista de audio es ahora \"{0}\"", + "AudioTrackX": "Pista de audio {0}", + "AutoBreakHint": "Dividir líneas seleccionadas automáticamente", + "CharactersPerSecond": "Car./segundo: {0}", + "ChooseColumn": "Elegir columna", + "ColumnPaste": "Pegado de columna", + "CreatedEmptyTranslation": "Creada traducción vacía desde subtítulo actual", + "DeleteText": "Eliminar texto", + "DeleteTextAndShiftCellsUp": "Eliminar texto y desplazar celdas arriba", + "EndTimeMustBeAfterStartTime": "El tiempo final debe ser posterior al tiempo de inicio.", + "ErrorLoad7Zip": "Este archivo parece ser un archivo 7-Zip comprimido.\n\nSubtitle Edit no puede abrir archivos comprimidos.", + "ErrorLoadBinaryZeroes": "¡Lo sentimos, este archivo solo contiene ceros binarios!\n\nSi has editado este archivo con Subtitle Edit, podrías encontrar una copia en Archivo -> Restaurar copia de seguridad automática...", + "ErrorLoadGZip": "Este archivo parece ser un archivo GZip comprimido.\n\nSubtitle Edit no puede abrir archivos comprimidos.", + "ErrorLoadJpg": "Este archivo parece ser una imagen JPG.\n\nSubtitle Edit no puede abrir archivos de imagen.", + "ErrorLoadPng": "Este archivo parece ser una imagen PNG.\n\nSubtitle Edit no puede abrir archivos de imagen.", + "ErrorLoadRar": "Este archivo parece ser un archivo Rar comprimido.\n\nSubtitle Edit no puede abrir archivos comprimidos.", + "ErrorLoadSrr": "Este archivo parece ser un archivo ReScene SRR.\n\nSubtitle Edit no puede abrir archivos SRR.", + "ErrorLoadTorrent": "Este archivo parece ser un archivo BitTorrent.\n\nSubtitle Edit no puede abrir archivos torrent.", + "ErrorLoadZip": "Este archivo parece ser un archivo ZIP comprimido.\n\nSubtitle Edit no puede abrir archivos comprimidos.", + "ExtractingWaveInfo": "Extrayendo info de onda...", + "ExtractingShotChanges": "Extrayendo cambios de plano...", + "FailedToExtractWaveInfo": "Error al extraer info de onda.", + "FixedRightToLeftUsingUnicodeControlCharactersX": "Corregido derecha a izquierda usando caracteres Unicode en {0} líneas", + "GeneratingSpectrogramDotDotDot": "Generando espectrograma...", + "GeneratingWaveformDotDotDot": "Generando forma de onda...", + "InsertEmptyTextAndShiftCellsDown": "Insertar texto vacío y desplazar celdas abajo", + "InsertTextFromSubtitleDotDotDot": "Insertar texto desde subtítulo...", + "CopyTextFromOriginalToCurrent": "Copiar texto del original al subtítulo actual", + "InsertedXTextsFromSubtitleY": "Insertados {0} textos del archivo de subtítulos \"{1}\"", + "ItalicHint": "Poner en cursiva líneas/texto seleccionados", + "JoinedSubtitleLoaded": "Subtítulo unido cargado", + "LineXTextAndTimingChanged": "Línea {0}: Texto y tiempos cambiados", + "LineXTextChangedFromYToZ": "Línea {0}: Texto cambiado de \"{1}\" a \"{2}\"", + "LineXTimingChanged": "Línea {0}: Tiempos cambiados", + "LoadingWaveInfoFromCache": "Cargando info de onda desde caché...", + "NoTextInClipboard": "No hay texto en el portapapeles", + "OneLineCopiedFromOriginal": "Una línea copiada del subtítulo original", + "OneLineMerged": "Una línea combinada", + "OneLineSwitched": "Una línea intercambiada", + "OverwriteExistingCells": "Sobrescribir celdas existentes", + "OverwriteOrShiftCellsDown": "Sobrescribir/desplazar celdas abajo", + "ParsingMatroskaFile": "Analizando archivo Matroska...", + "PasteFromClipboardDotDotDot": "Pegar desde el portapapeles...", + "RedoPerformed": "Rehacer realizado", + "RedoPerformedXActionLeft": "Rehacer realizado (acciones restantes: {0})", + "RemovedUnicodeControlCharactersX": "Eliminados caracteres de control Unicode en {0} líneas", + "RemovedXBlankLines": "Eliminadas {0} líneas en blanco", + "ReplacedXWithYCountZ": "Reemplazado \"{0}\" con \"{1}\" ({2} ocurrencias)", + "ReplacedXWithYInLineZ": "Reemplazado \"{0}\" con \"{1}\" en la línea {2}", + "ReversedStartAndEndingsForRightToLeftX": "Invertido inicio y fin para derecha a izquierda en {0} líneas", + "RuleProfileIsX": "El perfil de reglas es ahora \"{0}\"", + "SaveLanguageFile": "Guardar archivo de idioma", + "SaveXFileAs": "Guardar archivo {0} como", + "ShiftTextCellsDown": "Desplazar celdas de texto abajo", + "SingleLineLength": "Longitud de línea: ", + "SpeedIsNowX": "La velocidad es ahora \"{0}\"", + "SpellCheckResult": "Corrección ortográfica completada. \n\n• Palabras cambiadas: {0}\n• Palabras omitidas: {1}", + "SubtitleImportedFromMatroskaFile": "Subtítulo importado desde archivo Matroska", + "TextDown": "Texto abajo", + "TextOnly": "Solo texto", + "TextUp": "Texto arriba", + "TimeCodesOnly": "Solo códigos de tiempo", + "XPropertiesDotDotDot": "Propiedades de {0}...", + "TotalCharacters": "Total de caracteres: {0}", + "UnbreakHint": "Unir líneas seleccionadas", + "UndoPerformed": "Deshacer realizado", + "UndoPerformedXActionLeft": "Deshacer realizado (acciones restantes: {0})", + "XLinesCopiedFromOriginal": "{0} líneas copiadas del subtítulo original", + "XLinesMerged": "X líneas combinadas", + "XLinesSelectedOfY": "{0} líneas seleccionadas de {1}", + "XLinesSwitched": "{0} líneas intercambiadas", + "XShotChangedLoaded": "{0} cambios de plano cargados", + "YoutubeDlDownloadedSuccessfully": "\"yt-dlp\" descargado con éxito.", + "YoutubeDlNotInstalledDownloadNow": "\"yt-dlp\" no está instalado y es necesario para reproducir vídeos en línea.\n\n¿Descargar ahora?", + "InsertUnicodeSymbol": "Insertar símbolo Unicode", + "TrimmedXLines": "Recortadas {0} líneas de subtítulos", + "OpenOriginalDifferentNumberOfSubtitlesXY": "El archivo original no tiene el mismo número de subtítulos que el actual.\n\n• Subtítulos originales: {0}\n• Subtítulos actuales: {1}", + "ImportXMatchingOriginalLines": "¿Importar {0} subtítulos originales coincidentes?", + "VideoOpenedChangeLayoutQuestion": "Se ha abierto un archivo de vídeo.\n\n¿Deseas cambiar el diseño para mostrar el panel de vídeo?", + "SortedByStartTime": "Ordenado por tiempo de inicio", + "SortedByEndTime": "Ordenado por tiempo final", + "ColorHint": "Colorear líneas seleccionadas", + "RemoveFormattingHint": "Eliminar formato de las líneas seleccionadas", + "AssaResolutionResamplerDone": "Resolución ASSA cambiada.", + "LanguageFileSavedToX": "Archivo de idioma guardado en {0}", + "FileExportedInFormatXToY": "Archivo exportado en formato {0} a {1}", + "FileExportedInFormatXToFileY": "Archivo exportado en formato \"{0}\" al archivo \"{1}\"", + "FixedXLines": "Corregidas {0} líneas", + "TranscriptionCompletedWithXLines": "Transcripción completada con {0} líneas", + "ReplacedXOccurrences": "Reemplazadas {0} ocurrencias", + "FfmpegDownloadedAndInstalledToX": "ffmpeg descargado e instalado en {0}", + "NothingToSave": "Nada que guardar", + "NothingToSaveOriginal": "Nada que guardar (original)", + "LiveSpellCheckLanguageXLoaded": "Idioma de corrección en vivo {0} cargado", + "DownloadFfmpegTitle": "¿Descargar FFmpeg?", + "DownloadFfmpegQuestion": "FFmpeg es necesario para reproducir vídeos en línea y para algunas funciones de edición.\n\n¿Descargar FFmpeg ahora?", + "Menu": { + "File": "_Archivo", + "New": "_Nuevo", + "NewKeepVideo": "Nuevo (mantener _vídeo)", + "Open": "_Abrir...", + "OpenKeepVideo": "Abrir (_mantener vídeo)...", + "OpenOriginal": "Abrir ori_ginal...", + "CloseOriginal": "_Cerrar original", + "Reopen": "_Reabrir...", + "ClearRecentFiles": "_Limpiar archivos recientes", + "RestoreAutoBackup": "Restaurar copia de _seguridad automática...", + "Save": "_Guardar", + "SaveAs": "Guardar _como...", + "OpenContainingFolder": "Abrir _carpeta contenedora", + "Compare": "Com_parar...", + "Statistics": "E_stadísticas...", + "Import": "_Importar", + "Export": "_Exportar", + "Exit": "Sa_lir", + "Edit": "_Editar", + "Undo": "_Deshacer", + "Redo": "Re_hacer", + "ShowHistory": "_Mostrar historial para deshacer...", + "Find": "_Buscar...", + "FindNext": "Buscar _siguiente", + "Replace": "_Reemplazar...", + "MultipleReplace": "Reemplazo _múltiple...", + "GoToLineNumber": "_Ir al número de línea...", + "RightToLeftMode": "Modo d_erecha a izquierda", + "ModifySelectionDotDotDot": "Modificar _selección...", + "Tools": "_Herramientas", + "ToolsSelectedLines": "_Herramientas (líneas seleccionadas)", + "AdjustDurations": "_Ajustar duraciones...", + "ApplyDurationLimits": "Aplicar _límites de duración...", + "BatchConvert": "Conversión por _lotes...", + "BridgeGaps": "Unir _espacios...", + "ApplyMinGap": "Aplicar espacio mín. entre subtítulos...", + "ChangeCasing": "_Cambiar mayúsculas/minúsculas...", + "ChangeFormatting": "Cambiar formato...", + "FixCommonErrors": "Corregir errores _comunes...", + "CheckAndFixNetflixErrors": "Comprobar y corregir errores de Netfli_x...", + "MakeEmptyTranslationFromCurrentSubtitle": "Crear nueva traducción _vacía desde subtítulo actual", + "MergeLinesWithSameText": "_Combinar líneas con el mismo texto...", + "MergeLinesWithSameTimeCodes": "Combinar líneas con mismos códigos de tiempo...", + "SplitBreakLongLines": "Dividir/reequilibrar líneas largas...", + "MergeShortLines": "Combinar líneas cortas...", + "Renumber": "Renumerar...", + "RemoveTextForHearingImpaired": "_Eliminar texto para deficientes auditivos...", + "ConvertActors": "Convertir actores...", + "JoinSubtitles": "_Unir subtítulos...", + "SplitSubtitle": "_Dividir subtítulo...", + "AssaTools": "Herramientas _ASSA", + "AssaProgressBar": "Generar barra de _progreso...", + "AssaChangeResolution": "Cambiar _resolución...", + "AssaGenerateBackground": "Generar cajas de _fondo...", + "AssaApplyAdvancedEffects": "Aplicar efectos _avanzados...", + "AssaApplyCustomOverrideTags": "Aplicar etiquetas de _anulación...", + "AssaSetPosition": "Establecer _posición...", + "AssaImageColorPicker": "Selector de color de _imagen...", + "AssaDraw": "_Dibujar...", + "AssaStyles": "E_stilos...", + "AssaProperties": "P_ropiedades...", + "AssaAttachments": "_Adjuntos...", + "SpellCheckTitle": "Ortografía", + "SpellCheck": "_Corrector ortográfico...", + "FindDoubleWords": "_Buscar palabras dobles...", + "FindDoubleLines": "_Buscar líneas dobles...", + "AddNameToNamesList": "_Añadir nombre a la lista...", + "GetDictionaries": "_Obtener diccionarios...", + "Video": "_Vídeo", + "OpenVideo": "_Abrir vídeo...", + "OpenVideoFromUrl": "Abrir vídeo desde _URL...", + "CloseVideoFile": "_Cerrar archivo de vídeo", + "AudioTracks": "_Pistas de audio", + "SpeechToText": "_Voz a texto...", + "TextToSpeech": "_Texto a voz...", + "SetVideoOffset": "Establecer desfase de vídeo...", + "UpdateVideoOffsetX": "Actualizar desfase de vídeo desde {0}...", + "SmpteTiming": "Tiempos SMPTE (tasa fotogramas no entera)", + "GenerateBurnIn": "Generar vídeo con subtítulos _incrustados...", + "GenerateTransparent": "_Generar vídeo transparente con subtítulos...", + "GenerateImportShotChanges": "Generar/importar cambios de _plano...", + "ListShotChanges": "Listar cambios de p_lano...", + "UndockVideoControls": "_Desacoplar controles de vídeo", + "DockVideoControls": "_Acoplar controles de vídeo", + "Synchronization": "Si_ncronización", + "AdjustAllTimes": "_Ajustar todos los tiempos...", + "ChangeFrameRate": "Cambiar _tasa de fotogramas...", + "ChangeSpeed": "Cambiar _velocidad...", + "VisualSync": "Sincronización _visual...", + "Options": "_Opciones", + "Settings": "_Ajustes...", + "Shortcuts": "Atajos de _teclado...", + "WordLists": "_Listas de palabras...", + "ChooseLanguage": "_Elegir idioma de la interfaz...", + "Translate": "Tr_aducir", + "AutoTranslate": "Traducción _automática...", + "TranslateViaCopyPaste": "Auto-traducir mediante _copiar-pegar...", + "HelpTitle": "A_yuda", + "Help": "A_yuda...", + "About": "_Acerca de...", + "CheckForUpdates": "_Buscar actualizaciones...", + "FixRightToLeftViaUnicodeControlCharacters": "Corregir RTL mediante caracteres Unicode (líneas sel.)", + "RemoveUnicodeControlCharacters": "Eliminar caracteres de control Unicode (líneas sel.)", + "ReverseRightToLeftStartEnd": "Invertir inicio/fin RTL (líneas sel.)", + "PointSync": "Sincronización por _puntos...", + "PointSyncViaOther": "Sincronización por puntos mediante _otro subtítulo...", + "SortSubtitles": "_Ordenar subtítulos...", + "SetLayer": "Establecer capa...", + "FilterLayersForDisplayDotDotDot": "Filtrar capas para visualización..." }, - "toolbar": { - "newHint": "Iniciar un nuevo archivo de subtítulos {0}", - "openHint": "Abrir un archivo de subtítulos existente {0}", - "openVideoHint": "Abrir un archivo de vídeo {0}", - "saveHint": "Guardar el subtítulo actual {0}", - "saveAsHint": "Guardar subtítulo con un nombre nuevo {0}", - "findHint": "Buscar texto en los subtítulos {0}", - "replaceHint": "Buscar y reemplazar texto {0}", - "spellCheckHint": "Comprobar errores ortográficos {0}", - "fixCommonErrorsHint": "Corregir errores comunes de subtítulos {0}", - "settingsHint": "Ajustar la configuración del programa {0}", - "layoutHint": "Cambiar el diseño de los paneles {0}", - "helpHint": "Abrir sitio web de ayuda {0}", - "autoBreakHint": "Dividir automáticamente las líneas largas {0}", - "unbreakHint": "Combinar subtítulos multilínea en una sola línea {0}", - "assaStylesHint": "Estilos Advanced Sub Station Alpha", - "assaPropertiesHint": "Propiedades Advanced Sub Station Alpha", - "assaAttachmentsHint": "Adjuntos Advanced Sub Station Alpha", - "assaDrawHint": "Dibujar formas Advanced Sub Station Alpha" + "Toolbar": { + "NewHint": "Iniciar un nuevo archivo de subtítulos {0}", + "OpenHint": "Abrir un archivo de subtítulos existente {0}", + "OpenVideoHint": "Abrir un archivo de vídeo {0}", + "SaveHint": "Guardar el subtítulo actual {0}", + "SaveAsHint": "Guardar subtítulo con un nombre nuevo {0}", + "FindHint": "Buscar texto en los subtítulos {0}", + "ReplaceHint": "Buscar y reemplazar texto {0}", + "SpellCheckHint": "Comprobar errores ortográficos {0}", + "FixCommonErrorsHint": "Corregir errores comunes de subtítulos {0}", + "SettingsHint": "Ajustar la configuración del programa {0}", + "LayoutHint": "Cambiar el diseño de los paneles {0}", + "HelpHint": "Abrir sitio web de ayuda {0}", + "AutoBreakHint": "Dividir automáticamente las líneas largas {0}", + "UnbreakHint": "Combinar subtítulos multilínea en una sola línea {0}", + "AssaStylesHint": "Estilos Advanced Sub Station Alpha", + "AssaPropertiesHint": "Propiedades Advanced Sub Station Alpha", + "AssaAttachmentsHint": "Adjuntos Advanced Sub Station Alpha", + "AssaDrawHint": "Dibujar formas Advanced Sub Station Alpha" }, - "waveform": { - "playPauseHint": "Reproducir / Pausa {0}", - "playNextHint": "Reproducir siguiente {0}", - "playSelectionHint": "Reproducir selección {0}", - "setStartAndOffsetTheRestHint": "Establecer inicio del subtítulo actual y desfasar el resto {0}", - "setStartHint": "Establecer inicio del subtítulo actual {0}", - "setEndHint": "Establecer fin del subtítulo actual {0}", - "newHint": "Insertar nuevo subtítulo en la posición del vídeo {0}", - "centerWaveformHint": "Centrar forma de onda en la posición del vídeo al reproducir {0}", - "zoomHorizontalHint": "Zoom horizontal {0}", - "zoomVerticalHint": "Zoom vertical {0}", - "selectCurrentLineWhilePlayingHint": "Seleccionar subtítulo actual durante la reproducción {0}", - "videoPosition": "Posición del vídeo {0}", - "hideWaveformToolbar": "Ocultar barra de herramientas {0}", - "resetZoomAndSpeed": "Restablecer zoom y velocidad de reproducción {0}", - "removeBlankLines": "Eliminar líneas en blanco {0}", - "playSelectedRepeatHint": "Reproducir subtítulo(s) seleccionados en modo repetición {0}" - }, - "audioTrackIsNowX": "La pista de audio es ahora \"{0}\"", - "audioTrackX": "Pista de audio {0}", - "autoBreakHint": "Dividir líneas seleccionadas automáticamente", - "charactersPerSecond": "Car./segundo: {0}", - "chooseColumn": "Elegir columna", - "columnPaste": "Pegado de columna", - "createdEmptyTranslation": "Creada traducción vacía desde subtítulo actual", - "deleteText": "Eliminar texto", - "deleteTextAndShiftCellsUp": "Eliminar texto y desplazar celdas arriba", - "endTimeMustBeAfterStartTime": "El tiempo final debe ser posterior al tiempo de inicio.", - "errorLoad7Zip": "Este archivo parece ser un archivo 7-Zip comprimido.\n\nSubtitle Edit no puede abrir archivos comprimidos.", - "errorLoadBinaryZeroes": "¡Lo sentimos, este archivo solo contiene ceros binarios!\n\nSi has editado este archivo con Subtitle Edit, podrías encontrar una copia en Archivo -> Restaurar copia de seguridad automática...", - "errorLoadGZip": "Este archivo parece ser un archivo GZip comprimido.\n\nSubtitle Edit no puede abrir archivos comprimidos.", - "errorLoadJpg": "Este archivo parece ser una imagen JPG.\n\nSubtitle Edit no puede abrir archivos de imagen.", - "errorLoadPng": "Este archivo parece ser una imagen PNG.\n\nSubtitle Edit no puede abrir archivos de imagen.", - "errorLoadRar": "Este archivo parece ser un archivo Rar comprimido.\n\nSubtitle Edit no puede abrir archivos comprimidos.", - "errorLoadSrr": "Este archivo parece ser un archivo ReScene SRR.\n\nSubtitle Edit no puede abrir archivos SRR.", - "errorLoadTorrent": "Este archivo parece ser un archivo BitTorrent.\n\nSubtitle Edit no puede abrir archivos torrent.", - "errorLoadZip": "Este archivo parece ser un archivo ZIP comprimido.\n\nSubtitle Edit no puede abrir archivos comprimidos.", - "extractingWaveInfo": "Extrayendo info de onda...", - "extractingShotChanges": "Extrayendo cambios de plano...", - "failedToExtractWaveInfo": "Error al extraer info de onda.", - "fixedRightToLeftUsingUnicodeControlCharactersX": "Corregido derecha a izquierda usando caracteres Unicode en {0} líneas", - "generatingSpectrogramDotDotDot": "Generando espectrograma...", - "generatingWaveformDotDotDot": "Generando forma de onda...", - "insertEmptyTextAndShiftCellsDown": "Insertar texto vacío y desplazar celdas abajo", - "insertTextFromSubtitleDotDotDot": "Insertar texto desde subtítulo...", - "copyTextFromOriginalToCurrent": "Copiar texto del original al subtítulo actual", - "insertedXTextsFromSubtitleY": "Insertados {0} textos del archivo de subtítulos \"{1}\"", - "italicHint": "Poner en cursiva líneas/texto seleccionados", - "joinedSubtitleLoaded": "Subtítulo unido cargado", - "lineXTextAndTimingChanged": "Línea {0}: Texto y tiempos cambiados", - "lineXTextChangedFromYToZ": "Línea {0}: Texto cambiado de \"{1}\" a \"{2}\"", - "lineXTimingChanged": "Línea {0}: Tiempos cambiados", - "loadingWaveInfoFromCache": "Cargando info de onda desde caché...", - "noTextInClipboard": "No hay texto en el portapapeles", - "oneLineCopiedFromOriginal": "Una línea copiada del subtítulo original", - "oneLineMerged": "Una línea combinada", - "oneLineSwitched": "Una línea intercambiada", - "overwriteExistingCells": "Sobrescribir celdas existentes", - "overwriteOrShiftCellsDown": "Sobrescribir/desplazar celdas abajo", - "parsingMatroskaFile": "Analizando archivo Matroska...", - "pasteFromClipboardDotDotDot": "Pegar desde el portapapeles...", - "redoPerformed": "Rehacer realizado", - "redoPerformedXActionLeft": "Rehacer realizado (acciones restantes: {0})", - "removedUnicodeControlCharactersX": "Eliminados caracteres de control Unicode en {0} líneas", - "removedXBlankLines": "Eliminadas {0} líneas en blanco", - "replacedXWithYCountZ": "Reemplazado \"{0}\" con \"{1}\" ({2} ocurrencias)", - "replacedXWithYInLineZ": "Reemplazado \"{0}\" con \"{1}\" en la línea {2}", - "reversedStartAndEndingsForRightToLeftX": "Invertido inicio y fin para derecha a izquierda en {0} líneas", - "ruleProfileIsX": "El perfil de reglas es ahora \"{0}\"", - "saveLanguageFile": "Guardar archivo de idioma", - "saveXFileAs": "Guardar archivo {0} como", - "shiftTextCellsDown": "Desplazar celdas de texto abajo", - "singleLineLength": "Longitud de línea: ", - "speedIsNowX": "La velocidad es ahora \"{0}\"", - "spellCheckResult": "Corrección ortográfica completada. \n\n• Palabras cambiadas: {0}\n• Palabras omitidas: {1}", - "subtitleImportedFromMatroskaFile": "Subtítulo importado desde archivo Matroska", - "textDown": "Texto abajo", - "textOnly": "Solo texto", - "textUp": "Texto arriba", - "timeCodesOnly": "Solo códigos de tiempo", - "xPropertiesDotDotDot": "Propiedades de {0}...", - "totalCharacters": "Total de caracteres: {0}", - "unbreakHint": "Unir líneas seleccionadas", - "undoPerformed": "Deshacer realizado", - "undoPerformedXActionLeft": "Deshacer realizado (acciones restantes: {0})", - "xLinesCopiedFromOriginal": "{0} líneas copiadas del subtítulo original", - "xLinesMerged": "X líneas combinadas", - "xLinesSelectedOfY": "{0} líneas seleccionadas de {1}", - "xLinesSwitched": "{0} líneas intercambiadas", - "xShotChangedLoaded": "{0} cambios de plano cargados", - "youtubeDlDownloadedSuccessfully": "\"yt-dlp\" descargado con éxito.", - "youtubeDlNotInstalledDownloadNow": "\"yt-dlp\" no está instalado y es necesario para reproducir vídeos en línea.\n\n¿Descargar ahora?", - "insertUnicodeSymbol": "Insertar símbolo Unicode", - "trimmedXLines": "Recortadas {0} líneas de subtítulos", - "openOriginalDifferentNumberOfSubtitlesXY": "El archivo original no tiene el mismo número de subtítulos que el actual.\n\n• Subtítulos originales: {0}\n• Subtítulos actuales: {1}", - "importXMatchingOriginalLines": "¿Importar {0} subtítulos originales coincidentes?", - "videoOpenedChangeLayoutQuestion": "Se ha abierto un archivo de vídeo.\n\n¿Deseas cambiar el diseño para mostrar el panel de vídeo?", - "sortedByStartTime": "Ordenado por tiempo de inicio", - "sortedByEndTime": "Ordenado por tiempo final", - "colorHint": "Colorear líneas seleccionadas", - "removeFormattingHint": "Eliminar formato de las líneas seleccionadas", - "assaResolutionResamplerDone": "Resolución ASSA cambiada.", - "languageFileSavedToX": "Archivo de idioma guardado en {0}", - "fileExportedInFormatXToY": "Archivo exportado en formato {0} a {1}", - "fileExportedInFormatXToFileY": "Archivo exportado en formato \"{0}\" al archivo \"{1}\"", - "fixedXLines": "Corregidas {0} líneas", - "transcriptionCompletedWithXLines": "Transcripción completada con {0} líneas", - "replacedXOccurrences": "Reemplazadas {0} ocurrencias", - "ffmpegDownloadedAndInstalledToX": "ffmpeg descargado e instalado en {0}", - "nothingToSave": "Nada que guardar", - "nothingToSaveOriginal": "Nada que guardar (original)", - "liveSpellCheckLanguageXLoaded": "Idioma de corrección en vivo {0} cargado", - "downloadFfmpegTitle": "¿Descargar FFmpeg?", - "downloadFfmpegQuestion": "FFmpeg es necesario para reproducir vídeos en línea y para algunas funciones de edición.\n\n¿Descargar FFmpeg ahora?" + "Waveform": { + "PlayPauseHint": "Reproducir / Pausa {0}", + "PlayNextHint": "Reproducir siguiente {0}", + "PlaySelectionHint": "Reproducir selección {0}", + "SetStartAndOffsetTheRestHint": "Establecer inicio del subtítulo actual y desfasar el resto {0}", + "SetStartHint": "Establecer inicio del subtítulo actual {0}", + "SetEndHint": "Establecer fin del subtítulo actual {0}", + "NewHint": "Insertar nuevo subtítulo en la posición del vídeo {0}", + "CenterWaveformHint": "Centrar forma de onda en la posición del vídeo al reproducir {0}", + "ZoomHorizontalHint": "Zoom horizontal {0}", + "ZoomVerticalHint": "Zoom vertical {0}", + "SelectCurrentLineWhilePlayingHint": "Seleccionar subtítulo actual durante la reproducción {0}", + "VideoPosition": "Posición del vídeo {0}", + "HideWaveformToolbar": "Ocultar barra de herramientas {0}", + "ResetZoomAndSpeed": "Restablecer zoom y velocidad de reproducción {0}", + "RemoveBlankLines": "Eliminar líneas en blanco {0}", + "PlaySelectedRepeatHint": "Reproducir subtítulo(s) seleccionados en modo repetición {0}" + } }, - "file": { - "ebuSaveOptions": { - "title": "Opciones de guardado EBU", - "generalSubtitleInformation": "Información general de subtítulos", - "codePageNumber": "Número de página de códigos", - "diskFormatCode": "Código de formato de disco", - "displayStandardCode": "Código estándar de visualización", - "colorRequiresTeletext": "¡Los colores requieren teletexto!", - "alignmentRequiresTeletext": "¡La alineación requiere teletexto!", - "teletextCharsShouldBe38": "¡El máx. de caracteres por fila para teletexto debería ser 38!", - "characterCodeTable": "Tabla de caracteres", - "languageCode": "Código de idioma", - "originalProgramTitle": "Título original del programa", - "originalEpisodeTitle": "Título original del episodio", - "translatedProgramTitle": "Título traducido del programa", - "translatedEpisodeTitle": "Título traducido del episodio", - "translatorsName": "Nombre del traductor", - "subtitleListReferenceCode": "Código de referencia de la lista", - "countryOfOrigin": "País de origen", - "timeCodeStatus": "Estado del código de tiempo", - "timeCodeStartOfProgramme": "Código de tiempo: Inicio del programa", - "revisionNumber": "Número de revisión", - "maxNoOfDisplayableChars": "Máx. caracteres por fila", - "maxNumberOfDisplayableRows": "Máx. número de filas", - "diskSequenceNumber": "Número de secuencia de disco", - "totalNumberOfDisks": "Número total de discos", - "import": "Importar...", - "textAndTimingInformation": "Información de texto y tiempos", - "justificationCode": "Código de justificación", - "verticalPosition": "Posición vertical", - "marginTop": "Margen superior (alineación superior)", - "marginBottom": "Margen inferior (alineación inferior)", - "newLineRows": "Líneas añadidas por un salto de línea", - "teletext": "Teletexto", - "useBox": "Usar caja alrededor del texto", - "doubleHeight": "Usar doble altura para el texto", - "errors": "Errores", - "errorsX": "Errores: {0}", - "maxLengthError": "La línea {0} excede la longitud máx. ({1}) por {2}: {3}", - "textUnchangedPresentation": "Presentación sin cambios", - "textLeftJustifiedText": "Texto justificado a la izquierda", - "textCenteredText": "Texto centrado", - "textRightJustifiedText": "Texto justificado a la derecha", - "useBoxForOneNewLine": "Usar caja para solo un salto de línea", - "discSequenceNumber": "Número de secuencia del disco" - }, - "import": { - "importTimeCodes": "Importar códigos de tiempo...", - "plainTextDotDotDot": "Texto plano...", - "titleImportPlainText": "Importar texto plano", - "imagesForOcrDotDotDot": "Imágenes para OCR...", - "timeCodesDotDotDot": "Códigos de tiempo...", - "subtitleWithManuallyChosenEncodingDotDotDot": "_Subtítulo con codificación manual...", - "titleImportImages": "Importar imágenes", - "importFileLabel": "Elegir imágenes a importar (códigos de tiempo en el nombre)", - "importFilesInfo": "Usar nombres con código de tiempo:\r\ninicio_HH_MM_SS_MMM__fin_HH_MM_SS_MMM[_índice].ext\r\n\r\nEjemplos:\r\n0_00_01_042__0_00_03_919_0001.png\r\n0_00_01_042__0_00_03_919.png\r\n\r\nReglas:\r\n• HH_MM_SS_MMM para tiempos de inicio y fin\r\n• El guion bajo doble separa inicio/fin\r\n• Índice opcional tras el tiempo final", - "formattingDotDotDot": "Formato...", - "imagedBasedSubtitleForEditDotDotDot": "Subtítulo basado en imagen para editar...", - "imagedBasedSubtitleForOcrDotDotDot": "Subtítulo basado en imagen para OCR...", - "splitTextAt": "Dividir texto en", - "blankLines": "Líneas en blanco", - "oneLineIsOneSubtitle": "Una línea es un subtítulo", - "twoLinesAreOneSubtitle": "Dos líneas son un subtítulo", - "importFilesDotDotDot": "Importar archivos...", - "multipleFiles": "Importar de varios archivos de texto (un archivo = un subtítulo)", - "importOptions": "Opciones de importación", - "autoSplitText": "Dividir texto automáticamente", - "lineMode": "Modo de línea", - "maxLineLength": "Longitud máx. de línea", - "maxLinesPerSubtitle": "Máx. líneas por subtítulo", - "minGapBetweenSubtitles": "Espacio mín. entre subtítulos", - "mergeShortLines": "Combinar líneas cortas", - "removeLinesWithoutLetters": "Eliminar líneas sin letras", - "splitAtEndCharsSetting": "Dividir en caracteres finales", - "takeTimeFromCurrentFile": "Tomar tiempo del archivo actual", - "fixed": "Fijo", - "numberOfSubtitlesX": "Número de subtítulos: {0}", - "gapMs": "Espacio (ms)", - "useFixedDuration": "Usar duración fija", - "fixedDurationMs": "Duración fija (ms)", - "alignViaWhisper": "Alinear códigos de tiempo mediante Whisper..." + "File": { + "Compare": "Comparar", + "PreviousDifference": "Diferencia anterior", + "NextDifference": "Diferencia siguiente", + "SubtitlesNotAlike": "Los subtítulos no tienen similitudes", + "XNumberOfDifference": "Número de diferencias: {0}", + "XNumberOfDifferenceAndPercentChanged": "Diferencias: {0} ({1:0.##}% de palabras cambiadas)", + "XNumberOfDifferenceAndPercentLettersChanged": "Diferencias: {0} ({1:0.##}% de letras cambiadas)", + "ShowOnlyDifferences": "Solo diferencias", + "IgnoreLineBreaks": "Ignorar saltos de línea", + "IgnoreWhitespace": "Ignorar espacios en blanco", + "IgnoreFormatting": "Ignorar formato", + "OnlyLookForDifferencesInText": "Solo buscar diferencias en el texto", + "CannotCompareWithImageBasedSubtitles": "No se puede comparar con subtítulos basados en imágenes", + "StatisticsTitle": "Estadísticas", + "ShowOnlyDifferencesInText": "Solo diferencias en texto", + "LoadXFromFile": "Cargar \"{0}\" desde archivo", + "SaveCompareHtmlTitle": "Guardar archivo HTML de comparación", + "PickMatroskaTrackX": "Elegir pista Matroska - {0}", + "RosettaProperties": "Propiedades Timed Text Rosetta IMSC", + "RosettaFontSize": "Tamaño de fuente (altura de fila)", + "XProperties": "Propiedades de {0}", + "EbuSaveOptions": { + "Title": "Opciones de guardado EBU", + "GeneralSubtitleInformation": "Información general de subtítulos", + "CodePageNumber": "Número de página de códigos", + "DiskFormatCode": "Código de formato de disco", + "DisplayStandardCode": "Código estándar de visualización", + "ColorRequiresTeletext": "¡Los colores requieren teletexto!", + "AlignmentRequiresTeletext": "¡La alineación requiere teletexto!", + "TeletextCharsShouldBe38": "¡El máx. de caracteres por fila para teletexto debería ser 38!", + "CharacterCodeTable": "Tabla de caracteres", + "LanguageCode": "Código de idioma", + "OriginalProgramTitle": "Título original del programa", + "OriginalEpisodeTitle": "Título original del episodio", + "TranslatedProgramTitle": "Título traducido del programa", + "TranslatedEpisodeTitle": "Título traducido del episodio", + "TranslatorsName": "Nombre del traductor", + "SubtitleListReferenceCode": "Código de referencia de la lista", + "CountryOfOrigin": "País de origen", + "TimeCodeStatus": "Estado del código de tiempo", + "TimeCodeStartOfProgramme": "Código de tiempo: Inicio del programa", + "RevisionNumber": "Número de revisión", + "MaxNoOfDisplayableChars": "Máx. caracteres por fila", + "MaxNumberOfDisplayableRows": "Máx. número de filas", + "DiskSequenceNumber": "Número de secuencia de disco", + "TotalNumberOfDisks": "Número total de discos", + "Import": "Importar...", + "TextAndTimingInformation": "Información de texto y tiempos", + "JustificationCode": "Código de justificación", + "VerticalPosition": "Posición vertical", + "MarginTop": "Margen superior (alineación superior)", + "MarginBottom": "Margen inferior (alineación inferior)", + "NewLineRows": "Líneas añadidas por un salto de línea", + "Teletext": "Teletexto", + "UseBox": "Usar caja alrededor del texto", + "DoubleHeight": "Usar doble altura para el texto", + "Errors": "Errores", + "ErrorsX": "Errores: {0}", + "MaxLengthError": "La línea {0} excede la longitud máx. ({1}) por {2}: {3}", + "TextUnchangedPresentation": "Presentación sin cambios", + "TextLeftJustifiedText": "Texto justificado a la izquierda", + "TextCenteredText": "Texto centrado", + "TextRightJustifiedText": "Texto justificado a la derecha", + "UseBoxForOneNewLine": "Usar caja para solo un salto de línea", + "DiscSequenceNumber": "Número de secuencia del disco" }, - "export": { - "exportImagesProfiles": "Exportar perfiles de imágenes", - "leftRightMargin": "Margen izq./der.", - "topBottomMargin": "Margen sup./inf.", - "titleExportBluRaySup": "Exportar Blu-ray (sup)", - "lineSpacingPercent": "Espaciado de línea %", - "paddingLeftRight": "Relleno izq./der.", - "paddingTopBottom": "Relleno sup./inf.", - "previewTitle": "Previsualización - tamaño actual: {0}x{1}, destino: {2}x{3}, zoom: {4}%", - "titleExportVobSub": "VobSub (sub/idx)", - "customTextFormatsDotDotDot": "_Formatos de texto personalizados...", - "plainTextDotDotDot": "_Texto plano...", - "customTextFormats": "Formatos de texto personalizados", - "titleExportCustomFormat": "Exportar formato de texto personalizado", - "editCustomFormat": "Editar formato de texto personalizado", - "newCustomFormat": "Nuevo formato de texto personalizado", - "deleteSelectedCustomTextFormatX": "¿Eliminar el formato personalizado \"{0}\"?", - "timeCodeFormat": "Formato de código de tiempo", - "newLineFormat": "Formato de nueva línea", - "pleaseEnterNameForTheCustomFormat": "Introduzca un nombre para el formato personalizado", - "titleExportPlainText": "Exportar texto plano", - "lineNumbers": "Números de línea", - "showLineNumbers": "Mostrar números de línea", - "addNewLineAfterLineNumber": "Añadir nueva línea tras el número de línea", - "addNewLineAfterTimeCode": "Añadir nueva línea tras el código de tiempo", - "addNewLineAfterText": "Añadir nueva línea tras el texto", - "addLineBetweenSubtitles": "Añadir línea entre subtítulos", - "titleExportDCinemaInteropPng": "D-Cinema interop/png", - "titleExportDCinemaSmpte2014Png": "D-Cinema SMPTE 2014/png", - "imageBasedSubtitleSaved": "Subtítulo basado en imágenes guardado", - "titleExportBdnXml": "Exportar BDN/xml", - "titleExportWebVttThumbnails": "Exportar WebVTT (miniaturas)" + "Import": { + "ImportTimeCodes": "Importar códigos de tiempo...", + "PlainTextDotDotDot": "Texto plano...", + "TitleImportPlainText": "Importar texto plano", + "ImagesForOcrDotDotDot": "Imágenes para OCR...", + "TimeCodesDotDotDot": "Códigos de tiempo...", + "SubtitleWithManuallyChosenEncodingDotDotDot": "_Subtítulo con codificación manual...", + "TitleImportImages": "Importar imágenes", + "ImportFileLabel": "Elegir imágenes a importar (códigos de tiempo en el nombre)", + "ImportFilesInfo": "Usar nombres con código de tiempo:\r\ninicio_HH_MM_SS_MMM__fin_HH_MM_SS_MMM[_índice].ext\r\n\r\nEjemplos:\r\n0_00_01_042__0_00_03_919_0001.png\r\n0_00_01_042__0_00_03_919.png\r\n\r\nReglas:\r\n• HH_MM_SS_MMM para tiempos de inicio y fin\r\n• El guion bajo doble separa inicio/fin\r\n• Índice opcional tras el tiempo final", + "FormattingDotDotDot": "Formato...", + "ImagedBasedSubtitleForEditDotDotDot": "Subtítulo basado en imagen para editar...", + "ImagedBasedSubtitleForOcrDotDotDot": "Subtítulo basado en imagen para OCR...", + "SplitTextAt": "Dividir texto en", + "BlankLines": "Líneas en blanco", + "OneLineIsOneSubtitle": "Una línea es un subtítulo", + "TwoLinesAreOneSubtitle": "Dos líneas son un subtítulo", + "ImportFilesDotDotDot": "Importar archivos...", + "MultipleFiles": "Importar de varios archivos de texto (un archivo = un subtítulo)", + "ImportOptions": "Opciones de importación", + "AutoSplitText": "Dividir texto automáticamente", + "LineMode": "Modo de línea", + "MaxLineLength": "Longitud máx. de línea", + "MaxLinesPerSubtitle": "Máx. líneas por subtítulo", + "MinGapBetweenSubtitles": "Espacio mín. entre subtítulos", + "MergeShortLines": "Combinar líneas cortas", + "RemoveLinesWithoutLetters": "Eliminar líneas sin letras", + "SplitAtEndCharsSetting": "Dividir en caracteres finales", + "TakeTimeFromCurrentFile": "Tomar tiempo del archivo actual", + "Fixed": "Fijo", + "NumberOfSubtitlesX": "Número de subtítulos: {0}", + "GapMs": "Espacio (ms)", + "UseFixedDuration": "Usar duración fija", + "FixedDurationMs": "Duración fija (ms)", + "AlignViaWhisper": "Alinear códigos de tiempo mediante Whisper..." }, - "statistics": { - "title": "Estadísticas", - "titleWithFileName": "Estadísticas - {0}", - "generalStatistics": "Estadísticas generales", - "mostUsed": "Más usado...", - "mostUsedLines": "Líneas más usadas", - "mostUsedWords": "Palabras más usadas", - "nothingFound": "No se encontró nada", - "numberOfLinesX": "Número de líneas de subtítulos: {0:#,##0}", - "numberOfFilesX": "Número de archivos de subtítulos: {0:#,##0}", - "lengthInFormatXinCharactersY": "Número de caracteres como {0}: {1:#,###,##0}", - "numberOfCharactersInTextOnly": "Caracteres en solo texto: {0:#,###,##0}", - "totalDuration": "Duración total de todos los subtítulos: {0:#,##0}", - "totalCharsPerSecond": "Total de caracteres/segundo: {0:0.0} segundos", - "totalWords": "Total de palabras: {0:#,##0}", - "numberOfItalicTags": "Etiquetas de cursiva: {0:#,##0}", - "numberOfBoldTags": "Etiquetas de negrita: {0:#,##0}", - "numberOfUnderlineTags": "Etiquetas de subrayado: {0:#,##0}", - "numberOfFontTags": "Etiquetas de fuente: {0:#,##0}", - "numberOfAlignmentTags": "Etiquetas de alineación: {0:#,##0}", - "lineLengthMinimum": "Longitud de subtítulo - mínima: {0}", - "lineLengthMaximum": "Longitud de subtítulo - máxima: {0}", - "lineLengthAverage": "Longitud de subtítulo - media: {0:#.###}", - "linesPerSubtitleAverage": "Líneas por subtítulo - media: {0:0.###}", - "singleLineLengthMinimum": "Longitud de línea única - mínima: {0}", - "singleLineLengthMaximum": "Longitud de línea única - máxima: {0}", - "singleLineLengthAverage": "Longitud de línea única - media: {0:#.###}", - "singleLineLengthExceedingMaximum": "Línea única - exceden máx. ({0} car.): {1} ({2:0.00}%)", - "singleLineWidthMinimum": "Ancho de línea única - mínimo: {0} píxeles", - "singleLineWidthMaximum": "Ancho de línea única - máximo: {0} píxeles", - "singleLineWidthAverage": "Ancho de línea única - medio: {0:#.###} píxeles", - "singleLineWidthExceedingMaximum": "Ancho de línea única - exceden máx. ({0} px): {1} ({2:0.00}%)", - "durationMinimum": "Duración - mínima: {0:0.000} segundos", - "durationMaximum": "Duración - máxima: {0:0.000} segundos", - "durationAverage": "Duración - media: {0:0.000} segundos", - "durationExceedingMinimum": "Duración - bajo el mín. ({0:0.###} s): {1} ({2:0.00}%)", - "durationExceedingMaximum": "Duración - exceden el máx. ({0:0.###} s): {1} ({2:0.00}%)", - "charactersPerSecondMinimum": "Caracteres/seg - mínimo: {0:0.000}", - "charactersPerSecondMaximum": "Caracteres/seg - máximo: {0:0.000}", - "charactersPerSecondAverage": "Caracteres/seg - media: {0:0.000}", - "charactersPerSecondExceedingOptimal": "Caracteres/seg - exceden óptimo ({0:0.##} cps): {1} ({2:0.00}%)", - "charactersPerSecondExceedingMaximum": "Caracteres/seg - exceden máximo ({0:0.##} cps): {1} ({2:0.00}%)", - "wordsPerMinuteMinimum": "Palabras/min - mínimo: {0:0.000}", - "wordsPerMinuteMaximum": "Palabras/min - máximo: {0:0.000}", - "wordsPerMinuteAverage": "Palabras/min - media: {0:0.000}", - "wordsPerMinuteExceedingMaximum": "Palabras/min - exceden el máximo ({0} wpm): {1} ({2:0.00}%)", - "gapMinimum": "Espacio - mínimo: {0:#,##0} ms", - "gapMaximum": "Espacio - máximo: {0:#,##0} ms", - "gapAverage": "Espacio - medio: {0:#,##0.##} ms", - "gapExceedingMinimum": "Espacio - bajo el mín. ({0:#,##0} ms): {1} ({2:0.00}%)", - "export": "Exportar..." + "Export": { + "ExportImagesProfiles": "Exportar perfiles de imágenes", + "LeftRightMargin": "Margen izq./der.", + "TopBottomMargin": "Margen sup./inf.", + "TitleExportBluRaySup": "Exportar Blu-ray (sup)", + "LineSpacingPercent": "Espaciado de línea %", + "PaddingLeftRight": "Relleno izq./der.", + "PaddingTopBottom": "Relleno sup./inf.", + "PreviewTitle": "Previsualización - tamaño actual: {0}x{1}, destino: {2}x{3}, zoom: {4}%", + "TitleExportVobSub": "VobSub (sub/idx)", + "CustomTextFormatsDotDotDot": "_Formatos de texto personalizados...", + "PlainTextDotDotDot": "_Texto plano...", + "CustomTextFormats": "Formatos de texto personalizados", + "TitleExportCustomFormat": "Exportar formato de texto personalizado", + "EditCustomFormat": "Editar formato de texto personalizado", + "NewCustomFormat": "Nuevo formato de texto personalizado", + "DeleteSelectedCustomTextFormatX": "¿Eliminar el formato personalizado \"{0}\"?", + "TimeCodeFormat": "Formato de código de tiempo", + "NewLineFormat": "Formato de nueva línea", + "PleaseEnterNameForTheCustomFormat": "Introduzca un nombre para el formato personalizado", + "TitleExportPlainText": "Exportar texto plano", + "LineNumbers": "Números de línea", + "ShowLineNumbers": "Mostrar números de línea", + "AddNewLineAfterLineNumber": "Añadir nueva línea tras el número de línea", + "AddNewLineAfterTimeCode": "Añadir nueva línea tras el código de tiempo", + "AddNewLineAfterText": "Añadir nueva línea tras el texto", + "AddLineBetweenSubtitles": "Añadir línea entre subtítulos", + "TitleExportDCinemaInteropPng": "D-Cinema interop/png", + "TitleExportDCinemaSmpte2014Png": "D-Cinema SMPTE 2014/png", + "ImageBasedSubtitleSaved": "Subtítulo basado en imágenes guardado", + "TitleExportBdnXml": "Exportar BDN/xml", + "TitleExportWebVttThumbnails": "Exportar WebVTT (miniaturas)" }, - "manualChosenEncoding": { - "title": "Importar subtítulo con codificación manual", - "searchEncodings": "Buscar codificaciones", - "codePage": "Página de códigos" + "Statistics": { + "Title": "Estadísticas", + "TitleWithFileName": "Estadísticas - {0}", + "GeneralStatistics": "Estadísticas generales", + "MostUsed": "Más usado...", + "MostUsedLines": "Líneas más usadas", + "MostUsedWords": "Palabras más usadas", + "NothingFound": "No se encontró nada", + "NumberOfLinesX": "Número de líneas de subtítulos: {0:#,##0}", + "NumberOfFilesX": "Número de archivos de subtítulos: {0:#,##0}", + "LengthInFormatXinCharactersY": "Número de caracteres como {0}: {1:#,###,##0}", + "NumberOfCharactersInTextOnly": "Caracteres en solo texto: {0:#,###,##0}", + "TotalDuration": "Duración total de todos los subtítulos: {0:#,##0}", + "TotalCharsPerSecond": "Total de caracteres/segundo: {0:0.0} segundos", + "TotalWords": "Total de palabras: {0:#,##0}", + "NumberOfItalicTags": "Etiquetas de cursiva: {0:#,##0}", + "NumberOfBoldTags": "Etiquetas de negrita: {0:#,##0}", + "NumberOfUnderlineTags": "Etiquetas de subrayado: {0:#,##0}", + "NumberOfFontTags": "Etiquetas de fuente: {0:#,##0}", + "NumberOfAlignmentTags": "Etiquetas de alineación: {0:#,##0}", + "LineLengthMinimum": "Longitud de subtítulo - mínima: {0}", + "LineLengthMaximum": "Longitud de subtítulo - máxima: {0}", + "LineLengthAverage": "Longitud de subtítulo - media: {0:#.###}", + "LinesPerSubtitleAverage": "Líneas por subtítulo - media: {0:0.###}", + "SingleLineLengthMinimum": "Longitud de línea única - mínima: {0}", + "SingleLineLengthMaximum": "Longitud de línea única - máxima: {0}", + "SingleLineLengthAverage": "Longitud de línea única - media: {0:#.###}", + "SingleLineLengthExceedingMaximum": "Línea única - exceden máx. ({0} car.): {1} ({2:0.00}%)", + "SingleLineWidthMinimum": "Ancho de línea única - mínimo: {0} píxeles", + "SingleLineWidthMaximum": "Ancho de línea única - máximo: {0} píxeles", + "SingleLineWidthAverage": "Ancho de línea única - medio: {0:#.###} píxeles", + "SingleLineWidthExceedingMaximum": "Ancho de línea única - exceden máx. ({0} px): {1} ({2:0.00}%)", + "DurationMinimum": "Duración - mínima: {0:0.000} segundos", + "DurationMaximum": "Duración - máxima: {0:0.000} segundos", + "DurationAverage": "Duración - media: {0:0.000} segundos", + "DurationExceedingMinimum": "Duración - bajo el mín. ({0:0.###} s): {1} ({2:0.00}%)", + "DurationExceedingMaximum": "Duración - exceden el máx. ({0:0.###} s): {1} ({2:0.00}%)", + "CharactersPerSecondMinimum": "Caracteres/seg - mínimo: {0:0.000}", + "CharactersPerSecondMaximum": "Caracteres/seg - máximo: {0:0.000}", + "CharactersPerSecondAverage": "Caracteres/seg - media: {0:0.000}", + "CharactersPerSecondExceedingOptimal": "Caracteres/seg - exceden óptimo ({0:0.##} cps): {1} ({2:0.00}%)", + "CharactersPerSecondExceedingMaximum": "Caracteres/seg - exceden máximo ({0:0.##} cps): {1} ({2:0.00}%)", + "WordsPerMinuteMinimum": "Palabras/min - mínimo: {0:0.000}", + "WordsPerMinuteMaximum": "Palabras/min - máximo: {0:0.000}", + "WordsPerMinuteAverage": "Palabras/min - media: {0:0.000}", + "WordsPerMinuteExceedingMaximum": "Palabras/min - exceden el máximo ({0} wpm): {1} ({2:0.00}%)", + "GapMinimum": "Espacio - mínimo: {0:#,##0} ms", + "GapMaximum": "Espacio - máximo: {0:#,##0} ms", + "GapAverage": "Espacio - medio: {0:#,##0.##} ms", + "GapExceedingMinimum": "Espacio - bajo el mín. ({0:#,##0} ms): {1} ({2:0.00}%)", + "Export": "Exportar..." }, - "restoreAutoBackup": { - "title": "Restaurar copia de seguridad automática", - "openAutoBackupFolder": "Abrir carpeta de copias de seguridad", - "restoreAutoBackupFile": "Restaurar archivo de copia de seguridad", - "deleteAllSubtitleBackups": "¿Desea eliminar todos los archivos de copia de seguridad?", - "deleteAll": "Eliminar todo" + "ManualChosenEncoding": { + "Title": "Importar subtítulo con codificación manual", + "SearchEncodings": "Buscar codificaciones", + "CodePage": "Página de códigos" }, - "propertiesDCinema": { - "title": "Propiedades D-Cinema SMPTE", - "generateIdAuto": "Generar nuevo ID al guardar", - "subtitleId": "ID de subtítulo", - "generateId": "Generar ID", - "movieTitle": "Título de la película", - "reelNumber": "Número de rollo", - "issueDate": "Fecha de emisión", - "now": "Ahora", - "editRate": "Tasa de edición", - "timeCodeRate": "Tasa de código de tiempo", - "startTime": "Tiempo de inicio", - "font": "Fuente", - "fontId": "ID de fuente", - "fontUri": "URI de fuente", - "generate": "Generar", - "fontColor": "Color de fuente", - "chooseColor": "Elegir color", - "fontEffect": "Efecto de fuente", - "effectColor": "Color del efecto", - "fontSize": "Tamaño de fuente", - "topBottomMargin": "Margen sup./inf.", - "fadeUpTime": "Tiempo de aparición", - "fadeDownTime": "Tiempo de desaparición", - "frames": "Fotogramas", - "export": "Exportar..." + "RestoreAutoBackup": { + "Title": "Restaurar copia de seguridad automática", + "OpenAutoBackupFolder": "Abrir carpeta de copias de seguridad", + "RestoreAutoBackupFile": "Restaurar archivo de copia de seguridad", + "DeleteAllSubtitleBackups": "¿Desea eliminar todos los archivos de copia de seguridad?", + "DeleteAll": "Eliminar todo" }, - "compare": "Comparar", - "previousDifference": "Diferencia anterior", - "nextDifference": "Diferencia siguiente", - "subtitlesNotAlike": "Los subtítulos no tienen similitudes", - "xNumberOfDifference": "Número de diferencias: {0}", - "xNumberOfDifferenceAndPercentChanged": "Diferencias: {0} ({1:0.##}% de palabras cambiadas)", - "xNumberOfDifferenceAndPercentLettersChanged": "Diferencias: {0} ({1:0.##}% de letras cambiadas)", - "showOnlyDifferences": "Solo diferencias", - "ignoreLineBreaks": "Ignorar saltos de línea", - "ignoreWhitespace": "Ignorar espacios en blanco", - "ignoreFormatting": "Ignorar formato", - "onlyLookForDifferencesInText": "Solo buscar diferencias en el texto", - "cannotCompareWithImageBasedSubtitles": "No se puede comparar con subtítulos basados en imágenes", - "statisticsTitle": "Estadísticas", - "showOnlyDifferencesInText": "Solo diferencias en texto", - "loadXFromFile": "Cargar \"{0}\" desde archivo", - "saveCompareHtmlTitle": "Guardar archivo HTML de comparación", - "pickMatroskaTrackX": "Elegir pista Matroska - {0}", - "rosettaProperties": "Propiedades Timed Text Rosetta IMSC", - "rosettaFontSize": "Tamaño de fuente (altura de fila)", - "xProperties": "Propiedades de {0}" + "PropertiesDCinema": { + "Title": "Propiedades D-Cinema SMPTE", + "GenerateIdAuto": "Generar nuevo ID al guardar", + "SubtitleId": "ID de subtítulo", + "GenerateId": "Generar ID", + "MovieTitle": "Título de la película", + "ReelNumber": "Número de rollo", + "IssueDate": "Fecha de emisión", + "Now": "Ahora", + "EditRate": "Tasa de edición", + "TimeCodeRate": "Tasa de código de tiempo", + "StartTime": "Tiempo de inicio", + "Font": "Fuente", + "FontId": "ID de fuente", + "FontUri": "URI de fuente", + "Generate": "Generar", + "FontColor": "Color de fuente", + "ChooseColor": "Elegir color", + "FontEffect": "Efecto de fuente", + "EffectColor": "Color del efecto", + "FontSize": "Tamaño de fuente", + "TopBottomMargin": "Margen sup./inf.", + "FadeUpTime": "Tiempo de aparición", + "FadeDownTime": "Tiempo de desaparición", + "Frames": "Fotogramas", + "Export": "Exportar..." + } }, - "edit": { - "modifySelection": { - "title": "Modificar selección", - "contains": "Contiene", - "startsWith": "Empieza por", - "endsWith": "Termina por", - "notContains": "No contiene", - "allUppercase": "Todo en mayúsculas", - "odd": "Número impar", - "even": "Número par", - "durationLessThan": "Duración en ms <", - "durationGreaterThan": "Duración en ms >", - "cpsLessThan": "CPS <", - "cpsGreaterThan": "CPS >", - "lengthLessThan": "Longitud <", - "lengthGreaterThan": "Longitud >", - "pixelLengthGreaterThan": "Longitud en píxeles >", - "gapLessThan": "Espacio en ms <", - "gapGreaterThan": "Espacio en ms >", - "exactlyOneLine": "Exactamente una línea", - "exactlyTwoLines": "Exactamente dos líneas", - "moreThanTwoLines": "Más de dos líneas", - "bookmarked": "Marcado", - "bookmarkContains": "Marcador contiene", - "blankLines": "Líneas en blanco", - "selectionNew": "Nueva selección", - "selectionAdd": "Añadir a la selección", - "selectionSubtract": "Restar de la selección", - "selectionIntersect": "Intersección con la selección" - }, - "multipleReplace": { - "title": "Reemplazo múltiple", - "editRule": "Editar regla", - "newRule": "Nueva regla", - "editCategory": "Editar categoría", - "newCategory": "Nueva categoría", - "categoryName": "Nombre de la categoría", - "exportReplaceRules": "Exportar reglas", - "appliedRules": "Reglas aplicadas", - "findRule": "Buscar regla", - "xLinesAffected": "{0:#,##0} líneas afectadas", - "deleteCategoryConfirm": "¿Eliminar categoría '{0}'?", - "deleteRuleConfirm": "¿Eliminar regla '{0}'?", - "findWhat": "Buscar", - "descriptionOptional": "Descripción (opcional)" + "Edit": { + "ShowHistory": "Historial para deshacer", + "RestoreSelected": "Restaurar seleccionado", + "ModifySelection": { + "Title": "Modificar selección", + "Contains": "Contiene", + "StartsWith": "Empieza por", + "EndsWith": "Termina por", + "NotContains": "No contiene", + "AllUppercase": "Todo en mayúsculas", + "Odd": "Número impar", + "Even": "Número par", + "DurationLessThan": "Duración en ms <", + "DurationGreaterThan": "Duración en ms >", + "CpsLessThan": "CPS <", + "CpsGreaterThan": "CPS >", + "LengthLessThan": "Longitud <", + "LengthGreaterThan": "Longitud >", + "PixelLengthGreaterThan": "Longitud en píxeles >", + "GapLessThan": "Espacio en ms <", + "GapGreaterThan": "Espacio en ms >", + "ExactlyOneLine": "Exactamente una línea", + "ExactlyTwoLines": "Exactamente dos líneas", + "MoreThanTwoLines": "Más de dos líneas", + "Bookmarked": "Marcado", + "BookmarkContains": "Marcador contiene", + "BlankLines": "Líneas en blanco", + "SelectionNew": "Nueva selección", + "SelectionAdd": "Añadir a la selección", + "SelectionSubtract": "Restar de la selección", + "SelectionIntersect": "Intersección con la selección" }, - "find": { - "searchTextWatermark": "Buscar texto...", - "wholeWord": "Palabra completa", - "caseSensitive": "Sensible a mayúsculas", - "caseInsensitive": "No sensible a mayúsculas", - "findPrevious": "Buscar _anterior", - "findNext": "_Buscar siguiente", - "replaceAndFindNext": "_Reemplazar y buscar siguiente", - "replaceAll": "Reemplazar _todo", - "replaceTitle": "Reemplazar", - "replaceWith": "Reemplazar con", - "replaceTextWatermark": "Reemplazar con..." + "MultipleReplace": { + "Title": "Reemplazo múltiple", + "EditRule": "Editar regla", + "NewRule": "Nueva regla", + "EditCategory": "Editar categoría", + "NewCategory": "Nueva categoría", + "CategoryName": "Nombre de la categoría", + "ExportReplaceRules": "Exportar reglas", + "AppliedRules": "Reglas aplicadas", + "FindRule": "Buscar regla", + "XLinesAffected": "{0:#,##0} líneas afectadas", + "DeleteCategoryConfirm": "¿Eliminar categoría '{0}'?", + "DeleteRuleConfirm": "¿Eliminar regla '{0}'?", + "FindWhat": "Buscar", + "DescriptionOptional": "Descripción (opcional)" }, - "showHistory": "Historial para deshacer", - "restoreSelected": "Restaurar seleccionado" + "Find": { + "SearchTextWatermark": "Buscar texto...", + "WholeWord": "Palabra completa", + "CaseSensitive": "Sensible a mayúsculas", + "CaseInsensitive": "No sensible a mayúsculas", + "FindPrevious": "Buscar _anterior", + "FindNext": "_Buscar siguiente", + "ReplaceAndFindNext": "_Reemplazar y buscar siguiente", + "ReplaceAll": "Reemplazar _todo", + "ReplaceTitle": "Reemplazar", + "ReplaceWith": "Reemplazar con", + "ReplaceTextWatermark": "Reemplazar con..." + } }, - "tools": { - "fixCommonErrors": { - "title": "Corregir errores comunes", - "step1": "Paso 1/2 - Elegir qué errores corregir", - "whatToFix": "Qué corregir", - "example": "Ejemplo", - "selectAll": "Seleccionar todo", - "inverseSelection": "Invertir selección", - "back": "< _Atrás", - "next": "_Siguiente >", - "step2": "Paso 2/2 - Verificar correcciones", - "fixes": "Correcciones", - "log": "Registro", - "function": "Función", - "removedEmptyLine": "Eliminar línea vacía", - "removedEmptyLineAtTop": "Eliminar línea vacía superior", - "removedEmptyLineAtBottom": "Eliminar línea vacía inferior", - "removedEmptyLineInMiddle": "Eliminar línea vacía en medio", - "removedEmptyLinesUnusedLineBreaks": "Eliminar líneas vacías/saltos no usados", - "fixOverlappingDisplayTimes": "Corregir tiempos superpuestos", - "fixShortDisplayTimes": "Corregir tiempos cortos", - "fixLongDisplayTimes": "Corregir tiempos largos", - "fixShortGaps": "Corregir espacios cortos", - "fixInvalidItalicTags": "Corregir etiquetas de cursiva inválidas", - "removeUnneededSpaces": "Eliminar espacios innecesarios", - "removeUnneededPeriods": "Eliminar puntos innecesarios", - "fixCommas": "Corregir comas", - "fixMissingSpaces": "Corregir espacios faltantes", - "breakLongLines": "Dividir líneas largas", - "removeLineBreaks": "Eliminar saltos en textos cortos (una frase)", - "removeLineBreaksAll": "Eliminar saltos en textos cortos (todo menos diálogos)", - "removeLineBreaksPixelWidth": "Unir subtítulos que caben en una línea (ancho píxeles)", - "fixUppercaseIInsideLowercaseWords": "Corregir 'i' mayúscula dentro de palabras en minúscula (error OCR)", - "fixDoubleApostrophes": "Corregir apóstrofes dobles ('') a comilla simple (\")", - "addPeriods": "Añadir punto tras líneas si la siguiente empieza en mayúscula", - "startWithUppercaseLetterAfterParagraph": "Empezar con mayúscula tras párrafo", - "startWithUppercaseLetterAfterPeriodInsideParagraph": "Empezar con mayúscula tras punto dentro del párrafo", - "startWithUppercaseLetterAfterColon": "Empezar con mayúscula tras dos puntos/punto y coma", - "fixLowercaseIToUppercaseI": "Corregir 'i' minúscula sola a 'I' (Inglés)", - "fixCommonOcrErrors": "Corregir errores de OCR comunes (usando lista de reemplazo)", - "commonOcrErrorsFixed": "Errores OCR comunes corregidos: {0}", - "removeSpaceBetweenNumber": "Eliminar espacio entre números", - "breakDialogsOnOneLine": "Dividir diálogos en una sola línea", - "removeDialogFirstInNonDialogs": "Eliminar guion inicial en no-diálogos", - "normalizeStrings": "Normalizar cadenas", - "fixTurkishAnsi": "Corregir letras ANSI turcas a Unicode", - "fixDanishLetterI": "Corregir letra danesa 'i'", - "fixSpanishInvertedQuestionAndExclamationMarks": "Corregir signos de interrogación y exclamación invertidos", - "addMissingQuote": "Añadir comilla faltante (\")", - "addMissingQuotes": "Añadir comillas faltantes (\")", - "removeHyphensSingleLine": "Eliminar guiones de diálogo en líneas únicas", - "fixHyphensInDialogs": "Corregir guion en diálogos vía estilo: {0}", - "addMissingQuotesExample": "¿Cómo estás? -> \"¿Cómo estás?\"", - "xMissingQuotesAdded": "Comillas faltantes añadidas: {0}", - "fix3PlusLine": "Corregir subtítulo con más de dos líneas", - "fix3PlusLines": "Corregir subtítulos con más de dos líneas", - "analysing": "Analizando...", - "nothingToFix": "Nada que corregir :)", - "fixesFoundX": "Correcciones encontradas: {0}", - "xFixesApplied": "Correcciones aplicadas: {0}", - "nothingFixableBut": "Nada pudo corregirse automáticamente. El subtítulo tiene errores; ver registro.", - "xFixedBut": "{0} problema(s) corregido(s) pero aún hay errores; ver registro.", - "xCouldBeFixedBut": "{0} problema(s) podrían corregirse pero aún habrá errores; ver registro.", - "fixFirstLetterToUppercaseAfterParagraph": "Corregir primera letra a mayúscula tras párrafo", - "mergeShortLine": "Combinar línea corta (una frase)", - "mergeShortLineAll": "Combinar línea corta (todo menos diálogos)", - "unbreakShortLinePixelWidth": "Unir línea corta (ancho píxeles)", - "breakLongLine": "Dividir línea larga", - "fixLongDisplayTime": "Corregir tiempo largo", - "fixInvalidItalicTag": "Corregir etiqueta cursiva inválida", - "fixShortDisplayTime": "Corregir tiempo corto", - "fixOverlappingDisplayTime": "Corregir tiempo superpuesto", - "fixShortGap": "Corregir espacio corto", - "fixInvalidItalicTagsExample": "Qué me importa. -> Qué me importa.", - "removeUnneededSpacesExample": "Oye tú ; ahí. -> Oye tú; ahí.", - "removeUnneededPeriodsExample": "¡Oye tú!. -> ¡Oye tú!", - "fixMissingSpacesExample": "Oye.Tú. -> Oye. Tú.", - "fixUppercaseIInsideLowercaseWordsExample": "La tierra es pIana. -> La tierra es plana.", - "fixLowercaseIToUppercaseIExample": "Qué me importa i. -> Qué me importa I.", - "startTimeLaterThanEndTime": "Texto {0}: El inicio es posterior al fin: {4}{1} -> {2} {3}", - "unableToFixStartTimeLaterThanEndTime": "No se puede corregir texto {0}: Inicio posterior al fin: {1}", - "xFixedToYZ": "{0} corregido a: {1}{2}", - "unableToFixTextXY": "No se puede corregir texto {0}: {1}", - "unneededSpace": "Espacio innecesario", - "unneededPeriod": "Punto innecesario", - "fixMissingSpace": "Corregir espacio faltante", - "fixUppercaseIInsideLowercaseWord": "Corregir 'i' mayúscula en palabra en minúscula", - "fixMissingPeriodAtEndOfLine": "Añadir punto faltante al final de línea", - "refreshFixes": "Actualizar correcciones disponibles", - "applyFixes": "Aplicar correcciones y cerrar", - "autoBreak": "Auto &div", - "unbreak": "&Unir", - "fixDoubleDash": "Corregir '--' -> '...'", - "fixDoubleGreaterThan": "Eliminar '>>'", - "fixEllipsesStart": "Eliminar '...' iniciales", - "fixMissingOpenBracket": "Corregir [ o ( faltantes", - "fixMusicNotation": "Reemplazar símbolos musicales por el preferido", - "fixDoubleDashExample": "'Vaya-- um sí!' -> 'Vaya... um sí!'", - "fixDoubleGreaterThanExample": "'>> Robert: ¡Qué pasa!' -> 'Robert: ¡Qué pasa!'", - "fixEllipsesStartExample": "'... y entonces' -> 'y entonces'", - "fixMissingOpenBracketExample": "golpe] ¡Cuidado!' -> '[golpe] ¡Cuidado!'", - "fixMusicNotationExample": "'âTª dulces sueños' -> '♫ dulces sueños'", - "numberOfImportantLogMessages": "¡{0} mensajes importantes en el registro!", - "fixedOkXY": "Corregido y OK - '{0}': {1}", - "fixOcrErrorExample": "N0 -> No", - "fixSpaceBetweenNumbersExample": "1 100 -> 1100", - "fixDialogsOneLineExample": "¡Hola Juan! - ¡Hola Ana! -> ¡Hola Juan!
- ¡Hola Ana!", - "removeDialogFirstInNonDialogsExample": "- ¿Cómo estás? -> ¿Cómo estás?", - "selectDefault": "Seleccionar predet.", - "setDefault": "Establecer correcciones actuales como predet.", - "fixContinuationStyleX": "Corregir estilo de continuación: {0}", - "fixUnnecessaryLeadingDots": "Eliminar puntos iniciales innecesarios", - "fixCommonErrorsProfiles": "Perfiles de corrección de errores", - "fixCommonOcrErrorsStep1": "Corregir errores, paso 1 (elegir)", - "searchRulesDotDotDot": "Buscar reglas...", - "goToApplyFixes": "Ir a aplicar correcciones", - "backToFixList": "Volver a la lista", - "applyFixesAndClose": "Aplicar correcciones y cerrar", - "fixCommonOcrErrorsStep2": "Corregir errores, paso 2 (aplicar)", - "fixCommonOcrErrorsStep2FixesFoundX": "Corregir errores, paso 2 - Encontrados: {0}", - "action": "Acción", - "applySelectedFixes": "Aplicar correcciones seleccionadas" - }, - "adjustDurations": { - "title": "Ajustar duraciones", - "adjustVia": "Ajustar vía", - "seconds": "Segundos", - "percent": "Porcentaje", - "recalculate": "Recalcular", - "addSeconds": "Añadir segundos", - "setAsPercent": "Establecer como porcentaje de duración", - "note": "Nota: El tiempo final no se superpondrá al inicio del siguiente texto", - "fixed": "Fijo", - "milliseconds": "Milisegundos", - "extendOnly": "Solo extender", - "enforceDurationLimits": "Aplicar límites de duración mínima y máxima", - "checkShotChanges": "No extender más allá de los cambios de plano", - "batchCheckShotChanges": "Respetar cambios de plano (si existen)" + "Tools": { + "PickAlignmentTitle": "Elegir alineación", + "PickFontNameTitle": "Elegir nombre de fuente", + "ColorPickerTitle": "Elegir color", + "FilterLayersTitle": "Filtrar capas para visualización", + "FilterLayersHideFromWaveform": "Ocultar de forma de onda/espectrograma", + "FilterLayersHideFromSubtitleGrid": "Ocultar de la cuadrícula", + "FilterLayersHideFromVideoPreview": "Ocultar de la vista previa de vídeo", + "PickSubtitleFormat": "Elegir formato de subtítulo", + "PickLayerTitle": "Establecer capa", + "RecentColors": "Colores recientes", + "FixCommonErrors": { + "Title": "Corregir errores comunes", + "Step1": "Paso 1/2 - Elegir qué errores corregir", + "WhatToFix": "Qué corregir", + "Example": "Ejemplo", + "SelectAll": "Seleccionar todo", + "InverseSelection": "Invertir selección", + "Back": "< _Atrás", + "Next": "_Siguiente >", + "Step2": "Paso 2/2 - Verificar correcciones", + "Fixes": "Correcciones", + "Log": "Registro", + "Function": "Función", + "RemovedEmptyLine": "Eliminar línea vacía", + "RemovedEmptyLineAtTop": "Eliminar línea vacía superior", + "RemovedEmptyLineAtBottom": "Eliminar línea vacía inferior", + "RemovedEmptyLineInMiddle": "Eliminar línea vacía en medio", + "RemovedEmptyLinesUnusedLineBreaks": "Eliminar líneas vacías/saltos no usados", + "FixOverlappingDisplayTimes": "Corregir tiempos superpuestos", + "FixShortDisplayTimes": "Corregir tiempos cortos", + "FixLongDisplayTimes": "Corregir tiempos largos", + "FixShortGaps": "Corregir espacios cortos", + "FixInvalidItalicTags": "Corregir etiquetas de cursiva inválidas", + "RemoveUnneededSpaces": "Eliminar espacios innecesarios", + "RemoveUnneededPeriods": "Eliminar puntos innecesarios", + "FixCommas": "Corregir comas", + "FixMissingSpaces": "Corregir espacios faltantes", + "BreakLongLines": "Dividir líneas largas", + "RemoveLineBreaks": "Eliminar saltos en textos cortos (una frase)", + "RemoveLineBreaksAll": "Eliminar saltos en textos cortos (todo menos diálogos)", + "RemoveLineBreaksPixelWidth": "Unir subtítulos que caben en una línea (ancho píxeles)", + "FixUppercaseIInsideLowercaseWords": "Corregir 'i' mayúscula dentro de palabras en minúscula (error OCR)", + "FixDoubleApostrophes": "Corregir apóstrofes dobles ('') a comilla simple (\")", + "AddPeriods": "Añadir punto tras líneas si la siguiente empieza en mayúscula", + "StartWithUppercaseLetterAfterParagraph": "Empezar con mayúscula tras párrafo", + "StartWithUppercaseLetterAfterPeriodInsideParagraph": "Empezar con mayúscula tras punto dentro del párrafo", + "StartWithUppercaseLetterAfterColon": "Empezar con mayúscula tras dos puntos/punto y coma", + "FixLowercaseIToUppercaseI": "Corregir 'i' minúscula sola a 'I' (Inglés)", + "FixCommonOcrErrors": "Corregir errores de OCR comunes (usando lista de reemplazo)", + "CommonOcrErrorsFixed": "Errores OCR comunes corregidos: {0}", + "RemoveSpaceBetweenNumber": "Eliminar espacio entre números", + "BreakDialogsOnOneLine": "Dividir diálogos en una sola línea", + "RemoveDialogFirstInNonDialogs": "Eliminar guion inicial en no-diálogos", + "NormalizeStrings": "Normalizar cadenas", + "FixTurkishAnsi": "Corregir letras ANSI turcas a Unicode", + "FixDanishLetterI": "Corregir letra danesa 'i'", + "FixSpanishInvertedQuestionAndExclamationMarks": "Corregir signos de interrogación y exclamación invertidos", + "AddMissingQuote": "Añadir comilla faltante (\")", + "AddMissingQuotes": "Añadir comillas faltantes (\")", + "RemoveHyphensSingleLine": "Eliminar guiones de diálogo en líneas únicas", + "FixHyphensInDialogs": "Corregir guion en diálogos vía estilo: {0}", + "AddMissingQuotesExample": "¿Cómo estás? -> \"¿Cómo estás?\"", + "XMissingQuotesAdded": "Comillas faltantes añadidas: {0}", + "Fix3PlusLine": "Corregir subtítulo con más de dos líneas", + "Fix3PlusLines": "Corregir subtítulos con más de dos líneas", + "Analysing": "Analizando...", + "NothingToFix": "Nada que corregir :)", + "FixesFoundX": "Correcciones encontradas: {0}", + "XFixesApplied": "Correcciones aplicadas: {0}", + "NothingFixableBut": "Nada pudo corregirse automáticamente. El subtítulo tiene errores; ver registro.", + "XFixedBut": "{0} problema(s) corregido(s) pero aún hay errores; ver registro.", + "XCouldBeFixedBut": "{0} problema(s) podrían corregirse pero aún habrá errores; ver registro.", + "FixFirstLetterToUppercaseAfterParagraph": "Corregir primera letra a mayúscula tras párrafo", + "MergeShortLine": "Combinar línea corta (una frase)", + "MergeShortLineAll": "Combinar línea corta (todo menos diálogos)", + "UnbreakShortLinePixelWidth": "Unir línea corta (ancho píxeles)", + "BreakLongLine": "Dividir línea larga", + "FixLongDisplayTime": "Corregir tiempo largo", + "FixInvalidItalicTag": "Corregir etiqueta cursiva inválida", + "FixShortDisplayTime": "Corregir tiempo corto", + "FixOverlappingDisplayTime": "Corregir tiempo superpuesto", + "FixShortGap": "Corregir espacio corto", + "FixInvalidItalicTagsExample": "Qué me importa. -> Qué me importa.", + "RemoveUnneededSpacesExample": "Oye tú ; ahí. -> Oye tú; ahí.", + "RemoveUnneededPeriodsExample": "¡Oye tú!. -> ¡Oye tú!", + "FixMissingSpacesExample": "Oye.Tú. -> Oye. Tú.", + "FixUppercaseIInsideLowercaseWordsExample": "La tierra es pIana. -> La tierra es plana.", + "FixLowercaseIToUppercaseIExample": "Qué me importa i. -> Qué me importa I.", + "StartTimeLaterThanEndTime": "Texto {0}: El inicio es posterior al fin: {4}{1} -> {2} {3}", + "UnableToFixStartTimeLaterThanEndTime": "No se puede corregir texto {0}: Inicio posterior al fin: {1}", + "XFixedToYZ": "{0} corregido a: {1}{2}", + "UnableToFixTextXY": "No se puede corregir texto {0}: {1}", + "UnneededSpace": "Espacio innecesario", + "UnneededPeriod": "Punto innecesario", + "FixMissingSpace": "Corregir espacio faltante", + "FixUppercaseIInsideLowercaseWord": "Corregir 'i' mayúscula en palabra en minúscula", + "FixMissingPeriodAtEndOfLine": "Añadir punto faltante al final de línea", + "RefreshFixes": "Actualizar correcciones disponibles", + "ApplyFixes": "Aplicar correcciones y cerrar", + "AutoBreak": "Auto &div", + "Unbreak": "&Unir", + "FixDoubleDash": "Corregir '--' -> '...'", + "FixDoubleGreaterThan": "Eliminar '>>'", + "FixEllipsesStart": "Eliminar '...' iniciales", + "FixMissingOpenBracket": "Corregir [ o ( faltantes", + "FixMusicNotation": "Reemplazar símbolos musicales por el preferido", + "FixDoubleDashExample": "'Vaya-- um sí!' -> 'Vaya... um sí!'", + "FixDoubleGreaterThanExample": "'>> Robert: ¡Qué pasa!' -> 'Robert: ¡Qué pasa!'", + "FixEllipsesStartExample": "'... y entonces' -> 'y entonces'", + "FixMissingOpenBracketExample": "golpe] ¡Cuidado!' -> '[golpe] ¡Cuidado!'", + "FixMusicNotationExample": "'âTª dulces sueños' -> '♫ dulces sueños'", + "NumberOfImportantLogMessages": "¡{0} mensajes importantes en el registro!", + "FixedOkXY": "Corregido y OK - '{0}': {1}", + "FixOcrErrorExample": "N0 -> No", + "FixSpaceBetweenNumbersExample": "1 100 -> 1100", + "FixDialogsOneLineExample": "¡Hola Juan! - ¡Hola Ana! -> ¡Hola Juan!
- ¡Hola Ana!", + "RemoveDialogFirstInNonDialogsExample": "- ¿Cómo estás? -> ¿Cómo estás?", + "SelectDefault": "Seleccionar predet.", + "SetDefault": "Establecer correcciones actuales como predet.", + "FixContinuationStyleX": "Corregir estilo de continuación: {0}", + "FixUnnecessaryLeadingDots": "Eliminar puntos iniciales innecesarios", + "FixCommonErrorsProfiles": "Perfiles de corrección de errores", + "FixCommonOcrErrorsStep1": "Corregir errores, paso 1 (elegir)", + "SearchRulesDotDotDot": "Buscar reglas...", + "GoToApplyFixes": "Ir a aplicar correcciones", + "BackToFixList": "Volver a la lista", + "ApplyFixesAndClose": "Aplicar correcciones y cerrar", + "FixCommonOcrErrorsStep2": "Corregir errores, paso 2 (aplicar)", + "FixCommonOcrErrorsStep2FixesFoundX": "Corregir errores, paso 2 - Encontrados: {0}", + "Action": "Acción", + "ApplySelectedFixes": "Aplicar correcciones seleccionadas" }, - "applyDurationLimits": { - "title": "Aplicar límites de duración", - "fixMinDurationMs": "Corregir duración mínima (ms)", - "doNotGoPastShotChange": "No pasar del cambio de plano", - "fixMaxDurationMs": "Corregir duración máxima (ms)", - "maxDurationShouldBeHigherThanMinDuration": "La duración máxima debe ser mayor que la mínima", - "changedDurationFromXToYCommentZ": "Cambiada duración de {0} a {1} {2}", - "onlyPartialFixed": "(solo corrección parcial)", - "unfixableX": "Incorregible: {0}", - "fixedX": "Corregido: {0}", - "fixedXImprovedY": "Correcciones: {0}, Mejoras: {1}", - "noChangesNeeded": "Sin cambios necesarios" + "AdjustDurations": { + "Title": "Ajustar duraciones", + "AdjustVia": "Ajustar vía", + "Seconds": "Segundos", + "Percent": "Porcentaje", + "Recalculate": "Recalcular", + "AddSeconds": "Añadir segundos", + "SetAsPercent": "Establecer como porcentaje de duración", + "Note": "Nota: El tiempo final no se superpondrá al inicio del siguiente texto", + "Fixed": "Fijo", + "Milliseconds": "Milisegundos", + "ExtendOnly": "Solo extender", + "EnforceDurationLimits": "Aplicar límites de duración mínima y máxima", + "CheckShotChanges": "No extender más allá de los cambios de plano", + "BatchCheckShotChanges": "Respetar cambios de plano (si existen)" }, - "applyMinGaps": { - "title": "Aplicar espacios mínimos entre subtítulos", - "numberOfGapsFixedX": "Espacios mínimos aplicados: {0}", - "minFramesBetweenLines": "Mínimo de fotogramas entre líneas", - "minMsBetweenLines": "Mínimo de milisegundos entre líneas", - "changedGapFromXToYCommentZ": "Cambiado espacio de {0} a {1} {2}" + "ApplyDurationLimits": { + "Title": "Aplicar límites de duración", + "FixMinDurationMs": "Corregir duración mínima (ms)", + "DoNotGoPastShotChange": "No pasar del cambio de plano", + "FixMaxDurationMs": "Corregir duración máxima (ms)", + "MaxDurationShouldBeHigherThanMinDuration": "La duración máxima debe ser mayor que la mínima", + "ChangedDurationFromXToYCommentZ": "Cambiada duración de {0} a {1} {2}", + "OnlyPartialFixed": "(solo corrección parcial)", + "UnfixableX": "Incorregible: {0}", + "FixedX": "Corregido: {0}", + "FixedXImprovedY": "Correcciones: {0}, Mejoras: {1}", + "NoChangesNeeded": "Sin cambios necesarios" }, - "beautifyTimeCodes": { - "title": "Embellecer códigos de tiempo", - "beautifySettings": "Ajustes de embellecimiento", - "snapToFrames": "Ajustar a fotogramas", - "frameGap": "Espacio de fotogramas", - "minDuration": "Duración mín. (ms)", - "shotChangeThreshold": "Umbral de cambio de plano (ms)", - "shotChangeOffset": "Desfase de cambio de plano (fotogramas)", - "original": "Original", - "beautified": "Embellecido" + "ApplyMinGaps": { + "Title": "Aplicar espacios mínimos entre subtítulos", + "NumberOfGapsFixedX": "Espacios mínimos aplicados: {0}", + "MinFramesBetweenLines": "Mínimo de fotogramas entre líneas", + "MinMsBetweenLines": "Mínimo de milisegundos entre líneas", + "ChangedGapFromXToYCommentZ": "Cambiado espacio de {0} a {1} {2}" }, - "bridgeGaps": { - "title": "Unir espacios", - "bridgeGapsSmallerThan": "Unir espacios menores de (ms)", - "minGap": "Espacio mínimo (ms)", - "numberOfSmallGapsBridgedX": "Número de espacios pequeños unidos: {0}", - "percentFoPrevious": "Espacio para el anterior (%)", - "gapChange": "Cambio de espacio" + "BeautifyTimeCodes": { + "Title": "Embellecer códigos de tiempo", + "BeautifySettings": "Ajustes de embellecimiento", + "SnapToFrames": "Ajustar a fotogramas", + "FrameGap": "Espacio de fotogramas", + "MinDuration": "Duración mín. (ms)", + "ShotChangeThreshold": "Umbral de cambio de plano (ms)", + "ShotChangeOffset": "Desfase de cambio de plano (fotogramas)", + "Original": "Original", + "Beautified": "Embellecido" }, - "renumber": { - "title": "Renumerar", - "startFromNumber": "Empezar por el número:" + "BridgeGaps": { + "Title": "Unir espacios", + "BridgeGapsSmallerThan": "Unir espacios menores de (ms)", + "MinGap": "Espacio mínimo (ms)", + "NumberOfSmallGapsBridgedX": "Número de espacios pequeños unidos: {0}", + "PercentFoPrevious": "Espacio para el anterior (%)", + "GapChange": "Cambio de espacio" }, - "sortBy": { - "title": "Ordenar subtítulos", - "sortOrder": "Orden" + "Renumber": { + "Title": "Renumerar", + "StartFromNumber": "Empezar por el número:" }, - "batchConvert": { - "title": "Conversión por lotes", - "oneActionsSelected": "Una acción seleccionada", - "xActionsSelected": "{0} acciones seleccionadas", - "outputFolderSource": " Carpeta de salida: Carpeta de origen", - "outputFolderX": " Carpeta de salida: {0}", - "encodingXOverwriteY": "Codificación: {0}, sobrescribir archivos: {1}", - "targetFormatSettings": "Ajustes del formato de destino", - "fileNameContainsDotDotDot": "El nombre contiene...", - "trackLanguageContainsDotDotDot": "El idioma de pista contiene...", - "batchConvertSettings": "Ajustes de conversión por lotes", - "addFormatting": "Añadir formato", - "addItalic": "Añadir cursiva", - "addBold": "Añadir negrita", - "addUnderline": "Añadir subrayado", - "addAlignment": "Añadir alineación", - "addColor": "Añadir color", - "deleteLinesWithSpecificActorsOrStyles": "Eliminar líneas con actores o estilos (separados por coma)", - "useSourceStylesIfPossible": "Usar estilos de origen si es posible", - "editStyles": "Editar estilos", - "editProperties": "Editar propiedades", - "editAttachments": "Editar adjuntos", - "errorsExportedX": "Errores exportados: {0}" + "SortBy": { + "Title": "Ordenar subtítulos", + "SortOrder": "Orden" }, - "changeCasing": { - "title": "Cambiar mayúsculas/minúsculas", - "fixNames": "Corregir nombres", - "extraNames": "Nombres extra", - "enterExtraNamesHint": "Introduzca nombres extra a corregir, separados por comas", - "onlyFixUppercaseLines": "Solo corregir líneas en mayúsculas", - "fixNamesOnly": "Corregir solo nombres", - "allUppercase": "Todo en mayúsculas", - "allLowercase": "Todo en minúsculas" + "BatchConvert": { + "Title": "Conversión por lotes", + "OneActionsSelected": "Una acción seleccionada", + "XActionsSelected": "{0} acciones seleccionadas", + "OutputFolderSource": " Carpeta de salida: Carpeta de origen", + "OutputFolderX": " Carpeta de salida: {0}", + "EncodingXOverwriteY": "Codificación: {0}, sobrescribir archivos: {1}", + "TargetFormatSettings": "Ajustes del formato de destino", + "FileNameContainsDotDotDot": "El nombre contiene...", + "TrackLanguageContainsDotDotDot": "El idioma de pista contiene...", + "BatchConvertSettings": "Ajustes de conversión por lotes", + "AddFormatting": "Añadir formato", + "AddItalic": "Añadir cursiva", + "AddBold": "Añadir negrita", + "AddUnderline": "Añadir subrayado", + "AddAlignment": "Añadir alineación", + "AddColor": "Añadir color", + "DeleteLinesWithSpecificActorsOrStyles": "Eliminar líneas con actores o estilos (separados por coma)", + "UseSourceStylesIfPossible": "Usar estilos de origen si es posible", + "EditStyles": "Editar estilos", + "EditProperties": "Editar propiedades", + "EditAttachments": "Editar adjuntos", + "ErrorsExportedX": "Errores exportados: {0}", + "SlowFontSizeChange": "Cambio de tamaño de fuente lento", + "IncreaseFontKerning": "Aumentar el interletraje de fuente", + "ScrollUp": "Desplazarse hacia arriba", + "ScrollDown": "Desplácese hacia abajo", + "RotateIn": "Girar hacia dentro", + "TiltBounce": "Rebote de inclinación", + "FontSizeBounceIn": "El tamaño de fuente rebota" }, - "changeFormatting": { - "title": "Cambiar formato" + "ChangeCasing": { + "Title": "Cambiar mayúsculas/minúsculas", + "FixNames": "Corregir nombres", + "ExtraNames": "Nombres extra", + "EnterExtraNamesHint": "Introduzca nombres extra a corregir, separados por comas", + "OnlyFixUppercaseLines": "Solo corregir líneas en mayúsculas", + "FixNamesOnly": "Corregir solo nombres", + "AllUppercase": "Todo en mayúsculas", + "AllLowercase": "Todo en minúsculas" }, - "convertActors": { - "title": "Convertir actores", - "convertActorFrom": "Convertir actor de", - "convertActorTo": "Convertir actor a", - "inlineActorViaX": "Actor en línea mediante {0}", - "setColor": "Establecer color", - "onlyNames": "Solo nombres", - "numberOfConversionsX": "Número de conversiones: {0}" + "ChangeFormatting": { + "Title": "Cambiar formato" }, - "joinSubtitles": { - "title": "Unir subtítulos", - "keepTimeCodes": "Mantener códigos de tiempo", - "appendTimeCodes": "Anexar códigos de tiempo", - "addMsAfterEachFile": "Añadir milisegundos tras cada archivo", - "join": "_Unir" + "ConvertActors": { + "Title": "Convertir actores", + "ConvertActorFrom": "Convertir actor de", + "ConvertActorTo": "Convertir actor a", + "InlineActorViaX": "Actor en línea mediante {0}", + "SetColor": "Establecer color", + "OnlyNames": "Solo nombres", + "NumberOfConversionsX": "Número de conversiones: {0}" }, - "splitSubtitle": { - "title": "Dividir subtítulo", - "numberOfEqualParts": "Número de partes iguales", - "saveSplitParts": "_Guardar partes divididas", - "subtitleSplitIntoXParts": "Subtítulo dividido en {0} partes.", - "xPartsSavedInFormatYToFolder": "{0} partes guardadas en formato {1} en la carpeta:" + "JoinSubtitles": { + "Title": "Unir subtítulos", + "KeepTimeCodes": "Mantener códigos de tiempo", + "AppendTimeCodes": "Anexar códigos de tiempo", + "AddMsAfterEachFile": "Añadir milisegundos tras cada archivo", + "Join": "_Unir" }, - "splitBreakLongLines": { - "title": "Dividir/reequilibrar líneas largas", - "splitLongLines": "Dividir líneas largas (en varias líneas)", - "rebalanceLongLines": "Reequilibrar líneas largas", - "splitLongLine": "Dividir línea larga", - "rebalanceLongLine": "Reequilibrar línea larga", - "splitIntoXLines": "Dividir en {0} líneas: '{1}' → '{2}...'", - "linesSplitX": "Líneas divididas: {0}", - "linesSplitXLinesRebalancedY": "Líneas divididas: {0}, líneas reequilibradas: {1}" + "SplitSubtitle": { + "Title": "Dividir subtítulo", + "NumberOfEqualParts": "Número de partes iguales", + "SaveSplitParts": "_Guardar partes divididas", + "SubtitleSplitIntoXParts": "Subtítulo dividido en {0} partes.", + "XPartsSavedInFormatYToFolder": "{0} partes guardadas en formato {1} en la carpeta:" }, - "mergeShortLines": { - "title": "Combinar líneas cortas", - "highlightParts": "Resaltar partes (karaoke)" + "SplitBreakLongLines": { + "Title": "Dividir/reequilibrar líneas largas", + "SplitLongLines": "Dividir líneas largas (en varias líneas)", + "RebalanceLongLines": "Reequilibrar líneas largas", + "SplitLongLine": "Dividir línea larga", + "RebalanceLongLine": "Reequilibrar línea larga", + "SplitIntoXLines": "Dividir en {0} líneas: '{1}' → '{2}...'", + "LinesSplitX": "Líneas divididas: {0}", + "LinesSplitXLinesRebalancedY": "Líneas divididas: {0}, líneas reequilibradas: {1}" }, - "mergeLinesWithSameText": { - "title": "Combinar líneas con el mismo texto", - "maxMsBetweenLines": "Máximo de milisegundos entre líneas", - "includeIncrementingLines": "Incluir líneas con texto incremental" + "MergeShortLines": { + "Title": "Combinar líneas cortas", + "HighlightParts": "Resaltar partes (karaoke)", + "MergedLineInfo": "Línea fusionada {0} en {1} - {2}", + "LinesMergedX": "Líneas fusionadas: {0}" }, - "mergeLinesWithSameTimeCodes": { - "title": "Combinar líneas con mismos códigos de tiempo", - "maxMsDifference": "Diferencia máx. (milisegundos)", - "makeDialog": "Crear diálogos" + "MergeLinesWithSameText": { + "Title": "Combinar líneas con el mismo texto", + "MaxMsBetweenLines": "Máximo de milisegundos entre líneas", + "IncludeIncrementingLines": "Incluir líneas con texto incremental" }, - "netflixCheckAndFix": { - "title": "Comprobar y corregir errores de Netflix", - "generateReport": "Generar informe", - "nothingToReport": "No se encontraron problemas.", - "saveNetflixQualityReport": "Guardar informe de calidad de Netflix", - "netflixReportSaved": "Informe de calidad de Netflix guardado", - "netFlixQualityReportSavedToX": "Informe de calidad de Netflix guardado en:\n {0}" + "MergeLinesWithSameTimeCodes": { + "Title": "Combinar líneas con mismos códigos de tiempo", + "MaxMsDifference": "Diferencia máx. (milisegundos)", + "MakeDialog": "Crear diálogos" }, - "imageBasedEdit": { - "editImagedBaseSubtitle": "Editar subtítulo basado en imagen", - "editImagedBaseSubtitleX": "Editar subtítulo basado en imagen: {0}", - "resizeImagesDotDotDot": "Redimensionar imágenes...", - "adjustBrightnessDotDotDot": "Ajustar brillo...", - "adjustAlphaDotDotDot": "Ajustar alfa...", - "centerHorizontally": "Centrar horizontalmente", - "cropImages": "Recortar imágenes", - "importTimeCodes": "Importar códigos de tiempo...", - "setTextForSubtitle": "Establecer texto del subtítulo", - "screenWidth": "Ancho de pantalla", - "screenHeight": "Alto de pantalla", - "alphaThresholdInfo": "Los píxeles con alfa bajo el umbral serán totalmente transparentes", - "resetToDefaults": "Restablecer predeterminados", - "alphaAdjustmentInfo": "Ajuste alfa: Añadir/restar del canal alfa.\nLa vista previa se actualiza automáticamente con fondo de cuadros para visualizar la transparencia.", - "adjustBrightness": "Ajustar brillo", - "brightness": "Brillo", - "contrast": "Contraste", - "gamma": "Gamma", - "brightnessAdjustmentInfo": "Mueve los deslizadores para modificar brillo, contraste y gamma.\nLa vista previa se actualiza automáticamente con el primer subtítulo seleccionado.", - "resizeImages": "Redimensionar imágenes", - "percentage": "Porcentaje", - "resizeImagesInfo": "Introduzca el porcentaje para redimensionar.\nLa vista previa se actualizará automáticamente." + "NetflixCheckAndFix": { + "Title": "Comprobar y corregir errores de Netflix", + "GenerateReport": "Generar informe", + "NothingToReport": "No se encontraron problemas.", + "SaveNetflixQualityReport": "Guardar informe de calidad de Netflix", + "NetflixReportSaved": "Informe de calidad de Netflix guardado", + "NetFlixQualityReportSavedToX": "Informe de calidad de Netflix guardado en:\n {0}", + "DialogHyphenSpace": "Espacio de guión de diálogo", + "EllipsesNotThreeDots": "Utilice puntos suspensivos (no tres puntos)", + "OnlyAllowedGlyphs": "Sólo glifos permitidos", + "Italics": "Cursiva", + "MaxCharsSec": "Máximo de caracteres/seg.", + "MaxDuration": "Duración máxima", + "MaxLineLength": "Longitud máxima de línea", + "MinDuration": "Duración mínima", + "MaxNumberOfLines": "Número máximo de líneas", + "OneToTenSpellOut": "De uno a diez deletrear", + "ShotChanges": "Cambios de tiro", + "StartNumberSpellOut": "Deletrear el número de inicio", + "TextforHiUseBrackets": "Texto para HI, use corchetes", + "FrameRate": "Velocidad de fotogramas", + "TwoFrameGrap": "Espacio de dos marcos", + "WhiteSpace": "espacio en blanco" }, - "removeTextForHearingImpaired": { - "title": "Eliminar texto para deficientes auditivos", - "interjections": "Interjecciones", - "skipIfStartWith": "Omitir si empieza por", - "removeTextBetween": "Eliminar texto entre", - "brackets": "Corchetes", - "curlyBrackets": "Llaves", - "parentheses": "Paréntesis", - "and": "y", - "onlySeparateLines": "Solo líneas separadas", - "removeTextBeforeColon": "Eliminar texto antes de los dos puntos", - "onlyIfTextIsUppercase": "Solo si el texto está en mayúsculas", - "onlyOnSeparateLine": "Solo en línea separada", - "ifLineIsUppercase": "Si la línea está en mayúsculas", - "ifLineContains": "Si la línea contiene", - "ifLineOnlyContainsMusicSymbols": "Si la línea solo contiene símbolos musicales", - "removeInterjections": "Eliminar interjecciones" + "ImageBasedEdit": { + "EditImagedBaseSubtitle": "Editar subtítulo basado en imagen", + "EditImagedBaseSubtitleX": "Editar subtítulo basado en imagen: {0}", + "ResizeImagesDotDotDot": "Redimensionar imágenes...", + "AdjustBrightnessDotDotDot": "Ajustar brillo...", + "AdjustAlphaDotDotDot": "Ajustar alfa...", + "CenterHorizontally": "Centrar horizontalmente", + "CropImages": "Recortar imágenes", + "ImportTimeCodes": "Importar códigos de tiempo...", + "SetTextForSubtitle": "Establecer texto del subtítulo", + "ScreenWidth": "Ancho de pantalla", + "ScreenHeight": "Alto de pantalla", + "AlphaThresholdInfo": "Los píxeles con alfa bajo el umbral serán totalmente transparentes", + "ResetToDefaults": "Restablecer predeterminados", + "AlphaAdjustmentInfo": "Ajuste alfa: Añadir/restar del canal alfa.\nLa vista previa se actualiza automáticamente con fondo de cuadros para visualizar la transparencia.", + "AdjustBrightness": "Ajustar brillo", + "Brightness": "Brillo", + "Contrast": "Contraste", + "Gamma": "Gamma", + "BrightnessAdjustmentInfo": "Mueve los deslizadores para modificar brillo, contraste y gamma.\nLa vista previa se actualiza automáticamente con el primer subtítulo seleccionado.", + "ResizeImages": "Redimensionar imágenes", + "Percentage": "Porcentaje", + "ResizeImagesInfo": "Introduzca el porcentaje para redimensionar.\nLa vista previa se actualizará automáticamente." }, - "pickAlignmentTitle": "Elegir alineación", - "pickFontNameTitle": "Elegir nombre de fuente", - "colorPickerTitle": "Elegir color", - "filterLayersTitle": "Filtrar capas para visualización", - "filterLayersHideFromWaveform": "Ocultar de forma de onda/espectrograma", - "filterLayersHideFromSubtitleGrid": "Ocultar de la cuadrícula", - "filterLayersHideFromVideoPreview": "Ocultar de la vista previa de vídeo", - "pickSubtitleFormat": "Elegir formato de subtítulo", - "pickLayerTitle": "Establecer capa", - "recentColors": "Colores recientes" + "RemoveTextForHearingImpaired": { + "Title": "Eliminar texto para deficientes auditivos", + "Interjections": "Interjecciones", + "SkipIfStartWith": "Omitir si empieza por", + "RemoveTextBetween": "Eliminar texto entre", + "Brackets": "Corchetes", + "CurlyBrackets": "Llaves", + "Parentheses": "Paréntesis", + "And": "y", + "OnlySeparateLines": "Solo líneas separadas", + "RemoveTextBeforeColon": "Eliminar texto antes de los dos puntos", + "OnlyIfTextIsUppercase": "Solo si el texto está en mayúsculas", + "OnlyOnSeparateLine": "Solo en línea separada", + "IfLineIsUppercase": "Si la línea está en mayúsculas", + "IfLineContains": "Si la línea contiene", + "IfLineOnlyContainsMusicSymbols": "Si la línea solo contiene símbolos musicales", + "RemoveInterjections": "Eliminar interjecciones" + } }, - "spellCheck": { - "spellCheck": "Ortografía", - "getDictionariesTitle": "Ortografía - Obtener diccionarios", - "getDictionaryInstructions": "Elegir idioma y pulsar descargar", - "addNameToUserDictionary": "Añadir nombre al diccionario de usuario", - "addNameToNamesList": "Añadir nombre a la lista de nombres", - "noDictionariesFound": "No se encontraron diccionarios", - "wordNotFound": "Palabra no encontrada", - "lineXofY": "Corrector - línea {0} de {1}", - "changeWordFromXToY": "Cambiar palabra de '{0}' a '{1}'", - "changeAllWordsFromXToY": "Cambiar todas de '{0}' a '{1}'", - "ignoreWordXOnce": "Ignorar '{0}' una vez", - "ignoreWordXAlways": "Ignorar '{0}' siempre", - "wordXAddedToNamesList": "Palabra '{0}' añadida a la lista de nombres", - "wordXAddedToUserDictionary": "Palabra '{0}' añadida al diccionario de usuario", - "useSuggestionX": "Usar sugerencia '{0}'", - "useSuggestionXAlways": "Usar sugerencia '{0}' siempre", - "addXToUserDictionary": "Añadir '{0}' al diccionario de usuario", - "ignoreAllX": "Ignorar todas las '{0}'", - "pickSpellCheckDictionaryDotDotDot": "Elegir diccionario ortográfico...", - "chooseSpellCheckDictionary": "Elegir diccionario ortográfico" + "SpellCheck": { + "SpellCheck": "Ortografía", + "GetDictionariesTitle": "Ortografía - Obtener diccionarios", + "GetDictionaryInstructions": "Elegir idioma y pulsar descargar", + "AddNameToUserDictionary": "Añadir nombre al diccionario de usuario", + "AddNameToNamesList": "Añadir nombre a la lista de nombres", + "NoDictionariesFound": "No se encontraron diccionarios", + "WordNotFound": "Palabra no encontrada", + "LineXofY": "Corrector - línea {0} de {1}", + "ChangeWordFromXToY": "Cambiar palabra de '{0}' a '{1}'", + "ChangeAllWordsFromXToY": "Cambiar todas de '{0}' a '{1}'", + "IgnoreWordXOnce": "Ignorar '{0}' una vez", + "IgnoreWordXAlways": "Ignorar '{0}' siempre", + "WordXAddedToNamesList": "Palabra '{0}' añadida a la lista de nombres", + "WordXAddedToUserDictionary": "Palabra '{0}' añadida al diccionario de usuario", + "UseSuggestionX": "Usar sugerencia '{0}'", + "UseSuggestionXAlways": "Usar sugerencia '{0}' siempre", + "AddXToUserDictionary": "Añadir '{0}' al diccionario de usuario", + "IgnoreAllX": "Ignorar todas las '{0}'", + "PickSpellCheckDictionaryDotDotDot": "Elegir diccionario ortográfico...", + "ChooseSpellCheckDictionary": "Elegir diccionario ortográfico" }, - "video": { - "burnIn": { - "title": "Generar vídeo con subtítulos incrustados", - "infoAssaOff": "Nota: Estilos Advanced SubStation Alpha compatibles.", - "infoAssaOn": "Nota: ¡Se usarán estilos Advanced SubStation Alpha! :)", - "xGeneratedWithBurnedInSubsInX": "\"{0}\" generado con subtítulos incrustados en {1}.", - "timeRemainingMinutes": "Tiempo restante: {0} minutos", - "timeRemainingOneMinute": "Tiempo restante: Un minuto", - "timeRemainingSeconds": "Tiempo restante: {0} segundos", - "timeRemainingAFewSeconds": "Tiempo restante: Unos segundos", - "timeRemainingMinutesAndSeconds": "Tiempo restante: {0} minutos y {1} segundos", - "timeRemainingOneMinuteAndSeconds": "Tiempo restante: Un minuto y {0} segundos", - "targetFileName": "Nombre de archivo de destino: {0}", - "targetFileSize": "Tamaño de destino (requiere codificación de 2 pasos)", - "fileSizeMb": "Tamaño en MB", - "passX": "Paso {0}", - "encoding": "Codificando", - "bitRate": "Tasa de bits", - "totalBitRateX": "Tasa de bits total: {0}", - "sampleRate": "Tasa de muestreo", - "audio": "Audio", - "stereo": "Estéreo", - "preset": "Ajuste", - "pixelFormat": "Formato de píxel", - "crf": "CRF", - "tuneFor": "Optimizar para", - "alignRight": "Alinear a la derecha", - "getStartPosition": "Obtener posición inicial", - "getEndPosition": "Obtener posición final", - "useSource": "Usar origen", - "useSourceFolder": "Usar carpeta de origen", - "useSourceResolution": "Usar resolución de origen", - "outputSettings": "Archivo/carpeta de salida...", - "fontSizeFactor": "Factor de tamaño de fuente", - "boxType": "Tipo de caja", - "fixRightToLeft": "Corregir derecha a izquierda", - "cut": "Cortar", - "fromTime": "Desde el tiempo", - "toTime": "Hasta el tiempo", - "audioEncoding": "Codificación de audio", - "outputProperties": "Propiedades de salida...", - "videoFileSize": "Tamaño de archivo de vídeo", - "oneBox": "Una caja", - "boxPerLine": "Caja por línea" + "Video": { + "GoToVideoPosition": "Ir a la posición del vídeo", + "GenerateBlankVideoDotDotDot": "Generar vídeo en blanco...", + "GenerateBlankVideoTitle": "Generar vídeo en blanco", + "ReEncodeVideoForBetterSubtitlingTitle": "Recodificar vídeo para mejor subtitulado", + "ReEncodeVideoForBetterSubtitlingDotDotDot": "Recodificar vídeo para mejor subtitulado...", + "OpenSecondarySubtitleOnVideoPlayerDotDotDot": "Subtítulo secundario en reproductor, abrir...", + "OpenSecondarySubtitleOnVideoPlayer": "Subtítulo secundario (en reproductor)", + "RemoveSecondarySubtitleOnVideoPlayer": "Subtítulo secundario en reproductor, quitar", + "CutVideoTitle": "Cortar vídeo", + "CutVideoDotDotDot": "Cortar vídeo...", + "EmbedSubtitlesDotDotDot": "Añadir/quitar subtítulos incrustados...", + "GenerateTimeCodes": "Generar códigos de tiempo", + "CheckeredImage": "Imagen ajedrezada", + "SaveVideoAsTitle": "Guardar vídeo como", + "PromptForFfmpegParamsAndGenerate": "Pedir parámetros ffmpeg y generar", + "CutVideoCutSegments": "Cortar segmentos", + "CutVideoMergeSegments": "Combinar segmentos", + "CutVideoSplitSegments": "Guardar segmentos individualmente", + "CutVideoType": "Tipo de corte", + "MpvRenderAuto": "Auto", + "MpvRenderNative": "Nativo", + "MpvRenderOpenGl": "OpenGL", + "MpvRenderSoftware": "Software (lento)", + "ImportCurrentSubtitle": "Importar subtítulo actual", + "AddRemoveEmbeddedSubtitlesTitle": "Añadir/quitar subtítulos incrustados", + "AddCurrentSubtitle": "Añadir subtítulo actual", + "TitleOrLanguage": "Título/idioma", + "ViewMatroskaTrackX": "Ver pista Matroska - {0}", + "ResolutionSeparator": "x", + "OpenFromUrlTitle": "Abrir archivo de vídeo desde URL", + "BurnIn": { + "Title": "Generar vídeo con subtítulos incrustados", + "InfoAssaOff": "Nota: Estilos Advanced SubStation Alpha compatibles.", + "InfoAssaOn": "Nota: ¡Se usarán estilos Advanced SubStation Alpha! :)", + "XGeneratedWithBurnedInSubsInX": "\"{0}\" generado con subtítulos incrustados en {1}.", + "TimeRemainingMinutes": "Tiempo restante: {0} minutos", + "TimeRemainingOneMinute": "Tiempo restante: Un minuto", + "TimeRemainingSeconds": "Tiempo restante: {0} segundos", + "TimeRemainingAFewSeconds": "Tiempo restante: Unos segundos", + "TimeRemainingMinutesAndSeconds": "Tiempo restante: {0} minutos y {1} segundos", + "TimeRemainingOneMinuteAndSeconds": "Tiempo restante: Un minuto y {0} segundos", + "TargetFileName": "Nombre de archivo de destino: {0}", + "TargetFileSize": "Tamaño de destino (requiere codificación de 2 pasos)", + "FileSizeMb": "Tamaño en MB", + "PassX": "Paso {0}", + "Encoding": "Codificando", + "BitRate": "Tasa de bits", + "TotalBitRateX": "Tasa de bits total: {0}", + "SampleRate": "Tasa de muestreo", + "Audio": "Audio", + "Stereo": "Estéreo", + "Preset": "Ajuste", + "PixelFormat": "Formato de píxel", + "Crf": "CRF", + "TuneFor": "Optimizar para", + "AlignRight": "Alinear a la derecha", + "GetStartPosition": "Obtener posición inicial", + "GetEndPosition": "Obtener posición final", + "UseSource": "Usar origen", + "UseSourceFolder": "Usar carpeta de origen", + "UseSourceResolution": "Usar resolución de origen", + "OutputSettings": "Archivo/carpeta de salida...", + "FontSizeFactor": "Factor de tamaño de fuente", + "BoxType": "Tipo de caja", + "FixRightToLeft": "Corregir derecha a izquierda", + "Cut": "Cortar", + "FromTime": "Desde el tiempo", + "ToTime": "Hasta el tiempo", + "AudioEncoding": "Codificación de audio", + "OutputProperties": "Propiedades de salida...", + "VideoFileSize": "Tamaño de archivo de vídeo", + "OneBox": "Una caja", + "BoxPerLine": "Caja por línea", + "LogoInfo": "Elija una imagen PNG y arrástrela para colocarla en el video." }, - "videoTransparent": { - "title": "Generar vídeo transparente con subtítulos", - "infoAssaOff": "Nota: Estilos Advanced SubStation Alpha compatibles.", - "infoAssaOn": "Nota: ¡Se usarán estilos Advanced SubStation Alpha! :)" + "VideoTransparent": { + "Title": "Generar vídeo transparente con subtítulos", + "InfoAssaOff": "Nota: Estilos Advanced SubStation Alpha compatibles.", + "InfoAssaOn": "Nota: ¡Se usarán estilos Advanced SubStation Alpha! :)" }, - "audioToText": { - "title": "Voz a texto", - "transcribe": "Transcribir", - "translateToEnglish": "Traducir al inglés", - "transcribing": "Transcribiendo...", - "transcribingXOfY": "Transcribiendo {0} de {1}...", - "inputLanguage": "Idioma de entrada", - "advancedWhisperSettings": "Ajustes avanzados de Whisper", - "downloadingWhisperEngine": "Descargando motor Whisper", - "enableVad": "Habilitar VAD", - "whisperXxlStandard": "Estándar", - "whisperXxlStandardAsia": "Estándar Asia", - "whisperXxlSentence": "Nivel frase", - "whisperXxlSingleWords": "Palabras individuales", - "whisperXxlHighlightWord": "Resaltar palabra", - "selectModel": "Seleccionar modelo", - "viewWhisperLogFile": "Ver registro de Whisper", - "reDownloadX": "Volver a descargar {0}", - "downloadingSpeechToTextModel": "Descargando modelo de voz a texto", - "whisperPostProcessingTitle": "Post-procesamiento de Whisper", - "adjustTimings": "Ajustar tiempos", - "mergeShortLines": "Combinar líneas cortas", - "breakSplitLongLines": "Dividir líneas largas", - "fixShortDuration": "Corregir duración corta", - "fixCasing": "Corregir mayúsculas", - "addPeriods": "Añadir puntos", - "changeUnderlineToColor": "Cambiar subrayado por color" + "AudioToText": { + "Title": "Voz a texto", + "Transcribe": "Transcribir", + "TranslateToEnglish": "Traducir al inglés", + "Transcribing": "Transcribiendo...", + "TranscribingXOfY": "Transcribiendo {0} de {1}...", + "InputLanguage": "Idioma de entrada", + "AdvancedWhisperSettings": "Ajustes avanzados de Whisper", + "DownloadingWhisperEngine": "Descargando motor Whisper", + "EnableVad": "Habilitar VAD", + "WhisperXxlStandard": "Estándar", + "WhisperXxlStandardAsia": "Estándar Asia", + "WhisperXxlSentence": "Nivel frase", + "WhisperXxlSingleWords": "Palabras individuales", + "WhisperXxlHighlightWord": "Resaltar palabra", + "SelectModel": "Seleccionar modelo", + "ViewWhisperLogFile": "Ver registro de Whisper", + "ReDownloadX": "Volver a descargar {0}", + "DownloadingSpeechToTextModel": "Descargando modelo de voz a texto", + "WhisperPostProcessingTitle": "Post-procesamiento de Whisper", + "AdjustTimings": "Ajustar tiempos", + "MergeShortLines": "Combinar líneas cortas", + "BreakSplitLongLines": "Dividir líneas largas", + "FixShortDuration": "Corregir duración corta", + "FixCasing": "Corregir mayúsculas", + "AddPeriods": "Añadir puntos", + "ChangeUnderlineToColor": "Cambiar subrayado por color" }, - "textToSpeech": { - "title": "Texto a voz", - "textToSpeechEngine": "Motor de texto a voz", - "reviewAudioSegments": "TTS - Revisar segmentos de audio", - "reviewAudioSegmentsHistory": "TTS - Revisar historial de audio", - "stability": "Estabilidad", - "similarity": "Similitud", - "speakerBoost": "Refuerzo del orador", - "styleExaggeration": "Exageración de estilo", - "regenerateAudioSelectedLine": "Regenerar audio de línea seleccionada", - "generateSpeechFromText": "Generar voz desde texto", - "testVoice": "Probar voz", - "addAudioToVideoFile": "Añadir audio al archivo de vídeo", - "voiceSettings": "TTS - Ajustes de voz", - "voiceSampleText": "Texto de muestra de voz", - "refreshVoices": "Actualizar voces", - "videoEncodingSettings": "TTS - Ajustes de codificación de vídeo", - "elevenLabsSettings": "TTS - Ajustes de ElevenLabs", - "elevenLabsSettingsResetHint": "Restablecer ElevenLabs a valores predeterminados", - "regenerateAudio": "Regenerar audio", - "autoContinuePlaying": "Continuar reproducción automáticamente", - "addingAudioToVideoFileDotDotDot": "Añadiendo audio al archivo de vídeo...", - "preparingMergeDotDotDot": "Preparando combinación...", - "importVoiceDotDotDot": "Importar voz...", - "voiceImportSuccessTitle": "Voz importada", - "voiceXImported": "Voz '{0}' importada con éxito", - "advancedTtsSettings": "Ajustes avanzados de TTS", - "proAudioPostProcessing": "Post-procesamiento de audio Pro", - "proAudioPostProcessingDescription": "Aplica EQ, puerta de ruido, compresión, normalización (-16 LUFS) y fundidos a cada segmento.", - "audioDucking": "Atenuación de audio (ducking)", - "audioDuckingDescription": "Reduce el volumen del vídeo original para mezclarlo con el TTS.", - "originalVolumePercent": "Volumen original %", - "vadSilenceCompression": "Compresión de silencios VAD", - "vadSilenceCompressionDescription": "Acorta las pausas entre palabras mediante detección de voz. Reduce la duración sin pérdida de calidad.", - "maxSilenceMs": "Silencio máx. (ms)", - "highQualityTimeStretch": "Cambio de tiempo de alta calidad (WSOLA/rubberband)", - "highQualityTimeStretchDescription": "Usa el algoritmo rubberband para cambios de velocidad preservando el tono. Requiere librubberband.", - "silencePaddingMs": "Relleno de silencio (ms)", - "silencePaddingMsDescription": "Añade un breve silencio al final de cada segmento. Útil para dar aire entre frases.", - "outputSampleRate": "Tasa de muestreo de salida (0 = predet.)", - "outputSampleRateDescription": "Remuestrea todos los segmentos a la tasa especificada (ej. 44100, 48000).", - "edgeTtsRate": "Velocidad Edge-TTS", - "edgeTtsRateDescription": "Velocidad para Edge-TTS, ej. \"+50%\", \"-30%\", o \"+0%\" para predeterminado.", - "edgeTtsPitch": "Tono Edge-TTS", - "edgeTtsPitchDescription": "Ajuste de tono para Edge-TTS, ej. \"+10Hz\", \"-5Hz\", o \"+0Hz\".", - "edgeTtsVolume": "Volumen Edge-TTS", - "edgeTtsVolumeDescription": "Ajuste de volumen para Edge-TTS, ej. \"+20%\", \"-10%\", o \"+0%\"." + "TextToSpeech": { + "Title": "Texto a voz", + "TextToSpeechEngine": "Motor de texto a voz", + "ReviewAudioSegments": "TTS - Revisar segmentos de audio", + "ReviewAudioSegmentsHistory": "TTS - Revisar historial de audio", + "Stability": "Estabilidad", + "Similarity": "Similitud", + "SpeakerBoost": "Refuerzo del orador", + "StyleExaggeration": "Exageración de estilo", + "RegenerateAudioSelectedLine": "Regenerar audio de línea seleccionada", + "GenerateSpeechFromText": "Generar voz desde texto", + "TestVoice": "Probar voz", + "AddAudioToVideoFile": "Añadir audio al archivo de vídeo", + "VoiceSettings": "TTS - Ajustes de voz", + "VoiceSampleText": "Texto de muestra de voz", + "RefreshVoices": "Actualizar voces", + "VideoEncodingSettings": "TTS - Ajustes de codificación de vídeo", + "ElevenLabsSettings": "TTS - Ajustes de ElevenLabs", + "ElevenLabsSettingsResetHint": "Restablecer ElevenLabs a valores predeterminados", + "RegenerateAudio": "Regenerar audio", + "AutoContinuePlaying": "Continuar reproducción automáticamente", + "AddingAudioToVideoFileDotDotDot": "Añadiendo audio al archivo de vídeo...", + "PreparingMergeDotDotDot": "Preparando combinación...", + "ImportVoiceDotDotDot": "Importar voz...", + "VoiceImportSuccessTitle": "Voz importada", + "VoiceXImported": "Voz '{0}' importada con éxito", + "AdvancedTtsSettings": "Ajustes avanzados de TTS", + "ProAudioPostProcessing": "Post-procesamiento de audio Pro", + "ProAudioPostProcessingDescription": "Aplica EQ, puerta de ruido, compresión, normalización (-16 LUFS) y fundidos a cada segmento.", + "AudioDucking": "Atenuación de audio (ducking)", + "AudioDuckingDescription": "Reduce el volumen del vídeo original para mezclarlo con el TTS.", + "OriginalVolumePercent": "Volumen original %", + "VadSilenceCompression": "Compresión de silencios VAD", + "VadSilenceCompressionDescription": "Acorta las pausas entre palabras mediante detección de voz. Reduce la duración sin pérdida de calidad.", + "MaxSilenceMs": "Silencio máx. (ms)", + "HighQualityTimeStretch": "Cambio de tiempo de alta calidad (WSOLA/rubberband)", + "HighQualityTimeStretchDescription": "Usa el algoritmo rubberband para cambios de velocidad preservando el tono. Requiere librubberband.", + "SilencePaddingMs": "Relleno de silencio (ms)", + "SilencePaddingMsDescription": "Añade un breve silencio al final de cada segmento. Útil para dar aire entre frases.", + "OutputSampleRate": "Tasa de muestreo de salida (0 = predet.)", + "OutputSampleRateDescription": "Remuestrea todos los segmentos a la tasa especificada (ej. 44100, 48000).", + "EdgeTtsRate": "Velocidad Edge-TTS", + "EdgeTtsRateDescription": "Velocidad para Edge-TTS, ej. \"+50%\", \"-30%\", o \"+0%\" para predeterminado.", + "EdgeTtsPitch": "Tono Edge-TTS", + "EdgeTtsPitchDescription": "Ajuste de tono para Edge-TTS, ej. \"+10Hz\", \"-5Hz\", o \"+0Hz\".", + "EdgeTtsVolume": "Volumen Edge-TTS", + "EdgeTtsVolumeDescription": "Ajuste de volumen para Edge-TTS, ej. \"+20%\", \"-10%\", o \"+0%\".", + "DownloadPiperPrompt": "\"Texto a voz\" requiere Piper.\r\n\r\n¿Descargar y utilizar Piper?" }, - "shotChanges": { - "titleGenerateOrImport": "Generar/importar cambios de plano", - "generateShotChanges": "Generar cambios de plano", - "importShotChanges": "Importar cambios de plano", - "generateShotChangesWithFfmpeg": "Generar cambios de plano con ffmpeg", - "shotChangeTimeCode": "Código de tiempo de cambio de plano", - "openShotChangesFile": "Abrir archivo de cambios de plano", - "importShotChangesFromFile": "Importar cambios de plano desde archivo", - "timeCodeFormatColon": "Formato de código de tiempo:", - "shotChangesList": "Lista de cambios de plano", - "shotChangesClearQuestion": "¿Seguro que desea borrar todos los cambios de plano?", - "deleteSelectedShotChangeQuestion": "¿Seguro que desea eliminar el cambio de plano seleccionado?" - }, - "goToVideoPosition": "Ir a la posición del vídeo", - "generateBlankVideoDotDotDot": "Generar vídeo en blanco...", - "generateBlankVideoTitle": "Generar vídeo en blanco", - "reEncodeVideoForBetterSubtitlingTitle": "Recodificar vídeo para mejor subtitulado", - "reEncodeVideoForBetterSubtitlingDotDotDot": "Recodificar vídeo para mejor subtitulado...", - "openSecondarySubtitleOnVideoPlayerDotDotDot": "Subtítulo secundario en reproductor, abrir...", - "openSecondarySubtitleOnVideoPlayer": "Subtítulo secundario (en reproductor)", - "removeSecondarySubtitleOnVideoPlayer": "Subtítulo secundario en reproductor, quitar", - "cutVideoTitle": "Cortar vídeo", - "cutVideoDotDotDot": "Cortar vídeo...", - "embedSubtitlesDotDotDot": "Añadir/quitar subtítulos incrustados...", - "generateTimeCodes": "Generar códigos de tiempo", - "checkeredImage": "Imagen ajedrezada", - "saveVideoAsTitle": "Guardar vídeo como", - "promptForFfmpegParamsAndGenerate": "Pedir parámetros ffmpeg y generar", - "cutVideoCutSegments": "Cortar segmentos", - "cutVideoMergeSegments": "Combinar segmentos", - "cutVideoSplitSegments": "Guardar segmentos individualmente", - "cutVideoType": "Tipo de corte", - "mpvRenderAuto": "Auto", - "mpvRenderNative": "Nativo", - "mpvRenderOpenGl": "OpenGL", - "mpvRenderSoftware": "Software (lento)", - "importCurrentSubtitle": "Importar subtítulo actual", - "addRemoveEmbeddedSubtitlesTitle": "Añadir/quitar subtítulos incrustados", - "addCurrentSubtitle": "Añadir subtítulo actual", - "titleOrLanguage": "Título/idioma", - "viewMatroskaTrackX": "Ver pista Matroska - {0}", - "resolutionSeparator": "x", - "openFromUrlTitle": "Abrir archivo de vídeo desde URL" + "ShotChanges": { + "TitleGenerateOrImport": "Generar/importar cambios de plano", + "GenerateShotChanges": "Generar cambios de plano", + "ImportShotChanges": "Importar cambios de plano", + "GenerateShotChangesWithFfmpeg": "Generar cambios de plano con ffmpeg", + "ShotChangeTimeCode": "Código de tiempo de cambio de plano", + "OpenShotChangesFile": "Abrir archivo de cambios de plano", + "ImportShotChangesFromFile": "Importar cambios de plano desde archivo", + "TimeCodeFormatColon": "Formato de código de tiempo:", + "ShotChangesList": "Lista de cambios de plano", + "ShotChangesClearQuestion": "¿Seguro que desea borrar todos los cambios de plano?", + "DeleteSelectedShotChangeQuestion": "¿Seguro que desea eliminar el cambio de plano seleccionado?" + } }, - "waveform": { - "guessTimeCodes": "Adivinar códigos de tiempo", - "guessTimeCodesScanBlockSize": "Tamaño bloque escaneo (ms):", - "guessTimeCodesScanBlockAverageMin": "Media mínima del bloque (% del máx):", - "guessTimeCodesScanBlockAverageMax": "Media máxima del bloque (% del máx):", - "guessTimeCodesSplitLongSubtitlesAt": "Dividir subtítulos largos en (ms):", - "speechToTextSelectedLinesDotDotDot": "Voz a texto líneas seleccionadas...", - "seekSilence": "Buscar silencio", - "minSilenceDurationSeconds": "Duración mín. silencio (seg):", - "maxSilenceVolume": "Volumen máx. silencio (0.0 - 1.0):", - "guessTimeCodesDotDotDot": "Adivinar códigos de tiempo...", - "seekSilenceDotDotDot": "Buscar silencio...", - "toggleShotChange": "Alternar cambio de plano", - "resetWaveformZoomAndSpeed": "Restablecer zoom y velocidad", - "showOnlyWaveform": "Solo forma de onda", - "showOnlySpectrogram": "Solo espectrograma", - "showWaveformAndSpectrogram": "Forma de onda y espectrograma", - "spectrogramClassic": "Clásico", - "spectrogramClassicViridis": "Viridis", - "spectrogramClassicPlasma": "Plasma", - "spectrogramClassicInferno": "Inferno", - "spectrogramClassicTurbo": "Turbo", - "spectrogramNeon": "Neón", - "waveformDrawStyleClassic": "Clásico", - "waveformDrawStyleFancy": "Moderno", - "setVideoPositionAndPauseAndSelectSubtitle": "Pos. vídeo, pausar y seleccionar subtítulo", - "setVideopositionAndPauseAndSelectSubtitleAndCenter": "Pos. vídeo, pausar, seleccionar y centrar", - "setVideoPositionAndPause": "Pos. vídeo y pausar", - "setVideopositionAndPauseAndCenter": "Pos. vídeo, pausar y centrar", - "setVideoposition": "Establecer posición de vídeo" + "Waveform": { + "GuessTimeCodes": "Adivinar códigos de tiempo", + "GuessTimeCodesScanBlockSize": "Tamaño bloque escaneo (ms):", + "GuessTimeCodesScanBlockAverageMin": "Media mínima del bloque (% del máx):", + "GuessTimeCodesScanBlockAverageMax": "Media máxima del bloque (% del máx):", + "GuessTimeCodesSplitLongSubtitlesAt": "Dividir subtítulos largos en (ms):", + "SpeechToTextSelectedLinesDotDotDot": "Voz a texto líneas seleccionadas...", + "SeekSilence": "Buscar silencio", + "MinSilenceDurationSeconds": "Duración mín. silencio (seg):", + "MaxSilenceVolume": "Volumen máx. silencio (0.0 - 1.0):", + "GuessTimeCodesDotDotDot": "Adivinar códigos de tiempo...", + "SeekSilenceDotDotDot": "Buscar silencio...", + "ToggleShotChange": "Alternar cambio de plano", + "ResetWaveformZoomAndSpeed": "Restablecer zoom y velocidad", + "ShowOnlyWaveform": "Solo forma de onda", + "ShowOnlySpectrogram": "Solo espectrograma", + "ShowWaveformAndSpectrogram": "Forma de onda y espectrograma", + "SpectrogramClassic": "Clásico", + "SpectrogramClassicViridis": "Viridis", + "SpectrogramClassicPlasma": "Plasma", + "SpectrogramClassicInferno": "Inferno", + "SpectrogramClassicTurbo": "Turbo", + "SpectrogramNeon": "Neón", + "WaveformDrawStyleClassic": "Clásico", + "WaveformDrawStyleFancy": "Moderno", + "SetVideoPositionAndPauseAndSelectSubtitle": "Pos. vídeo, pausar y seleccionar subtítulo", + "SetVideopositionAndPauseAndSelectSubtitleAndCenter": "Pos. vídeo, pausar, seleccionar y centrar", + "SetVideoPositionAndPause": "Pos. vídeo y pausar", + "SetVideopositionAndPauseAndCenter": "Pos. vídeo, pausar y centrar", + "SetVideoposition": "Establecer posición de vídeo" }, - "sync": { - "visualSync": "Sincronización visual", - "sync": "Sincronizar", - "startScene": "Escena inicial", - "endScene": "Escena final", - "playTwoSecondsAndBack": "Reprod. 2s y atrás", - "findText": "Buscar texto", - "resolutionXDurationYFrameRateZ": "Res.: {0}, duración: {1}, FPS: {2}", - "startSceneMustComeBeforeEndScene": "La escena inicial debe ir antes que la final", - "goToSubPos": "Ir a pos. sub", - "speedInPercentage": "Velocidad en %", - "fromDropFrameValue": "Desde valor drop-frame", - "toDropFrameValue": "A valor drop-frame", - "adjustAll": "Ajustar todo", - "adjustSelectedLines": "Ajustar líneas sel.", - "adjustSelectedLinesAndForward": "Ajustar líneas sel. y adelante", - "toFrameRate": "A tasa fotogramas", - "fromFrameRate": "Desde tasa fotogramas", - "adjustAllTimes": "Ajustar todos los tiempos (antes/después)", - "showEarlier": "Mostrar antes", - "showLater": "Mostrar después", - "changeFrameRate": "Cambiar tasa fotogramas", - "setSyncPoint": "Establecer punto sincro", - "syncPoints": "Puntos sincro", - "pointSync": "Sincronización puntos", - "pointSyncViaOther": "Sincronización puntos vía otro subtítulo", - "adjustmentX": "Ajuste: {0}", - "adjustAllShortcuts": "Atajos de teclado:\r\n\r\n• Mayús + Izq/Der: Mover 10 ms\r\n• Ctrl + Izq/Der: Mover 100 ms\r\n• Alt + Izq/Der: Mover 500 ms", - "offsetInSeconds": "Desfase en segundos", - "speedFactor": "Factor de velocidad" + "Sync": { + "VisualSync": "Sincronización visual", + "Sync": "Sincronizar", + "StartScene": "Escena inicial", + "EndScene": "Escena final", + "PlayTwoSecondsAndBack": "Reprod. 2s y atrás", + "FindText": "Buscar texto", + "ResolutionXDurationYFrameRateZ": "Res.: {0}, duración: {1}, FPS: {2}", + "StartSceneMustComeBeforeEndScene": "La escena inicial debe ir antes que la final", + "GoToSubPos": "Ir a pos. sub", + "SpeedInPercentage": "Velocidad en %", + "FromDropFrameValue": "Desde valor drop-frame", + "ToDropFrameValue": "A valor drop-frame", + "AdjustAll": "Ajustar todo", + "AdjustSelectedLines": "Ajustar líneas sel.", + "AdjustSelectedLinesAndForward": "Ajustar líneas sel. y adelante", + "ToFrameRate": "A tasa fotogramas", + "FromFrameRate": "Desde tasa fotogramas", + "AdjustAllTimes": "Ajustar todos los tiempos (antes/después)", + "ShowEarlier": "Mostrar antes", + "ShowLater": "Mostrar después", + "ChangeFrameRate": "Cambiar tasa fotogramas", + "SetSyncPoint": "Establecer punto sincro", + "SyncPoints": "Puntos sincro", + "PointSync": "Sincronización puntos", + "PointSyncViaOther": "Sincronización puntos vía otro subtítulo", + "AdjustmentX": "Ajuste: {0}", + "AdjustAllShortcuts": "Atajos de teclado:\r\n\r\n• Mayús + Izq/Der: Mover 10 ms\r\n• Ctrl + Izq/Der: Mover 100 ms\r\n• Alt + Izq/Der: Mover 500 ms", + "OffsetInSeconds": "Desfase en segundos", + "SpeedFactor": "Factor de velocidad" }, - "translate": { - "translateViaCopyPaste": "Auto-traducir vía copiar/pegar", - "maxBlockSize": "Tamaño bloque máx.", - "lineSeparator": "Separador línea", - "blockCopyInfo": "Ve al traductor/IA y pega el texto (ya está en el portapapeles), copia el resultado y pulsa el botón de abajo.", - "blockCopyGetFromClipboard": "Obtener texto del portapapeles (del traductor/IA)", - "reCopyTextToClipboard": "Volver a copiar al portapapeles (para el traductor/IA)", - "blockXOfY": "Bloque {0} de {1}", - "noTextInClipboard": "No hay texto en el portapapeles", - "textInClipboardIsSameAsSourceText": "El texto del portapapeles es igual al de origen, inténtelo de nuevo.", - "lineMerge": "Unir líneas", - "delayInSecondsBetweenRequests": "Retraso en segundos entre peticiones", - "maxBytesPerRequest": "Bytes máx. por petición", - "promptText": "Texto del prompt" + "Translate": { + "TranslateViaCopyPaste": "Auto-traducir vía copiar/pegar", + "MaxBlockSize": "Tamaño bloque máx.", + "LineSeparator": "Separador línea", + "BlockCopyInfo": "Ve al traductor/IA y pega el texto (ya está en el portapapeles), copia el resultado y pulsa el botón de abajo.", + "BlockCopyGetFromClipboard": "Obtener texto del portapapeles (del traductor/IA)", + "ReCopyTextToClipboard": "Volver a copiar al portapapeles (para el traductor/IA)", + "BlockXOfY": "Bloque {0} de {1}", + "NoTextInClipboard": "No hay texto en el portapapeles", + "TextInClipboardIsSameAsSourceText": "El texto del portapapeles es igual al de origen, inténtelo de nuevo.", + "LineMerge": "Unir líneas", + "DelayInSecondsBetweenRequests": "Retraso en segundos entre peticiones", + "MaxBytesPerRequest": "Bytes máx. por petición", + "PromptText": "Texto del prompt", + "TranslateEachLineSeparately": "Traduce cada línea por separado" }, - "options": { - "settings": { - "dialogStyle": "Estilo de diálogo", - "dialogStyleDashSecondLineWithoutSpace": "Guion segunda línea sin espacio", - "dialogStyleDashSecondLineWithSpace": "Guion segunda línea con espacio", - "dialogStyleDashBothLinesWithSpace": "Guiones ambas líneas con espacio", - "dialogStyleDashBothLinesWithoutSpace": "Guiones ambas líneas sin espacio", - "continuationStyle": "Estilo de continuación", - "continuationStyleNone": "Ninguno", - "continuationStyleNoneTrailingDots": "Ninguno, puntos para pausas (solo al final)", - "continuationStyleNoneLeadingTrailingDots": "Ninguno, puntos para pausas", - "continuationStyleNoneTrailingEllipsis": "Ninguno, elipsis para pausas (solo al final)", - "continuationStyleNoneLeadingTrailingEllipsis": "Ninguno, elipsis para pausas", - "continuationStyleOnlyTrailingDots": "Puntos (solo al final)", - "continuationStyleLeadingTrailingDots": "Puntos", - "continuationStyleOnlyTrailingEllipsis": "Elipsis (solo al final)", - "continuationStyleLeadingTrailingEllipsis": "Elipsis", - "continuationStyleLeadingTrailingDash": "Guion", - "continuationStyleLeadingTrailingDashDots": "Guion, pero puntos para pausas", - "continuationStyleCustom": "Personalizado", - "cpsLineLengthStyle": "CPS/Longitud línea", - "cpsLineLengthStyleCalcAll": "Contar todos los caracteres", - "cpsLineLengthStyleCalcNoSpaceCpsOnly": "Contar todo menos espacios, solo CPS", - "cpsLineLengthStyleCalcNoSpace": "Contar todo menos espacios", - "cpsLineLengthStyleCalcCjk": "CJK 1, Latín 0.5", - "cpsLineLengthStyleCalcCjkNoSpace": "CJK 1, Latín 0.5, espacio 0", - "cpsLineLengthStyleCalcIncludeCompositionCharacters": "Incluir caracteres de composición", - "cpsLineLengthStyleCalcIncludeCompositionCharactersNotSpace": "Incluir caracteres composición, no espacios", - "cpsLineLengthStyleCalcNoSpaceOrPunctuation": "Sin espacios ni puntuación ()[]-:;,.!?", - "cpsLineLengthStyleCalcNoSpaceOrPunctuationCpsOnly": "Sin espacios ni puntuación, solo CPS", - "cpsLineLengthStyleCalcIgnoreArabicDiacritics": "Ignorar diacríticos árabes", - "cpsLineLengthStyleCalcIgnoreArabicDiacriticsNoSpace": "Ignorar diacríticos árabes, sin espacios", - "timeCodeModeHhMmSsMs": "HH:MM:SS:MS", - "timeCodeModeHhMmSsFf": "HH:MM:SS:FF", - "splitBehaviorPrevious": "Hueco a la izq. de división (foco derecha)", - "splitBehaviorHalf": "Hueco en centro de división (foco izquierda)", - "splitBehaviorNext": "Hueco a la der. de división (foco izquierda)", - "subtitleListActionNothing": "Nada", - "subtitleListActionVideoGoToPositionAndPause": "Ir a pos. vídeo y pausar", - "subtitleListActionVideoGoToPositionAndPlay": "Ir a pos. vídeo y reproducir", - "subtitleListActionVideoGoToPositionAndPlayCurrentAndPause": "Ir a pos. vídeo, reprod. actual y pausar", - "subtitleListActionEditText": "Ir a cuadro de edición", - "subtitleListActionVideoGoToPositionMinus1SecAndPause": "Ir a pos. vídeo - 1 s y pausar", - "subtitleListActionVideoGoToPositionMinusHalfSecAndPause": "Ir a pos. vídeo - 0.5 s y pausar", - "subtitleListActionVideoGoToPositionMinus1SecAndPlay": "Ir a pos. vídeo - 1 s y reproducir", - "subtitleListActionEditTextAndPause": "Ir a cuadro edición y pausar en pos. vídeo", - "autoBackupEveryMinute": "Cada minuto", - "autoBackupEveryXthMinute": "Cada {0} minutos", - "profiles": "Perfiles", - "autoBackupDeleteAfterXMonths": "Eliminar copias tras {0} meses", - "searchSettingsDotDoDot": "Buscar en ajustes...", - "syntaxColoring": "Coloreado de sintaxis", - "waveformSpectrogram": "Forma de onda/espectrograma", - "network": "Red", - "fileTypeAssociations": "Asociaciones de archivo", - "textBoxColorTags": "Etiquetas color (HTML/ASSA) en cuadro de edición", - "textBoxLiveSpellCheck": "Ortografía en vivo en cuadro de edición", - "textBoxCenterText": "Centrar texto en cuadro de edición", - "textBoxFontBold": "Negrita en cuadro de edición", - "textBoxFontSize": "Tamaño fuente en cuadro de edición", - "subtitleTextBoxAndGridFontName": "Fuente UI en cuadro de edición y lista", - "subtitleGridFontSize": "Tamaño fuente en lista de subtítulos", - "subtitleGridTextSingleLine": "Subtítulo en una sola línea en lista", - "subtitleGridLiveSpellCheck": "Ortografía en vivo en lista", - "subtitleGridShowFormatting": "Mostrar formato (HTML/ASSA) en lista", - "showUpDownStartTime": "Control arriba/abajo para \"Inicio\"", - "showUpDownEndTime": "Control arriba/abajo para \"Fin\"", - "showUpDownDuration": "Control arriba/abajo para \"Duración\"", - "showUpDownLabels": "Mostrar etiquetas en controles arriba/abajo", - "showButtonHints": "Mostrar sugerencias de botones", - "gridCompactMode": "Usar modo compacto en listas", - "uiFont": "Fuente de la interfaz", - "theme": "Tema", - "iconTheme": "Tema de iconos", - "darkThemeForegroundColor": "Color de frente (tema oscuro)", - "darkThemeBackgroundColor": "Color de fondo (tema oscuro)", - "showGridLines": "Mostrar líneas de cuadrícula", - "resetSettings": "¿Restablecer ajustes?", - "resetSettingsDetail": "Se restablecerán todos los ajustes a sus valores por defecto.\n\n¿Continuar?", - "showHorizontalLineAboveToolbar": "Línea horizontal sobre barra herramientas", - "bookmarkColor": "Color de marcadores", - "singleLineMaxLength": "Longitud máx. línea única", - "optimalCharsPerSec": "CPS óptimos", - "maxCharsPerSec": "CPS máximos", - "maxWordsPerMin": "WPM máximos", - "minDurationMs": "Duración mín. (ms)", - "maxDurationMs": "Duración máx. (ms)", - "minGapMs": "Espacio mín. (ms)", - "maxLines": "Número máx. de líneas", - "unbreakSubtitlesShortThan": "Unir subtítulos más cortos que", - "newEmptyDefaultMs": "Duración predet. nuevo subtítulo (ms)", - "promptBeforeDelete": "Preguntar antes de borrar", - "rememberPositionAndSize": "Recordar posición y tamaño de ventana", - "autoBackupOn": "Copia seguridad automática", - "autoBackupIntervalMinutes": "Intervalo copia seguridad (min)", - "autoBackupDeleteAfterDays": "Días de retención de copias", - "autoConvertToUtf8": "Auto-convertir a UTF-8 al abrir", - "autoTrimWhiteSpace": "Auto-recortar espacios", - "defaultEncoding": "Codificación predeterminada", - "colorDurationTooShort": "Color duración si es muy corta", - "colorDurationTooLong": "Color duración si es muy larga", - "colorTextTooLong": "Color texto si es muy largo", - "colorTextTooWide": "Color texto si es muy ancho (píxeles)", - "colorTextTooManyLines": "Color texto si hay más de 2 líneas", - "colorOverlap": "Color superposición tiempos", - "colorGapTooShort": "Color si espacio es muy corto", - "errorBackgroundColor": "Color fondo error", - "waveformDrawGridLines": "Dibujar líneas cuadrícula", - "waveformCenterVideoPosition": "Centrar posición vídeo", - "waveformShowToolbar": "Mostrar barra de herramientas", - "waveformShowToolbarEdit": "Editar barra herramientas...", - "waveformSpectrogramCombinedWaveformHeight": "Onda/espectro combinado, altura onda %", - "showWaveformToolbarPlay": "Barra: botón reproducir", - "showWaveformToolbarRepeat": "Barra: botón repetir", - "showWaveformToolbarRemoveBlankLines": "Barra: botón quitar líneas blanco", - "showWaveformToolbarNew": "Barra: botón nuevo subtítulo", - "showWaveformToolbarSetStart": "Barra: botón fijar inicio", - "showWaveformToolbarSetEnd": "Barra: botón fijar fin", - "showWaveformToolbarStartAndOffsetTheRest": "Barra: botón fijar inicio y desfasar resto", - "showWaveformToolbarHorizontalZoom": "Barra: deslizador zoom horizontal", - "showWaveformToolbarVerticalZoom": "Barra: deslizador zoom vertical", - "showWaveformToolbarVideoPositionSlider": "Barra: deslizador posición vídeo", - "showWaveformToolbarPlaybackSpeed": "Barra: velocidad reproducción", - "waveformFocusTextboxAfterInsertNew": "Foco en cuadro texto tras insertar", - "waveformInvertMouseWheel": "Invertir rueda ratón", - "waveformSnapToShotChanges": "Ajustar a cambios de plano", - "waveformShotChangesAutoGenerate": "Auto-generar cambios plano", - "waveformTextFontSize": "Tamaño fuente texto en onda", - "waveformTextFontBold": "Negrita texto en onda", - "waveformTextColor": "Color texto en onda", - "waveformColor": "Color de la forma de onda", - "waveformBackgroundColor": "Color de fondo de onda", - "waveformSelectedColor": "Color de onda seleccionada", - "downloadFfmpeg": "Descargar ffmpeg", - "showToolbarNew": "Icono nuevo", - "showToolbarOpen": "Icono abrir", - "showToolbarVideoFileOpen": "Icono abrir vídeo", - "showToolbarSave": "Icono guardar", - "showToolbarSaveAs": "Icono guardar como", - "showToolbarFind": "Icono buscar", - "showToolbarReplace": "Icono reemplazar", - "showToolbarSpellCheck": "Icono ortografía", - "showToolbarFixCommonErrors": "Icono errores comunes", - "showToolbarSettings": "Icono ajustes", - "showToolbarLayout": "Icono diseño", - "showToolbarHelp": "Icono ayuda", - "showToolbarEncoding": "Mostrar codificación", - "showToolbarFrameRate": "Mostrar tasa fotogramas", - "proxyAddress": "Dirección proxy", - "username": "Usuario", - "password": "Password", - "defaultFormat": "Formato predeterminado", - "defaultSaveAsFormat": "Formato predeterminado \"Guardar como\"", - "favoriteSubtitleFormats": "Formatos favoritos", - "showStopButton": "Botón parar", - "showFullscreenButton": "Botón pantalla completa", - "autoOpenVideoFile": "Abrir vídeo al abrir subtítulos", - "downloadMpv": "Descargar mpv", - "downloadVlc": "Descargar VLC", - "goToLineNumberSetsVideoPosition": "Ir a línea también mueve vídeo", - "adjustAllTimesRememberLineSelectionChoice": "Recordar elección selección líneas al ajustar tiempos", - "filesAndLogs": "Archivos y registros", - "showErrorLogFile": "Ver archivo registro errores", - "showWhisperLogFile": "Ver archivo registro Whisper", - "showSettingsFile": "Ver archivo ajustes", - "showAssaLayer": "Mostrar cuadro capa ASSA", - "waveformCursorColor": "Color cursor/cabezal onda", - "waveformParagraphLeftColor": "Color borde izquierdo onda", - "waveformParagraphRightColor": "Color borde derecho onda", - "waveformFancyHighColor": "Color onda moderno (alto)", - "waveformFocusOnMouseOver": "Foco al pasar ratón", - "resetAllSettings": "Restablecer todos los ajustes", - "resetShortcuts": "Restablecer atajos", - "resetRecentFiles": "Restablecer recientes", - "resetMultipleReplaceRules": "Restablecer reglas reemplazo", - "resetAppearance": "Restablecer apariencia", - "resetAutoTranslate": "Restablecer auto-traducción", - "resetWindowPositionAndSize": "Restablecer posición ventana", - "resetSettingsTitle": "Restablecer ajustes", - "openRuleFile": "Abrir archivo reglas", - "exportProfiles": "Exportar perfiles", - "saveRuleProfilesFile": "Guardar archivo perfiles reglas", - "ruleProfilesExportedX": "{0} perfiles exportados", - "ruleProfilesImportedX": "{0} perfiles importados", - "useSpecialStyleAfterLongGaps": "Estilo especial tras espacios largos", - "addSpace": "Añadir espacio", - "processIfEndsWithComma": "Procesar si acaba en coma", - "removeComma": "Quitar coma", - "editContinuationStyleCustom": "Editar estilo continuación personalizado", - "longGapThreshold": "Umbral espacio largo (ms)", - "afterLongGap": "Tras espacio largo:", - "resetSyntaxColoring": "Restablecer color sintaxis", - "resetWaveform": "Restablecer forma de onda", - "resetRules": "Restablecer reglas", - "useFrameMode": "Usar modo fotogramas (hh.mm.ss.ff)", - "textBoxLimitNewLines": "Limitar saltos línea en cuadro texto", - "mpvVideoOutput": "Salida vídeo (mpv)", - "mpvOpenGl": "libmpv - OpenGL", - "mpvSoftwareRendering": "libmpv - Software (lento)", - "mpvWidRendering": "libmpv - Nativo Window ID (rápido en Win/Linux)", - "waveFormsAndSpectrogramFoldersContainsX": "Carpetas de onda/espectro contienen {0}", - "deleteWaveformAndSpectrogramFoldersQuestion": "¿Borrar archivos de onda y espectro?", - "waveformGenerateSpectrogram": "Generar espectrograma", - "waveformSpectrogramMode": "Modo espectrograma", - "waveformCenterOnSingleClick": "Centrar con un clic", - "waveformSingleClickSelectsSubtitle": "Clic selecciona subtítulo", - "waveformRightClickSelectsSubtitle": "Clic derecho selecciona subtítulo", - "waveformPauseOnSingleClick": "Clic pausa reproducción", - "waveformDrawStyle": "Estilo dibujo onda", - "vlcWidRendering": "libVLC - Nativo Window ID", - "subtitleSEnterKeyAction": "Acción tecla Enter en lista", - "subtitleSingleClickAction": "Acción un clic en lista", - "subtitleDoubleClickAction": "Acción doble clic en lista", - "saveAsBehavior": "Comportamiento \"Guardar como\"", - "saveAsAppendLanguageCode": "\"Guardar como\" añade código idioma", - "gridGoToSubtitleAndSetVideoPosition": "Ir a subtítulo y mover vídeo", - "gridGoToNextLine": "Ir a la siguiente línea", - "gridGoToSubtitleOnlyWaveformOnly": "Ir a subtítulo (solo onda)", - "gridGoToSubtitleAndPause": "Ir a subtítulo y pausar", - "gridGoToSubtitleAndPlay": "Ir a subtítulo y reproducir", - "gridGoToSubtitleAndPauseAndFocusTextBox": "Ir a sub, pausar y foco cuadro texto", - "subtitleGridFormattingNone": "Sin formato", - "subtitleGridFormattingShowFormatting": "Mostrar formato", - "subtitleGridFormattingShowTags": "Mostrar etiquetas", - "waveformParagraphBackgroundColor": "Color fondo subtítulo en onda", - "waveformParagraphSelectedBackgroundColor": "Color fondo subtítulo seleccionado en onda", - "waveformAllowOverlap": "Permitir superposición (mover/redimensionar)", - "saveAsBehaviorUseSubtitleVideoFilename": "Nombre subtítulo/vídeo", - "saveAsBehaviorUseVideoSubtitleFilename": "Nombre vídeo/subtítulo", - "saveAsBehaviorUseVideoFileName": "Usar nombre de vídeo", - "saveAsBehaviorUseSubtitleFileName": "Usar nombre de subtítulo", - "saveAsAppendLanguageCodeTwoLetter": "Dos letras", - "saveAsAppendLanguageCodeThreeLetter": "Tres letras", - "saveAsAppendLanguageCodeLanguageName": "Nombre del idioma", - "splitOddLineActionWeightTop": "Priorizar arriba", - "splitOddLineActionWeightBottom": "Priorizar abajo", - "splitOddLinesAction": "Acción dividir líneas impares", - "ocrUseWordSplitList": "OCR: usar lista división palabras", - "speechToTextSelectedLinesPromptFistTimeOnly": "Voz a texto: preguntar idioma solo primera vez", - "multipleReplaceShowDotDotDotButtons": "Reemplazo múltiple: botones menú contexto", - "gridFocusTextboxAfterInsertNew": "Lista: foco en cuadro texto tras insertar", - "useFocusedButtonBackgroundColor": "Usar color fondo en botón enfocado", - "focusedButtonBackgroundColor": "Color fondo botón enfocado", - "forceCrLfOnSave": "Forzar CR+LF al guardar", - "showWaveformToolbarPlayNext": "Barra: botón reprod. siguiente", - "showWaveformToolbarPlaySelection": "Barra: botón reprod. selección", - "textBoxButtonShowAutoBreak": "C. texto: botón auto-división", - "textBoxButtonShowUnbreak": "C. texto: botón unir", - "textBoxButtonShowItalic": "C. texto: botón cursiva", - "textBoxButtonShowColor": "C. texto: botón color", - "textBoxButtonShowRemoveFormatting": "C. texto: botón quitar formato", - "waveformSingleClickAction": "Acción un clic en onda", - "waveformDoubleClickAction": "Acción doble clic en onda", - "allSettings": "Todos los ajustes", - "uiScale": "Escala de la interfaz (%)", - "waveformToolbarItems": "Elementos barra onda", - "matchIconColorToDarkTheme": "Iconos acordes al tema oscuro", - "subtitlePreviewProperties": "Propiedades vista previa" + "Options": { + "Settings": { + "DialogStyle": "Estilo de diálogo", + "DialogStyleDashSecondLineWithoutSpace": "Guion segunda línea sin espacio", + "DialogStyleDashSecondLineWithSpace": "Guion segunda línea con espacio", + "DialogStyleDashBothLinesWithSpace": "Guiones ambas líneas con espacio", + "DialogStyleDashBothLinesWithoutSpace": "Guiones ambas líneas sin espacio", + "ContinuationStyle": "Estilo de continuación", + "ContinuationStyleNone": "Ninguno", + "ContinuationStyleNoneTrailingDots": "Ninguno, puntos para pausas (solo al final)", + "ContinuationStyleNoneLeadingTrailingDots": "Ninguno, puntos para pausas", + "ContinuationStyleNoneTrailingEllipsis": "Ninguno, elipsis para pausas (solo al final)", + "ContinuationStyleNoneLeadingTrailingEllipsis": "Ninguno, elipsis para pausas", + "ContinuationStyleOnlyTrailingDots": "Puntos (solo al final)", + "ContinuationStyleLeadingTrailingDots": "Puntos", + "ContinuationStyleOnlyTrailingEllipsis": "Elipsis (solo al final)", + "ContinuationStyleLeadingTrailingEllipsis": "Elipsis", + "ContinuationStyleLeadingTrailingDash": "Guion", + "ContinuationStyleLeadingTrailingDashDots": "Guion, pero puntos para pausas", + "ContinuationStyleCustom": "Personalizado", + "CpsLineLengthStyle": "CPS/Longitud línea", + "CpsLineLengthStyleCalcAll": "Contar todos los caracteres", + "CpsLineLengthStyleCalcNoSpaceCpsOnly": "Contar todo menos espacios, solo CPS", + "CpsLineLengthStyleCalcNoSpace": "Contar todo menos espacios", + "CpsLineLengthStyleCalcCjk": "CJK 1, Latín 0.5", + "CpsLineLengthStyleCalcCjkNoSpace": "CJK 1, Latín 0.5, espacio 0", + "CpsLineLengthStyleCalcIncludeCompositionCharacters": "Incluir caracteres de composición", + "CpsLineLengthStyleCalcIncludeCompositionCharactersNotSpace": "Incluir caracteres composición, no espacios", + "CpsLineLengthStyleCalcNoSpaceOrPunctuation": "Sin espacios ni puntuación ()[]-:;,.!?", + "CpsLineLengthStyleCalcNoSpaceOrPunctuationCpsOnly": "Sin espacios ni puntuación, solo CPS", + "CpsLineLengthStyleCalcIgnoreArabicDiacritics": "Ignorar diacríticos árabes", + "CpsLineLengthStyleCalcIgnoreArabicDiacriticsNoSpace": "Ignorar diacríticos árabes, sin espacios", + "TimeCodeModeHhMmSsMs": "HH:MM:SS:MS", + "TimeCodeModeHhMmSsFf": "HH:MM:SS:FF", + "SplitBehaviorPrevious": "Hueco a la izq. de división (foco derecha)", + "SplitBehaviorHalf": "Hueco en centro de división (foco izquierda)", + "SplitBehaviorNext": "Hueco a la der. de división (foco izquierda)", + "SubtitleListActionNothing": "Nada", + "SubtitleListActionVideoGoToPositionAndPause": "Ir a pos. vídeo y pausar", + "SubtitleListActionVideoGoToPositionAndPlay": "Ir a pos. vídeo y reproducir", + "SubtitleListActionVideoGoToPositionAndPlayCurrentAndPause": "Ir a pos. vídeo, reprod. actual y pausar", + "SubtitleListActionEditText": "Ir a cuadro de edición", + "SubtitleListActionVideoGoToPositionMinus1SecAndPause": "Ir a pos. vídeo - 1 s y pausar", + "SubtitleListActionVideoGoToPositionMinusHalfSecAndPause": "Ir a pos. vídeo - 0.5 s y pausar", + "SubtitleListActionVideoGoToPositionMinus1SecAndPlay": "Ir a pos. vídeo - 1 s y reproducir", + "SubtitleListActionEditTextAndPause": "Ir a cuadro edición y pausar en pos. vídeo", + "AutoBackupEveryMinute": "Cada minuto", + "AutoBackupEveryXthMinute": "Cada {0} minutos", + "Profiles": "Perfiles", + "AutoBackupDeleteAfterXMonths": "Eliminar copias tras {0} meses", + "SearchSettingsDotDoDot": "Buscar en ajustes...", + "SyntaxColoring": "Coloreado de sintaxis", + "WaveformSpectrogram": "Forma de onda/espectrograma", + "Network": "Red", + "FileTypeAssociations": "Asociaciones de archivo", + "TextBoxColorTags": "Etiquetas color (HTML/ASSA) en cuadro de edición", + "TextBoxLiveSpellCheck": "Ortografía en vivo en cuadro de edición", + "TextBoxCenterText": "Centrar texto en cuadro de edición", + "TextBoxFontBold": "Negrita en cuadro de edición", + "TextBoxFontSize": "Tamaño fuente en cuadro de edición", + "SubtitleTextBoxAndGridFontName": "Fuente UI en cuadro de edición y lista", + "SubtitleGridFontSize": "Tamaño fuente en lista de subtítulos", + "SubtitleGridTextSingleLine": "Subtítulo en una sola línea en lista", + "SubtitleGridLiveSpellCheck": "Ortografía en vivo en lista", + "SubtitleGridShowFormatting": "Mostrar formato (HTML/ASSA) en lista", + "ShowUpDownStartTime": "Control arriba/abajo para \"Inicio\"", + "ShowUpDownEndTime": "Control arriba/abajo para \"Fin\"", + "ShowUpDownDuration": "Control arriba/abajo para \"Duración\"", + "ShowUpDownLabels": "Mostrar etiquetas en controles arriba/abajo", + "ShowButtonHints": "Mostrar sugerencias de botones", + "GridCompactMode": "Usar modo compacto en listas", + "UiFont": "Fuente de la interfaz", + "Theme": "Tema", + "IconTheme": "Tema de iconos", + "DarkThemeForegroundColor": "Color de frente (tema oscuro)", + "DarkThemeBackgroundColor": "Color de fondo (tema oscuro)", + "ShowGridLines": "Mostrar líneas de cuadrícula", + "ResetSettings": "¿Restablecer ajustes?", + "ResetSettingsDetail": "Se restablecerán todos los ajustes a sus valores por defecto.\n\n¿Continuar?", + "ShowHorizontalLineAboveToolbar": "Línea horizontal sobre barra herramientas", + "BookmarkColor": "Color de marcadores", + "SingleLineMaxLength": "Longitud máx. línea única", + "OptimalCharsPerSec": "CPS óptimos", + "MaxCharsPerSec": "CPS máximos", + "MaxWordsPerMin": "WPM máximos", + "MinDurationMs": "Duración mín. (ms)", + "MaxDurationMs": "Duración máx. (ms)", + "MinGapMs": "Espacio mín. (ms)", + "MaxLines": "Número máx. de líneas", + "UnbreakSubtitlesShortThan": "Unir subtítulos más cortos que", + "NewEmptyDefaultMs": "Duración predet. nuevo subtítulo (ms)", + "PromptBeforeDelete": "Preguntar antes de borrar", + "RememberPositionAndSize": "Recordar posición y tamaño de ventana", + "AutoBackupOn": "Copia seguridad automática", + "AutoBackupIntervalMinutes": "Intervalo copia seguridad (min)", + "AutoBackupDeleteAfterDays": "Días de retención de copias", + "AutoConvertToUtf8": "Auto-convertir a UTF-8 al abrir", + "AutoTrimWhiteSpace": "Auto-recortar espacios", + "DefaultEncoding": "Codificación predeterminada", + "ColorDurationTooShort": "Color duración si es muy corta", + "ColorDurationTooLong": "Color duración si es muy larga", + "ColorTextTooLong": "Color texto si es muy largo", + "ColorTextTooWide": "Color texto si es muy ancho (píxeles)", + "ColorTextTooManyLines": "Color texto si hay más de 2 líneas", + "ColorOverlap": "Color superposición tiempos", + "ColorGapTooShort": "Color si espacio es muy corto", + "ErrorBackgroundColor": "Color fondo error", + "WaveformDrawGridLines": "Dibujar líneas cuadrícula", + "WaveformCenterVideoPosition": "Centrar posición vídeo", + "WaveformShowToolbar": "Mostrar barra de herramientas", + "WaveformShowToolbarEdit": "Editar barra herramientas...", + "WaveformSpectrogramCombinedWaveformHeight": "Onda/espectro combinado, altura onda %", + "ShowWaveformToolbarPlay": "Barra: botón reproducir", + "ShowWaveformToolbarRepeat": "Barra: botón repetir", + "ShowWaveformToolbarRemoveBlankLines": "Barra: botón quitar líneas blanco", + "ShowWaveformToolbarNew": "Barra: botón nuevo subtítulo", + "ShowWaveformToolbarSetStart": "Barra: botón fijar inicio", + "ShowWaveformToolbarSetEnd": "Barra: botón fijar fin", + "ShowWaveformToolbarStartAndOffsetTheRest": "Barra: botón fijar inicio y desfasar resto", + "ShowWaveformToolbarHorizontalZoom": "Barra: deslizador zoom horizontal", + "ShowWaveformToolbarVerticalZoom": "Barra: deslizador zoom vertical", + "ShowWaveformToolbarVideoPositionSlider": "Barra: deslizador posición vídeo", + "ShowWaveformToolbarPlaybackSpeed": "Barra: velocidad reproducción", + "WaveformFocusTextboxAfterInsertNew": "Foco en cuadro texto tras insertar", + "WaveformInvertMouseWheel": "Invertir rueda ratón", + "WaveformSnapToShotChanges": "Ajustar a cambios de plano", + "WaveformShotChangesAutoGenerate": "Auto-generar cambios plano", + "WaveformTextFontSize": "Tamaño fuente texto en onda", + "WaveformTextFontBold": "Negrita texto en onda", + "WaveformTextColor": "Color texto en onda", + "WaveformColor": "Color de la forma de onda", + "WaveformBackgroundColor": "Color de fondo de onda", + "WaveformSelectedColor": "Color de onda seleccionada", + "DownloadFfmpeg": "Descargar ffmpeg", + "ShowToolbarNew": "Icono nuevo", + "ShowToolbarOpen": "Icono abrir", + "ShowToolbarVideoFileOpen": "Icono abrir vídeo", + "ShowToolbarSave": "Icono guardar", + "ShowToolbarSaveAs": "Icono guardar como", + "ShowToolbarFind": "Icono buscar", + "ShowToolbarReplace": "Icono reemplazar", + "ShowToolbarSpellCheck": "Icono ortografía", + "ShowToolbarFixCommonErrors": "Icono errores comunes", + "ShowToolbarSettings": "Icono ajustes", + "ShowToolbarLayout": "Icono diseño", + "ShowToolbarHelp": "Icono ayuda", + "ShowToolbarEncoding": "Mostrar codificación", + "ShowToolbarFrameRate": "Mostrar tasa fotogramas", + "ProxyAddress": "Dirección proxy", + "Username": "Usuario", + "Password": "Password", + "DefaultFormat": "Formato predeterminado", + "DefaultSaveAsFormat": "Formato predeterminado \"Guardar como\"", + "FavoriteSubtitleFormats": "Formatos favoritos", + "ShowStopButton": "Botón parar", + "ShowFullscreenButton": "Botón pantalla completa", + "AutoOpenVideoFile": "Abrir vídeo al abrir subtítulos", + "DownloadMpv": "Descargar mpv", + "DownloadVlc": "Descargar VLC", + "GoToLineNumberSetsVideoPosition": "Ir a línea también mueve vídeo", + "AdjustAllTimesRememberLineSelectionChoice": "Recordar elección selección líneas al ajustar tiempos", + "FilesAndLogs": "Archivos y registros", + "ShowErrorLogFile": "Ver archivo registro errores", + "ShowWhisperLogFile": "Ver archivo registro Whisper", + "ShowSettingsFile": "Ver archivo ajustes", + "ShowAssaLayer": "Mostrar cuadro capa ASSA", + "WaveformCursorColor": "Color cursor/cabezal onda", + "WaveformParagraphLeftColor": "Color borde izquierdo onda", + "WaveformParagraphRightColor": "Color borde derecho onda", + "WaveformFancyHighColor": "Color onda moderno (alto)", + "WaveformFocusOnMouseOver": "Foco al pasar ratón", + "ResetAllSettings": "Restablecer todos los ajustes", + "ResetShortcuts": "Restablecer atajos", + "ResetRecentFiles": "Restablecer recientes", + "ResetMultipleReplaceRules": "Restablecer reglas reemplazo", + "ResetAppearance": "Restablecer apariencia", + "ResetAutoTranslate": "Restablecer auto-traducción", + "ResetWindowPositionAndSize": "Restablecer posición ventana", + "ResetSettingsTitle": "Restablecer ajustes", + "OpenRuleFile": "Abrir archivo reglas", + "ExportProfiles": "Exportar perfiles", + "SaveRuleProfilesFile": "Guardar archivo perfiles reglas", + "RuleProfilesExportedX": "{0} perfiles exportados", + "RuleProfilesImportedX": "{0} perfiles importados", + "UseSpecialStyleAfterLongGaps": "Estilo especial tras espacios largos", + "AddSpace": "Añadir espacio", + "ProcessIfEndsWithComma": "Procesar si acaba en coma", + "RemoveComma": "Quitar coma", + "EditContinuationStyleCustom": "Editar estilo continuación personalizado", + "LongGapThreshold": "Umbral espacio largo (ms)", + "AfterLongGap": "Tras espacio largo:", + "ResetSyntaxColoring": "Restablecer color sintaxis", + "ResetWaveform": "Restablecer forma de onda", + "ResetRules": "Restablecer reglas", + "UseFrameMode": "Usar modo fotogramas (hh.mm.ss.ff)", + "TextBoxLimitNewLines": "Limitar saltos línea en cuadro texto", + "MpvVideoOutput": "Salida vídeo (mpv)", + "MpvOpenGl": "libmpv - OpenGL", + "MpvSoftwareRendering": "libmpv - Software (lento)", + "MpvWidRendering": "libmpv - Nativo Window ID (rápido en Win/Linux)", + "WaveFormsAndSpectrogramFoldersContainsX": "Carpetas de onda/espectro contienen {0}", + "DeleteWaveformAndSpectrogramFoldersQuestion": "¿Borrar archivos de onda y espectro?", + "WaveformGenerateSpectrogram": "Generar espectrograma", + "WaveformSpectrogramMode": "Modo espectrograma", + "WaveformCenterOnSingleClick": "Centrar con un clic", + "WaveformSingleClickSelectsSubtitle": "Clic selecciona subtítulo", + "WaveformRightClickSelectsSubtitle": "Clic derecho selecciona subtítulo", + "WaveformPauseOnSingleClick": "Clic pausa reproducción", + "WaveformDrawStyle": "Estilo dibujo onda", + "VlcWidRendering": "libVLC - Nativo Window ID", + "SubtitleSEnterKeyAction": "Acción tecla Enter en lista", + "SubtitleSingleClickAction": "Acción un clic en lista", + "SubtitleDoubleClickAction": "Acción doble clic en lista", + "SaveAsBehavior": "Comportamiento \"Guardar como\"", + "SaveAsAppendLanguageCode": "\"Guardar como\" añade código idioma", + "GridGoToSubtitleAndSetVideoPosition": "Ir a subtítulo y mover vídeo", + "GridGoToNextLine": "Ir a la siguiente línea", + "GridGoToSubtitleOnlyWaveformOnly": "Ir a subtítulo (solo onda)", + "GridGoToSubtitleAndPause": "Ir a subtítulo y pausar", + "GridGoToSubtitleAndPlay": "Ir a subtítulo y reproducir", + "GridGoToSubtitleAndPauseAndFocusTextBox": "Ir a sub, pausar y foco cuadro texto", + "SubtitleGridFormattingNone": "Sin formato", + "SubtitleGridFormattingShowFormatting": "Mostrar formato", + "SubtitleGridFormattingShowTags": "Mostrar etiquetas", + "WaveformParagraphBackgroundColor": "Color fondo subtítulo en onda", + "WaveformParagraphSelectedBackgroundColor": "Color fondo subtítulo seleccionado en onda", + "WaveformAllowOverlap": "Permitir superposición (mover/redimensionar)", + "SaveAsBehaviorUseSubtitleVideoFilename": "Nombre subtítulo/vídeo", + "SaveAsBehaviorUseVideoSubtitleFilename": "Nombre vídeo/subtítulo", + "SaveAsBehaviorUseVideoFileName": "Usar nombre de vídeo", + "SaveAsBehaviorUseSubtitleFileName": "Usar nombre de subtítulo", + "SaveAsAppendLanguageCodeTwoLetter": "Dos letras", + "SaveAsAppendLanguageCodeThreeLetter": "Tres letras", + "SaveAsAppendLanguageCodeLanguageName": "Nombre del idioma", + "SplitOddLineActionWeightTop": "Priorizar arriba", + "SplitOddLineActionWeightBottom": "Priorizar abajo", + "SplitOddLinesAction": "Acción dividir líneas impares", + "OcrUseWordSplitList": "OCR: usar lista división palabras", + "SpeechToTextSelectedLinesPromptFistTimeOnly": "Voz a texto: preguntar idioma solo primera vez", + "MultipleReplaceShowDotDotDotButtons": "Reemplazo múltiple: botones menú contexto", + "GridFocusTextboxAfterInsertNew": "Lista: foco en cuadro texto tras insertar", + "UseFocusedButtonBackgroundColor": "Usar color fondo en botón enfocado", + "FocusedButtonBackgroundColor": "Color fondo botón enfocado", + "ForceCrLfOnSave": "Forzar CR+LF al guardar", + "ShowWaveformToolbarPlayNext": "Barra: botón reprod. siguiente", + "ShowWaveformToolbarPlaySelection": "Barra: botón reprod. selección", + "TextBoxButtonShowAutoBreak": "C. texto: botón auto-división", + "TextBoxButtonShowUnbreak": "C. texto: botón unir", + "TextBoxButtonShowItalic": "C. texto: botón cursiva", + "TextBoxButtonShowColor": "C. texto: botón color", + "TextBoxButtonShowRemoveFormatting": "C. texto: botón quitar formato", + "WaveformSingleClickAction": "Acción un clic en onda", + "WaveformDoubleClickAction": "Acción doble clic en onda", + "AllSettings": "Todos los ajustes", + "UiScale": "Escala de la interfaz (%)", + "WaveformToolbarItems": "Elementos barra onda", + "MatchIconColorToDarkTheme": "Iconos acordes al tema oscuro", + "SubtitlePreviewProperties": "Propiedades vista previa", + "PixelWidthInfo": "Líneas verdes = límite de ancho máximo | \r\nÁrea roja = el texto excede el límite" }, - "shortcuts": { - "title": "Atajos de teclado", - "searchShortcuts": "Buscar atajos...", - "filter": "Filtro", - "categoryGeneral": "General", - "categorySubtitleGridAndTextBox": "Lista y cuadro texto", - "categorySubtitleGrid": "Lista subtítulos", - "categoryWaveform": "Forma de onda", - "generalMergeSelectedLines": "Combinar líneas seleccionadas", - "generalMergeWithPrevious": "Combinar con el anterior", - "generalMergeWithNext": "Combinar con el siguiente", - "generalMergeWithPreviousAndUnbreak": "Combinar con anterior y unir", - "generalMergeWithNextAndUnbreak": "Combinar con siguiente y unir", - "generalMergeWithPreviousAndAutoBreak": "Combinar con anterior y auto-dividir", - "generalMergeWithNextAndAutoBreak": "Combinar con siguiente y auto-dividir", - "generalMergeSelectedLinesAndAutoBreak": "Combinar seleccionados y auto-dividir", - "generalMergeSelectedLinesAndUnbreak": "Combinar seleccionados y unir", - "generalMergeSelectedLinesAndUnbreakCjk": "Combinar seleccionados y unir CJK", - "generalMergeSelectedLinesOnlyFirstText": "Combinar seleccionados (solo primer texto)", - "generalMergeSelectedLinesBilingual": "Combinar seleccionados bilingüe", - "generalMergeWithPreviousBilingual": "Combinar con anterior bilingüe", - "generalMergeWithNextBilingual": "Combinar con siguiente bilingüe", - "generalMergeOriginalAndTranslation": "Combinar original y traducción", - "generalToggleTranslationMode": "Alternar modo traducción", - "generalSwitchOriginalAndTranslation": "Intercambiar original y traducción", - "generalSwitchOriginalAndTranslationTextBoxes": "Intercambiar cuadros de texto original/trad.", - "generalChooseLayout": "Elegir diseño", - "generalLayoutChooseX": "Diseño {0}", - "generalPlayFirstSelected": "Reproducir primero seleccionado", - "generalGoToFirstSelectedLine": "Ir a primera línea seleccionada", - "generalGoToNextEmptyLine": "Ir a siguiente línea vacía", - "generalGoToNextSubtitle": "Ir al siguiente subtítulo", - "generalGoToNextSubtitlePlayTranslate": "Ir a sig. subtítulo (reprod. trad.)", - "generalGoToNextSubtitleCursorAtEnd": "Ir a sig. subtítulo (cursor al final)", - "generalGoToPrevSubtitle": "Ir al subtítulo anterior", - "generalGoToPrevSubtitlePlayTranslate": "Ir a ant. subtítulo (reprod. trad.)", - "generalGoToStartOfCurrentSubtitle": "Ir al inicio del subtítulo actual", - "generalGoToEndOfCurrentSubtitle": "Ir al fin del subtítulo actual", - "generalGoToPreviousSubtitleAndFocusVideo": "Ir a ant. subtítulo y foco vídeo", - "generalGoToNextSubtitleAndFocusVideo": "Ir a sig. subtítulo y foco vídeo", - "generalGoToPrevSubtitleAndPlay": "Ir a ant. subtítulo y reproducir", - "generalGoToNextSubtitleAndPlay": "Ir a sig. subtítulo y reproducir", - "generalGoToPreviousSubtitleAndFocusWaveform": "Ir a ant. subtítulo y foco onda", - "generalGoToNextSubtitleAndFocusWaveform": "Ir a sig. subtítulo y foco onda", - "generalGoToLineNumber": "Ir al número de línea", - "generalGoToVideoPosition": "Ir a la posición del vídeo", - "generalToggleItalic": "Alternar cursiva", - "generalToggleBold": "Alternar negrita", - "generalToggleBookmarks": "Alternar marcadores", - "generalFocusTextBox": "Enfocar cuadro de texto", - "generalToggleBookmarksWithText": "Alternar marcadores con texto", - "generalEditBookmarks": "Editar marcadores", - "fileNew": "Nuevo", - "fileOpen": "Abrir", - "fileOpenKeepVideo": "Abrir (mantener vídeo)", - "fileSave": "Guardar", - "fileSaveAs": "Guardar como", - "fileSaveAll": "Guardar todo", - "fileSaveOriginal": "Guardar original", - "fileSaveOriginalAs": "Guardar original como", - "fileOpenOriginalSubtitle": "Abrir subtítulo original", - "fileCloseOriginalSubtitle": "Cerrar subtítulo original", - "fileTranslatedSubtitle": "Subtítulo traducido", - "fileCompare": "Comparar", - "fileStatistics": "Estadísticas", - "fileImportPlainText": "Importar texto plano", - "fileImportBluRaySupForOcr": "Importar Blu-ray SUP para OCR", - "fileImportBluRaySupForEdit": "Importar Blu-ray SUP para editar", - "fileImportTimeCodes": "Importar códigos de tiempo", - "fileExportEbuStl": "Exportar EBU STL", - "fileExportPac": "Exportar PAC", - "fileExportEdlClipName": "Exportar nombre clip EDL", - "fileExportPlainText": "Exportar texto plano", - "fileExportCustomTextFormat1": "Exportar formato personal. 1", - "fileExportCustomTextFormat2": "Exportar formato personal. 2", - "fileExportCustomTextFormat3": "Exportar formato personal. 3", - "fileExit": "Salir", - "openSeDataFolder": "Abrir carpeta Subtitle Edit", - "editFind": "Buscar", - "editFindNext": "Buscar siguiente", - "editFindPrevious": "Buscar anterior", - "editReplace": "Reemplazar", - "editMultipleReplace": "Reemplazo múltiple", - "editModifySelection": "Modificar selección", - "listSelectAll": "Seleccionar todo", - "listSelectFirst": "Seleccionar primero", - "listSelectLast": "Seleccionar último", - "listInverseSelection": "Invertir selección", - "listDeleteSelection": "Eliminar selección", - "rippleDeleteSelection": "Eliminar selección (efecto rizo)", - "settings": "Ajustes", - "assigned": "Asignado", - "unassigned": "Sin asignar", - "pressedKeyX": "Tecla pulsada: {0}", - "pressAKey": "Pulse una tecla", - "detectKey": "Detectar tecla", - "control": "Control", - "alt": "Alt", - "win": "Win", - "shift": "Mayús", - "controlMac": "⌃", - "altMac": "⌥", - "winMac": "⌘", - "shiftMac": "⇧", - "resetShortcuts": "Restablecer atajos", - "resetShortcutsDetail": "¿Desea restablecer todos los atajos a sus valores por defecto?", - "togglePlayPause": "Alternar reprod./pausa", - "toggleLockTimeCodes": "Alternar bloqueo tiempos", - "duplicateSelectedLines": "Duplicar líneas seleccionadas", - "sourceView": "Vista de origen", - "showAlignmentPicker": "Alineación", - "addOrEditBookmark": "Añadir o editar marcador", - "listBookmarks": "Listar marcadores", - "toggleBookmark": "Alternar marcador (sin texto)", - "goToNextBookmark": "Ir al siguiente marcador", - "toggleWaveformToolbar": "Alternar barra herramientas onda", - "waveformSetStartAndSetEndOfPreviousMinusGap": "Fijar inicio y fin del anterior menos espacio", - "waveformSetEndAndStartOfNextAfterGap": "Fijar fin e inicio del siguiente más espacio", - "waveformSetEndAndStartOfNextAfterGapAndGoToNext": "Fijar fin, inicio del sig. e ir al siguiente", - "fetchFirstWordFromNextSubtitle": "Traer primera palabra del siguiente", - "moveLastWordToNextSubtitle": "Mover última palabra al siguiente", - "moveLastWordFromFirstLineDownCurrentSubtitle": "Bajar última palabra de la primera línea", - "moveFirstWordFromNextLineUpCurrentSubtitle": "Subir primera palabra de la segunda línea", - "toggleFocusGridAndWaveform": "Cambiar foco entre lista y onda", - "toggleFocusTextBoxAndWaveform": "Cambiar foco entre cuadro texto y onda", - "toggleFocusTextBoxAndGrid": "Cambiar foco entre cuadro texto y lista", - "goToPreviousLineAndSetVideoPosition": "Ir a línea anterior y mover vídeo", - "goToPreviousLineFromVideoPosition": "Ir a subtítulo anterior (desde pos. vídeo)", - "goToNextLineFromVideoPosition": "Ir a subtítulo siguiente (desde pos. vídeo)", - "goToNextLineAndSetVideoPosition": "Ir a línea siguiente y mover vídeo", - "textBoxDeleteSelectionNoClipboard": "Cuadro texto: Borrar sin copiar", - "textBoxCut": "Cuadro texto: Cortar", - "textBoxCut2": "Cuadro texto: Cortar (alt.)", - "textBoxPaste": "Cuadro texto: Pegar", - "textBoxCopy": "Cuadro texto: Copiar", - "textBoxSelectAll": "Cuadro texto: Seleccionar todo", - "subtitleGridCut": "Lista: Cortar", - "subtitleGridCopy": "Lista: Copiar", - "subtitleGridPaste": "Lista: Pegar", - "setShortcutForX": "Fijar atajo para \"{0}\"", - "commandFileNewKeepVideo": "Nuevo (mantener vídeo)", - "fileOpenOriginal": "Abrir original", - "fileCloseOriginal": "Cerrar original", - "restoreAutoBackup": "Restaurar copia seguridad", - "openContainingFolder": "Abrir carpeta contenedora", - "importTimeCodes": "Importar códigos tiempo", - "importSubtitleWithManuallyChosenEncoding": "Importar subtítulo con codificación manual", - "exportBluRaySup": "Exportar Blu-ray SUP", - "exportCustomTextFormat": "Exportar formato personal.", - "exportPlainText": "Exportar texto plano", - "showHistory": "Mostrar historial", - "toggleRightToLeft": "Alternar derecha a izquierda", - "modifySelection": "Modificar selección", - "adjustDurations": "Ajustar duraciones", - "applyDurationLimits": "Aplicar límites duración", - "batchConvert": "Conversión por lotes", - "bridgeGaps": "Unir espacios", - "applyMinGap": "Aplicar espacio mín.", - "fixCommonErrors": "Corregir errores comunes", - "makeEmptyTranslationFromCurrentSubtitle": "Vaciar traducción desde subtítulo actual", - "mergeLinesWithSameText": "Combinar líneas con mismo texto", - "mergeLinesWithSameTimeCodes": "Combinar con mismos códigos tiempo", - "splitBreakLongLines": "Dividir/reequilibrar líneas largas", - "mergeShortLines": "Combinar líneas cortas", - "removeTextForHearingImpaired": "Quitar texto defic. auditivos", - "joinSubtitles": "Unir subtítulos", - "splitSubtitle": "Dividir subtítulo", - "spellCheck": "Corrector ortográfico", - "spellCheckGetDictionary": "Obtener diccionario ortográfico", - "openVideo": "Abrir vídeo", - "openVideoFromUrl": "Abrir vídeo desde URL", - "closeVideo": "Cerrar vídeo", - "speechToText": "Voz a texto (Whisper)", - "textToSpeech": "Texto a voz", - "burnIn": "Incrustar subtítulos en vídeo", - "generateTransparent": "Generar vídeo transparente", - "undockVideoControls": "Desacoplar controles vídeo", - "redockVideoControls": "Reacoplar controles vídeo", - "generateBlankVideo": "Generar vídeo en blanco", - "reencodeVideo": "Recodificar vídeo", - "cutVideo": "Cortar vídeo", - "cutVideoSelectedLines": "Cortar vídeo (líneas sel.)", - "adjustAllTimes": "Ajustar todos los tiempos", - "visualSync": "Sincronización visual", - "translateViaCopyPaste": "Traducir vía copiar-pegar", - "shortcuts": "Atajos de teclado", - "wordLists": "Listas de palabras", - "chooseUiLanguage": "Elegir idioma interfaz", - "chooseRuleProfile": "Elegir perfil de reglas", - "videoFullScreen": "Vídeo pantalla completa", - "copyTextFromOriginalSelectedLines": "Copiar texto original (líneas sel.)", - "textBoxRemoveAllFormatting": "Cuadro texto: Quitar formato", - "textBoxItalic": "Cuadro texto: Cursiva", - "resetWaveformZoomAndSpeed": "Restablecer zoom y velocidad onda", - "togglePlaybackSpeed": "Alternar velocidad reproducción", - "playbackSpeedSlower": "Reproducción más lenta", - "playbackSpeedFaster": "Reproducción más rápida", - "switchOriginalAndTranslationSelectedLines": "Intercambiar original/trad. (líneas sel.)", - "mergeOriginalIntoTranslationSelectedLines": "Combinar original/trad. (líneas sel.)", - "seekSilence": "Buscar silencios", - "setVideoPositionCurrentSubtitleStart": "Ir al inicio de línea actual", - "setVideoPositionCurrentSubtitleEnd": "Ir al fin de línea actual", - "toggleAudioTracks": "Alternar pistas audio", - "listErrors": "Listar errores", - "goToNextError": "Ir al siguiente error", - "goToPreviousError": "Ir al anterior error", - "addNameToNameList": "Añadir nombre a la lista", - "findDoubleWords": "Buscar palabras dobles", - "findDoubleLines": "Buscar líneas dobles", - "colorX": "Color {0}", - "removeColor": "Quitar color", - "surroundWith": "Rodear con...", - "surroundWithXY": "Rodear con {0}/{1}", - "repeatLine": "Repetir línea", - "repeatPreviousLine": "Repetir línea anterior", - "repeatNextLine": "Repetir línea siguiente", - "moveVideoPositionMilliseconds": "Mover vídeo en milisegundos", - "importShortcutsTitle": "Importar atajos", - "exportShortcutsTitle": "Exportar atajos", - "xShortcutsImportedFromY": "{0} atajos importados de {1}", - "xShortcutsExportedToY": "{0} atajos exportados a {1}", - "importImageSubtitleForEdit": "Importar subtítulo imagen para editar", - "showPointSyncViaOther": "Mostrar sincro puntos vía otro", - "showPointSync": "Mostrar sincro por puntos", - "showMediaInformation": "Mostrar información del medio", - "chooseSubtitleFormat": "Elegir formato subtítulo", - "trimWhitespaceSelectedLines": "Quitar espacios (líneas sel.)", - "waveformHorizontalZoomInCommand": "Zoom horizontal onda +", - "waveformHorizontalZoomOutCommand": "Zoom horizontal onda -", - "waveformVerticalZoomInCommand": "Zoom vertical onda +", - "waveformVerticalZoomOutCommand": "Zoom vertical onda -", - "copySubtitlePathToClipboard": "Copiar ruta subtítulo", - "copySubtitleOriginalPathToClipboard": "Copiar ruta subtítulo original", - "focusTextBox": "Enfocar cuadro texto", - "sortByStartTime": "Ordenar por inicio", - "sortByEndTime": "Ordenar por fin", - "duplicatesFound": "Se encontraron los siguientes atajos duplicados:", - "copyTextToClipboard": "Copiar texto portapapeles (líneas sel.)", - "copyTextFromOriginalToClipboard": "Copiar texto original (líneas sel.)", - "assaDraw": "Dibujo ASSA", - "assaGenerateProgressBar": "Generar barra progreso ASSA", - "assaGenerateBackgroundBox": "Generar caja fondo ASSA", - "assaStyles": "Estilos ASSA", - "assaProperties": "Propiedades ASSA", - "assaAttachments": "Adjuntos ASSA", - "assaVideoColorPicker": "Selector color vídeo ASSA", - "recalculateDurationSelectedLines": "Recalcular duración (líneas sel.)", - "toggleWaveformAndSpectrogramHeight": "Alternar altura onda/espectro", - "toggleSpectrogramStyle": "Alternar estilo espectrograma", - "copyMsRelativeToCurrentSubtitleLineToClipboard": "Copiar ms relativos a la línea actual", - "layoutZoomIn": "Escalar interfaz +", - "layoutZoomOut": "Escalar interfaz -" + "Shortcuts": { + "Title": "Atajos de teclado", + "SearchShortcuts": "Buscar atajos...", + "Filter": "Filtro", + "CategoryGeneral": "General", + "CategorySubtitleGridAndTextBox": "Lista y cuadro texto", + "CategorySubtitleGrid": "Lista subtítulos", + "CategoryWaveform": "Forma de onda", + "GeneralMergeSelectedLines": "Combinar líneas seleccionadas", + "GeneralMergeWithPrevious": "Combinar con el anterior", + "GeneralMergeWithNext": "Combinar con el siguiente", + "GeneralMergeWithPreviousAndUnbreak": "Combinar con anterior y unir", + "GeneralMergeWithNextAndUnbreak": "Combinar con siguiente y unir", + "GeneralMergeWithPreviousAndAutoBreak": "Combinar con anterior y auto-dividir", + "GeneralMergeWithNextAndAutoBreak": "Combinar con siguiente y auto-dividir", + "GeneralMergeSelectedLinesAndAutoBreak": "Combinar seleccionados y auto-dividir", + "GeneralMergeSelectedLinesAndUnbreak": "Combinar seleccionados y unir", + "GeneralMergeSelectedLinesAndUnbreakCjk": "Combinar seleccionados y unir CJK", + "GeneralMergeSelectedLinesOnlyFirstText": "Combinar seleccionados (solo primer texto)", + "GeneralMergeSelectedLinesBilingual": "Combinar seleccionados bilingüe", + "GeneralMergeWithPreviousBilingual": "Combinar con anterior bilingüe", + "GeneralMergeWithNextBilingual": "Combinar con siguiente bilingüe", + "GeneralMergeOriginalAndTranslation": "Combinar original y traducción", + "GeneralToggleTranslationMode": "Alternar modo traducción", + "GeneralSwitchOriginalAndTranslation": "Intercambiar original y traducción", + "GeneralSwitchOriginalAndTranslationTextBoxes": "Intercambiar cuadros de texto original/trad.", + "GeneralChooseLayout": "Elegir diseño", + "GeneralLayoutChooseX": "Diseño {0}", + "GeneralPlayFirstSelected": "Reproducir primero seleccionado", + "GeneralGoToFirstSelectedLine": "Ir a primera línea seleccionada", + "GeneralGoToNextEmptyLine": "Ir a siguiente línea vacía", + "GeneralGoToNextSubtitle": "Ir al siguiente subtítulo", + "GeneralGoToNextSubtitlePlayTranslate": "Ir a sig. subtítulo (reprod. trad.)", + "GeneralGoToNextSubtitleCursorAtEnd": "Ir a sig. subtítulo (cursor al final)", + "GeneralGoToPrevSubtitle": "Ir al subtítulo anterior", + "GeneralGoToPrevSubtitlePlayTranslate": "Ir a ant. subtítulo (reprod. trad.)", + "GeneralGoToStartOfCurrentSubtitle": "Ir al inicio del subtítulo actual", + "GeneralGoToEndOfCurrentSubtitle": "Ir al fin del subtítulo actual", + "GeneralGoToPreviousSubtitleAndFocusVideo": "Ir a ant. subtítulo y foco vídeo", + "GeneralGoToNextSubtitleAndFocusVideo": "Ir a sig. subtítulo y foco vídeo", + "GeneralGoToPrevSubtitleAndPlay": "Ir a ant. subtítulo y reproducir", + "GeneralGoToNextSubtitleAndPlay": "Ir a sig. subtítulo y reproducir", + "GeneralGoToPreviousSubtitleAndFocusWaveform": "Ir a ant. subtítulo y foco onda", + "GeneralGoToNextSubtitleAndFocusWaveform": "Ir a sig. subtítulo y foco onda", + "GeneralGoToLineNumber": "Ir al número de línea", + "GeneralGoToVideoPosition": "Ir a la posición del vídeo", + "GeneralToggleItalic": "Alternar cursiva", + "GeneralToggleBold": "Alternar negrita", + "GeneralToggleBookmarks": "Alternar marcadores", + "GeneralFocusTextBox": "Enfocar cuadro de texto", + "GeneralToggleBookmarksWithText": "Alternar marcadores con texto", + "GeneralEditBookmarks": "Editar marcadores", + "FileNew": "Nuevo", + "FileOpen": "Abrir", + "FileOpenKeepVideo": "Abrir (mantener vídeo)", + "FileSave": "Guardar", + "FileSaveAs": "Guardar como", + "FileSaveAll": "Guardar todo", + "FileSaveOriginal": "Guardar original", + "FileSaveOriginalAs": "Guardar original como", + "FileOpenOriginalSubtitle": "Abrir subtítulo original", + "FileCloseOriginalSubtitle": "Cerrar subtítulo original", + "FileTranslatedSubtitle": "Subtítulo traducido", + "FileCompare": "Comparar", + "FileStatistics": "Estadísticas", + "FileImportPlainText": "Importar texto plano", + "FileImportBluRaySupForOcr": "Importar Blu-ray SUP para OCR", + "FileImportBluRaySupForEdit": "Importar Blu-ray SUP para editar", + "FileImportTimeCodes": "Importar códigos de tiempo", + "FileExportEbuStl": "Exportar EBU STL", + "FileExportPac": "Exportar PAC", + "FileExportEdlClipName": "Exportar nombre clip EDL", + "FileExportPlainText": "Exportar texto plano", + "FileExportCustomTextFormat1": "Exportar formato personal. 1", + "FileExportCustomTextFormat2": "Exportar formato personal. 2", + "FileExportCustomTextFormat3": "Exportar formato personal. 3", + "FileExit": "Salir", + "OpenSeDataFolder": "Abrir carpeta Subtitle Edit", + "EditFind": "Buscar", + "EditFindNext": "Buscar siguiente", + "EditFindPrevious": "Buscar anterior", + "EditReplace": "Reemplazar", + "EditMultipleReplace": "Reemplazo múltiple", + "EditModifySelection": "Modificar selección", + "ListSelectAll": "Seleccionar todo", + "ListSelectFirst": "Seleccionar primero", + "ListSelectLast": "Seleccionar último", + "ListInverseSelection": "Invertir selección", + "ListDeleteSelection": "Eliminar selección", + "RippleDeleteSelection": "Eliminar selección (efecto rizo)", + "Settings": "Ajustes", + "Assigned": "Asignado", + "Unassigned": "Sin asignar", + "PressedKeyX": "Tecla pulsada: {0}", + "PressAKey": "Pulse una tecla", + "DetectKey": "Detectar tecla", + "Control": "Control", + "Alt": "Alt", + "Win": "Win", + "Shift": "Mayús", + "ControlMac": "⌃", + "AltMac": "⌥", + "WinMac": "⌘", + "ShiftMac": "⇧", + "ResetShortcuts": "Restablecer atajos", + "ResetShortcutsDetail": "¿Desea restablecer todos los atajos a sus valores por defecto?", + "TogglePlayPause": "Alternar reprod./pausa", + "ToggleLockTimeCodes": "Alternar bloqueo tiempos", + "DuplicateSelectedLines": "Duplicar líneas seleccionadas", + "SourceView": "Vista de origen", + "ShowAlignmentPicker": "Alineación", + "AddOrEditBookmark": "Añadir o editar marcador", + "ListBookmarks": "Listar marcadores", + "ToggleBookmark": "Alternar marcador (sin texto)", + "GoToNextBookmark": "Ir al siguiente marcador", + "ToggleWaveformToolbar": "Alternar barra herramientas onda", + "WaveformSetStartAndSetEndOfPreviousMinusGap": "Fijar inicio y fin del anterior menos espacio", + "WaveformSetEndAndStartOfNextAfterGap": "Fijar fin e inicio del siguiente más espacio", + "WaveformSetEndAndStartOfNextAfterGapAndGoToNext": "Fijar fin, inicio del sig. e ir al siguiente", + "FetchFirstWordFromNextSubtitle": "Traer primera palabra del siguiente", + "MoveLastWordToNextSubtitle": "Mover última palabra al siguiente", + "MoveLastWordFromFirstLineDownCurrentSubtitle": "Bajar última palabra de la primera línea", + "MoveFirstWordFromNextLineUpCurrentSubtitle": "Subir primera palabra de la segunda línea", + "ToggleFocusGridAndWaveform": "Cambiar foco entre lista y onda", + "ToggleFocusTextBoxAndWaveform": "Cambiar foco entre cuadro texto y onda", + "ToggleFocusTextBoxAndGrid": "Cambiar foco entre cuadro texto y lista", + "GoToPreviousLineAndSetVideoPosition": "Ir a línea anterior y mover vídeo", + "GoToPreviousLineFromVideoPosition": "Ir a subtítulo anterior (desde pos. vídeo)", + "GoToNextLineFromVideoPosition": "Ir a subtítulo siguiente (desde pos. vídeo)", + "GoToNextLineAndSetVideoPosition": "Ir a línea siguiente y mover vídeo", + "TextBoxDeleteSelectionNoClipboard": "Cuadro texto: Borrar sin copiar", + "TextBoxCut": "Cuadro texto: Cortar", + "TextBoxCut2": "Cuadro texto: Cortar (alt.)", + "TextBoxPaste": "Cuadro texto: Pegar", + "TextBoxCopy": "Cuadro texto: Copiar", + "TextBoxSelectAll": "Cuadro texto: Seleccionar todo", + "SubtitleGridCut": "Lista: Cortar", + "SubtitleGridCopy": "Lista: Copiar", + "SubtitleGridPaste": "Lista: Pegar", + "SetShortcutForX": "Fijar atajo para \"{0}\"", + "CommandFileNewKeepVideo": "Nuevo (mantener vídeo)", + "FileOpenOriginal": "Abrir original", + "FileCloseOriginal": "Cerrar original", + "RestoreAutoBackup": "Restaurar copia seguridad", + "OpenContainingFolder": "Abrir carpeta contenedora", + "ImportTimeCodes": "Importar códigos tiempo", + "ImportSubtitleWithManuallyChosenEncoding": "Importar subtítulo con codificación manual", + "ExportBluRaySup": "Exportar Blu-ray SUP", + "ExportCustomTextFormat": "Exportar formato personal.", + "ExportPlainText": "Exportar texto plano", + "ShowHistory": "Mostrar historial", + "ToggleRightToLeft": "Alternar derecha a izquierda", + "ModifySelection": "Modificar selección", + "AdjustDurations": "Ajustar duraciones", + "ApplyDurationLimits": "Aplicar límites duración", + "BatchConvert": "Conversión por lotes", + "BridgeGaps": "Unir espacios", + "ApplyMinGap": "Aplicar espacio mín.", + "FixCommonErrors": "Corregir errores comunes", + "MakeEmptyTranslationFromCurrentSubtitle": "Vaciar traducción desde subtítulo actual", + "MergeLinesWithSameText": "Combinar líneas con mismo texto", + "MergeLinesWithSameTimeCodes": "Combinar con mismos códigos tiempo", + "SplitBreakLongLines": "Dividir/reequilibrar líneas largas", + "MergeShortLines": "Combinar líneas cortas", + "RemoveTextForHearingImpaired": "Quitar texto defic. auditivos", + "JoinSubtitles": "Unir subtítulos", + "SplitSubtitle": "Dividir subtítulo", + "SpellCheck": "Corrector ortográfico", + "SpellCheckGetDictionary": "Obtener diccionario ortográfico", + "OpenVideo": "Abrir vídeo", + "OpenVideoFromUrl": "Abrir vídeo desde URL", + "CloseVideo": "Cerrar vídeo", + "SpeechToText": "Voz a texto (Whisper)", + "TextToSpeech": "Texto a voz", + "BurnIn": "Incrustar subtítulos en vídeo", + "GenerateTransparent": "Generar vídeo transparente", + "UndockVideoControls": "Desacoplar controles vídeo", + "RedockVideoControls": "Reacoplar controles vídeo", + "GenerateBlankVideo": "Generar vídeo en blanco", + "ReencodeVideo": "Recodificar vídeo", + "CutVideo": "Cortar vídeo", + "CutVideoSelectedLines": "Cortar vídeo (líneas sel.)", + "AdjustAllTimes": "Ajustar todos los tiempos", + "VisualSync": "Sincronización visual", + "TranslateViaCopyPaste": "Traducir vía copiar-pegar", + "Shortcuts": "Atajos de teclado", + "WordLists": "Listas de palabras", + "ChooseUiLanguage": "Elegir idioma interfaz", + "ChooseRuleProfile": "Elegir perfil de reglas", + "VideoFullScreen": "Vídeo pantalla completa", + "CopyTextFromOriginalSelectedLines": "Copiar texto original (líneas sel.)", + "TextBoxRemoveAllFormatting": "Cuadro texto: Quitar formato", + "TextBoxItalic": "Cuadro texto: Cursiva", + "ResetWaveformZoomAndSpeed": "Restablecer zoom y velocidad onda", + "TogglePlaybackSpeed": "Alternar velocidad reproducción", + "PlaybackSpeedSlower": "Reproducción más lenta", + "PlaybackSpeedFaster": "Reproducción más rápida", + "SwitchOriginalAndTranslationSelectedLines": "Intercambiar original/trad. (líneas sel.)", + "MergeOriginalIntoTranslationSelectedLines": "Combinar original/trad. (líneas sel.)", + "SeekSilence": "Buscar silencios", + "SetVideoPositionCurrentSubtitleStart": "Ir al inicio de línea actual", + "SetVideoPositionCurrentSubtitleEnd": "Ir al fin de línea actual", + "ToggleAudioTracks": "Alternar pistas audio", + "ListErrors": "Listar errores", + "GoToNextError": "Ir al siguiente error", + "GoToPreviousError": "Ir al anterior error", + "AddNameToNameList": "Añadir nombre a la lista", + "FindDoubleWords": "Buscar palabras dobles", + "FindDoubleLines": "Buscar líneas dobles", + "ColorX": "Color {0}", + "RemoveColor": "Quitar color", + "SurroundWith": "Rodear con...", + "SurroundWithXY": "Rodear con {0}/{1}", + "RepeatLine": "Repetir línea", + "RepeatPreviousLine": "Repetir línea anterior", + "RepeatNextLine": "Repetir línea siguiente", + "MoveVideoPositionMilliseconds": "Mover vídeo en milisegundos", + "ImportShortcutsTitle": "Importar atajos", + "ExportShortcutsTitle": "Exportar atajos", + "XShortcutsImportedFromY": "{0} atajos importados de {1}", + "XShortcutsExportedToY": "{0} atajos exportados a {1}", + "ImportImageSubtitleForEdit": "Importar subtítulo imagen para editar", + "ShowPointSyncViaOther": "Mostrar sincro puntos vía otro", + "ShowPointSync": "Mostrar sincro por puntos", + "ShowMediaInformation": "Mostrar información del medio", + "ChooseSubtitleFormat": "Elegir formato subtítulo", + "TrimWhitespaceSelectedLines": "Quitar espacios (líneas sel.)", + "WaveformHorizontalZoomInCommand": "Zoom horizontal onda +", + "WaveformHorizontalZoomOutCommand": "Zoom horizontal onda -", + "WaveformVerticalZoomInCommand": "Zoom vertical onda +", + "WaveformVerticalZoomOutCommand": "Zoom vertical onda -", + "CopySubtitlePathToClipboard": "Copiar ruta subtítulo", + "CopySubtitleOriginalPathToClipboard": "Copiar ruta subtítulo original", + "FocusTextBox": "Enfocar cuadro texto", + "SortByStartTime": "Ordenar por inicio", + "SortByEndTime": "Ordenar por fin", + "DuplicatesFound": "Se encontraron los siguientes atajos duplicados:", + "CopyTextToClipboard": "Copiar texto portapapeles (líneas sel.)", + "CopyTextFromOriginalToClipboard": "Copiar texto original (líneas sel.)", + "AssaDraw": "Dibujo ASSA", + "AssaGenerateProgressBar": "Generar barra progreso ASSA", + "AssaGenerateBackgroundBox": "Generar caja fondo ASSA", + "AssaStyles": "Estilos ASSA", + "AssaProperties": "Propiedades ASSA", + "AssaAttachments": "Adjuntos ASSA", + "AssaVideoColorPicker": "Selector color vídeo ASSA", + "RecalculateDurationSelectedLines": "Recalcular duración (líneas sel.)", + "ToggleWaveformAndSpectrogramHeight": "Alternar altura onda/espectro", + "ToggleSpectrogramStyle": "Alternar estilo espectrograma", + "CopyMsRelativeToCurrentSubtitleLineToClipboard": "Copiar ms relativos a la línea actual", + "LayoutZoomIn": "Escalar interfaz +", + "LayoutZoomOut": "Escalar interfaz -" }, - "wordLists": { - "title": "Listas de palabras", - "addName": "Añadir nombre", - "addWord": "Añadir palabra", - "addPair": "Añadir par", - "nameAndIgnoreList": "Lista nombres/ignorar", - "userWords": "Lista palabras usuario", - "ocrFixList": "Lista corrección OCR", - "unableToAddItem": "¡No se pudo añadir; probablemente ya existe!", - "unableToRemoveItem": "¡No se pudo eliminar!" + "WordLists": { + "Title": "Listas de palabras", + "AddName": "Añadir nombre", + "AddWord": "Añadir palabra", + "AddPair": "Añadir par", + "NameAndIgnoreList": "Lista nombres/ignorar", + "UserWords": "Lista palabras usuario", + "OcrFixList": "Lista corrección OCR", + "UnableToAddItem": "¡No se pudo añadir; probablemente ya existe!", + "UnableToRemoveItem": "¡No se pudo eliminar!" }, - "chooseLanguage": { - "title": "Elegir idioma de la interfaz" + "ChooseLanguage": { + "Title": "Elegir idioma de la interfaz" } }, - "help": { - "aboutSubtitleEdit": "Acerca de Subtitle Edit", - "checkForUpdates": "Buscar actualizaciones", - "checkForUpdatesChecking": "Buscando actualizaciones...", - "checkForUpdatesUpToDate": "Está utilizando la última versión.", - "checkForUpdatesNewVersionAvailable": "Nueva versión disponible: {0}", - "checkForUpdatesUnableToCheck": "No se pudo buscar actualizaciones.", - "checkForUpdatesDownloadNewVersion": "Descargar nueva versión" + "Help": { + "AboutSubtitleEdit": "Acerca de Subtitle Edit", + "CheckForUpdates": "Buscar actualizaciones", + "CheckForUpdatesChecking": "Buscando actualizaciones...", + "CheckForUpdatesUpToDate": "Está utilizando la última versión.", + "CheckForUpdatesNewVersionAvailable": "Nueva versión disponible: {0}", + "CheckForUpdatesUnableToCheck": "No se pudo buscar actualizaciones.", + "CheckForUpdatesDownloadNewVersion": "Descargar nueva versión" }, - "ocr": { - "linesToDraw": "Líneas a dibujar", - "currentImage": "Imagen actual", - "autoDrawAgain": "Auto-dibujar de nuevo", - "startOcr": "Iniciar OCR", - "pauseOcr": "Pausar OCR", - "inspectLine": "Inspeccionar línea...", - "ocrEngine": "Motor OCR", - "database": "Base de datos", - "maxWrongPixels": "Máx. píxeles erróneos", - "maxErrorPct": "Máx. % error", - "numberOfPixelsIsSpace": "Nº píxeles es espacio", - "inspectImageMatches": "Inspeccionar coincidencias", - "resolutionXYAndTopmarginZ": "Res. {0}x{1}, margen sup. {2}", - "runningOcrDotDotDotXY": "Ejecutando OCR... {0}/{1}", - "runningOcrDotDotDot": "Ejecutando OCR...", - "autoSubmitFirstCharacter": "Enviar auto. primer carácter", - "editNOcrDatabase": "Editar base datos nOCR", - "zoomFactorX": "Factor zoom: {0}x", - "expandInfoX": "Cuenta expansión: {0}", - "editNOcrDatabaseXWithYItems": "Edición nOCR {0} con {1:#,###,##0} elementos", - "newNOcrDatabase": "Nueva base datos nOCR", - "renameNOcrDatabase": "Renombrar base datos nOCR", - "nOcrDatabase": "Base de datos nOCR", - "drawMode": "Modo dibujo:", - "addNewCharcter": "Añadir nuevo carácter", - "lineIndexX": "Línea {0}", - "inspectNOcrAdditions": "Inspeccionar adiciones nOCR", - "ocrSelectedLines": "OCR líneas seleccionadas", - "showImage": "Mostrar imagen", - "fixOcrErrors": "Corregir errores OCR", - "promptForUknownWords": "Preguntar palabras desconocidas", - "tryToGuessUnknownWords": "Intentar adivinar desconocidas", - "autoBreakIfMoreThanXLines": "Auto-dividir si hay más de {0} líneas", - "unknownWords": "Palabras desconocidas", - "allFixes": "Todas las correcciones", - "guessesUsed": "Adivinanzas usadas", - "ocr": "OCR", - "ocrX": "OCR - {0}", - "addBetterMatch": "Añadir mejor coincidencia", - "nOcrInspectImageMatches": "nOCR - Inspeccionar coincidencias", - "addToOcrPair": "Añadir a pares reemplazo OCR", - "addNameToOcrReplaceList": "Añadir nombre a lista reemplazo OCR", - "wordToAdd": "Palabra a añadir", - "nameToAdd": "Nombre a añadir", - "changeWordFromTo": "Cambiar palabra de/a", - "clearBackground": "Limpiar fondo", - "clearForeground": "Limpiar primer plano", - "nOcrDrawHelp": "Consejos para dibujar\r\n────────────────────\r\n• Ctrl para continuar línea\r\n• Ctrl+z=deshacer, Ctrl+y=rehacer", - "editWholeText": "Editar todo el texto", - "editWordOnly": "Editar solo palabra", - "imagePreProcessing": "Pre-procesamiento imagen", - "preProcessingTitle": "Pre-procesamiento", - "cropTransparent": "Recortar colores transparentes", - "inverseColors": "Invertir colores", - "removeBorders": "Quitar bordes", - "binarize": "Binarizar", - "borderSize": "Tamaño del borde", - "captureTopAlign": "Capturar alineación superior", - "ocrImage": "Imagen OCR", - "oneColor": "Un color (blanco)", - "darknessThreshold": "Umbral de oscuridad", - "editExportDotDotDot": "Editar/exportar...", - "editBinaryOcrDatabase": "Editar base datos \"Binary image compare\"", - "binaryImageCompareDatabase": "Base datos \"Binary image compare\"", - "removeXFromUnknownWordsList": "Quitar \"{0}\" de desconocidas", - "downloadingPaddleOcrEngineDotDotDot": "Descargando motor Paddle OCR...", - "downloadingPaddleOcrModelsDotDotDot": "Descargando modelos Paddle OCR...", - "paddleOcr": "Paddle OCR", - "binaryImageCompareInspectImageMatches": "\"Binary image compare\" - Inspeccionar" + "Ocr": { + "LinesToDraw": "Líneas a dibujar", + "CurrentImage": "Imagen actual", + "AutoDrawAgain": "Auto-dibujar de nuevo", + "StartOcr": "Iniciar OCR", + "PauseOcr": "Pausar OCR", + "InspectLine": "Inspeccionar línea...", + "OcrEngine": "Motor OCR", + "Database": "Base de datos", + "MaxWrongPixels": "Máx. píxeles erróneos", + "MaxErrorPct": "Máx. % error", + "NumberOfPixelsIsSpace": "Nº píxeles es espacio", + "InspectImageMatches": "Inspeccionar coincidencias", + "ResolutionXYAndTopmarginZ": "Res. {0}x{1}, margen sup. {2}", + "RunningOcrDotDotDotXY": "Ejecutando OCR... {0}/{1}", + "RunningOcrDotDotDot": "Ejecutando OCR...", + "AutoSubmitFirstCharacter": "Enviar auto. primer carácter", + "EditNOcrDatabase": "Editar base datos nOCR", + "ZoomFactorX": "Factor zoom: {0}x", + "ExpandInfoX": "Cuenta expansión: {0}", + "EditNOcrDatabaseXWithYItems": "Edición nOCR {0} con {1:#,###,##0} elementos", + "NewNOcrDatabase": "Nueva base datos nOCR", + "RenameNOcrDatabase": "Renombrar base datos nOCR", + "NOcrDatabase": "Base de datos nOCR", + "DrawMode": "Modo dibujo:", + "AddNewCharcter": "Añadir nuevo carácter", + "LineIndexX": "Línea {0}", + "InspectNOcrAdditions": "Inspeccionar adiciones nOCR", + "OcrSelectedLines": "OCR líneas seleccionadas", + "ShowImage": "Mostrar imagen", + "FixOcrErrors": "Corregir errores OCR", + "PromptForUknownWords": "Preguntar palabras desconocidas", + "TryToGuessUnknownWords": "Intentar adivinar desconocidas", + "AutoBreakIfMoreThanXLines": "Auto-dividir si hay más de {0} líneas", + "UnknownWords": "Palabras desconocidas", + "AllFixes": "Todas las correcciones", + "GuessesUsed": "Adivinanzas usadas", + "Ocr": "OCR", + "OcrX": "OCR - {0}", + "AddBetterMatch": "Añadir mejor coincidencia", + "NOcrInspectImageMatches": "nOCR - Inspeccionar coincidencias", + "AddToOcrPair": "Añadir a pares reemplazo OCR", + "AddNameToOcrReplaceList": "Añadir nombre a lista reemplazo OCR", + "WordToAdd": "Palabra a añadir", + "NameToAdd": "Nombre a añadir", + "ChangeWordFromTo": "Cambiar palabra de/a", + "ClearBackground": "Limpiar fondo", + "ClearForeground": "Limpiar primer plano", + "NOcrDrawHelp": "Consejos para dibujar\r\n────────────────────\r\n• Ctrl para continuar línea\r\n• Ctrl+z=deshacer, Ctrl+y=rehacer", + "EditWholeText": "Editar todo el texto", + "EditWordOnly": "Editar solo palabra", + "ImagePreProcessing": "Pre-procesamiento imagen", + "PreProcessingTitle": "Pre-procesamiento", + "CropTransparent": "Recortar colores transparentes", + "InverseColors": "Invertir colores", + "RemoveBorders": "Quitar bordes", + "Binarize": "Binarizar", + "BorderSize": "Tamaño del borde", + "CaptureTopAlign": "Capturar alineación superior", + "OcrImage": "Imagen OCR", + "OneColor": "Un color (blanco)", + "DarknessThreshold": "Umbral de oscuridad", + "EditExportDotDotDot": "Editar/exportar...", + "EditBinaryOcrDatabase": "Editar base datos \"Binary image compare\"", + "BinaryImageCompareDatabase": "Base datos \"Binary image compare\"", + "RemoveXFromUnknownWordsList": "Quitar \"{0}\" de desconocidas", + "DownloadingPaddleOcrEngineDotDotDot": "Descargando motor Paddle OCR...", + "DownloadingPaddleOcrModelsDotDotDot": "Descargando modelos Paddle OCR...", + "PaddleOcr": "Paddle OCR", + "BinaryImageCompareInspectImageMatches": "\"Binary image compare\" - Inspeccionar" }, - "assa": { - "assaDraw": "Dibujo ASSA", - "drawSelectTool": "Seleccionar (mover puntos)", - "drawLineTool": "Línea (F4)", - "drawBezierTool": "Curva Bézier (F5)", - "drawRectangleTool": "Rectángulo (F6)", - "drawCircleTool": "Círculo (F7)", - "drawCloseShape": "Cerrar forma (F8/Enter)", - "drawDeleteShape": "Borrar forma (Supr)", - "drawChangeLayer": "Cambiar capa", - "drawClearAll": "Limpiar todo (Ctrl+N)", - "drawZoomIn": "Zoom + (Ctrl++)", - "drawZoomOut": "Zoom - (Ctrl+-)", - "drawResetView": "Reset vista (Ctrl+0)", - "drawToggleGrid": "Cuadrícula (Ctrl+G)", - "drawCopyToClipboard": "Copiar (Ctrl+C)", - "drawShapes": "Formas", - "drawSelectedPoint": "Punto seleccionado", - "drawSelectedShape": "Forma seleccionada", - "drawSelectedLayer": "Capa seleccionada", - "drawToolX": "Herramienta: {0}", - "drawHelpText": "Clic para puntos • Enter/F8 cierra forma • Mayús+Arrastrar para desplazar • Ctrl+Rueda para zoom", - "progressBarTitle": "Barra de progreso ASSA", - "progressBarSettings": "Barra de progreso", - "progressBarPosition": "Posición", - "progressBarBottom": "Abajo", - "progressBarTop": "Arriba", - "progressBarForeColor": "Color de frente", - "progressBarBackColor": "Color de fondo", - "progressBarStyle": "Estilo", - "progressBarSquareCorners": "Esquinas cuadradas", - "progressBarRoundedCorners": "Esquinas redondeadas", - "progressBarChapters": "Capítulos", - "progressBarSplitterWidth": "Ancho del separador", - "progressBarSplitterHeight": "Alto del separador", - "progressBarXAdjustment": "Ajuste X", - "progressBarYAdjustment": "Ajuste Y", - "progressBarTextAlignment": "Alineación del texto", - "progressBarTakePosFromVideo": "Tomar posición del vídeo", - "progressBarPreview": "Vista previa", - "resolutionResamplerTitle": "Cambiar resolución", - "resolutionResamplerSourceRes": "Resolución origen", - "resolutionResamplerTargetRes": "Resolución destino", - "resolutionResamplerChangeMargins": "Cambiar márgenes", - "resolutionResamplerChangeFontSize": "Cambiar tamaño fuente", - "resolutionResamplerChangePositions": "Cambiar posiciones", - "resolutionResamplerChangeDrawing": "Cambiar dibujo", - "resolutionResamplerFromVideo": "Del vídeo...", - "resolutionResamplerSourceAndTargetEqual": "Origen y destino son iguales - nada que hacer.", - "resolutionResamplerNothingSelected": "Seleccione al menos una opción para cambiar.", - "backgroundBoxGenerator": "Generar caja de fondo", - "backgroundBoxPadding": "Relleno", - "backgroundBoxFillWidth": "Llenar ancho", - "backgroundBoxBoxColor": "Color caja", - "backgroundBoxRadius": "Radio", - "backgroundBoxCircle": "Círculo", - "backgroundBoxSpikes": "Puntas", - "backgroundBoxBubbles": "Burbujas", - "backgroundBoxWave": "Onda", - "backgroundBoxHexagon": "Hexágono", - "backgroundBoxTornPaper": "Papel rasgado", - "backgroundBoxCloud": "Nube", - "backgroundBoxTornPaperDouble": "Papel rasgado (sup e inf)", - "backgroundBoxStarburst": "Explosión estelar", - "backgroundBoxScroll": "Pergamino", - "stylesTitle": "Estilos Advanced Sub Station Alpha", - "stylesInFile": "Estilos en el archivo", - "stylesSaved": "Estilos guardados", - "stylesTitleX": "Estilos - {0}", - "propertiesTitleX": "Propiedades - {0}", - "attachmentsTitleX": "Adjuntos - {0}", - "smartWrappingTopWide": "0: Ajuste inteligente (superior ancho)", - "endOfLineWrapping": "1: Ajuste al final, solo breaks \\N", - "noWrapping": "2: Sin ajuste, breaks \\N y \\n", - "smartWrappingBottomWide": "3: Ajuste inteligente (inferior ancho)", - "fontsAndGraphics": "Fuentes y gráficos", - "wrapStyle": "Estilo de ajuste", - "borderAndShadowScaling": "Escala de borde y sombra", - "originalScript": "Guion original", - "graphics": "Gráficos", - "copyToStorageStyles": "Copiar a estilos de almacén", - "copyToFileStyles": "Copiar a estilos de archivo", - "setStyleAsDefault": "Estilo por defecto", - "takeUsagesFromDotDotDot": "Tomar usos de...", - "noAttachmentsFound": "No hay adjuntos en el archivo ASSA.", - "deleteStyleQuestion": "¿Borrar estilo?", - "deleteStylesQuestion": "¿Borrar estilos?", - "openStyleImportFile": "Abrir archivo para importar estilos", - "primary": "Primario", - "secondary": "Secundario", - "applyOverrideTags": "Aplicar etiquetas anulación", - "chooseOverrideTagToAdd": "Elegir etiqueta a añadir", - "fontSizeChange": "Cambio tamaño fuente", - "moveTextFromLeftToRight": "Mover de izq. a der.", - "colorFromWhiteToRed": "Color blanco a rojo", - "rotateXSlow": "Rotar X (lento)", - "rotateX": "Rotar X", - "rotateY": "Rotar Y", - "rotateTilt": "Rotar inclinación", - "spaceIncrease": "Aumento espacio", - "popIn": "Aparición (pop in)", - "spinIn": "Giro (spin in)", - "playCurrent": "Reprod. actual", - "setPosition": "Fijar posición", - "imageColorPicker": "Selector color imagen", - "copyColorAsHextoClipboard": "Copiar color hex", - "generatingBackgroundBoxXOfY": "Generando caja fondo {0} de {1}...", - "applyAdvancedEffectTitle": "Aplicar efecto avanzado", - "chooseEffect": "Elegir efecto", - "advancedEffectTypewriter": "Máquina de escribir", - "advancedEffectTypewriterDescription": "Revela el texto carácter a carácter", - "advancedEffectTypewriterWithHighlight": "Máquina escribir con resaltado", - "advancedEffectTypewriterWithHighlightDescription": "Carácter a carácter con brillo en el actual", - "advancedEffectWordByWord": "Palabra por palabra", - "advancedEffectWordByWordDescription": "Revela el texto palabra a palabra", - "advancedEffectKaraoke": "Karaoke", - "advancedEffectKaraokeDescription": "Resalta cada carácter de izquierda a derecha", - "advancedEffectFancyKaraoke": "Karaoke - pop palabra activa", - "advancedEffectFancyKaraokeDescription": "Atenúa inactivas y aplica brillo/animación a la activa (vía \\u1)", - "advancedEffectScrambleReveal": "Revelación revuelta", - "advancedEffectScrambleRevealDescription": "Caracteres aleatorios que se descifran de izq a der", - "advancedEffectRainbowPulse": "Pulso arcoíris", - "advancedEffectRainbowPulseDescription": "Cada carácter cicla colores independientemente", - "advancedEffectWave": "Onda", - "advancedEffectWaveDescription": "Efecto de onda senoidal arriba y abajo", - "advancedEffectWaveBlue": "Onda (azul)", - "advancedEffectWaveBlueDescription": "Onda con animación en azul y cian", - "advancedEffectStarWarsScroll": "Créditos Star Wars", - "advancedEffectStarWarsScrollDescription": "Texto con perspectiva inclinada hacia arriba", - "advancedEffectEndCreditsScroll": "Créditos scroll", - "advancedEffectEndCreditsScrollDescription": "Scroll continuo hacia arriba para créditos finales", - "advancedEffectStarfield": "Campo de estrellas (fondo)", - "advancedEffectStarfieldDescription": "Efecto de viaje hiperespacial", - "advancedEffectRain": "Lluvia infinita (fondo)", - "advancedEffectRainDescription": "Efecto lluvia con capas de profundidad", - "advancedEffectSnow": "Nieve infinita (fondo)", - "advancedEffectSnowDescription": "Nevada continua con capas", - "advancedEffectOldMovie": "Cine antiguo (fondo)", - "advancedEffectOldMovieDescription": "Simula proyector de 35mm con ruido y rayas", - "advancedEffectNeonBurst": "Explosión neón", - "advancedEffectNeonBurstDescription": "Subtítulos estilo 'Shorts' con brillo neón y escala", - "advancedEffectSettings": "Ajustes", - "advancedEffectSnowFlakeCount": "Cantidad de copos", - "advancedEffectStarfieldStarCount": "Cantidad de estrellas", - "advancedEffectStarfieldSpeed": "Velocidad", - "advancedEffectGlitch": "Glitch", - "advancedEffectGlitchDescription": "Fallo digital con aberración cromática y distorsión", - "advancedEffectBounceIn": "Rebote", - "advancedEffectBounceInDescription": "Caracteres que entran rebotando elásticamente", - "advancedEffectFireflies": "Luciérnagas (fondo)", - "advancedEffectFirefliesDescription": "Puntos ámbar brillantes que flotan orgánicamente", - "advancedEffectMatrix": "Matrix", - "advancedEffectMatrixDescription": "Columnas de caracteres verdes cayendo", - "advancedEffectAudioBars": "Barras de audio (onda)", - "advancedEffectAudioBarsDescription": "Ecualizador animado por el audio", - "advancedEffectAudioPulse": "Pulso de texto por audio", - "advancedEffectAudioPulseDescription": "El texto brilla y crece según el volumen del audio", - "advancedEffectConfetti": "Explosión de confeti", - "advancedEffectConfettiDescription": "Lluvia de papeles de colores desde esquinas y centro", - "advancedEffectHearts": "Corazones (lluvia)", - "advancedEffectHeartsDescription": "Corazones Bézier que caen suavemente", - "advancedEffectWordSpacing": "Espaciado de palabras", - "advancedEffectWordSpacingDescription": "Aumenta espacio entre palabras mediante etiqueta \\fsp", - "advancedEffectFancyKaraokeAutoDetectActiveWord": "Auto-detectar palabra activa", - "advancedEffectFancyKaraokeGlow": "Brillo palabra activa", - "advancedEffectFancyKaraokeActiveColor": "Color activo", - "advancedEffectFancyKaraokeInactiveColor": "Color inactivo", - "advancedEffectFancyKaraokeInactiveOpacity": "Opacidad inactiva (0-255)", - "advancedEffectWordSpacingPixels": "Espaciado (píxeles)", - "advancedEffectSlowZoomOut": "Zoom out lento", - "advancedEffectSlowZoomOutDescription": "El texto encoge ligeramente durante el subtítulo", - "advancedEffectSlowZoomIn": "Zoom in lento", - "advancedEffectSlowZoomInDescription": "El texto crece ligeramente durante el subtítulo", - "advancedEffectFadeIn": "Transición - Fundido entrada", - "advancedEffectFadeInDescription": "Vídeo aparece desde negro línea a línea", - "advancedEffectFadeOut": "Transición - Fundido salida", - "advancedEffectFadeOutDescription": "Vídeo termina en negro línea a línea", - "advancedEffectTvClose": "Transición - Cierre TV", - "advancedEffectTvCloseDescription": "Barras negras que cierran hacia el centro", - "advancedEffectSlideInLeft": "Deslizar desde izquierda", - "advancedEffectSlideInLeftDescription": "Entra por la izquierda y sale por la izquierda", - "advancedEffectSlideInRight": "Deslizar desde derecha", - "advancedEffectSlideInRightDescription": "Entra por la derecha y sale por la derecha", - "advancedEffectFadeInOut": "Fundido entrada/salida", - "advancedEffectFadeInOutDescription": "Texto aparece y desaparece suavemente", - "overrideTagsHistory": "Historial etiquetas anulación" + "Assa": { + "AssaDraw": "Dibujo ASSA", + "DrawSelectTool": "Seleccionar (mover puntos)", + "DrawLineTool": "Línea (F4)", + "DrawBezierTool": "Curva Bézier (F5)", + "DrawRectangleTool": "Rectángulo (F6)", + "DrawCircleTool": "Círculo (F7)", + "DrawCloseShape": "Cerrar forma (F8/Enter)", + "DrawDeleteShape": "Borrar forma (Supr)", + "DrawChangeLayer": "Cambiar capa", + "DrawClearAll": "Limpiar todo (Ctrl+N)", + "DrawZoomIn": "Zoom + (Ctrl++)", + "DrawZoomOut": "Zoom - (Ctrl+-)", + "DrawResetView": "Reset vista (Ctrl+0)", + "DrawToggleGrid": "Cuadrícula (Ctrl+G)", + "DrawCopyToClipboard": "Copiar (Ctrl+C)", + "DrawShapes": "Formas", + "DrawSelectedPoint": "Punto seleccionado", + "DrawSelectedShape": "Forma seleccionada", + "DrawSelectedLayer": "Capa seleccionada", + "DrawToolX": "Herramienta: {0}", + "DrawHelpText": "Clic para puntos • Enter/F8 cierra forma • Mayús+Arrastrar para desplazar • Ctrl+Rueda para zoom", + "ProgressBarTitle": "Barra de progreso ASSA", + "ProgressBarSettings": "Barra de progreso", + "ProgressBarPosition": "Posición", + "ProgressBarBottom": "Abajo", + "ProgressBarTop": "Arriba", + "ProgressBarForeColor": "Color de frente", + "ProgressBarBackColor": "Color de fondo", + "ProgressBarStyle": "Estilo", + "ProgressBarSquareCorners": "Esquinas cuadradas", + "ProgressBarRoundedCorners": "Esquinas redondeadas", + "ProgressBarChapters": "Capítulos", + "ProgressBarSplitterWidth": "Ancho del separador", + "ProgressBarSplitterHeight": "Alto del separador", + "ProgressBarXAdjustment": "Ajuste X", + "ProgressBarYAdjustment": "Ajuste Y", + "ProgressBarTextAlignment": "Alineación del texto", + "ProgressBarTakePosFromVideo": "Tomar posición del vídeo", + "ProgressBarPreview": "Vista previa", + "ResolutionResamplerTitle": "Cambiar resolución", + "ResolutionResamplerSourceRes": "Resolución origen", + "ResolutionResamplerTargetRes": "Resolución destino", + "ResolutionResamplerChangeMargins": "Cambiar márgenes", + "ResolutionResamplerChangeFontSize": "Cambiar tamaño fuente", + "ResolutionResamplerChangePositions": "Cambiar posiciones", + "ResolutionResamplerChangeDrawing": "Cambiar dibujo", + "ResolutionResamplerFromVideo": "Del vídeo...", + "ResolutionResamplerSourceAndTargetEqual": "Origen y destino son iguales - nada que hacer.", + "ResolutionResamplerNothingSelected": "Seleccione al menos una opción para cambiar.", + "BackgroundBoxGenerator": "Generar caja de fondo", + "BackgroundBoxPadding": "Relleno", + "BackgroundBoxFillWidth": "Llenar ancho", + "BackgroundBoxBoxColor": "Color caja", + "BackgroundBoxRadius": "Radio", + "BackgroundBoxCircle": "Círculo", + "BackgroundBoxSpikes": "Puntas", + "BackgroundBoxBubbles": "Burbujas", + "BackgroundBoxWave": "Onda", + "BackgroundBoxHexagon": "Hexágono", + "BackgroundBoxTornPaper": "Papel rasgado", + "BackgroundBoxCloud": "Nube", + "BackgroundBoxTornPaperDouble": "Papel rasgado (sup e inf)", + "BackgroundBoxStarburst": "Explosión estelar", + "BackgroundBoxScroll": "Pergamino", + "StylesTitle": "Estilos Advanced Sub Station Alpha", + "StylesInFile": "Estilos en el archivo", + "StylesSaved": "Estilos guardados", + "StylesTitleX": "Estilos - {0}", + "PropertiesTitleX": "Propiedades - {0}", + "AttachmentsTitleX": "Adjuntos - {0}", + "SmartWrappingTopWide": "0: Ajuste inteligente (superior ancho)", + "EndOfLineWrapping": "1: Ajuste al final, solo breaks \\N", + "NoWrapping": "2: Sin ajuste, breaks \\N y \\n", + "SmartWrappingBottomWide": "3: Ajuste inteligente (inferior ancho)", + "FontsAndGraphics": "Fuentes y gráficos", + "WrapStyle": "Estilo de ajuste", + "BorderAndShadowScaling": "Escala de borde y sombra", + "OriginalScript": "Guion original", + "Graphics": "Gráficos", + "CopyToStorageStyles": "Copiar a estilos de almacén", + "CopyToFileStyles": "Copiar a estilos de archivo", + "SetStyleAsDefault": "Estilo por defecto", + "TakeUsagesFromDotDotDot": "Tomar usos de...", + "NoAttachmentsFound": "No hay adjuntos en el archivo ASSA.", + "DeleteStyleQuestion": "¿Borrar estilo?", + "DeleteStylesQuestion": "¿Borrar estilos?", + "OpenStyleImportFile": "Abrir archivo para importar estilos", + "Primary": "Primario", + "Secondary": "Secundario", + "ApplyOverrideTags": "Aplicar etiquetas anulación", + "ChooseOverrideTagToAdd": "Elegir etiqueta a añadir", + "FontSizeChange": "Cambio tamaño fuente", + "MoveTextFromLeftToRight": "Mover de izq. a der.", + "ColorFromWhiteToRed": "Color blanco a rojo", + "RotateXSlow": "Rotar X (lento)", + "RotateX": "Rotar X", + "RotateY": "Rotar Y", + "RotateTilt": "Rotar inclinación", + "SpaceIncrease": "Aumento espacio", + "PopIn": "Aparición (pop in)", + "SpinIn": "Giro (spin in)", + "PlayCurrent": "Reprod. actual", + "SetPosition": "Fijar posición", + "ImageColorPicker": "Selector color imagen", + "CopyColorAsHextoClipboard": "Copiar color hex", + "GeneratingBackgroundBoxXOfY": "Generando caja fondo {0} de {1}...", + "ApplyAdvancedEffectTitle": "Aplicar efecto avanzado", + "ChooseEffect": "Elegir efecto", + "AdvancedEffectTypewriter": "Máquina de escribir", + "AdvancedEffectTypewriterDescription": "Revela el texto carácter a carácter", + "AdvancedEffectTypewriterWithHighlight": "Máquina escribir con resaltado", + "AdvancedEffectTypewriterWithHighlightDescription": "Carácter a carácter con brillo en el actual", + "AdvancedEffectWordByWord": "Palabra por palabra", + "AdvancedEffectWordByWordDescription": "Revela el texto palabra a palabra", + "AdvancedEffectKaraoke": "Karaoke", + "AdvancedEffectKaraokeDescription": "Resalta cada carácter de izquierda a derecha", + "AdvancedEffectFancyKaraoke": "Karaoke - pop palabra activa", + "AdvancedEffectFancyKaraokeDescription": "Atenúa inactivas y aplica brillo/animación a la activa (vía \\u1)", + "AdvancedEffectScrambleReveal": "Revelación revuelta", + "AdvancedEffectScrambleRevealDescription": "Caracteres aleatorios que se descifran de izq a der", + "AdvancedEffectRainbowPulse": "Pulso arcoíris", + "AdvancedEffectRainbowPulseDescription": "Cada carácter cicla colores independientemente", + "AdvancedEffectWave": "Onda", + "AdvancedEffectWaveDescription": "Efecto de onda senoidal arriba y abajo", + "AdvancedEffectWaveBlue": "Onda (azul)", + "AdvancedEffectWaveBlueDescription": "Onda con animación en azul y cian", + "AdvancedEffectStarWarsScroll": "Créditos Star Wars", + "AdvancedEffectStarWarsScrollDescription": "Texto con perspectiva inclinada hacia arriba", + "AdvancedEffectEndCreditsScroll": "Créditos scroll", + "AdvancedEffectEndCreditsScrollDescription": "Scroll continuo hacia arriba para créditos finales", + "AdvancedEffectStarfield": "Campo de estrellas (fondo)", + "AdvancedEffectStarfieldDescription": "Efecto de viaje hiperespacial", + "AdvancedEffectRain": "Lluvia infinita (fondo)", + "AdvancedEffectRainDescription": "Efecto lluvia con capas de profundidad", + "AdvancedEffectSnow": "Nieve infinita (fondo)", + "AdvancedEffectSnowDescription": "Nevada continua con capas", + "AdvancedEffectOldMovie": "Cine antiguo (fondo)", + "AdvancedEffectOldMovieDescription": "Simula proyector de 35mm con ruido y rayas", + "AdvancedEffectNeonBurst": "Explosión neón", + "AdvancedEffectNeonBurstDescription": "Subtítulos estilo 'Shorts' con brillo neón y escala", + "AdvancedEffectSettings": "Ajustes", + "AdvancedEffectSnowFlakeCount": "Cantidad de copos", + "AdvancedEffectStarfieldStarCount": "Cantidad de estrellas", + "AdvancedEffectStarfieldSpeed": "Velocidad", + "AdvancedEffectGlitch": "Glitch", + "AdvancedEffectGlitchDescription": "Fallo digital con aberración cromática y distorsión", + "AdvancedEffectBounceIn": "Rebote", + "AdvancedEffectBounceInDescription": "Caracteres que entran rebotando elásticamente", + "AdvancedEffectFireflies": "Luciérnagas (fondo)", + "AdvancedEffectFirefliesDescription": "Puntos ámbar brillantes que flotan orgánicamente", + "AdvancedEffectMatrix": "Matrix", + "AdvancedEffectMatrixDescription": "Columnas de caracteres verdes cayendo", + "AdvancedEffectAudioBars": "Barras de audio (onda)", + "AdvancedEffectAudioBarsDescription": "Ecualizador animado por el audio", + "AdvancedEffectAudioPulse": "Pulso de texto por audio", + "AdvancedEffectAudioPulseDescription": "El texto brilla y crece según el volumen del audio", + "AdvancedEffectConfetti": "Explosión de confeti", + "AdvancedEffectConfettiDescription": "Lluvia de papeles de colores desde esquinas y centro", + "AdvancedEffectHearts": "Corazones (lluvia)", + "AdvancedEffectHeartsDescription": "Corazones Bézier que caen suavemente", + "AdvancedEffectWordSpacing": "Espaciado de palabras", + "AdvancedEffectWordSpacingDescription": "Aumenta espacio entre palabras mediante etiqueta \\fsp", + "AdvancedEffectFancyKaraokeAutoDetectActiveWord": "Auto-detectar palabra activa", + "AdvancedEffectFancyKaraokeGlow": "Brillo palabra activa", + "AdvancedEffectFancyKaraokeActiveColor": "Color activo", + "AdvancedEffectFancyKaraokeInactiveColor": "Color inactivo", + "AdvancedEffectFancyKaraokeInactiveOpacity": "Opacidad inactiva (0-255)", + "AdvancedEffectWordSpacingPixels": "Espaciado (píxeles)", + "AdvancedEffectSlowZoomOut": "Zoom out lento", + "AdvancedEffectSlowZoomOutDescription": "El texto encoge ligeramente durante el subtítulo", + "AdvancedEffectSlowZoomIn": "Zoom in lento", + "AdvancedEffectSlowZoomInDescription": "El texto crece ligeramente durante el subtítulo", + "AdvancedEffectFadeIn": "Transición - Fundido entrada", + "AdvancedEffectFadeInDescription": "Vídeo aparece desde negro línea a línea", + "AdvancedEffectFadeOut": "Transición - Fundido salida", + "AdvancedEffectFadeOutDescription": "Vídeo termina en negro línea a línea", + "AdvancedEffectTvClose": "Transición - Cierre TV", + "AdvancedEffectTvCloseDescription": "Barras negras que cierran hacia el centro", + "AdvancedEffectSlideInLeft": "Deslizar desde izquierda", + "AdvancedEffectSlideInLeftDescription": "Entra por la izquierda y sale por la izquierda", + "AdvancedEffectSlideInRight": "Deslizar desde derecha", + "AdvancedEffectSlideInRightDescription": "Entra por la derecha y sale por la derecha", + "AdvancedEffectFadeInOut": "Fundido entrada/salida", + "AdvancedEffectFadeInOutDescription": "Texto aparece y desaparece suavemente", + "OverrideTagsHistory": "Historial etiquetas anulación" }, - "about": { - "title": "Acerca de Subtite Edit", - "translatedBy": "Traducido por: {0}", - "licenseText": "Subtitle Edit es software libre bajo la licencia MIT.", - "descriptionTextBeta": "Subtitle Edit 5 beta es una versión de desarrollo de nuestra próxima gran versión.\nEstamos refinando activamente las herramientas y agradecemos tu ayuda en las pruebas.\nPor favor, comparte tus comentarios para ayudarnos a asegurar la mejor versión final.\n\n¡Gracias por ser parte de la comunidad de Subtitle Edit! :)", - "issueTrackingAndSourceCode": "Seguimiento de problemas y código fuente: ", - "gitHub": "Github", - "donate": "Donar: ", - "payPal": "PayPal", - "gitHubSponsor": "Github sponsor", - "or": " o " + "About": { + "Title": "Acerca de Subtite Edit", + "TranslatedBy": "Traducido por: {0}", + "LicenseText": "Subtitle Edit es software libre bajo la licencia MIT.", + "DescriptionTextBeta": "Subtitle Edit 5 beta es una versión de desarrollo de nuestra próxima gran versión.\nEstamos refinando activamente las herramientas y agradecemos tu ayuda en las pruebas.\nPor favor, comparte tus comentarios para ayudarnos a asegurar la mejor versión final.\n\n¡Gracias por ser parte de la comunidad de Subtitle Edit! :)", + "IssueTrackingAndSourceCode": "Seguimiento de problemas y código fuente: ", + "GitHub": "Github", + "Donate": "Donar: ", + "PayPal": "PayPal", + "GitHubSponsor": "Github sponsor", + "Or": " o " } -} +} \ No newline at end of file diff --git a/src/UI/UI.csproj b/src/UI/UI.csproj index 34fe07f800a..934302d9c10 100644 --- a/src/UI/UI.csproj +++ b/src/UI/UI.csproj @@ -73,10 +73,13 @@ + + + @@ -102,10 +105,13 @@ + + + From 58c2d9c3f3124994a6b771b9a77b39df6490553d Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Mon, 6 Apr 2026 19:31:57 +0200 Subject: [PATCH 35/74] Work on https://github.com/SubtitleEdit/subtitleedit/discussions/10545#discussioncomment-16465746 --- .../Features/SpellCheck/SpellCheckManager.cs | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/UI/Features/SpellCheck/SpellCheckManager.cs b/src/UI/Features/SpellCheck/SpellCheckManager.cs index 8ae5c5650e0..9f32a96fa26 100644 --- a/src/UI/Features/SpellCheck/SpellCheckManager.cs +++ b/src/UI/Features/SpellCheck/SpellCheckManager.cs @@ -17,6 +17,7 @@ public class SpellCheckManager : ISpellCheckManager, IDoSpell public event SpellCheckWordChangedHandler? OnWordChanged; public int NoOfChangedWords { get; set; } public int NoOfSkippedWords { get; set; } + public WordSpellCheck? WordSpellChecker { get; set; } private static readonly Regex EmailRegex = new(@"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", RegexOptions.Compiled); private static readonly Regex UrlRegex = new(@"^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$", RegexOptions.Compiled | RegexOptions.IgnoreCase); @@ -144,6 +145,11 @@ public List CheckSpelling(ObservableCollection GetSuggestions(string word) { + if (WordSpellChecker != null) + { + return WordSpellChecker.GetSuggestions(word); + } + if (_hunspellWeCantSpell == null) { return new List(); @@ -245,6 +251,11 @@ public void AdToUserDictionary(string word) public bool IsWordCorrect(string word) { + if (WordSpellChecker != null) + { + return WordSpellChecker.DoSpell(word); + } + return _hunspellWeCantSpell != null && _hunspellWeCantSpell.Check(word); } @@ -284,17 +295,18 @@ public bool IsWordCorrect(SpellCheckWord spellCheckWord, string text) return true; } - var isCorrect = false; - if (_hunspellWeCantSpell != null) - { - isCorrect = _hunspellWeCantSpell.Check(word); - } + var isCorrect = DoSpell(word); return isCorrect; } public bool DoSpell(string word) { + if (WordSpellChecker != null) + { + return WordSpellChecker.DoSpell(word); + } + return _hunspellWeCantSpell != null && _hunspellWeCantSpell.Check(word); } @@ -340,11 +352,7 @@ private bool IsWordCorrect(SpellCheckWord spellCheckWord, SubtitleLineViewModel return true; } - var isCorrect = false; - if (_hunspellWeCantSpell != null) - { - isCorrect = _hunspellWeCantSpell.Check(word); - } + var isCorrect = DoSpell(word); if (_changeAllDictionary.ContainsKey(word) && NotSameSpecialEnding(words[wordIndex], _changeAllDictionary[word], text)) { From cf2d41ec49863362fc0e876f1cf20a26a3b1a20e Mon Sep 17 00:00:00 2001 From: "Hellgringer.Online" Date: Mon, 6 Apr 2026 21:43:29 +0400 Subject: [PATCH 36/74] Fix nOCR two-byte character load/save handling --- src/UI/Logic/Ocr/NOcrChar.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/UI/Logic/Ocr/NOcrChar.cs b/src/UI/Logic/Ocr/NOcrChar.cs index d53a2a07043..30fb539bbf3 100644 --- a/src/UI/Logic/Ocr/NOcrChar.cs +++ b/src/UI/Logic/Ocr/NOcrChar.cs @@ -87,6 +87,7 @@ public NOcrChar(ref int position, byte[] file) } else { + position++; ExpandCount = file[position++]; Width = file[position++] << 8 | file[position++]; Height = file[position++] << 8 | file[position++]; @@ -179,7 +180,7 @@ private bool IsAllByteValues() { return Width <= byte.MaxValue && Height <= byte.MaxValue && ExpandCount < 16 && LinesBackground.Count <= byte.MaxValue && LinesForeground.Count <= byte.MaxValue && - IsAllPointByteValues(LinesForeground) && IsAllPointByteValues(LinesForeground); + IsAllPointByteValues(LinesForeground) && IsAllPointByteValues(LinesBackground); } private static bool IsAllPointByteValues(List lines) @@ -632,4 +633,4 @@ private static void RemoveDuplicates(List lines) lines.RemoveAt(i); } } -} \ No newline at end of file +} From 18b43821f8173bffea11723db125a78eb69fd936 Mon Sep 17 00:00:00 2001 From: "Hellgringer.Online" Date: Mon, 6 Apr 2026 22:15:11 +0400 Subject: [PATCH 37/74] Fix expanded OCR core handling --- .../BinaryOcrCharacterAddViewModel.cs | 71 +++--------- .../Ocr/NOcr/NOcrCharacterAddViewModel.cs | 55 +++------ src/UI/Features/Ocr/OcrViewModel.cs | 9 -- src/UI/Logic/Ocr/ExpandedOcrGroup.cs | 106 ++++++++++++++++++ 4 files changed, 141 insertions(+), 100 deletions(-) create mode 100644 src/UI/Logic/Ocr/ExpandedOcrGroup.cs diff --git a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs index 0323c51428c..8c857943428 100644 --- a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs +++ b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrCharacterAddViewModel.cs @@ -37,6 +37,8 @@ public partial class BinaryOcrCharacterAddViewModel : ObservableObject private ImageSplitterItem2 _splitItem; public BinaryOcrBitmap? BinaryOcrBitmap { get; private set; } + public NikseBitmap2? PreviewBitmap { get; private set; } + public int PreviewTopMargin { get; private set; } public TextBox TextBoxNew { get; set; } public bool OkPressed { get; set; } public bool AbortPressed { get; set; } @@ -51,7 +53,6 @@ public partial class BinaryOcrCharacterAddViewModel : ObservableObject private BinaryOcrDb _db; private bool _isControlDown; private bool _isWinDown; - public BinaryOcrBitmap? FirstBinaryOcrBitmap { get; set; } public BinaryOcrCharacterAddViewModel() { @@ -69,6 +70,8 @@ public BinaryOcrCharacterAddViewModel() _splitItem = new ImageSplitterItem2(string.Empty); TextBoxNew = new TextBox(); _nBmp = new NikseBitmap2(1, 1); + PreviewBitmap = null; + PreviewTopMargin = 0; ShowSkip = true; ShowUseOnce = true; LoadSettings(); @@ -138,14 +141,15 @@ private void SetImages(OcrSubtitleItem? item, NikseBitmap2 nBmp) if (_splitItem.NikseBitmap != null) { + PreviewBitmap = _splitItem.NikseBitmap; + PreviewTopMargin = _splitItem.Top; BinaryOcrBitmap = new BinaryOcrBitmap(_splitItem.NikseBitmap) { X = _splitItem.X, Y = _splitItem.Top, ExpandCount = 0, }; - FirstBinaryOcrBitmap = BinaryOcrBitmap; - ResolutionAndTopMargin = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, BinaryOcrBitmap.Width, BinaryOcrBitmap.Height, BinaryOcrBitmap.Y); + ResolutionAndTopMargin = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, PreviewBitmap.Width, PreviewBitmap.Height, PreviewTopMargin); } if (_splitItem.NikseBitmap != null) @@ -156,61 +160,20 @@ private void SetImages(OcrSubtitleItem? item, NikseBitmap2 nBmp) _splitItem.X + _splitItem.NikseBitmap.Width, _splitItem.Y + _splitItem.NikseBitmap.Height); - CurrentBitmap = _splitItem.NikseBitmap!.GetBitmap().ToAvaloniaBitmap(); + CurrentBitmap = PreviewBitmap!.GetBitmap().ToAvaloniaBitmap(); if (_expandCount > 0) { - var minMarginTop = int.MaxValue; - var minX = int.MaxValue; - var minY = int.MaxValue; - var maxX = 0; - var maxY = 0; - - for (var i = _startFromNumber; i < _startFromNumber + _expandCount + 1 && i < _letters.Count; i++) + var expandedGroup = ExpandedOcrGroup.Create(_nBmp, _letters, _startFromNumber, _expandCount + 1); + if (expandedGroup != null) { - var letter = _letters[i]; - if (letter.NikseBitmap != null) - { - minMarginTop = Math.Min(minMarginTop, letter.Top); - minX = Math.Min(minX, letter.X); - minY = Math.Min(minY, letter.Y); - maxX = Math.Max(maxX, letter.X + letter.NikseBitmap.Width); - maxY = Math.Max(maxY, letter.Y + letter.NikseBitmap.Height); - } + PreviewBitmap = expandedGroup.PreviewBitmap; + PreviewTopMargin = expandedGroup.PreviewTopMargin; + rect = expandedGroup.Bounds; + CurrentBitmap = PreviewBitmap.GetBitmap().ToAvaloniaBitmap(); + BinaryOcrBitmap = expandedGroup.CreateBinaryOcrBitmap(); + ResolutionAndTopMargin = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, PreviewBitmap.Width, PreviewBitmap.Height, PreviewTopMargin); } - - rect = new SKRectI(minX, minY, maxX, maxY); - var subset = new SKBitmap(); - if (!nBmp.GetBitmap().ExtractSubset(subset, rect)) - { - throw new InvalidOperationException("Subset extraction failed."); - } - CurrentBitmap = subset.ToAvaloniaBitmap(); - - var nikseBitmap = new NikseBitmap2(subset); - BinaryOcrBitmap = new BinaryOcrBitmap(nikseBitmap) - { - X = minX, - Y = minY, - ExpandCount = _expandCount + 1, - }; - - // Build expanded list - BinaryOcrBitmap.ExpandedList = new List(); - for (var j = 1; j <= _expandCount; j++) - { - if (_startFromNumber + j < _letters.Count && _letters[_startFromNumber + j].NikseBitmap != null) - { - var expandedBitmap = new BinaryOcrBitmap(_letters[_startFromNumber + j].NikseBitmap!) - { - X = _letters[_startFromNumber + j].X, - Y = _letters[_startFromNumber + j].Top, - }; - BinaryOcrBitmap.ExpandedList.Add(expandedBitmap); - } - } - - ResolutionAndTopMargin = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, BinaryOcrBitmap.Width, BinaryOcrBitmap.Height, BinaryOcrBitmap.Y); } using (var canvas = new SKCanvas(skBitmap)) @@ -462,4 +425,4 @@ internal void TextBoxMacPointerReleased(object? sender, PointerReleasedEventArgs e.Handled = args.Handled; } } -} \ No newline at end of file +} diff --git a/src/UI/Features/Ocr/NOcr/NOcrCharacterAddViewModel.cs b/src/UI/Features/Ocr/NOcr/NOcrCharacterAddViewModel.cs index 0a8246d4b92..8a5fd1fda61 100644 --- a/src/UI/Features/Ocr/NOcr/NOcrCharacterAddViewModel.cs +++ b/src/UI/Features/Ocr/NOcr/NOcrCharacterAddViewModel.cs @@ -53,6 +53,7 @@ public partial class NOcrCharacterAddViewModel : ObservableObject private ImageSplitterItem2 _splitItem; public NOcrChar NOcrChar { get; private set; } + public NikseBitmap2? PreviewBitmap { get; private set; } public NOcrDrawingCanvasView NOcrDrawingCanvas { get; set; } public TextBox TextBoxNew { get; set; } public bool OkPressed { get; set; } @@ -99,6 +100,7 @@ public NOcrCharacterAddViewModel() NOcrDrawingCanvas = new NOcrDrawingCanvasView(); TextBoxNew = new TextBox(); _nBmp = new NikseBitmap2(1, 1); + PreviewBitmap = null; ShowSkip = true; ShowUseOnce = true; ShowAbort = true; @@ -164,6 +166,7 @@ private void SetImages(OcrSubtitleItem? item, NikseBitmap2 nBmp) if (_splitItem.NikseBitmap != null) { + PreviewBitmap = _splitItem.NikseBitmap; NOcrChar = new NOcrChar { Width = _splitItem.NikseBitmap.Width, @@ -184,46 +187,19 @@ private void SetImages(OcrSubtitleItem? item, NikseBitmap2 nBmp) _splitItem.X + _splitItem.NikseBitmap.Width, _splitItem.Y + _splitItem.NikseBitmap.Height); - CurrentBitmap = _splitItem.NikseBitmap!.GetBitmap().ToAvaloniaBitmap(); + CurrentBitmap = PreviewBitmap!.GetBitmap().ToAvaloniaBitmap(); if (_expandCount > 0) { - var minMarginTop = int.MaxValue; - var minX = int.MaxValue; - var minY = int.MaxValue; - var maxX = 0; - var maxY = 0; - - for (var i = _startFromNumber; i < _startFromNumber + _expandCount + 1 && i < _letters.Count; i++) - { - var letter = _letters[i]; - if (letter.NikseBitmap != null) - { - minMarginTop = Math.Min(minMarginTop, letter.Top); - minX = Math.Min(minX, letter.X); - minY = Math.Min(minY, letter.Y); - maxX = Math.Max(maxX, letter.X + letter.NikseBitmap.Width); - maxY = Math.Max(maxY, letter.Y + letter.NikseBitmap.Height); - } - } - - rect = new SKRectI(minX, minY, maxX, maxY); - var subset = new SKBitmap(); - if (!nBmp.GetBitmap().ExtractSubset(subset, rect)) + var expandedGroup = ExpandedOcrGroup.Create(_nBmp, _letters, _startFromNumber, _expandCount + 1); + if (expandedGroup != null) { - throw new InvalidOperationException("Subset extraction failed."); + PreviewBitmap = expandedGroup.PreviewBitmap; + rect = expandedGroup.Bounds; + CurrentBitmap = PreviewBitmap.GetBitmap().ToAvaloniaBitmap(); + NOcrChar = expandedGroup.CreateNOcrChar(); + ResolutionAndTopMargin = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, NOcrChar.Width, NOcrChar.Height, NOcrChar.MarginTop); } - CurrentBitmap = subset.ToAvaloniaBitmap(); - - NOcrChar = new NOcrChar - { - Width = subset.Width, - Height = subset.Height, - MarginTop = 0, - ExpandCount = _expandCount + 1, - }; - - ResolutionAndTopMargin = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, NOcrChar.Width, NOcrChar.Height, NOcrChar.MarginTop); } NOcrDrawingCanvas.BackgroundImage = CurrentBitmap; @@ -349,7 +325,12 @@ private void DrawAgain() { NOcrChar.LinesForeground.Clear(); NOcrChar.LinesBackground.Clear(); - NOcrChar.GenerateLineSegments(SelectedNoOfLinesToAutoDraw, false, NOcrChar, new NikseBitmap2(SkBitmapExtensions.ToSkBitmap(CurrentBitmap))); + if (PreviewBitmap == null) + { + return; + } + + NOcrChar.GenerateLineSegments(SelectedNoOfLinesToAutoDraw, false, NOcrChar, PreviewBitmap); ShowOcrPoints(); } @@ -615,4 +596,4 @@ internal void TextBoxMacPointerReleased(object? sender, PointerReleasedEventArgs e.Handled = args.Handled; } } -} \ No newline at end of file +} diff --git a/src/UI/Features/Ocr/OcrViewModel.cs b/src/UI/Features/Ocr/OcrViewModel.cs index f049cb48303..adc298f3e15 100644 --- a/src/UI/Features/Ocr/OcrViewModel.cs +++ b/src/UI/Features/Ocr/OcrViewModel.cs @@ -2247,15 +2247,6 @@ await _windowService.ShowDialogAsync db.Save()); } diff --git a/src/UI/Logic/Ocr/ExpandedOcrGroup.cs b/src/UI/Logic/Ocr/ExpandedOcrGroup.cs new file mode 100644 index 00000000000..108eab0eb0a --- /dev/null +++ b/src/UI/Logic/Ocr/ExpandedOcrGroup.cs @@ -0,0 +1,106 @@ +using SkiaSharp; +using System; +using System.Collections.Generic; + +namespace Nikse.SubtitleEdit.Logic.Ocr; + +public sealed class ExpandedOcrGroup +{ + public IReadOnlyList Items { get; } + public ImageSplitterItem2 FirstItem => Items[0]; + public SKRectI Bounds { get; } + public NikseBitmap2 PreviewBitmap { get; } + public int MinTop { get; } + public int MinY { get; } + public int Count => Items.Count; + public int PreviewTopMargin => FirstItem.Top - MinTop; + + private ExpandedOcrGroup( + List items, + SKRectI bounds, + NikseBitmap2 previewBitmap, + int minTop, + int minY) + { + Items = items; + Bounds = bounds; + PreviewBitmap = previewBitmap; + MinTop = minTop; + MinY = minY; + } + + public static ExpandedOcrGroup? Create(NikseBitmap2 sourceBitmap, IReadOnlyList letters, int startIndex, int count) + { + if (count <= 1 || startIndex < 0 || startIndex + count > letters.Count) + { + return null; + } + + var items = new List(count); + var minTop = int.MaxValue; + var minX = int.MaxValue; + var minY = int.MaxValue; + var maxX = 0; + var maxY = 0; + + for (var i = startIndex; i < startIndex + count; i++) + { + var letter = letters[i]; + if (letter.NikseBitmap == null) + { + return null; + } + + items.Add(letter); + minTop = Math.Min(minTop, letter.Top); + minX = Math.Min(minX, letter.X); + minY = Math.Min(minY, letter.Y); + maxX = Math.Max(maxX, letter.X + letter.NikseBitmap.Width); + maxY = Math.Max(maxY, letter.Y + letter.NikseBitmap.Height); + } + + var bounds = new SKRectI(minX, minY, maxX, maxY); + var previewBitmap = sourceBitmap.CopyRectangle(new NikseRectangle(minX, minY, maxX - minX, maxY - minY)); + return new ExpandedOcrGroup(items, bounds, previewBitmap, minTop, minY); + } + + public NOcrChar CreateNOcrChar() + { + return new NOcrChar + { + Width = PreviewBitmap.Width, + Height = PreviewBitmap.Height, + MarginTop = PreviewTopMargin, + ExpandCount = Count, + }; + } + + public BinaryOcrBitmap CreateBinaryOcrBitmap() + { + var firstBitmap = FirstItem.NikseBitmap ?? throw new InvalidOperationException("Expanded OCR group is missing the first bitmap."); + var binaryOcrBitmap = new BinaryOcrBitmap(firstBitmap) + { + X = FirstItem.X, + Y = FirstItem.Top, + ExpandCount = Count, + ExpandedList = new List(), + }; + + for (var i = 1; i < Items.Count; i++) + { + var item = Items[i]; + if (item.NikseBitmap == null) + { + throw new InvalidOperationException("Expanded OCR group is missing a child bitmap."); + } + + binaryOcrBitmap.ExpandedList.Add(new BinaryOcrBitmap(item.NikseBitmap) + { + X = item.X, + Y = item.Top, + }); + } + + return binaryOcrBitmap; + } +} From 85a7a21ae27372b90f7ae44bef0f8e3430c5e6c8 Mon Sep 17 00:00:00 2001 From: "Hellgringer.Online" Date: Mon, 6 Apr 2026 23:00:36 +0400 Subject: [PATCH 38/74] Add tests for expanded OCR group helper --- tests/UI/Logic/Ocr/ExpandedOcrGroupTests.cs | 73 +++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 tests/UI/Logic/Ocr/ExpandedOcrGroupTests.cs diff --git a/tests/UI/Logic/Ocr/ExpandedOcrGroupTests.cs b/tests/UI/Logic/Ocr/ExpandedOcrGroupTests.cs new file mode 100644 index 00000000000..a45111fd2b6 --- /dev/null +++ b/tests/UI/Logic/Ocr/ExpandedOcrGroupTests.cs @@ -0,0 +1,73 @@ +using Nikse.SubtitleEdit.Logic.Ocr; + +namespace UITests.Logic.Ocr; + +public class ExpandedOcrGroupTests +{ + [Fact] + public void CreateNOcrChar_UsesCombinedPreviewSizeAndRelativeTopMargin() + { + var sourceBitmap = new NikseBitmap2(40, 40); + var letters = new List + { + CreateLetter(10, 12, 8, 4, 5), + CreateLetter(15, 10, 6, 3, 7), + }; + + var group = ExpandedOcrGroup.Create(sourceBitmap, letters, 0, 2); + + Assert.NotNull(group); + var actualGroup = Assert.IsType(group); + Assert.Equal(8, actualGroup.PreviewBitmap.Width); + Assert.Equal(7, actualGroup.PreviewBitmap.Height); + Assert.Equal(2, actualGroup.PreviewTopMargin); + + var nOcrChar = actualGroup.CreateNOcrChar(); + Assert.Equal(8, nOcrChar.Width); + Assert.Equal(7, nOcrChar.Height); + Assert.Equal(2, nOcrChar.MarginTop); + Assert.Equal(2, nOcrChar.ExpandCount); + } + + [Fact] + public void CreateBinaryOcrBitmap_KeepsFirstGlyphPersistedAndStoresExpandedChildren() + { + var sourceBitmap = new NikseBitmap2(50, 40); + var letters = new List + { + CreateLetter(10, 12, 8, 4, 5), + CreateLetter(15, 10, 6, 3, 7), + CreateLetter(19, 11, 7, 2, 6), + }; + + var group = ExpandedOcrGroup.Create(sourceBitmap, letters, 0, 3); + + Assert.NotNull(group); + var actualGroup = Assert.IsType(group); + var firstBitmap = Assert.IsType(letters[0].NikseBitmap); + Assert.True(actualGroup.PreviewBitmap.Width > firstBitmap.Width); + + var binaryOcrBitmap = actualGroup.CreateBinaryOcrBitmap(); + Assert.Equal(firstBitmap.Width, binaryOcrBitmap.Width); + Assert.Equal(firstBitmap.Height, binaryOcrBitmap.Height); + Assert.Equal(letters[0].X, binaryOcrBitmap.X); + Assert.Equal(letters[0].Top, binaryOcrBitmap.Y); + Assert.Equal(3, binaryOcrBitmap.ExpandCount); + Assert.Equal(2, binaryOcrBitmap.ExpandedList.Count); + Assert.Equal(letters[1].X, binaryOcrBitmap.ExpandedList[0].X); + Assert.Equal(letters[1].Top, binaryOcrBitmap.ExpandedList[0].Y); + Assert.Equal(letters[2].X, binaryOcrBitmap.ExpandedList[1].X); + Assert.Equal(letters[2].Top, binaryOcrBitmap.ExpandedList[1].Y); + } + + private static ImageSplitterItem2 CreateLetter(int x, int y, int top, int width, int height) + { + var item = new ImageSplitterItem2(x, y, new NikseBitmap2(width, height)) + { + Top = top, + ParentY = y, + }; + + return item; + } +} From 71f06fb50017d7b8e99616e9119026e582a2db6f Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Tue, 7 Apr 2026 06:08:48 +0200 Subject: [PATCH 39/74] Work on spell check --- src/UI/Features/Options/Settings/SettingsViewModel.cs | 9 +++++++++ src/UI/Logic/Config/Language/Options/LanguageSettings.cs | 4 ++++ src/UI/Logic/Config/SeTools.cs | 5 +++++ 3 files changed, 18 insertions(+) diff --git a/src/UI/Features/Options/Settings/SettingsViewModel.cs b/src/UI/Features/Options/Settings/SettingsViewModel.cs index dd31902a17d..2861fa25b77 100644 --- a/src/UI/Features/Options/Settings/SettingsViewModel.cs +++ b/src/UI/Features/Options/Settings/SettingsViewModel.cs @@ -19,6 +19,7 @@ using Nikse.SubtitleEdit.Features.Options.Settings.WaveformToolbarItems; using Nikse.SubtitleEdit.Features.Shared; using Nikse.SubtitleEdit.Features.Shared.PickSubtitleFormat; +using Nikse.SubtitleEdit.Features.SpellCheck; using Nikse.SubtitleEdit.Logic; using Nikse.SubtitleEdit.Logic.Config; using Nikse.SubtitleEdit.Logic.Media; @@ -116,6 +117,8 @@ public partial class SettingsViewModel : ObservableObject [ObservableProperty] private bool _speechToTextSelectedLinesPromptFistTimeOnly; [ObservableProperty] private bool _multipleReplaceShowDotDotDotButtons; [ObservableProperty] private bool _gridFocusTextboxAfterInsertNew; + [ObservableProperty] private ObservableCollection _spellCheckEngines; + [ObservableProperty] private string _selectedSpellCheckEngine; [ObservableProperty] private bool _showUpDownStartTime; [ObservableProperty] private bool _showUpDownEndTime; @@ -448,6 +451,12 @@ public SettingsViewModel(IWindowService windowService, IFolderHelper folderHelpe ]; SelectedSplitOddNumberOfLinesAction = SplitOddNumberOfLinesActions[0]; + SpellCheckEngines = [ + Se.Language.Options.Settings.SpellCheckEngineHunSpelll, + Se.Language.Options.Settings.SpellCheckEngineMsWord, + ]; + SelectedSpellCheckEngine = SpellCheckEngines[0]; + WaveformSpaceInfo = string.Empty; IsMpvChosen = true; diff --git a/src/UI/Logic/Config/Language/Options/LanguageSettings.cs b/src/UI/Logic/Config/Language/Options/LanguageSettings.cs index d8e44afe1ad..b07d9283d0c 100644 --- a/src/UI/Logic/Config/Language/Options/LanguageSettings.cs +++ b/src/UI/Logic/Config/Language/Options/LanguageSettings.cs @@ -277,6 +277,8 @@ public class LanguageSettings public string MatchIconColorToDarkTheme { get; set; } public string SubtitlePreviewProperties { get; set; } public string PixelWidthInfo { get; set; } + public string SpellCheckEngineHunSpelll { get; set; } + public string SpellCheckEngineMsWord { get; set; } public LanguageSettings() { @@ -550,6 +552,8 @@ public LanguageSettings() MatchIconColorToDarkTheme = "Match icon color to dark theme foreground color"; SubtitlePreviewProperties = "Subtitle preview properties"; PixelWidthInfo = "Green lines = max-width limit | Red area = text exceeds limit"; + SpellCheckEngineHunSpelll = "Hunspell"; + SpellCheckEngineMsWord = "MS Word"; } public string GetContinuationStyleName(ContinuationStyle continuationStyle) diff --git a/src/UI/Logic/Config/SeTools.cs b/src/UI/Logic/Config/SeTools.cs index 142847302b3..3afb7661ec8 100644 --- a/src/UI/Logic/Config/SeTools.cs +++ b/src/UI/Logic/Config/SeTools.cs @@ -6,6 +6,9 @@ namespace Nikse.SubtitleEdit.Logic.Config; public class SeTools { + public const string SpellCheckHunspell = "hunspell"; + public const string SpellCheckMsWord = "msword"; + public SeAudioToText AudioToText { get; set; } = new(); public SeConvertActors ConvertActors { get; set; } = new(); public SeFixCommonErrors FixCommonErrors { get; set; } = new(); @@ -83,6 +86,7 @@ public class SeTools public bool MultipleReplaceShowDotDotDotButtons { get; set; } public bool GridFocusTextboxAfterInsertNew { get; set; } public List FindHistory { get; set; } = new List(); + public string SpellCheckProvider { get; set; } public SeTools() { @@ -136,6 +140,7 @@ public SeTools() SpeechToTextSelectedLinesPromptFistTimeOnly = true; MultipleReplaceShowDotDotDotButtons = true; GridFocusTextboxAfterInsertNew = true; + SpellCheckProvider = SpellCheckHunspell; LastColorPickerColor = Colors.Yellow.FromColorToHex(); LastColorPickerColor1 = Colors.Red.FromColorToHex(); From f29c6d6c66b882b37fb8a065ca5f3121d2e4d90e Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Tue, 7 Apr 2026 06:09:22 +0200 Subject: [PATCH 40/74] Add unit tests for nocr char --- src/UI/Logic/Ocr/NOcrChar.cs | 5 +- tests/UI/Logic/Ocr/NOcrCharTests.cs | 145 ++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 tests/UI/Logic/Ocr/NOcrCharTests.cs diff --git a/src/UI/Logic/Ocr/NOcrChar.cs b/src/UI/Logic/Ocr/NOcrChar.cs index d53a2a07043..54ad7eeb8b5 100644 --- a/src/UI/Logic/Ocr/NOcrChar.cs +++ b/src/UI/Logic/Ocr/NOcrChar.cs @@ -87,6 +87,7 @@ public NOcrChar(ref int position, byte[] file) } else { + position++; // skip flags byte (already read for isShort and Italic) ExpandCount = file[position++]; Width = file[position++] << 8 | file[position++]; Height = file[position++] << 8 | file[position++]; @@ -177,9 +178,9 @@ internal void Save(Stream stream) private bool IsAllByteValues() { - return Width <= byte.MaxValue && Height <= byte.MaxValue && ExpandCount < 16 && + return Width <= byte.MaxValue && Height <= byte.MaxValue && MarginTop <= byte.MaxValue && ExpandCount < 16 && LinesBackground.Count <= byte.MaxValue && LinesForeground.Count <= byte.MaxValue && - IsAllPointByteValues(LinesForeground) && IsAllPointByteValues(LinesForeground); + IsAllPointByteValues(LinesForeground) && IsAllPointByteValues(LinesBackground); } private static bool IsAllPointByteValues(List lines) diff --git a/tests/UI/Logic/Ocr/NOcrCharTests.cs b/tests/UI/Logic/Ocr/NOcrCharTests.cs new file mode 100644 index 00000000000..08d806214f7 --- /dev/null +++ b/tests/UI/Logic/Ocr/NOcrCharTests.cs @@ -0,0 +1,145 @@ +using Nikse.SubtitleEdit.Logic.Ocr; + +namespace UITests.Logic.Ocr; + +public class NOcrCharTests +{ + private static NOcrChar SaveAndReload(NOcrChar original) + { + var fileName = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + ".nocr"); + try + { + var db1 = new NOcrDb(fileName); + db1.Add(original); + db1.Save(); + + var db2 = new NOcrDb(fileName); + return original.ExpandCount > 0 + ? db2.OcrCharactersExpanded[0] + : db2.OcrCharacters[0]; + } + finally + { + if (File.Exists(fileName)) + { + File.Delete(fileName); + } + } + } + + [Fact] + public void SaveLoad_FewLines_RoundTripsCorrectly() + { + var original = new NOcrChar("A") + { + Width = 10, + Height = 20, + MarginTop = 5, + Italic = true, + }; + original.LinesForeground.Add(new NOcrLine(new OcrPoint(1, 2), new OcrPoint(8, 15))); + original.LinesForeground.Add(new NOcrLine(new OcrPoint(3, 5), new OcrPoint(7, 18))); + original.LinesBackground.Add(new NOcrLine(new OcrPoint(0, 0), new OcrPoint(2, 2))); + + var loaded = SaveAndReload(original); + + Assert.True(loaded.LoadedOk); + Assert.Equal(original.Text, loaded.Text); + Assert.Equal(original.Width, loaded.Width); + Assert.Equal(original.Height, loaded.Height); + Assert.Equal(original.MarginTop, loaded.MarginTop); + Assert.Equal(original.Italic, loaded.Italic); + Assert.Equal(2, loaded.LinesForeground.Count); + Assert.Equal(1, loaded.LinesBackground.Count); + Assert.Equal(original.LinesForeground[0].Start.X, loaded.LinesForeground[0].Start.X); + Assert.Equal(original.LinesForeground[0].Start.Y, loaded.LinesForeground[0].Start.Y); + Assert.Equal(original.LinesForeground[0].End.X, loaded.LinesForeground[0].End.X); + Assert.Equal(original.LinesForeground[0].End.Y, loaded.LinesForeground[0].End.Y); + Assert.Equal(original.LinesBackground[0].Start.X, loaded.LinesBackground[0].Start.X); + Assert.Equal(original.LinesBackground[0].End.Y, loaded.LinesBackground[0].End.Y); + } + + [Fact] + public void SaveLoad_MoreThan255ForegroundLines_RoundTripsCorrectly() + { + var original = new NOcrChar("B") + { + Width = 100, + Height = 80, + MarginTop = 10, + }; + for (var i = 0; i < 260; i++) + { + original.LinesForeground.Add(new NOcrLine(new OcrPoint(i % 98 + 1, i % 78 + 1), new OcrPoint(i % 98 + 2, i % 78 + 2))); + } + original.LinesBackground.Add(new NOcrLine(new OcrPoint(0, 0), new OcrPoint(5, 5))); + + var loaded = SaveAndReload(original); + + Assert.True(loaded.LoadedOk); + Assert.Equal(original.Text, loaded.Text); + Assert.Equal(original.Width, loaded.Width); + Assert.Equal(original.Height, loaded.Height); + Assert.Equal(original.MarginTop, loaded.MarginTop); + Assert.Equal(260, loaded.LinesForeground.Count); + Assert.Equal(1, loaded.LinesBackground.Count); + Assert.Equal(original.LinesForeground[0].Start.X, loaded.LinesForeground[0].Start.X); + Assert.Equal(original.LinesForeground[0].Start.Y, loaded.LinesForeground[0].Start.Y); + Assert.Equal(original.LinesForeground[259].End.X, loaded.LinesForeground[259].End.X); + Assert.Equal(original.LinesForeground[259].End.Y, loaded.LinesForeground[259].End.Y); + Assert.Equal(original.LinesBackground[0].End.X, loaded.LinesBackground[0].End.X); + } + + [Fact] + public void SaveLoad_MarginTopMoreThan255_RoundTripsCorrectly() + { + var original = new NOcrChar("C") + { + Width = 50, + Height = 60, + MarginTop = 300, + }; + original.LinesForeground.Add(new NOcrLine(new OcrPoint(5, 10), new OcrPoint(45, 55))); + original.LinesBackground.Add(new NOcrLine(new OcrPoint(0, 0), new OcrPoint(3, 3))); + + var loaded = SaveAndReload(original); + + Assert.True(loaded.LoadedOk); + Assert.Equal(original.Text, loaded.Text); + Assert.Equal(original.Width, loaded.Width); + Assert.Equal(original.Height, loaded.Height); + Assert.Equal(300, loaded.MarginTop); + Assert.Equal(1, loaded.LinesForeground.Count); + Assert.Equal(1, loaded.LinesBackground.Count); + Assert.Equal(original.LinesForeground[0].Start.X, loaded.LinesForeground[0].Start.X); + Assert.Equal(original.LinesForeground[0].End.Y, loaded.LinesForeground[0].End.Y); + } + + [Fact] + public void NOcrDb_SaveLoad_ViaFile_RoundTripsCorrectly() + { + var original = new NOcrChar("X") + { + Width = 15, + Height = 25, + MarginTop = 3, + Italic = false, + }; + original.LinesForeground.Add(new NOcrLine(new OcrPoint(2, 3), new OcrPoint(12, 20))); + original.LinesBackground.Add(new NOcrLine(new OcrPoint(0, 0), new OcrPoint(4, 4))); + + var loaded = SaveAndReload(original); + + Assert.Equal("X", loaded.Text); + Assert.Equal(15, loaded.Width); + Assert.Equal(25, loaded.Height); + Assert.Equal(3, loaded.MarginTop); + Assert.False(loaded.Italic); + Assert.Single(loaded.LinesForeground); + Assert.Single(loaded.LinesBackground); + Assert.Equal(2, loaded.LinesForeground[0].Start.X); + Assert.Equal(3, loaded.LinesForeground[0].Start.Y); + Assert.Equal(12, loaded.LinesForeground[0].End.X); + Assert.Equal(20, loaded.LinesForeground[0].End.Y); + } +} From 452c35262f8153468986a87f889a48e22854a84f Mon Sep 17 00:00:00 2001 From: niksedk Date: Tue, 7 Apr 2026 07:17:10 +0200 Subject: [PATCH 41/74] Add toggle select sub while playing to video menu - thx vsemozhetbyt :) Fix #10537 --- src/UI/Features/Main/Layout/InitMenu.cs | 12 ++++++++++++ src/UI/Features/Main/MainViewModel.cs | 15 +++++++++++++++ src/UI/Logic/Config/Language/Main/LanguageMain.cs | 4 ++++ .../Config/Language/Main/LanguageMainMenu.cs | 4 ++++ .../Logic/Config/Language/Video/LanguageVideo.cs | 2 ++ src/UI/Logic/ShortcutsMain.cs | 2 ++ 6 files changed, 39 insertions(+) diff --git a/src/UI/Features/Main/Layout/InitMenu.cs b/src/UI/Features/Main/Layout/InitMenu.cs index a236ed00c88..365df3406da 100644 --- a/src/UI/Features/Main/Layout/InitMenu.cs +++ b/src/UI/Features/Main/Layout/InitMenu.cs @@ -646,6 +646,18 @@ public static void Make(MainViewModel vm) [!MenuItem.IsVisibleProperty] = new Binding(nameof(vm.AreVideoControlsUndocked)) { Converter = new InverseBooleanConverter() }, }, new MenuItem + { + Header = l.ToggleSelectSubtitleWhilePlayingCurrentlyOn, + Command = vm.ToggleCurrentSubtitleWhilePlayingCommand, + [!MenuItem.IsVisibleProperty] = new Binding(nameof(vm.SelectCurrentSubtitleWhilePlaying)), + }, + new MenuItem + { + Header = l.ToggleSelectSubtitleWhilePlayingCurrentlyOff, + Command = vm.ToggleCurrentSubtitleWhilePlayingCommand, + [!MenuItem.IsVisibleProperty] = new Binding(nameof(vm.SelectCurrentSubtitleWhilePlaying)) { Converter = new InverseBooleanConverter() }, + }, + new MenuItem { Header = l.DockVideoControls, Command = vm.VideoRedockControlsCommand, diff --git a/src/UI/Features/Main/MainViewModel.cs b/src/UI/Features/Main/MainViewModel.cs index ee4279457fa..ab499bcff45 100644 --- a/src/UI/Features/Main/MainViewModel.cs +++ b/src/UI/Features/Main/MainViewModel.cs @@ -1756,6 +1756,21 @@ private async Task OpenContainingFolder() await _folderHelper.OpenFolderWithFileSelected(Window!, _subtitleFileName); _shortcutManager.ClearKeys(); } + + [RelayCommand] + private void ToggleCurrentSubtitleWhilePlaying() + { + SelectCurrentSubtitleWhilePlaying = !SelectCurrentSubtitleWhilePlaying; + + if (SelectCurrentSubtitleWhilePlaying) + { + ShowStatus(Se.Language.Main.SelectCurrentSubtitleWhilePlayingOn); + } + else + { + ShowStatus(Se.Language.Main.SelectCurrentSubtitleWhilePlayingOff); + } + } [RelayCommand] private async Task CopySubtitlePathToClipboard() diff --git a/src/UI/Logic/Config/Language/Main/LanguageMain.cs b/src/UI/Logic/Config/Language/Main/LanguageMain.cs index a0b004550a6..0ed40f2204a 100644 --- a/src/UI/Logic/Config/Language/Main/LanguageMain.cs +++ b/src/UI/Logic/Config/Language/Main/LanguageMain.cs @@ -102,6 +102,8 @@ public class LanguageMain public string LiveSpellCheckLanguageXLoaded { get; set; } public string DownloadFfmpegTitle { get; set; } public string DownloadFfmpegQuestion { get; set; } + public string SelectCurrentSubtitleWhilePlayingOn { get; set; } + public string SelectCurrentSubtitleWhilePlayingOff { get; set; } public LanguageMain() { @@ -201,5 +203,7 @@ public LanguageMain() LiveSpellCheckLanguageXLoaded = "Live spell check language {0} loaded"; DownloadFfmpegTitle = "Download FFmpeg?"; DownloadFfmpegQuestion = "FFmpeg is required for playing online videos and for some video editing features.\n\nDownload FFmpeg now?"; + SelectCurrentSubtitleWhilePlayingOn = "Select current subtitle while playing: ON"; + SelectCurrentSubtitleWhilePlayingOff = "Select current subtitle while playing: OFF"; } } \ No newline at end of file diff --git a/src/UI/Logic/Config/Language/Main/LanguageMainMenu.cs b/src/UI/Logic/Config/Language/Main/LanguageMainMenu.cs index 69787adf4bb..d913c0ef03d 100644 --- a/src/UI/Logic/Config/Language/Main/LanguageMainMenu.cs +++ b/src/UI/Logic/Config/Language/Main/LanguageMainMenu.cs @@ -125,6 +125,8 @@ public class LanguageMainMenu public string SortSubtitles { get; set; } public string SetLayer { get; set; } public string FilterLayersForDisplayDotDotDot { get; set; } + public string ToggleSelectSubtitleWhilePlayingCurrentlyOn { get; set; } + public string ToggleSelectSubtitleWhilePlayingCurrentlyOff { get; set; } public LanguageMainMenu() { @@ -212,6 +214,8 @@ public LanguageMainMenu() ListShotChanges = "List s_hot changes..."; GenerateImportShotChanges = "Generate/import s_hot changes..."; DockVideoControls = "_Dock video controls"; + ToggleSelectSubtitleWhilePlayingCurrentlyOff = "Toggle select subtitle while playing (currently: off)"; + ToggleSelectSubtitleWhilePlayingCurrentlyOn = "Toggle select subtitle while playing (currently: on)"; SetVideoOffset = "Set video offset..."; UpdateVideoOffsetX = "Update video offset from {0}..."; SmpteTiming = "SMPTE timing (non-integer frame rate)"; diff --git a/src/UI/Logic/Config/Language/Video/LanguageVideo.cs b/src/UI/Logic/Config/Language/Video/LanguageVideo.cs index e0ca2e5e772..c420014000f 100644 --- a/src/UI/Logic/Config/Language/Video/LanguageVideo.cs +++ b/src/UI/Logic/Config/Language/Video/LanguageVideo.cs @@ -37,6 +37,7 @@ public class LanguageVideo public string ViewMatroskaTrackX { get; set; } public string ResolutionSeparator { get; set; } public string OpenFromUrlTitle { get; set; } + public string ToggleCurrentSubtitleWhilePlaying { get; set; } public LanguageVideo() { @@ -71,5 +72,6 @@ public LanguageVideo() ViewMatroskaTrackX = "View Matroska track - {0}"; ResolutionSeparator = "x"; OpenFromUrlTitle = "Open video file from URL"; + ToggleCurrentSubtitleWhilePlaying = "Toggle current subtitle while playing"; } } \ No newline at end of file diff --git a/src/UI/Logic/ShortcutsMain.cs b/src/UI/Logic/ShortcutsMain.cs index 2e10b904088..f238e3f8c75 100644 --- a/src/UI/Logic/ShortcutsMain.cs +++ b/src/UI/Logic/ShortcutsMain.cs @@ -340,6 +340,7 @@ private static void AddShortcut(IList list, T command, str { nameof(MainViewModel.ZoomLayoutInCommand), Se.Language.Options.Shortcuts.LayoutZoomIn }, { nameof(MainViewModel.ZoomLayoutOutCommand), Se.Language.Options.Shortcuts.LayoutZoomOut }, { nameof(MainViewModel.OpenSecondarySubtitleCommand), Se.Language.Video.OpenSecondarySubtitleOnVideoPlayer }, + { nameof(MainViewModel.ToggleCurrentSubtitleWhilePlayingCommand), Se.Language.Video.ToggleCurrentSubtitleWhilePlaying }, }; private static List GetAllAvailableShortcuts(MainViewModel vm) @@ -624,6 +625,7 @@ private static List GetAllAvailableShortcuts(MainViewModel vm AddShortcut(shortcuts, vm.ZoomLayoutInCommand, nameof(vm.ZoomLayoutInCommand), ShortcutCategory.General); AddShortcut(shortcuts, vm.ZoomLayoutOutCommand, nameof(vm.ZoomLayoutOutCommand), ShortcutCategory.General); AddShortcut(shortcuts, vm.OpenSecondarySubtitleCommand, nameof(vm.OpenSecondarySubtitleCommand), ShortcutCategory.General); + AddShortcut(shortcuts, vm.ToggleCurrentSubtitleWhilePlayingCommand, nameof(vm.ToggleCurrentSubtitleWhilePlayingCommand), ShortcutCategory.General); return shortcuts; } From a66182dad636093cbaacdab45f029ec303aece11 Mon Sep 17 00:00:00 2001 From: May Kittens Devour Your Soul Date: Tue, 7 Apr 2026 09:32:10 +0200 Subject: [PATCH 42/74] Add new word replacements to hrv_OCRFixReplaceList --- Dictionaries/hrv_OCRFixReplaceList.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Dictionaries/hrv_OCRFixReplaceList.xml b/Dictionaries/hrv_OCRFixReplaceList.xml index 6d626f6c04e..0f4962e758b 100644 --- a/Dictionaries/hrv_OCRFixReplaceList.xml +++ b/Dictionaries/hrv_OCRFixReplaceList.xml @@ -88,6 +88,7 @@ + @@ -1220,6 +1221,7 @@ + @@ -1502,6 +1504,7 @@ + @@ -1645,6 +1648,7 @@ + @@ -2168,6 +2172,7 @@ + @@ -2182,6 +2187,7 @@ + @@ -2287,7 +2293,11 @@ + + + + @@ -2386,6 +2396,7 @@ + @@ -2440,6 +2451,7 @@ + @@ -2488,6 +2500,7 @@ + @@ -2698,6 +2711,7 @@ + @@ -2720,6 +2734,7 @@ + @@ -3156,6 +3171,7 @@ + @@ -4346,6 +4362,7 @@ + @@ -5612,6 +5629,7 @@ + From 97bbf2bd6edf10bb094c5b21f63cbeb286ee9673 Mon Sep 17 00:00:00 2001 From: "nikolaj.olsson" Date: Tue, 7 Apr 2026 12:06:16 +0200 Subject: [PATCH 43/74] work on spell check --- .../Features/Options/Settings/SettingsPage.cs | 10 +++++ .../Options/Settings/SettingsViewModel.cs | 42 ++++++++++++++++--- .../Features/SpellCheck/ISpellCheckManager.cs | 1 + .../SpellCheck/SpellCheckViewModel.cs | 5 +++ .../Language/Options/LanguageSettings.cs | 2 + src/UI/Logic/Config/SeSpellCheck.cs | 11 +++++ src/UI/Logic/Config/SeTools.cs | 5 --- src/libse/AutoTranslate/GeminiTranslate.cs | 1 - 8 files changed, 66 insertions(+), 11 deletions(-) diff --git a/src/UI/Features/Options/Settings/SettingsPage.cs b/src/UI/Features/Options/Settings/SettingsPage.cs index 1df44f770ff..54e35775494 100644 --- a/src/UI/Features/Options/Settings/SettingsPage.cs +++ b/src/UI/Features/Options/Settings/SettingsPage.cs @@ -565,6 +565,16 @@ private List CreateSections() Mode = BindingMode.TwoWay, } }), + new SettingsItem(Se.Language.Options.Settings.SpellCheckEngine, () => new ComboBox + { + MinWidth = 200, + DataContext = _vm, + [!ItemsControl.ItemsSourceProperty] = new Binding(nameof(_vm.SpellCheckEngines)), + [!SelectingItemsControl.SelectedItemProperty] = new Binding(nameof(_vm.SelectedSpellCheckEngine)) + { + Mode = BindingMode.TwoWay, + } + }), MakeCheckboxSetting(Se.Language.Options.Settings.OcrUseWordSplitList, nameof(_vm.OcrUseWordSplitList)), MakeCheckboxSetting(Se.Language.Options.Settings.SpeechToTextSelectedLinesPromptFistTimeOnly, nameof(_vm.SpeechToTextSelectedLinesPromptFistTimeOnly)), MakeCheckboxSetting(Se.Language.Options.Settings.MultipleReplaceShowDotDotDotButtons, nameof(_vm.MultipleReplaceShowDotDotDotButtons)), diff --git a/src/UI/Features/Options/Settings/SettingsViewModel.cs b/src/UI/Features/Options/Settings/SettingsViewModel.cs index 2861fa25b77..4dff9f5f607 100644 --- a/src/UI/Features/Options/Settings/SettingsViewModel.cs +++ b/src/UI/Features/Options/Settings/SettingsViewModel.cs @@ -29,7 +29,6 @@ using System.Collections.ObjectModel; using System.IO; using System.Linq; -using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using DownloadFfmpegViewModel = Nikse.SubtitleEdit.Features.Shared.DownloadFfmpegViewModel; @@ -451,10 +450,11 @@ public SettingsViewModel(IWindowService windowService, IFolderHelper folderHelpe ]; SelectedSplitOddNumberOfLinesAction = SplitOddNumberOfLinesActions[0]; - SpellCheckEngines = [ - Se.Language.Options.Settings.SpellCheckEngineHunSpelll, - Se.Language.Options.Settings.SpellCheckEngineMsWord, - ]; + SpellCheckEngines = [Se.Language.Options.Settings.SpellCheckEngineHunSpelll]; + if (WordSpellCheck.IsWordInstalled()) + { + SpellCheckEngines.Add(Se.Language.Options.Settings.SpellCheckEngineMsWord); + } SelectedSpellCheckEngine = SpellCheckEngines[0]; WaveformSpaceInfo = string.Empty; @@ -599,6 +599,7 @@ private void LoadSettings() GoToLineNumberAlsoSetVideoPosition = Se.Settings.Tools.GoToLineNumberAlsoSetVideoPosition; AdjustAllTimesRememberLineSelectionChoice = Se.Settings.Synchronization.AdjustAllTimesRememberLineSelectionChoice; SelectedSplitOddNumberOfLinesAction = MapFromSplitOddActionToLanguageCode(Se.Settings.Tools.SplitOddLinesAction); + SelectedSpellCheckEngine = MapFromSpellCheckEngine(Se.Settings.SpellCheck.SpellCheckProvider); OcrUseWordSplitList = Se.Settings.Ocr.UseWordSplitList; SpeechToTextSelectedLinesPromptFistTimeOnly = Se.Settings.Tools.SpeechToTextSelectedLinesPromptFistTimeOnly; MultipleReplaceShowDotDotDotButtons = Se.Settings.Tools.MultipleReplaceShowDotDotDotButtons; @@ -867,6 +868,21 @@ private string GetTranslationModifierFromSetting(string modifier) } } + private static string MapFromSpellCheckEngine(string engine) + { + if (engine == SeSpellCheck.SpellCheckHunspell) + { + return Se.Language.Options.Settings.SpellCheckEngineHunSpelll; + } + + if (engine == SeSpellCheck.SpellCheckMsWord) + { + return Se.Language.Options.Settings.SpellCheckEngineMsWord; + } + + return Se.Language.Options.Settings.SpellCheckEngineHunSpelll; + } + private static string MapFromSplitOddActionToLanguageCode(string splitAction) { if (splitAction == nameof(SplitOddLinesActionType.WeightTop)) @@ -1169,6 +1185,7 @@ private void SaveSettings() Se.Settings.Tools.GoToLineNumberAlsoSetVideoPosition = GoToLineNumberAlsoSetVideoPosition; Se.Settings.Synchronization.AdjustAllTimesRememberLineSelectionChoice = AdjustAllTimesRememberLineSelectionChoice; Se.Settings.Tools.SplitOddLinesAction = MapFromSplitOddActionTranslationToCode(SelectedSplitOddNumberOfLinesAction); + Se.Settings.SpellCheck.SpellCheckProvider = MapFromUISpellCheckEngineToCode(SelectedSpellCheckEngine); Se.Settings.Ocr.UseWordSplitList = OcrUseWordSplitList; Se.Settings.Tools.SpeechToTextSelectedLinesPromptFistTimeOnly = SpeechToTextSelectedLinesPromptFistTimeOnly; Se.Settings.Tools.MultipleReplaceShowDotDotDotButtons = MultipleReplaceShowDotDotDotButtons; @@ -1364,6 +1381,21 @@ private void SaveSettings() Se.SaveSettings(); } + private string MapFromUISpellCheckEngineToCode(string spellCheckEngine) + { + if (spellCheckEngine == Se.Language.Options.Settings.SpellCheckEngineHunSpelll) + { + return SeSpellCheck.SpellCheckHunspell; + } + + if (spellCheckEngine == Se.Language.Options.Settings.SpellCheckEngineMsWord) + { + return SeSpellCheck.SpellCheckMsWord; + } + + return SeSpellCheck.SpellCheckHunspell; + } + private static string MapWaveformSingleClickFromTranslation(string selectedWaveformSingleClickActionType) { if (string.IsNullOrEmpty(selectedWaveformSingleClickActionType)) diff --git a/src/UI/Features/SpellCheck/ISpellCheckManager.cs b/src/UI/Features/SpellCheck/ISpellCheckManager.cs index 6fe64c75735..6fbefc24892 100644 --- a/src/UI/Features/SpellCheck/ISpellCheckManager.cs +++ b/src/UI/Features/SpellCheck/ISpellCheckManager.cs @@ -20,4 +20,5 @@ public interface ISpellCheckManager void AdToUserDictionary(string currentWord); List GetDictionaryLanguages(string dictionaryFolder); List GetSuggestions(string word); + WordSpellCheck? WordSpellChecker { get; set; } } diff --git a/src/UI/Features/SpellCheck/SpellCheckViewModel.cs b/src/UI/Features/SpellCheck/SpellCheckViewModel.cs index 23da21bc0c1..7018770dad7 100644 --- a/src/UI/Features/SpellCheck/SpellCheckViewModel.cs +++ b/src/UI/Features/SpellCheck/SpellCheckViewModel.cs @@ -54,6 +54,11 @@ public partial class SpellCheckViewModel : ObservableObject public SpellCheckViewModel(ISpellCheckManager spellCheckManager, IWindowService windowService) { _spellCheckManager = spellCheckManager; + if (Se.Settings.SpellCheck.SpellCheckProvider == SeSpellCheck.SpellCheckMsWord && WordSpellCheck.IsWordInstalled()) + { + _spellCheckManager.WordSpellChecker = new WordSpellCheck(); + } + _spellCheckManager.OnWordChanged += (sender, e) => { UpdateChangedWordInUi(e.FromWord, e.ToWord, e.WordIndex, e.Paragraph); diff --git a/src/UI/Logic/Config/Language/Options/LanguageSettings.cs b/src/UI/Logic/Config/Language/Options/LanguageSettings.cs index b07d9283d0c..4363c1bff71 100644 --- a/src/UI/Logic/Config/Language/Options/LanguageSettings.cs +++ b/src/UI/Logic/Config/Language/Options/LanguageSettings.cs @@ -279,6 +279,7 @@ public class LanguageSettings public string PixelWidthInfo { get; set; } public string SpellCheckEngineHunSpelll { get; set; } public string SpellCheckEngineMsWord { get; set; } + public string SpellCheckEngine { get; set; } public LanguageSettings() { @@ -554,6 +555,7 @@ public LanguageSettings() PixelWidthInfo = "Green lines = max-width limit | Red area = text exceeds limit"; SpellCheckEngineHunSpelll = "Hunspell"; SpellCheckEngineMsWord = "MS Word"; + SpellCheckEngine = "Spell check engine"; } public string GetContinuationStyleName(ContinuationStyle continuationStyle) diff --git a/src/UI/Logic/Config/SeSpellCheck.cs b/src/UI/Logic/Config/SeSpellCheck.cs index 2f9f762b143..9f52cd34305 100644 --- a/src/UI/Logic/Config/SeSpellCheck.cs +++ b/src/UI/Logic/Config/SeSpellCheck.cs @@ -2,7 +2,18 @@ public class SeSpellCheck { + public const string SpellCheckHunspell = "hunspell"; + public const string SpellCheckMsWord = "msword"; + + public string SpellCheckProvider { get; set; } + public string? LastLanguageDictionaryFile { get; set; } public bool PromptForUnknownOneLetterWords { get; set; } = false; public bool TreatInQuoteASIng { get; set; } = true; + + public SeSpellCheck() + { + SpellCheckProvider = SpellCheckHunspell; + + } } diff --git a/src/UI/Logic/Config/SeTools.cs b/src/UI/Logic/Config/SeTools.cs index 3afb7661ec8..142847302b3 100644 --- a/src/UI/Logic/Config/SeTools.cs +++ b/src/UI/Logic/Config/SeTools.cs @@ -6,9 +6,6 @@ namespace Nikse.SubtitleEdit.Logic.Config; public class SeTools { - public const string SpellCheckHunspell = "hunspell"; - public const string SpellCheckMsWord = "msword"; - public SeAudioToText AudioToText { get; set; } = new(); public SeConvertActors ConvertActors { get; set; } = new(); public SeFixCommonErrors FixCommonErrors { get; set; } = new(); @@ -86,7 +83,6 @@ public class SeTools public bool MultipleReplaceShowDotDotDotButtons { get; set; } public bool GridFocusTextboxAfterInsertNew { get; set; } public List FindHistory { get; set; } = new List(); - public string SpellCheckProvider { get; set; } public SeTools() { @@ -140,7 +136,6 @@ public SeTools() SpeechToTextSelectedLinesPromptFistTimeOnly = true; MultipleReplaceShowDotDotDotButtons = true; GridFocusTextboxAfterInsertNew = true; - SpellCheckProvider = SpellCheckHunspell; LastColorPickerColor = Colors.Yellow.FromColorToHex(); LastColorPickerColor1 = Colors.Red.FromColorToHex(); diff --git a/src/libse/AutoTranslate/GeminiTranslate.cs b/src/libse/AutoTranslate/GeminiTranslate.cs index f25f66bae9e..c7886692f4c 100644 --- a/src/libse/AutoTranslate/GeminiTranslate.cs +++ b/src/libse/AutoTranslate/GeminiTranslate.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; -using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; From 54cdbc07abca2d0dae2f0d48a0f0951bc7f1d12d Mon Sep 17 00:00:00 2001 From: "nikolaj.olsson" Date: Tue, 7 Apr 2026 12:32:24 +0200 Subject: [PATCH 44/74] Add "Extend only" to adjust durations - thx Dravic Fix #10561 --- .../AdjustDuration/AdjustDurationViewModel.cs | 16 +++++++++++++--- .../Tools/AdjustDuration/AdjustDurationWindow.cs | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/UI/Features/Tools/AdjustDuration/AdjustDurationViewModel.cs b/src/UI/Features/Tools/AdjustDuration/AdjustDurationViewModel.cs index eb08b748d6c..affceb382c4 100644 --- a/src/UI/Features/Tools/AdjustDuration/AdjustDurationViewModel.cs +++ b/src/UI/Features/Tools/AdjustDuration/AdjustDurationViewModel.cs @@ -23,6 +23,7 @@ public partial class AdjustDurationViewModel : ObservableObject [ObservableProperty] private double _adjustFixed; [ObservableProperty] private double _adjustRecalculateMaxCharacterPerSecond; [ObservableProperty] private double _adjustRecalculateOptimalCharacterPerSecond; + [ObservableProperty] private bool _extendOnly; public Window? Window { get; set; } @@ -51,7 +52,7 @@ public void AdjustDuration(ObservableCollection subtitles } else if (SelectedAdjustType.Type == AdjustDurationType.Recalculate) { - DoAdjustViaRecalculate(subtitles); + DoAdjustViaRecalculate(subtitles, ExtendOnly); } } @@ -119,7 +120,7 @@ private void DoAdjustViaPercent(ObservableCollection subt } } - private void DoAdjustViaRecalculate(ObservableCollection subtitles) + private void DoAdjustViaRecalculate(ObservableCollection subtitles, bool extendOnly) { for (int i = 0; i < subtitles.Count; i++) { @@ -135,8 +136,10 @@ private void DoAdjustViaRecalculate(ObservableCollection var proposedEndTime = subtitle.StartTime + optimalDuration; var fallbackEndTime = subtitle.StartTime + maxDuration; + var oldEndTime = subtitle.EndTime; + if (proposedEndTime <= maxEndTime) - { + { subtitle.EndTime = proposedEndTime; } else if (fallbackEndTime <= maxEndTime) @@ -147,6 +150,11 @@ private void DoAdjustViaRecalculate(ObservableCollection { subtitle.EndTime = maxEndTime; } + + if (extendOnly && subtitle.EndTime < oldEndTime) + { + subtitle.EndTime = oldEndTime; + } } } @@ -157,6 +165,7 @@ private void LoadSettings() AdjustFixed = Se.Settings.Tools.AdjustDurations.AdjustDurationFixed; AdjustRecalculateMaxCharacterPerSecond = Se.Settings.Tools.AdjustDurations.AdjustDurationMaximumCps; AdjustRecalculateOptimalCharacterPerSecond = Se.Settings.Tools.AdjustDurations.AdjustDurationOptimalCps; + ExtendOnly = Se.Settings.Tools.AdjustDurations.AdjustDurationExtendOnly; SelectedAdjustType = AdjustTypes.FirstOrDefault(p => p.Type.ToString() == Se.Settings.Tools.AdjustDurations.AdjustDurationLast) @@ -171,6 +180,7 @@ private void SaveSettings() Se.Settings.Tools.AdjustDurations.AdjustDurationFixed = AdjustFixed; Se.Settings.Tools.AdjustDurations.AdjustDurationMaximumCps = AdjustRecalculateMaxCharacterPerSecond; Se.Settings.Tools.AdjustDurations.AdjustDurationOptimalCps = AdjustRecalculateOptimalCharacterPerSecond; + Se.Settings.Tools.AdjustDurations.AdjustDurationExtendOnly = ExtendOnly; Se.Settings.Tools.AdjustDurations.AdjustDurationLast = SelectedAdjustType.Type.ToString(); diff --git a/src/UI/Features/Tools/AdjustDuration/AdjustDurationWindow.cs b/src/UI/Features/Tools/AdjustDuration/AdjustDurationWindow.cs index ec9e7bf0f7f..ca8b309fcfa 100644 --- a/src/UI/Features/Tools/AdjustDuration/AdjustDurationWindow.cs +++ b/src/UI/Features/Tools/AdjustDuration/AdjustDurationWindow.cs @@ -286,6 +286,7 @@ private static Grid MakeAdjustRecalculate(AdjustDurationViewModel vm) { new RowDefinition { Height = new GridLength(1, GridUnitType.Auto) }, new RowDefinition { Height = new GridLength(1, GridUnitType.Auto) }, + new RowDefinition { Height = new GridLength(1, GridUnitType.Auto) }, }, HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Center, @@ -293,6 +294,19 @@ private static Grid MakeAdjustRecalculate(AdjustDurationViewModel vm) Margin = new Thickness(10, 25, 0, 0), }; + var checkBoxExtendOnly = new CheckBox + { + Content = Se.Language.Tools.AdjustDurations.ExtendOnly, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(10, 0, 0, 0), + }; + checkBoxExtendOnly.Bind(CheckBox.IsCheckedProperty, new Binding + { + Path = nameof(vm.ExtendOnly), + Mode = BindingMode.TwoWay, + Source = vm, + }); + grid.Children.Add(textBlockMax); Grid.SetColumn(textBlockMax, 0); @@ -307,6 +321,8 @@ private static Grid MakeAdjustRecalculate(AdjustDurationViewModel vm) Grid.SetColumn(numericUpDownOptimal, 1); Grid.SetRow(numericUpDownOptimal, 1); + grid.Add(checkBoxExtendOnly, 2, 1); + grid.Bind(Grid.IsVisibleProperty, new Binding { Path = $"{nameof(vm.SelectedAdjustType)}.{nameof(AdjustDurationDisplay.IsRecalculateVisible)}", From 443d2eb81e73030d001d6e0cf9c4c4435d6e8afb Mon Sep 17 00:00:00 2001 From: "nikolaj.olsson" Date: Tue, 7 Apr 2026 14:29:55 +0200 Subject: [PATCH 45/74] Update change log --- ChangeLog.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index aa241af31bf..dbdb82fa847 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -12,7 +12,9 @@ v5.0.0-beta14 (xth April 2026) * Fix italic in text box for edit image ocr db * Fix for mpv refresh for full screeen player * Fix: Allow large text files in batch-convert - thx phannhanhn201 - +* Add toggle select sub while playing to video menu (+shortcut) - thx vsemozhetbyt +* Add "Extend only" to adjust durations - thx Dravic +* Fix for nOCR load - thx HellbringerOnline ----------------------------------------------------------------------------------------------------- From 9bbf6c4a0bb84dbf456ad65694bdc5f280e5b1a7 Mon Sep 17 00:00:00 2001 From: "nikolaj.olsson" Date: Tue, 7 Apr 2026 17:55:32 +0200 Subject: [PATCH 46/74] Try to fix nOCR expanded issue --- .../Features/Ocr/NOcr/NOcrInspectViewModel.cs | 44 ++++++++++++------- src/UI/Features/Ocr/OcrViewModel.cs | 3 +- src/UI/Logic/Ocr/ExpandedOcrGroup.cs | 4 +- 3 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/UI/Features/Ocr/NOcr/NOcrInspectViewModel.cs b/src/UI/Features/Ocr/NOcr/NOcrInspectViewModel.cs index 87fe103a3cd..e789cfc8204 100644 --- a/src/UI/Features/Ocr/NOcr/NOcrInspectViewModel.cs +++ b/src/UI/Features/Ocr/NOcr/NOcrInspectViewModel.cs @@ -61,6 +61,8 @@ public partial class NOcrInspectViewModel : ObservableObject private NOcrDb _nOcrDb; private int _maxWrongPixels; private NikseBitmap2 _nBmp; + private NikseBitmap2? _displayBitmap; + private SKRect _displayRect; private OcrSubtitleItem? _ocrSubtitleItem; private NOcrAddHistoryManager _nOcrAddHistoryManager; private bool _isControlDown = false; @@ -131,9 +133,9 @@ internal void Initialize(SKBitmap sKBitmap, NikseBitmap2 nBmp, OcrSubtitleItem? private void InitSentenceBitmap() { var skBitmap = _sentenceBitmapOriginal.Copy(); - if (_splitItem.NikseBitmap != null) + if (_displayBitmap != null) { - var rect = new SKRect(_splitItem.X, _splitItem.Y, _splitItem.X + _splitItem.NikseBitmap.Width, _splitItem.Y + _splitItem.NikseBitmap.Height); + var rect = _displayRect; using (var canvas = new SKCanvas(skBitmap)) { using (var paint = new SKPaint @@ -189,10 +191,10 @@ private async Task Update() item.Italic = IsNewTextItalic; // Sync canvas lines back to NOcrChar (canvas stores bitmap-space coords, NOcrChar stores its own coord space) - if (_splitItem.NikseBitmap != null) + if (_displayBitmap != null) { - var bitmapWidth = _splitItem.NikseBitmap.Width; - var bitmapHeight = _splitItem.NikseBitmap.Height; + var bitmapWidth = _displayBitmap.Width; + var bitmapHeight = _displayBitmap.Height; item.LinesForeground.Clear(); foreach (var line in NOcrDrawingCanvas.HitPaths) @@ -289,8 +291,7 @@ private async Task AddBetterMatch() if (addVm.OkPressed) { - var letterBitmap = _letters[LetterIndex].NikseBitmap; - _nOcrAddHistoryManager.Add(addVm.NOcrChar, letterBitmap, 0); + _nOcrAddHistoryManager.Add(addVm.NOcrChar, addVm.PreviewBitmap, 0); _nOcrDb.Add(addVm.NOcrChar); _ = Task.Run(_nOcrDb.Save); ReloadMatches(); @@ -332,7 +333,7 @@ private void DrawAgain() { NOcrChar.LinesForeground.Clear(); NOcrChar.LinesBackground.Clear(); - NOcrChar.GenerateLineSegments(SelectedNoOfLinesToAutoDraw, false, NOcrChar, _splitItem.NikseBitmap!); + NOcrChar.GenerateLineSegments(SelectedNoOfLinesToAutoDraw, false, NOcrChar, _displayBitmap!); ShowOcrPoints(); } @@ -392,10 +393,10 @@ private void ShowOcrPoints() NOcrDrawingCanvas.MissPaths.Clear(); NOcrDrawingCanvas.HitPaths.Clear(); - if (_splitItem.NikseBitmap != null) + if (_displayBitmap != null) { - var bitmapWidth = _splitItem.NikseBitmap.Width; - var bitmapHeight = _splitItem.NikseBitmap.Height; + var bitmapWidth = _displayBitmap.Width; + var bitmapHeight = _displayBitmap.Height; foreach (var line in NOcrChar.LinesForeground) { @@ -512,9 +513,22 @@ private void OnLetterClicked(int index, NOcrChar? match) NewText = match?.Text ?? string.Empty; IsNewTextItalic = match is { Italic: true }; - ResolutionAndTopMargin = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, _splitItem.NikseBitmap.Width, _splitItem.NikseBitmap.Height, _splitItem.Top); - CurrentBitmap = _splitItem.NikseBitmap!.GetBitmap().ToAvaloniaBitmap(); + _displayBitmap = _splitItem.NikseBitmap; + _displayRect = new SKRect(_splitItem.X, _splitItem.Y, _splitItem.X + _splitItem.NikseBitmap.Width, _splitItem.Y + _splitItem.NikseBitmap.Height); + if (match is { ExpandCount: > 1 }) + { + var expandedGroup = ExpandedOcrGroup.Create(_nBmp, _letters, index, match.ExpandCount); + if (expandedGroup != null) + { + _displayBitmap = expandedGroup.PreviewBitmap; + _displayRect = new SKRect(expandedGroup.Bounds.Left, expandedGroup.Bounds.Top, expandedGroup.Bounds.Right, expandedGroup.Bounds.Bottom); + } + } + + ResolutionAndTopMargin = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, _displayBitmap.Width, _displayBitmap.Height, _splitItem.Top); + + CurrentBitmap = _displayBitmap!.GetBitmap().ToAvaloniaBitmap(); NOcrDrawingCanvas.BackgroundImage = CurrentBitmap; if (match == null) @@ -525,8 +539,8 @@ private void OnLetterClicked(int index, NOcrChar? match) } else { - var bitmapWidth = _splitItem.NikseBitmap.Width; - var bitmapHeight = _splitItem.NikseBitmap.Height; + var bitmapWidth = _displayBitmap.Width; + var bitmapHeight = _displayBitmap.Height; NOcrDrawingCanvas.HitPaths.Clear(); foreach (var line in match.LinesForeground) diff --git a/src/UI/Features/Ocr/OcrViewModel.cs b/src/UI/Features/Ocr/OcrViewModel.cs index adc298f3e15..037238d3f13 100644 --- a/src/UI/Features/Ocr/OcrViewModel.cs +++ b/src/UI/Features/Ocr/OcrViewModel.cs @@ -1858,8 +1858,7 @@ private async Task RunNOcrLoop(List selectedIndices, CancellationToken canc if (result.OkPressed) { - var letterBitmap = letters[letterIndex].NikseBitmap; - _nOcrAddHistoryManager.Add(result.NOcrChar, letterBitmap, + _nOcrAddHistoryManager.Add(result.NOcrChar, result.PreviewBitmap, OcrSubtitleItems.IndexOf(item)); IsInspectAdditionsVisible = true; _nOcrDb.Add(result.NOcrChar); diff --git a/src/UI/Logic/Ocr/ExpandedOcrGroup.cs b/src/UI/Logic/Ocr/ExpandedOcrGroup.cs index 108eab0eb0a..65a9f69c3a0 100644 --- a/src/UI/Logic/Ocr/ExpandedOcrGroup.cs +++ b/src/UI/Logic/Ocr/ExpandedOcrGroup.cs @@ -40,8 +40,8 @@ private ExpandedOcrGroup( var minTop = int.MaxValue; var minX = int.MaxValue; var minY = int.MaxValue; - var maxX = 0; - var maxY = 0; + var maxX = int.MinValue; + var maxY = int.MinValue; for (var i = startIndex; i < startIndex + count; i++) { From c2c6ce2767ef4e0c3f1f33fc22e33cc3e5ff86a7 Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Tue, 7 Apr 2026 17:58:26 +0200 Subject: [PATCH 47/74] Italian language update --- src/UI/Assets/Languages/Italian.json | 54 +++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/src/UI/Assets/Languages/Italian.json b/src/UI/Assets/Languages/Italian.json index b52c79c8c96..7ea3de64be9 100644 --- a/src/UI/Assets/Languages/Italian.json +++ b/src/UI/Assets/Languages/Italian.json @@ -1,6 +1,6 @@ { "Title": "SubtitleEdit", - "TranslatedBy": "v. 03.04.2026 di bovirus", + "TranslatedBy": "v. 07.04.2026 di bovirus", "CultureName": "it-IT", "General": { "Abort": "Annulla", @@ -647,7 +647,14 @@ "RightMargin": "Margine destro", "Installed": "Installato", "AdvancedDotDotDot": "Avanzate...", - "ChooseAlignment": "Scegli allineamento" + "ChooseAlignment": "Scegli allineamento", + "MaxWidthPixels": "Larghezza massima (pixel)", + "SampleText": "Esempio testo", + "BoxWidthPixels": "Larghezza riquadro (pixel)", + "FadeInOut": "Dissolvenza in entrata/uscita", + "Alpha": "Alfa", + "PickResolution": "Scegli risoluzione", + "ManualSync": "Sincronizzazione manuale" }, "Main": { "AudioTrackIsNowX": "La traccia audio ora è \"{0}", @@ -1404,7 +1411,14 @@ "EditStyles": "Modifica stili", "EditProperties": "Modifica proprietà", "EditAttachments": "Modifica allegati", - "ErrorsExportedX": "Errori esportati: {0}" + "ErrorsExportedX": "Errori esportati: {0}", + "SlowFontSizeChange": "Modifica lenta dimensione font", + "IncreaseFontKerning": "Aumenta kerning font", + "ScrollUp": "Scorri verso l'alto", + "ScrollDown": "Scorrere verso il basso", + "RotateIn": "Ruota in", + "TiltBounce": "Rimbalzo inclinazione", + "FontSizeBounceIn": "Rimbalzo dimensione font in" }, "ChangeCasing": { "Title": "Modifica maiuscolo/minuscolo", @@ -1454,7 +1468,9 @@ }, "MergeShortLines": { "Title": "Unisci righe brevi", - "HighlightParts": "Evidenzia parti (karaoke)" + "HighlightParts": "Evidenzia parti (karaoke)", + "MergedLineInfo": "Riga {0} unita in {1} - {2}", + "LinesMergedX": "Righe unite: {0}" }, "MergeLinesWithSameText": { "Title": "Unisci righe con lo stesso testo", @@ -1472,7 +1488,23 @@ "NothingToReport": "Nessun problema rilevato.", "SaveNetflixQualityReport": "Salva rapporto qualità Netflix", "NetflixReportSaved": "Rapporto qualità Netflix salvato", - "NetFlixQualityReportSavedToX": "Rapporto qualità Netflix salvato in:\r\n\r\n{0}" + "NetFlixQualityReportSavedToX": "Rapporto qualità Netflix salvato in:\r\n\r\n{0}", + "DialogHyphenSpace": "Spazio trattino di dialogo", + "EllipsesNotThreeDots": "Usa ellissi (non tre punti)", + "OnlyAllowedGlyphs": "Sono consentiti solo glifi", + "Italics": "Corsivo", + "MaxCharsSec": "Caratteri massimi/sec", + "MaxDuration": "Durata massima", + "MaxLineLength": "Lunghezza massima riga", + "MinDuration": "Durata minima", + "MaxNumberOfLines": "Numero massimo di righe", + "OneToTenSpellOut": "Indica da uno a dieci", + "ShotChanges": "Cambi di scena", + "StartNumberSpellOut": "Indica il numero di partenza", + "TextforHiUseBrackets": "Testo per HI, usa parentesi", + "FrameRate": "Frequenza fotogrammi", + "TwoFrameGrap": "Gap tra due fotogrammi", + "WhiteSpace": "Spazio bianco" }, "ImageBasedEdit": { "EditImagedBaseSubtitle": "Modifica sottotitoli basati su immagini", @@ -1612,7 +1644,8 @@ "OutputProperties": "Proprietà output...", "VideoFileSize": "Dimensioni file video", "OneBox": "Un box", - "BoxPerLine": "CasellBox per riga" + "BoxPerLine": "CasellBox per riga", + "LogoInfo": "Scegli un'immagine PNG e trascinala per posizionarla sul video." }, "VideoTransparent": { "Title": "Genera video trasparenti con sottotitoli", @@ -1693,7 +1726,8 @@ "EdgeTtsPitch": "Tono Edge-TTS", "EdgeTtsPitchDescription": "Regolazione tono Edge-TTS, ad es.\r\n\"+10Hz\", \"-5Hz\" o \"+0Hz\" per impostazione predefinita.", "EdgeTtsVolume": "Volume Edge-TTS", - "EdgeTtsVolumeDescription": "Regolazione volume Edge-TTS, ad es.\r\n\"+20%\", \"-10%\" o \"+0%\" per impostazione predefinita." + "EdgeTtsVolumeDescription": "Regolazione volume Edge-TTS, ad es.\r\n\"+20%\", \"-10%\" o \"+0%\" per impostazione predefinita.", + "DownloadPiperPrompt": "La \"sintesi vocale\" richiede Piper.\r\n\r\nVuoi scaricare e usare Piper?" }, "ShotChanges": { "TitleGenerateOrImport": "Genera/importa cambi inquadrature", @@ -1784,7 +1818,8 @@ "LineMerge": "Unione riga", "DelayInSecondsBetweenRequests": "Ritardo tra le richieste (secondi)", "MaxBytesPerRequest": "Numero massimo byte per richiesta", - "PromptText": "Testo suggerito" + "PromptText": "Testo suggerito", + "TranslateEachLineSeparately": "Traduci ogni riga separatamente" }, "Options": { "Settings": { @@ -2043,7 +2078,8 @@ "UiScale": "Scala interfaccia utente (%)", "WaveformToolbarItems": "Elementi barra strumenti forma d'onda", "MatchIconColorToDarkTheme": "Abbina colore icona al colore di primo piano del tema scuro", - "SubtitlePreviewProperties": "Proprietà anteprima sottotitoli" + "SubtitlePreviewProperties": "Proprietà anteprima sottotitoli", + "PixelWidthInfo": "Linee verdi = limite larghezza massima | Area rossa = il testo supera il limite" }, "Shortcuts": { "Title": "Tasti rapidi", From d7a7d1de9b90d0e4029ce3e445628e587af24fc1 Mon Sep 17 00:00:00 2001 From: niksedk Date: Tue, 7 Apr 2026 19:31:24 +0200 Subject: [PATCH 48/74] Fix for ASSA advanced effect fancy karaoke --- ChangeLog.txt | 2 ++ .../AssaApplyAdvancedEffectWindow.cs | 5 ----- .../Effects/AdvancedEffectFancyKaraoke.cs | 13 ++++--------- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index dbdb82fa847..e7e33c90250 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -15,6 +15,8 @@ v5.0.0-beta14 (xth April 2026) * Add toggle select sub while playing to video menu (+shortcut) - thx vsemozhetbyt * Add "Extend only" to adjust durations - thx Dravic * Fix for nOCR load - thx HellbringerOnline +* Fix for nOCR expanded view - thx HellbringerOnline +* Fix toolbar separator visibility not updating when setting changes - thx ivandrofly ----------------------------------------------------------------------------------------------------- diff --git a/src/UI/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectWindow.cs b/src/UI/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectWindow.cs index 8a2f78546e9..b3b3bf1d051 100644 --- a/src/UI/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectWindow.cs +++ b/src/UI/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectWindow.cs @@ -98,16 +98,11 @@ public AssaApplyAdvancedEffectWindow(AssaApplyAdvancedEffectViewModel vm) inactiveColorRow.Children.Add(new TextBlock { Text = Se.Language.Assa.AdvancedEffectFancyKaraokeInactiveColor, VerticalAlignment = VerticalAlignment.Center, FontSize = 12 }); inactiveColorRow.Children.Add(UiUtil.MakeColorPicker(fancyKaraokeItem, nameof(AdvancedEffectFancyKaraoke.InactiveWordColor))); - var opacityRow = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 8, Margin = new Thickness(0, 6, 0, 0) }; - opacityRow.Children.Add(new TextBlock { Text = Se.Language.Assa.AdvancedEffectFancyKaraokeInactiveOpacity, VerticalAlignment = VerticalAlignment.Center, FontSize = 12 }); - opacityRow.Children.Add(UiUtil.MakeNumericUpDownInt(0, 255, 0x90, 130, fancyKaraokeItem, nameof(AdvancedEffectFancyKaraoke.InactiveAlpha))); - var settingsStack = new StackPanel { Spacing = 2 }; settingsStack.Children.Add(autoDetectActiveWordRow); settingsStack.Children.Add(activeGlowRow); settingsStack.Children.Add(activeColorRow); settingsStack.Children.Add(inactiveColorRow); - settingsStack.Children.Add(opacityRow); panel.Children.Add(settingsStack); } else if (item is AdvancedEffectWordSpacing wordSpacingItem) diff --git a/src/UI/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectFancyKaraoke.cs b/src/UI/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectFancyKaraoke.cs index dc0a302b2b5..497d64ada2b 100644 --- a/src/UI/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectFancyKaraoke.cs +++ b/src/UI/Features/Assa/AssaApplyAdvancedEffect/Effects/AdvancedEffectFancyKaraoke.cs @@ -29,12 +29,7 @@ public class AdvancedEffectFancyKaraoke : IAdvancedEffectDisplay /// When true, ignore explicit active-word markup and auto-sequence whole words /// (one subtitle per word, timing = duration / wordCount). ///
- public bool AutoDetectActiveWord { get; set; } = true; - - /// - /// Alpha value used for inactive words (ASS \alpha uses hex). - /// - public int InactiveAlpha { get; set; } = 200; + public bool AutoDetectActiveWord { get; set; } = false; /// /// Glow color used for the active word's 3c (ASS BGR). @@ -50,7 +45,7 @@ public class AdvancedEffectFancyKaraoke : IAdvancedEffectDisplay /// Color used for inactive words' primary color (\1c). Default dim gray. /// This ensures color is explicitly reset after the active word so subsequent words are not colored. /// - public Color InactiveWordColor { get; set; } = Color.FromRgb(0x80, 0x80, 0x80); + public Color InactiveWordColor { get; set; } = Color.FromArgb(0xEE, 0xEE, 0xEE, 0xEE); /// /// When true, apply the glow (3c, blur, scale transform) to the active word. @@ -88,7 +83,7 @@ public List ApplyEffect( if (!string.IsNullOrEmpty(posTags)) sb.Append(posTags); // Inactive tags now explicitly set \1c to InactiveWordColor so color resets after active word. - string inactiveTags = $"{{\\alpha&H{(255 -InactiveAlpha):X2}&\\1c{ToAssColor(InactiveWordColor)}\\bord0\\shad0\\blur0\\fscx100\\fscy100}}"; + string inactiveTags = $"{{\\alpha&H{(255 -InactiveWordColor.A):X2}&\\1c{ToAssColor(InactiveWordColor)}\\bord0\\shad0\\blur0\\fscx100\\fscy100}}"; if (parsed == null || string.IsNullOrEmpty(parsed.Value.Active)) { @@ -157,7 +152,7 @@ public List ApplyEffect( string posTags = ExtractPositionalTags(sub.Text); // Inactive tags explicitly include InactiveWordColor so color is reset for non-active words and spaces. - string inactiveTags = $"{{\\alpha&H{InactiveAlpha:X2}&\\1c{ToAssColor(InactiveWordColor)}\\bord0\\shad0\\blur0\\fscx100\\fscy100}}"; + string inactiveTags = $"{{\\alpha&H{255 - InactiveWordColor.A:X2}&\\1c{ToAssColor(InactiveWordColor)}\\bord0\\shad0\\blur0\\fscx100\\fscy100}}"; // Build active tag depending on ApplyGlow string activeTags; From 93a6a5a29e3ac3f4a6693af1ec7d4173940ee5b2 Mon Sep 17 00:00:00 2001 From: "Hellgringer.Online" Date: Tue, 7 Apr 2026 22:17:33 +0400 Subject: [PATCH 49/74] Add patch for nOCR two-byte character handling fix --- ...wo-byte-character-load-save-handling.patch | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 patches-github/0001-Fix-nOCR-two-byte-character-load-save-handling.patch diff --git a/patches-github/0001-Fix-nOCR-two-byte-character-load-save-handling.patch b/patches-github/0001-Fix-nOCR-two-byte-character-load-save-handling.patch new file mode 100644 index 00000000000..a08da059f0a --- /dev/null +++ b/patches-github/0001-Fix-nOCR-two-byte-character-load-save-handling.patch @@ -0,0 +1,40 @@ +From cf2d41ec49863362fc0e876f1cf20a26a3b1a20e Mon Sep 17 00:00:00 2001 +From: "Hellgringer.Online" +Date: Mon, 6 Apr 2026 21:43:29 +0400 +Subject: [PATCH] Fix nOCR two-byte character load/save handling + +--- + src/UI/Logic/Ocr/NOcrChar.cs | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/src/UI/Logic/Ocr/NOcrChar.cs b/src/UI/Logic/Ocr/NOcrChar.cs +index d53a2a070..30fb539bb 100644 +--- a/src/UI/Logic/Ocr/NOcrChar.cs ++++ b/src/UI/Logic/Ocr/NOcrChar.cs +@@ -87,6 +87,7 @@ public class NOcrChar + } + else + { ++ position++; + ExpandCount = file[position++]; + Width = file[position++] << 8 | file[position++]; + Height = file[position++] << 8 | file[position++]; +@@ -179,7 +180,7 @@ public class NOcrChar + { + return Width <= byte.MaxValue && Height <= byte.MaxValue && ExpandCount < 16 && + LinesBackground.Count <= byte.MaxValue && LinesForeground.Count <= byte.MaxValue && +- IsAllPointByteValues(LinesForeground) && IsAllPointByteValues(LinesForeground); ++ IsAllPointByteValues(LinesForeground) && IsAllPointByteValues(LinesBackground); + } + + private static bool IsAllPointByteValues(List lines) +@@ -632,4 +633,4 @@ public class NOcrChar + lines.RemoveAt(i); + } + } +-} +\ No newline at end of file ++} +-- +2.53.0.windows.2 + From ba9f1899bd9d8a23f5a9925539864f1871b41eeb Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Tue, 7 Apr 2026 20:45:46 +0200 Subject: [PATCH 50/74] Minor clean --- tests/UI/Logic/Ocr/NOcrCharTests.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/UI/Logic/Ocr/NOcrCharTests.cs b/tests/UI/Logic/Ocr/NOcrCharTests.cs index 08d806214f7..09adcdbfe55 100644 --- a/tests/UI/Logic/Ocr/NOcrCharTests.cs +++ b/tests/UI/Logic/Ocr/NOcrCharTests.cs @@ -50,7 +50,7 @@ public void SaveLoad_FewLines_RoundTripsCorrectly() Assert.Equal(original.MarginTop, loaded.MarginTop); Assert.Equal(original.Italic, loaded.Italic); Assert.Equal(2, loaded.LinesForeground.Count); - Assert.Equal(1, loaded.LinesBackground.Count); + Assert.Single(loaded.LinesBackground); Assert.Equal(original.LinesForeground[0].Start.X, loaded.LinesForeground[0].Start.X); Assert.Equal(original.LinesForeground[0].Start.Y, loaded.LinesForeground[0].Start.Y); Assert.Equal(original.LinesForeground[0].End.X, loaded.LinesForeground[0].End.X); @@ -82,7 +82,7 @@ public void SaveLoad_MoreThan255ForegroundLines_RoundTripsCorrectly() Assert.Equal(original.Height, loaded.Height); Assert.Equal(original.MarginTop, loaded.MarginTop); Assert.Equal(260, loaded.LinesForeground.Count); - Assert.Equal(1, loaded.LinesBackground.Count); + Assert.Single(loaded.LinesBackground); Assert.Equal(original.LinesForeground[0].Start.X, loaded.LinesForeground[0].Start.X); Assert.Equal(original.LinesForeground[0].Start.Y, loaded.LinesForeground[0].Start.Y); Assert.Equal(original.LinesForeground[259].End.X, loaded.LinesForeground[259].End.X); @@ -109,8 +109,8 @@ public void SaveLoad_MarginTopMoreThan255_RoundTripsCorrectly() Assert.Equal(original.Width, loaded.Width); Assert.Equal(original.Height, loaded.Height); Assert.Equal(300, loaded.MarginTop); - Assert.Equal(1, loaded.LinesForeground.Count); - Assert.Equal(1, loaded.LinesBackground.Count); + Assert.Single(loaded.LinesForeground); + Assert.Single(loaded.LinesBackground); Assert.Equal(original.LinesForeground[0].Start.X, loaded.LinesForeground[0].Start.X); Assert.Equal(original.LinesForeground[0].End.Y, loaded.LinesForeground[0].End.Y); } From 78983160b8daec0814efec2c8bf388ab0bc56825 Mon Sep 17 00:00:00 2001 From: "Hellgringer.Online" Date: Tue, 7 Apr 2026 23:57:50 +0400 Subject: [PATCH 51/74] Fix full preview in inspect image matches --- .../BinaryOcr/BinaryOcrInspectViewModel.cs | 72 +++++++++++++------ src/UI/Features/Ocr/OcrViewModel.cs | 10 ++- 2 files changed, 60 insertions(+), 22 deletions(-) diff --git a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrInspectViewModel.cs b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrInspectViewModel.cs index 733d7146b44..b9fbb5f300e 100644 --- a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrInspectViewModel.cs +++ b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrInspectViewModel.cs @@ -55,6 +55,9 @@ public partial class BinaryOcrInspectViewModel : ObservableObject private BinaryOcrDb _db; private double _maxErrorPercent; private NikseBitmap2 _nBmp; + private NikseBitmap2? _displayBitmap; + private SKRectI _displayBounds; + private int _displayTopMargin; private OcrSubtitleItem? _ocrSubtitleItem; private int _maxWrongPixels; private BinaryOcrAddHistoryManager _binaryOcrAddHistoryManager; @@ -129,9 +132,9 @@ internal void Initialize( private void InitSentenceBitmap() { var skBitmap = _sentenceBitmapOriginal.Copy(); - if (_splitItem.NikseBitmap != null) + if (_displayBitmap != null) { - var rect = new SKRect(_splitItem.X, _splitItem.Y, _splitItem.X + _splitItem.NikseBitmap.Width, _splitItem.Y + _splitItem.NikseBitmap.Height); + var rect = new SKRect(_displayBounds.Left, _displayBounds.Top, _displayBounds.Right, _displayBounds.Bottom); using (var canvas = new SKCanvas(skBitmap)) { using (var paint = new SKPaint @@ -386,22 +389,38 @@ private void OnLetterClicked(int index, BinaryOcrMatcher.CompareMatch? match) { LetterIndex = index; _splitItem = _letters[index]; + _displayBitmap = null; + _displayBounds = default; + _displayTopMargin = 0; + var expandedGroup = match is { ExpandCount: > 1 } + ? ExpandedOcrGroup.Create(_nBmp, _letters, index, match.ExpandCount) + : null; IsEditControlsEnabled = match != null; CanAddBetterMatch = match != null && match.ImageSplitterItem?.NikseBitmap != null; if (_splitItem.NikseBitmap != null) { - var x = new BinaryOcrBitmap(_splitItem.NikseBitmap) + BinaryOcrBitmap x; + if (expandedGroup != null) { - X = _splitItem.X, - Y = _splitItem.Top, - Text = match?.Text ?? string.Empty, - Italic = match?.Italic ?? false - }; - CanAddBetterMatch = _db.FindExactMatch(x) < 0; + x = expandedGroup.CreateBinaryOcrBitmap(); + } + else + { + x = new BinaryOcrBitmap(_splitItem.NikseBitmap); + } + + x.X = _splitItem.X; + x.Y = _splitItem.Top; + x.Text = match?.Text ?? string.Empty; + x.Italic = match?.Italic ?? false; + CanAddBetterMatch = match is { ExpandCount: > 1 } + ? _db.FindExactMatchExpanded(x) < 0 + : _db.FindExactMatch(x) < 0; } + var matchResolution = string.Empty; if (match != null && _splitItem.NikseBitmap != null) { // Try to find the actual BinaryOcrBitmap from the database @@ -415,17 +434,9 @@ private void OnLetterClicked(int index, BinaryOcrMatcher.CompareMatch? match) if (dbBitmap != null) { - MatchResolutionAndTopMargin = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, dbBitmap.Width, dbBitmap.Height, dbBitmap.Y); - } - else - { - MatchResolutionAndTopMargin = string.Empty; + matchResolution = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, dbBitmap.Width, dbBitmap.Height, dbBitmap.Y); } } - else - { - MatchResolutionAndTopMargin = string.Empty; - } if (_splitItem.NikseBitmap != null) { @@ -439,9 +450,30 @@ private void OnLetterClicked(int index, BinaryOcrMatcher.CompareMatch? match) NewText = match?.Text ?? string.Empty; IsNewTextItalic = match is { Italic: true }; - ResolutionAndTopMargin = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, _splitItem.NikseBitmap.Width, _splitItem.NikseBitmap.Height, _splitItem.Top); + _displayBitmap = _splitItem.NikseBitmap; + _displayBounds = new SKRectI(_splitItem.X, _splitItem.Y, _splitItem.X + _splitItem.NikseBitmap.Width, _splitItem.Y + _splitItem.NikseBitmap.Height); + _displayTopMargin = _splitItem.Top; + + if (expandedGroup != null) + { + _displayBitmap = expandedGroup.PreviewBitmap; + _displayBounds = expandedGroup.Bounds; + _displayTopMargin = expandedGroup.PreviewTopMargin; + BinaryOcrBitmap = expandedGroup.CreateBinaryOcrBitmap(); + BinaryOcrBitmap.Text = match?.Text ?? string.Empty; + BinaryOcrBitmap.Italic = match?.Italic ?? false; + } + + ResolutionAndTopMargin = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, _displayBitmap.Width, _displayBitmap.Height, _displayTopMargin); + MatchResolutionAndTopMargin = expandedGroup != null + ? ResolutionAndTopMargin + : matchResolution; - CurrentBitmap = _splitItem.NikseBitmap!.GetBitmap().ToAvaloniaBitmap(); + CurrentBitmap = _displayBitmap.GetBitmap().ToAvaloniaBitmap(); + } + else + { + MatchResolutionAndTopMargin = matchResolution; } InitSentenceBitmap(); diff --git a/src/UI/Features/Ocr/OcrViewModel.cs b/src/UI/Features/Ocr/OcrViewModel.cs index 037238d3f13..19af42b191b 100644 --- a/src/UI/Features/Ocr/OcrViewModel.cs +++ b/src/UI/Features/Ocr/OcrViewModel.cs @@ -1904,7 +1904,13 @@ await _windowService } else { - matches.Add(new NOcrChar { Text = _nOcrCaseFixer.FixUppercaseLowercaseIssues(splitterItem, match), Italic = match.Italic, ImageSplitterItem = splitterItem }); + var inspectMatch = new NOcrChar(match) + { + Text = _nOcrCaseFixer.FixUppercaseLowercaseIssues(splitterItem, match), + ExpandCount = match.ExpandCount, + ImageSplitterItem = splitterItem, + }; + matches.Add(inspectMatch); } } @@ -3458,4 +3464,4 @@ internal void DataGridSubtitleMacPointerReleased(object? sender, PointerReleased e.Handled = true; } } -} \ No newline at end of file +} From 9431576f5648d1ac6e781ca95a928d872539e9f2 Mon Sep 17 00:00:00 2001 From: "Hellgringer.Online" Date: Wed, 8 Apr 2026 00:09:22 +0400 Subject: [PATCH 52/74] Apply expanded OCR inspect additions preview changes --- .../Ocr/BinaryOcr/BinaryOcrAddHistoryItem.cs | 8 +++++--- .../Ocr/BinaryOcr/BinaryOcrAddHistoryManager.cs | 4 ++-- .../BinaryOcrCharacterHistoryViewModel.cs | 15 +++++++++++---- .../Ocr/BinaryOcr/BinaryOcrInspectViewModel.cs | 4 ++-- src/UI/Features/Ocr/NOcr/NOcrAddHistoryItem.cs | 6 +++--- .../Features/Ocr/NOcr/NOcrAddHistoryManager.cs | 4 ++-- .../Ocr/NOcr/NOcrCharacterHistoryViewModel.cs | 6 +++--- .../Features/Ocr/NOcr/NOcrInspectViewModel.cs | 17 ++++++++++++++--- src/UI/Features/Ocr/OcrViewModel.cs | 7 ++++--- 9 files changed, 46 insertions(+), 25 deletions(-) diff --git a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrAddHistoryItem.cs b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrAddHistoryItem.cs index ffb9d358747..0acb3da188a 100644 --- a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrAddHistoryItem.cs +++ b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrAddHistoryItem.cs @@ -6,14 +6,16 @@ namespace Nikse.SubtitleEdit.Features.Ocr.BinaryOcr; public class BinaryOcrAddHistoryItem { public BinaryOcrBitmap BinaryOcrBitmap { get; set; } - public NikseBitmap2? Bitmap { get; set; } + public NikseBitmap2? PreviewBitmap { get; set; } + public int PreviewTopMargin { get; set; } public int LineIndex { get; set; } public DateTime DateTime { get; set; } - public BinaryOcrAddHistoryItem(BinaryOcrBitmap binaryOcrBitmap, NikseBitmap2? bitmap, int lineIndex) + public BinaryOcrAddHistoryItem(BinaryOcrBitmap binaryOcrBitmap, NikseBitmap2? previewBitmap, int previewTopMargin, int lineIndex) { BinaryOcrBitmap = binaryOcrBitmap; - Bitmap = bitmap; + PreviewBitmap = previewBitmap == null ? null : new NikseBitmap2(previewBitmap); + PreviewTopMargin = previewTopMargin; DateTime = DateTime.Now; LineIndex = lineIndex; } diff --git a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrAddHistoryManager.cs b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrAddHistoryManager.cs index cd1329956e9..4f6b7d7ab4f 100644 --- a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrAddHistoryManager.cs +++ b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrAddHistoryManager.cs @@ -12,14 +12,14 @@ public BinaryOcrAddHistoryManager() Items = new List(); } - public void Add(BinaryOcrBitmap binaryOcrBitmap, NikseBitmap2? letterBitmap, int lineIndex) + public void Add(BinaryOcrBitmap binaryOcrBitmap, NikseBitmap2? previewBitmap, int previewTopMargin, int lineIndex) { if (binaryOcrBitmap == null) { return; } - var item = new BinaryOcrAddHistoryItem(binaryOcrBitmap, letterBitmap, lineIndex); + var item = new BinaryOcrAddHistoryItem(binaryOcrBitmap, previewBitmap, previewTopMargin, lineIndex); Items.Add(item); } diff --git a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrCharacterHistoryViewModel.cs b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrCharacterHistoryViewModel.cs index 40256067986..bd3c680bf22 100644 --- a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrCharacterHistoryViewModel.cs +++ b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrCharacterHistoryViewModel.cs @@ -214,16 +214,23 @@ private void HistoryItemChanged() return; } - if (selectedItem.Bitmap != null) + if (selectedItem.PreviewBitmap != null) { - CurrentBitmap = selectedItem.Bitmap.GetBitmap().ToAvaloniaBitmap(); + CurrentBitmap = selectedItem.PreviewBitmap.GetBitmap().ToAvaloniaBitmap(); } BinaryOcrBitmap = selectedItem.BinaryOcrBitmap; IsNewTextItalic = BinaryOcrBitmap.Italic; NewText = BinaryOcrBitmap.Text ?? string.Empty; LineIndex = string.Format(Se.Language.Ocr.LineIndexX, selectedItem.LineIndex + 1); - ResolutionAndTopMargin = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, BinaryOcrBitmap.Width, BinaryOcrBitmap.Height, BinaryOcrBitmap.Y); + if (BinaryOcrBitmap.ExpandCount > 1 && selectedItem.PreviewBitmap != null) + { + ResolutionAndTopMargin = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, selectedItem.PreviewBitmap.Width, selectedItem.PreviewBitmap.Height, selectedItem.PreviewTopMargin); + } + else + { + ResolutionAndTopMargin = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, BinaryOcrBitmap.Width, BinaryOcrBitmap.Height, BinaryOcrBitmap.Y); + } } internal void PointerWheelChanged(object? sender, PointerWheelEventArgs e) @@ -242,4 +249,4 @@ internal void PointerWheelChanged(object? sender, PointerWheelEventArgs e) } } } -} \ No newline at end of file +} diff --git a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrInspectViewModel.cs b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrInspectViewModel.cs index b9fbb5f300e..136471ed716 100644 --- a/src/UI/Features/Ocr/BinaryOcr/BinaryOcrInspectViewModel.cs +++ b/src/UI/Features/Ocr/BinaryOcr/BinaryOcrInspectViewModel.cs @@ -266,8 +266,8 @@ private async Task AddBetterMatch() if (addVm.OkPressed && addVm.BinaryOcrBitmap != null) { - var letterBitmap = _letters[LetterIndex].NikseBitmap; - _binaryOcrAddHistoryManager.Add(addVm.BinaryOcrBitmap, letterBitmap, 0); + var previewBitmap = addVm.PreviewBitmap ?? _letters[LetterIndex].NikseBitmap; + _binaryOcrAddHistoryManager.Add(addVm.BinaryOcrBitmap, previewBitmap, addVm.PreviewTopMargin, 0); _db.Add(addVm.BinaryOcrBitmap); _ = Task.Run(_db.Save); ReloadMatches(); diff --git a/src/UI/Features/Ocr/NOcr/NOcrAddHistoryItem.cs b/src/UI/Features/Ocr/NOcr/NOcrAddHistoryItem.cs index a2090ce2be6..b077d313067 100644 --- a/src/UI/Features/Ocr/NOcr/NOcrAddHistoryItem.cs +++ b/src/UI/Features/Ocr/NOcr/NOcrAddHistoryItem.cs @@ -6,14 +6,14 @@ namespace Nikse.SubtitleEdit.Features.Ocr.NOcr; public class NOcrAddHistoryItem { public NOcrChar NOcrChar { get; set; } - public NikseBitmap2? Bitmap { get; set; } + public NikseBitmap2? PreviewBitmap { get; set; } public int LineIndex { get; set; } public DateTime DateTime { get; set; } - public NOcrAddHistoryItem(NOcrChar nOcrChar, NikseBitmap2? bitmap, int lineIndex) + public NOcrAddHistoryItem(NOcrChar nOcrChar, NikseBitmap2? previewBitmap, int lineIndex) { NOcrChar = nOcrChar; - Bitmap = bitmap; + PreviewBitmap = previewBitmap == null ? null : new NikseBitmap2(previewBitmap); DateTime = DateTime.Now; LineIndex = lineIndex; } diff --git a/src/UI/Features/Ocr/NOcr/NOcrAddHistoryManager.cs b/src/UI/Features/Ocr/NOcr/NOcrAddHistoryManager.cs index 38c22472484..0dabfb83cd9 100644 --- a/src/UI/Features/Ocr/NOcr/NOcrAddHistoryManager.cs +++ b/src/UI/Features/Ocr/NOcr/NOcrAddHistoryManager.cs @@ -12,14 +12,14 @@ public NOcrAddHistoryManager() Items = new List(); } - public void Add(NOcrChar nOcrChar, NikseBitmap2? letterBitmap, int lineIndex) + public void Add(NOcrChar nOcrChar, NikseBitmap2? previewBitmap, int lineIndex) { if (nOcrChar == null) { return; } - var item = new NOcrAddHistoryItem(nOcrChar, letterBitmap, lineIndex); + var item = new NOcrAddHistoryItem(nOcrChar, previewBitmap, lineIndex); Items.Add(item); } diff --git a/src/UI/Features/Ocr/NOcr/NOcrCharacterHistoryViewModel.cs b/src/UI/Features/Ocr/NOcr/NOcrCharacterHistoryViewModel.cs index f3aa057e103..cf777f63f7b 100644 --- a/src/UI/Features/Ocr/NOcr/NOcrCharacterHistoryViewModel.cs +++ b/src/UI/Features/Ocr/NOcr/NOcrCharacterHistoryViewModel.cs @@ -231,9 +231,9 @@ private void HistoryItemChanged() return; } - if (selectedItem.Bitmap != null) + if (selectedItem.PreviewBitmap != null) { - CurrentBitmap = selectedItem.Bitmap.GetBitmap().ToAvaloniaBitmap(); + CurrentBitmap = selectedItem.PreviewBitmap.GetBitmap().ToAvaloniaBitmap(); } NOcrChar = selectedItem.NOcrChar; @@ -265,4 +265,4 @@ internal void PointerWheelChanged(object? sender, PointerWheelEventArgs e) } } } -} \ No newline at end of file +} diff --git a/src/UI/Features/Ocr/NOcr/NOcrInspectViewModel.cs b/src/UI/Features/Ocr/NOcr/NOcrInspectViewModel.cs index e789cfc8204..f2655a5d9b9 100644 --- a/src/UI/Features/Ocr/NOcr/NOcrInspectViewModel.cs +++ b/src/UI/Features/Ocr/NOcr/NOcrInspectViewModel.cs @@ -63,6 +63,7 @@ public partial class NOcrInspectViewModel : ObservableObject private NikseBitmap2 _nBmp; private NikseBitmap2? _displayBitmap; private SKRect _displayRect; + private int _displayTopMargin; private OcrSubtitleItem? _ocrSubtitleItem; private NOcrAddHistoryManager _nOcrAddHistoryManager; private bool _isControlDown = false; @@ -98,6 +99,7 @@ public NOcrInspectViewModel() _nOcrDb = new NOcrDb(string.Empty); _nBmp = new NikseBitmap2(1, 1); _nOcrAddHistoryManager = new NOcrAddHistoryManager(); + _displayTopMargin = 0; SentenceBitmap = new SKBitmap(1, 1, true).ToAvaloniaBitmap(); CurrentBitmap = new SKBitmap(1, 1, true).ToAvaloniaBitmap(); _splitItem = new ImageSplitterItem2(string.Empty); @@ -291,7 +293,8 @@ private async Task AddBetterMatch() if (addVm.OkPressed) { - _nOcrAddHistoryManager.Add(addVm.NOcrChar, addVm.PreviewBitmap, 0); + var previewBitmap = addVm.PreviewBitmap ?? _letters[LetterIndex].NikseBitmap; + _nOcrAddHistoryManager.Add(addVm.NOcrChar, previewBitmap, 0); _nOcrDb.Add(addVm.NOcrChar); _ = Task.Run(_nOcrDb.Save); ReloadMatches(); @@ -333,6 +336,11 @@ private void DrawAgain() { NOcrChar.LinesForeground.Clear(); NOcrChar.LinesBackground.Clear(); + if (_displayBitmap == null) + { + return; + } + NOcrChar.GenerateLineSegments(SelectedNoOfLinesToAutoDraw, false, NOcrChar, _displayBitmap!); ShowOcrPoints(); } @@ -490,6 +498,7 @@ private void OnLetterClicked(int index, NOcrChar? match) { LetterIndex = index; _splitItem = _letters[index]; + _displayTopMargin = 0; IsEditControlsEnabled = match != null; @@ -516,6 +525,7 @@ private void OnLetterClicked(int index, NOcrChar? match) _displayBitmap = _splitItem.NikseBitmap; _displayRect = new SKRect(_splitItem.X, _splitItem.Y, _splitItem.X + _splitItem.NikseBitmap.Width, _splitItem.Y + _splitItem.NikseBitmap.Height); + _displayTopMargin = _splitItem.Top; if (match is { ExpandCount: > 1 }) { var expandedGroup = ExpandedOcrGroup.Create(_nBmp, _letters, index, match.ExpandCount); @@ -523,10 +533,11 @@ private void OnLetterClicked(int index, NOcrChar? match) { _displayBitmap = expandedGroup.PreviewBitmap; _displayRect = new SKRect(expandedGroup.Bounds.Left, expandedGroup.Bounds.Top, expandedGroup.Bounds.Right, expandedGroup.Bounds.Bottom); + _displayTopMargin = expandedGroup.PreviewTopMargin; } } - ResolutionAndTopMargin = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, _displayBitmap.Width, _displayBitmap.Height, _splitItem.Top); + ResolutionAndTopMargin = string.Format(Se.Language.Ocr.ResolutionXYAndTopmarginZ, _displayBitmap.Width, _displayBitmap.Height, _displayTopMargin); CurrentBitmap = _displayBitmap!.GetBitmap().ToAvaloniaBitmap(); NOcrDrawingCanvas.BackgroundImage = CurrentBitmap; @@ -691,4 +702,4 @@ internal void PointerWheelChanged(object? sender, PointerWheelEventArgs e) } } } -} \ No newline at end of file +} diff --git a/src/UI/Features/Ocr/OcrViewModel.cs b/src/UI/Features/Ocr/OcrViewModel.cs index 19af42b191b..9814178cea4 100644 --- a/src/UI/Features/Ocr/OcrViewModel.cs +++ b/src/UI/Features/Ocr/OcrViewModel.cs @@ -1858,7 +1858,8 @@ private async Task RunNOcrLoop(List selectedIndices, CancellationToken canc if (result.OkPressed) { - _nOcrAddHistoryManager.Add(result.NOcrChar, result.PreviewBitmap, + var previewBitmap = result.PreviewBitmap ?? letters[letterIndex].NikseBitmap; + _nOcrAddHistoryManager.Add(result.NOcrChar, previewBitmap, OcrSubtitleItems.IndexOf(item)); IsInspectAdditionsVisible = true; _nOcrDb.Add(result.NOcrChar); @@ -2247,8 +2248,8 @@ await _windowService.ShowDialogAsync Date: Wed, 8 Apr 2026 07:03:09 +0200 Subject: [PATCH 53/74] Remove patch file --- ...wo-byte-character-load-save-handling.patch | 40 ------------------- 1 file changed, 40 deletions(-) delete mode 100644 patches-github/0001-Fix-nOCR-two-byte-character-load-save-handling.patch diff --git a/patches-github/0001-Fix-nOCR-two-byte-character-load-save-handling.patch b/patches-github/0001-Fix-nOCR-two-byte-character-load-save-handling.patch deleted file mode 100644 index a08da059f0a..00000000000 --- a/patches-github/0001-Fix-nOCR-two-byte-character-load-save-handling.patch +++ /dev/null @@ -1,40 +0,0 @@ -From cf2d41ec49863362fc0e876f1cf20a26a3b1a20e Mon Sep 17 00:00:00 2001 -From: "Hellgringer.Online" -Date: Mon, 6 Apr 2026 21:43:29 +0400 -Subject: [PATCH] Fix nOCR two-byte character load/save handling - ---- - src/UI/Logic/Ocr/NOcrChar.cs | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/src/UI/Logic/Ocr/NOcrChar.cs b/src/UI/Logic/Ocr/NOcrChar.cs -index d53a2a070..30fb539bb 100644 ---- a/src/UI/Logic/Ocr/NOcrChar.cs -+++ b/src/UI/Logic/Ocr/NOcrChar.cs -@@ -87,6 +87,7 @@ public class NOcrChar - } - else - { -+ position++; - ExpandCount = file[position++]; - Width = file[position++] << 8 | file[position++]; - Height = file[position++] << 8 | file[position++]; -@@ -179,7 +180,7 @@ public class NOcrChar - { - return Width <= byte.MaxValue && Height <= byte.MaxValue && ExpandCount < 16 && - LinesBackground.Count <= byte.MaxValue && LinesForeground.Count <= byte.MaxValue && -- IsAllPointByteValues(LinesForeground) && IsAllPointByteValues(LinesForeground); -+ IsAllPointByteValues(LinesForeground) && IsAllPointByteValues(LinesBackground); - } - - private static bool IsAllPointByteValues(List lines) -@@ -632,4 +633,4 @@ public class NOcrChar - lines.RemoveAt(i); - } - } --} -\ No newline at end of file -+} --- -2.53.0.windows.2 - From 6e6515e4ed047c43dc3ad63f58c7dd3191eb048c Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Wed, 8 Apr 2026 07:43:58 +0200 Subject: [PATCH 54/74] Update to xunit.v3 --- tests/UI/UITests.csproj | 2 +- tests/libse/LibSETests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/UI/UITests.csproj b/tests/UI/UITests.csproj index ebb0716d05f..95fc1e4c26d 100644 --- a/tests/UI/UITests.csproj +++ b/tests/UI/UITests.csproj @@ -14,11 +14,11 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - all runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/tests/libse/LibSETests.csproj b/tests/libse/LibSETests.csproj index 58982e607f6..5bb2f993b71 100644 --- a/tests/libse/LibSETests.csproj +++ b/tests/libse/LibSETests.csproj @@ -78,11 +78,11 @@ - all runtime; build; native; contentfiles; analyzers; buildtransitive + From b1c991e129d3d9d3e0a03f8c42c11b4d3593f331 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Wed, 8 Apr 2026 09:43:28 +0200 Subject: [PATCH 55/74] Work assa color picker --- .../AssaApplyAdvancedEffectWindow.cs | 10 ++-- .../ColorPicker/ColorPickerViewModel.cs | 1 - src/UI/Logic/UiUtil.cs | 48 +++++++++++++++++++ 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/UI/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectWindow.cs b/src/UI/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectWindow.cs index b3b3bf1d051..66fcc92506d 100644 --- a/src/UI/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectWindow.cs +++ b/src/UI/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectWindow.cs @@ -85,18 +85,18 @@ public AssaApplyAdvancedEffectWindow(AssaApplyAdvancedEffectViewModel vm) activeGlowRow.Children.Add(new TextBlock { Text = Se.Language.Assa.AdvancedEffectFancyKaraokeGlow, VerticalAlignment = VerticalAlignment.Center, FontSize = 12 }); var applyGlowCheckBox = UiUtil.MakeCheckBox(fancyKaraokeItem, nameof(AdvancedEffectFancyKaraoke.ApplyGlow)); activeGlowRow.Children.Add(applyGlowCheckBox); - var activeGlowColorPicker = UiUtil.MakeColorPicker(fancyKaraokeItem, nameof(AdvancedEffectFancyKaraoke.GlowColor)); + var activeGlowColorButton = UiUtil.MakeColorPickerButton(fancyKaraokeItem, nameof(AdvancedEffectFancyKaraoke.GlowColor)); // Show/hide the row based on the checkbox state - activeGlowColorPicker.Bind(ColorPicker.IsVisibleProperty, new Binding(nameof(CheckBox.IsChecked)) { Source = applyGlowCheckBox, Mode = BindingMode.OneWay }); - activeGlowRow.Children.Add(activeGlowColorPicker); + activeGlowColorButton.Bind(Button.IsVisibleProperty, new Binding(nameof(CheckBox.IsChecked)) { Source = applyGlowCheckBox, Mode = BindingMode.OneWay }); + activeGlowRow.Children.Add(activeGlowColorButton); var activeColorRow = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 8, Margin = new Thickness(0, 4, 0, 0) }; activeColorRow.Children.Add(new TextBlock { Text = Se.Language.Assa.AdvancedEffectFancyKaraokeActiveColor, VerticalAlignment = VerticalAlignment.Center, FontSize = 12 }); - activeColorRow.Children.Add(UiUtil.MakeColorPicker(fancyKaraokeItem, nameof(AdvancedEffectFancyKaraoke.ActiveWordColor))); + activeColorRow.Children.Add(UiUtil.MakeColorPickerButton(fancyKaraokeItem, nameof(AdvancedEffectFancyKaraoke.ActiveWordColor))); var inactiveColorRow = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 8, Margin = new Thickness(0, 4, 0, 0) }; inactiveColorRow.Children.Add(new TextBlock { Text = Se.Language.Assa.AdvancedEffectFancyKaraokeInactiveColor, VerticalAlignment = VerticalAlignment.Center, FontSize = 12 }); - inactiveColorRow.Children.Add(UiUtil.MakeColorPicker(fancyKaraokeItem, nameof(AdvancedEffectFancyKaraoke.InactiveWordColor))); + inactiveColorRow.Children.Add(UiUtil.MakeColorPickerButton(fancyKaraokeItem, nameof(AdvancedEffectFancyKaraoke.InactiveWordColor))); var settingsStack = new StackPanel { Spacing = 2 }; settingsStack.Children.Add(autoDetectActiveWordRow); diff --git a/src/UI/Features/Shared/ColorPicker/ColorPickerViewModel.cs b/src/UI/Features/Shared/ColorPicker/ColorPickerViewModel.cs index 3540e7f9f16..3ae504ce183 100644 --- a/src/UI/Features/Shared/ColorPicker/ColorPickerViewModel.cs +++ b/src/UI/Features/Shared/ColorPicker/ColorPickerViewModel.cs @@ -1,6 +1,5 @@ using Avalonia.Controls; using Avalonia.Input; -using Avalonia.Input.Platform; using Avalonia.Media; using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; diff --git a/src/UI/Logic/UiUtil.cs b/src/UI/Logic/UiUtil.cs index fa839f60dfc..31a97a1c3b5 100644 --- a/src/UI/Logic/UiUtil.cs +++ b/src/UI/Logic/UiUtil.cs @@ -8,6 +8,7 @@ using Avalonia.Platform; using Avalonia.Styling; using CommunityToolkit.Mvvm.Input; +using Nikse.SubtitleEdit.Features.Shared.ColorPicker; using Nikse.SubtitleEdit.Logic.Config; using Nikse.SubtitleEdit.Logic.ValueConverters; using Projektanker.Icons.Avalonia; @@ -17,6 +18,7 @@ using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; +using System.Reflection; namespace Nikse.SubtitleEdit.Logic; @@ -1586,6 +1588,52 @@ internal static ColorPicker MakeColorPicker(object vm, string colorPropertyPath) }; } + internal static Button MakeColorPickerButton(object source, string colorPropertyPath) + { + var propInfo = source.GetType().GetProperty(colorPropertyPath, BindingFlags.Public | BindingFlags.Instance); + var initialColor = propInfo?.GetValue(source) is Color c ? c : Colors.White; + + var colorSwatch = new Border + { + Width = 30, + Height = 20, + CornerRadius = new CornerRadius(CornerRadius), + BorderThickness = new Thickness(1), + BorderBrush = new SolidColorBrush(Colors.Gray), + Background = new SolidColorBrush(initialColor), + VerticalAlignment = VerticalAlignment.Center, + }; + + var button = new Button + { + Content = colorSwatch, + Padding = new Thickness(4, 2), + VerticalAlignment = VerticalAlignment.Center, + }; + + button.Click += async (_, _) => + { + if (TopLevel.GetTopLevel(button) is not Window window) + { + return; + } + + var currentColor = propInfo?.GetValue(source) is Color cc ? cc : Colors.White; + var vm = new ColorPickerViewModel(); + vm.Initialize(currentColor); + var pickerWindow = new ColorPickerWindow(vm); + await pickerWindow.ShowDialog(window); + + if (vm.OkPressed) + { + propInfo?.SetValue(source, vm.SelectedColor); + colorSwatch.Background = new SolidColorBrush(vm.SelectedColor); + } + }; + + return button; + } + internal static Label MakeLabel(string text = "") { return new Label From ed05c1125d7dc581f5e1032cf413dc088d784e4f Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Wed, 8 Apr 2026 09:52:49 +0200 Subject: [PATCH 56/74] Work on assa color picker --- .../AssaApplyAdvancedEffectWindow.cs | 6 +++--- src/UI/Features/Shared/ColorPicker/ColorPickerViewModel.cs | 2 ++ src/UI/Features/Shared/ColorPicker/ColorPickerWindow.cs | 5 +++++ src/UI/Logic/UiUtil.cs | 3 ++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/UI/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectWindow.cs b/src/UI/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectWindow.cs index 66fcc92506d..d96579f3e1f 100644 --- a/src/UI/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectWindow.cs +++ b/src/UI/Features/Assa/AssaApplyAdvancedEffect/AssaApplyAdvancedEffectWindow.cs @@ -85,18 +85,18 @@ public AssaApplyAdvancedEffectWindow(AssaApplyAdvancedEffectViewModel vm) activeGlowRow.Children.Add(new TextBlock { Text = Se.Language.Assa.AdvancedEffectFancyKaraokeGlow, VerticalAlignment = VerticalAlignment.Center, FontSize = 12 }); var applyGlowCheckBox = UiUtil.MakeCheckBox(fancyKaraokeItem, nameof(AdvancedEffectFancyKaraoke.ApplyGlow)); activeGlowRow.Children.Add(applyGlowCheckBox); - var activeGlowColorButton = UiUtil.MakeColorPickerButton(fancyKaraokeItem, nameof(AdvancedEffectFancyKaraoke.GlowColor)); + var activeGlowColorButton = UiUtil.MakeColorPickerButton(fancyKaraokeItem, nameof(AdvancedEffectFancyKaraoke.GlowColor), false); // Show/hide the row based on the checkbox state activeGlowColorButton.Bind(Button.IsVisibleProperty, new Binding(nameof(CheckBox.IsChecked)) { Source = applyGlowCheckBox, Mode = BindingMode.OneWay }); activeGlowRow.Children.Add(activeGlowColorButton); var activeColorRow = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 8, Margin = new Thickness(0, 4, 0, 0) }; activeColorRow.Children.Add(new TextBlock { Text = Se.Language.Assa.AdvancedEffectFancyKaraokeActiveColor, VerticalAlignment = VerticalAlignment.Center, FontSize = 12 }); - activeColorRow.Children.Add(UiUtil.MakeColorPickerButton(fancyKaraokeItem, nameof(AdvancedEffectFancyKaraoke.ActiveWordColor))); + activeColorRow.Children.Add(UiUtil.MakeColorPickerButton(fancyKaraokeItem, nameof(AdvancedEffectFancyKaraoke.ActiveWordColor), false)); var inactiveColorRow = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 8, Margin = new Thickness(0, 4, 0, 0) }; inactiveColorRow.Children.Add(new TextBlock { Text = Se.Language.Assa.AdvancedEffectFancyKaraokeInactiveColor, VerticalAlignment = VerticalAlignment.Center, FontSize = 12 }); - inactiveColorRow.Children.Add(UiUtil.MakeColorPickerButton(fancyKaraokeItem, nameof(AdvancedEffectFancyKaraoke.InactiveWordColor))); + inactiveColorRow.Children.Add(UiUtil.MakeColorPickerButton(fancyKaraokeItem, nameof(AdvancedEffectFancyKaraoke.InactiveWordColor), true)); var settingsStack = new StackPanel { Spacing = 2 }; settingsStack.Children.Add(autoDetectActiveWordRow); diff --git a/src/UI/Features/Shared/ColorPicker/ColorPickerViewModel.cs b/src/UI/Features/Shared/ColorPicker/ColorPickerViewModel.cs index 3ae504ce183..ea85c84f572 100644 --- a/src/UI/Features/Shared/ColorPicker/ColorPickerViewModel.cs +++ b/src/UI/Features/Shared/ColorPicker/ColorPickerViewModel.cs @@ -32,6 +32,8 @@ public partial class ColorPickerViewModel : ObservableObject [ObservableProperty] private Color _alphaGradientStart = Colors.Transparent; [ObservableProperty] private Color _alphaGradientEnd = Colors.White; + [ObservableProperty] private bool _showAlpha = true; + [ObservableProperty] private Color _lastColorPickerColor; [ObservableProperty] private Color _lastColorPickerColor1; [ObservableProperty] private Color _lastColorPickerColor2; diff --git a/src/UI/Features/Shared/ColorPicker/ColorPickerWindow.cs b/src/UI/Features/Shared/ColorPicker/ColorPickerWindow.cs index 685a432ea05..d04cc93bda7 100644 --- a/src/UI/Features/Shared/ColorPicker/ColorPickerWindow.cs +++ b/src/UI/Features/Shared/ColorPicker/ColorPickerWindow.cs @@ -214,6 +214,11 @@ private static StackPanel CreateSlidersPanel(ColorPickerViewModel vm) Source = vm, Path = nameof(vm.AlphaGradientEnd), }); + alphaSlider.Bind(ColorChannelSlider.IsVisibleProperty, new Binding + { + Source = vm, + Path = nameof(vm.ShowAlpha), + }); // Hex input var hexLabel = new TextBlock diff --git a/src/UI/Logic/UiUtil.cs b/src/UI/Logic/UiUtil.cs index 31a97a1c3b5..42dd41d3e2b 100644 --- a/src/UI/Logic/UiUtil.cs +++ b/src/UI/Logic/UiUtil.cs @@ -1588,7 +1588,7 @@ internal static ColorPicker MakeColorPicker(object vm, string colorPropertyPath) }; } - internal static Button MakeColorPickerButton(object source, string colorPropertyPath) + internal static Button MakeColorPickerButton(object source, string colorPropertyPath, bool showAlpha) { var propInfo = source.GetType().GetProperty(colorPropertyPath, BindingFlags.Public | BindingFlags.Instance); var initialColor = propInfo?.GetValue(source) is Color c ? c : Colors.White; @@ -1621,6 +1621,7 @@ internal static Button MakeColorPickerButton(object source, string colorProperty var currentColor = propInfo?.GetValue(source) is Color cc ? cc : Colors.White; var vm = new ColorPickerViewModel(); vm.Initialize(currentColor); + vm.ShowAlpha = showAlpha; var pickerWindow = new ColorPickerWindow(vm); await pickerWindow.ShowDialog(window); From 2b09703732feb4ffd60d1e6b610cbf74e102778d Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Wed, 8 Apr 2026 10:03:58 +0200 Subject: [PATCH 57/74] Update version to v5.0.0-beta14 Also try to optimize build a tiny bit --- .github/workflows/build-ui.yml | 32 +++++++++----------- ChangeLog.txt | 2 +- installer/flatpak/dk.nikse.subtitleedit.yaml | 4 +++ src/UI/Logic/Config/Se.cs | 2 +- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build-ui.yml b/.github/workflows/build-ui.yml index ae50938f8e0..8883510925e 100644 --- a/.github/workflows/build-ui.yml +++ b/.github/workflows/build-ui.yml @@ -58,6 +58,8 @@ jobs: run: | dotnet publish src/UI/UI.csproj -c ${{ inputs.build_configuration }} -r win-x64 --self-contained true ` -p:PublishSingleFile=true ` + -p:DebugSymbols=false ` + -p:DebugType=none ` -o ./publish/windows-x64 Copy-Item "libmpv-temp/libmpv-2.dll" "./publish/windows-x64/" @@ -65,13 +67,10 @@ jobs: run: | dotnet publish src/UI/UI.csproj -c ${{ inputs.build_configuration }} -r win-arm64 --self-contained true ` -p:PublishSingleFile=true ` + -p:DebugSymbols=false ` + -p:DebugType=none ` -o ./publish/windows-arm64 - - name: Remove PDB files - run: | - Get-ChildItem -Path "./publish/windows-x64/" -Recurse -Include *.pdb | Remove-Item -Force - Get-ChildItem -Path "./publish/windows-arm64/" -Recurse -Include *.pdb | Remove-Item -Force - # - name: Setup WiX # run: | # dotnet tool install --global wix --version 5.0.1 @@ -104,9 +103,10 @@ jobs: run: | dotnet publish src/UI/UI.csproj -c ${{ inputs.build_configuration }} -r win-x64 --self-contained false ` -p:PublishSingleFile=true ` + -p:DebugSymbols=false ` + -p:DebugType=none ` -o ./src/UI/bin/Release/net10.0/publish Copy-Item "libmpv-temp/libmpv-2.dll" "./src/UI/bin/Release/net10.0/publish/" - Get-ChildItem -Path "./src/UI/bin/Release/net10.0/publish/" -Recurse -Include *.pdb | Remove-Item -Force - name: Install Inno Setup run: choco install innosetup -y --no-progress @@ -289,11 +289,10 @@ jobs: run: | dotnet publish src/UI/UI.csproj -c ${{ inputs.build_configuration }} -r osx-x64 --self-contained true \ -p:PublishSingleFile=true \ + -p:DebugSymbols=false \ + -p:DebugType=none \ -o ./publish/macos-x64 - - # Remove PDB files immediately - find "./publish/macos-x64/" -name "*.pdb" -type f -delete - + echo "Disk space after x64 publish:"; df -h / - name: Update Info.plist with version from Se.cs @@ -372,11 +371,10 @@ jobs: dotnet publish src/UI/UI.csproj -c ${{ inputs.build_configuration }} -r osx-arm64 --self-contained true \ -p:PublishSingleFile=true \ + -p:DebugSymbols=false \ + -p:DebugType=none \ -o ./publish/macos-arm64 - - # Remove PDB files immediately - find "./publish/macos-arm64/" -name "*.pdb" -type f -delete - + echo "Disk space after ARM64 publish:"; df -h / - name: Create, sign, and package ARM64 DMG @@ -526,12 +524,10 @@ jobs: run: | dotnet publish src/UI/UI.csproj -c ${{ inputs.build_configuration }} -r linux-x64 --self-contained true \ -p:PublishSingleFile=true \ + -p:DebugSymbols=false \ + -p:DebugType=none \ -o ./publish/linux-x64 - - name: Remove PDB files from Linux artifacts - run: | - find "./publish/linux-x64/" -name "*.pdb" -type f -delete - - name: Create Linux TAR package run: | cd ./publish/linux-x64 && tar -czf ../../SubtitleEdit-Linux-x64.tar.gz . && cd ../.. diff --git a/ChangeLog.txt b/ChangeLog.txt index e7e33c90250..cd15057b047 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -2,7 +2,7 @@ Subtitle Edit Changelog -v5.0.0-beta14 (xth April 2026) +v5.0.0-beta14 (8th April 2026) * Add Romanian translation - thx zildan * Update Italian translation - thx bovirus diff --git a/installer/flatpak/dk.nikse.subtitleedit.yaml b/installer/flatpak/dk.nikse.subtitleedit.yaml index ad6ed5d0cec..156557ca342 100644 --- a/installer/flatpak/dk.nikse.subtitleedit.yaml +++ b/installer/flatpak/dk.nikse.subtitleedit.yaml @@ -10,8 +10,10 @@ command: SubtitleEdit build-options: append-path: /usr/lib/sdk/dotnet10/bin append-ld-library-path: /usr/lib/sdk/dotnet10/lib + no-debuginfo: true env: PKG_CONFIG_PATH: /app/lib/pkgconfig:/app/share/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig:/usr/lib/sdk/dotnet10/lib/pkgconfig + MAKEFLAGS: -j finish-args: # Display @@ -264,6 +266,8 @@ modules: --self-contained true \ -p:PublishSingleFile=true \ -p:RestoreLockedMode=false \ + -p:DebugSymbols=false \ + -p:DebugType=none \ --source /run/build/subtitleedit/nuget-sources \ -o /app/bin diff --git a/src/UI/Logic/Config/Se.cs b/src/UI/Logic/Config/Se.cs index 0e3d87310ae..ca22a9dfa03 100644 --- a/src/UI/Logic/Config/Se.cs +++ b/src/UI/Logic/Config/Se.cs @@ -186,7 +186,7 @@ public static string TesseractModelFolder public static string SpectrogramsFolder => Path.Combine(DataFolder, "Spectrograms"); public static string ShotChangesFolder => Path.Combine(DataFolder, "ShotChanges"); - public static string Version { get; set; } = "v5.0.0-beta13"; + public static string Version { get; set; } = "v5.0.0-beta14"; public Se() { From 825c9bdacc14ec14b90018d9b0829a3aed0775da Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Wed, 8 Apr 2026 10:25:54 +0200 Subject: [PATCH 58/74] Remove flag --- installer/flatpak/dk.nikse.subtitleedit.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/installer/flatpak/dk.nikse.subtitleedit.yaml b/installer/flatpak/dk.nikse.subtitleedit.yaml index 156557ca342..9359737c683 100644 --- a/installer/flatpak/dk.nikse.subtitleedit.yaml +++ b/installer/flatpak/dk.nikse.subtitleedit.yaml @@ -13,7 +13,6 @@ build-options: no-debuginfo: true env: PKG_CONFIG_PATH: /app/lib/pkgconfig:/app/share/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig:/usr/lib/sdk/dotnet10/lib/pkgconfig - MAKEFLAGS: -j finish-args: # Display From 6e0fee19f3b69ade1748d4729411aa8630ff4417 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Wed, 8 Apr 2026 10:47:17 +0200 Subject: [PATCH 59/74] Remove flatpak... --- .github/workflows/build-ui.yml | 54 +++++++++++++++++----------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/.github/workflows/build-ui.yml b/.github/workflows/build-ui.yml index 8883510925e..ab84750b432 100644 --- a/.github/workflows/build-ui.yml +++ b/.github/workflows/build-ui.yml @@ -544,36 +544,36 @@ jobs: name: linux-tar-package path: ./SubtitleEdit-Linux-x64.tar.gz - build-linux-flatpak: - runs-on: ubuntu-latest - container: - image: ghcr.io/flathub-infra/flatpak-github-actions:freedesktop-24.08 - options: --privileged - - steps: - - uses: actions/checkout@v5 - - - name: Update metainfo version/date from Se.cs - run: bash installer/flatpak/update-metainfo-version.sh - - - name: Build flatpak bundle - uses: flatpak/flatpak-github-actions/flatpak-builder@v6 - with: - bundle: SubtitleEdit-linux-x64.flatpak - manifest-path: installer/flatpak/dk.nikse.subtitleedit.yaml - cache-key: flatpak-builder-${{ hashFiles('installer/flatpak/dk.nikse.subtitleedit.yaml', 'installer/flatpak/nuget-sources.json') }} - arch: x86_64 - - - name: Upload flatpak bundle artifact - uses: actions/upload-artifact@v5 - with: - name: flatpak-bundle - path: SubtitleEdit-linux-x64.flatpak - overwrite: true + # build-linux-flatpak: + # runs-on: ubuntu-latest + # container: + # image: ghcr.io/flathub-infra/flatpak-github-actions:freedesktop-24.08 + # options: --privileged + + # steps: + # - uses: actions/checkout@v5 + + # - name: Update metainfo version/date from Se.cs + # run: bash installer/flatpak/update-metainfo-version.sh + + # - name: Build flatpak bundle + # uses: flatpak/flatpak-github-actions/flatpak-builder@v6 + # with: + # bundle: SubtitleEdit-linux-x64.flatpak + # manifest-path: installer/flatpak/dk.nikse.subtitleedit.yaml + # cache-key: flatpak-builder-${{ hashFiles('installer/flatpak/dk.nikse.subtitleedit.yaml', 'installer/flatpak/nuget-sources.json') }} + # arch: x86_64 + + # - name: Upload flatpak bundle artifact + # uses: actions/upload-artifact@v5 + # with: + # name: flatpak-bundle + # path: SubtitleEdit-linux-x64.flatpak + # overwrite: true create-release: if: ${{ inputs.create_release }} - needs: [build-windows, build-macos, build-linux, build-linux-flatpak] + needs: [build-windows, build-macos, build-linux] runs-on: ubuntu-latest permissions: contents: write From 7785b8fde0eb32ad00f897d9e2550929054ce626 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Wed, 8 Apr 2026 10:49:55 +0200 Subject: [PATCH 60/74] More remove flatpak --- .github/workflows/build-ui.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-ui.yml b/.github/workflows/build-ui.yml index ab84750b432..1747828e277 100644 --- a/.github/workflows/build-ui.yml +++ b/.github/workflows/build-ui.yml @@ -606,7 +606,7 @@ jobs: cp ./artifacts/windows-zip-packages/*.zip ./release-assets/ cp ./artifacts/macos-dmg-packages/*.dmg ./release-assets/ cp ./artifacts/linux-tar-package/*.tar.gz ./release-assets/ - cp ./artifacts/flatpak-bundle/*.flatpak ./release-assets/ + #cp ./artifacts/flatpak-bundle/*.flatpak ./release-assets/ # List all files that will be uploaded echo "Release assets:" @@ -635,7 +635,7 @@ jobs: - **macOS ARM64 (Apple Silicon - M1/M2/M3/M4 architecture):** [SubtitleEdit-macOS-ARM64.dmg](https://github.com/${{ github.repository }}/releases/download/${{ steps.tag.outputs.tag }}/SubtitleEdit-macOS-ARM64.dmg) - **macOS x64 (Intel 64-bit):** [SubtitleEdit-macOS-x64.dmg](https://github.com/${{ github.repository }}/releases/download/${{ steps.tag.outputs.tag }}/SubtitleEdit-macOS-x64.dmg) - **Linux x64 (tarball):** [SubtitleEdit-Linux-x64.tar.gz](https://github.com/${{ github.repository }}/releases/download/${{ steps.tag.outputs.tag }}/SubtitleEdit-Linux-x64.tar.gz) - - **Linux x64 (Flatpak):** [SubtitleEdit-linux-x64.flatpak](https://github.com/${{ github.repository }}/releases/download/${{ steps.tag.outputs.tag }}/SubtitleEdit-linux-x64.flatpak) + #- **Linux x64 (Flatpak):** [SubtitleEdit-linux-x64.flatpak](https://github.com/${{ github.repository }}/releases/download/${{ steps.tag.outputs.tag }}/SubtitleEdit-linux-x64.flatpak) ### Installation 1. Read and fix requirements, please see [System Requirements](https://github.com/niksedk/subtitleedit-avalonia#system-requirements) @@ -656,4 +656,4 @@ jobs: ./release-assets/SubtitleEdit-macOS-ARM64.dmg ./release-assets/SubtitleEdit-macOS-x64.dmg ./release-assets/SubtitleEdit-Linux-x64.tar.gz - ./release-assets/SubtitleEdit-linux-x64.flatpak + #./release-assets/SubtitleEdit-linux-x64.flatpak From af3a437278c73ee9f625c53c2fd1579f82579da9 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Wed, 8 Apr 2026 13:53:40 +0200 Subject: [PATCH 61/74] Update docs --- docs/overview.md | 31 ++++++++++++++---- .../assa-apply-advanced-effects.png | Bin 0 -> 188934 bytes 2 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 docs/screenshots/assa-apply-advanced-effects.png diff --git a/docs/overview.md b/docs/overview.md index 8b5b48b0ef6..b1b84fa66cb 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -33,12 +33,31 @@ Subtitle Edit is a free, open-source editor for video subtitles. It allows you t ## Getting Started -1. Download and install Subtitle Edit -2. Open a video file via **Video → Open video file...** -3. Open or create a subtitle file via **File → Open** or **File → New** -4. Edit subtitles in the text editor and subtitle grid -5. Use the waveform to visually adjust timing -6. Save your work via **File → Save** +Follow these simple steps to begin working with subtitles in Subtitle Edit: + +1. **Install Subtitle Edit** + Download and install the latest version from the official website. + +2. **Open a video file** + Go to **Video → Open video file...** and select your video. + This allows you to preview and sync subtitles accurately. + +3. **Open, create, or generate a subtitle file** + - Open an existing file via **File → Open** + - Create a new one via **File → New** + - Or generate subtitles automatically using **speech-to-text** (**Video → Speech to text**) + +4. **Edit your subtitles** + Use the subtitle grid and text editor to: + - Adjust text + - Split or merge lines + - Fine-tune timing + +5. **Adjust timing visually** + Use the waveform display to precisely sync subtitles with audio. + +6. **Save your work** + Go to **File → Save** (or press **Ctrl+S**) to save your subtitle file. ![Main Window](screenshots/main-window.png) diff --git a/docs/screenshots/assa-apply-advanced-effects.png b/docs/screenshots/assa-apply-advanced-effects.png new file mode 100644 index 0000000000000000000000000000000000000000..f1438583715a9fa09cc82c5c9c28eee77cf61def GIT binary patch literal 188934 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

1=TMx!?pa$(E{@NgBS?v>fOte;_MAAm#CMbU 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 >1I@KLJ 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 Date: Wed, 8 Apr 2026 14:08:22 +0200 Subject: [PATCH 62/74] Work on langauge file + update Polish spell check directory - thx potplayer-fanpack :) --- src/UI/Assets/HunspellDictionaries.json | 4 ++-- src/UI/Assets/Languages/English.json | 16 ++++++++++++---- .../AdjustDuration/AdjustDurationDisplay.cs | 9 +++++---- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/UI/Assets/HunspellDictionaries.json b/src/UI/Assets/HunspellDictionaries.json index e11608be226..e46d597afcd 100644 --- a/src/UI/Assets/HunspellDictionaries.json +++ b/src/UI/Assets/HunspellDictionaries.json @@ -242,8 +242,8 @@ { "EnglishName": "Polish", "NativeName": "polski", - "DownloadLink": "https://github.com/SubtitleEdit/support-files/raw/master/hunspell/pl_PL.zip", - "Description": "Polish by https://sjp.pl - 2020-07-18" + "DownloadLink": "https://github.com/SubtitleEdit/support-files/releases/download/hunspell/pl_PL_2026-04-01.zip", + "Description": "Polish by https://sjp.pl - 2026-04-01" }, { "EnglishName": "Portuguese (Brazilian) - Libreoffice", diff --git a/src/UI/Assets/Languages/English.json b/src/UI/Assets/Languages/English.json index e58691e3ae2..42e0f630bd6 100644 --- a/src/UI/Assets/Languages/English.json +++ b/src/UI/Assets/Languages/English.json @@ -767,7 +767,9 @@ "pointSyncViaOther": "Point sync via _other subtitle...", "sortSubtitles": "_Sort subtitles...", "setLayer": "Set layer...", - "filterLayersForDisplayDotDotDot": "Filter layers for display..." + "filterLayersForDisplayDotDotDot": "Filter layers for display...", + "toggleSelectSubtitleWhilePlayingCurrentlyOn": "Toggle select subtitle while playing (currently: on)", + "toggleSelectSubtitleWhilePlayingCurrentlyOff": "Toggle select subtitle while playing (currently: off)" }, "toolbar": { "newHint": "Start a new subtitle file {0}", @@ -902,7 +904,9 @@ "nothingToSaveOriginal": "Nothing to save (original)", "liveSpellCheckLanguageXLoaded": "Live spell check language {0} loaded", "downloadFfmpegTitle": "Download FFmpeg?", - "downloadFfmpegQuestion": "FFmpeg is required for playing online videos and for some video editing features.\n\nDownload FFmpeg now?" + "downloadFfmpegQuestion": "FFmpeg is required for playing online videos and for some video editing features.\n\nDownload FFmpeg now?", + "selectCurrentSubtitleWhilePlayingOn": "Select current subtitle while playing: ON", + "selectCurrentSubtitleWhilePlayingOff": "Select current subtitle while playing: OFF" }, "file": { "ebuSaveOptions": { @@ -1742,7 +1746,8 @@ "titleOrLanguage": "Title/language", "viewMatroskaTrackX": "View Matroska track - {0}", "resolutionSeparator": "x", - "openFromUrlTitle": "Open video file from URL" + "openFromUrlTitle": "Open video file from URL", + "toggleCurrentSubtitleWhilePlaying": "Toggle current subtitle while playing" }, "waveform": { "guessTimeCodes": "Guess time codes", @@ -2080,7 +2085,10 @@ "waveformToolbarItems": "Waveform toolbar items", "matchIconColorToDarkTheme": "Match icon color to dark theme foreground color", "subtitlePreviewProperties": "Subtitle preview properties", - "pixelWidthInfo": "Green lines = max-width limit | Red area = text exceeds limit" + "pixelWidthInfo": "Green lines = max-width limit | Red area = text exceeds limit", + "spellCheckEngineHunSpelll": "Hunspell", + "spellCheckEngineMsWord": "MS Word", + "spellCheckEngine": "Spell check engine" }, "shortcuts": { "title": "Shortcuts", diff --git a/src/UI/Features/Tools/AdjustDuration/AdjustDurationDisplay.cs b/src/UI/Features/Tools/AdjustDuration/AdjustDurationDisplay.cs index 1e955b93bd6..7577d468090 100644 --- a/src/UI/Features/Tools/AdjustDuration/AdjustDurationDisplay.cs +++ b/src/UI/Features/Tools/AdjustDuration/AdjustDurationDisplay.cs @@ -1,3 +1,4 @@ +using Nikse.SubtitleEdit.Logic.Config; using System.Collections.Generic; namespace Nikse.SubtitleEdit.Features.Tools.AdjustDuration; @@ -29,7 +30,7 @@ public static List ListAll() [ new AdjustDurationDisplay { - Name = "Seconds", + Name = Se.Language.General.Seconds, Type = AdjustDurationType.Seconds, IsSecondsVisible = true, IsPercentVisible = false, @@ -38,7 +39,7 @@ public static List ListAll() }, new AdjustDurationDisplay { - Name = "Percent", + Name = Se.Language.General.Percent, Type = AdjustDurationType.Percent, IsSecondsVisible = false, IsPercentVisible = true, @@ -47,7 +48,7 @@ public static List ListAll() }, new AdjustDurationDisplay { - Name = "Fixed", + Name = Se.Language.Tools.AdjustDurations.Fixed, Type = AdjustDurationType.Fixed, IsSecondsVisible = false, IsPercentVisible = false, @@ -56,7 +57,7 @@ public static List ListAll() }, new AdjustDurationDisplay { - Name = "Recalculate", + Name = Se.Language.Tools.AdjustDurations.Recalculate, Type = AdjustDurationType.Recalculate, IsSecondsVisible = false, IsPercentVisible = false, From 01d12c1ff8f89bb018684936313d444ece238b91 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Wed, 8 Apr 2026 14:36:05 +0200 Subject: [PATCH 63/74] Trim version (to avoid unwanted spaces) --- .github/workflows/build-ui.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-ui.yml b/.github/workflows/build-ui.yml index 1747828e277..7fc170d16b3 100644 --- a/.github/workflows/build-ui.yml +++ b/.github/workflows/build-ui.yml @@ -585,7 +585,7 @@ jobs: id: tag run: | if [ -n "${{ inputs.release_tag }}" ]; then - echo "tag=${{ inputs.release_tag }}" >> $GITHUB_OUTPUT + echo "tag=$(echo '${{ inputs.release_tag }}' | xargs)" >> $GITHUB_OUTPUT else timestamp=$(date +"%Y%m%d-%H%M%S") echo "tag=pre-release-${timestamp}" >> $GITHUB_OUTPUT From ba70f7b01d7241e1a16826d4edc435ae6864c709 Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Wed, 8 Apr 2026 14:39:15 +0200 Subject: [PATCH 64/74] Italian language update --- src/UI/Assets/Languages/Italian.json | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/UI/Assets/Languages/Italian.json b/src/UI/Assets/Languages/Italian.json index 7ea3de64be9..fd36a47aa6a 100644 --- a/src/UI/Assets/Languages/Italian.json +++ b/src/UI/Assets/Languages/Italian.json @@ -1,6 +1,6 @@ { "Title": "SubtitleEdit", - "TranslatedBy": "v. 07.04.2026 di bovirus", + "TranslatedBy": "v. 08.04.2026 di bovirus", "CultureName": "it-IT", "General": { "Abort": "Annulla", @@ -753,6 +753,8 @@ "LiveSpellCheckLanguageXLoaded": "Lingua controllo ortografico {0} in tempo reale caricata", "DownloadFfmpegTitle": "Vuoi scaricare FFmpeg?", "DownloadFfmpegQuestion": "FFmpeg è richiesto per riprodurre video online e per alcune funzionalità di editing video.\r\n\r\nVuoi scaricare FFmpeg?", + "SelectCurrentSubtitleWhilePlayingOn": "Durante la riproduzione seleziona il sottotitolo attuale : ON", + "SelectCurrentSubtitleWhilePlayingOff": "Durante la riproduzione seleziona il sottotitolo attuale: OFF", "Menu": { "File": "_File", "New": "_Nuovo", @@ -862,7 +864,9 @@ "PointSyncViaOther": "Sincronizzazi_one punti tramite altri sottotitoli...", "SortSubtitles": "Ordina _sottotitoli...", "SetLayer": "Imposta livello...", - "FilterLayersForDisplayDotDotDot": "Filtra livelli per la visualizzazione..." + "FilterLayersForDisplayDotDotDot": "Filtra livelli per la visualizzazione...", + "ToggleSelectSubtitleWhilePlayingCurrentlyOn": "Attiva/disattiva selezione sottotitoli durante la riproduzione (attualmente: attiva)", + "ToggleSelectSubtitleWhilePlayingCurrentlyOff": "Attiva/disattiva selezione sottotitoli durante la riproduzione (attualmente: non attiva)" }, "Toolbar": { "NewHint": "Crea nuovo file sottotitoli {0}", @@ -1602,6 +1606,7 @@ "ViewMatroskaTrackX": "Visualizza traccia Matroska - {0}", "ResolutionSeparator": "x", "OpenFromUrlTitle": "Apri file video dall'URL", + "ToggleCurrentSubtitleWhilePlaying": "Attiva/disattiva sottotitoli attuali durante la riproduzione", "BurnIn": { "Title": "Genera video con sottotitoli incorporati", "InfoAssaOff": "Nota: è supportato lo stile Advanced SubStation Alpha.", @@ -2079,7 +2084,10 @@ "WaveformToolbarItems": "Elementi barra strumenti forma d'onda", "MatchIconColorToDarkTheme": "Abbina colore icona al colore di primo piano del tema scuro", "SubtitlePreviewProperties": "Proprietà anteprima sottotitoli", - "PixelWidthInfo": "Linee verdi = limite larghezza massima | Area rossa = il testo supera il limite" + "PixelWidthInfo": "Linee verdi = limite larghezza massima | Area rossa = il testo supera il limite", + "SpellCheckEngineHunSpelll": "Hunspell", + "SpellCheckEngineMsWord": "MS Word", + "SpellCheckEngine": "Motore controllo ortografico" }, "Shortcuts": { "Title": "Tasti rapidi", From e20f31f63d268e263e9bea4d6de8d5cd6e0fbf13 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Wed, 8 Apr 2026 15:00:25 +0200 Subject: [PATCH 65/74] Minor clean --- src/UI/Features/Ocr/OcrViewModel.cs | 6 +- .../BeautifyTimeCodesViewModel.cs | 81 ++++++++++++------- 2 files changed, 55 insertions(+), 32 deletions(-) diff --git a/src/UI/Features/Ocr/OcrViewModel.cs b/src/UI/Features/Ocr/OcrViewModel.cs index 9814178cea4..731fe838124 100644 --- a/src/UI/Features/Ocr/OcrViewModel.cs +++ b/src/UI/Features/Ocr/OcrViewModel.cs @@ -49,7 +49,6 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; -using static Nikse.SubtitleEdit.Logic.Ocr.BinaryOcrMatcher; namespace Nikse.SubtitleEdit.Features.Ocr; @@ -1571,7 +1570,6 @@ private void RunPaddleOcr(List selectedIndices, OcrEngineType engineType, C maxShownProgress = Math.Max(maxShownProgress, currentItemNumber); UpdateOcrProgress(maxShownProgress, numberOfImages); - var scrollToIndex = number; var item = p.Item; if (item == null) { @@ -1650,7 +1648,6 @@ private void RunGoogleLensOcr(List selectedIndices, CancellationToken cance maxShownProgress = Math.Max(maxShownProgress, currentItemNumber); UpdateOcrProgress(maxShownProgress, numberOfImages); - var scrollToIndex = number; var item = p.Item; if (item == null) { @@ -1719,7 +1716,6 @@ private void RunGoogleLensOcrSharp(List selectedIndices, CancellationToken maxShownProgress = Math.Max(maxShownProgress, currentItemNumber); UpdateOcrProgress(maxShownProgress, numberOfImages); - var scrollToIndex = number; var item = p.Item; if (item == null) { @@ -2404,7 +2400,7 @@ private static void ChangeWord(OcrSubtitleItem item, UnknownWordItem unknownWord } else { - Se.LogError($"OCR-repalce: Could not find word '{unknownWord.Word.FixedWord}' in text '{item.Text}' to replace with '{word}' at index {unknownWord.Word.WordIndex}"); + Se.LogError($"OCR-replace: Could not find word '{unknownWord.Word.FixedWord}' in text '{item.Text}' to replace with '{word}' at index {unknownWord.Word.WordIndex}"); } } } diff --git a/src/UI/Features/Tools/BeautifyTimeCodes/BeautifyTimeCodesViewModel.cs b/src/UI/Features/Tools/BeautifyTimeCodes/BeautifyTimeCodesViewModel.cs index df44a6ec12d..d5bf66240be 100644 --- a/src/UI/Features/Tools/BeautifyTimeCodes/BeautifyTimeCodesViewModel.cs +++ b/src/UI/Features/Tools/BeautifyTimeCodes/BeautifyTimeCodesViewModel.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; namespace Nikse.SubtitleEdit.Features.Tools.BeautifyTimeCodes; @@ -18,13 +19,15 @@ public partial class BeautifyTimeCodesViewModel : ObservableObject, IDisposable private readonly System.Timers.Timer _timerUpdatePreview; private Avalonia.Threading.DispatcherTimer? _positionTimer; - private bool _dirty; + private volatile bool _dirty; + private volatile bool _updateInProgress; + private readonly Lock _timerLock = new Lock(); private readonly List _allSubtitles; private readonly List _originalSubtitles; private readonly List _beautifiedSubtitles; private List _shotChanges; private double _frameRate = 25.0; - private bool _disposed; + private volatile bool _disposed; [ObservableProperty] private BeautifySettings _settings; @@ -44,15 +47,28 @@ public BeautifyTimeCodesViewModel() _shotChanges = new List(); _timerUpdatePreview = new System.Timers.Timer(500); + _timerUpdatePreview.AutoReset = false; _timerUpdatePreview.Elapsed += (s, e) => { - _timerUpdatePreview.Stop(); - if (_dirty) + if (!_dirty || _updateInProgress) { + _timerUpdatePreview.Start(); + return; + } + + lock (_timerLock) + { + if (!_dirty || _updateInProgress) + { + _timerUpdatePreview.Start(); + return; + } + _dirty = false; - UpdatePreview(); + _updateInProgress = true; } - _timerUpdatePreview.Start(); + + UpdatePreview(); }; // Listen to settings changes @@ -63,6 +79,11 @@ private void UpdatePreview() { if (AudioVisualizerBeautified == null || _allSubtitles.Count == 0) { + _updateInProgress = false; + if (!_disposed) + { + _timerUpdatePreview.Start(); + } return; } @@ -73,27 +94,31 @@ private void UpdatePreview() Avalonia.Threading.Dispatcher.UIThread.Post(() => { - if (_disposed || AudioVisualizerBeautified == null) + if (!_disposed && AudioVisualizerBeautified != null) { - return; + // Reuse existing ViewModels and just update their properties + _beautifiedSubtitles.Clear(); + var subRipFormat = new Core.SubtitleFormats.SubRip(); + for (int i = 0; i < beautifiedParagraphs.Count; i++) + { + var p = beautifiedParagraphs[i]; + var vm = new SubtitleLineViewModel(p, subRipFormat) + { + Number = i + 1 + }; + _beautifiedSubtitles.Add(vm); + } + + // Update the beautified visualizer's paragraphs + AudioVisualizerBeautified.AllSelectedParagraphs = new List(_beautifiedSubtitles); + AudioVisualizerBeautified.InvalidateVisual(); } - // Reuse existing ViewModels and just update their properties - _beautifiedSubtitles.Clear(); - var subRipFormat = new Core.SubtitleFormats.SubRip(); - for (int i = 0; i < beautifiedParagraphs.Count; i++) + _updateInProgress = false; + if (!_disposed) { - var p = beautifiedParagraphs[i]; - var vm = new SubtitleLineViewModel(p, subRipFormat) - { - Number = i + 1 - }; - _beautifiedSubtitles.Add(vm); + _timerUpdatePreview.Start(); } - - // Update the beautified visualizer's paragraphs - AudioVisualizerBeautified.AllSelectedParagraphs = new List(_beautifiedSubtitles); - AudioVisualizerBeautified.InvalidateVisual(); }); } @@ -196,6 +221,7 @@ private void StopPositionTimer() private void Ok() { StopPositionTimer(); + _timerUpdatePreview.Stop(); // Apply final beautification var paragraphs = _allSubtitles.Select(p => p.Paragraph!).OrderBy(p => p.StartTime.TotalMilliseconds).ToList(); @@ -217,6 +243,7 @@ private void Ok() private void Cancel() { StopPositionTimer(); + _timerUpdatePreview.Stop(); Window?.Close(); } @@ -230,7 +257,7 @@ internal void OnKeyDown(KeyEventArgs e) if (e.Key == Key.Escape) { e.Handled = true; - Window?.Close(); + Cancel(); } else if (UiUtil.IsHelp(e)) { @@ -251,10 +278,10 @@ public void Dispose() return; } - StopPositionTimer(); - _timerUpdatePreview?.Stop(); - _timerUpdatePreview?.Dispose(); - _disposed = true; + + StopPositionTimer(); + _timerUpdatePreview.Stop(); + _timerUpdatePreview.Dispose(); } } \ No newline at end of file From 172c7895cd92b1657e659a20972a630112269227 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Wed, 8 Apr 2026 15:25:10 +0200 Subject: [PATCH 66/74] Minor clean --- src/UI/Controls/AudioVisualizerControl/AudioVisualizer.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/UI/Controls/AudioVisualizerControl/AudioVisualizer.cs b/src/UI/Controls/AudioVisualizerControl/AudioVisualizer.cs index 0cc9bb7f3ee..b2bc663053e 100644 --- a/src/UI/Controls/AudioVisualizerControl/AudioVisualizer.cs +++ b/src/UI/Controls/AudioVisualizerControl/AudioVisualizer.cs @@ -76,11 +76,7 @@ public WavePeakData2? WavePeaks public double StartPositionSeconds { get => GetValue(StartPositionSecondsProperty); - set - { - var clampedValue = Math.Max(0, Math.Min(value, MaxStartPositionSeconds)); - SetValue(StartPositionSecondsProperty, clampedValue); - } + set => SetValue(StartPositionSecondsProperty, Math.Clamp(value, 0, MaxStartPositionSeconds)); } public double ZoomFactor @@ -629,7 +625,7 @@ private void OnPointerWheelChanged(object? sender, PointerWheelEventArgs e) newStart = 0; } - _audioVisualizerLastScroll = Environment.TickCount64; // Update the last scroll time + _audioVisualizerLastScroll = _lastMouseWheelScroll; // Update the last scroll time StartPositionSeconds = newStart; OnHorizontalScroll?.Invoke(this, new PositionEventArgs { PositionInSeconds = newStart }); From cc121e1dc92954a1c7badc02974db5aa310f6d16 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Wed, 8 Apr 2026 15:41:26 +0200 Subject: [PATCH 67/74] Minor clean --- src/UI/Controls/AudioVisualizerControl/IsSelectedHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UI/Controls/AudioVisualizerControl/IsSelectedHelper.cs b/src/UI/Controls/AudioVisualizerControl/IsSelectedHelper.cs index 13a37db59e6..d95c4f126e5 100644 --- a/src/UI/Controls/AudioVisualizerControl/IsSelectedHelper.cs +++ b/src/UI/Controls/AudioVisualizerControl/IsSelectedHelper.cs @@ -48,7 +48,7 @@ private void FindNextSelection(int position) } } - private struct SelectionRange + private readonly struct SelectionRange { public readonly int Start; public readonly int End; From c9eebf88fba17c0f1ba68744ec537cb926870c68 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Wed, 8 Apr 2026 19:47:55 +0200 Subject: [PATCH 68/74] Try to fix assa style issue - thx esprit-mi :) Work n #10569 --- src/UI/Features/Main/MainViewModel.cs | 29 +++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/UI/Features/Main/MainViewModel.cs b/src/UI/Features/Main/MainViewModel.cs index 924d881a8d7..b4ed8c24a28 100644 --- a/src/UI/Features/Main/MainViewModel.cs +++ b/src/UI/Features/Main/MainViewModel.cs @@ -787,7 +787,7 @@ private void SetLayout(int layoutNumber) private void RefreshSubtitlePreview() { _mpvReloader.Reset(); - _vlcReloader.Reset(); + _vlcReloader.Reset(); _mpvPreviewDirty = true; } @@ -911,7 +911,20 @@ private async Task ShowAssaStyles() { ApplyAssaStyles(result); _subtitle.Footer = result.ResultSubtitle.Footer; - RefreshSubtitlePreview(); + + var styles = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); + foreach (var s in Subtitles) + { + if (!styles.Contains(s.Style)) + { + if (!styles.Contains(s.Style)) + { + s.Style = styles.FirstOrDefault() ?? "Default"; + } + } + } + + RefreshSubtitlePreview(); } } @@ -963,7 +976,7 @@ private async Task ShowAssaProperties() RefreshSubtitlePreview(); } } - + [RelayCommand] private async Task ShowAssaAttachments() { @@ -1757,12 +1770,12 @@ private async Task OpenContainingFolder() await _folderHelper.OpenFolderWithFileSelected(Window!, _subtitleFileName); _shortcutManager.ClearKeys(); } - + [RelayCommand] private void ToggleCurrentSubtitleWhilePlaying() { SelectCurrentSubtitleWhilePlaying = !SelectCurrentSubtitleWhilePlaying; - + if (SelectCurrentSubtitleWhilePlaying) { ShowStatus(Se.Language.Main.SelectCurrentSubtitleWhilePlayingOn); @@ -8228,7 +8241,7 @@ private void VideoFullScreen() _vlcReloader.RefreshVlc(vlc, GetUpdateSubtitle(), _subtitleSecondary, SelectedSubtitleFormat); } } - + RefreshSubtitlePreview(); } @@ -12712,7 +12725,7 @@ public int GetFastHash() { var p = Subtitles[i]; - hash = hash * 23 + p.Number; + hash = hash * 23 + p.Number; hash = hash * 23 + p.StartTime.TotalMilliseconds.GetHashCode(); hash = hash * 23 + p.EndTime.TotalMilliseconds.GetHashCode(); @@ -12748,7 +12761,7 @@ public int GetFastHashOriginal() { var p = Subtitles[i]; - hash = hash * 23 + p.Number; + hash = hash * 23 + p.Number; hash = hash * 23 + p.StartTime.TotalMilliseconds.GetHashCode(); hash = hash * 23 + p.EndTime.TotalMilliseconds.GetHashCode(); From a7b693b2d8039d08642a525f55202670ca61f7fd Mon Sep 17 00:00:00 2001 From: Ivandro Jao Date: Wed, 8 Apr 2026 23:56:24 +0100 Subject: [PATCH 69/74] Fix Settings.PropertyChanged subscription leak in BeautifyTimeCodesViewModel Unsubscribe from Settings.PropertyChanged in Dispose() to prevent the handler from keeping the VM alive after the window is closed. Co-Authored-By: Claude Sonnet 4.6 --- .../Tools/BeautifyTimeCodes/BeautifyTimeCodesViewModel.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/UI/Features/Tools/BeautifyTimeCodes/BeautifyTimeCodesViewModel.cs b/src/UI/Features/Tools/BeautifyTimeCodes/BeautifyTimeCodesViewModel.cs index d5bf66240be..332f41a8334 100644 --- a/src/UI/Features/Tools/BeautifyTimeCodes/BeautifyTimeCodesViewModel.cs +++ b/src/UI/Features/Tools/BeautifyTimeCodes/BeautifyTimeCodesViewModel.cs @@ -6,6 +6,7 @@ using Nikse.SubtitleEdit.Logic; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Threading; @@ -28,6 +29,7 @@ public partial class BeautifyTimeCodesViewModel : ObservableObject, IDisposable private List _shotChanges; private double _frameRate = 25.0; private volatile bool _disposed; + private readonly PropertyChangedEventHandler _settingsChangedHandler; [ObservableProperty] private BeautifySettings _settings; @@ -72,7 +74,8 @@ public BeautifyTimeCodesViewModel() }; // Listen to settings changes - Settings.PropertyChanged += (s, e) => { _dirty = true; }; + _settingsChangedHandler = (s, e) => { _dirty = true; }; + Settings.PropertyChanged += _settingsChangedHandler; } private void UpdatePreview() @@ -280,6 +283,7 @@ public void Dispose() _disposed = true; + Settings.PropertyChanged -= _settingsChangedHandler; StopPositionTimer(); _timerUpdatePreview.Stop(); _timerUpdatePreview.Dispose(); From 3d64263d05a7f9c3d938910e428c757fa534474f Mon Sep 17 00:00:00 2001 From: Ivandro Jao Date: Wed, 8 Apr 2026 23:57:12 +0100 Subject: [PATCH 70/74] Fix vm.PropertyChanged subscription leak in OcrWindow Store handler reference and unsubscribe on window Closed to prevent the VM from keeping window UI elements alive after closing. Co-Authored-By: Claude Sonnet 4.6 --- src/UI/Features/Ocr/OcrWindow.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/UI/Features/Ocr/OcrWindow.cs b/src/UI/Features/Ocr/OcrWindow.cs index f1a0ccdc433..a28e71f0ca0 100644 --- a/src/UI/Features/Ocr/OcrWindow.cs +++ b/src/UI/Features/Ocr/OcrWindow.cs @@ -12,6 +12,7 @@ using Nikse.SubtitleEdit.Logic.ValueConverters; using Projektanker.Icons.Avalonia; using System; +using System.ComponentModel; using Avalonia.Input; using MenuItem = Avalonia.Controls.MenuItem; @@ -68,7 +69,7 @@ public OcrWindow(OcrViewModel vm) var savedHeight = (double)editViewHeight; // Collapse row when OCR is running, restore when stopped - vm.PropertyChanged += (s, e) => + PropertyChangedEventHandler ocrRunningHandler = (s, e) => { if (e.PropertyName == nameof(vm.IsOcrRunning)) { @@ -88,6 +89,7 @@ public OcrWindow(OcrViewModel vm) { savedHeight = editViewRow.Height.Value; } + // Use Auto to collapse (content is hidden via binding) editViewRow.Height = new GridLength(1, GridUnitType.Auto); editViewRow.MinHeight = 0; @@ -107,11 +109,8 @@ public OcrWindow(OcrViewModel vm) }); } }; - - - - - + vm.PropertyChanged += ocrRunningHandler; + Closed += (_, _) => vm.PropertyChanged -= ocrRunningHandler; // Set initial state if OCR is already running when window opens if (vm.IsOcrRunning) From 71b00a89d14a6edafd757905c6586626f4eb3ebe Mon Sep 17 00:00:00 2001 From: niksedk Date: Thu, 9 Apr 2026 06:24:26 +0200 Subject: [PATCH 71/74] Fix double if-statement - thx ivandrofly :) --- src/UI/Features/Main/MainViewModel.cs | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/UI/Features/Main/MainViewModel.cs b/src/UI/Features/Main/MainViewModel.cs index b4ed8c24a28..98f6d02b03c 100644 --- a/src/UI/Features/Main/MainViewModel.cs +++ b/src/UI/Features/Main/MainViewModel.cs @@ -582,16 +582,13 @@ private void FirstLoad() var languageCode = File.ReadAllText(setupLanguageFile).Trim(); var language = Iso639Dash2LanguageCode.List .FirstOrDefault(p => languageCode.StartsWith(p.ThreeLetterCode, StringComparison.OrdinalIgnoreCase) || - languageCode.StartsWith(p.TwoLetterCode, StringComparison.OrdinalIgnoreCase)); + languageCode.StartsWith(p.TwoLetterCode, StringComparison.OrdinalIgnoreCase)); if (language != null) { var translationFiles = Directory.GetFiles(Se.TranslationFolder, language.EnglishName + ".json"); if (translationFiles?.Length > 0) { - Dispatcher.UIThread.Post(async void () => - { - await LoadLanguage(translationFiles[0]); - }); + Dispatcher.UIThread.Post(async void () => { await LoadLanguage(translationFiles[0]); }); } } } @@ -917,10 +914,7 @@ private async Task ShowAssaStyles() { if (!styles.Contains(s.Style)) { - if (!styles.Contains(s.Style)) - { - s.Style = styles.FirstOrDefault() ?? "Default"; - } + s.Style = styles.FirstOrDefault() ?? "Default"; } } @@ -1054,6 +1048,7 @@ private async Task ShowAssaDraw() { insertIndex = Subtitles.Count; } + Subtitles.Insert(insertIndex, newP); lastParagraph = newP; } @@ -2810,6 +2805,7 @@ private string AddSpaceBeforeUppercaseLetter(string spectrogramStyle) { sb.Append(' '); } + sb.Append(c); } @@ -3220,6 +3216,7 @@ private async Task ColumnCopyTextFromOriginalToCurrent() { selectedItem.Text = selectedItem.OriginalText; } + _undoRedoManager.StartChangeDetection(); _updateAudioVisualizer = true; @@ -5501,10 +5498,7 @@ private async Task ShowSyncChangeFrameRate() return; } - var result = await ShowDialogAsync(vm => - { - vm.Initialize(_videoFileName, _mediaInfo); - }); + var result = await ShowDialogAsync(vm => { vm.Initialize(_videoFileName, _mediaInfo); }); if (result.OkPressed) { ChangeFrameRateViewModel.ChangeFrameRate(Subtitles, result.SelectedFromFrameRate, result.SelectedToFrameRate); @@ -6702,6 +6696,7 @@ private void InsertLineAtEnd() Renumber(); SelectAndScrollToRow(lastIndex + 1); } + _updateAudioVisualizer = true; _undoRedoManager.StartChangeDetection(); @@ -13850,6 +13845,7 @@ public void SubtitleGrid_PointerMoved(object? sender, PointerEventArgs e) SubtitleGrid.SelectedItems.Add(Subtitles[i]); } } + _subtitleGridSelectionChangedSkip = false; SubtitleGridSelectionChanged(); @@ -14170,6 +14166,7 @@ private void StartTimers() { SelectAndScrollToRow(idx + 1); } + _setEndAtKeyUpLine = null; _setEndAtKeyUpLineGoToNext = false; } From 4b61e042bd05ea386dd1ed32c0c419eed6e3addb Mon Sep 17 00:00:00 2001 From: niksedk Date: Thu, 9 Apr 2026 06:59:13 +0200 Subject: [PATCH 72/74] Fix prompting for unknown words in Tesseract OCR - thx Ryu481 :) Fix #10573 --- src/UI/Features/Ocr/OcrViewModel.cs | 77 ++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/src/UI/Features/Ocr/OcrViewModel.cs b/src/UI/Features/Ocr/OcrViewModel.cs index 731fe838124..a4262972e1b 100644 --- a/src/UI/Features/Ocr/OcrViewModel.cs +++ b/src/UI/Features/Ocr/OcrViewModel.cs @@ -1996,6 +1996,7 @@ await _windowService } } + RefreshSpellCheckColoring(i, item); tcs.SetResult(true); }); await tcs.Task; @@ -2355,6 +2356,7 @@ await _windowService } } + RefreshSpellCheckColoring(i, item); tcs.SetResult(true); }); await tcs.Task; @@ -2368,6 +2370,17 @@ await _windowService IsOcrRunning = false; } + private void RefreshSpellCheckColoring(int lineIndex, OcrSubtitleItem item) + { + if (!_ocrFixEngine.IsLoaded() || SelectedDictionary == null || SelectedDictionary.Name == GetDictionaryNameNone()) + { + return; + } + + var updatedResult = _ocrFixEngine.FixOcrErrors(lineIndex, item, DoTryToGuessUnknownWords); + item.FixResult = updatedResult; + } + private static void ChangeWord(OcrSubtitleItem item, UnknownWordItem unknownWord, string word) { if (unknownWord.Word.FixedWord == word) @@ -2641,7 +2654,69 @@ private void RunTesseractOcr(List selectedIndices, CancellationToken cancel var text = await tesseractOcr.Ocr(bitmap, language, cancellationToken); item.Text = text; - OcrFixLineAndSetText(i, item); + var unknownWords = OcrFixLineAndSetText(i, item); + + if (DoPromptForUnknownWords && unknownWords.Count > 0) + { + var tcs = new TaskCompletionSource(); + Dispatcher.UIThread.Post(async () => + { + foreach (var unknownWord in unknownWords) + { + var suggestions = _ocrFixEngine.GetSpellCheckSuggestions(unknownWord.Word.FixedWord); + var result = await _windowService.ShowDialogAsync(Window!, + vm => { vm.Initialize(item.GetBitmap(), item.Text, unknownWord, suggestions); }); + + if (result.ChangeWholeTextPressed) + { + item.Text = result.WholeText; + break; + } + else if (result.ChangeOncePressed) + { + ChangeWord(item, unknownWord, result.Word); + } + else if (result.ChangeAllPressed) + { + ChangeWord(item, unknownWord, result.Word); + _ocrFixEngine.ChangeAll(unknownWord.Word.Word, result.Word); + } + else if (result.SkipOncePressed) + { + // do nothing + } + else if (result.SkipAllPressed) + { + _ocrFixEngine.SkipAll(unknownWord.Word.Word); + } + else if (result.AddToNamesListPressed) + { + _ocrFixEngine.AddName(unknownWord.Word.Word); + } + else if (result.AddToUserDictionaryPressed) + { + if (SelectedDictionary != null) + { + UserWordsHelper.AddToUserDictionary(unknownWord.Word.Word, SelectedDictionary.GetFiveLetterLanguageName() ?? "en_US"); + } + } + else + { + _cancellationTokenSource.Cancel(); + IsOcrRunning = false; + break; + } + } + + RefreshSpellCheckColoring(i, item); + tcs.SetResult(true); + }); + await tcs.Task; + if (!IsOcrRunning) + { + return; + } + } } PauseOcr(); From 73933629d1718714d289a1458d33ac990407e928 Mon Sep 17 00:00:00 2001 From: Ivandro Jao Date: Thu, 9 Apr 2026 21:43:35 +0100 Subject: [PATCH 73/74] Fix numpad vs non-numpad key ambiguity in shortcut binding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, Avalonia's logical Key enum could not distinguish between numpad keys (with NumLock off) and their non-numpad counterparts. For example, pressing NumPad7 with NumLock off would produce Key.Home — identical to the regular Home key — making it impossible to bind different shortcuts to the two keys. Root cause: Avalonia's Key enum represents *logical* keys. When NumLock is off, numpad 7 fires Key.Home, numpad 1 fires Key.End, numpad 0 fires Key.Insert, NumPadDecimal fires Key.Delete, etc. The logical key alone carries no information about whether the key originated from the numpad. Fix: Use KeyEventArgs.PhysicalKey, which reflects the actual hardware key regardless of NumLock state. All numpad physical keys in Avalonia are named with the "NumPad" prefix (NumPad0–NumPad9, NumPadDecimal, etc.), while their logical counterparts are not (Home, End, Insert, Delete, etc.). The new GetEffectiveKeyName() helper returns the PhysicalKey name when the physical key is a numpad key, and the logical Key name otherwise. Concretely: - Regular Home: PhysicalKey.Home → "Home" - NumPad7 (NumLock ON): PhysicalKey.NumPad7 → "NumPad7" - NumPad7 (NumLock OFF): PhysicalKey.NumPad7 → "NumPad7" ← was "Home" Changes: - ShortcutManager: added GetEffectiveKeyName(Key, PhysicalKey) static helper and a parallel _activeEffectiveNames: HashSet that tracks pressed keys using the physical override for numpad. The existing _activeKeys: HashSet is preserved unchanged so callers that rely on the logical Key enum (e.g. AllowedSingleKeyShortcuts filtering, GetActiveKeys().Count checks) continue to work. The shortcut hash lookup in CheckShortcuts now iterates _activeEffectiveNames instead of _activeKeys. - GetKeyViewModel: when the user presses a key to record a shortcut binding, the stored key name is now derived via GetEffectiveKeyName() so that numpad 7 (either NumLock state) is recorded as "NumPad7" rather than "Home", matching what CheckShortcuts will see at runtime. Co-Authored-By: Claude Sonnet 4.6 --- .../Options/Shortcuts/GetKeyViewModel.cs | 10 ++++++---- src/UI/Logic/ShortcutManager.cs | 19 ++++++++++++++++--- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/UI/Features/Options/Shortcuts/GetKeyViewModel.cs b/src/UI/Features/Options/Shortcuts/GetKeyViewModel.cs index ce19ea84783..ae831267e74 100644 --- a/src/UI/Features/Options/Shortcuts/GetKeyViewModel.cs +++ b/src/UI/Features/Options/Shortcuts/GetKeyViewModel.cs @@ -3,6 +3,7 @@ using Avalonia.Input; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; +using Nikse.SubtitleEdit.Logic; using Nikse.SubtitleEdit.Logic.Config; namespace Nikse.SubtitleEdit.Features.Options.Shortcuts; @@ -82,8 +83,9 @@ Key.LeftAlt or Key.RightAlt or var shiftLabel = isMac ? Se.Language.Options.Shortcuts.ShiftMac : Se.Language.Options.Shortcuts.Shift; var winLabel = isMac ? Se.Language.Options.Shortcuts.WinMac : Se.Language.Options.Shortcuts.Win; - PressedKey = e.Key.ToString(); - PressedKeyOnly = PressedKey; + var effectiveKey = ShortcutManager.GetEffectiveKeyName(e.Key, e.PhysicalKey); + PressedKey = effectiveKey; + PressedKeyOnly = effectiveKey; IsControlPressed = e.KeyModifiers.HasFlag(KeyModifiers.Control); IsAltPressed = e.KeyModifiers.HasFlag(KeyModifiers.Alt); IsShiftPressed = e.KeyModifiers.HasFlag(KeyModifiers.Shift); @@ -119,8 +121,8 @@ Key.LeftAlt or Key.RightAlt or infoText += winLabel + " + "; } - PressedKey += e.Key; - infoText += e.Key; + PressedKey += effectiveKey; + infoText += effectiveKey; InfoText = string.Format(Se.Language.Options.Shortcuts.PressedKeyX, infoText); } diff --git a/src/UI/Logic/ShortcutManager.cs b/src/UI/Logic/ShortcutManager.cs index fe9e9c0799e..af5ccf264ad 100644 --- a/src/UI/Logic/ShortcutManager.cs +++ b/src/UI/Logic/ShortcutManager.cs @@ -11,12 +11,21 @@ namespace Nikse.SubtitleEdit.Logic; public class ShortcutManager : IShortcutManager { private readonly HashSet _activeKeys = []; + private readonly HashSet _activeEffectiveNames = []; private readonly List _shortcuts = []; private FrozenDictionary? _lookupTable; private bool _isDirty = true; private bool _isControlPressed = false; private bool _isShiftPressed = false; + // When NumLock is off, numpad navigation keys (e.g. NumPad7) produce the same logical Key as + // their non-numpad counterparts (Key.Home). Use the PhysicalKey name to keep them distinct. + public static string GetEffectiveKeyName(Key logicalKey, PhysicalKey physicalKey) + { + var physicalName = physicalKey.ToString(); + return physicalName.StartsWith("NumPad", StringComparison.Ordinal) ? physicalName : logicalKey.ToString(); + } + public static string GetKeyDisplayName(string key) { bool isMac = OperatingSystem.IsMacOS(); @@ -51,6 +60,7 @@ Key.LeftAlt or Key.RightAlt or Key.LWin or Key.RWin)) { _activeKeys.Add(e.Key); + _activeEffectiveNames.Add(GetEffectiveKeyName(e.Key, e.PhysicalKey)); } _isControlPressed = e.KeyModifiers.HasFlag(KeyModifiers.Control); @@ -63,10 +73,12 @@ public void OnKeyReleased(object? sender, KeyEventArgs e) Key.ImeAccept or Key.ImeModeChange or Key.DeadCharProcessed or Key.None) { _activeKeys.Clear(); + _activeEffectiveNames.Clear(); } else { _activeKeys.Remove(e.Key); + _activeEffectiveNames.Remove(GetEffectiveKeyName(e.Key, e.PhysicalKey)); } _isControlPressed = e.KeyModifiers.HasFlag(KeyModifiers.Control); @@ -76,6 +88,7 @@ public void OnKeyReleased(object? sender, KeyEventArgs e) public void ClearKeys() { _activeKeys.Clear(); + _activeEffectiveNames.Clear(); _isControlPressed = false; _isShiftPressed = false; } @@ -125,11 +138,11 @@ private void RebuildLookupTable() } // Build the current state key list with initial capacity - var currentInputKeys = new List(_activeKeys.Count + 2); + var currentInputKeys = new List(_activeEffectiveNames.Count + 2); - foreach (var key in _activeKeys) + foreach (var name in _activeEffectiveNames) { - currentInputKeys.Add(key.ToString()); + currentInputKeys.Add(name); } // Add normalized modifiers based on the event state From 7f70fd88770c942c9d8f65123f7cb3b0d8a4e266 Mon Sep 17 00:00:00 2001 From: Ivandro Jao Date: Fri, 10 Apr 2026 01:35:57 +0100 Subject: [PATCH 74/74] Consolidate repeated null checks in Program.ConfigureApplication Replace six separate `b.Instance != null` checks with a single early-return guard clause using pattern matching, reducing noise and improving readability. Co-Authored-By: Claude Opus 4.6 --- src/UI/Program.cs | 54 +++++++++++++++++------------------------------ 1 file changed, 19 insertions(+), 35 deletions(-) diff --git a/src/UI/Program.cs b/src/UI/Program.cs index d5d53f739b1..d38753e1429 100644 --- a/src/UI/Program.cs +++ b/src/UI/Program.cs @@ -91,6 +91,11 @@ public static void Main(string[] args) private static void ConfigureApplication(AppBuilder b, ClassicDesktopStyleApplicationLifetime lifetime) { + if (b.Instance is not { } app) + { + return; + } + // Setup Fluent theme UiTheme.FluentTheme = new FluentTheme(); UiTheme.FluentTheme.Palettes.Add(ThemeVariant.Dark, new ColorPaletteResources() @@ -98,54 +103,33 @@ private static void ConfigureApplication(AppBuilder b, ClassicDesktopStyleApplic RegionColor = UiUtil.GetDarkThemeBackgroundColor(), }); - if (b.Instance != null) - { - b.Instance.Styles.Add(UiTheme.FluentTheme); - } + app.Styles.Add(UiTheme.FluentTheme); - // Add DataGrid styles - if (b.Instance != null) + // Add DataGrid, AvaloniaEdit, and ColorPicker styles + app.Styles.Add(new StyleInclude(new Uri("avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml", UriKind.Absolute)) { - b.Instance.Styles.Add(new StyleInclude(new Uri("avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml", UriKind.Absolute)) - { - Source = new Uri("avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml") - }); - } + Source = new Uri("avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml") + }); - if (b.Instance != null) + app.Styles.Add(new StyleInclude(new Uri("avares://AvaloniaEdit/Themes/Fluent/AvaloniaEdit.xaml", UriKind.Absolute)) { - b.Instance.Styles.Add(new StyleInclude(new Uri("avares://AvaloniaEdit/Themes/Fluent/AvaloniaEdit.xaml", UriKind.Absolute)) - { - Source = new Uri("avares://AvaloniaEdit/Themes/Fluent/AvaloniaEdit.xaml") - }); - } + Source = new Uri("avares://AvaloniaEdit/Themes/Fluent/AvaloniaEdit.xaml") + }); - // Add ColorPicker styles - if (b.Instance != null) + app.Styles.Add(new StyleInclude(new Uri("avares://Avalonia.Controls.ColorPicker/Themes/Fluent/Fluent.xaml", UriKind.Absolute)) { - b.Instance.Styles.Add(new StyleInclude(new Uri("avares://Avalonia.Controls.ColorPicker/Themes/Fluent/Fluent.xaml", UriKind.Absolute)) - { - Source = new Uri("avares://Avalonia.Controls.ColorPicker/Themes/Fluent/Fluent.xaml", UriKind.Absolute) - }); - } + Source = new Uri("avares://Avalonia.Controls.ColorPicker/Themes/Fluent/Fluent.xaml", UriKind.Absolute) + }); // Set custom font - if (Application.Current != null && !string.IsNullOrEmpty(Se.Settings.Appearance.FontName)) + if (!string.IsNullOrEmpty(Se.Settings.Appearance.FontName)) { UiUtil.SetFontName(Se.Settings.Appearance.FontName); } - // Set application name - if (b.Instance != null) - { - b.Instance.Name = "Subtitle Edit"; - } + app.Name = "Subtitle Edit"; - // Setup native menu - if (b.Instance != null) - { - SetupNativeMenu(b.Instance, lifetime); - } + SetupNativeMenu(app, lifetime); } private static void SetupNativeMenu(Application app, ClassicDesktopStyleApplicationLifetime lifetime)