Обнови мой сайт с выбором языка и загрузкой переводов из JSON, добавив возможность переводить не только отдельные элементы, но и части текста внутри параграфов.

index.html:

```
<!DOCTYPE html>  
<html lang="ru">  
<head>   
  <link rel="stylesheet" href="style.css">  
  <meta charset="UTF-8">  
  <meta name="googlebot" content="notranslate">  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">  
  <meta property="og:image" content="pics/favicon.ico">  
  <meta property="og:type" content="website">  
  <title>Сайт</title>  
</head>  
<body>  
  
<div class="language-selector">  
  <img src="https://flagcdn.com/w80/ru.png" alt="Русский" data-lang="ru" id="ru-flag">  
  <img src="https://flagcdn.com/w80/us.png" alt="English" data-lang="en" id="en-flag">  
  <img src="https://flagcdn.com/w80/ua.png" alt="Українська" data-lang="uk" id="uk-flag">  
</div>  
  
<h1 id="sidebar.home"></h1>  
<h1 id="sidebar.aboutme"></h1>  
<p id="sidebar.gallery"></p>  
  
<script src="script.js"></script>  
</body>  
  
</html>
```

script.js:

```
document.addEventListener('DOMContentLoaded', () => {  
    const languageSelector = document.querySelector('.language-selector');  
    const flags = document.querySelectorAll('.language-selector img');  
    let translations = {};  
  
    // Функция для загрузки JSON с переводами  
    function loadTranslations() {  
        return fetch('lang.json')  
            .then(response => response.json())  
            .then(data => {  
                translations = data;  
            })  
            .catch(err => {  
                console.error('Ошибка загрузки lang.json:', err);  
            });  
    }  
  
    // Функция для определения языка пользователя  
    function detectLanguage() {  
        const storedLang = localStorage.getItem('language');  
        if (storedLang && translations[storedLang]) {  
            return storedLang;  
        }  
  
        const browserLang = navigator.language.slice(0, 2).toLowerCase();  
        if (translations[browserLang]) {  
            return browserLang;  
        }  
  
        // Поиск среди navigator.languages  
        for (let lang of navigator.languages) {  
            let shortLang = lang.slice(0, 2).toLowerCase();  
            if (translations[shortLang]) {  
                return shortLang;  
            }  
        }  
  
        // По умолчанию английский  
        return 'en';  
    }  
  
    // Функция для установки языка  
    function setLanguage(lang) {  
        if (!translations[lang]) return;  
  
        const langTranslations = translations[lang];  
        for (const key in langTranslations) {  
            const element = document.getElementById(key);  
            if (element) {  
                element.textContent = langTranslations[key];  
            }  
        }  
  
        // Обновление localStorage  
        localStorage.setItem('language', lang);  
  
        // Обновление выделения флага  
        flags.forEach(flag => {  
            if (flag.dataset.lang === lang) {  
                flag.classList.add('selected');  
            } else {  
                flag.classList.remove('selected');  
            }  
        });  
    }  
  
    // Обработчик клика по флагам  
    languageSelector.addEventListener('click', (e) => {  
        if (e.target.tagName === 'IMG') {  
            const selectedLang = e.target.dataset.lang;  
            setLanguage(selectedLang);  
        }  
    });  
  
    // Инициализация  
    loadTranslations().then(() => {  
        const userLang = detectLanguage();  
        setLanguage(userLang);  
    });
```