First Commit
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace JobTrackerApi.Services.JobImport.Translation;
|
||||
|
||||
public interface ITranslationService
|
||||
{
|
||||
Task<string?> TranslateToEnglishAsync(string text, string sourceLanguage, CancellationToken cancellationToken);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
using System;
|
||||
using System.Net.Http;
|
||||
using System.Net.Http.Json;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace JobTrackerApi.Services.JobImport.Translation;
|
||||
|
||||
public sealed class LibreTranslateService : ITranslationService
|
||||
{
|
||||
private readonly IHttpClientFactory _httpClientFactory;
|
||||
private readonly string _baseUrl;
|
||||
private readonly string? _apiKey;
|
||||
|
||||
public LibreTranslateService(IHttpClientFactory httpClientFactory, IConfiguration cfg)
|
||||
{
|
||||
_httpClientFactory = httpClientFactory;
|
||||
_baseUrl = (cfg["Translation:LibreTranslate:BaseUrl"] ?? "").Trim().TrimEnd('/');
|
||||
_apiKey = string.IsNullOrWhiteSpace(cfg["Translation:LibreTranslate:ApiKey"]) ? null : cfg["Translation:LibreTranslate:ApiKey"]!.Trim();
|
||||
}
|
||||
|
||||
public async Task<string?> TranslateToEnglishAsync(string text, string sourceLanguage, CancellationToken cancellationToken)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(text)) return null;
|
||||
if (string.IsNullOrWhiteSpace(_baseUrl)) return null;
|
||||
|
||||
using var client = _httpClientFactory.CreateClient();
|
||||
using var req = new HttpRequestMessage(HttpMethod.Post, $"{_baseUrl}/translate")
|
||||
{
|
||||
Content = JsonContent.Create(new
|
||||
{
|
||||
q = text,
|
||||
source = sourceLanguage,
|
||||
target = "en",
|
||||
format = "text",
|
||||
api_key = _apiKey
|
||||
})
|
||||
};
|
||||
|
||||
using var res = await client.SendAsync(req, cancellationToken);
|
||||
if (!res.IsSuccessStatusCode) return null;
|
||||
|
||||
var body = await res.Content.ReadFromJsonAsync<LibreTranslateResponse>(cancellationToken: cancellationToken);
|
||||
return string.IsNullOrWhiteSpace(body?.translatedText) ? null : body!.translatedText;
|
||||
}
|
||||
|
||||
private sealed record LibreTranslateResponse(string? translatedText);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace JobTrackerApi.Services.JobImport.Translation;
|
||||
|
||||
public sealed class NoOpTranslationService : ITranslationService
|
||||
{
|
||||
public Task<string?> TranslateToEnglishAsync(string text, string sourceLanguage, CancellationToken cancellationToken)
|
||||
=> Task.FromResult<string?>(null);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user