Вы здесь

Как изменить одну букву в маппинге транслитерации?

1

Есть сайт, где много страниц, названных по адресам города, например:

Гдовская 24 => gdovskaa-24

то есть вот реально, 80% улиц заканчивается на сочетание "ая", что друпал 8 транслитерирует как "aa"

narodnaa
kommunalnaa
inzenernaa 
и тд

на этой странице https://www.drupal.org/documentation/modules/transliteration нашел следующее:

we need to map the last two digits of the hexadecimal character code (33) to the desired output string:
$variant['az'] = array(0x33 => 'q');

но там не понятно куда это писать и в какой обвязке? В модуле или может в конфиге?

нашел еще такой вопрос без ответа на стаке: https://drupal.stackexchange.com/questions/233865/how-do-i-override-the-...

в общем, мне нужно чтобы транслитерация заменяла букву "я" на "ya", но как сделать это переопределение маппинга не влезая в ядро д8?

файлы самого сопоставления букв замены лежат как я понял здесь \core\lib\Drupal\Component\Transliteration\data в виде PHP файлов с массивами

Версия Drupal: 
8.x
Связанные проекты: 
Transliteration
Вопрос задан 10.09.2017 - 11:28

Ответы

1

Как и было написано здесь: https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Language%...

If the overrides you want to provide are standard for your language, consider providing a patch for the Drupal Core transliteration system instead of using this hook.

поэтому как я понял, нужно предложить вариант транслитерации некоторых букв, отличающихся от "стандартных", создав данный файл \core\lib\Drupal\Component\Transliteration\data\ru.php

с правилом транслитерации буквы «я» для русского языка (кириллическая буква я есть в нескольких других языках и в других языках она может транслитерироваться по-другому)

<?php

/**
 * @file
 * Russian transliteration data for the PhpTransliteration class.
 */

$overrides['ru'] = [
  0x42F => 'JA',
  0x44F => 'ja',
];

Правила транслитерации можно взять здесь
https://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BB%D0%B8...

Шеснадцатиричные(?) коды кириллических букв взял отсюда
https://ru.wikipedia.org/wiki/%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8...

Остается теперь разобраться как его запушить в репозиторий Drupal 8 core

Ответ дан 11.09.2017 - 11:06
2

D8 change notice - https://www.drupal.org/node/1842748
Там отмечено, что нужно использовать hook_transliteration_overrides_alter()

Ответ дан 10.09.2017 - 12:37

Спасибо за подсказку!
Для того чтобы использовать этот хук в модуле, нужно использовать данный неймспейс?

use Drupal\Component\Transliteration\PhpTransliteration;

или он нужен только для использования класса?

Комментарий оставлен 11.09.2017 - 10:11

Написал так

<?php
/**
 * @file
 * Contains \Drupal\my_module\Plugin\Block\YourBlockName.
 */

namespace Drupal\my_module\Plugin\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Component\Transliteration\PhpTransliteration;
use Drupal\Component\Transliteration\TransliterationInterface;
//use Drupal\Core\Transliteration\PHPTransliteration;

function my_module_transliteration_overrides_alter(&$overrides, $langcode) {
    $overrides[0x44F] = 'ya';
}

Но никакого эффекта это не возымело. Вообще странно, что в папке \core\lib\Drupal\Component\Transliteration\data не нашлось ни одного массива с кодом русского языка ['ru'], а единственная буква "я" которая есть в этой папке находится в кыргызском языке и выглядит так:

<?php

/**
 * @file
 * Kyrgyz transliteration data for the PhpTransliteration class.
 */

$overrides['kg'] = [
  0x41 => 'E',
  0x416 => 'C',
  0x419 => 'J',
  0x425 => 'X',
  0x426 => 'TS',
  0x429 => 'SCH',
  0x42E => 'JU',
  0x42F => 'JA',
  0x436 => 'c',
  0x439 => 'j',
  0x445 => 'x',
  0x446 => 'ts',
  0x449 => 'sch',
  0x44E => 'ju',
  0x44F => 'ja',
  0x451 => 'e',
  0x4A2 => 'H',
  0x4A3 => 'h',
  0x4AE => 'W',
  0x4AF => 'w',
  0x4E8 => 'Q',
  0x4E9 => 'q',
];

файл: \core\lib\Drupal\Component\Transliteration\data\kg.php

буква "я" здесь в строке 0x44F => 'ja'
не понятно тогда откуда друпал берет транслитерацию, если во всей папке data упоминание ASCII кода буквы я есть толкьо в кыргызском, и то там более правильная транслитерация (хотя-бы ja)

То есть в папке data нет файла ru.php. Может быть надо его туда добавить? Для этого нужен пулл-реквест в ядро друпала?

Комментарий оставлен 11.09.2017 - 10:47

Мне тоже не нравится транслитерация в Drupal 8. Действительно, скорее всего, все проблемы можно решить добавлением файла ru.php

Комментарий оставлен 13.09.2017 - 06:16

файл-то я добавил, только некогда разбираться как его в репозиторий ядра залить. Это нужно сделать потому что "я" транслитерируется ужасно. Наверняка есть и другие ньюансы транслитерации которые можно поправить

Комментарий оставлен 13.09.2017 - 07:18

Добрый день. Если найдете решение, опишите пожалуйста. Тоже интересует замена символов транслитерации. С уважением, Андрей.

Комментарий оставлен 19.09.2017 - 09:45