Консольный Google переводчик на PHP
В поисках по-настоящему удобного переводчика, решение написать свой, думаю, никого не удивит.
Для начала, определим функции, которые нам понадобятся.
1. get_with_curl — с этой все понятно: мы ей $url , а она нам $response от сервера:
function get_with_curl($url) < $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIESESSION, true); curl_setopt($ch, CURLOPT_AUTOREFERER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12'); $response = curl_exec($ch); if (curl_errno($ch)) < return curl_error($ch); >else < curl_close($ch); return $response; >>
2. cleanup_response — кто бы мог подумать, что Google будет отдавать невалидный json . Сплошь и рядом какие-то левые запятые. Эту неприятную неожиданность приходится исправлять регулярками. Пока хватает вот таких вот:
function cleanup_response($response) < $response = preg_replace('/,+/', ',', $response); $response = preg_replace('/\[,/', '[', $response); return $response; >
3. print_line — вот с ней пришлось повозиться. Не знаю как в *nix, а вот чтоб сделать echo из PHP скрипта в консоль windows, нужно гуглить и подбирать кодировки часа два. (Не забудьте установить в качестве консольного шрифта какой-нибудь TrueType, например Lucida Console):
4. Параметры, передаваемые в API. Вот здесь есть где разогнаться для расширения скрипта. Меня же конкретно интересует перевод с английского на русский. Ну и еще синонимы (для общего развития):
$params = [ "client" => "t", "sl" => "en", // исходный язык "tl" => "ru", // язык, на который нужно перевести "hl" => "ru", // язык сообщений от API "dt" => "bd", // получать синонимы "q" => $term, ];
Еще важно задать alias для запуска скрипта в консоли (чтоб каждый раз не вводить весь путь к скрипту)
cd ~ echo "alias pt='php //translate.php'" >> .bashrc
Небольшая демонстрация работы скрипта:
Конечно же, можно сделать этот скрипт еще лучше. Вот только я старался сделать его максимально простым.
PHP транслит
PHP функции для перевода текста, ЧПУ, ссылок и имен файлов в транслит.
Транслит для текста
function translit($value) < $converter = array( 'а' =>'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => '', 'ы' => 'y', 'ъ' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch', 'Ь' => '', 'Ы' => 'Y', 'Ъ' => '', 'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya', ); $value = strtr($value, $converter); return $value; > echo translit('Яндекс, Гугл, Майл ру');
Результат
Транслит для ЧПУ
Транслитерация для части URL (path), текст переводится в нижний регистр, пробелы и знаки препинания заменяются на « — ».
function translit_sef($value) < $converter = array( 'а' =>'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => '', 'ы' => 'y', 'ъ' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', ); $value = mb_strtolower($value); $value = strtr($value, $converter); $value = mb_ereg_replace('[^-0-9a-z]', '-', $value); $value = mb_ereg_replace('[-]+', '-', $value); $value = trim($value, '-'); return $value; > echo translit_sef('Яндекс, Гугл, Майл ру');
Результат:
Транслит для URL
В данную функцию можно передавать URL целиком, домен и GET параметры останутся без изменений.
function translit_path($value) < $converter = array( 'а' =>'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => '', 'ы' => 'y', 'ъ' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', ); $value = mb_strtolower($value); $value = strtr($value, $converter); $value = mb_ereg_replace('[^-0-9a-z\.]', '-', $value); $value = mb_ereg_replace('[-]+', '-', $value); $value = trim($value, '-'); return $value; > function traslit_url($url) < $url = parse_url(trim($url)); if (!empty($url['host'])) < $res = ''; if (!empty($url['scheme'])) < $res .= $url['scheme'] . '://'; >if (!empty($url['host'])) < $res .= idn_to_ascii($url['host']); >if (!empty($url['port'])) < $res .= ':' . $url['port']; >if (!empty($url['path'])) < $path = explode('/', $url['path']); foreach ($path as $i =>$row) < if (preg_match('/[а-яё]/iu', $row)) < $path[$i] = translit_path($row); >> $res .= implode('/', $path); > if (!empty($url['query'])) < $res .= '?' . $url['query']; >if (!empty($url['fragment'])) < $res .= '#' . $url['fragment']; >return $res; > else < return translit_path($url); >> echo traslit_url('https://example.com/category/статья о транслите.html?page=1');
Результат:
https://example.com/category/statya-o-translite.html?page=1
Транслит для имен файлов
function translit_file($filename) < $converter = array( 'а' =>'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => '', 'ы' => 'y', 'ъ' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch', 'Ь' => '', 'Ы' => 'Y', 'Ъ' => '', 'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya', ); $new = ''; $file = pathinfo(trim($filename)); if (!empty($file['dirname']) && @$file['dirname'] != '.') < $new .= rtrim($file['dirname'], '/') . '/'; >if (!empty($file['filename'])) < $file['filename'] = str_replace(array(' ', ','), '-', $file['filename']); $file['filename'] = strtr($file['filename'], $converter); $file['filename'] = mb_ereg_replace('[-]+', '-', $file['filename']); $file['filename'] = trim($file['filename'], '-'); $new .= $file['filename']; >if (!empty($file['extension'])) < $new .= '.' . $file['extension']; >return $new; > echo translit_file('/upload/Пример файла.jpg');
Результат:
transliterator_transliterate
Преобразует строку или её часть, используя транслитератор ICU.
Список параметров
В процедурном варианте, Transliterator или строка, из которой может быть собран объект Transliterator .
Строка для транслитерации.
Начальный индекс, включительно, (в кодовых единицах UTF-16), с которого начинается часть строки, предназначенная для транслитерации. Индексация начинается с 0. Текст до этой позиции останется как есть.
Начальный индекс, не включая, (в кодовых единицах UTF-16), которым заканчивается часть строки, предназначенная для транслитерации. Индексация начинается с 0. Текст с этой позиции останется как есть.
Возвращаемые значения
Преобразованная строка в случае успешного выполнения или false в случае возникновения ошибки.
Примеры
Пример #1 Конвертация экранированной UTF-16 строки
$s = «\u304A\u65E9\u3046\u3054\u3056\u3044\u307E\u3059» ;
echo transliterator_transliterate ( «Hex-Any/Java» , $s ), «\n» ;
?php
//теперь обратная операция с дополнительным символом
$supplChar = html_entity_decode ( ‘𝄞’ );
echo mb_strlen ( $supplChar , «UTF-8» ), «\n» ;
$encSupplChar = transliterator_transliterate ( «Any-Hex/Java» , $supplChar );
//вывод двух кодированных UTF-16 символов
echo $encSupplChar , «\n» ;
//и назад
echo transliterator_transliterate ( «Hex-Any/Java» , $encSupplChar ), «\n» ;
?>
Результатом выполнения данного примера будет что-то подобное:
Смотрите также
User Contributed Notes 5 notes
I pretty much like the idea of hdogan, but there’s at least one group of characters he’s missing: ligature characters.
They’re at least used in Norwegian and I read something about French, too . Some are just used for styling (f.e. fi)
Here’s an example that supports all characters (should at least, according to the documentation):
var_dump ( transliterator_transliterate ( ‘Any-Latin; Latin-ASCII; Lower()’ , «A æ Übérmensch på høyeste nivå! И я люблю PHP! fi» ));
// string(41) «a ae ubermensch pa hoyeste niva! i a lublu php! fi»
?>
In this example any character will firstly be converted to a latin character. If that’s finished, replace all latin characters by their ASCII replacement.
Sorry, for posting it again, but I found a bug in my code:
If you have a character, like the cyrillic ь (a soft-sign — no sound), the «Any-Latin» would translate it to a prime-character, and the «Latin-ASCII» doesn’t touch prime-characters. Therefore I added an option to remove all characters, that are higher than \u0100.
Here’s my new code, including an example:
var_dump(transliterator_transliterate(‘Any-Latin; Latin-ASCII; [\u0100-\u7fff] remove’,
«A æ Übérmensch på høyeste nivå! И я люблю PHP! есть. fi»));
// string(50) «A ae Ubermensch pa hoyeste niva! I a lublu PHP! est. fi»
Another approach, I found quite helpful (if you by no way want to remove characters . ), try to use iconv() in addition. This surely will just return ASCII characters.
var_dump(iconv(«UTF-8», «ASCII//TRANSLIT//IGNORE», transliterator_transliterate(‘Any-Latin; Latin-ASCII’,
«A æ Übérmensch på høyeste nivå! И я люблю PHP! есть. fi»));
// string(50) «A ae Ubermensch pa hoyeste niva! I a lublu PHP! est’. fi»
You can create slugs easily with:
function slugify ( $string ) $string = transliterator_transliterate ( «Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove; Lower();» , $string );
$string = preg_replace ( ‘/[-\s]+/’ , ‘-‘ , $string );
return trim ( $string , ‘-‘ );
>
echo slugify ( «Я люблю PHP!» );
?>
$str = ‘àáâãäçèéêëìíîïñòóôõöùúûüýÿ
ÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ’ ;
$rule = ‘NFD; [:Nonspacing Mark:] Remove; NFC’ ;
$myTrans = Transliterator :: create ( $rule );
echo $myTrans -> transliterate ( $str );
There are some possibly undesirable conversions with ASCII//TRANSLIT//IGNORE or your users may require some custom stuff.
You might want to run a substitution up front for certain things, such as when you want 3 letter ISO codes to replace currency symbols. £ transliterates to «lb», for example, which is incorrect since it’s a currency symbol, not a weight symbol (#).
ASCII//TRANSLIT//IGNORE does a great job within the realm of possibility 🙂
When it doesn’t do something you want it to, you can set up a CSV with one replacement per line and run a function like:
function stripByMap($inputString, $mapFile)
$csv = file($mapFile);
foreach($csv as $line)
$arrLine = explode(‘,’, trim($line));
$inputString = str_replace($arrLine[0],$arrLine[1],$inputString);
>
return $inputString;
>
or you can write some regexes. Transliterating using ASCII//TRANSLIT//IGNORE works so well that your map probably won’t be very long.