Detect browser language and redirect, but allow switch language

Hi everyone!
I need to detect browser language and redirect to right URL

I wrote this code in the homepage´s before tag

<script>
 var FullUserLang = navigator.language || navigator.userLanguage;
 var userLang = FullUserLang.slice(0, 2)
 if(userLang === "it"){
   window.location.replace("/ita/home");
 }
 </script>

The problem is that if I am redirected to the other language version, I am not able to use language switch and put it back to English, which is stupid. How can I solve this problem?


Here is my site Read-Only: [LINK][1]
([how to share your site Read-Only link][2])

[1]: [Webflow - Hale)
[2]: Share a read-only link | Webflow University

You need to add a session cookie in witch you store if the user has changed the default language in the switch.

So add a listener to the switch language. Record the choice and then add a second condition to

if(userLang === “it” )

BTW if the site has a lot of pages consider using Weglot. It will handle this problem … somewhere in the settings…

Hey Lia! The behavior you’re experiencing is likely because the redirection script is still active on the /ita/home page. This means that if a user with an “it” browser language tries to switch back to the English version of the site, the script will detect their browser language again and immediately redirect them back to the /ita/home page.

To solve this issue, you should use a mechanism to detect if the user has manually changed the language so that the redirection does not occur after a manual switch. There are a few different ways to approach this, but one simple method is to use a cookie:

  1. When the user manually switches the language, set a cookie indicating their language preference.
  2. Before executing the redirection script, check if this cookie exists. If it does, respect the user’s preference and don’t redirect.

Here’s an example of how you can modify your script to use cookies:

function setCookie(name, value, days) {
    var expires = "";
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days*24*60*60*1000));
        expires = "; expires=" + date.toUTCString();
    }
    document.cookie = name + "=" + (value || "") + expires + "; path=/";
}

function getCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

// Check if user manually set the language
var manuallySetLanguage = getCookie("user_language_preference");

if (!manuallySetLanguage) {
    var FullUserLang = navigator.language || navigator.userLanguage;
    var userLang = FullUserLang.slice(0, 2);
    if(userLang === "it"){
       window.location.replace("/ita/home");
    }
}

Now, when a user manually switches the language on your site, you should call the setCookie function to set their preference:

// When user switches to English
setCookie("user_language_preference", "en", 30); // 30 days expiry

// When user switches to Italian
setCookie("user_language_preference", "it", 30); // 30 days expiry

With this setup, the redirection script will first check if the user has manually set a language preference in a cookie. If they have, it won’t perform the redirection. If they haven’t, it’ll use the browser’s language to determine where to redirect.

1 Like

Hi! Thank you for your reply!
Unfortunately we don´t have budget for Weglot so here we are :blush:

Hi Natasha! Thank you for your reply :pray:
I am a beginner with code so I was wondering if you could specify how I call the setCookie function

// When user switches to English
setCookie("user_language_preference", "en", 30); // 30 days expiry

// When user switches to Italian
setCookie("user_language_preference", "it", 30); // 30 days expiry

I have copied and past your code, but setCookie function remain inactive (white)
Could you be super specific with me please? :sweat_smile:

Of course! I’ll break it down step by step for you.

To make the code I provided work:

  1. Add the JavaScript to your siteFirst, ensure that the functions setCookie, getCookie, and the redirection logic are placed in the “Before </body> tag” section of your Webflow project. This ensures that the code runs after the whole page is loaded.
function setCookie(name, value, days) {
    // ... the rest of the function code ...
}

function getCookie(name) {
    // ... the rest of the function code ...
}

// The redirection logic
var manuallySetLanguage = getCookie("user_language_preference");
if (!manuallySetLanguage) {
    var FullUserLang = navigator.language || navigator.userLanguage;
    var userLang = FullUserLang.slice(0, 2);
    if(userLang === "it"){
        window.location.replace("/ita/home");
    }
}
  1. **Add the call to setCookie**This is the part where you need to manually integrate with Webflow. The idea here is when a user clicks on a button or a link to switch the language, that’s when you’ll call setCookie.Let’s say you have two buttons or links on your site: one for English and one for Italian.
  • For the English button/link:Go to Webflow Designer, select the button or link for switching to English. In the settings panel, you’ll see an option to add an “onclick” action for this element. Here, you’ll enter:
setCookie('user_language_preference', 'en', 30); return true;
  • For the Italian button/link:Do the same thing but use this:
setCookie('user_language_preference', 'it', 30); return true;
```If you can't find the onclick action in Webflow directly, you can add a custom attribute:
  1. With the button selected, go to the Element Settings panel.
  2. Under Custom Attributes, click the + button.
  3. For the name field, type `onclick`.
  4. For the value field, type `setCookie('user_language_preference', 'en', 30); return true;` (or the 'it' variant for the Italian button).
3. **Testing**:Once you've set everything up, try visiting your site. If your browser's default language is set to Italian, it should redirect you to the `/ita/home` URL. Now, when you click on the English language button/link, it should allow you to switch to English without immediately redirecting you back to Italian. This behavior will persist for 30 days or until the user clears their cookies.

Thank you so much for this!

As you predicted, Webflow doesn´t have any setting for “onclick” action. I have followed your instructions for custom attributes, but when I try to name the custom attribute “onclick” but that is not allowed as it is a “reserved name”

I have found this code from Finsweet, which I have passed into the body tag:

<!-- F’in sweet Webflow Hacks -->
<script>
// JS
// on button click
document.querySelector('.hack-button.hack12-js').addEventListener('click', ()=>{	
  // paste your function - start
  setCookie('user_language_preference', 'en', 30); return true;
  // paste your function - end
});

</script>

After that, I have given 2 class names “hack-button” and “hack12-js” to the language switcher link

It still doesn´t work :frowning_face:

You have any idea where I go wrong?

I saw you had trouble with the onclick attribute, so I decided to modify the code. Here is the modified code.

<script>
  // This event listener waits for the DOM to be fully loaded before executing the code
  document.addEventListener('DOMContentLoaded', function() {
    
    // Check if the user's preferred language is already set
    var userLangPreference = localStorage.getItem('userLangPreference');

    // If the userLangPreference is not set, detect the browser language and set it
    if (!userLangPreference) {
      var FullUserLang = navigator.language || navigator.userLanguage;
      var userLang = FullUserLang.slice(0, 2);
      
      // Set the user's preferred language in localStorage
      if (userLang === 'it') {
        localStorage.setItem('userLangPreference', 'it');
      } else {
        localStorage.setItem('userLangPreference', 'en');
      }
    }

    // Redirect the user to the appropriate language version if needed
    var currentLang = localStorage.getItem('userLangPreference');
    if (currentLang === 'it') {
      window.location.replace('/ita/home'); // Redirects to Italian version
    }

    // Function to switch the language
    function switchLanguage(lang) {
      localStorage.setItem('userLangPreference', lang);
      window.location.reload(); // Reload the page to apply the language switch
    }

    // Get the button elements by their IDs
    var englishButton = document.getElementById('english-btn');
    var italyButton = document.getElementById('italy-btn');

    // Attach a click event listener to the buttons
    englishButton.addEventListener('click', function() {
      switchLanguage('en'); // Calls switchLanguage with 'en' for English
    });
    
    italyButton.addEventListener('click', function() {
      switchLanguage('it'); // Calls switchLanguage with 'it' for Italian
    });
  });
</script>


Here’s a breakdown of what’s happening in the script:

  1. The script starts with an event listener that waits for the DOM content to be fully loaded before executing the code within the function.
  2. It checks if the user’s preferred language is already stored in the localStorage.
  3. If the language preference is not set, it checks the browser’s language using navigator.language or navigator.userLanguage and sets the user’s preferred language in the localStorage.
  4. It then checks the current language preference and, if it’s set to ‘it’ (Italian), it redirects the user to the Italian version of the website using window.location.replace().
  5. The switchLanguage function allows users to switch between languages. It updates the language preference in the localStorage and reloads the page to apply the language switch.
  6. The script gets the button elements by their IDs using getElementById.
  7. It attaches click event listeners to the buttons. When the buttons are clicked, the corresponding language is passed to the switchLanguage function.

Just add an ID to each of your elements. And then, replace the two ID values in this code with the IDs of your elements.

    // Get the button elements by their IDs
    var englishButton = document.getElementById('english-btn');
    var italyButton = document.getElementById('italy-btn');

I hope you this will fix your problem.

Hi! Thank you for your input!
I have tried it, but it doesn´t work. It doesn´t even redirect to italian on load anymore

Could you look at my link please?

Sorry, my friend. It was a small typing error. I have updated the code, and it will work perfectly now. Please use this code.

Thank you so much for revisiting the code! Now it can detect the browser preferences and redirect to italian version. The problem is still the language buttons, they don´t work, the page is always reloaded in italian
Maybe I put the code in the wrong place? I have given them an ID as you suggested
Do you have any idea?

thanks :pray:

Hey Lia, it seems the issue you’re facing now is that even when you try to switch languages via the button, the redirection logic still thinks the browser’s preference is Italian.

  1. Update your Redirect Logic: Ensure that the redirection logic (that uses localStorage) only fires once when a user first visits your site and their language preference hasn’t been manually set. After it has fired once, it shouldn’t redirect the user again unless they manually change their language preference.
  2. Use IDs for your Buttons: You mentioned that you’ve already added IDs to your buttons. Double-check to make sure they match the ones in your script:
    English button should have the ID english-btn.
    Italian button should have the ID italy-btn.
  3. Ensure Script Position: Ensure that the script you provided is placed in the “Before </body> tag” section of your Webflow project. This ensures that the code runs after the whole page is loaded, which is crucial because your script needs to find the elements by their IDs, and they won’t exist until the page is fully loaded.
  4. Revise the Redirection Logic: Revise your redirection logic to only redirect users if they haven’t already been redirected (or set their preference manually):
document.addEventListener('DOMContentLoaded', function() {
    
    // Check if the user's preferred language is already set
    var userLangPreference = localStorage.getItem('userLangPreference');

    // If the userLangPreference is not set, detect the browser language and set it
    if (!userLangPreference) {
        var FullUserLang = navigator.language || navigator.userLanguage;
        var userLang = FullUserLang.slice(0, 2);

        // Set the user's preferred language in localStorage
        if (userLang === 'it') {
            localStorage.setItem('userLangPreference', 'it');
            window.location.replace('/ita/home'); // Redirects to Italian version ONLY once
        } else {
            localStorage.setItem('userLangPreference', 'en');
        }
    }

    // Function to switch the language
    function switchLanguage(lang) {
        localStorage.setItem('userLangPreference', lang);
        window.location.reload(); // Reload the page to apply the language switch
    }

    // Get the button elements by their IDs
    var englishButton = document.getElementById('english-btn');
    var italyButton = document.getElementById('italy-btn');

    // Attach a click event listener to the buttons
    englishButton.addEventListener('click', function() {
        switchLanguage('en'); // Calls switchLanguage with 'en' for English
    });
    
    italyButton.addEventListener('click', function() {
        switchLanguage('it'); // Calls switchLanguage with 'it' for Italian
    });
});
  1. Ensure Language Links Are Not Directly Redirecting: Make sure your English and Italian language buttons/links are not directly set to redirect to another page in Webflow. If they are, it will interfere with your JavaScript logic. They should only have the IDs attached and should not have any direct link set in Webflow.