First Commit

This commit is contained in:
cesnimda
2026-03-21 11:55:27 +01:00
commit 2e8a29b4d0
1757 changed files with 166084 additions and 0 deletions
@@ -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);
}