Пример #1
0
 private IEnumerable <Uri> getRequestUri(TextTranslationRequestModel model)
 {
     if (model.IsTranslationEachLanguage)
     {
         foreach (var language in model.ToLanguages)
         {
             yield return(getRequestUri(model, language));
         }
     }
     else
     {
         yield return(getRequestUri(model, string.Empty));
     }
 }
Пример #2
0
        private Uri getRequestUri(TextTranslationRequestModel model, string languageCode = "")
        {
            var url = GetApiUrl();

            if (string.IsNullOrWhiteSpace(languageCode))
            {
                url = $"{url}&to={String.Join("&to=", model.ToLanguages)}";
            }
            else
            {
                url = $"{url}&to={languageCode}";
            }

            if (!String.IsNullOrWhiteSpace(model.FromLanguage))
            {
                url = $"{url}&from={model.FromLanguage}";
            }

            if (!String.IsNullOrWhiteSpace(model.TextType) && !model.TextType.Equals(TextTypes.Plain, StringComparison.OrdinalIgnoreCase))
            {
                url = $"{url}&textType={model.TextType}";
            }

            if (!String.IsNullOrWhiteSpace(model.Category) && !model.Category.Equals(Categories.General, StringComparison.OrdinalIgnoreCase))
            {
                url = $"{url}&category={model.Category}";
            }

            if (!String.IsNullOrWhiteSpace(model.ProfanityAction) && !model.ProfanityAction.Equals(ProfanityActions.NoAction, StringComparison.OrdinalIgnoreCase))
            {
                url = $"{url}&profanityAction={model.ProfanityAction}";

                if (!String.IsNullOrWhiteSpace(model.ProfanityMarker) && !model.ProfanityMarker.Equals(ProfanityMarkers.Asterisk, StringComparison.OrdinalIgnoreCase))
                {
                    url = $"{url}&profanityMarker={model.ProfanityMarker}";
                }
            }

            var requestUri = new Uri(url);

            //logger.LogInformation($"{TAG} Request uri: {requestUri.ToString()}");

            return(requestUri);
        }
Пример #3
0
        private void ValidateRequestbody(TextTranslationRequestModel model)
        {
            var message      = "";
            var errorMessage = new List <string>();

            var inputsCount = model.Inputs.Count();

            if (inputsCount == 0)
            {
                errorMessage.Add("Text to translate is required.");
            }

            if (inputsCount > 100)
            {
                errorMessage.Add("The array can have at most 100 elements.");
            }

            foreach (var input in model.Inputs)
            {
                // https://docs.microsoft.com/en-us/azure/cognitive-services/translator/request-limits#character-and-array-limits-per-request
                // Max 10,000 characters.
                // Request to translate (+1) and Response to be translated ( + count of to translate languages)
                var contentLength = input.Text.Length * ((model.IsTranslationEachLanguage ? 1 : model.ToLanguages.Count()) + 1);

                logger.LogInformation($"{Tag} Calculated characters={contentLength}");

                if (contentLength > 10000)
                {
                    errorMessage.Add("The entire text included in the request cannot exceed 10,000 characters including spaces.");
                    break;
                }
            }

            if (errorMessage.Count > 0)
            {
                message = "Request body is invalid.";
                logger.LogInformation($"{Tag} {message}");
                throw new ApiHttpStatusException <IEnumerable <string> >(HttpStatusCode.BadRequest, message, errorMessage.ToArray());
            }
        }
        public async Task <IActionResult> Translate(TextTranslationRequestModel model)
        {
            var result = await translatorService.TranslateAsync(model);

            return(StatusCode(System.Net.HttpStatusCode.OK, result));
        }
Пример #5
0
        private static async Task RunProcess(IHost host, string[] args)
        {
            var text = string.Empty;
            var html = false;
            var from = string.Empty;
            var isTranslationEachLanguage = false;
            var toLanguages = new[] { "en", "ru", "ja" };

            // code here
            foreach (var arg in args)
            {
                if (arg.Trim().StartsWith("--"))
                {
                    if (arg.Trim().Equals("--html", StringComparison.OrdinalIgnoreCase))
                    {
                        html = true;
                    }

                    if (arg.Trim().Equals("--each-language", StringComparison.OrdinalIgnoreCase))
                    {
                        isTranslationEachLanguage = true;
                    }

                    if (arg.Trim().StartsWith("--from", StringComparison.OrdinalIgnoreCase))
                    {
                        var tokens = arg.Split('=');
                        if (tokens.Length > 1)
                        {
                            from = tokens[1];
                        }
                    }

                    if (arg.Trim().StartsWith("--to", StringComparison.OrdinalIgnoreCase))
                    {
                        var tokens = arg.Split('=');
                        if (tokens.Length > 1)
                        {
                            var temp       = tokens[1];
                            var tempTokens = temp.Split(',');

                            if (tempTokens.Length > 0)
                            {
                                toLanguages = tempTokens;
                            }
                        }
                    }
                }
                else
                {
                    var localFileService = host.Services.GetRequiredService <ILocalFileService>();
                    var environment      = host.Services.GetRequiredService <IHostEnvironment>();
                    var filePath         = Path.GetFullPath(arg, environment.ContentRootPath);

                    //Console.WriteLine($"File: {filePath}");

                    if (localFileService.Exists(filePath))
                    {
                        text = await localFileService.ReadAsync(filePath);
                    }
                }
            }

            if (string.IsNullOrWhiteSpace(text))
            {
                Console.WriteLine("Please type to want translation then press a return key (or enter key).");
                Console.WriteLine("If want to exit this app, press 'ctrl' + 'c'.");
                do
                {
                    Console.WriteLine("Input text:");
                    text = Console.ReadLine();
                }while (string.IsNullOrWhiteSpace(text));
            }

            var translatorService = host.Services.GetRequiredService <ITextTranslatorService>();

            var source = new TextTranslationRequestModel
            {
                Inputs = new Input[]
                {
                    new Input(text),
                },
                ToLanguages  = toLanguages,
                FromLanguage = from,
                TextType     = html ? TextTypes.Html : TextTypes.Plain,
                IsTranslationEachLanguage = isTranslationEachLanguage,
            };

            try
            {
                var result = await translatorService.TranslateAsync(source);

                Console.WriteLine($"Result: {result.ToJson()}");
            }
            catch (ApiException ex)
            {
                Console.WriteLine($"Exception: {ex.Message}");
                Console.WriteLine(ex.GetDetails().ToJson());
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception: {ex.Message}");
            }
        }
Пример #6
0
        public async Task <IEnumerable <TextTranslationResponseModel> > TranslateAsync(TextTranslationRequestModel model)
        {
            ValidateAzureTranslateConnectionOptions();
            ValidateRequestbody(model);

            List <TextTranslationResponseModel> resultSet = null;

            var requestBody = SerializeToJson(model.Inputs);

            using (var client = new HttpClient())
            {
                foreach (var uri in getRequestUri(model))
                {
                    using (var request = new HttpRequestMessage())
                    {
                        request.Method     = HttpMethod.Post;
                        request.RequestUri = uri;

                        request.Headers.Add(OCP_APIM_SUBSCRIPTION_KEY, options.SubscriptionKey);
                        request.Headers.Add(OCP_APIM_SUBSCRIPTION_REGION, options.Region);

                        request.Content = new StringContent(requestBody, Encoding.UTF8, CONTENT_TYPE_VALUE);

                        var response = await client.SendAsync(request);

                        if (response.Content == null)
                        {
                            throw new Exception($"{Tag} Response content is empty.");
                        }

                        var resultJson = await response.Content.ReadAsStringAsync();

                        var jsonSerializerOptions = new JsonSerializerOptions
                        {
                            PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
                        };

                        if (response.IsSuccessStatusCode)
                        {
                            var resultModel = JsonSerializer.Deserialize <IEnumerable <Models.TextTranslation.TranslationRequest.TextTranslationResponseModel> >(resultJson, jsonSerializerOptions);

                            logger.LogInformation($"${Tag} The request has been processed. => Translated.");

                            if (resultSet == null)
                            {
                                resultSet = new List <Models.TextTranslation.TranslationRequest.TextTranslationResponseModel>(resultModel);
                            }
                            else
                            {
                                var resultModelIndex = 0;
                                resultModel.ToList().ForEach((result) =>
                                {
                                    var list = resultSet[resultModelIndex].Translations.ToList();
                                    result.Translations.ToList().ForEach((translation) =>
                                    {
                                        list.Add(translation);
                                    });

                                    resultSet[resultModelIndex].Translations = list;
                                    resultModelIndex++;
                                });
                            }
                        }
                        else
                        {
                            var resultModel = JsonSerializer.Deserialize <ErrorResponseModel>(resultJson, jsonSerializerOptions);

                            logger.LogInformation($"${Tag} The request does not has been processed. => Not  Translated.");

                            throw new ApiHttpStatusException <ErrorModel <int> >(response.StatusCode, resultModel.Error.Message, resultModel.Error);
                        }
                    }
                }
            }

            return(resultSet);
        }