給初學者用的 hreflang 產生器,會把一份簡單的地區設定 | 網址列清單,轉成精確的 HTML link 元素,放到多語系網站上每一個替代頁面的 head 區段,大小寫一致、跳脫字元有效,並可選擇性地準備好 x-default 備援。Hreflang 產生器接受最多 100 筆這類列,會把每個地區設定標準化,讓 en-us 變成 en-US、zh-hant 變成 zh-Hant,在輸出任何標籤之前就會先擋掉格式錯誤的輸入,然後每一列回傳一個 rel=alternate 元素,這樣同一份完整的區塊就能貼到叢集中每一個頁面。網址必須是完整網址,使用 http 或 https 並包含主機;相對路徑、scheme-relative 參考、片段以及內嵌的認證資訊都會被拒絕。只要任何一列格式錯誤,整組就會失敗,所以絕對不會有一個缺少國家或語言版本的局部區塊被悄悄複製到正式環境。對第一次使用的使用者來說,這個流程正是區分「十分鐘輕鬆完成任務」和「幾週後才在 Search Console 報表中浮現的除錯噩夢」的關鍵。

Hreflang 標籤實際上在做什麼
Hreflang 是一種關聯性訊號,而不是翻譯工具。頁面 head 中每一個 rel=alternate link,是在宣告這個網址是為閱讀語言 X(可選擇加上居住地區 Y)的使用者所提供的當前頁面版本。搜尋引擎會根據這些宣告來決定要為特定使用者顯示哪個網址,而且要求語言叢集的每一個成員都要宣告其他所有成員,包括自己。Google 明確記載了這個要求:單向宣告可能會被忽略,而且其他網站也不應該能夠單方面把你的頁面認領為它的替代版本。
對初學者來說,實際的後果是:一組看起來正確的標籤永遠不夠。同一個區塊必須放在每一個本地化頁面的 head 中,而且每個標籤指向的網址都必須真的回傳一個有用的頁面。Hreflang 不會翻譯內容、不會偵測語言,也無法保證搜尋結果。它描述的是一組本質等價的本地化頁面之間的關係,這也是為什麼一份只完成一半的翻譯,在頁面層級上仍然算「本質等價」,卻會在宣告的目標對象不對時悄悄侵蝕整個叢集。
為什麼產生器能幫初學者避免代價高昂的錯誤
手寫 hreflang 標籤是快速把錯字送上線的方法。初學者最常犯的錯都是沉默的:一個應該是 en-US 卻打成 en-us 的字串、網址中的 & 符號弄壞了屬性、一個被剖析器正規化掉的片段識別,以及兩列在校正大小寫後對應到同一個標準地區設定。這些錯誤在 CMS 預覽中都看不出來,但部署後全部都會破壞叢集。
Hreflang 產生器透過「只要任何輸入格式錯誤,整組就失敗」的方式來防止這種情況發生。任何相對路徑、片段、認證資訊,或是大小寫標準化後重複的地區設定,在任何標籤被複製之前就會被擋下。這種整組失敗的設計是有意為之:一段悄悄漏掉一個國家或語言版本的局部輸出,比完全沒有輸出更糟糕,因為缺少的那個成員看起來會像是疏忽,而不是工具錯誤,通常會持續好幾個月,直到有人注意到區域流量無聲地下滑。
開始前先準備好你的地區設定列
在打開產生器之前,先把屬於這個叢集的所有本地化頁面列一份清單,包括你目前正在編輯的那一頁。為每一頁記錄下語言、任何適用的文字系統或地區,以及一個以 http:// 或 https:// 開頭、包含主機的完整網址。略過相對路徑,也略過片段;工具會拒絕這兩者。如果真的存在一個「全包式」的網頁,給那些設定不符合任何其他替代版本的使用者——常常是國家選擇器或通用登陸頁——那就用 x-default 這個地區設定把它加進去一次。
每一筆資料單獨寫成一行,格式為「地區設定 | 網址」,中間以「正好一個」垂直分隔線區隔。地區設定接受兩個字母的語系代碼、選擇性的四個字母文字系統代碼,以及選擇性的兩個字母地區代碼。輸入時大小寫不需要完全正確;工具會把 en-us 標準化成 en-US、把 zh-hant 標準化成 zh-Hant,所以 CMS 中的大小寫漂移不會產生重複的地區設定。列數請控制在兩列到 100 列之間;工具強制最少兩列(包括當前頁面),最多 100 列。每一行必須剛好包含一個分隔符號,而且只要任何一列格式錯誤,整組就會被拒絕。
逐步產生你的標籤
- 打開 Hreflang 產生器,把你準備好的列以「地區設定 | 網址」的格式逐行貼上。要包含你今天正在編輯的頁面,而且只有在真的有備援頁面時才加入 x-default。
- 送出清單。工具會以一個字面上的分隔線切開每一列,使用 Intl.getCanonicalLocales 標準化地區設定,並把每個網址正規化成沒有片段、沒有認證資訊的 HTTP 或 HTTPS 位址。
- 檢視回傳的整組結果。每一列應該產生一個 rel=alternate 元素,& 符號以及其他對屬性敏感的字元應該進行 HTML 跳脫,每個 link 元素應該帶有一個 hreflang 屬性,對應到該列的標準地區設定。
- 如果工具回報拒絕,請修正出錯的列後重新送出整份清單。不要複製部分輸出。整組失敗這個機制存在的目的,就是為了不讓缺少的地區設定悄悄通過。
- 把產生的區塊「原樣」複製下來,並存放在 head 範本旁邊。這就是會以位元對位元的方式存在於叢集中每一頁的區塊。
在每一個替代頁面中安裝完全相同的區塊
對初學者來說最難養成的習慣是:叢集共用的是「一個」區塊,而不是「每頁一個」區塊。打開 CMS 或靜態網站範本中每一個本地化頁面的 head,把同一組 link 元素貼到相同的位置。每一頁都必須參考自己以及其他所有成員。漏掉自我參考是常見的錯誤;工具刻意包含了當前頁面,而且 Google 也把自我連結與回連連結記載為必要訊號。
挑選一種實作方式並保持一致。Google 把 HTML head 標籤、HTTP 標頭與 XML sitemap 項目視為等價;當某個地區設定被新增、移除、重新導向或搬到新的標準網址時,混用就會導致漂移。Hreflang 產生器專門產生 HTML head 元素。如果你的發布系統能讓一個共用的片段在所有範本之間保持同步,那通常是最簡單的做法。想要更深入地了解底層標籤的概念與擺放位置,請參考這份給初學者的 hreflang 實作指南。
部署後進行驗證
部署只完成了一半。從每個語言叢集中各抓幾頁來爬取,並以機械方式比對:每頁應該帶有相同數量的 link 元素、相同的標準地區設定大小寫,以及相同的網址清單。確認每個宣告的網址都回傳 200 回應,並且實際提供其所宣稱的語言。一個 hreflang 宣告指向重新導向、軟式 404,或仍然一半是來源語言的翻譯頁,是爬蟲靜悄悄搞混的來源。
Hreflang 產生器無法接觸你的上線頁面,也無法自行證明雙向連結;那是你自己要負責的部分。機械式的比對(相同的列數、相同的標準地區設定、每頁之間相同的網址)是初學者能跑的最簡單檢查,也能在問題送進搜尋引擎之前就抓到最常見的漂移。若想從外部參考上線訊號的形狀以及自我與回連規則,請參考Google Search Central 關於本地化版本的說明文件。
地區設定標籤格式一覽
Hreflang 產生器只驗證每個地區設定標籤的形狀,而不是搜尋引擎目前完整支援的語系、文字系統與地區代碼表。以下四種形狀幾乎涵蓋所有初學者的情境。國家代碼不能單獨出現在第一個位置;第一個子標籤代表語系,任何地區的指定都必須接在它後面。
| 形式 | 範例 | 典型用途 |
|---|---|---|
| 僅語系 | fr | 當存在多個針對特定國家的法語頁面時,作為通用的法語備援 |
| 語系與地區 | fr-CA | 針對特定地區的法語,例如給加拿大使用者的法語 |
| 語系與文字系統 | zh-Hans | 區分不同的書寫系統,例如簡體中文 |
| 語系、文字系統與地區 | zh-Hant-HK | 給香港讀者的繁體中文 |
x-default 這個值位於這個層級之外,因為它不代表任何語言。它是用來識別一個給「設定不符合任何已列替代版本」的使用者所使用的頁面,通常是國家選擇器、依 IP 重新導向的目標,或通用登陸頁。一組裡面只應該出現一個 x-default 列。如果你需要的形狀不在上表中,部署前請依據現行說明文件驗證實際的代碼;WHATWG 的alternate links 規格定義了屬性的形狀以及更廣泛的語言標籤規則。
值得一開始就認識的初學者限制
一個結構上整齊的 hreflang 區塊,仍然有可能不被支援或不合適。這個工具檢查的是標籤的形狀與大小寫,而不是某個語系或地區代碼今天是否真的被某個搜尋引擎妥善處理,也無法判斷連結的網址上的內容是否真的符合所宣告的目標對象。部署之前,請把每一個打算使用的語系與地區,對照 Google 的最新指引以及你的頁面實際服務的使用者進行驗證。
叢集上線後,把它視為持續性的維護工作:新增、移除、重新導向一個地區設定,或把它搬到新的標準網址時,都需要對「每一個」成員做同樣的更新,而不只是受影響的那一頁。對第一次執行來說,最短也最安全的路徑很清楚——列出每個替代版本加上當前頁面本身、產生一個一致的區塊、在每個頁面的 head 中安裝一模一樣的區塊,並爬取樣本以確認各組內容一致,而且每個網址都回傳一個有用的 200 頁面。Hreflang 產生器負責處理跳脫、標準化與拒絕邏輯,這樣你就能把第一次執行的心力,花在工具無法代勞的部分:確保每一個連結另一端的語系、地區與內容,真的符合你想觸及的使用者。