Перевод псевдостатического адреса вместо его транслитерации при помощи 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)
 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-ключ.

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