言語切り替えボタンを押すと表示されるテキストが切り替わるjs作ったのでコードを紹介

言語切り替えボタンを押すと表示されるテキストが切り替わるjs作ったのでコードを紹介
関連キーワード
デザイン

ウェブサイトの多言語対応をするにあたり、同一のページ内で表示する言語を切り替えたいと思って、ボタンを押すと表示されるテキストが切り替わるjs作りました。

ChatGPTに相談しながら作ったコードで、まだ作り途中なので今後ブラッシュアップするとは思いますが、ひと段落したので備忘録がてら書き留めておきます。

今回の多言語対応の目的

本格的に多言語対応させるためには、結局は言語ごとにページを作るのが一番良いと思います。

headタグ内に書くべき情報なども言語によって変わりますし、それによってGoogleなどの検索エンジンに伝える情報も異なります。

とはいえ、「このページのこの箇所だけ日本語と英語の表記を用意したい」っていうこともあると思うので、そんな時に使えるコードです。

言語切り替えボタンのコード

まずはヘッダーあたりに置く「言語切り替えボタン」のコードです。HTMLとjsを併記しておくので、jsを別ファイルに移したい場合は適宜うまいことやってください。

<div class="lang-box">
  <button id="switch-lang" data-current-lang="ja">
    <span class="switch-lang-selected">ja</span> / <span class="switch-lang-not">en</span>
  </button>
</div>
<script>
  document.addEventListener('DOMContentLoaded', function() {
    var button = document.getElementById('switch-lang');
    var storedLang = localStorage.getItem('selectedLang'); // LocalStorageから言語設定を取得

    // 保存された言語設定に基づいてページの言語を設定
    if (storedLang) {
      setLanguage(storedLang);
    }

    // 言語切り替えボタンのクリックイベント
    button.addEventListener('click', function() {
      var currentLang = button.getAttribute('data-current-lang');
      var newLang = currentLang === 'en' ? 'ja' : 'en';

      setLanguage(newLang);

      // 新しい言語設定をLocalStorageに保存
      localStorage.setItem('selectedLang', newLang);
    });
  });

  function setLanguage(lang) {
    var button = document.getElementById('switch-lang');
    var contentElements = document.querySelectorAll('[data-en], [data-ja]');
    var imageElements = document.querySelectorAll('.lang-img'); // 言語切り替え対象の画像要素を全て選択

    contentElements.forEach(function(el) {
      var newText = el.getAttribute('data-' + lang);
      if (el.innerHTML === el.textContent) {
        el.textContent = newText;
      } else {
        el.innerHTML = newText;
      }
      el.setAttribute('data-current-lang', lang);
    });

    // すべての画像要素のsrc属性を更新
    imageElements.forEach(function(img) {
      img.src = img.getAttribute('data-' + lang);
    });

    // ボタンのテキストを更新
    if (lang === 'en') {
      button.innerHTML = '<span class="switch-lang-not">ja</span> / <span class="switch-lang-selected">en</span>';
    } else {
      button.innerHTML = '<span class="switch-lang-selected">ja</span> / <span class="switch-lang-not">en</span>';
    }
    button.setAttribute('data-current-lang', lang);
  }
</script>

表示するテキストのHTML記述例

表示するテキストのHTMLは下記の感じで書いてください。

<div id="content">
  <h2 data-en="About website" data-ja="ウェブサイトの使い方">ウェブサイトの使い方</h2>

  <div id="multilang-content" data-en="<?php echo esc_attr(wpautop(get_field('english_text'))); ?>" data-ja="<?php echo esc_attr(wpautop(get_field('japanese_text'))); ?>">
    <?php echo wpautop(get_field('japanese_text')); // 初期表示は日本語 ?>
  </div>

  <div class="about-img-box">
    <img class="lang-img" src="<?php echo get_stylesheet_directory_uri(); ?>/images/japanese_image1.jpg" data-en="<?php echo get_stylesheet_directory_uri(); ?>/images/english_image1.jpg" data-ja="<?php echo get_stylesheet_directory_uri(); ?>/images/japanese_image1.jpg">
    <img class="lang-img" src="<?php echo get_stylesheet_directory_uri(); ?>/images/japanese_image2.jpg" data-en="<?php echo get_stylesheet_directory_uri(); ?>/images/english_image2.jpg" data-ja="<?php echo get_stylesheet_directory_uri(); ?>/images/japanese_image2.jpg">
  </div>
</div>

例として3パターン記載してます。

1つ目はシンプルにHTMLタグの中にdata-enとdata-jaの2つの言語のテキストを入れておくだけの簡単なものです。

2つ目はACFのカスタムフィールドを出し分けるコードで、テキストエリアにテキストを放り込むだけを想定しているので、wpautopをつけてます。

3つ目は画像を出力する例です。画像のパスはテーマフォルダを示すように書いてしまいましたが、uploadフォルダ内を設定した方が使い勝手が良いかもしれません。

最後に

雑な情報で恐縮ですが、詳細はコードをまるっとコピーしてChatGPTに送って解説してもらってください。

こういう使い方ができるのでChatGPTはやっぱり便利ですね。

キーワード
デザイン