Мовну версію сайту зазвичай перевіряють так: відкривають головну, перемикають мову, бачать перекладений текст і закривають вкладку. Перевірка пройдена. Насправді вона щойно не відбулася — бо найважливіше починається з другого кліку.
Першого вересня 2026 ми розбирали власний сайт після питання, яке звучало просто: чому з російської сторінки послуги посилання ведуть на українські адреси. Відповідь виявилась довшою за питання. Причин було п'ять, вони лежали в різних місцях коду, і жодна з них не була видима на першому екрані.
Як це бачить читач
Візьмімо російську сторінку послуги. Угорі стандартні хлібні крихти:
Главная → Razrabotka → Internet magaziny → сторінка
Два дефекти в трьох словах. По-перше, назва зібрана з латинського сегмента адреси замість слова «Разработка» — виглядає як машинний недогляд, і це саме він. По-друге, і це гірше, посилання веде на адресу без мовного префікса. Такої сторінки не існує: сервер віддає 404.
Тобто читач, який дійшов до потрібної сторінки й вирішив піднятися на рівень вище — до всієї категорії послуг, — потрапляв у порожнечу. На кожній із 237 опублікованих сторінок послуг, у двох мовних версіях кожна.
Далі в тілі сторінки: блок «читайте також», картки суміжних послуг, кнопка з переходом у портфоліо, підсвічені терміни в тексті. Ми порахували на одній сторінці — 12 посилань, усі 12 вели на українські адреси. Читач, який прийшов на російську версію й почав ходити по сайту, після першого ж кліку опинявся в українській і більше з неї не виходив.
Чому цього роками не видно
Тут працює одразу три речі.
Ніщо не ламається. Посилання на чужу мову — це робоче посилання. Сторінка відкривається, віддає 200, виглядає нормально. Моніторинг мовчить, помилок у консолі немає, автотест на биті посилання проходить.
Розробник перевіряє основною мовою. Українською все правильно — бо саме ця мова й є основою, з якої будувалися адреси. Дефект вмикається лише тоді, коли в адресі з'являється префікс.
Аналітика показує норму. Люди ходять по сайту, сторінки переглядаються. Те, що російськомовний відвідувач за два кліки опинився в українському розділі, у звітах не позначається ніяк — це той самий сайт, ті самі перегляди.
П'ять причин одного симптому
Що саме ми знайшли, коли пішли по коду.
Крихти брали сегменти з адреси як є. На сторінці /ru/razrabotka/... перший сегмент — razrabotka, і код чесно будував із нього посилання /razrabotka. Українська адреса — /rozrobka, тому виходило 404. Той самий рядок ішов у назву кнопки: мапа перекладів ключована українськими слагами, razrabotka там не знаходився, і назва збиралася зі слага з великої літери.
Дерево послуг перекладало адресу, але не додавало префікс. Тут було майже правильно: слаг перекладався, internet-magaziny замість internet-magazyny. Не вистачало /ru на початку — і посилання йшло на редирект замість цільової сторінки.
Картки списків брали українську адресу свідомо. У коді стояло звернення до поля з українським слагом — не помилка набору, а рішення, ухвалене колись для одномовного сайту й пережите ним.
Блок «читайте також» не отримував перекладених адрес узагалі. Найпідступніше з усіх п'яти: логіка була вже виправлена, але вибірка з бази не включала колонку з локалізованими слагами. Код запитував переклад, отримував порожнечу й чесно відкочувався на українську адресу. Після виправлення інших місць саме тут змінилось лише п'ять посилань із чотирнадцяти — і це був єдиний натяк, що щось лишилось.
Автоматична підсвітка термінів була одномовною. Механізм, який знаходить у тексті назви технологій і робить із них посилання, зберігає українські адреси цілей. На російській сторінці слово «OpenCart» вело в український розділ.
Окремим пунктом — hreflang. На хабах категорій він оголошував адреси, які самі віддають редирект. Тобто пошуковій системі повідомлялось: «англійська версія цієї сторінки лежить ось тут», а за тією адресою стояло перенаправлення на іншу. Google це переживе, але сигнал зіпсований, і в документації прямо сказано, що вказувати треба кінцеву адресу.
Що це означає для пошуку
Без перебільшень. Це не історія про втрачені позиції — про позиції взагалі чесно говорити не можна, і жодна цифра тут не буде доказовою.
Механізм інший і простіший. Пошукова система оцінює мовну версію передусім за тим, чи вона самодостатня: чи є в неї власні внутрішні посилання, чи можна нею ходити, не вивалюючись в іншу мову. Коли кожен вихід із російської сторінки веде в українську, робот отримує рівно те, що бачить читач — глухий кут. Сторінки другої мови стають листям без гілок.
Друга частина ціни — обхід. Посилання на адресу, що редиректить, з'їдає запит робота даремно. Посилання в 404 — тим паче. На сайті з двома-трьома сторінками це не має значення. На кількох сотнях це вже помітна частка обходу, витрачена ні на що.
Третя, найпростіша: читач. Людина, яка обрала мову, і за два кліки читає іншу, робить очевидний висновок про сайт.
Як перевірити це в себе за пів години
Метод, який спрацював у нас, свідомо примітивний: він дивиться на готовий HTML і нічого не знає про наміри коду. Саме тому він тричі показав нам, що «виправлено» насправді означало «майже».
Берете адресу з мовним префіксом і рахуєте посилання, у яких цього префікса немає:
curl -s https://ваш-сайт.com/ru/якась-сторінка \
| grep -o 'href="/[^"]*"' \
| grep -v 'href="/ru' \
| sort -u
У виводі буде три види адрес.
Перший — те, що там і має бути: перемикач мов, файли, зовнішні ресурси. Перемикач мов зобов'язаний вести на інші мови, це його робота. Ми на цьому спіткнулися: перший прогін показав дефекти на всіх типах сторінок, і половина «дефектів» виявилась перемикачем. Відрізняти його треба за атрибутом hreflang у тому ж тезі.
Другий — сторінки, які мовної версії не мають узагалі. У нас це сім форм-опитувальників для клієнтів. Додати їм префікс означало б відправити людину в 404, тому вони лишилися українськими свідомо, і це нормальне рішення, а не недогляд.
Третій — власне дефекти.
Повторіть це для кожного типу сторінки, а не для кожної сторінки: головна, розділ, підрозділ, картка, список, стаття, форма. Типів зазвичай десяток-півтора, і кожен зроблений окремим шаблоном, тому дефект в одному нічого не каже про інший. У нас із тринадцяти типів чистими виявились шість — але дізналися ми це лише тому, що перевірили всі тринадцять.
Окремо перевірте крихти — це найдешевша перевірка з усіх:
curl -s -o /dev/null -w "%{http_code}\n" https://ваш-сайт.com/адреса-з-крихти
І hreflang — кожна оголошена адреса має віддавати 200, а не 301 чи 308:
curl -s https://ваш-сайт.com/сторінка | grep -o 'hreflang="[^"]*" href="[^"]*"'
Що вийшло
До початку роботи: 224 різні адреси, на які вели посилання з мовних версій у чужу мову. Після: сім, і всі сім — ті самі форми без перекладу.
Одинадцять типів сторінок із тринадцяти стали повністю чистими. Крихти віддають 200 замість 404 і пишуться словами мови сторінки. hreflang веде на кінцеві адреси.
Цифри навмисно про роботу, а не про результат. Що з цього вийде в пошуку — буде видно за кілька тижнів у Search Console, і саме там ми будемо дивитися. Обіцяти зростання під таку правку не можна: вона прибирає втрату, а не додає попиту.
Чесні межі
Це не робота, яку варто починати, якщо мовна версія у вас формальна — перекладена машинно й нікому не потрібна. Тоді дешевше її прибрати, ніж лікувати перелінковку.
Це також не дає нічого одномовному сайту. І не замінює перекладу: сторінка, яка з'єднана правильно, але написана чужою мовою, лишається чужою.
І головне, чого ця перевірка не робить: вона не пояснює, чому дефект з'явився. У нас п'ять причин лежали в п'яти різних файлах, написаних у різний час різними руками. Знайти їх допоміг не аудит коду, а тупий перебір готового HTML — і саме його ми лишили в проєкті як постійну перевірку після кожної зміни в навігації.
Якщо у вас є мовні версії й ви ніколи не перевіряли їх з другого кліку — почніть із команди вище. На неї потрібно менше часу, ніж на читання цієї статті.




