Using Javascript to change website language

前端 未结 4 1393
走了就别回头了
走了就别回头了 2020-11-30 23:00

I\'m working on a GUI website that can use several languages. The original HTML-files I got to work with were totally static. So if translation was needed I had to parse thr

4条回答
  •  伪装坚强ぢ
    2020-11-30 23:09

    No offense to the other answerers but storing the text in JavaScript or in data attributes is not good for search engines or disabled site visitors and offers no benefits while added unnecessarily complicated code. The best and most simple solution in my opinion is to make use of HTML lang attribute and use JavaScript to show and hide the desired language. This solution also gracefully degrades so if a site visitor has their JavaScript disabled it will still display the content. Here is my solution:

    HTML

    
    
    

    Hello Hola

    I really enjoy coding.

    Me gusta mucho la codificación.

    jQuery

    $('[lang="es"]').hide();
    
    $('#switch-lang').click(function() {
      $('[lang="es"]').toggle();
      $('[lang="en"]').toggle();
    });
    

    Then I would recommend adding HTML5 Geolocation to determine which language to show initially based on the users location in the world. I would also use Fontawesome language icon to show users they can switch languages in a way that is understandable by anyone: http://fontawesome.io/icon/language/

    Here is the working code example at CodePen: https://codepen.io/codepajamas/pen/ZejaQz?editors=1010

    Here is an additional example on code pen using a select menu to change between 3 (or more) languages: https://codepen.io/codepajamas/pen/NjGOMV

    Updated Full Example with Geolocation and Cookies

    I kept working on this and created an updated example switching between two languages Chinese and English (if you need more than two languages you would have to hide all languages and show only the one selected instead of using toggle the way I am). This code also detects if an existing cookie is already set for the language using jQuery Cookie. It also checks their geolocation if their browser supports it automatically setting the language to Chinese if they are in either Taiwan or China and defaults to English in all other countries. The code below is commented so you can see what each step is doing and hopefully be able to modify it to suit your needs. Here it is:

    HTML

    
    
    

    Hello 你好

    I really enjoy coding.

    我真的很喜歡編碼。

    jQuery Note: this requires linking to not only jQuery but also jQuery Cookie

    $(function () {
      ///// Language Switching (2 languages: English and Chinese). /////
    
      // Initially disable language switching button.
      $('#switch-lang').css({'pointer-events':'none',
       'cursor':'default'}).attr('disabled','disabled');
    
      function langButtonListen() {
        $('#switch-lang').click(function (event) {
          event.preventDefault();
          $('[lang="zh"]').toggle();
          $('[lang="en"]').toggle();
          // Switch cookie stored language.
          if ($.cookie('lang') === 'en') {
            $.cookie('lang', 'zh', { expires: 7 });
          } else {
            $.cookie('lang', 'en', { expires: 7 });
          }
        });
        // Enable lang switching button.
        $('#switch-lang').css({'pointer-events':'auto',
         'cursor':'pointer'}).removeAttr('disabled');
      }
    
      // Check if language cookie already exists.
      if ($.cookie('lang')) {
        var lang = $.cookie('lang');
        if (lang === 'en') {
          $('[lang="zh"]').hide();
          langButtonListen();
        } else {
          $('[lang="en"]').hide();
          langButtonListen();
        }
      } else {
        // no cookie set, so detect language based on location.
        if ("geolocation" in navigator) {
          // geolocation is available
          navigator.geolocation.getCurrentPosition(function (position) {
            // accepted geolocation so figure out which country
            var lat = position.coords.latitude,
                lng = position.coords.longitude;
            $.getJSON('http://maps.googleapis.com/maps/api/geocode/json?latlng='+lat+','+lng+'&sensor=true', null, function (response) {
              var country = response.results[response.results.length-1].formatted_address;
              if (country ===  'Taiwan' || country === 'China') {
                $('[lang="en"]').hide();
                $.cookie('lang', 'zh', { expires: 7 });
                langButtonListen();
              } else {
                $('[lang="zh"]').hide();
                $.cookie('lang', 'en', { expires: 7 });
                langButtonListen();
              }
            }).fail(function (err) {
              console.log('error: '+err);
              $('[lang="zh"]').hide();
              $.cookie('lang', 'en', { expires: 7 });
              langButtonListen();
            });
          },
          function (error) {
            if (error.code == error.PERMISSION_DENIED) {
              // denied geolocation
              $('[lang="zh"]').hide();
              $.cookie('lang', 'en', { expires: 7 });
              langButtonListen();
            } else {
              console.log('Unknown error. Defaulting to English!');
              $('[lang="zh"]').hide();
              $.cookie('lang', 'en', { expires: 7 });
              langButtonListen();
            }
          });
        } else {
          // geolocation IS NOT available
          $('[lang="zh"]').hide();
          $.cookie('lang', 'en', { expires: 7 });
          langButtonListen());
        }
      }
    });
    

提交回复
热议问题