Доброго дня. В этом топике мне хотелось бы рассказать вам о сервисе Yandex Translate, а именно о его API. Yandex Translate позволяет достаточно качественно переводить тексты, а его API использовать сервис перевода разработчикам в своих проектах.
В сим топике я хочу рассмотреть все три метода API, которые также хорошо документированы на сайте Yandex Translate API (тут).
Используя язык C# и части System.Net, System.XML и System.IO я покажу одну из вариаций работы с ним. Я думаю, что этот топик найдут полезным те, кто начинает свою работу с языком C#, либо с Yandex API.
Метод detect
При обращении к методу detect мы получаем в ответ XML (либо JSON, но тут рассмотрен только XML) следующего формата:
<?xml version="1.0" encoding="utf-8"?>
<DetectedLang code="200" lang="en"/>
Мы можем написать функцию, которая отправит запрос к API. Реализация может быть разной, вот одна из них:
string Detect(string text)
{
WebRequest request = WebRequest.Create("http://translate.yandex.net/api/v1/tr/detect?text=" + text);
WebResponse response = request.GetResponse();
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
var fetchedXml = sr.ReadToEnd();
XmlDocument d = new XmlDocument();
d.LoadXml(fetchedXml);
XmlNodeList langNodes = d.GetElementsByTagName("DetectedLang");
XmlNode node = langNodes.Item(0);
return node.Attributes[1].Value;
}
}
Эта функция принимает аргумент text, который будет параметром text, отправляемым к API. После этого мы разберем XML-ответ с помощью System.Xml и вернем значение атрибута lang элемента DetectedLang.
Метод getLangs
Данный метод вернет список направлений перевода, которые поддерживает Яндекс. Формат ответа:
<?xml version="1.0" encoding="utf-8"?>
<Langs>
<dirs>
<string>ru-en</string>
<string>ru-pl</string>
<string>ru-uk</string>
<string>ru-de</string>
<string>ru-tr</string>
<string>en-ru</string>
<string>pl-ru</string>
<string>uk-ru</string>
<string>de-ru</string>
<string>tr-ru</string>
</dirs>
</Langs>
Напишем функцию, которая отправит запрос к API для получения списка возможных направлений:
static void GetLangs()
{
WebRequest request = WebRequest.Create("http://translate.yandex.net/api/v1/tr/getLangs");
WebResponse response = request.GetResponse();
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
var fetchedXml = sr.ReadToEnd();
XmlDocument d = new XmlDocument();
d.LoadXml(fetchedXml);
XmlNodeList trDirectionNodes = d.GetElementsByTagName("string");
foreach (XmlNode trDirectionNode in trDirectionNodes)
Console.WriteLine("Dir: {0}", trDirectionNode.InnerText);
}
}
Данная функция обратится к API за списком возможных направлений, затем XML-ответ будет распарсен с помощью System.Xml, а полученные значения выведены на консоль. Можно реализовать добавление полученных данных в список, изменив соответствующий фрагмент кода так:
List<string> Langs = new List<string>();
// ... code code code ...
foreach (XmlNode trDirectionNode in trDirectionNodes)
Langs.Add(trDirectionNode.InnerText);
Метод translate
Данный метод принимает два параметра: lang и text. Параметр lang передает направление перевода, параметр text же передает переводимый текст. Формат ответа:
<?xml version="1.0" encoding="utf-8"?>
<Translation code="200" lang="en-ru">
<text>Быть или не быть?</text>
<text>Вот в чем вопрос.</text>
</Translation>
Функция, обращающаяся к методу:
static XmlNodeList Translate(string lang, string text)
{
WebRequest request = WebRequest.Create("http://translate.yandex.net/api/v1/tr/translate?lang=" + lang + "&text=" + text);
WebResponse response = request.GetResponse();
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
var fetchedXml = sr.ReadToEnd();
XmlDocument d = new XmlDocument();
d.LoadXml(fetchedXml);
XmlNodeList textNodes = d.GetElementsByTagName("text");
return textNodes;
}
}
Данная функция, после обращения к API и парсинга ответа, вернет нам объект XmlNodeList, который мы можем перебрать с помощью цикла foreach:
foreach (XmlNode textNode in Translate("ru-en", "тест"))
Console.WriteLine("Text: {0}", textNode.InnerText);
Коды, возвращаемые API
Вы, должно быть, заметили, что каждый ответ API имеет атрибут code, который обозначает код операции. Таблица кодов:
На этом, думаю, все. Для получения более подробных сведений обратитесь к документации API. Спасибо за внимание.
Автор: asm32dev