javascript - Language switcher - How to remember user's choice? - Stack Overflow

I'm trying to build a language switcher option for a site that I started building. I was wonderin

I'm trying to build a language switcher option for a site that I started building. I was wondering - How can make the site remember the user's language choice? My code seems to be working perfectly fine, but it reverts back to the default language (English).

Help would be awesome!

Here's my code:

 $('[lang="fr"]').hide();
    $('[lang="sp"]').hide();

    $('#lang-switch').change(function () {
    var lang = $(this).val();
    switch (lang) {
    case 'en': 
      $('[lang]').hide();
      $('[lang="en"]').show();
      break;
    case 'fr':
      $('[lang]').hide();
      $('[lang="fr"]').show();
      break;
    case 'sp':
      $('[lang]').hide();
      $('[lang="sp"]').show();
      break;
    default:
      $('[lang]').hide();
      $('[lang="en"]').show();
      }
    });
 [lang="fr"],[lang="sp"]{display:none;} 
<script src=".1.1/jquery.min.js"></script>
<p>Change language</p>
    <select id="lang-switch">
    <option value="en">English</option>
    <option value="fr">French</option>
    <option value="sp">Spanish</option>
    </select>

<p lang="en">Hello!</p>
<p lang="fr">Bojour!</p>
<p lang="sp">Hola!</p>

I'm trying to build a language switcher option for a site that I started building. I was wondering - How can make the site remember the user's language choice? My code seems to be working perfectly fine, but it reverts back to the default language (English).

Help would be awesome!

Here's my code:

 $('[lang="fr"]').hide();
    $('[lang="sp"]').hide();

    $('#lang-switch').change(function () {
    var lang = $(this).val();
    switch (lang) {
    case 'en': 
      $('[lang]').hide();
      $('[lang="en"]').show();
      break;
    case 'fr':
      $('[lang]').hide();
      $('[lang="fr"]').show();
      break;
    case 'sp':
      $('[lang]').hide();
      $('[lang="sp"]').show();
      break;
    default:
      $('[lang]').hide();
      $('[lang="en"]').show();
      }
    });
 [lang="fr"],[lang="sp"]{display:none;} 
<script src="https://ajax.googleapis./ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>Change language</p>
    <select id="lang-switch">
    <option value="en">English</option>
    <option value="fr">French</option>
    <option value="sp">Spanish</option>
    </select>

<p lang="en">Hello!</p>
<p lang="fr">Bojour!</p>
<p lang="sp">Hola!</p>

https://jsfiddle/ad77gzLu/4/

Share Improve this question edited Apr 18, 2018 at 23:28 Gerardo BLANCO 5,6481 gold badge19 silver badges36 bronze badges asked Apr 3, 2018 at 18:41 Jean-Pierre64Jean-Pierre64 1051 gold badge2 silver badges7 bronze badges 1
  • 1 Javascript localStorage would maybe help you refer to w3schools./html/html5_webstorage.asp – Basch Commented Apr 3, 2018 at 18:44
Add a ment  | 

2 Answers 2

Reset to default 4

you can use local storage to do this. This will be a better option rather than using cookies because cookies are sent to the server on every request (unless you want to be able to read this on the server side))

you can read more about local storage here on its documentation

https://developer.mozilla/en-US/docs/Web/API/Window/localStorage

here is the refactored code.

Unfortunately, StackOverflow code is sandboxed so you will need to test it from js fiddle

    //
    //original code
    $('[lang="fr"]').hide();
    $('[lang="sp"]').hide();
    //retrieve value from localstorage
    let savedLang = localStorage.getItem('lang')
    //we check if the value is present
    if(savedLang){
      let element = document.querySelector(`option[value='${savedLang}']`);
    	element.selected = true
      selectText(savedLang);
    }

    $('#lang-switch').change(function () {
      var lang = $(this).val();
      localStorage.setItem('lang', lang);
      selectText(lang);
    })
    
    //as this code is called from different places now
    //I extracted it to a funciton
    function selectText(lang){
      switch (lang) {
      case 'en': 
        $('[lang]').hide();
        $('[lang="en"]').show();
        break;
      case 'fr':
        $('[lang]').hide();
        $('[lang="fr"]').show();
        break;
      case 'sp':
        $('[lang]').hide();
        $('[lang="sp"]').show();
        break;
      default:
        $('[lang]').hide();
        $('[lang="en"]').show();
        }
    }
    
    
 [lang="fr"],[lang="sp"]{display:none;} 
   <script src="https://ajax.googleapis./ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <p>Change language</p>
    <select id="lang-switch">
    <option value="en">English</option>
    <option value="fr">French</option>
    <option value="sp">Spanish</option>
    </select>

<p lang="en">Hello!</p>
<p lang="fr">Bojour!</p>
<p lang="sp">Hola!</p>

here is the forked jsfiddle:

https://jsfiddle/rsjcs65L/


Add localStorage.setItem('language', lang); to save in client side and localStorage.language to get the saved value.

It won't work on the SO snippet as it is in a sandbox.

Hope this helps

Here is an example with your code but wont work on the snippet

HTML

    <p>Change language</p>
    <select id="lang-switch">
    <option value="en">English</option>
    <option value="fr">French</option>
    <option value="sp">Spanish</option>
    </select>

<p lang="en">Hello!</p>
<p lang="fr">Bojour!</p>
<p lang="sp">Hola!</p>

<button onclick="alert(localStorage.language)">
Get storage
</button>

CSS

[lang="fr"],[lang="sp"]{display:none;} 

JS

$('[lang="fr"]').hide();
    $('[lang="sp"]').hide();

    $('#lang-switch').change(function () {
    var lang = $(this).val();
    switch (lang) {
    case 'en': 
      $('[lang]').hide();
      $('[lang="en"]').show();
      break;
    case 'fr':
      $('[lang]').hide();
      $('[lang="fr"]').show();
      break;
    case 'sp':
      $('[lang]').hide();
      $('[lang="sp"]').show();
      break;
    default:
      $('[lang]').hide();
      $('[lang="en"]').show();
      }
      localStorage.setItem('language',lang);
    });

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744791582a4593948.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信