diff --git a/DysonNetwork.Sphere/Translation/ITranslationProvider.cs b/DysonNetwork.Sphere/Translation/ITranslationProvider.cs index a2d9c6a..dc061f0 100644 --- a/DysonNetwork.Sphere/Translation/ITranslationProvider.cs +++ b/DysonNetwork.Sphere/Translation/ITranslationProvider.cs @@ -2,5 +2,5 @@ namespace DysonNetwork.Sphere.Translation; public interface ITranslationProvider { - public Task Translate(string text, string targetLanguage); + public Task Translate(string text, string targetLanguage, string? sourceLanguage = null); } \ No newline at end of file diff --git a/DysonNetwork.Sphere/Translation/TencentTranslation.cs b/DysonNetwork.Sphere/Translation/TencentTranslation.cs index db3af86..1f6fe1b 100644 --- a/DysonNetwork.Sphere/Translation/TencentTranslation.cs +++ b/DysonNetwork.Sphere/Translation/TencentTranslation.cs @@ -7,19 +7,21 @@ namespace DysonNetwork.Sphere.Translation; public class TencentTranslation(IConfiguration configuration) : ITranslationProvider { private readonly string _region = configuration["Translation:Region"]!; - private readonly Credential _apiCredential = new Credential + private readonly long _projectId = long.Parse(configuration["Translation:ProjectId"] ?? "0"); + private readonly Credential _apiCredential = new() { SecretId = configuration["Translation:SecretId"]!, SecretKey = configuration["Translation:SecretKey"]! }; - public async Task Translate(string text, string targetLanguage) + public async Task Translate(string text, string targetLanguage, string? sourceLanguage = null) { var client = new TmtClient(_apiCredential, _region); var request = new TextTranslateRequest(); request.SourceText = text; - request.Source = "auto"; + request.Source = sourceLanguage ?? "auto"; request.Target = targetLanguage; + request.ProjectId = _projectId; var response = await client.TextTranslate(request); return response.TargetText; } diff --git a/DysonNetwork.Sphere/Translation/TranslationController.cs b/DysonNetwork.Sphere/Translation/TranslationController.cs index b1ca313..a154127 100644 --- a/DysonNetwork.Sphere/Translation/TranslationController.cs +++ b/DysonNetwork.Sphere/Translation/TranslationController.cs @@ -12,7 +12,7 @@ namespace DysonNetwork.Sphere.Translation; public class TranslationController(ITranslationProvider provider, ICacheService cache) : ControllerBase { private const string CacheKeyPrefix = "translation:"; - + private static string GenerateCacheKey(string text, string targetLanguage) { var inputBytes = Encoding.UTF8.GetBytes($"{text}:{targetLanguage}"); @@ -22,27 +22,31 @@ public class TranslationController(ITranslationProvider provider, ICacheService [HttpPost] [Authorize] - public async Task> Translate([FromBody] string text, [FromQuery(Name = "lang")] string targetLanguage) + public async Task> Translate( + [FromBody] string text, + [FromQuery(Name = "from")] string targetLanguage, + [FromQuery(Name = "to")] string? sourceLanguage + ) { if (HttpContext.Items["CurrentUser"] is not Account currentUser) return Unauthorized(); if (currentUser.PerkSubscription is null) return StatusCode(403, "You need a subscription to use this feature."); - + // Generate cache key var cacheKey = GenerateCacheKey(text, targetLanguage); - + // Try to get from cache first var (found, cachedResult) = await cache.GetAsyncWithStatus(cacheKey); if (found && cachedResult != null) return Ok(cachedResult); - + // If not in cache, translate and cache the result var result = await provider.Translate(text, targetLanguage); if (!string.IsNullOrEmpty(result)) { await cache.SetAsync(cacheKey, result, TimeSpan.FromHours(24)); // Cache for 24 hours } - + return result; } } \ No newline at end of file diff --git a/DysonNetwork.Sphere/appsettings.json b/DysonNetwork.Sphere/appsettings.json index 6b1ed7f..c318c8c 100644 --- a/DysonNetwork.Sphere/appsettings.json +++ b/DysonNetwork.Sphere/appsettings.json @@ -24,6 +24,7 @@ "Translation": { "Provider": "Tencent", "Region": "ap-hongkong", + "ProjectId": "0", "SecretId": "", "SecretKey": "" },