Автоматический транслит имен файлов при загрузке в CKFinder 3

CKFinder ненавидит кириллицу. Он ее настолько ненавидит, что загружаемые через свой интерфейс файлы коверкает и превращает Ваш обычный красивенький файл «Классические интерьеры.jpg» в чудовище ФранкенштейнࠫКлассические интерьеры.jpg».

chudishe
Чудовище вместо файла «Классические интерьеры.jpg»

Каким-то неведомым образом в его менеджере файлов все выглядит хорошо и файл все еще отображается как «Классические интерьеры.jpg», но в действительности это не так. Если посмотреть на этот файл через какой-нибудь другой файловый менеджер или FTP клиент, то можно убедится, что там все еще сидит чудовище вместо Вашего файла. Если попытаться залить файл с кириллическими символами прямо в папку с файлами CKFindera, то он вообще не отобразит его и покажет кукиш.

screenshot_7
Дуля с маком от CKFinder

Что же делать? Как быть?

Если требуется, чтобы имена загружаемых файлов не преобразовывались в непонятный формат, то следует использовать только английские буковки, циферки, скобочки, пробелы, точки, черточку и нижнее подчеркивание. Возможно есть еще символы которые не преобразуются при загрузке файла, если обнаружите такие — напишите в комментариях.

В случае же, когда нужно загрузить много файлов и заморачиваться с переименованием каждого файла не хочется — нужно использовать Автопереименоватор-3000!

Чтобы Автопереименоватор-3000 заработал нужно найти файл:

ckfinder/core/connector/php/vendor/cksource/ckfinder/src/CKSource/CKFinder/Filesystem/File/UploadedFile.php

В этом файле найти функцию sanitizeFilename(), внутрь функции после строки:

$this->fileName = static::secureName($this->fileName, $this->config->get('disallowUnsafeCharacters'));

нужно вставить следующий код:

// Автопереименоватор-3000 start
if($this->config->get('forceAscii')){
 //Массив со строчными буквами
 $UTF8_LOWER_ACCENTS=array(
 'à' => 'a', 'ô' => 'o', 'ď' => 'd', 'ḟ' => 'f', 'ë' => 'e', 'š' => 's', 'ơ' => 'o',
 'ß' => 'ss', 'ă' => 'a', 'ř' => 'r', 'ț' => 't', 'ň' => 'n', 'ā' => 'a', 'ķ' => 'k',
 'ŝ' => 's', 'ỳ' => 'y', 'ņ' => 'n', 'ĺ' => 'l', 'ħ' => 'h', 'ṗ' => 'p', 'ó' => 'o',
 'ú' => 'u', 'ě' => 'e', 'é' => 'e', 'ç' => 'c', 'ẁ' => 'w', 'ċ' => 'c', 'õ' => 'o',
 'ṡ' => 's', 'ø' => 'o', 'ģ' => 'g', 'ŧ' => 't', 'ș' => 's', 'ė' => 'e', 'ĉ' => 'c',
 'ś' => 's', 'î' => 'i', 'ű' => 'u', 'ć' => 'c', 'ę' => 'e', 'ŵ' => 'w', 'ṫ' => 't',
 'ū' => 'u', 'č' => 'c', 'ö' => 'oe', 'è' => 'e', 'ŷ' => 'y', 'ą' => 'a', 'ł' => 'l',
 'ų' => 'u', 'ů' => 'u', 'ş' => 's', 'ğ' => 'g', 'ļ' => 'l', 'ƒ' => 'f', 'ž' => 'z',
 'ẃ' => 'w', 'ḃ' => 'b', 'å' => 'a', 'ì' => 'i', 'ï' => 'i', 'ḋ' => 'd', 'ť' => 't',
 'ŗ' => 'r', 'ä' => 'ae', 'í' => 'i', 'ŕ' => 'r', 'ê' => 'e', 'ü' => 'ue', 'ò' => 'o',
 'ē' => 'e', 'ñ' => 'n', 'ń' => 'n', 'ĥ' => 'h', 'ĝ' => 'g', 'đ' => 'd', 'ĵ' => 'j',
 'ÿ' => 'y', 'ũ' => 'u', 'ŭ' => 'u', 'ư' => 'u', 'ţ' => 't', 'ý' => 'y', 'ő' => 'o',
 'â' => 'a', 'ľ' => 'l', 'ẅ' => 'w', 'ż' => 'z', 'ī' => 'i', 'ã' => 'a', 'ġ' => 'g',
 'ṁ' => 'm', 'ō' => 'o', 'ĩ' => 'i', 'ù' => 'u', 'į' => 'i', 'ź' => 'z', 'á' => 'a',
 'û' => 'u', 'þ' => 'th', 'ð' => 'dh', 'æ' => 'ae', 'µ' => 'u', 'ĕ' => 'e',

 'а'=>'a','б'=>'b','в'=>'v','г'=>'g','д'=>'d','е'=>'e','ё'=>'yo','ж'=>'zh','з'=>'z','и'=>'i','й'=>'y',
 'к'=>'k','л'=>'l','м'=>'m','н'=>'n','о'=>'o','п'=>'p','р'=>'r','с'=>'s','т'=>'t','у'=>'u','ф'=>'f',
 'х'=>'h','ц'=>'ts','ч'=>'ch','ш'=>'sh','щ'=>'shch','ъ'=>'','ы'=>'i','ь'=>'','э'=>'e','ю'=>'yu','я'=>'ya',
 'ґ'=>'g','є'=>'e','і'=>'i','ї'=>'i',
 );
 //Массив с заглавными буквами
 $UTF8_UPPER_ACCENTS = array(
 'À' => 'A', 'Ô' => 'O', 'Ď' => 'D', 'Ḟ' => 'F', 'Ë' => 'E', 'Š' => 'S', 'Ơ' => 'O',
 'Ă' => 'A', 'Ř' => 'R', 'Ț' => 'T', 'Ň' => 'N', 'Ā' => 'A', 'Ķ' => 'K',
 'Ŝ' => 'S', 'Ỳ' => 'Y', 'Ņ' => 'N', 'Ĺ' => 'L', 'Ħ' => 'H', 'Ṗ' => 'P', 'Ó' => 'O',
 'Ú' => 'U', 'Ě' => 'E', 'É' => 'E', 'Ç' => 'C', 'Ẁ' => 'W', 'Ċ' => 'C', 'Õ' => 'O',
 'Ṡ' => 'S', 'Ø' => 'O', 'Ģ' => 'G', 'Ŧ' => 'T', 'Ș' => 'S', 'Ė' => 'E', 'Ĉ' => 'C',
 'Ś' => 'S', 'Î' => 'I', 'Ű' => 'U', 'Ć' => 'C', 'Ę' => 'E', 'Ŵ' => 'W', 'Ṫ' => 'T',
 'Ū' => 'U', 'Č' => 'C', 'Ö' => 'Oe', 'È' => 'E', 'Ŷ' => 'Y', 'Ą' => 'A', 'Ł' => 'L',
 'Ų' => 'U', 'Ů' => 'U', 'Ş' => 'S', 'Ğ' => 'G', 'Ļ' => 'L', 'Ƒ' => 'F', 'Ž' => 'Z',
 'Ẃ' => 'W', 'Ḃ' => 'B', 'Å' => 'A', 'Ì' => 'I', 'Ï' => 'I', 'Ḋ' => 'D', 'Ť' => 'T',
 'Ŗ' => 'R', 'Ä' => 'Ae', 'Í' => 'I', 'Ŕ' => 'R', 'Ê' => 'E', 'Ü' => 'Ue', 'Ò' => 'O',
 'Ē' => 'E', 'Ñ' => 'N', 'Ń' => 'N', 'Ĥ' => 'H', 'Ĝ' => 'G', 'Đ' => 'D', 'Ĵ' => 'J',
 'Ÿ' => 'Y', 'Ũ' => 'U', 'Ŭ' => 'U', 'Ư' => 'U', 'Ţ' => 'T', 'Ý' => 'Y', 'Ő' => 'O',
 'Â' => 'A', 'Ľ' => 'L', 'Ẅ' => 'W', 'Ż' => 'Z', 'Ī' => 'I', 'Ã' => 'A', 'Ġ' => 'G',
 'Ṁ' => 'M', 'Ō' => 'O', 'Ĩ' => 'I', 'Ù' => 'U', 'Į' => 'I', 'Ź' => 'Z', 'Á' => 'A',
 'Û' => 'U', 'Þ' => 'Th', 'Ð' => 'Dh', 'Æ' => 'Ae', 'Ĕ' => 'E',

 'А'=>'A','Б'=>'B','В'=>'V','Г'=>'G','Д'=>'D','Е'=>'E','Ё'=>'Yo','Ж'=>'Zh','З'=>'Z','И'=>'I','Й'=>'Y',
 'К'=>'K','Л'=>'L','М'=>'M','Н'=>'N','О'=>'O','П'=>'P','Р'=>'R','С'=>'S','Т'=>'T','У'=>'U','Ф'=>'F',
 'Х'=>'H','Ц'=>'Ts','Ч'=>'CH','Ш'=>'Sh','Щ'=>'Shch','Ъ'=>'','Ы'=>'I','Ь'=>'','Э'=>'E','Ю'=>'Yu','Я'=>'Ya',
 'Ґ'=>'g','Є'=>'e','І'=>'i','Ї'=>'i','№'=>'no_',
 );
 // Замена строчных букв
 $this->fileName=str_replace(
 array_keys($UTF8_LOWER_ACCENTS),
 array_values($UTF8_LOWER_ACCENTS),
 $this->fileName
 );
 // Замена заглавных букв
 $this->fileName=str_replace(
 array_keys($UTF8_UPPER_ACCENTS),
 array_values($UTF8_UPPER_ACCENTS),
 $this->fileName
 );
 // Дополнительный фильтр
 $this->fileName=preg_replace(
 array(
 '/[&]/', // все амперсанды
 '/[\s]/', // все пробелы
 '/[^a-z_\.\d\(\)-]/i', // все кроме допустимых символов (английский алфавит, цифры, тире и нижнее подчеркивание)
 ),
 array(
 'and',
 '_',
 '',
 ),
 $this->fileName
 );
}// Автопереименоватор-3000 finish

Затем в файле:

ckfinder/config.php

найти строку $config[‘forceAscii’] = false;
и превратить ее в $config[‘forceAscii’] = true;
Эта настройка будет служить включателем и выключателем для Автопереименоватора-3000

После всех манипуляций Ваш файлик «Классические интерьеры.jpg» превратится в «Klassicheskie_intereri.jpg» и будет везде отображаться одинаково.

Если у кого-то что-то не получилось пишите комментарии, будем вместе разбираться.
А с вами был webSnegovik, всем успехов.

Автоматический транслит имен файлов при загрузке в CKFinder 3: 6 комментариев

  1. Спасибо огромное! Единственный блог в котором всё написано коротко и по делу. Всё получилось. Единственное такой вопрос: в файле \ckfinder\core\connector\php\vendor\cksource\ckfinder\config.template.php
    есть строка
    $config[‘forceAscii’] = false;
    Её нужно ставить в true?

    1. Нет, не нужно.
      config.template.php — это шаблон конфига для ckfinder. Видимо он активируется, когда основной файл config.php становится недоступен.

  2. Работает, спасибо!
    Но если после загрузки переименовать файл, то опять пишет кракозябры, как это можно исправить?

    1. Если вы переименуете файл используя кириллицу с помощью ckfinder то естественно он закракозябит файлы. Переименовывайте файлы только на латинницу.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *