File size: 1,795 Bytes
3dd5c9a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System.Net.Http.Json;
using TaskTrackingSystem.Shared.Localization;

namespace TaskTrackingSystem.WebApp.Localization;

/// <summary>
/// Client-side proxy only. Provider credentials stay inside the Web API.
/// </summary>
public sealed class ApiContentTranslationService : IContentTranslationService
{
    private readonly ApiClientService apiClient;

    public ApiContentTranslationService(ApiClientService apiClient)
    {
        this.apiClient = apiClient;
    }

    public Task<TranslationResult> TranslateAsync(string sourceText, string sourceLanguage, string targetLanguage, CancellationToken cancellationToken = default) =>
        GenerateAsync(new TranslationRequest(sourceText, sourceLanguage, targetLanguage), cancellationToken);

    public Task<TranslationResult> TransliterateNameAsync(string sourceName, string sourceLanguage, string targetLanguage, CancellationToken cancellationToken = default) =>
        GenerateAsync(new TranslationRequest(sourceName, sourceLanguage, targetLanguage, true), cancellationToken);

    private async Task<TranslationResult> GenerateAsync(TranslationRequest request, CancellationToken cancellationToken)
    {
        try
        {
            using var response = await apiClient.CreateClient().PostAsJsonAsync("Translation/generate", request, cancellationToken);
            var result = await response.Content.ReadFromJsonAsync<TranslationResult>(cancellationToken: cancellationToken);
            return result ?? new TranslationResult(false, null, $"Translation request failed ({(int)response.StatusCode}).", "api", false);
        }
        catch (Exception ex) when (ex is HttpRequestException or TaskCanceledException)
        {
            return new TranslationResult(false, null, ex.Message, "api", false);
        }
    }
}