Hreflang 生成工具並不會驗證搜尋引擎所辨識的每一個語言代碼;它只驗證語言標籤的結構形狀、大小寫,以及組合規則,至於註冊表涵蓋範圍與內容契合度,則交由發布者自行處理。這項區別很重要,因為即便工具所產生的標籤是格式完全正確的 HTML,仍可能指向一個不受支援、已棄用,或與目標受眾不符的地區設定。該工具會呼叫 Intl.getCanonicalLocales 來標準化大小寫,在正規化之後以不區分大小寫的方式拒絕重複的地區值,並將 x-default 視為一組回退代號,而非一個語言。它接受一個兩字母的語言代碼、一個選擇性的四字母文字代碼,以及一個選擇性的兩字母地區代碼,但本身從來不會去查詢像是 ISO 639 的註冊表,或任何搜尋引擎現行的地區代碼表,以確認某個代碼確實有被提供服務。最後這一層——註冊表支援加上受眾契合度——屬於發布者的工作,這也是為什麼該工具自己關於支援代碼的 FAQ 條目會直接回答「不,請另外自行查證」。在你端自行交叉比對之後,生成工具的結構檢查通常便足以讓你的 hreflang 集合保持整齊、內部一致,並準備好貼到每一個在地化頁面的 head 之中。

does hreflang generator validate every supported language code
Hreflang 生成工具會驗證每一個語言代碼嗎?

形狀與大小寫:生成工具的驗證層

就核心而言,Hreflang 生成工具會對你貼上的每一列地區資料執行六類結構檢查。了解這些檢查,將有助於說明輸出結果中哪些正確性可以信任,而哪些仍須由你端自行查證。

首先,它會以一個保守的 BCP 47 形狀來測試語言標籤:由一個兩字母的語言子標籤、一個選擇性的四字母文字子標籤,以及一個選擇性的兩字母地區子標籤組成。像 US 或 CA 這樣的國家代碼無法單獨佔據第一個位置;最前面的子標籤必須永遠代表一種語言,而地區的指定則接在後面(例如 fr-CA)。像 fr 這類通用語言的列項,在存在多種國家版本的法文時,仍然可以作為回退形式而保持有效。

其次,它會透過 Intl.getCanonicalLocales 來標準化大小寫,這代表 en-us 會變成 en-US,而 zh-hant 則會變成 zh-Hant。這與瀏覽器解讀 accept-language 信號的方式一致,因此你的 head 標籤會與爬蟲在 HTTP 請求中所預期的大小寫保持對齊。

第三,重複的地區值會在正規化之後以不區分大小寫的方式被拒絕。僅在大寫上有所差異的兩列(例如 en-US 與 en-us)會塌縮為同一個標準化形式,並被回報為同一筆衝突,迫使你必須移除重複項目,而不是推出兩條描述相同目標的紀錄。

第四,x-default 會被明確當作回退代號處理,而非一種語言。每一組中只允許一列 x-default,該值絕不會被改寫、不會被轉成小寫,也不會與文字或地區子標籤配對。它指向的頁面,是用於服務那些設定無法對應到任何其他替代版本的訪客,例如國家選擇器或通用登陸頁面。

第五,每個 URL 都會經過瀏覽器的 URL 解析器進行標準化:片段會被移除,認證資訊會被拒絕,只有具備明確主機的完整 HTTP 或 HTTPS 網址能通過輸入階段。像 //example.com/en/ 這類協定相對路徑,以及像 /en/about 這類相對路徑,都會被直接拒絕;任何含有 user:pass@ 或 #fragment 尾端的 URL 也同樣會被拒絕。

第六,產生的 HTML 中對屬性敏感的字元會被跳脫處理,使得該區塊在貼入 head 元素時能乾淨地解析。URL 中的 & 會變成 &,而屬性值內部的引號則會以實體編碼,這正是工具的測試會在 locale 與 URL 規則之外,另行斷言 HTML 跳脫結果的原因。

生成工具不會替你檢查的部分

同樣重要的是,生成工具並不會假裝能做到以下這些事。它不會去查詢語言的標準 ISO 清單,不會去查詢 Google 或 Bing 現行的「支援語言」說明文件,也不會連線到你的網站去抓取任何即時頁面。該工具的 FAQ 條目對此說得很直接:

「不會。它只驗證保守的標籤形狀與大小寫;註冊表支援與內容對象的驗證,請分別自行處理。」

驗證步驟之外,仍有三層意涵完全不在其涵蓋範圍內:

  • 註冊表涵蓋範圍。各家搜尋引擎都維護著自己持續演進的支援語言與地區代碼清單。BCP 47 文法所能接受的代碼數量,遠多於任何單一搜尋引擎實際提供服務的數量,因此工具所接受的標籤,仍可能是未被使用、已遭棄用,或不存在於特定引擎地區表中的項目。
  • 受眾契合度。標籤能告訴爬蟲該頁面是為哪些使用者設計,但頁面本身必須以該受眾為對象來撰寫、翻譯並組織結構。一個指向葡萄牙本土內容的 pt-BR 標籤,看起來可能結構完美,卻同時存在受眾錯配的問題。
  • 即時等價性。生成工具無法證明兩個 URL 確實承載等價的內容,也無法證明替代頁面會回傳 200 狀態。雙向驗證與抓取時的檢查,屬於部署階段的工作,而非生成工具的工作。

生成工具強制執行的標籤形狀規則

生成工具中與標準對齊的測試資料,能整齊地對應到常見的真實地區形式。下方表格整理了每個模式、會觸發該模式的輸入列、標準化的輸出,以及結構檢查無法替你抓到的最常見陷阱。

地區形式輸入列範例標準化輸出子標籤其目標對象最常見的陷阱
通用語言fr | https://example.com/fr/fr不論國籍的所有法語使用者在集合中已存在國家版本的法文時,仍選用通用標籤
語言加地區en-us | https://example.com/en-us/en-US大小寫修正後,指美國的英文手動將 head 標籤中的 US 改為小寫,會破壞標準形式
文字子標籤zh-hant | https://example.com/zh-hant/zh-Hant繁體中文字元將 zh-Hant 與簡體中文頁面混用
語言—文字—地區sr-latn-rs | https://example.com/sr-latn-rs/sr-Latn-RS以拉丁字母書寫、塞爾維亞地區的塞爾維亞語為西里爾字母的受眾選錯了文字子標籤
回退代號x-default | https://example.com/x-default設定無法對應到其他替代版本的訪客誤將 x-default 作為第二種語言加入

上表中每一列都代表生成工具會接受的形狀。從這些列項之中,工具無法告訴你的是:你的目標受眾是否確實契合所指定的語言與地區,這正是下一節所涵蓋的「註冊表與內容落差」。

如何在工具之外進一步確認各地區

因為生成工具刻意只處理到形狀與大小寫,所以你需要在端設計一套簡短、可重複的工作流程,以確認你所推出的每一個地區設定,都是受支援且符合目標受眾的。下列步驟是疊加在生成工具之上的:你先用它產出標籤區塊,接著於部署之前執行這些檢查。

  1. 先盤點所有在地化頁面。列出你真正發布的每一個地區(含目前正在編輯的頁面),並決定是否要存在單一的 x-default 回退。單一語言的網站完全不需要 hreflang,引入一套自己無法持續維護同步的替代集合是沒有價值的。
  2. 開啟 Google 最新的在地化版本說明文件。搜尋引擎會發布並更新它們所支援的語言與地區清單。依據 Google 的在地化版本指南,請將集合中的每個地區與該清單逐一比對,並移除任何未出現於其中、或已被標示為棄用的代碼。
  3. 查看受眾分析資料中的實際國家與語言分佈。真實的使用者資料勝過區域性的假設。如果你的分析顯示巴西使用者會進入葡萄牙語版的頁面,這代表標籤錯配是結構性的,而非只是表面問題,該列在交給生成工具之前就需要先修正。
  4. 針對較罕見的代碼向 ISO 與 UN 註冊表做第二輪比對。較少見的語言標籤(如 sr-Latn-RS、zh-Hant,以及非洲地區代碼)適合再對外部註冊表做一輪檢查,因為部分搜尋引擎僅列出其中子集,你會希望事先知道哪些代碼是真實可用的。
  5. 將已審核的列項重新輸入生成工具。一旦每個代碼都通過了支援度與受眾檢查,請將整理過的清單再次貼回工具中,重新產生標籤區塊,並將這個重新產生的區塊視為該叢集中所有頁面 head 的標準來源。

形狀正確的標籤在實務中仍可能失效之處

即便通過了生成工具的結構檢查,實際部署 hreflang 時仍有幾種常見的失敗模式。及早辨識這些問題,可避免在叢集上線後才花時間整批重作並重新抓取。

  • 不支援或自創的代碼。通過 BCP 47 形狀的代碼,仍有可能是已棄用、憑空捏造,或根本不存在於某搜尋引擎的服務清單中。一個結構正確的子標籤,本身並不證明任何引擎會將其作為目標語言使用。
  • 大小寫完美,受眾卻錯配。一個標記為 fr-CA、內容卻是法國法文的頁面,語法有效但語意錯誤。標籤區塊本身並不會翻譯內容、不會偵測語言,也無法保證任何特定搜尋結果會出現;Google 仍有可能以演算法自行辨識該頁面,並覆寫你所宣告的關聯。
  • 將 x-default 當成語言使用。加入兩個 x-default 列項,或將同一內容的某頁標為 x-default、另一頁標為一般語言,將違反搜尋引擎所明定的回退契約。x-default 所代表的是為「未對應到任何替代版本的使用者」所準備的頁面,而非一種語言。
  • 混合使用不同的實作方式。同時於 HTML head、HTTP 標頭與 XML 網站地圖中保留 hreflang 是被允許的,但前提是三者之間的集合必須完全一致。三處之間的飄移,是結構上有效的標籤區塊悄悄失去信任的最常見原因之一。

建立標籤集合並加以交叉檢查

一旦每個地區列項都已通過受眾與註冊表的檢查,請將它們最後再跑一次 Hreflang 生成工具,並把輸出視為標準區塊。部署之後,有兩個後續習慣能維持集合的正確性:依據書面速查表維持一致的列項格式,讓每次重作都能與前一版對齊;以及針對實際 HTML 進行準確度稽核,透過另一項部署後的檢查,從每個語言叢集中各抽樣進行抓取。生成工具能提供一個結構上有效、可直接放入 head 的區塊;而在更宏觀的意義上——註冊表支援、受眾契合度,以及雙向回傳連結——讓這個區塊「正確」起來的,則是圍繞在它周圍的工作流程。