Совместил «translit» и «yTranslit»
Итак для начала — МОДХ открыл для себя совсем недавно, около месяца назад. Многое еще не понятно, потихоньку копаюсь. Дошел до плагинов генерации УРЛов (псевдонимов), таких как
«translit» «yTranslit»
Идея перевода Яндексом понравилась, но проблема что не все слова переводит. Те если написать аббревиатуру с цифрами, то уже не переведет и вернет кириллицу. И если объединить два плагина в один то идеально дополнят друг друга. С чем не справится «yTranslit» докончит «translit».
Но так как еще плохо разобрался в МОДХ, как создавать плагины еще темный лес, поэтому пока простое решение. Устанавливаем сразу два этих плагина, но так чтоб в настройках был указан «translit».
Далее файл:
\core\components\translit\model\modx\translit\modtransliterate.class.php
меняем на приведенный в конце статьи. И все работает. В смысле теперь всегда Алиас будет на латинице — даже если яндекс закапризничал
<?php
/**
* A transliteration service implementation class for MODx Revolution.
*
* @package modx
* @subpackage translit
*/
class modTransliterate {
/**
* A reference to the modX instance communicating with this service instance.
* @var modX
*/
public $modx = null;
/**
* A collection of options.
* @var array
*/
public $options = array();
/**
* Constructs a new instance of the modTransliterate class.
*
* Use modX::getService() to get an instance of the translit service; do not manually construct this class.
*
* @param modX &$modx A reference to a modX instance.
* @param array $options An array of options for configuring the modTransliterate instance.
*/
public function __construct(modX &$modx, array $options = array()) {
$this->modx = & $modx;
$this->options = $options;
}
/**
* Translate a string using a named transliteration table.
*
* @param string $string The string to transliterate.
* @param string $table A named transliteration table to use.
* @return string The translated string.
*/
public function translate($string, $table) {
if (empty($string)) return $string;
// если русские слова - на перевод в яндекс
if (preg_match('#(\b[а-яё]+\b)#iu', $string)) $string = $this->yandex($string);
$filePath = dirname(__FILE__) . '/tables/' . $table . '.php';
if (is_file($filePath)) {
$table = include $filePath;
if (is_array($table) && !empty($table)) {
$string = strtr($string, $table);
}
}
return $string ;
}
/**
* перевод яндексом.
*
* @string string $string строка перевода
* @return string переведенная строка.
*/
private function yandex($string) {
$trim = $this->modx->getOption('friendly_alias_trim_chars', null, '/.-_', true);
$string = str_replace(str_split($trim), ' ', $string);
$service = $this->modx->getOption('friendly_alias_ytranslit_url', null,
'https://translate.yandex.net/api/v1.5/tr.json/translate?key=[[+key]]&lang=ru-en&text=', true);
$key = trim($this->modx->getOption('friendly_alias_ytranslit_key', null, ''));
if (empty($key)) {
$this->modx->log(modX::LOG_LEVEL_ERROR,
'[yTranslit] You must specify the API key! Please, get it from http://api.yandex.ru/key/form.xml?service=trnsl.');
return $string;
}
$request = str_replace('[[+key]]', $key, $service) . urlencode($string);
if (function_exists('curl_init')) {
$url = parse_url($request);
parse_str($url['query'], $params);
/** @var modRestCurlClient $client */
$client = $this->modx->getService('rest.modRestCurlClient');
$result = $client->request(
$url['scheme'] . '://' . $url['host'],
$url['path'],
'GET',
$params,
array(
'curlopt_timeout' => $this->modx->getOption('friendly_alias_ytranslit_timeout', null, 1, true),
'curlopt_returntransfer' => 1,
)
);
}
else {
$result = file_get_contents($request);
}
$arr = $this->modx->fromJSON($result);
if (!is_array($arr)) {
$this->modx->log(modX::LOG_LEVEL_ERROR,
"[yTranslit] Service unavailable.\nRequest: $request.\nResponse: $result");
}
elseif ($arr['code'] != 200 || empty($arr['text'][0])) {
$this->modx->log(modX::LOG_LEVEL_ERROR,
'[yTranslit] Service returned an error. ' . print_r($arr, true));
}
else {
$string = $arr['text'][0];
}
return $string;
}
} Комментарии: 9
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
а я мучался, сейчас попробуем…
исходя из этого подредактировал текст статьи, оставив только совмещение яндекса с транслитом.
следующий этап усовершенствования, если все же руки дойдут создать плагин — сделать включение яндекса в настройках.
а сам плагин создать чисто для учебных целей, понять как это делается — в принципе…
Так делать не желательно, т.к. при обновлении компонента translit все изменения пропадут.
сейчас на модх пытаюсь перенести сайт. активно изучаю, порог входа намного выше обычных движков.
Ты что делаешь в своей заметке — анонсируешь новое дополнение, или задаешь вопрос?
UPD. Смотрю, вопрос из заметки уже исчез. Тогда можешь перенести её в «Готовые решения».
Из за этой ошибки не всегда убирает лишние знаки, например точки с запятой
Вот тут открыл обсуждение https://modx.pro/help/12093/