Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions src/ui/Features/Main/MainViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12682,12 +12682,15 @@ private async Task AutoTranslateSelectedLines()
return;
}

var captureOriginal = noOriginal && !result.TranslateInPlace;
if (captureOriginal && !result.Rows.Any(r => !string.IsNullOrEmpty(r.TranslatedText)))
// OK can be enabled after a partial/cancelled translation run. If no row actually
// contains translated text, the operation is a no-op in both modes: do not capture an
// original and do not reset language/spell-check state for unchanged subtitle content.
if (!result.Rows.Any(r => !string.IsNullOrEmpty(r.TranslatedText)))
{
return; // nothing came back - do not switch to translator mode for an unchanged subtitle
return;
}

var captureOriginal = noOriginal && !result.TranslateInPlace;
var wasOldTranslationChanged = captureOriginal && _changeSubtitleHash != GetFastHash();

if (captureOriginal)
Expand Down
44 changes: 41 additions & 3 deletions tests/UI/Features/Main/AutoTranslateSelectedLinesTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,39 @@ public async Task NoOriginal_TranslateInPlaceChecked_LeavesNoOriginal()
}
}

[AvaloniaFact]
public async Task NoOriginal_TranslateInPlaceWithNoResult_IsNoOp()
{
var (window, vm) = CreateMainViewModel();
try
{
AddLine(vm, "One", 0, 1000);
AddLine(vm, "Two", 1000, 2000);
var rows = vm.Subtitles.ToList();
vm.SubtitleGrid.SelectedItems?.Clear();
vm.SubtitleGrid.SelectedItems?.Add(rows[0]);
await SettleAsync(window);

// OnSubtitleLanguageChanged clears this cache. An empty in-place result must leave it
// untouched because no subtitle text changed.
var detectedField = typeof(MainViewModel).GetField("_detectedLanguageCode", BindingFlags.Instance | BindingFlags.NonPublic)!;
detectedField.SetValue(vm, "zz");

FakeTranslateWindowService.Install(vm, translateInPlace: true, produceTranslations: false);
await vm.AutoTranslateSelectedLinesCommand.ExecuteAsync(null);
await SettleAsync(window);

Assert.Equal(new[] { "One", "Two" }, vm.Subtitles.Select(p => p.Text));
Assert.All(vm.Subtitles, p => Assert.True(string.IsNullOrEmpty(p.OriginalText)));
Assert.False(vm.ShowColumnOriginalText);
Assert.Equal("zz", detectedField.GetValue(vm));
}
finally
{
CloseWindow(window, vm);
}
}

private static List<string> GridCellTexts(MainViewModel vm)
{
return vm.SubtitleGrid.GetVisualDescendants().OfType<TextBlock>()
Expand All @@ -97,12 +130,14 @@ private static List<string> GridCellTexts(MainViewModel vm)
public class FakeTranslateWindowService : DispatchProxy
{
private static bool _translateInPlace;
private static bool _produceTranslations = true;

public static bool LastInPlaceOffered { get; private set; }

public static void Install(MainViewModel vm, bool translateInPlace)
public static void Install(MainViewModel vm, bool translateInPlace, bool produceTranslations = true)
{
_translateInPlace = translateInPlace;
_produceTranslations = produceTranslations;
var field = typeof(MainViewModel).GetField("_windowService", BindingFlags.Instance | BindingFlags.NonPublic)!;
field.SetValue(vm, Create<IWindowService, FakeTranslateWindowService>());
}
Expand All @@ -121,9 +156,12 @@ public static void Install(MainViewModel vm, bool translateInPlace)
translateVm.OnLoaded();
LastInPlaceOffered = translateVm.TranslateInPlaceIsVisible;
translateVm.TranslateInPlace = _translateInPlace;
foreach (var row in translateVm.Rows)
if (_produceTranslations)
{
row.TranslatedText = "T:" + row.Text;
foreach (var row in translateVm.Rows)
{
row.TranslatedText = "T:" + row.Text;
}
}

translateVm.OkPressed = true;
Expand Down
Loading