Google Переводчик (Google Translate) и C#

      В данной статье описано использование on-line сервиса «Google Переводчик (Google Translate)(https://translate.google.ru/)» путем формирования запроса с необходимым текстом для перевода и выполнением синтаксического анализа полученного результата с использованием библиотеки «HtmlAgilityPack».
      Выполнить синтаксический анализ можно разными способами, как используя встроенные в Framework средства, так и сторонние библиотеки. В данной статье будет рассмотрен процесс синтаксического анализа с использованием языка «XPath (XML Path Language)», реализующим доступ к частям документа XML, в файлах трансформации «XSLT» и являющимся стандартом консорциума «W3C».

      Создайте проект «Windows Form» в «Microsoft Visual Studio». Скачайте библиотеку HtmlAgilityPack (https://htmlagilitypack.codeplex.com/) и добавьте ссылку на нее в Обозревателе решений. Разместите на главной форме вашего проекта три элемента управления:
  • 1) richTextBox1 – Текстовый элемент управления для ввода текста, перевод которого необходимо выполнить;
  • 2) richTextBox2 - Текстовый элемент управления для вывода результата перевода;
  • 3) button1 – элемент управления необходимый для запуска процесса перевода текста.
У вас получится приведенный ниже пример.
      В Google Chrome перейдите на страницу сервиса Google Переводчик (Google Translate)(https://translate.google.ru/) и выполните перевод любого текста. Сделайте клик правой клавишей мыши по тексту перевода и выберете в появившемся контекстном меню пункт «Просмотр кода элемента». В открывшемся окне вы увидите код загруженной страницы с переводом и выделенной строкой кода контейнера, в котором находится перевод. На данной странице у контейнера с результатом перевода есть идентификатор «result_box», именно по нему мы и будем получать перевод.
      Сделайте двойной клик правой клавишей мыши по элементу управления «button1», вы перейдете в редактор кода с установкой курсора в тело автоматически созданного метода «button1_Click», события «Click», возникающего при нажатии на данный элемент управления. Добавьте в него приведенный ниже код.
//Вызываем метод отправки текста для перевода с указанием 
//исходного языка и языка перевода.
//И получаем в ответ HTML код страницы ответа.
string result = translate(richTextBox1.Text, "en", "ru");
//Создаем объект класса HtmlDocument.
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
//Загружаем в doc полученный HTML.
doc.LoadHtml(result);
//У созданного объекта doc есть свойство DocumentNode (указывает на верхний узел документа). 
//У него же в свою очередь есть методы SelectNodes и SelectSingleNode. 
//Первый выбирает коллекцию элементов, а второй — только один. Нам нужен первый метод.
HtmlAgilityPack.HtmlNodeCollection translateNode = doc.DocumentNode.SelectNodes("//span[@id='result_box']");
//Проверяем количество найденных элементов.
if (translateNode.Count != 0)
{
    //Элементы найдены, получаем текст между начальным и конечным тегами объекта.
    richTextBox2.Text = translateNode[0].InnerText;               
}
else
{
    //Необходимые нам элементы, отсутствуют на странице.
    richTextBox2.Text = "Проблема с переводом";
}
Так же добавьте в листинг главной формы метод формирования запроса на перевод и чтения ответа.
//word - фраза для перевода, SL -исходный язык, DL - язык перевода.
public string translate(string word, string SL, string DL)
{
    //Инициализируем новый экземпляр класса System.Net.CookieContainer.
    var cookies = new System.Net.CookieContainer();
    string result;
    //Задаем значение System.Boolean, которое определяет, используется
    //ли поведение 100-Continue.
    System.Net.ServicePointManager.Expect100Continue = false;
    //Формируем строку запроса на перевод.
    string zapros = "http://translate.google.ru/?sl=" + SL + "&tl=" + DL + "&q=" + word;
    //Инициализируем новый экземпляр System.Net.WebRequest для заданной схемы URI.
    var request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(zapros);
    request.CookieContainer = cookies;
    //Указываем системные учетные данные приложения.
    request.Credentials = System.Net.CredentialCache.DefaultCredentials; 
    //Указываем сетевые учетные данные текущего контекста безопасности. 
    request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
    //Задаем метод для запроса.
    request.Method = "POST";
    //Задаем значение HTTP-заголовка Content-type.
    request.ContentType = "application/x-www-form-urlencoded";
    //Задаем значение HTTP-заголовка User-agent.
    request.UserAgent = @"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4";
    //Получаем объект System.IO.Stream, используемый для записи данных запроса.
    using (var requestStream = request.GetRequestStream())
    //При переопределении во вложенном классе получаем поток данных из
    //интернет-ресурса.
    using (var responseStream = request.GetResponse().GetResponseStream())
    //Инициализируем новый экземпляр класса System.IO.StreamReader для указанного
    //потока с заданной кодировкой символов.
    using (var reader = new System.IO.StreamReader(responseStream, Encoding.GetEncoding("UTF-8")))
    {
        //Считываем поток от текущего положения до конца.
        result = reader.ReadToEnd();
    }
    //Возвращаем полученную строку с HTML кодом страницы.
    return result;
}
      Запустите ваш проект, нажав на клавишу «F5». Введите текст на английском языке в верхнее текстовое поле и нажмите на кнопку «Перевести». Через некоторое время если не будет ошибок, вы увидите перевод вашего текста. Ниже приведен пример перевода текста из Википедии.
      Внимание, получение перевода в ваших проектах с использованием этой статьи может нарушить условия использования данного сервиса Google. На странице «http://translate.google.ru/about/intl/ru_ALL/forbusiness.html» написано, что если вы хотите внедрить данный сервис в любые ваши приложения и веб-страницы, есть сервис «Translate API» который позволит вам это сделать за небольшую плату.

Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!