diff --git a/Apps.Crowdin/Actions/TranslationActions.cs b/Apps.Crowdin/Actions/TranslationActions.cs index 9e73cf8..c160749 100644 --- a/Apps.Crowdin/Actions/TranslationActions.cs +++ b/Apps.Crowdin/Actions/TranslationActions.cs @@ -42,7 +42,10 @@ public async Task PreTranslate( var client = new CrowdinClient(Creds); - PreTranslationMethod? method = input.Method is null ? null : input.Method == "Mt" ? PreTranslationMethod.Mt : PreTranslationMethod.Tm; + PreTranslationMethod? method = input.Method is null ? null : + input.Method == "Mt" ? PreTranslationMethod.Mt : + input.Method == "Tm" ? PreTranslationMethod.Tm : + PreTranslationMethod.Ai; AutoApproveOption? option = input.AutoApproveOption is null ? null : input.AutoApproveOption == "None" ? AutoApproveOption.None : input.AutoApproveOption == "All" ? AutoApproveOption.All : input.AutoApproveOption == "ExceptAutoSubstituted" ? AutoApproveOption.ExceptAutoSubstituted : AutoApproveOption.PerfectMatchOnly; var request = new ApplyPreTranslationRequest @@ -51,6 +54,7 @@ public async Task PreTranslate( FileIds = input.FileIds.Select(fileId => IntParser.Parse(fileId, nameof(fileId))!.Value).ToList(), EngineId = intEngineId, Method = method, + AiPromptId = input.aiPromptId is null ? null : IntParser.Parse(input.aiPromptId, nameof(input.aiPromptId)), AutoApproveOption = option, DuplicateTranslations = input.DuplicateTranslations, TranslateUntranslatedOnly = input.TranslateUntranslatedOnly, diff --git a/Apps.Crowdin/Apps.Crowdin.csproj b/Apps.Crowdin/Apps.Crowdin.csproj index 0e254d7..cb1b90d 100644 --- a/Apps.Crowdin/Apps.Crowdin.csproj +++ b/Apps.Crowdin/Apps.Crowdin.csproj @@ -12,7 +12,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Apps.Crowdin/DataSourceHandlers/AiPromptIdDataHandler.cs b/Apps.Crowdin/DataSourceHandlers/AiPromptIdDataHandler.cs new file mode 100644 index 0000000..102bdf0 --- /dev/null +++ b/Apps.Crowdin/DataSourceHandlers/AiPromptIdDataHandler.cs @@ -0,0 +1,55 @@ +using Apps.Crowdin.Api.RestSharp; +using Apps.Crowdin.Models.Entities; +using Apps.Crowdin.Models.Request; +using Apps.Crowdin.Models.Request.Project; +using Apps.Crowdin.Models.Response; +using Apps.Crowdin.Utils; +using Blackbird.Applications.Sdk.Common; +using Blackbird.Applications.Sdk.Common.Authentication; +using Blackbird.Applications.Sdk.Common.Dynamic; +using Blackbird.Applications.Sdk.Common.Invocation; +using Crowdin.Api; +using Newtonsoft.Json; +using RestSharp; + +namespace Apps.Crowdin.DataSourceHandlers; + +public class AiPromptIdDataHandler( + InvocationContext invocationContext, + [ActionParameter] ProjectRequest project, + [ActionParameter][Display("User ID")] string? UserId) + + : BaseInvocable(invocationContext), IAsyncDataSourceHandler +{ + private AuthenticationCredentialsProvider[] Creds => + InvocationContext.AuthenticationCredentialsProviders.ToArray(); + + public async Task> GetDataAsync(DataSourceContext context, + CancellationToken cancellationToken) + { + if (string.IsNullOrEmpty(project.ProjectId) || string.IsNullOrEmpty(UserId)) + throw new("You should input Project ID and User ID first"); + + var client = new CrowdinRestClient(); + + var items = await Paginator.Paginate(async (lim, offset) + => + { + var request = + new CrowdinRestRequest( + $"/users/{UserId}/ai/prompts?limit={lim}&offset={offset}", + Method.Get, Creds); + request.AddQueryParameter("projectId", project.ProjectId); + request.AddQueryParameter("action", "pre_translate"); + var response = await client.ExecuteAsync(request, cancellationToken: cancellationToken); + return JsonConvert.DeserializeObject>>(response.Content); + }); + + return items + .Select(x => x.Data) + .Where(x => context.SearchString == null || + x.Name.Contains(context.SearchString, StringComparison.OrdinalIgnoreCase)) + .Take(20) + .ToDictionary(x => x.Id.ToString(), x => x.Name); + } +} \ No newline at end of file diff --git a/Apps.Crowdin/DataSourceHandlers/EnumHandlers/PreTranslationMethodHandler.cs b/Apps.Crowdin/DataSourceHandlers/EnumHandlers/PreTranslationMethodHandler.cs index 3183e4a..c88f1d0 100644 --- a/Apps.Crowdin/DataSourceHandlers/EnumHandlers/PreTranslationMethodHandler.cs +++ b/Apps.Crowdin/DataSourceHandlers/EnumHandlers/PreTranslationMethodHandler.cs @@ -8,6 +8,7 @@ public class PreTranslationMethodHandler : IStaticDataSourceHandler { { "Mt", "Machine translation" }, { "Tm", "Translation memory" }, + { "Ai", "Artificial intelligence" } }; } } diff --git a/Apps.Crowdin/Models/Entities/AiPromptEntity.cs b/Apps.Crowdin/Models/Entities/AiPromptEntity.cs new file mode 100644 index 0000000..3f32556 --- /dev/null +++ b/Apps.Crowdin/Models/Entities/AiPromptEntity.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Apps.Crowdin.Models.Entities +{ + public class AiPromptEntity + { + public string Id { get; set; } + public string Name { get; set; } + } +} diff --git a/Apps.Crowdin/Models/Request/Translation/PreTranslateRequest.cs b/Apps.Crowdin/Models/Request/Translation/PreTranslateRequest.cs index 8fbbbae..8cbc565 100644 --- a/Apps.Crowdin/Models/Request/Translation/PreTranslateRequest.cs +++ b/Apps.Crowdin/Models/Request/Translation/PreTranslateRequest.cs @@ -32,4 +32,8 @@ public class PreTranslateRequest [Display("Pre translation method")] public string? Method { get; set; } + [DataSource(typeof(AiPromptIdDataHandler))] + [Display("AI prompt ID")] + public string? aiPromptId { get; set; } + } \ No newline at end of file