В base.html.twig у меня есть следующее:
<html lang = "{{- app.request.locale -}}" dir = "{{- app.request.locale|locale_dir -}}">
Где locale_dir — это пользовательский фильтр Twig, который возвращает ltr или rtl в зависимости от локали. Затем у меня есть контроллер с route, использующий /{_locale}/ в качестве пути, и небольшое меню с языками для переключения.
Если я введу в адресную строку https://localhost:8000/en/, я получу английскую страницу с тегом HTML следующим образом:
<html lang = "en" dir = "ltr">
Если я введу в адресную строку https://localhost:8000/ar/, я получу арабскую страницу с тегом HTML, например:
<html lang = "en" dir = "rtl">
Однако, если я введу адрес страницы на английском языке, а затем использую меню для перехода на арабский язык, я получу арабскую страницу с тегом HTML следующим образом:
<html lang = "ar" dir = "ltr">
И если я введу адрес страницы на арабском языке, а затем использую меню, чтобы перейти на английский, я получу английскую страницу с тегом HTML следующим образом:
<html lang = "en" dir = "rtl">
Я поместил запись журнала в свой собственный фильтр Twig и могу сказать, что при изменении языка с помощью меню мой фильтр вызывается для тега HTML и возвращает правильное значение, но аргумент тега dir не используется. обновлено.
Я предполагаю, что Symfony на самом деле не перезагружает всю страницу при переходе по ссылке, а скорее делает какой-то вызов Ajax (или аналогичный), чтобы получить контент, и обновляет аргумент lang, но не аргумент dir тега HTML?
Что мне не хватает?
Обновлено: Только что протестировал с открытым скрипачом, чтобы увидеть, что происходит: при изменении языка с помощью меню скрипач обнаруживает обычный запрос GET с полной страницей в качестве ответа. И в этом ответе аргумент dir всегда имеет правильное значение:
<html lang = "en" dir = "ltr">
и
<html lang = "ar" dir = "rtl">
Однако сам DOM не обновляет аргумент dir должным образом:
<html lang = "ar" dir = "ltr">
РЕДАКТИРОВАТЬ 2. Вот видео о том, что я имею в виду под symfony, обновляет аргумент body и lang, но оставляет аргумент dir с его первым значением.
Как я уже сказал, я подтвердил в Fiddler, что ответ от сервера имеет правильное значение в каталоге.
РЕДАКТИРОВАТЬ 3: создал репозиторий git с минимальным тестированием по адресу https://github.com/537mfb/dir_test
По сути, мой код правильно генерирует HTML, но Symfony не обновляет dom - я подозреваю, что при нажатии на ссылку выполняется вызов Ajax, и в результате этого вызова тело заменяется, как и аргумент lang тега HTML, но не аргумент dir.
Вы действительно можете увидеть, как это происходит, от инспектора.
Как уже упоминалось, Symfony не имеет ничего общего с DOM. Что значит подозрительный? Это вызов AJAX или нет? Если да, то ваш вопрос неполный, и вам следует выяснить, почему не установлена правильная переменная. На данный момент в вопросе отсутствуют подробности
@DarkBee, это новый проект - должно быть, это делает Symfony - И я подозреваю, потому что я не знаю внутренностей Symfony - что я знаю, так это то, что когда я нажимаю ссылку, от клиента к серверу передается вызов GET , сервер отвечает полной страницей с правильным значением dir - но, как вы можете видеть из GIF, я добавил аргумент lang, который обновляется вместе с телом - но аргумент dir остается тем, что было раньше
Я лучше всего предполагаю, что вызов ajax или ajax-подобный
Что ж, вам придется выяснить, где срабатывает этот вызов, чтобы продолжить отладку проблемы.
@DarkBee Я создал минимальный тест на github.com/537mfb/dir_test - Я добавил сюда 0 строк JavaScript, и это все еще происходит - Как я уже сказал, все, что происходит, исходит от Symfony - но я не знаю достаточно о внутренностях Symfony, чтобы понять это
@DarkBee, есть ли у тебя какие-нибудь подсказки о том, что я нашел и опубликовал в качестве ответа?





Я решил эту проблему, добавив дополнительный entrypoint в importmap.php, который использую исключительно на rtl языках.
Обновлено: После дальнейшей проверки я понял, что теперь, когда добавлен новый entrypoint, теперь выполняются два последовательных GET запроса.
Различия в заголовках двух запросов:
Запрос 1:
accept: text/html, application/xhtml+xml
x-sec-purpose: prefetch
x-turbo-request-id: 701c1632-41bd-4694-a309-e937451645ed
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Запрос 2:
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Итак, я предполагаю, что @hotwired/turbo (который устанавливается вместе с полной установкой symfony - с использованием --webapp) ответственен за проблему, с которой я столкнулся.
все же - не идеально иметь два GET запроса - оба возвращают полную страницу, но, по крайней мере, это работает.
Ваш вопрос сбивает с толку. Я понятия не имею, что происходит правильно или неправильно. «[...] и в этом ответе аргумент dir всегда имеет правильное значение». Так это работает? Ни Symfony, ни Twig не имеют ничего общего с DOM. Он просто генерирует выходные данные, в данном случае HTML. Вы заявляете, что навигация из вашего меню не будет работать, но это всего лишь еще один запрос GET, если только вы не используете JavaScript для отмены этого, но об этом ничего не упоминается.