Просто делаю тяжелый перевод с немецкого на английский. Что приводит к написанию простого инструмента командной строки для перевода через Google — тратить время, чтобы сэкономить время, другими словами. Создание прототипа с нуля заняло около 15 минут (что проливает свет на спам в блоге, я полагаю). Немного почистил его и бросил сюда на случай, если кто-нибудь сможет его использовать.
Две основные вещи, которые еще нужно сделать;
— проверка опции CLI языковой пары, чтобы держать пользователей в здравом уме
— преобразование набора символов — прямо сейчас получаю UFT8 от Google, чтобы XML_HTMLSax мог правильно анализировать (он полагается на функции str_), но не делал ничего умного после этого.
… и, возможно, ошибка или три.
#!/usr/local/bin/php http://www.php.net/license/3_0.txt */ //------------------------------------------------------------------------------ require_once 'Console/Getopt.php'; require_once 'HTTP/Request.php'; require_once 'XML/HTMLSax3.php';
#!/usr/local/bin/php http://www.php.net/license/3_0.txt */ //------------------------------------------------------------------------------ require_once 'Console/Getopt.php'; require_once 'HTTP/Request.php'; require_once 'XML/HTMLSax3.php';
// ———————————————— ——————————
class Google_Translate {
var $ langpair;
var $ proxy = null;
функция Google_Translate ($ langpair, $ proxy = null) {
$ this-> langpair = $ langpair;
$ this-> proxy = $ proxy;
}
запрос функции ($ text) {
$ R = & новый HTTP_Request (‘http://translate.google.com/translate_t’);
$ R-> setMethod ( ‘POST’);
if (! is_null ($ this-> proxy)) {
$ pxy = parse_url ($ this-> proxy);
$ R-> setProxy ($ рха [ ‘хозяин’], $ рха [ ‘порт’], $ рха [ ‘пользователя’], $ рха [ ‘проходить’]);
}
$ R-> addPostData (‘text’, utf8_encode ($ text));
$ R-> addPostData (‘langpair’, $ this-> langpair);
$ R-> addPostData ( ‘т’, ‘utf8’);
$ R-> addPostData ( ‘ае’, ‘utf8’);
$ res = $ R-> sendRequest ();
if (PEAR :: isError ($ res)) {
fwrite (STDERR, «Проблема с соединением:». $ res-> toString (). «n»);
выход (1);
}
if ($ R-> getResponseCode ()! = ‘200’) {
fwrite (STDOUT, «Недопустимый статус HTTP:». $ R-> getResponseCode (). «n»);
выход (1);
}
return $ R-> getResponseBody ();
}
функция перевод ($ текст) {
$ P = & new Google_Translate_Parser ();
return $ P-> parse ($ this-> query ($ text));
}
}
// ———————————————— ——————————
class Google_Translate_Parser {
var $ inResult = FALSE;
var $ result = »;
функция открыта ($ p, $ tag, $ attrs) {
if ($ tag == ‘textarea’ && isset ($ attrs [‘name’]) && $ attrs [‘name’] == ‘q’) {
$ this-> inResult = TRUE;
}
}
закрытие функции ($ p, $ tag) {
if ($ this-> inResult && $ tag == ‘textarea’) {
$ this-> inResult = FALSE;
}
}
данные функции ($ p, $ data) {
if ($ this-> inResult) {
$ this-> result. = $ data;
}
}
функция parse ($ html) {
$ P = & new XML_HTMLSax3 ();
$ P-> set_object ($ это);
$ P-> set_element_handler ( ‘открытый’, ‘закрыть’);
$ P-> set_data_handler ( ‘данные’);
$ P-> синтаксического анализа ($ HTML);
return utf8_decode ($ this-> result);
}
}
// ———————————————— ——————————
использование функции () {
$ using = getMessage (). «n»);
выход (1);
}
if (realpath ($ _ SERVER [‘argv’] [0]) == __FILE__) {
$ options = Console_Getopt :: getOpt ($ args, ‘hl: p:’);
} еще {
$ options = Console_Getopt :: getOpt2 ($ args, ‘hl: p:’);
}
if (PEAR :: isError ($ options)) {
FWRITE (STDERR, $ options-> GetMessage () «п».);
использование();
}
$ proxy = null;
foreach ($ options [0] как $ option) {
switch ($ option [0]) {
дело ‘ч’:
использование();
перемена;
дело ‘l’:
$ lang = str_replace (‘-‘, ‘|’, $ option [1]);
перемена;
случай ‘p’:
$ proxy = $ option [1];
перемена;
}
}
$ G = & new Google_Translate ($ lang, $ proxy);
echo $ G-> translate ($ options [1] [0]). «n»;
Выход (0);