跳到正文
DEV Community· Mohammad·· 3 小時前AI 評分44

Google 將 28% 搜尋曝光列為翻譯結果:2027 年 English、Hindi 與 Hinglish 的 hreflang 設定

Google Was Translating 28% of Our Search Impressions: hreflang for English, Hindi and Hinglish in 2027

AI 導讀

FRQ 的 Search Console 數據顯示,28% 的搜尋曝光屬於 Google 翻譯結果,點擊率為 0.52%,低於其他結果的 1.53%。FRQ 計劃為表現較好的指南建立 Hinglish 頁面,並在其後加入天城文版本;目前 Hinglish 頁面使用 hi-IN,待天城文版本推出後再測試 hi-Latn。上線 28 天後,團隊會檢查翻譯結果曝光佔比及相關搜尋的點擊率變化。

正文

(I help out with FRQ.)

FRQ is a small hyperlocal marketplace: shoppers find clothing shops near them, and shop owners list for free. Its audience writes in three ways: English, Hindi in Devanagari, and Hinglish (Hindi typed in Latin letters, like "shopping kab kare"). Until now the site only had English pages.

The Search Console export for 26 Sep – 27 Oct 2026 showed what that costs. This post walks through the numbers, the pandas code that found them, and the hreflang setup we are shipping for the 2027 season. It is a plan with a measurement attached, not a success story yet.

1. The number that started it

Search Console → Performance → Search appearance has a row called Translated results. Google shows it when it machine-translates your title and snippet into the searcher's language because it found nothing good in that language.

Segment Impressions Clicks CTR Avg. position
All searches 6,886 86 1.25% ~7.6
Translated results 1,927 (28%) 10 0.52% 7.72
Everything else 4,959 76 1.53% –

Same position, about a third of the click-through rate. Over a quarter of the site's visibility was going to people who saw a translated snippet of an English page and mostly didn't click.

2. Reading it with pandas

The export is one .xlsx with one sheet per report.

import pandas as pd

x = pd.ExcelFile("search_console_export.xlsx")
appearance = x.parse("Search appearance")
chart = x.parse("Chart")

total_impr = chart["Impressions"].sum()
total_clicks = chart["Clicks"].sum()

tr = appearance[appearance["Search Appearance"] == "Translated results"].iloc[0]
rest_impr = total_impr - tr["Impressions"]
rest_clicks = total_clicks - tr["Clicks"]

print(f"translated share: {tr['Impressions'] / total_impr:.0%}")
print(f"translated CTR:   {tr['Clicks'] / tr['Impressions']:.2%}")
print(f"other CTR:        {rest_clicks / rest_impr:.2%}")
translated share: 28%
translated CTR:   0.52%
other CTR:        1.53%

3. Splitting queries by script

The Queries sheet only lists queries Google is willing to show (here 333 queries covering 2,340 of the 6,886 impressions; the rest are anonymized). Even that slice shows the three audiences.

import re

q = x.parse("Queries")
q.columns = ["query", "clicks", "impressions", "ctr", "position"]

DEVANAGARI = re.compile(r"[\u0900-\u097F]")
# a small, hand-made list of Hindi function words typed in Latin letters
HINGLISH = re.compile(
    r"\b(kab|kya|kaise|kitne|ki|ke|kare|karen|kahan|par|aur|wala|mein|hai|hain|kharide|kapde|dukan)\b"
)

def script(s: str) -> str:
    if DEVANAGARI.search(s):
        return "hindi_devanagari"
    if HINGLISH.search(s):
        return "hinglish"
    return "english_or_brand"

q["script"] = q["query"].map(script)
print(q.groupby("script")[["impressions", "clicks"]].sum())
Script Queries Impressions Clicks
Hinglish (word-list heuristic) 71 629 3
Hindi (Devanagari) 22 130 1
English / brand / product 240 1,581 17

The word list is crude (it will miss some Hinglish and could catch an odd English query), but the shape is clear: a real share of searchers type in Hindi or Hinglish, and almost none of them click an English page. Queries like "karwa chauth ki shopping kab kare" sat around position 6–9 with zero clicks.

4. The hreflang setup

The fix we are shipping: publish real Hinglish (and later Devanagari) versions of the guides that win, as separate URLs, and tell Google they are alternates of each other.

Each page in a set lists every version, including itself:

<!-- on BOTH pages -->
<link rel="canonical" href="https://frq.in/blog/guide-en">  <!-- each page canonicals to ITSELF -->
<link rel="alternate" hreflang="en-IN" href="https://frq.in/blog/guide-en">
<link rel="alternate" hreflang="hi-IN" href="https://frq.in/blog/guide-hinglish">
<link rel="alternate" hreflang="x-default" href="https://frq.in/blog/guide-en">

Or in the sitemap, which is easier to keep consistent on a growing blog:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <url>
    <loc>https://frq.in/blog/guide-en</loc>
    <xhtml:link rel="alternate" hreflang="en-IN" href="https://frq.in/blog/guide-en"/>
    <xhtml:link rel="alternate" hreflang="hi-IN" href="https://frq.in/blog/guide-hinglish"/>
  </url>
  <url>
    <loc>https://frq.in/blog/guide-hinglish</loc>
    <xhtml:link rel="alternate" hreflang="en-IN" href="https://frq.in/blog/guide-en"/>
    <xhtml:link rel="alternate" hreflang="hi-IN" href="https://frq.in/blog/guide-hinglish"/>
  </url>
</urlset>

Rules that bite small sites:

  1. Return links. If page A points to B but B does not point back, Google ignores the pair.
  2. Canonical to self. A Hinglish page that canonicals to the English page tells Google "ignore me".
  3. No auto-redirect by location or browser language. Googlebot mostly crawls from one place; let people choose.
  4. Translate the whole page, not just the title. A Hinglish H1 on English body text is the same thin page.

5. Which code is "Hinglish"?

There is no ISO language code for Hinglish. Google's hreflang documentation allows a script subtag from ISO 15924 (its examples are zh-Hant and zh-Hans), so hi-Latn (Hindi, Latin script) is valid syntax. What I could not find is any statement that Google groups Hinglish searches under it.

So for now: Hinglish pages get hi-IN, because the queries are Hindi words and there is no Devanagari page competing for that slot yet. When a Devanagari version exists, the plan is hi-IN for Devanagari and a test of hi-Latn for Hinglish on a few pages. That is a judgment call, and the export will tell us if it was wrong.

6. A ten-line checker

Return links break quietly when someone edits one page. This runs in CI or by hand:

import re, requests

def alternates(url):
    html = requests.get(url, timeout=20).text
    return dict(re.findall(r'hreflang="([^"]+)"\s+href="([^"]+)"', html))

def check(urls):
    for u in urls:
        for lang, alt in alternates(u).items():
            if alt != u and u not in alternates(alt).values():
                print(f"missing return link: {alt} does not point back to {u} ({lang})")

check(["https://frq.in/blog/guide-en", "https://frq.in/blog/guide-hinglish"])

(The regex assumes hreflang comes before href in the tag; use an HTML parser if your templates vary.)

7. How we will know

Same export, 28 days after the first pairs go live, three numbers:

  • Translated results share of impressions (now 28%): should fall if Google starts showing the Hinglish page instead of translating the English one.
  • CTR on Hinglish and Devanagari queries (now 4 clicks on 759 impressions): should rise.
  • CTR on "everything else" (now 1.53%): should not drop. If it does, the alternates are cannibalising.

If the first number does not move, hreflang was not the bottleneck and the next suspect is the pages themselves. Either way the 2027 festival calendar (Karwa Chauth, Diwali, the wedding season) gets written in the language people actually search in.

If you run a site for a bilingual audience, I'd like to hear what you saw. FRQ itself is at frq.in; shoppers can browse nearby shops at market.frq.in, and clothing shop owners can list for free at shop.frq.in.

(I help out with FRQ.)

來源:DEV Community · dev.to