yTranslit - генерация алиасов через Яндекс.Переводы

Изобрел очередное колесо — а именно замену старому доброму компоненту translit.

Все тоже самое, только yTranslit работает через запросы к Api Яндекса, и мы получаем красивые дружественные урлы.
Например:
pagetitle: Обратная связь
alias: feedback-contact
//
pagetitle: Спортивный кружок
alias: sports-circle
//
pagetitle: Главная страница сайта текстильного завода
alias: the-main-page-site-textile-mill

Не знаю, как вам, а лично мне очень надоели кривые транслитирированные имена у страниц сайта. Так, по моему, будет гораздо лучше.

Компонент пытается работать через CURL, с таймаутом в 1 секунду. Если библиотека не установлена на сервере — обычный file_get_contents, который может привести к висяку при отсутствии связи с Яндексом. Если при получении будет ошибка — она запишется в системный журнал и вы получите непереведенный алиас.

Также обратите внимания, что Яндекс накладывает некоторые ограничения на запросы. Хотя, 10 000 запросов и\или 1 000 000 символов за сутки, думаю, хватит всем для работы с ресурсами.

Настройка ровно одна: friendly_alias_ytranslit_url, в которой вы можете поправить направление перевода. По умолчанию это ru-en. Не забываем также написать что-нибудь и в настройке friendly_alias_translit, например russian.

Если хотите временно вернуться к обычному translit — поправьте 2 параметра в системе: friendly_alias_translit_class и friendly_alias_translit_class_path. Нужно просто убрать букву y.

Пакет можно качать из репозитория Simple Dream.
Исходный код на Github.

Следующая заметка
Новый modExtra
Предыдущая заметка
Форкнул BannerX под именем BannerY, 1.0.0


Комментарии ()

  1. Valentin Rasulov 18 сентября 2012, 22:58 # 0
    отличное расширение! Я на данный момент пользуюсь плагином через google translate, отключал в настройках сайта automatic_alias и плагином проверял поле alias, если пустое — плагин заполнял.
    1. Александр Наумов 20 сентября 2012, 01:30 # 0
      Почему-то мне кажется, что на запрос «Текстильны завод» поисковик посчитает URL tekstilnyj-zavod более релевантным, чем textile-mill. Потому что в Рунете не принято называть завод mill-om.

      1. Василий Наумкин 20 сентября 2012, 01:44 # 0
        Шагу не ступить без мысли «а как там поисковики?»

        Меня греет надежда, что они все таки смотрят в контент, а не на url. Иначе посты Хабра вообще бы не индексировались — там все урлы ниочемными циферками.
        1. Николай 24 сентября 2012, 12:24 # 0
          Василий к сожалению реалии таковы, что магазинам торгующим в рф приходится под яндекс подстраиваться — а это кривой транслит вместо красивого перевода)). ytranslit замечательно пойдет для сайтов ориентированных не на ру нет.
          1. Василий Наумкин 24 сентября 2012, 12:25 # 0
            Да не вопрос — каждый сам выберет, что ему лучше.
            1. Николай 24 сентября 2012, 12:50 # 0
              Так и я о чем)))
        2. Николай 24 сентября 2012, 12:27 # 0
          Александр не все сайты торгуют, не всем нужна релевантность в ру нете есть, еще европа, где наш транслит выглядит тарабарщиной.
        3. Дмитрий Черный 24 сентября 2012, 15:32 # 0
          © 1981 Билл Гейтс: «640КБ должно быть достаточно для каждого»
          © 2012 Василий Наумкин: «10 000 запросов за сутки, думаю, хватит всем для работы с ресурсами»

          Что же будет, когда эти 10000 запросов будут исчерпаны? Алиас не будет генериться, или же будет простой транслит? Например необходимо обновлять каталог раз в неделю, а там около 100к позиций.
          1. Василий Наумкин 24 сентября 2012, 15:37 # 0
            Алиас генерируется один раз, когда он пуст. Если он у ресурса уже есть — запроса не будет.

            Если вводить алиас вручную, или задавать при обновлении — запроса тоже не будет. Ну и в последней версии добавился параметр, который позволяет указать регулярку, чтобы подходящие под нее pagetitle не слались на Яндекс для перевода.

            В конце концов, при любой ошибке алиас будет русский, как pagetitle и вы легко найдете эти ошибочные алиасы простым скриптом.

          2. Sadykh Sadykhov 02 октября 2012, 14:31 # 0
            Минус: если в базе нету нужного слова (а это может быть что угодно — сокращение, аббревиатура и прочее), то возвращается тот же результат. Это косяк Яндекса конечно, но думаю стоит в компоненте сделать проверку, не то ли значение вернулось от Яндекса. Например, «Трололо». Он не переведёт.
            1. Василий Наумкин 02 октября 2012, 15:10 # 0
              Надо самому назначать alias для таких слов.
            2. Denys Butenko 05 января 2013, 02:23 # 0
              Столкнулся с такой же проблемой. Слово есть, а перевода у Яндекса нет. Предлагаю делать warning в журнал ошибок для URL часть которых не корректно перевелись. Проверку осуществлять regexp на наличие русских символов в alias'е который вернул Яндекс.
              1. Aleksey Nikitin 03 июля 2013, 12:44 # 0
                Кстати, не хотите поправить эту штуку на новый API яндекс переводов?
                Гляньте: translate.yandex.net/api/v1/tr.json/translate?lang=ru-en&text=
                1. Василий Наумкин 03 июля 2013, 15:28 # 0
                  Пока нет времени, убрал пакет из репозиториев.
                  1. Евгений Дурягин 03 июля 2013, 17:29 # 0
                    Там в API практически ничего не поменялось, добавили только обязательный ключ и перешли на протокол HTTPS.
                    Можно и в текущей версии в настройках поменять параметр friendly_alias_ytranslit_url с
                    http://translate.yandex.net/api/v1.0/tr.json/translate?lang=ru-en&text=
                    на
                    https://translate.yandex.net/api/v1.5/tr.json/translate?key=_КЛЮЧ_&lang=ru-en&text=
                    Ключ получать здесь api.yandex.ru/key/form.xml?service=trnsl
                    1. Lara Rabdan 04 июля 2013, 04:56 # 0
                      1. Евгений Дурягин 04 июля 2013, 10:02 # 0
                        Да, в параметре friendly_alias_ytranslit_url URL должен быть обязательно начинаться с https
                        1. Евгений Дурягин 04 июля 2013, 10:18 # 0
                          Хотя https и есть, из-за автозамены url сразу не заметил. Сама ссылка работает.
                          CURL установлен? Попробуйте после этой строчки github.com/bezumkin/yTranslit/blob/master/core/components/ytranslit/model/modx/ytranslit/modtransliterate.class.php#L53 добавить еще и
                          curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                          curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
                          
                          1. Lara Rabdan 04 июля 2013, 10:26 # 0
                            Сама ссылка рабочая curl установлен
                            не понимаю почему возвращается пустой результат

                            if (function_exists('curl_init')) {
                            			$timeout = $this->modx->getOption('friendly_alias_ytranslit_timeout', '', 1);
                            			$ch = curl_init();  
                            			curl_setopt($ch, CURLOPT_URL, $request);
                            			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                            			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
                            			curl_setopt($ch, CURLOPT_RETURNTRANSFER, $timeout);
                            			curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
                            			$result = curl_exec($ch);
                            		}
                            		else {
                            			$result = file_get_contents($request);
                            		}
                            1. Евгений Дурягин 04 июля 2013, 10:32 # 0
                              Ну поставьте тогда временно сразу после curl_exec
                              echo curl_error($ch);
                              die();
                              
                              Может детально ошибку опишет
                              1. Lara Rabdan 04 июля 2013, 11:54 # 0
                                странно на денвере не работает. на реальном хостинге все норм. в чем проблемма?
                                1. Евгений Дурягин 04 июля 2013, 15:00 # 0
                                  1. Проблемы с сертификатом
                                  2. Не подгружаются библиотеки openssl
                                  3. curl для Denwer скомпилен без поддержки openssl, если такое возможно
                                  Это первое что пришло в голову.
                                  Думаю curl_error($ch) выдало бы информацию в чем проблема.
                    2. Денис Гром 10 июля 2013, 00:37 # 0
                      а что случилось с ytranslit, нельзя скачать в репозитарии MODX?
                      1. Воеводский Михаил 10 июля 2013, 00:44 # 0
                        Читай комменты выше.
                      2. Василий Наумкин 22 августа 2013, 09:53 # 0
                        Обновлённый yTranslit вернулся в репозиторий.
                        1. Николай 08 сентября 2013, 03:27 # 0
                          Нашелся баг, modx 2.2.9
                          При попытки изменить Таймаут в секундах (у меня сервер в нидерландах, там 1 мало) у нас не дает изменить значение 1, кидает ошибки
                          Uncaught TypeError: undefined is not a function ext-all.js:21
                          1. Василий Наумкин 08 сентября 2013, 07:05 # 0
                            Удали эту настройку и обновись на новую версию — починится.
                            1. Николай 08 сентября 2013, 13:01 # 0
                              Все отлично работает, спасибо!
                        2. Алексей 10 сентября 2013, 16:50 # 0
                          Установил из репозитория yTranslit
                          Саппор хостинга уверяет что Curl скомпилирован с openssl, что подтверждается phpinfo()
                          curl
                          cURL support	enabled
                          SSL Version	OpenSSL/1.0.1e
                          
                          но в логах при сохранении документа выводит:
                          [2013-09-10 18:30:02] (ERROR @ /connectors/resource/index.php) [yTranslit] Service unavailable.
                          Request: https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20130910T111907Z.2d4d92d65aa7e5db.a79c8a8d69563720779d2db2c88aa0a73eaaa342&lang=ru-en&text=%D0%9A%D0%BE%D0%BD%D1%82%D0%B0%D0%BA%D1%82%D1%8B. Response:
                          как продиагностировать ошибку, от чего такое получается?
                          1. Василий Наумкин 10 сентября 2013, 21:27 # 0
                            Попробуй увеличить таймаут запроса.
                          2. Алексей 10 сентября 2013, 23:16 # 0
                            curl_error($ch) пишет в лог:
                            SSL certificate problem: unable to get local issuer certificate
                            Для отключения проверки сертификата
                            в файле core/components/ytranslit/model/modx/ytranslit/modtransliterate.class.php
                            сразу после:
                            $ch = curl_init();
                            добавить:
                            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                            1. Василий Наумкин 11 сентября 2013, 05:34 # 0
                              Понял, постараюсь обновить компонент.
                            2. Илья Строганов 29 марта 2014, 00:28 # 0
                              Не работает, прошу помощи!
                              modx 2.2.6
                              Denver
                              Ключ от Яндекса получен
                              cURL support enabled
                              SSL Version OpenSSL/1.0.1c

                              translit — работает, а ytranslit — нет. Оставляет кириллицу как есть :(
                              Где копать?

                              Пробовал на хостинге на modx 2.2.13
                              Там SSL Version NSS/3.12.4.5
                              Но translit там не стоит (он нужен для ytranslit?)
                              В общем, тоже не работает.

                              Что я не сделал?
                              1. Чикин Артур 29 марта 2014, 13:31 # 0
                                Непонятно то что ты сделал, так что говорить что еще не сделал совсем не ясно. Перечитай внимательно статью, вдумчиво и вспомни и проверь что сделал и не сделал.
                              Добавление новых комментариев отключено.