Статьи

PHP CLI и Google Перевод

Просто делаю тяжелый перевод с немецкого на английский. Что приводит к написанию простого инструмента командной строки для перевода через 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);