Skip to content
Barcha maqolalar
SEO7 daq

Uch tilli sayt: hreflang bilan o‘zimiz qilgan xatolar

Toshkentda qiladigan deyarli har bir saytimiz birdaniga ikki-uch tilda bo‘ladi. Shu yillar ichida «til almashtirgichni qo‘shish» va «Google kerakli odamga kerakli versiyani ko‘rsatishi» orasidagi barcha tuzoqlarga tushib ko‘rganman shekilli. Ularni bir joyga yig‘dim, hozir qanday qilayotganimiz bilan birga.

Shahzodjon JumakulovFrontend dasturchi

Bir kuni mijoz menga Telegram’dan skrinshot yubordi. U saytining havolasini ish chatiga tashlagan, havola ostidagi prevyu esa inglizcha chiqqan. Sayt rus tilida, auditoriya rusiyzabon, inglizcha versiya esa «har ehtimolga qarshi» qilingan. U nima buzilganini so‘radi.

Buzilgan narsa — bir vaqtlar o‘zim qulay funksiya deb hisoblagan narsa edi. Shu voqeadan boshlayman.

Birinchi xato: tilni brauzerga qarab aniqlash

Bu Nuxt 3’dagi Legal Alliance sayti edi. @nuxtjs/i18n moduli Accept-Language sarlavhasiga qarab, tashrif buyuruvchini «uning» tiliga yo‘naltira oladi. G‘amxo‘rlikdek eshitiladi. Amalda esa sayt ildizi ba’zi tashrif buyuruvchilar uchun /en yoki /uz ga ketib qolardi.

Telegram havola prevyusini tuzayotganda o‘zining til sarlavhasi bilan keladi. Qidiruv robotlari ham. Rus tilidagi kampaniyadan kelgan reklama bosishi, odamning brauzeri o‘zbek tilida bo‘lgani uchun, o‘zbekcha versiyaga tushib qolishi mumkin edi.

Biz detectBrowserLanguage ni o‘chirib qo‘ydik va bitta qoida qoldirdik: til faqat manzil orqali aniqlanadi. / — rus tili, /uz — o‘zbek tili, /en — ingliz tili. Boshqa til kerakmi, almashtirgichni bosing.

Har bir loyihada chiqadigan ikkinchi savol: URL’da prefiks umuman kerakmi yoki tilni cookie’da saqlab, hammasini bitta manzilda ko‘rsatsa bo‘ladimi. Legal Alliance konfiguratsiyasida hali ham strategy: "no_prefix" degan izohga olingan qator turibdi. Bu biz noto‘g‘ri variantni deyarli tanlab qo‘yganimizga yodgorlik.

Afzalliklari
  • +Google har bir til versiyasini ko‘radi va indeksatsiya qiladi
  • +Havolani yuborish mumkin, qabul qiluvchi o‘sha tilni ko‘radi
  • +Har bir til uchun hreflang, sitemap va reklamani sozlash mumkin
  • +Analitika trafikni tillar bo‘yicha o‘zi ajratadi
Kamchiliklari
  • −Qidiruv tizimi faqat bitta versiyani, odatda standart tilni ko‘radi
  • −Bitta manzilda turli tildagi ikki sahifa, keshlash buziladi
  • −Telegram’dagi havola prevyusi doim bitta tilda
  • −Biror narsani tuzatish uchun serverda «qo‘ltiqtayoq»lar kerak

Bizning xulosamiz aniq: har bir til versiyasiga o‘z manzili. «Standart til prefikssiz, qolganlari prefiks bilan» varianti yaxshi ishlaydi. Next.js’da bu next-intl’dagi localePrefix: 'as-needed', Nuxt’da shunga o‘xshash prefix_except_default strategiyasi.

Biz qoqilgan bitta jihat: agar strategiyangizda standart til ham prefiks bilan, ham prefikssiz ochilsa (/uz/blog va /blog bir vaqtda), bu dublikat. Bittasini tanlang, ikkinchisini yo‘naltiring.

hreflang: deyarli hamma xato yozadigan uch qator

hreflang qidiruv tizimiga aytadi: mana bu sahifa rus tilida, uning o‘zbekcha nusxasi esa falon joyda. Usiz Google ba’zan o‘zbek tilida qidirgan odamga ruscha sahifani ko‘rsatadi yoki versiyalarni dublikat deb hisoblaydi.

Excellent Printda canonical va hreflang jismonan bir-biridan ajralib keta olmasligi uchun hammasini bitta funksiyaga yig‘dik:

export function alternatesFor(locale: string, path = '/') {
  const languages: Record<string, string> = {};
  for (const l of LOCALES) languages[l] = canonicalUrl(l, path);
  languages['x-default'] = canonicalUrl(DEFAULT_LOCALE, path);
  return { canonical: canonicalUrl(locale, path), languages };
}

Zerikarli ko‘rinadi, lekin bu yerdagi har bir qator boshqalarning va o‘zimizning saytlarimizda ko‘rgan aniq bir xatoni yopadi:

  • O‘ziga havola yo‘q. Ruscha sahifa alternates ro‘yxatida o‘ziga ham ishora qilishi kerak. Ko‘pchilik faqat «boshqa» tillarni yozadi.
  • Qaytar havola yo‘q. Agar ruscha sahifa o‘zbekchaga ishora qilsa-yu, o‘zbekcha ruschaga ishora qilmasa, Google bu juftlikni e’tiborsiz qoldiradi.
  • canonical va hreflang bahslashadi. Kanonik manzil oxirida slesh bilan, hreflang’da esa slesh yo‘q. Qidiruv tizimi uchun bular turli manzillar. Hatto <head>dagi canonical va sitemap’dagi <loc> baytma-bayt mos kelishi uchun yalang‘och domendagi sleshni ham olib tashladik.
  • Unutilgan x-default. U tili hech bir versiyaga to‘g‘ri kelmaydiganlarga qaysi versiyani ko‘rsatishni bildiradi.

Sluglar ham tarjima qilinadi

Uzoq vaqt shunday qilardim: sahifa manzili barcha tillar uchun inglizcha, faqat mazmuni tarjima qilinadi. /uz/products/corrugated-boxes. Ishlaydi, lekin o‘zbek tilidagi foydalanuvchi qidiruv natijalarida begona tildagi manzilni ko‘radi, manzilda esa qidiruv tizimi biror narsani tushunadigan so‘zlar ham bor.

Excellent Print’da mahsulot sluglari tarjima qilingan. Ruscha sahifa /products/gofrotara manzilida, inglizchasi /en/products/corrugated-boxes manzilida yashaydi va bu bitta sahifa. Sayt next-intl bilan Next.js 15’da, admin panel Laravel va Filament’da, slugni menejer har bir til uchun to‘ldiradi.

Bu yechimning narxi bor. Sitemap’ni endi tillar bo‘yicha oddiy sikl bilan yig‘ib bo‘lmaydi: har bir tilda mahsulotlar haqida API’dan so‘rash, ularni id bo‘yicha moslashtirish va shundan keyingina manzillar juftligini yozish kerak. Yana bir narsada kuyib qoldik: sitemap avval Docker-obraz yig‘ilayotganda tuzilardi, API esa o‘sha paytda ishlamaydi. Natijada birorta ham mahsulotsiz sitemap chiqardi va buni hech kim sezmasdi. Endi u so‘rov bo‘yicha tuziladi va bir soatga keshlanadi.

Tarjima qilingan sluglar hammaga kerakligiga ishonchim yo‘q. 30 ta maqolali blog inglizcha manzillar bilan ham yashay oladi. O‘zbek tilida qidiriladigan katalog uchun esa tarjima qilingan sluglarni qilardim.

Lotin va kirill — sayt uchun ikki xil til

O‘zbek tilida dunyoning deyarli hech bir joyida uchramaydigan qo‘shimcha qatlam bor. Biz islom moliyasi bo‘yicha o‘quv markazi Mezon Ta'lim uchun sayt va lending qildik, u yerda o‘zbek tili ikki yozuvda: lotin va kirill, ustiga rus tili.

9:41mezon-talim.uzMezon Ta'lim lendingi telefonda
Mezon Ta'lim: lotin versiyasi sayt ildizida, kirill versiyasi /uz ostida

Nimaga qaror qildik:

  • Lotin yozuvi sayt ildizida, kirill /uz ostida yashaydi. hreflang’da yozuv ko‘rsatilgan kodlarni beramiz: uz-Latn va uz-Cyrl. Ikkala versiya uchun shunchaki uz butun mantiqni buzadi.
  • Kirill uchun matnlar avtomatik transliteratsiya emas, alohida lug‘at sifatida yuritiladi. Avtotranslit o‘ va g‘ harflarida, atoqli otlarda va ruscha o‘zlashmalarda xato qiladi.
  • O‘z xatomni tan olaman: bizda <html lang> atributi uzoq vaqt ikkala versiyada bir xil uz bo‘lib turdi. Auditda ushladik. Ekran o‘quvchilar va brauzer tarjimoni aynan unga qaraydi.

Aytgancha, /uz yo‘li lotin uchun emas, kirill uchun bo‘lgani jamoamizda bahsga sabab bo‘ldi. Hali ham /cyrl tushunarliroq bo‘lardi deb hisoblayman. Lekin tarixan kirill versiyasiga havolalar allaqachon tarqatilgan edi va ularni buzmadik.

Mashina tarjimasi: qayerda mumkin, qayerda yo‘q

Biz qoralamalar uchun mashina tarjimasi va neyrotarmoqlardan foydalanamiz. Lekin ona tili sohibi tekshirmasdan nashr qilish mumkin emas. Bizda bu odatda shunday taqsimlanadi:

Nimani tarjima qilamiz Mashina bilan mumkinmi? Izoh
Interfeys: tugmalar, formalar, xatolar qoralama ha, yakuniy yo‘q qisqa iboralarni mashina eng ko‘p buzadi
Yuridik matnlar, xizmatlar yo‘q atamadagi xato tarjimadan qimmatroq tushadi
Blog va yangiliklar qoralama ha keyin muharrir so‘rovlarga moslab qayta yozadi
Meta-teglar, title, description yo‘q ular har bir tilning qidiruv so‘rovlari uchun alohida yoziladi

Oxirgi band SEO uchun eng muhimi. Ruschadan tarjima qilingan o‘zbekcha title deyarli hech qachon odamlar o‘zbek tilida haqiqatda qanday qidirishiga mos kelmaydi. Uch tildagi so‘rovlar haqida Azamat O‘zbekistondagi sayt uchun SEO haqidagi maqolada batafsil yozgan.

Ishga tushirishdan oldin o‘tadigan chek-listimiz

  • Har bir til versiyasining o‘z URL’i bor, til cookie va brauzerga bog‘liq emas
  • Sayt ildizi Accept-Language bo‘yicha redirekt qilmaydi
  • hreflang’da sahifaning o‘ziga, barcha tarjimalarga va x-default ga havola bor
  • canonical va hreflang oxiridagi sleshgacha mos keladi
  • O‘zbek tili uchun yozuv ko‘rsatilgan: uz-Latn / uz-Cyrl
  • <html lang> sahifa tili bilan birga o‘zgaradi
  • Sitemap’da har bir sahifa uchun uning barcha til versiyalari sanab o‘tilgan
  • Sitemap obraz yig‘ilayotganda emas, jonli ma’lumotlar bilan tuziladi
  • Title va description tarjima qilinmagan, har bir til so‘rovlari uchun yozilgan
  • Til almashtirgich bosh sahifaga emas, o‘sha sahifaga olib boradi

Oxirgi band mayda narsadek tuyuladi, lekin uni har ikkinchi saytda buzilgan holda ko‘ramiz. Odam maqola o‘qiyapti, rus tiliga o‘tkazadi va bosh sahifada paydo bo‘ladi.

Agar bir necha tilli sayt rejalashtirayotgan bo‘lsangiz, buni birinchi kundan arxitekturaga qo‘shing. Qidiruvda o‘rin to‘plagan jonli saytda manzillarni qayta qilish og‘riqli va qimmat. Biz bu bilan sayt yaratish doirasida shug‘ullanamiz va agar ko‘p tillilik haqida boshidan o‘ylansa, u muddatga o‘ylagandek ko‘p vaqt qo‘shmaydi.

Vazifa bormi? Yozing — muhokama qilamiz.

Telegram’da to‘g‘ridan-to‘g‘ri studiya asoschisiga yozing. Nima kerakligini ikki og‘iz so‘z bilan ayting — savollar va taxminiy baho bilan javob beramiz.