Перевод псевдостатического адреса вместо его транслитерации при помощи API Перевода от Яндекс

Материал из Umicms
Перейти к:навигация, поиск

Актуально для версии 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)
 2public 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-ключ.

4) проверьте результат работы
Translit.png