Переключение между языками с помощью JS

Я пытаюсь создать веб-сайт, на котором можно переключать языки с английского на французский, нажав кнопку переключения. Я попробовал несколько способов без Javascript, потому что мало что знаю, и только с CSS, но так и не нашел желаемого результата.

Только <h2 class = "title">welcome!</h2>меняется на "yoohoo les nazes", остальное не меняется.

Кто-нибудь может помочь?

document.querySelector('#togBtn').addEventListener('input', (event) => {
  document.querySelector('.title', '.1', '.2', '.3', '.4', '.5').textContent = data[event.currentTarget.checked ? 'francais' : 'english'].title;
  .1;
});
var data = {
  "english": {
    "title": "welcome!",
    "1": "My work is primarily inspired by nature.",
    "2": "Each creation is unique.",
    "3": "The white porcelain I use",
    "4": "I studied and graduated",
    "5": "I wish to thank"
  },
  "francais": {
    "title": "yoohoo les nazes",
    "1": "Mon travail est d'abord inspiré sur la nature.",
    "2": "chaque création est unique.",
    "3": "La porcelaine blanche que j'utilise",
    "4": "j'ai étudiée et sui diplômée",
    "5": "j'aimerai remercier"
  }
}
.switch {
  position: relative;
  display: inline-block;
  width: 80px;
  height: 34px;
}

.switch input {
  display: none;
}

.slider {
  position: absolute;
  cursor: pointer;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: brown;
  -webkit-transition: .4s;
  transition: .4s;
}

.slider:before {
  position: absolute;
  content: "";
  height: 26px;
  width: 26px;
  left: 4px;
  bottom: 4px;
  background-color: white;
  -webkit-transition: .4s;
  transition: .4s;
}

input:checked+.slider {
  background-color: burlywood;
}

input:focus+.slider {
  box-shadow: 0 0 1px #2196F3;
}

input:checked+.slider:before {
  -webkit-transform: translateX(26px);
  -ms-transform: translateX(26px);
  transform: translateX(45px);
}

.slider {
  border-radius: 34px;
}

.slider:before {
  border-radius: 50%;
}

.on {
  display: none;
}

.on,
.off {
  color: white;
  position: absolute;
  transform: translate(-50%, -50%);
  top: 50%;
  left: 50%;
  font-size: 10px;
  font-family: Verdana, sans-serif;
}

input:checked+.slider .on {
  display: block;
}

input:checked+.slider .off {
  display: none;
}
<link rel = "preconnect" href = "https://fonts.googleapis.com">
<link rel = "preconnect" href = "https://fonts.gstatic.com" crossorigin>
<link href = "https://fonts.googleapis.com/css2?family=Whisper&display=swap" rel = "stylesheet">
<link rel = "stylesheet" href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css" integrity = "sha512-SnH5WK+bZxgPHs44uWIX+LLJAJ9/2PkPKZ5QiAj6Ta86w+fsb2TkcmfRyVX3pBnMFcV7oQPJkl9QevSCWr3W6A= = " crossorigin = "anonymous" referrerpolicy = "no-referrer"
/>

<label class = "switch">       
  <input type = "checkbox" id = "togBtn">       
  <div class = "slider round">         
    <span language='english' class = "on">EN</span>         
    <span language='francais' class = "off">FR</span>       
  </div>     
</label>
<ul class = "nav-items">
  <div class = "content">
    <h2 class = "title">welcome!</h2>
    <p class = "1">My work is primarily inspired by nature.</p>
    <p class = "2">Each creation is unique.</p>
    <p class = "3">The white porcelain I use</p>
    <p class = "4">I studied and graduated </p>
    <p class = "5">I wish to thank</p>
  </div>
</ul>
document.querySelector('.title', '.1', '.2', '.3', '.4', '.5').textContent = - вы не можете использовать querySelector таким образом, он принимает только один параметр. Вы хотите использовать querySelectorAll с одним параметром, который выбирает все эти элементы, а затем вам нужно перебрать полученный список элементов и установить текстовое содержимое для каждого из них индивидуально.
CBroe 21.06.2024 10:58

И, к вашему сведению, вы не можете выбирать на основе классов, которые начинаются с такой цифры, вам нужно будет экранировать ее в селекторе, см. mathiasbynens.be/notes/css-escapes Лучше вообще избегать таких имен классов, и хотя бы используйте нечисловой префикс.

CBroe 21.06.2024 11:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
93
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Первая проблема, с которой вы столкнулись, заключается в том, что document.querySelector() можно выбрать только один элемент. Чтобы выбрать несколько элементов, вместо этого используйте querySelectorAll(). Однако использованный вами синтаксис неверен. Вам необходимо предоставить один селектор строк, а не несколько аргументов, например:

document.querySelector('.title, .element1, .element2, .element3, .element4, .element5');

Чтобы улучшить качество кода, вы можете использовать один общий класс, который вы добавляете ко всем элементам, подлежащим переводу, я использовал .translate в следующем примере. Отсюда вы можете перебрать все эти элементы и использовать атрибут data, чтобы предоставить «ключ» перевода, который будет использоваться для этого конкретного элемента.

Кроме того, обратите внимание, что метки EN и FR в переключателе были инвертированы для отображаемого языка.

Наконец, как отметил @CBroe в комментариях, браузеры терпимы к числовым значениям class и id, однако это выходит за рамки спецификации и не является хорошей практикой. Вместо этого я преобразовал их в буквенно-цифровые значения.

Вот рабочий пример с внесенными выше изменениями:

document.querySelector('#togBtn').addEventListener('change', e => {
  document.querySelectorAll('.translate').forEach(el => {
    el.textContent = data[e.target.checked ? 'francais' : 'english'][el.dataset['tkey']];
  });
});

var data = {
  "english": {
    "title": "welcome!",
    "para-01": "My work is primarily inspired by nature.",
    "para-02": "Each creation is unique.",
    "para-03": "The white porcelain I use",
    "para-04": "I studied and graduated",
    "para-05": "I wish to thank"
  },
  "francais": {
    "title": "yoohoo les nazes",
    "para-01": "Mon travail est d'abord inspiré sur la nature.",
    "para-02": "chaque création est unique.",
    "para-03": "La porcelaine blanche que j'utilise",
    "para-04": "j'ai étudiée et sui diplômée",
    "para-05": "j'aimerai remercier"
  }
}
.switch {
  position: relative;
  display: inline-block;
  width: 80px;
  height: 34px;
}

.switch input {
  display: none;
}

.slider {
  position: absolute;
  cursor: pointer;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: brown;
  -webkit-transition: .4s;
  transition: .4s;
}

.slider:before {
  position: absolute;
  content: "";
  height: 26px;
  width: 26px;
  left: 4px;
  bottom: 4px;
  background-color: white;
  -webkit-transition: .4s;
  transition: .4s;
}

input:checked+.slider {
  background-color: burlywood;
}

input:focus+.slider {
  box-shadow: 0 0 1px #2196F3;
}

input:checked+.slider:before {
  -webkit-transform: translateX(26px);
  -ms-transform: translateX(26px);
  transform: translateX(45px);
}

.slider {
  border-radius: 34px;
}

.slider:before {
  border-radius: 50%;
}

.on {
  display: none;
}

.on,
.off {
  color: white;
  position: absolute;
  transform: translate(-50%, -50%);
  top: 50%;
  left: 50%;
  font-size: 10px;
  font-family: Verdana, sans-serif;
}

input:checked+.slider .on {
  display: block;
}

input:checked+.slider .off {
  display: none;
}
<link rel = "preconnect" href = "https://fonts.googleapis.com">
<link rel = "preconnect" href = "https://fonts.gstatic.com" crossorigin>
<link href = "https://fonts.googleapis.com/css2?family=Whisper&display=swap" rel = "stylesheet">
<link rel = "stylesheet" href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css" integrity = "sha512-SnH5WK+bZxgPHs44uWIX+LLJAJ9/2PkPKZ5QiAj6Ta86w+fsb2TkcmfRyVX3pBnMFcV7oQPJkl9QevSCWr3W6A= = " crossorigin = "anonymous" referrerpolicy = "no-referrer"
/>

<label class = "switch">       
  <input type = "checkbox" id = "togBtn">       
  <div class = "slider round">         
    <span class = "on">FR</span>         
    <span class = "off">EN</span>       
  </div>     
</label>
<ul class = "nav-items">
  <div class = "content">
    <h2 class = "translate" data-tkey = "title">welcome!</h2>
    <p class = "translate" data-tkey = "para-01">My work is primarily inspired by nature.</p>
    <p class = "translate" data-tkey = "para-02">Each creation is unique.</p>
    <p class = "translate" data-tkey = "para-03">The white porcelain I use</p>
    <p class = "translate" data-tkey = "para-04">I studied and graduated </p>
    <p class = "translate" data-tkey = "para-05">I wish to thank</p>
  </div>
</ul>

Просто отметим, что технически вы можете использовать оператор запятой: document.querySelectorAll('.title, .1, .2, .3, .4, .5') должно быть в порядке.

Symtox 21.06.2024 14:05

@Symtox, ты совершенно прав. Я обновил ответ, чтобы быть более точным. Спасибо!

Rory McCrossan 21.06.2024 17:42

Помимо идеального решения, предложенного @Rory McCrossan, я предлагаю другое решение, использующее полезные «селекторы с подстановочными знаками» и индекс массива без атрибута данных.

let checkBox = document.querySelector('#togBtn')

var data = {
    "english": {
      "0": "welcome!",
      "1": "My work is primarily inspired by nature.",
      "2": "Each creation is unique.",
      "3": "The white porcelain I use",
      "4": "I studied and graduated",
      "5": "I wish to thank"
    },
    "francais": {
      "0": "yoohoo les nazes",
      "1": "Mon travail est d'abord inspiré sur la nature.",
      "2": "chaque création est unique.",
      "3": "La porcelaine blanche que j'utilise",
      "4": "j'ai étudiée et sui diplômée",
      "5": "j'aimerai remercier"
    }
  }


checkBox.addEventListener('change', () => {
    let elemToChange = document.querySelectorAll('[class^ = "myclass"]')
    elemToChange.forEach((elem,idx)=>{
        elem.innerHTML=data[checkBox.checked ? "francais" : "english"][idx]
    })
  });
.switch {
    position: relative;
    display: inline-block;
    width: 80px;
    height: 34px;
  }
  
  .switch input {
    display: none;
  }
  
  .slider {
    position: absolute;
    cursor: pointer;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: brown;
    -webkit-transition: .4s;
    transition: .4s;
  }
  
  .slider:before {
    position: absolute;
    content: "";
    height: 26px;
    width: 26px;
    left: 4px;
    bottom: 4px;
    background-color: white;
    -webkit-transition: .4s;
    transition: .4s;
  }
  
  input:checked+.slider {
    background-color: burlywood;
  }
  
  input:focus+.slider {
    box-shadow: 0 0 1px #2196F3;
  }
  
  input:checked+.slider:before {
    -webkit-transform: translateX(26px);
    -ms-transform: translateX(26px);
    transform: translateX(45px);
  }
  
  .slider {
    border-radius: 34px;
  }
  
  .slider:before {
    border-radius: 50%;
  }
  
  .on {
    display: none;
  }
  
  .on,
  .off {
    color: white;
    position: absolute;
    transform: translate(-50%, -50%);
    top: 50%;
    left: 50%;
    font-size: 10px;
    font-family: Verdana, sans-serif;
  }
  
  input:checked+.slider .on {
    display: block;
  }
  
  input:checked+.slider .off {
    display: none;
  }
<body>
    <label class = "switch">       
    <input type = "checkbox" id = "togBtn">       
    <div class = "slider round"> 
        <span language='english' class = "off">En</span>  
        <span language='francais' class = "on">Fr</span>  
                       
    </div>     
    </label>
    <ul class = "nav-items">
    <div class = "content">
        <h2 class = "myclass0">welcome!</h2>
        <p class = "myclass1">My work is primarily inspired by nature.</p>
        <p class = "myclass2">Each creation is unique.</p>
        <p class = "myclass3">The white porcelain I use</p>
        <p class = "myclass4">I studied and graduated </p>
        <p class = "myclass5">I wish to thank</p>
    </div>
    </ul>
</body>

.

Другие вопросы по теме