Добрый вечер господа! Перевел сайт мультиязычный на Друпал 8, сделано три языка.
На англоязычной версии адреса страниц вопросов нет, но вот на немецком и французском проблема.
Проблема заключается в том что, при нажатии очистить кэш, страницы некоторые теряют префикс
de или fr, точнее не совсем так страницы имеют префиксы нужные, а вот вывод в боковом меню там часть страниц (не очень большая) становится без префикса выбранного языка. Я пробовал несколько раз убирать эти ссылки в меню на эти страницы и потом заново добавлять- все отлично работает- без вопросов, но только я сделаю очистку кэша, опять эти же страницы без префикса.
Хотел в базе изменить но строк много и где именно менять не нашел. Подскажите где копать.
Комментарии
Я бы проверил - есть ли у тех страниц, где "пропадают префиксы" страницы соответствующего языка, то есть выбран ли вообще у страницы язык и есть ли все переводы. Если пункты меню вручную создавались, то и у них настройки языка. Потом анонимом перепроверил бы ситуацию, то есть что он видит - тоже самое или у него проблема с потерей не воспроизводится.
В базе вручную ничего лучше не трогать.
здесь понимается апгрейд с 6/7 версии или же сайт был изначально сделан на 8ке, просто включили мультиязычность? Чтобы исключить проблемы от апгрейда (если он был).
Страницы одного и того же материала имеют переводы и адреса у них с префиксами. Апргрейд на 8-ю версию простым переносом страниц вручную, т.е сайт с нуля.
Создание ссылки в меню соответственно добавить ссылку на нужном языке (скопировав ссылку соотвествующего языка готовой страницы ), вопрос в чем еще раз - сссылка теряет префикс "de" хотя другие ссылки в этом меню остаются с префиксом при очистке кэша, получается она сидит в кэше с префиксом. Я пробовал, страница имеет префикс если не очищать кзш.
Разобрался, пришлось править базу данных, других решений не нашел.
Что именно делали? Расскажите
Мультиязычность в 8-ке работает из коробки отлично, невнятные проблемы часто связаны с шаред хостингом и негарантированными ресурсами, возможно в момент формирования кеша (8-ка жрет много ресурсов) недоделанный приезжает, я бы проверил на локальном сервере сайт.
Все делалось на денвере, а то что пишете отлично - не факт, пока это только слова, перепробовал много разных вариантов, не помогло после очистки кэша, тем более оно может и отлично, а если делать несколько меню на разных языках боковое по разделам.
Было бы здорово, кто мультиязычный сайт делал поделился бы опытом, помогло бы многим, на разных примерах.
Мне пришлось в базе открыть сточку menu_link_content_data и где не хватало префикса (соответствующих страниц) добавить /de или /fr, английский язык по умолчанию итак работает.
Может надо было по-другому сделать, но вот такой вариант получается, сейчас закончу и перезалью сайт на 8-ку.
https://www.drupal.org/docs/8/multilingual
https://www.youtube.com/watch?v=ZQDf3IhlVPI
Насчет добавления префикса, добавлял не везде, где в соответствующем меню данного языка страница бокового меню была без префикса, там и добавлял, очистка кэша и проверял меню.
Вот похожая тема была, там я рассказывал как победил похожую проблему: https://drupal.ru/node/136679
Вот мой текущий код немного почище того старого, без завязки на названия языков:
* Implements hook_link_alter().
*/
function HOOK_link_alter(&$variables) {
// Make sure all internal links from a page lead to the correct language versions of any linked page
if (isset($variables['options']['attributes']['class'])
&& is_array($variables['options']['attributes']['class'])
&& in_array('language-link', $variables['options']['attributes']['class'])) return;
$language = \Drupal::languageManager()->getCurrentLanguage();
$variables['options']['language'] = $language;
}
Выше немножко накосячил, когда удалял не относящийся к делу код для публикации - надо еще проверять, что ссылка внутренняя:
* Implements hook_link_alter().
*/
function HOOK_link_alter(&$variables) {
// Make sure all internal links from a page lead to the correct language versions of any linked page
if ($variables['url']->isExternal()) return;
if (isset($variables['options']['attributes']['class'])
&& is_array($variables['options']['attributes']['class'])
&& in_array('language-link', $variables['options']['attributes']['class'])) return;
$language = \Drupal::languageManager()->getCurrentLanguage();
$variables['options']['language'] = $language;
}
"marassa" спасибо, будет немного посвободнее, посмотрю еще раз.