getgrav / getgrav/grav-plugin-langswitcher
Session storage "traps" user in a language
- Dominant language
- PHP
- Stars
- 31
- Forks
- 25
- PR merge metrics
- No merged PRs in 30d
Description
## Context
I have a site set up so that English is the default language and French is a second language.
When the user switches to French, `/fr/` is inserted just after the root `me.net/page` -> `me.net/fr/page`.
With `session_store_active : false` this behaviour works as expected both ways, changing language will add or remove the `/fr/` appropriately.
## Issue
However, setting `session_store: true` "traps" the user in French: trying to change the language to English points the user to `me.net/page` as expected but a `302` redirect bounces them back to `me.net/fr/page`.
Changing just the `session_store` setting and nothing else makes this behaviour systematically repeatable.
## Useful data
```yaml
# /user/config/system.yaml
# ...
absolute_urls: false
default_locale: null
reverse_proxy_setup: false
custom_base_url: ''
intl_enabled: true
session:
enabled: true
languages:
supported:
- en
- fr
include_default_lang: false
translations: true
translations_fallback: true
session_store_active: true # <- Flip this boolean to replicate
http_accept_language: true
override_locale: false
0: en
1: fr
pages:
redirect_default_route: false
redirect_default_code: '302'
redirect_trailing_slash: true
# ...
```
```yaml
# /user/config/plugins/langswitcher.yaml
enabled: true
built_in_css: false
untranslated_pages_behavior: none
```
```twig
{% for language in langswitcher.languages %}
{% set show_language = true %}
{% if language == langswitcher.current %}
{% set show_language = false %}
{% set lang_url = page.url %}
{% else %}
{% set base_lang_url = base_url_simple ~ grav.language.getLanguageURLPrefix(language) %}
{% set lang_url = base_lang_url ~ langswitcher.page_route ~ page.urlExtension %}
{% set untranslated_pages_behavior = grav.config.plugins.langswitcher.untranslated_pages_behavior %}
{% if untranslated_pages_behavior != 'none' %}
{% set translated_page = langswitcher.translated_pages[language] %}
{% if (not translated_page) or (not translated_page.published) %}
{% if untranslated_pages_behavior == 'redirect' %}
{% set lang_url = base_lang_url ~ '/' %}
{% elseif untranslated_pages_behavior == 'hide' %}
{% set show_language = false %}
{% endif %}
{% endif %}
{% endif %}
{% set active_class = '' %}
{% endif %}
{% if show_language %}
{{ native_name(language)|capitalize }}
{% endif %}
{% endfor %}
```
Contributor guide
No contributing guide indexed for this repository
Research direction
Reproduce the redirect loop by toggling session_store_active in /user/config/system.yaml and using the links generated by /user/themes/custom-theme/templates/partials/langswitcher.html.twig. Trace the language URL and session redirect handling, then verify that switching from French to English no longer returns a 302 redirect to /fr/page.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- php
- Domain
- localization
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100