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

Материал из Umicms
Перейти к:навигация, поиск
Строка 1: Строка 1:
'''Актуально для версии 2.9.5.'''
+
'''Актуально для версии 2.18.'''
  
 
----
 
----
'''Задача:''' для поля "псевдостатический адрес" заменить транслитирацию названий страниц на их перевод.
+
'''Задача:''' для поля "псевдостатический адрес" заменить транслитерацию названий страниц на их перевод.
  
 
'''Решение:'''
 
'''Решение:'''
Строка 12: Строка 12:
 
     в) на странице http://api.yandex.ru/key/keyslist.xml вы увидите сгенерированный для вас ключ.
 
     в) на странице http://api.yandex.ru/key/keyslist.xml вы увидите сгенерированный для вас ключ.
  
2) В папке ''/classes/modules/data'' создайте файл ''custom_events.php'' со следующим содержанием:
+
2) В папке  
 +
 
 +
- ''/classes/modules/data'' (для старой реализации)
 +
 
 +
- ''/classes/components/data'' (для новой реализации)
 +
 
 +
создайте файл ''custom_events.php'' со следующим содержанием:
 
<source lang="php" line start="1">
 
<source lang="php" line start="1">
 
<?php
 
<?php
Строка 20: Строка 26:
 
</source>
 
</source>
  
3) В той же папке, в файл ''__custom_adm.ph''p добавьте код макроса:
+
3) В той же папке, в файл  
 +
 
 +
- ''__custom_adm.php'' (для старой реализации)
 +
 
 +
- ''customAdmin.php'' (для новой реализации)
 +
 
 +
добавьте код макроса:
 
<div >
 
<div >
 
<source lang="php" line start="1">
 
<source lang="php" line start="1">

Версия 09:42, 23 мая 2018

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