[Translitor] - Альтернатива транслитерации псевдонимов

Оптимизированная альтернатива всем известного, популярного компонента translit.

Сравним вот такую фразу
«На _ (Золотом крыльце) / Сидели. Царь! Царевич»

Сравните что творит Translit
«na-(zolotom-kryilcze)-/-sideli.-czar!-czarevich»

С тем, как отработал Translitor
na-zolotom-kryltse-sideli-tsar-tsarevich



— Класс транслитерации позаимствован из Laravel, и немного допилен. Это принципиально другая работа, несмотря на схожее поведение.

— Улучшена фильтрация ненужных символов. В отличие от Translit, который пропускает скобки, подчеркивания, слеши, различные служебные символы, Translitor их не пропускает. В поле alias попадают только буквы, цифры. Все остальное заменяется разделителем-заменителем (дефисом)

— Оптимизирована таблица транслитерации. Мне не нравилось как меняются некоторые русские буквы

Вот и все. В целом никаких настроек не требуется. Компонент работает сразу из коробки.
Николай Савин
18 апреля 2019, 10:00
modx.pro
Поблагодарить автора Отправить деньги

Комментарии: 28

Павел Голубев
18 апреля 2019, 10:07
0
А где можно сам допиленный класс Translitor глянуть?
brioni
18 апреля 2019, 10:56
+1
теперь у компонента уже 2 скачивания) Спасибо!
    UDAV
    18 апреля 2019, 11:22
    3
    +6
    Обычный translit тоже так может!
    Настройка friendly_alias_restrict_chars делаем alphanumeric и получаем тоже самое, без лишнего мусора.
      Alexey T
      18 апреля 2019, 14:22
      3
      +2
      Или так:
      'friendly_alias_restrict_chars' => 'pattern',
      'friendly_alias_restrict_chars_pattern' => '/[\0\x0B\t\n\r\f\a&=+°%#«»…<>—№!",.()\/\~:`@\?\[\]\{\}\|\^\'\\\\]/',
        Николай Савин
        18 апреля 2019, 17:32
        +1
        Возможно, я не знал. Как по мне, подобный функционал должен работать сразу. Может я и не прав.
        Напомню, меня еще не устраивала транслитерация некоторых русских букв.
          Николай
          18 апреля 2019, 18:53
          0
          Согласен, теперь буду этот транслит использовать на всех сайтах
        Anton
        20 апреля 2019, 10:56
        +1
        Поставил себе, работает отлично. Спасибо за компонент!
        gruzoveek
        26 апреля 2019, 09:14
        +1
        присоединяюсь к благодарностям!
          iWatchYouFromAfar
          02 мая 2019, 01:28
          +1
          Translitor вырезает все точки, это не очень хорошо, например когда используешь плагины или компоненты для транслитерации других вещей (например папок или файлов). Посему в translit можно указать свой паттерн, а тут нет. Это большой минус.
            Николай Савин
            02 мая 2019, 20:41
            +1
            Паттерн по умолчанию согласен — нужен. Сделаю.
              Wassi Wassinen
              13 мая 2019, 03:58
              0
              +
                Владимир
                19 октября 2022, 16:04
                +1
                Я отредактировай файл translitor.class.php
                Строку
                $title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', $this->lower($title));
                заменил на
                $title = preg_replace('![^'.preg_quote($separator).'\.\pL\pN\s]+!u', '', $this->lower($title));
                И норм, теперь точки на месте)
            Andrew
            06 июля 2019, 09:57
            0
            Надо попробовать у себя, автору спасибо.
              Дмитрий
              22 июля 2022, 07:14
              0
              Здравствуйте, у меня translitor не дружит с пакетом Gallery, в админке не отображаются превьюшки. В адресе вырезается точка. Удалил — сразу заработало. Последняя версия modx.
              Помогите разобраться)
                Николай Савин
                22 июля 2022, 13:01
                0
                Здравствуйте. Вам наверное лучше установить родной пакет translit
                Вячеслав
                27 июня 2023, 17:10
                0
                На PHP версии 8 выдает ошибку
                /home/s32719/www/core/components/translitor/model/translitor.class.php 188
                PHP warning: Undefined array key «ru»
                Madao
                27 июля 2024, 01:17
                0
                modx 3.0.5 — при загрузке картинок удаляет точку перед расширением файла (получается вместо imagename.png — imagenamepng), соответственно картинка не работает. это норма или надо править где-то к конфиге? пробовал убирать точку из friendly_alias_trim_chars — ничего не поменялось. в friendly_alias_restrict_chars_pattern точка отсутствует.
                  Valeria
                  25 августа 2024, 00:03
                  0
                  пакет Translitor удаляет точку, проверьте, может он у вас установлен
                    Madao
                    25 августа 2024, 00:14
                    0
                    Ну конечно был установлен, я ведь поэтому и писал в теме этого пакета. Я спрашивал, как отучить компонент удалять точку в имени файлов при загрузке (править какой-то конфиг?) или, если нет, то как заставить его не вмешиваться в имена файлов при зашрузке.
                    Arahort
                    19 декабря 2024, 10:09
                    0
                    Решили данную проблему?
                      W.H.I.T.E
                      22 января 2025, 02:07
                      0
                      Да, реально.
                      $title = preg_replace('![^'.preg_quote($separator).'\.\pL\pN\s]+!u', '', $this->lower($title));
                      Работает как решение
                        Hiiragi
                        11 февраля 2025, 18:31
                        0
                        дополню где править
                        core/components/translitor/model/translitor.class.php
                        31 строка
                          Madao
                          21 февраля 2025, 00:29
                          0
                          да, данное решение фиксит вопрос с файлами, но тем временем ломает вырезание точки из урла.
                            Madao
                            21 февраля 2025, 01:40
                            0
                            В моем случае мне подошло данное решение, которое очень костыльное и скорее всего не совсем верное, но для моих нужд работает. Хотя и оставляет в псевдониме точку, если содержит одно из расширений, указанных в массиве. Но это уже, подчеркну в МОЕМ случае, неважно, ибо таких заголовков у меня не будет. Если кто-то предложит работающий универсальный вариант без такого говнокода, думаю буду благодарен не только я.
                            Меняем код функции translate на такой:
                            public function translate($title)
                                {
                                    $language = $this->modx->getOption('translitor_language', null, 'ru');
                                    $separator = '-';
                            
                                    // Список расширений, которые нужно сохранить, у меня указаны такие
                                    $extensions = ['jpg', 'jpeg', 'png', 'gif', 'svg', 'ico', 'webp', 'doc', 'docx', 'pdf'];
                            
                                    // Проверяем, заканчивается ли строка на одно из расширений
                                    $hasExtension = false;
                                    $extension = '';
                                    foreach ($extensions as $ext) {
                                        if (substr($title, -strlen($ext) - 1) === '.' . $ext) {
                                            $hasExtension = true;
                                            $extension = $ext;
                                            break;
                                        }
                                    }
                            
                                    // Если есть расширение, отделяем его от основной части
                                    if ($hasExtension) {
                                        $titleWithoutExtension = substr($title, 0, -strlen($extension) - 1); // Убираем точку и расширение
                                        $title = $titleWithoutExtension;
                                    }
                            
                                    // Транслитерируем текст
                                    $title = $language ? $this->ascii($title, $language) : $title;
                            
                                    $flip = $separator === '-' ? '_' : '-';
                                    $title = preg_replace('!['.preg_quote($flip).']+!u', $separator, $title);
                                    $title = str_replace('@', $separator.'at'.$separator, $title);
                            
                                    // Удаляем все символы, кроме букв, цифр, разделителя и пробелов
                                    $title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', $this->lower($title));
                            
                                    // Заменяем последовательности разделителей и пробелов на один разделитель
                                    $title = preg_replace('!['.preg_quote($separator).'\s]+!u', $separator, $title);
                            
                                    // Обрезаем разделители по краям
                                    $title = trim($title, $separator);
                            
                                    // Если было расширение, добавляем его обратно
                                    if ($hasExtension) {
                                        $title .= '.' . $extension;
                                    }
                            
                                    return $title;
                                }
                          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                          28