Transliteration Drupal 8

Комментарии

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 4 марта 2016 в 0:14
1

Transliteration действительно в ядре, и просто так он оттуда не вылезет. Воспользоваться им можно через File (Field) Paths. После его установки в настройках полей с файлами (в том числе и изображениями) появится нужная возможность:
File (Field) Paths Settings

PS. Транслит сработает во время сохранения.

PSS. Если при редактировании ноды не отображается миниатюра с изображением, то дело вот в чем. В модуле File (Field) Paths при формировании пути используется константа DIRECTORY_SEPARATOR, которая для виндовых систем будет "\". И с превью для таких таких uri пока трабл. Варианты решений:

1. После сохранения идти в базу, находить нужное изображение, исправлять слэш в пути и обновить кэш (который до сих пор свято верит, что все под его контролем).
2. Пропатчить файл модуля (/modules/filefield_paths/filefield_paths.inc 101), вбив там "/" и плевать на все.
3. Настроить DIRECTORY_SEPARATOR в конфиге пхп (решение для слабаков, вестимо)

Аватар пользователя 555666777 555666777 11 октября 2016 в 20:45
2

Устанавливать кучу нестабильного контриба из-за транслитерации имен файлов ни к чему...
Можно просто свой модуль накидать:

<?php

function mymodule_file_validate($file) {

    

$destination mymodule_transliteration ($file->destination);
    
$basename drupal_basename($destination);
    
$directory drupal_dirname($destination);
    
$file->destination file_create_filename($basename$directory);

}

function 

mymodule_transliteration ($str) {

    

//Здесь можете реализовать любую логику транслитерации
    
$str str_replace(' ''_'$str);
    
$str = \Drupal::transliteration()->transliterate($str);
    
$str strtolower($str);
    return 
$str;

}

?>

В результате, все файлы с именами на русском языке, включая inline, будут корректно отображаться (без иероглифов и кракозябров).
PS: Транслит сработает сразу при загрузке.

Аватар пользователя ligraf ligraf 23 ноября 2016 в 18:24

vaplas!
Где находится страница скриншот которй Вы сделали (с чекбоксом "Enable file (Field) Path" и "Transliterate")?
Всю админку перерыл, не могу найти.

Аватар пользователя vlucas vlucas 26 апреля 2017 в 22:27

Вот вполне себе рабочий и полный пример:

use Drupal\file\FileInterface;

/**
 * Implements hook_file_validate().
 */

function mymodule_file_validate(FileInterface $file) {
  $basename = drupal_basename($file->destination);
  $basename = mymodule_transliteration($basename);
  $dirname = drupal_dirname($file->destination);
  $file->destination = file_create_filename($basename, $dirname);
}

/**
 * Implements callback for hook_file_validate().
 */

function mymodule_transliteration($filename) {
  $filename = \Drupal::transliteration()->transliterate($filename);
  // Replace whitespace.
  $filename = str_replace(' ', '_', $filename);
  // Remove remaining unsafe characters.
  $filename = preg_replace('![^0-9A-Za-z_.-]!', '', $filename);
  // Remove multiple consecutive non-alphabetical characters.
  $filename = preg_replace('/(_)_+|(\.)\.+|(-)-+/', '\\1\\2\\3', $filename);
  // Force lowercase to prevent issues on case-insensitive file systems.
  $filename = strtolower($filename);

  //For empty
  $name = reset(explode('.', $filename));
  $extension = end(explode(".", $filename));

  //Is empty
  if (!$name) {
    $filename = md5(rand()) . '.' . $extension;
  }

  return $filename;
}