Implemented live translation

This commit is contained in:
Thorsten Sommer 2024-07-14 21:21:23 +02:00
parent 382304be8e
commit ba6610bd96
Signed by: tsommer
GPG Key ID: 371BBA77A02C0108
2 changed files with 39 additions and 6 deletions

View File

@ -3,13 +3,33 @@
@using AIStudio.Tools @using AIStudio.Tools
@inherits AssistantBaseCore @inherits AssistantBaseCore
<MudTextField T="string" @bind-Text="@this.inputText" Validation="@this.ValidatingText" AdornmentIcon="@Icons.Material.Filled.DocumentScanner" Adornment="Adornment.Start" Label="Your input" Variant="Variant.Outlined" Lines="6" AutoGrow="@true" MaxLines="12" Class="mb-3"/> <MudField Label="Live translation" Variant="Variant.Outlined" Class="mb-3">
<MudSwitch T="bool" @bind-Value="@this.liveTranslation">
@(this.liveTranslation ? "Live translation" : "No live translation")
</MudSwitch>
</MudField>
@if (this.liveTranslation)
{
<MudTextField T="string" @bind-Text="@this.inputText" Validation="@this.ValidatingText" AdornmentIcon="@Icons.Material.Filled.DocumentScanner" Adornment="Adornment.Start" Label="Your input" Variant="Variant.Outlined" Lines="6" AutoGrow="@true" MaxLines="12" Class="mb-3" Immediate="@true" DebounceInterval="1_000" OnDebounceIntervalElapsed="() => this.TranslateText(force: false)"/>
}
else
{
<MudTextField T="string" @bind-Text="@this.inputText" Validation="@this.ValidatingText" AdornmentIcon="@Icons.Material.Filled.DocumentScanner" Adornment="Adornment.Start" Label="Your input" Variant="Variant.Outlined" Lines="6" AutoGrow="@true" MaxLines="12" Class="mb-3" />
}
<MudStack Row="@true" AlignItems="AlignItems.Center" Class="mb-3"> <MudStack Row="@true" AlignItems="AlignItems.Center" Class="mb-3">
<MudSelect T="CommonLanguages" @bind-Value="@this.selectedTargetLanguage" AdornmentIcon="@Icons.Material.Filled.Translate" Adornment="Adornment.Start" Label="Target language" Variant="Variant.Outlined" Margin="Margin.Dense"> <MudSelect T="CommonLanguages" @bind-Value="@this.selectedTargetLanguage" Validation="@this.ValidatingTargetLanguage" AdornmentIcon="@Icons.Material.Filled.Translate" Adornment="Adornment.Start" Label="Target language" Variant="Variant.Outlined" Margin="Margin.Dense">
@foreach (var targetLanguage in Enum.GetValues<CommonLanguages>()) @foreach (var targetLanguage in Enum.GetValues<CommonLanguages>())
{ {
<MudSelectItem Value="@targetLanguage">@targetLanguage.Name()</MudSelectItem> if (targetLanguage is CommonLanguages.AS_IS)
{
<MudSelectItem Value="@targetLanguage">Please select the target language</MudSelectItem>
}
else
{
<MudSelectItem Value="@targetLanguage">@targetLanguage.Name()</MudSelectItem>
}
} }
</MudSelect> </MudSelect>
@if (this.selectedTargetLanguage is CommonLanguages.OTHER) @if (this.selectedTargetLanguage is CommonLanguages.OTHER)
@ -25,6 +45,6 @@
} }
</MudSelect> </MudSelect>
<MudButton Variant="Variant.Filled" Class="mb-3" OnClick="() => this.TranslateText()"> <MudButton Variant="Variant.Filled" Class="mb-3" OnClick="() => this.TranslateText(force: true)">
Translate Translate
</MudButton> </MudButton>

View File

@ -20,7 +20,9 @@ public partial class AssistantTranslator : AssistantBaseCore
language requires, e.g., shorter sentences, you should split the text into shorter sentences. language requires, e.g., shorter sentences, you should split the text into shorter sentences.
"""; """;
private bool liveTranslation;
private string inputText = string.Empty; private string inputText = string.Empty;
private string inputTextLastTranslation = string.Empty;
private CommonLanguages selectedTargetLanguage; private CommonLanguages selectedTargetLanguage;
private string customTargetLanguage = string.Empty; private string customTargetLanguage = string.Empty;
@ -40,6 +42,14 @@ public partial class AssistantTranslator : AssistantBaseCore
return null; return null;
} }
private string? ValidatingTargetLanguage(CommonLanguages language)
{
if(language == CommonLanguages.AS_IS)
return "Please select a target language.";
return null;
}
private string? ValidateCustomLanguage(string language) private string? ValidateCustomLanguage(string language)
{ {
if(this.selectedTargetLanguage == CommonLanguages.OTHER && string.IsNullOrWhiteSpace(language)) if(this.selectedTargetLanguage == CommonLanguages.OTHER && string.IsNullOrWhiteSpace(language))
@ -48,12 +58,15 @@ public partial class AssistantTranslator : AssistantBaseCore
return null; return null;
} }
private async Task TranslateText() private async Task TranslateText(bool force)
{ {
await this.form!.Validate();
if (!this.inputIsValid) if (!this.inputIsValid)
return; return;
if(!force && this.inputText == this.inputTextLastTranslation)
return;
this.inputTextLastTranslation = this.inputText;
this.CreateChatThread(); this.CreateChatThread();
var time = this.AddUserRequest( var time = this.AddUserRequest(
$""" $"""