getgrav / getgrav/grav-plugin-langswitcher

Session storage "traps" user in a language

Open
#46 5 comments 0 reactions 0 assignees View on GitHub
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.