Не работает перевод (.tpl) при распечатки заказа pdf в административной части prestashop 8
Вернуться назад
41

Не работает перевод (.tpl) при распечатки заказа pdf в административной части prestashop 8

Осталю здесь чтобы не потерять

Похожая проблема есть в посте: Не работает перевод при распечатки заказа pdf в prestashop 1.7 и выше

В примерах я буду приводить стандартную тему "classic"

Немного опишу как работают переводы

Когда вы заходите в раздел переводов в административной части, вы видите список переводов которые доступны из шаблонов магазина. Так как происходит сканирование всех шаблонов в магазине через код если в строке файла содерщится запись {l s='Translate text' d='Shop.Theme'}. Сканирование происходит по определенным дерикториям сайта. К примеру возьмем тему магазина, в коде прописана дериктория "themes", и в ней если есть файлы шаблон форматов ".tpl", то они будут все просканированны, даже если они находятся во вложенных дерикториях. После скаинирования, происходит временное сохранение, типа кэша (чтобы сильно не нагружать магазин). Если в настройках отключить кэширование, то произойдет повторное сканирование файла.

Таким образом у вас в Административной части может появится поле для перевода. Которое возможно будет пустым или будет заполненным.

Переводы хранятся в файлах ".xlf" и в базе дынных в таблице "translate", перечислю:

1) Файлы форматов ".xlf" хранятся в каталоге поздней версии к примеру "prestashop 1.7 версий" это каталог вы сможете найти к примеру по пути "\app\Resources\translations\en-US\....en-US.xlf". От туда подгружаются переводы, и приорите данного файла будет 2, так как первоначально перевод проверяется в базе данных, а потом происходит поиск перевода в каталоге, тоесть в файле ".xlf".
В новой версии prestashop 8, каталог теперь находится по пути "\translations\en-US\....en-US.xlf"

2) В базе данных в таблице "translate" хранятся переводы выбранной темы, или хранятся базовые переводы. Поэтому если вам нужно к примеру получить переводы шаблонов pdf в формате ".tpl", вам следует выбирать название темы по которой выполняете перевод, или не выбирать тему, и получать переводы базовых шаблонов.

Тоесть как я писал ранее, сначала выполняется поиск перевода в базе данных в таблице "translate", если перевод не находит выполняет поиск в файле ".xlf". Но если перевод не находит в ".xlf", то выводится текст который вы ввели в шаблоне.

Моя проблема заключается в переводе шаблонов счетов pdf, где pdf собирается по шаблонам ".tpl"

После того как выполняет пользователь заказ на сайте, то в администраивной части в разделе "Заказы" я вижу заказы которые выполнял пользователь. Я захожу в заказ и хочу создать счет в формате pdf, все делаю именно в административной части. После того как произойдет скачивание pdf, я его открываю и там не весь текст переведен.

Так как шаблоны pdf, я создавал (или переносил/изменял) в теме по пути "/themes/classic/pdf/...". Чтобы у каждой темы был свой шаблон. Или если магазин будет обновляться, то шаблоны темы не будут затронуты, а мои изменения остатунся в файлах. Так как базовые шаблоны для "pdf" хранятся по пути "/pdf/..." и они обновляются если магазин выполняет обновление на новую версию.

По скольку перевод выполнялся в выбранной теме, то перевод должен был грузится из него. Но из него он не загрузит перевод так как в административной части, вы находитесь в разделе заказ и у вас не известно выбранна тема или нет, поэтому тема вам не доступна и перевод не будет получен. И в pdf у вас не все будет переведено. В этом и заключается ошибка prestashop. Если у вас магазин работает как мультимагазин, то возможно переводы будут грузится, так как я не проверял с мультимагазином.

Получение перевода в коде.
Если вам не интересно, вы можете пропустить этот пункт.

Сразу сообщу выполняется вызов на класс "\vendor\symfony\symfony\src\Symfony\Component\Translation\Translator.php", который в функции "loadCatalogue", выполняет загрузку перевода, там также проверяется кэш перевода, если кэша нет, то выполнит повторную загрузку перевода.

Файл: \vendor\symfony\symfony\src\Symfony\Component\Translation\Translator.php

Чтобы исправлять ошибки или выполнять проверку, ниже я написал пример дополнительного кода, который не выполняет кэширование.

Все действия выполняемы в пункте: Внимание: это может делать только разработчик, чтобы проверить работу выполнения кода!!!

Файл: \vendor\symfony\symfony\src\Symfony\Component\Translation\Translator.php

Далее в функции "doLoadCatalogue", получаем переводы либо из каталога ".xlf" либо из базы данных:

В строке кода: $this->catalogues[$locale]->addCatalogue($this->loaders[$resource[0]]->load($resource[1], $locale, $resource[2]));

Файл: \vendor\symfony\symfony\src\Symfony\Component\Translation\Translator.php

Функция "load" выполняет 2 класса которые:

  • \src\PrestaShopBundle\Translation\Loader\SqlTranslationLoader.php - Выполняется вызов функции "load". Тут выполняется запрос на таблицу базы данных "translate". Это файл самого prestashop написанными разработчиками и он переопределяет файл symfony в зависмости как написанно в конфигурации yml.
  • \vendor\symfony\symfony\src\Symfony\Component\Translation\Loader\XliffFileLoader.php - Выполняется вызов функции "load". Тут выполняется запрос в файлы форматов ".xlf". Они могут лежать по пути которые писал выше, это "\app\Resources\translations\en-US\....en-US.xlf" в старой версии 1.7 или в новой версии 8 на "\translations\en-US\....en-US.xlf"

Теперь вы немного знаете файлы которые работают

Решение

Решение заключается в одном файле который находится по пути "\src\PrestaShopBundle\Translation\Loader\SqlTranslationLoader.php" в функции "load"

Вы также можете сверить код с версией prestashop 1.7 и prestashop 8. Код будет отличаться, так как в новой версии разработчики изменили получение переводов из шаблонов.

Проблема заключается в том, что перевод он получает из базовых переводов из таблицы "translate", но наши шаблоны ".tpl", находятся в теме "classic", в дериктории "/themes/classic/pdf/...", а перевод подгружается только из базовых. Но мы выполняли перевод по выбранной теме.

На данный момент вы находитесь в административной части, в самом заказе пользователя, и хотите скачать счет в pdf. Но вы не получаете текущую тему в которой вы выполняли перевод. Так как действительно в админке вы не находитесь в какой либо это темы. Но хотя для текущего магазина выбранна тема "classic". Поэтому хотябы должен получать текущую тему и подгружать эти переводы. Но как видите он этого не делает.

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

Файл: \src\PrestaShopBundle\Translation\Loader\SqlTranslationLoader.php

После того как вы измените этот файл, у вас теперь должны грузиться переводы.

создано:
21.01.2025
обновлено:
23.01.2025
автор:
admin
Теги
yandex metrika