<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CTAPbIu_MABP&#039;s BLOG &#187; C++</title>
	<atom:link href="http://mabp.kiev.ua/category/programming/cpp/feed/" rel="self" type="application/rss+xml" />
	<link>http://mabp.kiev.ua</link>
	<description>энтузиазм = 1/опыт © Старый Мавр</description>
	<lastBuildDate>Thu, 26 Jan 2012 10:34:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Google Translate</title>
		<link>http://mabp.kiev.ua/2008/08/28/google_translate/</link>
		<comments>http://mabp.kiev.ua/2008/08/28/google_translate/#comments</comments>
		<pubDate>Thu, 28 Aug 2008 16:15:14 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://mabp.localhost/?p=221</guid>
		<description><![CDATA[Сейчас пытаюсь возродить свой бывший сайт под названием ForbidenWish. Там много книг и вносить их в БД вручную я не собираюсь, поэтому написал небольшой скрипт который обходит директории, парсит имена файлов и заносит их в базу. Вот в один момент я понял что простая транслитерация названия книги это не интересно, а иногда и глупо получалось, [...]]]></description>
			<content:encoded><![CDATA[<p>Сейчас пытаюсь возродить свой бывший сайт под названием ForbidenWish. Там много книг и вносить их в БД вручную я не собираюсь, поэтому написал небольшой скрипт который обходит директории, парсит имена файлов и заносит их в базу. Вот в один момент я понял что простая транслитерация названия книги это не интересно, а иногда и глупо получалось, и я вспомнил про форум ДКлаб у них там при создании темы заголовок переводиться на английски (причем весьма неплохо) и подставляется в url. Я практически уверен что Котеров не писал переводчик и просто пользуется каким-то сервисом, первое что мне пришло в голову - Google. Сначала думал парсить html страницу но потом понял что там все намного проще и перевод забирается <a href="http://mabp.kiev.ua/category/programming/javascript/">javascript'ом</a>, В общем после непродолжительных изысканий я придумал вот эту функцю.</p>
<span id="more-221"></span>

<pre><code class="php">
function translate($str, $from='ru', $to='en'){
	$fp = fsockopen("www.google.com", 80, $errno, $errstr, 30);
	if (!$fp) {
		trigger_error("$errstr ($errno)&lt;br /&gt;\n", E_USER_WARNING);
		return "";
	} else {
		$out = "GET /translate_a/t?client=t&#038;sl=".$from."&#038;tl=".$to."&#038;text=".urlencode($str)." HTTP/1.1\r\n";
		$out .= "Host: www.google.com\r\n";
		$out .= "User-Agent: Mozilla/5.0\r\n";
		$out .= "Accept-Encoding: deflate\r\n";
		$out .= "Connection: Close\r\n\r\n";
		
		fputs($fp, $out);
		$res = "";
		while (!feof($fp)) {
			$res .=  fgets($fp, 1024);
		}
		fclose($fp);
	}
	
	$res = explode("\r\n\r\n",$res);
	$res = explode("\r\n",$res[1]);
	return stripslashes(substr($res[1],1,-1));
}
</code></pre>


<p>Но таким образом гугл отказывается переводить больше чем 2 килобайта текста, если нудно переводить большие объемы по нужно использовать пост запрос</p>

<pre><code class="php">
function translate($str, $from='en', $to='ru'){
	$fp = fsockopen("www.google.com", 80, $errno, $errstr, 30);
	if (!$fp) {
		trigger_error("$errstr ($errno) \n", E_USER_WARNING);
		return "";
	} else {
		$text = "text=".urlencode($str);
		$out = "POST /translate_a/t?client=t&#038;sl=".$from."&#038;tl=".$to." HTTP/1.1\r\n";
		$out .= "Host: www.google.com\r\n";
		$out .= "User-Agent: Mozilla/5.0\r\n";
		$out .= "Accept-Encoding: deflate\r\n";
		$out .= "Content-length: ".strlen($text)."\r\n";
		$out .= "Connection: Close\r\n\r\n";
		$out .= $text;
		
		fputs($fp, $out);
		$res = "";
		while (!feof($fp)) {
			$res .=  fgets($fp, 1024);
		}
		fclose($fp);
	}
	
	$res = explode("\r\n\r\n",$res);
	$res = explode("\r\n",$res[1]);
	return stripslashes(substr($res[1],1,-1));
}
</code></pre>

<p>Так можно обработать до 32 килобайт за раз!</p>
<p>Если кому пригодиться - оставьте коммент!</p>

<p><strong>UPD</strong> Реализация на <a href="http://mabp.kiev.ua/category/programming/cpp/">С++</a> от Lupascu Ion с небольшой доработкой от меня</p>

<pre><code class="cpp">
String GoogleTranslator::TranslateText(String from, String to){
	//... need to add proxy
	//http_client.Proxy("");
	String url = "www.google.com/translate_a/t?client=t&#038;sl=" + from + "&#038;tl=" + to + "&#038;ie=utf-8&#038;oe=utf-8";
	http_client.URL(url);
	//http_client.Agent("Mozilla/5.0");
	http_client.TimeoutMsecs(5000);
	http_client.Post();
	http_client.PostData(String("text=").Cat()&lt;&lt;UrlEncode(inputwindow.textfrom.Get(CHARSET_UTF8)));
	//http_client.Headers("Accept-Encoding: deflate\r\n");
	String result = http_client.ExecuteRedirect();
	
	if (!IsNull(result)){
		if(result.StartsWith("\"")){// is string
			result.Remove(0, 1);
			result.Remove(result.GetLength()-1, 1);
		}
		else{ // is terms
			//... need to parse terms
		};
		
		return result;
	}
	else
		return String("Error:").Cat()&lt;&lt;Nvl(http_client.GetError(), "")
			&lt;&lt;"\n, status: "&lt;&lt;http_client.GetStatusCode()&lt;&lt;", "&lt;&lt;http_client.GetStatusLine()
			&lt;&lt;"\n, header: "&lt;&lt;http_client.GetHeaders();
}
</code></pre>

<p><strong>UPD</strong> Есть предложение вместо </p>
<pre><code class="php">
return stripslashes(substr($res[1],1,-1));
</code></pre>
возвращать 
<pre><code class="php">
return json_decode($res[1]);
</code></pre>
Но на этом сраном хостинге с тех пор как им занимается компания HostBizUa перестали ставить свежие версии ПО, и у меня стоит древний <a href="http://mabp.kiev.ua/category/programming/php/">PHP 5.1.6</a> в котором этой функции нет, поэтому я использую такое мудачество чтобы со словарем проблем не было.
<pre><code class="php">
return substr($res[1],0,1) == '[' ?
	substr($res[1],2,strpos($res[1],'"',2)-2) :
	substr($res[1],1,-1);
</code></pre>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2008/08/28/google_translate/feed/</wfw:commentRss>
		<slash:comments>105</slash:comments>
		</item>
	</channel>
</rss>

