Advertisement
VladislavSavvateev

Untitled

Mar 25th, 2021
747
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.63 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Json;
  5. using System.Linq;
  6. using System.Net;
  7. using System.Text;
  8.  
  9. // ключи
  10. const string SUB_KEY = "86e2f8ab0a5f463da5483b83d746e8c8";
  11. const string SUB_REGION = "westeurope";
  12.  
  13. Console.Write("Получаем языки...");
  14.  
  15. // получаем список языков
  16. var languages = GetAvailableLanguages().ToList();
  17.  
  18. Console.WriteLine();
  19.  
  20. // выводим все доступные для перевода языки
  21. foreach (var (k, n, nn) in languages)
  22.     Console.WriteLine("{0}: {1} ({2})", k, n, nn);
  23.  
  24. string key, name, nativeName;
  25.  
  26. // спрашиваем конечный язык
  27. while (true) {
  28.     Console.Write("\nВыберите язык (символы до двоеточия): ");
  29.     // получаем язык
  30.     var input = Console.ReadLine();
  31.     // ищем его в списке
  32.     (key, name, nativeName) = languages.FirstOrDefault(p => p.Item1 == input);
  33.    
  34.     // если нам скормили несуществующий язык, выводим ошибку
  35.     if ((key, name, nativeName) == default)
  36.         Console.WriteLine("Выбранный язык не найден. Попробуйте снова.");
  37.    
  38.     // иначе прерываем бесконечный порочный цикл
  39.     else break;
  40. }
  41.  
  42. Console.WriteLine("Буду переводить на {0} ({1})", name, nativeName);
  43.  
  44. // спрашиваем и переводим~
  45. while (true) {
  46.     Console.Write("Что перевести: ");
  47.     // получаем то, что нужно перевести
  48.     var input = Console.ReadLine();
  49.     // выводим результат перевода
  50.     Console.WriteLine("Результат перевода на {0}: {1}", name, Translate(input));
  51. }
  52.  
  53. string Translate(string input) {
  54.     // создаём запрос и указываем заголовки
  55.     var req = WebRequest.Create($"https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to={key}");
  56.     req.Method = "POST";
  57.     req.Headers["Ocp-Apim-Subscription-Key"] = SUB_KEY;
  58.     req.Headers["Ocp-Apim-Subscription-Region"] = SUB_REGION;
  59.     req.ContentType = "application/json";
  60.  
  61.     // скармливаем входной JSON с текстом для перевода
  62.     using (var sw = new StreamWriter(req.GetRequestStream(), Encoding.UTF8))
  63.         sw.Write(new JsonArray(new JsonObject {
  64.             ["Text"] = input
  65.         }).ToString());
  66.  
  67.     // получаем ответ
  68.     var res = req.GetResponse();
  69.     var stream = res.GetResponseStream();
  70.    
  71.     // если потока нет, возвращаем null
  72.     if (stream == null) return null;
  73.    
  74.     // получаем ответ
  75.     JsonValue jsonVal;
  76.     using (var sr = new StreamReader(stream))
  77.         jsonVal = JsonValue.Parse(sr.ReadToEnd());
  78.  
  79.     // если нет результатов, или в JSON есть какие-то некорректные поля, возвращаем null
  80.     if (!(jsonVal is JsonArray results) || results.Count != 1 || !(results[0] is JsonObject result) ||
  81.         !result.ContainsKey("translations") || !(result["translations"] is JsonArray translations) ||
  82.         translations.Count == 0 || !(translations[0] is JsonObject translation) || !translation.ContainsKey("text") ||
  83.         translation["text"].JsonType != JsonType.String)
  84.         return null;
  85.  
  86.     // иначе возвращаем результат перевода
  87.     return translation["text"];
  88. }
  89.  
  90. static IEnumerable<(string, string, string)> GetAvailableLanguages() {
  91.     // создаём запрос
  92.     var req = WebRequest.Create(
  93.         "https://api.cognitive.microsofttranslator.com/languages?api-version=3.0&scope=translation");
  94.  
  95.     // получаем ответ
  96.     var res = req.GetResponse();
  97.     var stream = res.GetResponseStream();
  98.    
  99.     // если потока нет, уходим
  100.     if (stream == null) yield break;
  101.  
  102.     // получаем ответ
  103.     JsonObject json;
  104.     using (var sr = new StreamReader(stream)) json = JsonValue.Parse(sr.ReadToEnd()) as JsonObject;
  105.    
  106.     // если JSON в некорректном виде, уходим
  107.     if (json == null) yield break;
  108.  
  109.     // получаем объект с языками
  110.     var translation = (JsonObject) json["translation"];
  111.    
  112.     // итерируем по ключам JSON
  113.     foreach (var jsonKey in translation.Keys)
  114.         // и возвращаем каждый язык кортежом
  115.         yield return (jsonKey, translation[jsonKey]["name"], translation[jsonKey]["nativeName"]);
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement