Перевод псевдостатического адреса вместо его транслитерации при помощи API Перевода от Яндекс
Актуально для версии 18.
Задача: для поля "псевдостатический адрес" заменить транслитерацию названий страниц на их перевод.
Решение: Для решения задачи воспользуемся API Перевода Яндекс.
1) Получение API ключа.
а) перейдите на сервис API Яндекса: http://api.yandex.ru/translate/ б) нажмите на ссылку "Получить API-ключ в) на странице http://api.yandex.ru/key/keyslist.xml вы увидите сгенерированный для вас ключ.
2) В папке
- /classes/modules/data (для старой реализации)
- /classes/components/data (для новой реализации)
создайте файл custom_events.php со следующим содержанием:
1 <?php
2 new umiEventListener('systemModifyElement', 'data', 'translateYandex');
3 new umiEventListener('systemCreateElement', 'data', 'translateYandex');
4 ?>
3) В той же папке, в файл
- __custom_adm.php (для старой реализации)
- customAdmin.php (для новой реализации)
добавьте код макроса:
1 //TODO: Write here your own macroses (admin mode)
2 public function translateYandex(iUmiEventPoint $e) {
3 static $nameStaticBefore;
4 if ($e->getMode() == "before") {
5 $element = $e->getRef('element');
6 // получаем umiHierarchyElement, либо false, если страница не существует
7 if (!$element instanceof umiHierarchyElement) {
8 return false;
9 }
10 $objId = $element->objectId;
11 $elementObject = umiObjectsCollection::getInstance()->getObject($objId);
12 $nameStaticBefore = $elementObject->getName();
13 } elseif ($e->getMode() == "after") {
14 // получаем ссылку на объект страницы
15 $element = $e->getRef('element');
16
17 // получаем umiHierarchyElement, либо false, если страница не существует
18 if (!$element instanceof umiHierarchyElement) {
19 return false;
20 }
21
22 // получаем экземпляр коллекции языков в системе и префикс страницы
23 $collection = langsCollection::getInstance();
24
25 // получаем langsCollection, либо false, если страница не существует
26 if (!$collection instanceof langsCollection) {
27 return false;
28 }
29
30 $langObject = $collection->getLang($element->getLangId());
31 $langPrefix = $langObject->getPrefix();
32
33 // Получаем имя страницы после изменения
34 $objId = $element->objectId;
35 $elementObject = umiObjectsCollection::getInstance()->getObject($objId);
36 $nameAfter = $elementObject->getName();
37
38 // Проверяем, если изменения есть, то идем дальше
39 if ($nameStaticBefore != $nameAfter) {
40 // Обращаемся к яндексу за переводом
41 $pageName = rawurlencode($nameAfter);
42 $key = 'trnsl.1.1.20130121E592607A.33e53ddf88b5e24a.21ebf208d4dd138088424d5c5678323aadaa1ea7';
43 $lang = $langPrefix.'-en';
44 $jsonTranslate=file_get_contents("https://translate.yandex.net/api/v1.5/tr.json/translate?key={$key}&text={$pageName}&lang={$lang}");
45 $translate = json_decode($jsonTranslate);
46 if($translate->code != 200) return false;
47 $element->altName = (string) $translate->text[0];
48 $element->commit();
49 }
50 return false;
51 }
52 return false;
53 }
Примечание: Приведенный выше код проверяет поле name на изменение и если содержимое поля изменилось, то передает новое значение на перевод. Перевод осуществляется с текущей языковой версии на английский язык, для этого берется префикс языка, он должен быть в формате понимаемом Яндекс: ru, uk, be и т.д. Если же префикс языка используемый на сайте отличается от требуемого, то Вы можете делать дополнительный запрос к Яндекс с целью определить язык:
$jsonTranslate=file_get_contents("https://translate.yandex.net/api/v1.5/tr.json/detect?key={$key}&text={$pageName}");
На строке №42 Вам необходимо вставить свой полученный у Яндекс API-ключ.