// Obsid — Language switcher (EN / RU) // Add data-i18n="key" to elements, data-i18n-placeholder="key" for placeholders const OBSID_TRANSLATIONS = { en: { "nav.features": "Features", "nav.health": "Health", "nav.levels": "Levels", "nav.reviews": "Reviews", "nav.faq": "FAQ", "nav.download": "Download", "nav.getapp": "Get the App", "nav.home": "Home", "hero.badge": "Push-Up Training App", "hero.title": "Train harder.
Level up.
Every rep counts.", "hero.sub": "Obsid turns push-ups into a progression system. Track reps, build streaks, unlock achievements — and become unstoppable.", "hero.appstore.label": "Download on the", "hero.appstore.name": "App Store", "hero.google.label": "Get it on", "hero.google.name": "Google Play", "hero.stat1.val": "5.0", "hero.stat1.lbl": "App Store rating", "hero.stat2.val": "30+", "hero.stat2.lbl": "Achievements", "hero.stat3.val": "Free", "hero.stat3.lbl": "To download", "features.label": "Why Obsid", "features.title": "Everything you need
to get stronger", "features.sub": "Purpose-built for push-up training. No fluff, no distractions — just the tools that make you better.", "feat1.title": "Rep Tracking", "feat1.desc": "Guided push-up sessions with live rep counting and form cues. Every set logged automatically.", "feat2.title": "30+ Achievements", "feat2.desc": "Over 30 unique badges to unlock — from your first set to 10,000 reps. Every milestone deserves a celebration.", "feat3.title": "Streak Calendar", "feat3.desc": "Visualize your consistency. Keep your streak alive and see your progress build week over week.", "feat4.title": "Smart Progressions", "feat4.desc": "7 push-up variants — chest, back, shoulders, core, and more. Balanced weekly plans that adapt to you.", "feat5.title": "Video Tutorials", "feat5.desc": "Animated exercise guides — crystal-clear form breakdowns so every rep is done right.", "feat6.title": "Detailed Stats", "feat6.desc": "Time, calories, volume — your numbers front and center. Know exactly how far you've come.", "health.label": "Health Integration", "health.title": "Works with your
health apps", "health.sub": "Obsid syncs workouts, calories, and activity directly with Apple Health and Google Health Connect. Your data, unified.", "health.apple.title": "Apple Health", "health.apple.sub": "Workouts, active energy, heart rate", "health.google.title": "Google Health Connect", "health.google.sub": "Exercise sessions, steps, calories", "prog.label": "Leveling System", "prog.title": "From beginner
to master", "prog.sub": "A multi-level progression system built to keep you motivated. Every push-up gets you closer to the top.", "prog.note": "After Level 6, every additional 1,000 push-ups earns you the next Master rank — the ceiling is yours to set.", "prog.today": "Today", "prog.reps": "of 60 reps", "prog.time.lbl": "Time", "prog.kcal.lbl": "kcal", "prog.achievement.label": "Achievement Unlocked", "prog.achievement.name": "Beast Mode", "prog.achievement.sub": "500 push-ups in a week", "stats.1.val": "30+", "stats.1.lbl": "Unique achievements", "stats.2.val": "7+", "stats.2.lbl": "Levels to unlock", "stats.3.val": "7", "stats.3.lbl": "Push-up variations", "stats.4.val": "5.0★", "stats.4.lbl": "App Store rating", "reviews.label": "Reviews", "reviews.title": "Athletes love it", "review1.text": "\"Went from struggling with 10 push-ups to crushing 80 clean reps. The leveling system keeps me coming back every single day.\"", "review1.meta": "LEVEL 7 · CHAMPION", "review2.text": "\"Best no-equipment app out there. The streak calendar is brutal in the best way — I haven't missed a day in 3 months.\"", "review2.meta": "LEVEL 5 · WARRIOR", "review3.text": "\"Finally an app that respects the grind. Simple, focused, and the achievement system hits different. IRON to ELITE in 8 weeks.\"", "review3.meta": "LEVEL 8 · ELITE", "cta.title": "Start today.
First rep is free.", "cta.sub": "No gym. No excuses. Just push.", "footer.desc": "The dedicated push-up training app. Build strength, track progress, level up.", "footer.product": "Product", "footer.support": "Support", "footer.getapp": "Get the App", "footer.features": "Features", "footer.health": "Health Integration", "footer.levels": "Levels", "footer.download": "Download", "footer.faq": "Help & FAQ", "footer.privacy": "Privacy Policy", "footer.terms": "Terms of Service", "footer.contact": "Contact Us", "footer.ios": "App Store (iOS)", "footer.android": "Google Play (Android)", "footer.copy": "© Matvey Guralskiy", "footer.privacyterms": "Privacy & Terms", "faq.eyebrow": "Help Center", "faq.title": "Help & FAQ", "faq.sub": "Find answers to the most common questions about Obsid.", "faq.search": "Search questions…", "faq.cat.all": "All", "faq.cat.start": "Getting Started", "faq.cat.workouts": "Workouts", "faq.cat.health": "Health Integration", "faq.cat.account": "Account", "faq.cat.billing": "Billing", "faq.contact.title": "Contact our team", "faq.contact.sub": "We usually respond within 24 hours.", "faq.noresults": "No results found. Try a different search term.", "faq.stillneed": "Still need help?", "privacy.eyebrow": "Legal", "privacy.title": "Privacy Policy", "privacy.meta": "Last updated: May 4, 2026", "terms.eyebrow": "Legal", "terms.title": "Terms of Service", "terms.meta": "Last updated: May 4, 2026", }, ru: { "nav.features": "Функции", "nav.health": "Здоровье", "nav.levels": "Уровни", "nav.reviews": "Отзывы", "nav.faq": "FAQ", "nav.download": "Скачать", "nav.getapp": "Скачать приложение", "nav.home": "Главная", "hero.badge": "Приложение для отжиманий", "hero.title": "Тренируйся сильнее.
Прокачивай уровень.
Каждое повторение важно.", "hero.sub": "Obsid превращает отжимания в систему прогрессии. Считай повторения, строй серии, открывай достижения — и становись сильнее.", "hero.appstore.label": "Скачать в", "hero.appstore.name": "App Store", "hero.google.label": "Доступно в", "hero.google.name": "Google Play", "hero.stat1.val": "5.0", "hero.stat1.lbl": "Рейтинг App Store", "hero.stat2.val": "30+", "hero.stat2.lbl": "Достижений", "hero.stat3.val": "Бесплатно", "hero.stat3.lbl": "Скачивание", "features.label": "Почему Obsid", "features.title": "Всё для
роста силы", "features.sub": "Создано специально для тренировки отжиманий. Никакой воды — только инструменты, которые делают тебя сильнее.", "feat1.title": "Счётчик повторений", "feat1.desc": "Управляемые сессии с отслеживанием повторений в реальном времени. Каждый подход записывается автоматически.", "feat2.title": "30+ достижений", "feat2.desc": "Более 30 уникальных значков — от первого подхода до 10 000 повторений. Каждый milestone заслуживает праздника.", "feat3.title": "Календарь серий", "feat3.desc": "Визуализируй свою последовательность. Поддерживай серию и наблюдай, как прогресс растёт неделя за неделей.", "feat4.title": "Умная прогрессия", "feat4.desc": "7 вариаций отжиманий — грудь, спина, плечи, пресс и другие. Сбалансированные недельные планы.", "feat5.title": "Видеоуроки", "feat5.desc": "Анимированные руководства по упражнениям — чёткие разборы техники, чтобы каждое повторение было правильным.", "feat6.title": "Подробная статистика", "feat6.desc": "Время, калории, объём — твои цифры всегда на виду. Знай точно, насколько ты продвинулся.", "health.label": "Интеграция со здоровьем", "health.title": "Работает с твоими
health-приложениями", "health.sub": "Obsid синхронизирует тренировки, калории и активность напрямую с Apple Health и Google Health Connect.", "health.apple.title": "Apple Health", "health.apple.sub": "Тренировки, активная энергия, пульс", "health.google.title": "Google Health Connect", "health.google.sub": "Сессии упражнений, шаги, калории", "prog.label": "Система уровней", "prog.title": "От новичка
до мастера", "prog.sub": "Многоуровневая система прогрессии, созданная чтобы мотивировать. Каждое отжимание приближает тебя к вершине.", "prog.note": "После уровня 6 каждые 1 000 дополнительных отжиманий дают следующий ранг Мастера — потолка нет.", "prog.today": "Сегодня", "prog.reps": "из 60 повторений", "prog.time.lbl": "Время", "prog.kcal.lbl": "ккал", "prog.achievement.label": "Достижение открыто", "prog.achievement.name": "Режим зверя", "prog.achievement.sub": "500 отжиманий за неделю", "stats.1.val": "30+", "stats.1.lbl": "Уникальных достижений", "stats.2.val": "7+", "stats.2.lbl": "Уровней для открытия", "stats.3.val": "7", "stats.3.lbl": "Вариаций отжиманий", "stats.4.val": "5.0★", "stats.4.lbl": "Рейтинг App Store", "reviews.label": "Отзывы", "reviews.title": "Атлеты любят Obsid", "review1.text": "«С трудом делал 10 отжиманий, теперь легко выполняю 80. Система уровней заставляет возвращаться каждый день.»", "review1.meta": "УРОВЕНЬ 7 · ЧЕМПИОН", "review2.text": "«Лучшее приложение без оборудования. Календарь серий — жёсткий в лучшем смысле — я не пропустил ни дня за 3 месяца.»", "review2.meta": "УРОВЕНЬ 5 · ВОИН", "review3.text": "«Наконец-то приложение, которое уважает труд. Простое, сфокусированное, а система достижений — огонь. С IRON до ELITE за 8 недель.»", "review3.meta": "УРОВЕНЬ 8 · ЭЛИТА", "cta.title": "Начни сегодня.
Первое повторение бесплатно.", "cta.sub": "Нет зала. Нет оправданий. Просто отжимайся.", "footer.desc": "Приложение для тренировки отжиманий. Строй силу, отслеживай прогресс, прокачивай уровень.", "footer.product": "Продукт", "footer.support": "Поддержка", "footer.getapp": "Скачать", "footer.features": "Функции", "footer.health": "Интеграция здоровья", "footer.levels": "Уровни", "footer.download": "Скачать", "footer.faq": "Помощь и FAQ", "footer.privacy": "Политика конфиденциальности", "footer.terms": "Условия использования", "footer.contact": "Связаться с нами", "footer.ios": "App Store (iOS)", "footer.android": "Google Play (Android)", "footer.copy": "© Матвей Гуральский", "footer.privacyterms": "Конфиденциальность и условия", "faq.eyebrow": "Центр помощи", "faq.title": "Помощь и FAQ", "faq.sub": "Ответы на самые частые вопросы об Obsid.", "faq.search": "Поиск по вопросам…", "faq.cat.all": "Все", "faq.cat.start": "Начало работы", "faq.cat.workouts": "Тренировки", "faq.cat.health": "Интеграция здоровья", "faq.cat.account": "Аккаунт", "faq.cat.billing": "Оплата", "faq.contact.title": "Напишите нам", "faq.contact.sub": "Обычно отвечаем в течение 24 часов.", "faq.noresults": "Ничего не найдено. Попробуйте другой запрос.", "faq.stillneed": "Остались вопросы?", "privacy.eyebrow": "Документы", "privacy.title": "Политика конфиденциальности", "privacy.meta": "Обновлено: 4 мая 2026", "terms.eyebrow": "Документы", "terms.title": "Условия использования", "terms.meta": "Обновлено: 4 мая 2026", } }; function getLang() { return localStorage.getItem('obsid-lang') || 'en'; } function setLang(lang) { localStorage.setItem('obsid-lang', lang); applyLang(lang); updateLangBtns(lang); } function applyLang(lang) { const t = OBSID_TRANSLATIONS[lang] || OBSID_TRANSLATIONS.en; document.querySelectorAll('[data-i18n]').forEach(el => { const key = el.getAttribute('data-i18n'); if (t[key] !== undefined) el.innerHTML = t[key]; }); document.querySelectorAll('[data-i18n-placeholder]').forEach(el => { const key = el.getAttribute('data-i18n-placeholder'); if (t[key] !== undefined) el.placeholder = t[key]; }); document.documentElement.lang = lang; } function updateLangBtns(lang) { document.querySelectorAll('.lang-btn').forEach(btn => { btn.classList.toggle('active', btn.dataset.lang === lang); }); } const LANGUAGES = [ { code: 'en', label: 'English' }, { code: 'ru', label: 'Русский' }, ]; function createLangSwitcher() { const wrap = document.createElement('div'); wrap.className = 'lang-switcher'; function render(lang) { const cur = LANGUAGES.find(l => l.code === lang) || LANGUAGES[0]; wrap.innerHTML = ` `; const btn = wrap.querySelector('.lang-current'); const dropdown = wrap.querySelector('.lang-dropdown'); btn.addEventListener('click', (e) => { e.stopPropagation(); const open = dropdown.style.display !== 'none'; dropdown.style.display = open ? 'none' : 'block'; btn.setAttribute('aria-expanded', !open); wrap.classList.toggle('open', !open); }); wrap.querySelectorAll('.lang-option').forEach(opt => { opt.addEventListener('click', () => { setLang(opt.dataset.lang); dropdown.style.display = 'none'; wrap.classList.remove('open'); render(opt.dataset.lang); }); }); document.addEventListener('click', () => { dropdown.style.display = 'none'; wrap.classList.remove('open'); }, { once: true }); } render(getLang()); return wrap; } document.addEventListener('DOMContentLoaded', () => { const navRight = document.querySelector('.nav-right, .nav-right-sub'); if (navRight) { const sw = createLangSwitcher(); navRight.prepend(sw); } applyLang(getLang()); updateLangBtns(getLang()); });